AP: Check driver support while auto-selecting bandwidth for AP/P2P GO

If the maximum operating channel width for AP/P2P GO is not specified,
it is auto-selected during configuration. While selecting the channel
width, if VHT is supported and 160 MHz channels are available, 160 MHz
channel width is preferred to 80 MHz.

During the selection of the channel width, the corresponding driver
capabilities were not checked. As a result, the AP/P2P GO configuration
was set to use the available 160 MHz channels even if the driver did not
have capability to support the 160 MHz channel width causing failure to
start the AP/P2P GO.

Fix this by checking the driver support for the 160 MHz channel width
while selecting the channel width for AP/P2P GO.

Signed-off-by: Sreeramya Soratkal <ssramya@codeaurora.org>
This commit is contained in:
Sreeramya Soratkal 2020-11-18 16:21:29 +05:30 committed by Jouni Malinen
parent 5b782ff620
commit ed24bad1d9

View File

@ -44,6 +44,27 @@ static void wpas_wps_ap_pin_timeout(void *eloop_data, void *user_ctx);
#endif /* CONFIG_WPS */ #endif /* CONFIG_WPS */
static bool is_chanwidth160_supported(struct hostapd_hw_modes *mode,
struct hostapd_config *conf)
{
#ifdef CONFIG_IEEE80211AX
if (conf->ieee80211ax) {
struct he_capabilities *he_cap;
he_cap = &mode->he_capab[IEEE80211_MODE_AP];
if (he_cap->phy_cap[HE_PHYCAP_CHANNEL_WIDTH_SET_IDX] &
(HE_PHYCAP_CHANNEL_WIDTH_SET_80PLUS80MHZ_IN_5G |
HE_PHYCAP_CHANNEL_WIDTH_SET_160MHZ_IN_5G))
return true;
}
#endif /* CONFIG_IEEE80211AX */
if (mode->vht_capab & (VHT_CAP_SUPP_CHAN_WIDTH_160MHZ |
VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ))
return true;
return false;
}
static void wpas_conf_ap_vht(struct wpa_supplicant *wpa_s, static void wpas_conf_ap_vht(struct wpa_supplicant *wpa_s,
struct wpa_ssid *ssid, struct wpa_ssid *ssid,
struct hostapd_config *conf, struct hostapd_config *conf,
@ -105,7 +126,7 @@ static void wpas_conf_ap_vht(struct wpa_supplicant *wpa_s,
*/ */
hostapd_set_oper_chwidth(conf, CHANWIDTH_160MHZ); hostapd_set_oper_chwidth(conf, CHANWIDTH_160MHZ);
center_chan = wpas_p2p_get_vht160_center(wpa_s, mode, channel); center_chan = wpas_p2p_get_vht160_center(wpa_s, mode, channel);
if (center_chan) { if (center_chan && is_chanwidth160_supported(mode, conf)) {
wpa_printf(MSG_DEBUG, wpa_printf(MSG_DEBUG,
"VHT center channel %u for auto-selected 160 MHz bandwidth", "VHT center channel %u for auto-selected 160 MHz bandwidth",
center_chan); center_chan);