P2P: support preferred GO band
Allow specifying preferred GO band in addition to frequency. If a band
is specified, the first two scans will be limited to only DFS channels
to shorten scan times, and the next two will scan the entire band.
Bug: 233925359
Test: Used WifiP2PTest app to specify band and looked at logs to confirm
that first two scans were non-radar and third was radar included. Also
verified that specificying a single channel still works - all scans are
on that channel.
Change-Id: I2d558bb2c00bf3925ad92f5f036335cd46b9c609
diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c
index 00493d0..ab1555e 100644
--- a/wpa_supplicant/p2p_supplicant.c
+++ b/wpa_supplicant/p2p_supplicant.c
@@ -365,9 +365,9 @@
wpa_printf(MSG_DEBUG,
"P2P: Exclude 6 GHz channels - update the scan frequency list");
wpa_add_scan_freqs_list(wpa_s, HOSTAPD_MODE_IEEE80211G, params,
- 0);
+ false, false);
wpa_add_scan_freqs_list(wpa_s, HOSTAPD_MODE_IEEE80211A, params,
- 0);
+ false, false);
}
ret = wpa_drv_scan(wpa_s, params);
if (ret == 0)
@@ -5560,9 +5560,9 @@
wpa_printf(MSG_DEBUG,
"P2P: 6 GHz disabled - update the scan frequency list");
wpa_add_scan_freqs_list(wpa_s, HOSTAPD_MODE_IEEE80211G, ¶ms,
- 0);
+ false, false);
wpa_add_scan_freqs_list(wpa_s, HOSTAPD_MODE_IEEE80211A, ¶ms,
- 0);
+ false, false);
}
ielen = p2p_scan_ie_buf_len(wpa_s->global->p2p);
diff --git a/wpa_supplicant/scan.c b/wpa_supplicant/scan.c
index bfcb62b..faa97e0 100644
--- a/wpa_supplicant/scan.c
+++ b/wpa_supplicant/scan.c
@@ -474,11 +474,33 @@
*/
if (params->freqs == NULL && 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) {
+ wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Scan only GO preferred band %d GHz during invitation",
+ wpa_s->p2p_invite_go_freq);
+ enum hostapd_hw_mode mode;
+ if (wpa_s->hw.modes == NULL)
+ 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,
+ true);
+ if (params->freqs == NULL ||
+ (params->freqs && params->freqs[0] == 0))
+ wpa_add_scan_freqs_list(wpa_s, mode,
+ params, 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) {
@@ -735,7 +757,8 @@
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)
+ struct wpa_driver_scan_params *params, bool is_6ghz,
+ bool exclude_radar)
{
/* Include only supported channels for the specified band */
struct hostapd_hw_modes *mode;
@@ -760,6 +783,8 @@
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;
params->freqs[num_chans++] = mode->channels[i].freq;
}
params->freqs[num_chans] = 0;
@@ -778,13 +803,13 @@
if (wpa_s->setband_mask & WPA_SETBAND_5G)
wpa_add_scan_freqs_list(wpa_s, HOSTAPD_MODE_IEEE80211A, params,
- 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);
if (wpa_s->setband_mask & WPA_SETBAND_6G)
wpa_add_scan_freqs_list(wpa_s, HOSTAPD_MODE_IEEE80211A, params,
- true);
+ true, false);
}
@@ -1401,9 +1426,9 @@
* since the 6 GHz band is disabled for P2P uses. */
wpa_printf(MSG_DEBUG,
"P2P: 6 GHz disabled - update the scan frequency list");
- wpa_add_scan_freqs_list(wpa_s, HOSTAPD_MODE_IEEE80211G, ¶ms, false);
- wpa_add_scan_freqs_list(wpa_s, HOSTAPD_MODE_IEEE80211A, ¶ms, false);
- wpa_add_scan_freqs_list(wpa_s, HOSTAPD_MODE_IEEE80211AD, ¶ms, false);
+ wpa_add_scan_freqs_list(wpa_s, HOSTAPD_MODE_IEEE80211G, ¶ms, false, false);
+ wpa_add_scan_freqs_list(wpa_s, HOSTAPD_MODE_IEEE80211A, ¶ms, false, false);
+ wpa_add_scan_freqs_list(wpa_s, HOSTAPD_MODE_IEEE80211AD, ¶ms, false, false);
}
#endif /* CONFIG_P2P */
diff --git a/wpa_supplicant/scan.h b/wpa_supplicant/scan.h
index f826d91..52d2696 100644
--- a/wpa_supplicant/scan.h
+++ b/wpa_supplicant/scan.h
@@ -92,6 +92,7 @@
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 is_6ghz,
+ bool exclude_radar);
#endif /* SCAN_H */