This patch aims to automatically enable 802.11ac (VHT) based on driver capabilities when setting up an AP mode operation. It also allows to prevent that using the disable_vht network parameter. --- wpa_supplicant/ap.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 112 insertions(+), 3 deletions(-) diff --git a/wpa_supplicant/ap.c b/wpa_supplicant/ap.c index 2826c28..5693b0e 100644 --- a/wpa_supplicant/ap.c +++ b/wpa_supplicant/ap.c @@ -96,6 +96,82 @@ no_vht: } #endif /* CONFIG_IEEE80211N */ +#ifdef CONFIG_IEEE80211AC +static void wpas_conf_ap_mode_vht_chwidth(struct hostapd_hw_modes *mode, + struct hostapd_config *conf) +{ + u8 central_channels[] = { 42, 58, 106, 122, 138, 155 }; + u8 central_channel = 0; + int i; + + switch (conf->vht_oper_chwidth) { + case VHT_CHANWIDTH_USE_HT: + break; + case VHT_CHANWIDTH_80P80MHZ: + case VHT_CHANWIDTH_160MHZ: + conf->vht_oper_chwidth = VHT_CHANWIDTH_USE_HT; + break; + case VHT_CHANWIDTH_80MHZ: + break; + default: + conf->vht_oper_chwidth = VHT_CHANWIDTH_80MHZ; + break; + } + + /* TODO: Support 160MHz and 80+80MHz */ + if (conf->vht_oper_chwidth != VHT_CHANWIDTH_80MHZ) + return; + + for (i = 0; i < ARRAY_SIZE(central_channels); i++) { + if (conf->channel >= central_channels[i] - 6 && + conf->channel <= central_channels[i] + 6) { + central_channel = central_channels[i]; + break; + } + } + if (central_channel == 0) + goto no_vht_chwidth; + + /* Check involved channels are available */ + for (i = 0; i < 4; i++) { + int j; + struct hostapd_channel_data *chan = NULL; + u8 involved_chan = central_channel - 6 + i * 4; + + /* Get channel information */ + for (j = 0; j < mode->num_channels; j++) { + chan = &mode->channels[j]; + if (chan->chan == involved_chan) + break; + } + if (j == mode->num_channels || !chan) + break; + + if (chan->flag & (HOSTAPD_CHAN_DISABLED | + HOSTAPD_CHAN_RADAR | HOSTAPD_CHAN_NO_IR)) + break; + + if (i == 0 && !(chan->flag & HOSTAPD_CHAN_VHT_10_70)) + break; + if (i == 1 && !(chan->flag & HOSTAPD_CHAN_VHT_30_50)) + break; + if (i == 2 && !(chan->flag & HOSTAPD_CHAN_VHT_50_30)) + break; + if (i == 3 && !(chan->flag & HOSTAPD_CHAN_VHT_70_10)) + break; + } + if (i != 4) + goto no_vht_chwidth; + + conf->vht_oper_centr_freq_seg0_idx = central_channel; + conf->vht_oper_centr_freq_seg1_idx = 0; + return; + +no_vht_chwidth: + conf->vht_oper_chwidth = VHT_CHANWIDTH_USE_HT; +} +#endif /* CONFIG_IEEE80211AC */ + #ifdef CONFIG_IEEE80211N static int wpas_conf_ap_mode_ht_chwidth(struct hostapd_hw_modes *mode, u8 channel) { @@ -233,9 +309,39 @@ int wpa_supplicant_conf_ap_ht(struct wpa_supplicant *wpa_s, HT_CAP_INFO_TX_STBC | HT_CAP_INFO_MAX_AMSDU_SIZE); - if (mode->vht_capab && ssid->vht) { - conf->ieee80211ac = 1; - wpas_conf_ap_vht(wpa_s, conf, mode); + if (mode->vht_capab) { +#ifdef CONFIG_IEEE80211AC + if (ssid->mode == WPAS_MODE_AP) { + /* + * Enable VHT when AP mode operation if the driver + * supports it unless it was specifically prevented. + */ + conf->ieee80211ac = 1; + conf->vht_capab |= mode->vht_capab & + (VHT_CAP_SHORT_GI_80 | + VHT_CAP_MAX_MPDU_LENGTH_MASK | + VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX); + wpas_conf_ap_mode_vht_chwidth(mode, conf); + +#ifdef CONFIG_VHT_OVERRIDES + if (ssid->disable_vht) { + conf->vht_oper_chwidth = VHT_CHANWIDTH_USE_HT; + conf->ieee80211ac = 0; + conf->vht_capab = 0; + ssid->vht = 0; + } +#endif /* CONFIG_VHT_OVERRIDES */ + } +#endif /* CONFIG_IEEE80211AC */ + + /* + * For non-AP use cases, ssid->vht was previously configured + * according their own parameters, do not modify this behavior + */ + if (ssid->vht) { + conf->ieee80211ac = 1; + wpas_conf_ap_vht(wpa_s, conf, mode); + } } } } @@ -756,6 +862,9 @@ int wpa_supplicant_create_ap(struct wpa_supplicant *wpa_s, return -1; } + /* Set 80MHz as default channel width for AP-mode */ + if (ssid->mode == WPAS_MODE_AP) + conf->vht_oper_chwidth = VHT_CHANWIDTH_80MHZ; /* Use the maximum oper channel width if it's given. */ if (ssid->max_oper_chwidth) conf->vht_oper_chwidth = ssid->max_oper_chwidth; -- 1.9.1 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap