]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
Cancel pending connect radio work when network is removed
authorHuang Chenming <chenhuan@qti.qualcomm.com>
Tue, 15 Jul 2025 07:10:56 +0000 (12:40 +0530)
committerJouni Malinen <j@w1.fi>
Fri, 25 Jul 2025 13:24:29 +0000 (16:24 +0300)
When a network is removed it is not desired to proceed the connect
process. So cancel corresponding pending connect work when the related
network is removed.

Signed-off-by: Huang Chenming <chenhuan@qti.qualcomm.com>
wpa_supplicant/wpa_supplicant.c

index 1114b3b259b43e75192d47c79cd8243b00923d25..0586c371aea18a3825d722d5e25913a8e8c30a18 100644 (file)
@@ -132,6 +132,8 @@ static void wpas_update_fils_connect_params(struct wpa_supplicant *wpa_s);
 #ifdef CONFIG_OWE
 static void wpas_update_owe_connect_params(struct wpa_supplicant *wpa_s);
 #endif /* CONFIG_OWE */
+static void radio_remove_pending_connect(struct wpa_supplicant *wpa_s,
+                                        const struct wpa_ssid *ssid);
 
 
 #ifdef CONFIG_WEP
@@ -5165,6 +5167,7 @@ int wpa_supplicant_remove_network(struct wpa_supplicant *wpa_s, int id)
        if (!ssid)
                return -1;
        wpas_notify_network_removed(wpa_s, ssid);
+       radio_remove_pending_connect(wpa_s, ssid);
 
        if (ssid == prev || !prev) {
 #ifdef CONFIG_SME
@@ -7346,6 +7349,31 @@ void radio_remove_pending_work(struct wpa_supplicant *wpa_s, void *ctx)
 }
 
 
+static void radio_remove_pending_connect(struct wpa_supplicant *wpa_s,
+                                        const struct wpa_ssid *ssid)
+{
+       struct wpa_radio_work *work, *tmp;
+       struct wpa_radio *radio = wpa_s->radio;
+       struct wpa_connect_work *cwork;
+
+       dl_list_for_each_safe(work, tmp, &radio->work, struct wpa_radio_work,
+                             list) {
+               if (!radio_work_is_connect(work))
+                       continue;
+
+               cwork = work->ctx;
+               if (cwork->ssid != ssid)
+                       continue;
+
+               wpa_printf(MSG_DEBUG, "Remove radio work '%s'@%p ssid=%s",
+                          work->type, work,
+                          wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
+               work->cb(work, 1);
+               radio_work_free(work);
+       }
+}
+
+
 static void radio_remove_interface(struct wpa_supplicant *wpa_s)
 {
        struct wpa_radio *radio = wpa_s->radio;