]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
P2P: Support preferred GO band based optimization for scanning
authorMatthew Wang <matthewmwang@google.com>
Fri, 16 Dec 2022 19:10:02 +0000 (11:10 -0800)
committerJouni Malinen <j@w1.fi>
Sun, 18 Dec 2022 16:33:44 +0000 (18:33 +0200)
Allow specifying preferred GO band in addition to frequency. If a band
is specified, the first two scans will be limited to only non-DFS
channels to shorten scan times, and the next two will scan the entire
band.

Signed-off-by: Matthew Wang <matthewmwang@chromium.org>
wpa_supplicant/p2p_supplicant.c
wpa_supplicant/scan.c
wpa_supplicant/scan.h

index ec3f9b2f043fe8d0b29d74220b3131f5db8a23cb..6cf5a485f00e8b46fda10363a42d10400f54ba32 100644 (file)
@@ -342,15 +342,15 @@ void wpas_p2p_scan_freqs(struct wpa_supplicant *wpa_s,
                         bool include_6ghz)
 {
        wpa_add_scan_freqs_list(wpa_s, HOSTAPD_MODE_IEEE80211A,
-                               params, false, false);
+                               params, false, false, false);
        wpa_add_scan_freqs_list(wpa_s, HOSTAPD_MODE_IEEE80211G,
-                               params, false, false);
+                               params, false, false, false);
        wpa_add_scan_freqs_list(wpa_s, HOSTAPD_MODE_IEEE80211AD,
-                               params, false, false);
+                               params, false, false, false);
        if (!wpa_s->conf->p2p_6ghz_disable &&
            is_p2p_allow_6ghz(wpa_s->global->p2p) && include_6ghz)
                wpa_add_scan_freqs_list(wpa_s, HOSTAPD_MODE_IEEE80211A,
-                                       params, true, true);
+                                       params, true, true, false);
 }
 
 
index fc37c6b9a4204381900e37c63d8805a221d28299..cc9faf2a807572bbb41d4ab749ff8ac667dae1de 100644 (file)
@@ -451,11 +451,36 @@ static void wpa_supplicant_optimize_freqs(
                 */
                if (wpa_s->p2p_in_invitation < 5 &&
                    wpa_s->p2p_invite_go_freq > 0) {
-                       wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Scan only GO preferred frequency %d MHz during invitation",
-                               wpa_s->p2p_invite_go_freq);
-                       params->freqs = os_calloc(2, sizeof(int));
-                       if (params->freqs)
-                               params->freqs[0] = wpa_s->p2p_invite_go_freq;
+                       if (wpa_s->p2p_invite_go_freq == 2 ||
+                           wpa_s->p2p_invite_go_freq == 5) {
+                               enum hostapd_hw_mode mode;
+
+                               wpa_dbg(wpa_s, MSG_DEBUG,
+                                       "P2P: Scan only GO preferred band %d GHz during invitation",
+                                       wpa_s->p2p_invite_go_freq);
+
+                               if (!wpa_s->hw.modes)
+                                       return;
+                               mode = wpa_s->p2p_invite_go_freq == 5 ?
+                                       HOSTAPD_MODE_IEEE80211A :
+                                       HOSTAPD_MODE_IEEE80211G;
+                               if (wpa_s->p2p_in_invitation <= 2)
+                                       wpa_add_scan_freqs_list(wpa_s, mode,
+                                                               params, false,
+                                                               false, true);
+                               if (!params->freqs || params->freqs[0] == 0)
+                                       wpa_add_scan_freqs_list(wpa_s, mode,
+                                                               params, false,
+                                                               false, false);
+                       } else {
+                               wpa_dbg(wpa_s, MSG_DEBUG,
+                                       "P2P: Scan only GO preferred frequency %d MHz during invitation",
+                                       wpa_s->p2p_invite_go_freq);
+                               params->freqs = os_calloc(2, sizeof(int));
+                               if (params->freqs)
+                                       params->freqs[0] =
+                                           wpa_s->p2p_invite_go_freq;
+                       }
                }
                wpa_s->p2p_in_invitation++;
                if (wpa_s->p2p_in_invitation > 20) {
@@ -713,7 +738,8 @@ static int non_p2p_network_enabled(struct wpa_supplicant *wpa_s)
 int wpa_add_scan_freqs_list(struct wpa_supplicant *wpa_s,
                            enum hostapd_hw_mode band,
                            struct wpa_driver_scan_params *params,
-                           bool is_6ghz, bool only_6ghz_psc)
+                           bool is_6ghz, bool only_6ghz_psc,
+                           bool exclude_radar)
 {
        /* Include only supported channels for the specified band */
        struct hostapd_hw_modes *mode;
@@ -738,6 +764,9 @@ int wpa_add_scan_freqs_list(struct wpa_supplicant *wpa_s,
        for (i = 0; i < mode->num_channels; i++) {
                if (mode->channels[i].flag & HOSTAPD_CHAN_DISABLED)
                        continue;
+               if (exclude_radar &&
+                   (mode->channels[i].flag & HOSTAPD_CHAN_RADAR))
+                       continue;
 
                if (is_6ghz && only_6ghz_psc &&
                    !is_6ghz_psc_frequency(mode->channels[i].freq))
@@ -761,13 +790,13 @@ static void wpa_setband_scan_freqs(struct wpa_supplicant *wpa_s,
 
        if (wpa_s->setband_mask & WPA_SETBAND_5G)
                wpa_add_scan_freqs_list(wpa_s, HOSTAPD_MODE_IEEE80211A, params,
-                                       false, false);
+                                       false, false, false);
        if (wpa_s->setband_mask & WPA_SETBAND_2G)
                wpa_add_scan_freqs_list(wpa_s, HOSTAPD_MODE_IEEE80211G, params,
-                                       false, false);
+                                       false, false, false);
        if (wpa_s->setband_mask & WPA_SETBAND_6G)
                wpa_add_scan_freqs_list(wpa_s, HOSTAPD_MODE_IEEE80211A, params,
-                                       true, false);
+                                       true, false, false);
 }
 
 
index 6e074f48a70c9cdfd76081fbfa95dd4b0dafbaea..30f43951c2a8f49ad150e41ea4a34d61dc732cda 100644 (file)
@@ -92,6 +92,7 @@ void wpa_supplicant_set_default_scan_ies(struct wpa_supplicant *wpa_s);
 int wpa_add_scan_freqs_list(struct wpa_supplicant *wpa_s,
                            enum hostapd_hw_mode band,
                            struct wpa_driver_scan_params *params,
-                           bool is_6ghz, bool only_6ghz_psc);
+                           bool is_6ghz, bool only_6ghz_psc,
+                           bool exclude_radar);
 
 #endif /* SCAN_H */