This patch aims to automatically enable 40MHz channel width based on driver capabilities when setting up an AP mode operation. It can also be prevented that using the disable_ht40 network parameter. --- wpa_supplicant/ap.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 75 insertions(+), 8 deletions(-) diff --git a/wpa_supplicant/ap.c b/wpa_supplicant/ap.c index 7710a8d..2826c28 100644 --- a/wpa_supplicant/ap.c +++ b/wpa_supplicant/ap.c @@ -96,6 +96,52 @@ no_vht: } #endif /* CONFIG_IEEE80211N */ +#ifdef CONFIG_IEEE80211N +static int wpas_conf_ap_mode_ht_chwidth(struct hostapd_hw_modes *mode, u8 channel) +{ + int j, secondary_channel = 0; + struct hostapd_channel_data *pri_chan = NULL, *sec_chan = NULL; + int ht40plus[] = { 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157, + 184, 192 }; + + /* + * Only HT40+ is supported. + * TODO: Select HT40+ or HT40- based on Beacons detection. + */ + + for (j = 0; j < mode->num_channels; j++) { + pri_chan = &mode->channels[j]; + if (pri_chan->chan == channel) + break; + pri_chan = NULL; + } + if (!pri_chan || (pri_chan->flag & (HOSTAPD_CHAN_DISABLED | + HOSTAPD_CHAN_RADAR | HOSTAPD_CHAN_NO_IR)) || + !(pri_chan->flag & HOSTAPD_CHAN_HT40PLUS)) + return 0; + + for (j = 0; j < ARRAY_SIZE(ht40plus); j++) { + if (ht40plus[j] == channel) { + secondary_channel = 1; + break; + } + } + if (!secondary_channel) + return 0; + + for (j = 0; j < mode->num_channels; j++) { + sec_chan = &mode->channels[j]; + if (sec_chan->chan == channel + 4) + break; + sec_chan = NULL; + } + if (!sec_chan || (sec_chan->flag & (HOSTAPD_CHAN_DISABLED | + HOSTAPD_CHAN_RADAR | HOSTAPD_CHAN_NO_IR))) + return 0; + + return secondary_channel; +} +#endif /* CONFIG_IEEE80211N */ int wpa_supplicant_conf_ap_ht(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid, @@ -110,7 +156,7 @@ int wpa_supplicant_conf_ap_ht(struct wpa_supplicant *wpa_s, return -1; } - /* TODO: enable HT40 if driver supports it; + /* TODO: enable HT40 if driver supports it for non-AP use cases; * drop to 11b if driver does not support 11g */ #ifdef CONFIG_IEEE80211N @@ -140,18 +186,39 @@ int wpa_supplicant_conf_ap_ht(struct wpa_supplicant *wpa_s, if (!no_ht && mode && mode->ht_capab) { conf->ieee80211n = 1; -#ifdef CONFIG_P2P + if (conf->hw_mode == HOSTAPD_MODE_IEEE80211A && (mode->ht_capab & - HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET) && - ssid->ht40) - conf->secondary_channel = - wpas_p2p_get_ht40_mode(wpa_s, mode, - conf->channel); + HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET)) { + + /* Enable HT40 when AP mode operation if the driver + * supports it unless it was specifically prevented.*/ + if (ssid->mode == WPAS_MODE_AP) { + ssid->ht40 = 1; +#ifdef CONFIG_HT_OVERRIDES + if (ssid->disable_ht40) + ssid->ht40 = 0; +#endif /* CONFIG_HT_OVERRIDES */ + } + + if (ssid->ht40) { + if (ssid->mode == WPAS_MODE_AP) { + conf->secondary_channel = + wpas_conf_ap_mode_ht_chwidth(mode, + conf->channel); + } else { +#ifdef CONFIG_P2P + conf->secondary_channel = + wpas_p2p_get_ht40_mode(wpa_s, mode, + conf->channel); +#endif /* CONFIG_P2P */ + } + } + } + if (conf->secondary_channel) conf->ht_capab |= HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET; -#endif /* CONFIG_P2P */ /* * white-list capabilities that won't cause issues -- 1.9.1 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap