summaryrefslogtreecommitdiff
path: root/src/supplicant/nm-supplicant-interface.c
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2020-09-30 13:35:49 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2020-10-13 08:59:10 +0200
commitae31b4bf4eaa9eab9409c59dd420140f5fe6b697 (patch)
treea5c92897080c8b8db6a5680b3fac0b32a40ff641 /src/supplicant/nm-supplicant-interface.c
parentef9510e30cc9bd44b857c72d3261a18faab0c1d2 (diff)
wifi: set the BridgeIfname supplicant property when needed
When a wifi device is in a bridge, the supplicant must be aware of it, as a socket must be opened on the bridge to receive packets. Set the BridgeIfname property of the supplicant Interface object before starting the association. Note that the property was read-only in the past and recently [1] became read-write. When using a supplicant version without the patch, writing the property will return an InvalidArgs error and NetworkManager will print a warning. [1] https://w1.fi/cgit/hostap/commit/?id=1c58317f56e312576b6872440f125f794e45f991 https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/83
Diffstat (limited to 'src/supplicant/nm-supplicant-interface.c')
-rw-r--r--src/supplicant/nm-supplicant-interface.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/supplicant/nm-supplicant-interface.c b/src/supplicant/nm-supplicant-interface.c
index 77254c7ebc..5021f3f60b 100644
--- a/src/supplicant/nm-supplicant-interface.c
+++ b/src/supplicant/nm-supplicant-interface.c
@@ -1322,6 +1322,54 @@ nm_supplicant_interface_get_capabilities(NMSupplicantInterface *self)
return caps;
}
+static void
+set_bridge_cb(GVariant *ret, GError *error, gpointer user_data)
+{
+ NMSupplicantInterface *self;
+ NMLogLevel level;
+ gs_free const char * bridge = NULL;
+
+ nm_utils_user_data_unpack(user_data, &self, &bridge);
+
+ if (nm_utils_error_is_cancelled(error))
+ return;
+
+ /* The supplicant supports writing the bridge property since
+ * version 2.10. Before that version, trying to set the property
+ * results in a InvalidArgs error. Don't log a warning unless we
+ * are trying to set a non-NULL bridge. */
+ if (!error)
+ level = LOGL_DEBUG;
+ else if (bridge == NULL && g_error_matches(error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS)) {
+ level = LOGL_DEBUG;
+ } else
+ level = LOGL_WARN;
+
+ _NMLOG(level,
+ "set bridge %s%s%s result: %s",
+ NM_PRINT_FMT_QUOTE_STRING(bridge),
+ error ? error->message : "success");
+}
+
+void
+nm_supplicant_interface_set_bridge(NMSupplicantInterface *self, const char *bridge)
+{
+ NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE(self);
+
+ _LOGT("set bridge %s%s%s", NM_PRINT_FMT_QUOTE_STRING(bridge));
+
+ nm_dbus_connection_call_set(priv->dbus_connection,
+ priv->name_owner->str,
+ priv->object_path->str,
+ NM_WPAS_DBUS_IFACE_INTERFACE,
+ "BridgeIfname",
+ g_variant_new_string(bridge ?: ""),
+ DBUS_TIMEOUT_MSEC,
+ priv->main_cancellable,
+ set_bridge_cb,
+ nm_utils_user_data_pack(self, g_strdup(bridge)));
+}
+
void
nm_supplicant_interface_set_global_capabilities(NMSupplicantInterface *self, NMSupplCapMask value)
{