From ed24bad1d98d50f94e024f71093cdbd76cc0d872 Mon Sep 17 00:00:00 2001 From: Sreeramya Soratkal Date: Wed, 18 Nov 2020 16:21:29 +0530 Subject: [PATCH] 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 --- wpa_supplicant/ap.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/wpa_supplicant/ap.c b/wpa_supplicant/ap.c index a4892e788..ac88a7dc9 100644 --- a/wpa_supplicant/ap.c +++ b/wpa_supplicant/ap.c @@ -44,6 +44,27 @@ static void wpas_wps_ap_pin_timeout(void *eloop_data, void *user_ctx); #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, struct wpa_ssid *ssid, 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); 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, "VHT center channel %u for auto-selected 160 MHz bandwidth", center_chan);