mesh: Enable 80 MHz support for 11s mesh in 6 GHz

Add support for 80 MHz bandwidth operation in 6 GHz 11s mesh.

example:
    network={
        ssid="6GHz-mesh-node"
        key_mgmt=SAE
        mode=5
        frequency=6195
        psk="1234567890"
    }

Signed-off-by: Pradeep Kumar Chitrapu <pradeepc@codeaurora.org>
This commit is contained in:
Pradeep Kumar Chitrapu 2021-09-09 10:46:14 -07:00 committed by Jouni Malinen
parent d6c5feb8ce
commit d10a01e221
3 changed files with 52 additions and 8 deletions

View file

@ -437,6 +437,30 @@ static int wpa_supplicant_mesh_init(struct wpa_supplicant *wpa_s,
if (!conf) if (!conf)
goto out_free; goto out_free;
if (is_6ghz_freq(freq->freq)) {
/* Set mandatory op_class parameter for setting up BSS */
switch (freq->bandwidth) {
case 20:
if (freq->freq == 5935)
conf->op_class = 136;
else
conf->op_class = 131;
break;
case 40:
conf->op_class = 132;
break;
case 80:
conf->op_class = 133;
break;
case 160:
conf->op_class = 134;
break;
default:
conf->op_class = 131;
break;
}
}
bss->conf = *conf->bss; bss->conf = *conf->bss;
bss->conf->start_disabled = 1; bss->conf->start_disabled = 1;
bss->conf->mesh = MESH_ENABLED; bss->conf->mesh = MESH_ENABLED;

View file

@ -251,6 +251,9 @@ static void mesh_mpm_send_plink_action(struct wpa_supplicant *wpa_s,
HE_MAX_MCS_CAPAB_SIZE + HE_MAX_MCS_CAPAB_SIZE +
HE_MAX_PPET_CAPAB_SIZE; HE_MAX_PPET_CAPAB_SIZE;
buf_len += 3 + sizeof(struct ieee80211_he_operation); buf_len += 3 + sizeof(struct ieee80211_he_operation);
if (is_6ghz_op_class(bss->iconf->op_class))
buf_len += sizeof(struct ieee80211_he_6ghz_oper_info) +
3 + sizeof(struct ieee80211_he_6ghz_band_cap);
} }
#endif /* CONFIG_IEEE80211AX */ #endif /* CONFIG_IEEE80211AX */
if (type != PLINK_CLOSE) if (type != PLINK_CLOSE)
@ -375,11 +378,14 @@ static void mesh_mpm_send_plink_action(struct wpa_supplicant *wpa_s,
HE_MAX_PHY_CAPAB_SIZE + HE_MAX_PHY_CAPAB_SIZE +
HE_MAX_MCS_CAPAB_SIZE + HE_MAX_MCS_CAPAB_SIZE +
HE_MAX_PPET_CAPAB_SIZE + HE_MAX_PPET_CAPAB_SIZE +
3 + sizeof(struct ieee80211_he_operation)]; 3 + sizeof(struct ieee80211_he_operation) +
sizeof(struct ieee80211_he_6ghz_oper_info) +
3 + sizeof(struct ieee80211_he_6ghz_band_cap)];
pos = hostapd_eid_he_capab(bss, he_capa_oper, pos = hostapd_eid_he_capab(bss, he_capa_oper,
IEEE80211_MODE_MESH); IEEE80211_MODE_MESH);
pos = hostapd_eid_he_operation(bss, pos); pos = hostapd_eid_he_operation(bss, pos);
pos = hostapd_eid_he_6ghz_band_cap(bss, pos);
wpabuf_put_data(buf, he_capa_oper, pos - he_capa_oper); wpabuf_put_data(buf, he_capa_oper, pos - he_capa_oper);
} }
#endif /* CONFIG_IEEE80211AX */ #endif /* CONFIG_IEEE80211AX */
@ -749,6 +755,7 @@ static struct sta_info * mesh_mpm_add_peer(struct wpa_supplicant *wpa_s,
#ifdef CONFIG_IEEE80211AX #ifdef CONFIG_IEEE80211AX
copy_sta_he_capab(data, sta, IEEE80211_MODE_MESH, copy_sta_he_capab(data, sta, IEEE80211_MODE_MESH,
elems->he_capabilities, elems->he_capabilities_len); elems->he_capabilities, elems->he_capabilities_len);
copy_sta_he_6ghz_capab(data, sta, elems->he_6ghz_band_cap);
#endif /* CONFIG_IEEE80211AX */ #endif /* CONFIG_IEEE80211AX */
if (hostapd_get_aid(data, sta) < 0) { if (hostapd_get_aid(data, sta) < 0) {
@ -770,6 +777,7 @@ static struct sta_info * mesh_mpm_add_peer(struct wpa_supplicant *wpa_s,
params.vht_capabilities = sta->vht_capabilities; params.vht_capabilities = sta->vht_capabilities;
params.he_capab = sta->he_capab; params.he_capab = sta->he_capab;
params.he_capab_len = sta->he_capab_len; params.he_capab_len = sta->he_capab_len;
params.he_6ghz_capab = sta->he_6ghz_capab;
params.flags |= WPA_STA_WMM; params.flags |= WPA_STA_WMM;
params.flags_mask |= WPA_STA_AUTHENTICATED; params.flags_mask |= WPA_STA_AUTHENTICATED;
if (conf->security == MESH_CONF_SEC_NONE) { if (conf->security == MESH_CONF_SEC_NONE) {

View file

@ -2418,7 +2418,9 @@ void ibss_mesh_setup_freq(struct wpa_supplicant *wpa_s,
struct hostapd_hw_modes *mode = NULL; struct hostapd_hw_modes *mode = NULL;
int ht40plus[] = { 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157, int ht40plus[] = { 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157,
184, 192 }; 184, 192 };
int bw80[] = { 5180, 5260, 5500, 5580, 5660, 5745 }; int bw80[] = { 5180, 5260, 5500, 5580, 5660, 5745, 5955,
6035, 6115, 6195, 6275, 6355, 6435, 6515,
6595, 6675, 6755, 6835, 6915, 6995 };
struct hostapd_channel_data *pri_chan = NULL, *sec_chan = NULL; struct hostapd_channel_data *pri_chan = NULL, *sec_chan = NULL;
u8 channel; u8 channel;
int i, chan_idx, ht40 = -1, res, obss_scan = 1; int i, chan_idx, ht40 = -1, res, obss_scan = 1;
@ -2426,7 +2428,7 @@ void ibss_mesh_setup_freq(struct wpa_supplicant *wpa_s,
struct hostapd_freq_params vht_freq; struct hostapd_freq_params vht_freq;
int chwidth, seg0, seg1; int chwidth, seg0, seg1;
u32 vht_caps = 0; u32 vht_caps = 0;
int is_24ghz; bool is_24ghz, is_6ghz;
freq->freq = ssid->frequency; freq->freq = ssid->frequency;
@ -2483,6 +2485,13 @@ void ibss_mesh_setup_freq(struct wpa_supplicant *wpa_s,
is_24ghz = hw_mode == HOSTAPD_MODE_IEEE80211G || is_24ghz = hw_mode == HOSTAPD_MODE_IEEE80211G ||
hw_mode == HOSTAPD_MODE_IEEE80211B; hw_mode == HOSTAPD_MODE_IEEE80211B;
/* HT/VHT and corresponding overrides are not applicable to 6 GHz.
* However, HE is mandatory for 6 GHz.
*/
is_6ghz = is_6ghz_freq(freq->freq);
if (is_6ghz)
goto skip_to_6ghz;
#ifdef CONFIG_HT_OVERRIDES #ifdef CONFIG_HT_OVERRIDES
if (ssid->disable_ht) { if (ssid->disable_ht) {
freq->ht_enabled = 0; freq->ht_enabled = 0;
@ -2610,8 +2619,6 @@ skip_ht40:
!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_VHT_IBSS)) !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_VHT_IBSS))
return; return;
vht_freq = *freq;
#ifdef CONFIG_VHT_OVERRIDES #ifdef CONFIG_VHT_OVERRIDES
if (ssid->disable_vht) { if (ssid->disable_vht) {
freq->vht_enabled = 0; freq->vht_enabled = 0;
@ -2619,8 +2626,12 @@ skip_ht40:
} }
#endif /* CONFIG_VHT_OVERRIDES */ #endif /* CONFIG_VHT_OVERRIDES */
skip_to_6ghz:
vht_freq = *freq;
/* 6 GHz does not have VHT enabled, so allow that exception here. */
vht_freq.vht_enabled = vht_supported(mode); vht_freq.vht_enabled = vht_supported(mode);
if (!vht_freq.vht_enabled) if (!vht_freq.vht_enabled && !is_6ghz)
return; return;
/* Enable HE with VHT for 5 GHz */ /* Enable HE with VHT for 5 GHz */
@ -2678,8 +2689,9 @@ skip_ht40:
/* Found a suitable second segment for 80+80 */ /* Found a suitable second segment for 80+80 */
chwidth = CHANWIDTH_80P80MHZ; chwidth = CHANWIDTH_80P80MHZ;
vht_caps |= if (!is_6ghz)
VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ; vht_caps |=
VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ;
seg1 = channel + 6; seg1 = channel + 6;
} }