summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Zaborowski <andrew.zaborowski@intel.com>2020-11-05 03:15:08 +0100
committerThomas Haller <thaller@redhat.com>2020-11-12 15:38:02 +0100
commit42548f1f31497d7ab3690ffa3eba183db6446735 (patch)
tree0edd64b4fb9c8eb7db8520718a5053000f2a4d84
parentf09a47639066e6a19227a278905b176185f5f7f7 (diff)
downloadNetworkManager-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.c86
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;