mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2025-12-20 07:00:05 +01:00
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
This commit is contained in:
parent
ef9510e30c
commit
ae31b4bf4e
3 changed files with 62 additions and 0 deletions
|
|
@ -3136,6 +3136,9 @@ act_stage2_config(NMDevice *device, NMDeviceStateReason *out_failure_reason)
|
||||||
NMSettingWireless * s_wireless;
|
NMSettingWireless * s_wireless;
|
||||||
GError * error = NULL;
|
GError * error = NULL;
|
||||||
guint timeout;
|
guint timeout;
|
||||||
|
NMActRequest * request;
|
||||||
|
NMActiveConnection * master_ac;
|
||||||
|
NMDevice * master;
|
||||||
|
|
||||||
nm_clear_g_source(&priv->sup_timeout_id);
|
nm_clear_g_source(&priv->sup_timeout_id);
|
||||||
nm_clear_g_source(&priv->link_timeout_id);
|
nm_clear_g_source(&priv->link_timeout_id);
|
||||||
|
|
@ -3209,6 +3212,15 @@ act_stage2_config(NMDevice *device, NMDeviceStateReason *out_failure_reason)
|
||||||
goto out_fail;
|
goto out_fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Tell the supplicant in which bridge the interface is */
|
||||||
|
if ((request = nm_device_get_act_request(device))
|
||||||
|
&& (master_ac = nm_active_connection_get_master(NM_ACTIVE_CONNECTION(request)))
|
||||||
|
&& (master = nm_active_connection_get_device(master_ac))
|
||||||
|
&& nm_device_get_device_type(master) == NM_DEVICE_TYPE_BRIDGE) {
|
||||||
|
nm_supplicant_interface_set_bridge(priv->sup_iface, nm_device_get_iface(master));
|
||||||
|
} else
|
||||||
|
nm_supplicant_interface_set_bridge(priv->sup_iface, NULL);
|
||||||
|
|
||||||
nm_supplicant_interface_assoc(priv->sup_iface, config, supplicant_iface_assoc_cb, self);
|
nm_supplicant_interface_assoc(priv->sup_iface, config, supplicant_iface_assoc_cb, self);
|
||||||
|
|
||||||
/* Set up a timeout on the association attempt */
|
/* Set up a timeout on the association attempt */
|
||||||
|
|
|
||||||
|
|
@ -1322,6 +1322,54 @@ nm_supplicant_interface_get_capabilities(NMSupplicantInterface *self)
|
||||||
return caps;
|
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
|
void
|
||||||
nm_supplicant_interface_set_global_capabilities(NMSupplicantInterface *self, NMSupplCapMask value)
|
nm_supplicant_interface_set_global_capabilities(NMSupplicantInterface *self, NMSupplCapMask value)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -190,4 +190,6 @@ void nm_supplicant_interface_cancel_wps(NMSupplicantInterface *self);
|
||||||
|
|
||||||
NMSupplicantAuthState nm_supplicant_interface_get_auth_state(NMSupplicantInterface *self);
|
NMSupplicantAuthState nm_supplicant_interface_get_auth_state(NMSupplicantInterface *self);
|
||||||
|
|
||||||
|
void nm_supplicant_interface_set_bridge(NMSupplicantInterface *self, const char *bridge);
|
||||||
|
|
||||||
#endif /* __NM_SUPPLICANT_INTERFACE_H__ */
|
#endif /* __NM_SUPPLICANT_INTERFACE_H__ */
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue