--- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -4960,6 +4960,14 @@ static int wpa_driver_nl80211_sta_add(vo goto fail; } + if (params->he_6ghz_capab) { + wpa_hexdump(MSG_DEBUG, " * he_6ghz_capab", + (u8 *) params->he_6ghz_capab, sizeof(*params->he_6ghz_capab)); + if (nla_put(msg, NL80211_ATTR_HE_6GHZ_CAPABILITY, + sizeof(*params->he_6ghz_capab), params->he_6ghz_capab)) + goto fail; + } + if (params->ext_capab) { wpa_hexdump(MSG_DEBUG, " * ext_capab", params->ext_capab, params->ext_capab_len); --- a/src/common/ieee802_11_common.c +++ b/src/common/ieee802_11_common.c @@ -884,6 +884,7 @@ enum hostapd_hw_mode ieee80211_freq_to_c u8 *op_class, u8 *channel) { u8 vht_opclass; + u8 he_6ghz_opclass; /* TODO: more operating classes */ @@ -931,15 +932,19 @@ enum hostapd_hw_mode ieee80211_freq_to_c switch (chanwidth) { case CHANWIDTH_80MHZ: vht_opclass = 128; + he_6ghz_opclass = 133; break; case CHANWIDTH_160MHZ: vht_opclass = 129; + he_6ghz_opclass = 134; break; case CHANWIDTH_80P80MHZ: vht_opclass = 130; + he_6ghz_opclass = 135; break; default: vht_opclass = 0; + he_6ghz_opclass = 0; break; } @@ -1030,15 +1035,17 @@ enum hostapd_hw_mode ieee80211_freq_to_c } if (freq > 5950 && freq <= 7115) { - int bw; - u8 idx = (freq - 5950) / 5; - - bw = center_idx_to_bw_6ghz(idx); - if (bw < 0) + if ((freq - 5950) % 5) return NUM_HOSTAPD_MODES; - *channel = idx; - *op_class = 131 + bw; + if (he_6ghz_opclass) + *op_class = he_6ghz_opclass; + else if (sec_channel == 1 || sec_channel == -1) + *op_class = 132; + else + *op_class = 131; + + *channel = (freq - 5950) / 5; return HOSTAPD_MODE_IEEE80211A; }