diff options
author | Andrew Zaborowski <andrew.zaborowski@intel.com> | 2020-11-05 03:15:08 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2020-11-12 15:38:02 +0100 |
commit | 42548f1f31497d7ab3690ffa3eba183db6446735 (patch) | |
tree | 0edd64b4fb9c8eb7db8520718a5053000f2a4d84 | |
parent | f09a47639066e6a19227a278905b176185f5f7f7 (diff) | |
download | NetworkManager-th/pr/670.tar.gz |
iwd: Update KnownNetwork.AutoConnect on NM connection changesth/pr/670
Watch NMSettingConnection's changes using the
NM_SETTINGS_CONNECTION_UPDATED_INTERNAL signal and update IWD
KnownNetwork's AutoConnect property when NMSettingConnection's
autoconnect property it changes.
"notify::" NM_SETTING_CONNECTION_AUTOCONNECT signals don't seem to be
emitted.
-rw-r--r-- | src/devices/wifi/nm-iwd-manager.c | 86 |
1 files changed, 74 insertions, 12 deletions
diff --git a/src/devices/wifi/nm-iwd-manager.c b/src/devices/wifi/nm-iwd-manager.c index 6eebccbba4..d5b3629a74 100644 --- a/src/devices/wifi/nm-iwd-manager.c +++ b/src/devices/wifi/nm-iwd-manager.c @@ -16,6 +16,7 @@ #include "nm-wifi-utils.h" #include "nm-glib-aux/nm-random-utils.h" #include "settings/nm-settings.h" +#include "nm-std-aux/nm-dbus-compat.h" /*****************************************************************************/ @@ -88,7 +89,8 @@ G_DEFINE_TYPE(NMIwdManager, nm_iwd_manager, G_TYPE_OBJECT) /*****************************************************************************/ -static void mirror_connection_take_and_delete(NMSettingsConnection *sett_conn); +static void mirror_connection_take_and_delete(NMSettingsConnection *sett_conn, + KnownNetworkData * data); /*****************************************************************************/ @@ -368,7 +370,7 @@ known_network_data_free(KnownNetworkData *network) return; g_object_unref(network->known_network); - mirror_connection_take_and_delete(network->mirror_connection); + mirror_connection_take_and_delete(network->mirror_connection, network); g_slice_free(KnownNetworkData, network); } @@ -409,6 +411,58 @@ set_device_dbus_object(NMIwdManager *self, GDBusProxy *proxy, GDBusObject *objec nm_device_iwd_set_dbus_object(NM_DEVICE_IWD(device), object); } +static void +known_network_update_cb(GObject *source, GAsyncResult *res, gpointer user_data) +{ + gs_unref_variant GVariant *variant = NULL; + gs_free_error GError *error = NULL; + + variant = g_dbus_proxy_call_finish(G_DBUS_PROXY(source), res, &error); + if (!variant) { + nm_log_warn(LOGD_WIFI, + "Updating %s on IWD known network %s failed: %s", + (const char *) user_data, + g_dbus_proxy_get_object_path(G_DBUS_PROXY(source)), + error->message); + } +} + +static void +sett_conn_changed(NMSettingsConnection *sett_conn, guint update_reason, KnownNetworkData *data) +{ + NMSettingsConnectionIntFlags flags; + NMConnection * conn = nm_settings_connection_get_connection(sett_conn); + NMSettingConnection * s_conn = nm_connection_get_setting_connection(conn); + gboolean nm_autoconnectable = nm_setting_connection_get_autoconnect(s_conn); + gboolean iwd_autoconnectable = get_property_bool(data->known_network, "AutoConnect", TRUE); + + nm_assert(sett_conn == data->mirror_connection); + + if (iwd_autoconnectable == nm_autoconnectable) + return; + + /* If this is a generated connection it may be ourselves updating it */ + flags = nm_settings_connection_get_flags(data->mirror_connection); + if (NM_FLAGS_HAS(flags, NM_SETTINGS_CONNECTION_INT_FLAGS_NM_GENERATED)) + return; + + nm_log_dbg(LOGD_WIFI, + "Updating AutoConnect on known network at %s based on connection %s", + g_dbus_proxy_get_object_path(data->known_network), + nm_settings_connection_get_id(data->mirror_connection)); + g_dbus_proxy_call(data->known_network, + DBUS_INTERFACE_PROPERTIES ".Set", + g_variant_new("(ssv)", + NM_IWD_KNOWN_NETWORK_INTERFACE, + "AutoConnect", + g_variant_new_boolean(nm_autoconnectable)), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + known_network_update_cb, + "AutoConnect"); +} + /* Look up an existing NMSettingsConnection for a network that has been * preprovisioned with an IWD config file or has been connected to before, * or create a new in-memory NMSettingsConnection object. This will let @@ -511,6 +565,12 @@ mirror_connection(NMIwdManager * self, if (settings_connection && known_network && !exact_match) { NMSettingsConnectionIntFlags flags = nm_settings_connection_get_flags(settings_connection); + NMSettingConnection * s_conn; + NMSettingWireless * s_wifi; + + connection = nm_settings_connection_get_connection(settings_connection); + s_conn = nm_connection_get_setting_connection(connection); + s_wifi = nm_connection_get_setting_wireless(connection); /* If we found a connection and it's generated (likely by ourselves) * it may have been created on a request by @@ -524,21 +584,17 @@ mirror_connection(NMIwdManager * self, * should try to copy the properties from it to IWD's Known Network * using the Properties DBus interface in case the user created an * NM connection before IWD appeared on the bus, or before IWD - * created its Known Network object. (TODO) + * created its Known Network object. */ if (NM_FLAGS_HAS(flags, NM_SETTINGS_CONNECTION_INT_FLAGS_NM_GENERATED)) { - NMSettingConnection *s_conn; - NMSettingWireless * s_wifi; - - connection = nm_settings_connection_get_connection(settings_connection); - s_conn = nm_connection_get_setting_connection(connection); - s_wifi = nm_connection_get_setting_wireless(connection); - g_object_set(G_OBJECT(s_conn), NM_SETTING_CONNECTION_AUTOCONNECT, autoconnectable, NULL); g_object_set(G_OBJECT(s_wifi), NM_SETTING_WIRELESS_HIDDEN, hidden, NULL); + } else { + KnownNetworkData data = {known_network, settings_connection}; + sett_conn_changed(settings_connection, 0, &data); } } @@ -653,7 +709,7 @@ mirror_connection(NMIwdManager * self, } static void -mirror_connection_take_and_delete(NMSettingsConnection *sett_conn) +mirror_connection_take_and_delete(NMSettingsConnection *sett_conn, KnownNetworkData *data) { NMSettingsConnectionIntFlags flags; @@ -667,6 +723,7 @@ mirror_connection_take_and_delete(NMSettingsConnection *sett_conn) if (NM_FLAGS_HAS(flags, NM_SETTINGS_CONNECTION_INT_FLAGS_NM_GENERATED)) nm_settings_connection_delete(sett_conn, FALSE); + g_signal_handlers_disconnect_by_data(sett_conn, data); g_object_unref(sett_conn); } @@ -738,7 +795,12 @@ interface_added(GDBusObjectManager *object_manager, NMSettingsConnection *sett_conn_old = data->mirror_connection; data->mirror_connection = nm_g_object_ref(sett_conn); - mirror_connection_take_and_delete(sett_conn_old); + mirror_connection_take_and_delete(sett_conn_old, data); + + g_signal_connect(sett_conn, + NM_SETTINGS_CONNECTION_UPDATED_INTERNAL, + G_CALLBACK(sett_conn_changed), + data); } return; |