]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
wpa_supplicant: Notify freq change on CH_SWITCH
authorArowa Suliman <arowa@chromium.org>
Tue, 3 Nov 2020 19:20:01 +0000 (11:20 -0800)
committerJouni Malinen <j@w1.fi>
Sat, 6 Feb 2021 14:50:19 +0000 (16:50 +0200)
wpa_supplicant does not send a D-Bus notification of the BSS frequency
change when a CSA happens. Sending a PropertyChanged signal with the
updated frequency will notify the network manager quickly, instead of
waiting for the next scan results.

Signed-off-by: Arowa Suliman <arowa@chromium.org>
Reviewed-by: Brian Norris <briannorris@chromium.org>
wpa_supplicant/bss.c
wpa_supplicant/bss.h
wpa_supplicant/events.c

index 64fd4b843fb047865e7f84c9a5b4fbb5dd70e9d5..e13783ce1995fe3f847051ddb2b8f3c2700e2ddd 100644 (file)
 #include "scan.h"
 #include "bss.h"
 
-
-#define WPA_BSS_FREQ_CHANGED_FLAG      BIT(0)
-#define WPA_BSS_SIGNAL_CHANGED_FLAG    BIT(1)
-#define WPA_BSS_PRIVACY_CHANGED_FLAG   BIT(2)
-#define WPA_BSS_MODE_CHANGED_FLAG      BIT(3)
-#define WPA_BSS_WPAIE_CHANGED_FLAG     BIT(4)
-#define WPA_BSS_RSNIE_CHANGED_FLAG     BIT(5)
-#define WPA_BSS_WPS_CHANGED_FLAG       BIT(6)
-#define WPA_BSS_RATES_CHANGED_FLAG     BIT(7)
-#define WPA_BSS_IES_CHANGED_FLAG       BIT(8)
-
-
 static void wpa_bss_set_hessid(struct wpa_bss *bss)
 {
 #ifdef CONFIG_INTERWORKING
@@ -588,8 +576,8 @@ static u32 wpa_bss_compare_res(const struct wpa_bss *old,
 }
 
 
-static void notify_bss_changes(struct wpa_supplicant *wpa_s, u32 changes,
-                              const struct wpa_bss *bss)
+void notify_bss_changes(struct wpa_supplicant *wpa_s, u32 changes,
+                       const struct wpa_bss *bss)
 {
        if (changes & WPA_BSS_FREQ_CHANGED_FLAG)
                wpas_notify_bss_freq_changed(wpa_s, bss->id);
index 919bbe113677042be8db22c13e5e5217841f0dc8..a8bef5576fa7ea9a2bfbd84d6c1542acbd0f03dd 100644 (file)
@@ -20,6 +20,16 @@ struct wpa_scan_res;
 #define WPA_BSS_ANQP_FETCH_TRIED       BIT(6)
 #define WPA_BSS_OWE_TRANSITION         BIT(7)
 
+#define WPA_BSS_FREQ_CHANGED_FLAG      BIT(0)
+#define WPA_BSS_SIGNAL_CHANGED_FLAG    BIT(1)
+#define WPA_BSS_PRIVACY_CHANGED_FLAG   BIT(2)
+#define WPA_BSS_MODE_CHANGED_FLAG      BIT(3)
+#define WPA_BSS_WPAIE_CHANGED_FLAG     BIT(4)
+#define WPA_BSS_RSNIE_CHANGED_FLAG     BIT(5)
+#define WPA_BSS_WPS_CHANGED_FLAG       BIT(6)
+#define WPA_BSS_RATES_CHANGED_FLAG     BIT(7)
+#define WPA_BSS_IES_CHANGED_FLAG       BIT(8)
+
 struct wpa_bss_anqp_elem {
        struct dl_list list;
        u16 infoid;
@@ -120,6 +130,8 @@ static inline const u8 * wpa_bss_ie_ptr(const struct wpa_bss *bss)
        return bss->ies;
 }
 
+void notify_bss_changes(struct wpa_supplicant *wpa_s, u32 changes,
+                       const struct wpa_bss *bss);
 void wpa_bss_update_start(struct wpa_supplicant *wpa_s);
 void wpa_bss_update_scan_res(struct wpa_supplicant *wpa_s,
                             struct wpa_scan_res *res,
index 199829bcf2a4d2671d67c90a4f41357932917c1e..7bacc203e617faf4797727579590bc43e1b97305 100644 (file)
@@ -4986,6 +4986,12 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
 
                wpa_s->assoc_freq = data->ch_switch.freq;
                wpa_s->current_ssid->frequency = data->ch_switch.freq;
+               if (wpa_s->current_bss &&
+                   wpa_s->current_bss->freq != data->ch_switch.freq) {
+                       wpa_s->current_bss->freq = data->ch_switch.freq;
+                       notify_bss_changes(wpa_s, WPA_BSS_FREQ_CHANGED_FLAG,
+                                          wpa_s->current_bss);
+               }
 
 #ifdef CONFIG_SME
                switch (data->ch_switch.ch_offset) {