merge: branch 'ih/fix-wifi-dispose'

wifi: don't recheck  auto-activate on disposal

Closes #1791

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/2259
This commit is contained in:
Íñigo Huguet 2025-08-27 06:37:48 +00:00
commit d39179bee4

View file

@ -196,7 +196,8 @@ static void periodic_update(NMDeviceWifi *self);
static void ap_add_remove(NMDeviceWifi *self, static void ap_add_remove(NMDeviceWifi *self,
gboolean is_adding, gboolean is_adding,
NMWifiAP *ap, NMWifiAP *ap,
gboolean recheck_available_connections); gboolean recheck_available_connections,
gboolean recheck_auto_activate);
static void _hw_addr_set_scanning(NMDeviceWifi *self, gboolean do_reset); static void _hw_addr_set_scanning(NMDeviceWifi *self, gboolean do_reset);
@ -714,7 +715,10 @@ update_seen_bssids_cache(NMDeviceWifi *self, NMWifiAP *ap)
} }
static void static void
set_current_ap(NMDeviceWifi *self, NMWifiAP *new_ap, gboolean recheck_available_connections) set_current_ap(NMDeviceWifi *self,
NMWifiAP *new_ap,
gboolean recheck_available_connections,
gboolean recheck_auto_activate)
{ {
NMDeviceWifiPrivate *priv; NMDeviceWifiPrivate *priv;
NMWifiAP *old_ap; NMWifiAP *old_ap;
@ -741,7 +745,11 @@ set_current_ap(NMDeviceWifi *self, NMWifiAP *new_ap, gboolean recheck_available_
/* Remove any AP from the internal list if it was created by NM or isn't known to the supplicant */ /* Remove any AP from the internal list if it was created by NM or isn't known to the supplicant */
if (NM_IN_SET(mode, _NM_802_11_MODE_ADHOC, _NM_802_11_MODE_AP) if (NM_IN_SET(mode, _NM_802_11_MODE_ADHOC, _NM_802_11_MODE_AP)
|| nm_wifi_ap_get_fake(old_ap)) || nm_wifi_ap_get_fake(old_ap))
ap_add_remove(self, FALSE, old_ap, recheck_available_connections); ap_add_remove(self,
FALSE,
old_ap,
recheck_available_connections,
recheck_auto_activate);
g_object_unref(old_ap); g_object_unref(old_ap);
} }
@ -814,7 +822,8 @@ static void
ap_add_remove(NMDeviceWifi *self, ap_add_remove(NMDeviceWifi *self,
gboolean is_adding, /* or else removing */ gboolean is_adding, /* or else removing */
NMWifiAP *ap, NMWifiAP *ap,
gboolean recheck_available_connections) gboolean recheck_available_connections,
gboolean recheck_auto_activate)
{ {
NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE(self); NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE(self);
@ -845,13 +854,14 @@ ap_add_remove(NMDeviceWifi *self,
nm_dbus_object_clear_and_unexport(&ap); nm_dbus_object_clear_and_unexport(&ap);
} }
if (recheck_auto_activate)
nm_device_recheck_auto_activate_schedule(NM_DEVICE(self)); nm_device_recheck_auto_activate_schedule(NM_DEVICE(self));
if (recheck_available_connections) if (recheck_available_connections)
nm_device_recheck_available_connections(NM_DEVICE(self)); nm_device_recheck_available_connections(NM_DEVICE(self));
} }
static void static void
remove_all_aps(NMDeviceWifi *self) remove_all_aps(NMDeviceWifi *self, gboolean disposing)
{ {
NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE(self); NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE(self);
NMWifiAP *ap; NMWifiAP *ap;
@ -859,11 +869,12 @@ remove_all_aps(NMDeviceWifi *self)
if (c_list_is_empty(&priv->aps_lst_head)) if (c_list_is_empty(&priv->aps_lst_head))
return; return;
set_current_ap(self, NULL, FALSE); set_current_ap(self, NULL, FALSE, !disposing);
while ((ap = c_list_first_entry(&priv->aps_lst_head, NMWifiAP, aps_lst))) while ((ap = c_list_first_entry(&priv->aps_lst_head, NMWifiAP, aps_lst)))
ap_add_remove(self, FALSE, ap, FALSE); ap_add_remove(self, FALSE, ap, FALSE, !disposing);
if (!disposing)
nm_device_recheck_available_connections(NM_DEVICE(self)); nm_device_recheck_available_connections(NM_DEVICE(self));
} }
@ -951,7 +962,7 @@ deactivate(NMDevice *device)
priv->rate = 0; priv->rate = 0;
set_current_ap(self, NULL, TRUE); set_current_ap(self, NULL, TRUE, TRUE);
if (!wake_on_wlan_restore(self)) if (!wake_on_wlan_restore(self))
_LOGW(LOGD_DEVICE | LOGD_WIFI, "Cannot unconfigure WoWLAN."); _LOGW(LOGD_DEVICE | LOGD_WIFI, "Cannot unconfigure WoWLAN.");
@ -2000,7 +2011,7 @@ supplicant_iface_bss_changed_cb(NMSupplicantInterface *iface,
if (nm_wifi_ap_set_fake(found_ap, TRUE)) if (nm_wifi_ap_set_fake(found_ap, TRUE))
_ap_dump(self, LOGL_DEBUG, found_ap, "updated", 0); _ap_dump(self, LOGL_DEBUG, found_ap, "updated", 0);
} else { } else {
ap_add_remove(self, FALSE, found_ap, TRUE); ap_add_remove(self, FALSE, found_ap, TRUE, TRUE);
schedule_ap_list_dump(self); schedule_ap_list_dump(self);
} }
return; return;
@ -2043,7 +2054,7 @@ supplicant_iface_bss_changed_cb(NMSupplicantInterface *iface,
} }
} }
ap_add_remove(self, TRUE, ap, TRUE); ap_add_remove(self, TRUE, ap, TRUE, TRUE);
} }
/* Update the current AP if the supplicant notified a current BSS change /* Update the current AP if the supplicant notified a current BSS change
@ -2268,7 +2279,7 @@ link_timeout_cb(gpointer user_data)
if (nm_device_get_state(device) != NM_DEVICE_STATE_ACTIVATED) if (nm_device_get_state(device) != NM_DEVICE_STATE_ACTIVATED)
return FALSE; return FALSE;
set_current_ap(self, NULL, TRUE); set_current_ap(self, NULL, TRUE, TRUE);
nm_device_state_changed(device, nm_device_state_changed(device,
NM_DEVICE_STATE_FAILED, NM_DEVICE_STATE_FAILED,
@ -2684,7 +2695,7 @@ supplicant_iface_notify_current_bss(NMSupplicantInterface *iface,
} }
} }
set_current_ap(self, new_ap, TRUE); set_current_ap(self, new_ap, TRUE, TRUE);
req = nm_device_get_act_request(NM_DEVICE(self)); req = nm_device_get_act_request(NM_DEVICE(self));
if (req) { if (req) {
@ -3118,7 +3129,7 @@ act_stage1_prepare(NMDevice *device, NMDeviceStateReason *out_failure_reason)
priv->mode = _NM_802_11_MODE_AP; priv->mode = _NM_802_11_MODE_AP;
/* Scanning not done in AP mode; clear the scan list */ /* Scanning not done in AP mode; clear the scan list */
remove_all_aps(self); remove_all_aps(self, FALSE);
} else if (g_strcmp0(mode, NM_SETTING_WIRELESS_MODE_MESH) == 0) } else if (g_strcmp0(mode, NM_SETTING_WIRELESS_MODE_MESH) == 0)
priv->mode = _NM_802_11_MODE_MESH; priv->mode = _NM_802_11_MODE_MESH;
_notify(self, PROP_MODE); _notify(self, PROP_MODE);
@ -3155,14 +3166,14 @@ act_stage1_prepare(NMDevice *device, NMDeviceStateReason *out_failure_reason)
nm_wifi_ap_set_address(ap_fake, nm_device_get_hw_address(device)); nm_wifi_ap_set_address(ap_fake, nm_device_get_hw_address(device));
g_object_freeze_notify(G_OBJECT(self)); g_object_freeze_notify(G_OBJECT(self));
ap_add_remove(self, TRUE, ap_fake, TRUE); ap_add_remove(self, TRUE, ap_fake, TRUE, TRUE);
g_object_thaw_notify(G_OBJECT(self)); g_object_thaw_notify(G_OBJECT(self));
ap = ap_fake; ap = ap_fake;
} }
_scan_notify_allowed(self, NM_TERNARY_DEFAULT); _scan_notify_allowed(self, NM_TERNARY_DEFAULT);
set_current_ap(self, ap, FALSE); set_current_ap(self, ap, FALSE, TRUE);
nm_active_connection_set_specific_object(NM_ACTIVE_CONNECTION(req), nm_active_connection_set_specific_object(NM_ACTIVE_CONNECTION(req),
nm_dbus_object_get_path(NM_DBUS_OBJECT(ap))); nm_dbus_object_get_path(NM_DBUS_OBJECT(ap)));
return NM_ACT_STAGE_RETURN_SUCCESS; return NM_ACT_STAGE_RETURN_SUCCESS;
@ -3528,7 +3539,7 @@ device_state_changed(NMDevice *device,
cleanup_association_attempt(self, TRUE); cleanup_association_attempt(self, TRUE);
cleanup_supplicant_failures(self); cleanup_supplicant_failures(self);
remove_all_aps(self); remove_all_aps(self, FALSE);
} }
switch (new_state) { switch (new_state) {
@ -3566,7 +3577,7 @@ device_state_changed(NMDevice *device,
} }
if (clear_aps) if (clear_aps)
remove_all_aps(self); remove_all_aps(self, FALSE);
_scan_notify_allowed(self, NM_TERNARY_DEFAULT); _scan_notify_allowed(self, NM_TERNARY_DEFAULT);
} }
@ -3808,7 +3819,7 @@ dispose(GObject *object)
g_clear_object(&priv->sup_mgr); g_clear_object(&priv->sup_mgr);
remove_all_aps(self); remove_all_aps(self, TRUE);
if (priv->p2p_device) { if (priv->p2p_device) {
/* Destroy the P2P device. */ /* Destroy the P2P device. */