[PATCH] Update IEEE802.11 ax (HE) definitions to D3.0

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Add IEEE 802.11ax definitions, IEEE structures
and constants w.r.t 11ax draft version 3.0.
Update hostapd conf file for configuration.
Changes in the HE function definitions.
IEEE 802.11ax draft is not yet finalized and the
element contents is subject to change.

Signed-off-by: Siva Mullati <siva.mullati@xxxxxxxxx>
---
 hostapd/config_file.c        | 495 +++++++++++++++++++++++++++++++++++++++++--
 hostapd/hostapd.conf         | 104 ++++++---
 src/ap/ap_config.h           |  24 +--
 src/ap/beacon.c              |   8 +-
 src/ap/ieee802_11.h          |   7 +-
 src/ap/ieee802_11_he.c       | 148 ++++++++++---
 src/common/ieee802_11_defs.h | 316 ++++++++++++++++++++++++---
 src/utils/common.h           |  17 ++
 8 files changed, 984 insertions(+), 135 deletions(-)

diff --git a/hostapd/config_file.c b/hostapd/config_file.c
index 10a52fda2..007094ed7 100644
--- a/hostapd/config_file.c
+++ b/hostapd/config_file.c
@@ -1378,6 +1378,119 @@ static int hostapd_config_vht_capab(struct hostapd_config *conf,
 }
 #endif /* CONFIG_IEEE80211AC */
 
+#ifdef CONFIG_IEEE80211AX
+static int hostapd_config_he_capab(struct hostapd_config *conf,
+				    const char *capab)
+{
+	/* HE MAC Capabilities Information field */
+	if (os_strstr(capab, "[PLUS_HTC_HE_SUPPORT]"))
+		conf->he_capab.he_mac_capab_info[HE_MACCAP_CAP0_IDX] |=
+											HE_MAC_CAP0_HTC_HE_SUPPORT;
+	if (os_strstr(capab, "[TWT_REQUESTER_SUPPORT]"))
+		conf->he_capab.he_mac_capab_info[HE_MACCAP_CAP0_IDX] |=
+										HE_MAC_CAP0_TWT_REQUESTER_SUPPORT;
+	if (os_strstr(capab, "[TWT_RESPONDER_SUPPORT]"))
+		conf->he_capab.he_mac_capab_info[HE_MACCAP_CAP0_IDX] |=
+									HE_MAC_CAP0_TWT_RESPONDER_SUPPORT;
+	if (os_strstr(capab, "[ALL_ACK_SUPPORT]"))
+		conf->he_capab.he_mac_capab_info[HE_MACCAP_CAP2_IDX] |=
+											HE_MAC_CAP2_ALL_ACK_SUPPORT;
+	if (os_strstr(capab, "[BSR_SUPPORT]"))
+		conf->he_capab.he_mac_capab_info[HE_MACCAP_CAP2_IDX] |=
+												HE_MAC_CAP2_BSR_SUPPORT;
+	if (os_strstr(capab, "[BROADCAST_TWT_SUPPORT]"))
+		conf->he_capab.he_mac_capab_info[HE_MACCAP_CAP2_IDX] |=
+										HE_MAC_CAP2_BROADCAST_TWT_SUPPORT;
+	if (os_strstr(capab, "[32BIT_BA_BITMAP_SUPPORT]"))
+		conf->he_capab.he_mac_capab_info[HE_MACCAP_CAP2_IDX] |=
+									HE_MAC_CAP2_32BIT_BA_BITMAP_SUPPORT;
+	if (os_strstr(capab, "[MU_CASCADING_SUPPORT]"))
+		conf->he_capab.he_mac_capab_info[HE_MACCAP_CAP2_IDX] |=
+										HE_MAC_CAP2_MU_CASCADING_SUPPORT;
+	if (os_strstr(capab, "[ACK_ENABLED_MULTI_TID_AGGREGATION_SUPPORT]"))
+		conf->he_capab.he_mac_capab_info[HE_MACCAP_CAP2_IDX] |=
+							HE_MAC_CAP2_ACK_ENABLED_AGGREGATION_SUPPORT;
+	if (os_strstr(capab, "[OM_CONTROL_SUPPORT]"))
+		conf->he_capab.he_mac_capab_info[HE_MACCAP_CAP3_IDX] |=
+										HE_MAC_CAP3_OM_CONTROL_SUPPORT;
+	if (os_strstr(capab, "[OFDMA_RA_SUPPORT]"))
+		conf->he_capab.he_mac_capab_info[HE_MACCAP_CAP3_IDX] |=
+											HE_MAC_CAP3_OFDMA_RA_SUPPORT;
+	if (os_strstr(capab, "[A_MSDU_FRAGMENTATION_SUPPORT]"))
+		conf->he_capab.he_mac_capab_info[HE_MACCAP_CAP3_IDX] |=
+								HE_MAC_CAP3_AMSDU_FRGMENTATION_SUPPORT;
+	if (os_strstr(capab, "[FLEXIBLE_TWT_SCHEDULE_SUPPORT]"))
+		conf->he_capab.he_mac_capab_info[HE_MACCAP_CAP3_IDX] |=
+								HE_MAC_CAP3_FLEXIBLE_TWT_SCHEDULE_SUPPORT;
+	if (os_strstr(capab, "[RX_CONTROL_FRAME_TO_MULTIBSS]"))
+		conf->he_capab.he_mac_capab_info[HE_MACCAP_CAP3_IDX] |=
+								HE_MAC_CAP3_RX_CONTROL_FRAME_TO_MULTIBSS;
+	if (os_strstr(capab, "[BSRP_A_MPDU_AGGREGATION]"))
+		conf->he_capab.he_mac_capab_info[HE_MACCAP_CAP4_IDX] |=
+								HE_MAC_CAP4_BSRP_BQRP_AMPDU_AGGREGATION;
+	if (os_strstr(capab, "[QTP_SUPPORT]"))
+		conf->he_capab.he_mac_capab_info[HE_MACCAP_CAP4_IDX] |=
+												HE_MAC_CAP4_QTP_SUPPORT;
+	if (os_strstr(capab, "[BQR_SUPPORT]"))
+		conf->he_capab.he_mac_capab_info[HE_MACCAP_CAP4_IDX] |=
+												HE_MAC_CAP4_BQR_SUPPORT;
+	if (os_strstr(capab, "[MSDU_IN_A_MPDU_SUPPORT]"))
+		conf->he_capab.he_mac_capab_info[HE_MACCAP_CAP4_IDX] |=
+									HE_MAC_CAP4_AMSDU_IN_AMPDU_SUPPORT;
+
+	/* HE PHY Capabilities Information field */
+	if (os_strstr(capab, "[DEVICE_CLASS]"))
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP1_IDX] |=
+												HE_PHY_CAP1_DEVICE_CLASS;
+	if (os_strstr(capab, "[LDPC_CODING_IN_PAYLOAD]"))
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP1_IDX] |=
+									HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD;
+	if (os_strstr(capab, "[SU_BEAMFORMER_CAPABLE]"))
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP3_IDX] |=
+												HE_PHY_CAP3_SU_BEAMFORMER;
+	if (os_strstr(capab, "[SU_BEAMFORMEE_CAPABLE]"))
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP4_IDX] |=
+												HE_PHY_CAP4_SU_BEAMFORMEE;
+	if (os_strstr(capab, "[MU_BEAMFORMER_CAPABLE]"))
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP4_IDX] |=
+												HE_PHY_CAP4_MU_BEAMFORMER;
+	if (os_strstr(capab, "[NG_16_CAPABLE_SU_FEEDBACK]"))
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP5_IDX] |=
+								HE_PHY_CAP5_NG_16_FOR_SU_FB_SUPPORT;
+	if (os_strstr(capab, "[NG_16_MU_FEEDBACK]"))
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP5_IDX] |=
+								HE_PHY_CAP5_NG_16_FOR_MU_FB_SUPPORT;
+	if (os_strstr(capab, "[CODEBOOK_SIZE42_FOR_SU_SUPPORT]"))
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP6_IDX] |=
+							HE_PHY_CAP6_CODEBOOK_SIZE42_FOR_SU_SUPPORT;
+	if (os_strstr(capab, "[CODEBOOK_SIZE75_FOR_MU_SUPPORT]"))
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP6_IDX] |=
+							HE_PHY_CAP6_CODEBOOK_SIZE75_FOR_MU_SUPPORT;
+	if (os_strstr(capab, "[PPE_THRESHOLD_PRESENT]"))
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP6_IDX] |=
+										HE_PHY_CAP6_PPE_THRESHOLD_PRESENT;
+	if (os_strstr(capab, "[SRP_BASED_SR_SUPPORT]"))
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP7_IDX] |=
+										HE_PHY_CAP7_SRP_BASED_SR_SUPPORT;
+	if (os_strstr(capab, "[POWER_BOOST_FACTOR_ALPHA_SUPPORT]"))
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP7_IDX] |=
+								HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPPORT;
+	if (os_strstr(capab, "[SU_PPDU_AND_HE_MU_PPDU_WITH_4X_HE_LTF_08US_GI]"))
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP7_IDX] |=
+					HE_PHY_CAP7_SU_PPDU_AND_HE_MU_WITH_4X_HE_LTF_0_8US_GI;
+	if (os_strstr(capab, "[TRIGGERED_SU_BEAMFORMING_FEEDBACK]"))
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP6_IDX] |=
+							HE_PHY_CAP6_TRIGGERED_SU_BEAMFORMING_FEEDBACK;
+	if (os_strstr(capab, "[TRIGGERED_CQI_FEEDBACK]"))
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP6_IDX] |=
+									HE_PHY_CAP6_TRIGGERED_CQI_FEEDBACK;
+	if (os_strstr(capab, "[PARTIAL_BANDWIDTH_EXTENDED_RANGE]"))
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP6_IDX] |=
+							HE_PHY_CAP6_PARTIAL_BANDWIDTH_EXTENDED_RANGE;
+
+	return 0;
+}
+#endif /* CONFIG_IEEE80211AX */
 
 #ifdef CONFIG_INTERWORKING
 static int parse_roaming_consortium(struct hostapd_bss_config *bss, char *pos,
@@ -3383,20 +3496,374 @@ static int hostapd_config_fill(struct hostapd_config *conf,
 #ifdef CONFIG_IEEE80211AX
 	} else if (os_strcmp(buf, "ieee80211ax") == 0) {
 		conf->ieee80211ax = atoi(pos);
-	} else if (os_strcmp(buf, "he_su_beamformer") == 0) {
-		conf->he_phy_capab.he_su_beamformer = atoi(pos);
-	} else if (os_strcmp(buf, "he_su_beamformee") == 0) {
-		conf->he_phy_capab.he_su_beamformee = atoi(pos);
-	} else if (os_strcmp(buf, "he_mu_beamformer") == 0) {
-		conf->he_phy_capab.he_mu_beamformer = atoi(pos);
-	} else if (os_strcmp(buf, "he_bss_color") == 0) {
-		conf->he_op.he_bss_color = atoi(pos);
-	} else if (os_strcmp(buf, "he_default_pe_duration") == 0) {
-		conf->he_op.he_default_pe_duration = atoi(pos);
-	} else if (os_strcmp(buf, "he_twt_required") == 0) {
-		conf->he_op.he_twt_required = atoi(pos);
-	} else if (os_strcmp(buf, "he_rts_threshold") == 0) {
-		conf->he_op.he_rts_threshold = atoi(pos);
+	} else if (os_strcmp(buf, "he_capab") == 0) {
+		if (hostapd_config_he_capab(conf, pos) < 0) {
+			wpa_printf(MSG_ERROR, "Line %d: invalid he_capab",
+				   line);
+			return 1;
+		}
+	} else if (os_strcmp(buf, "require_he") == 0) {
+		conf->require_vht = atoi(pos);
+	} else if (os_strcmp(buf, "he_mac_fragmentation") == 0) {
+		conf->he_capab.he_mac_capab_info[HE_MACCAP_CAP0_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_MAC_CAP0_FRAGMENTATION_SUPPORT);
+	} else if (os_strcmp(buf, "he_mac_max_num_of_frag_msdus") == 0) {
+		conf->he_capab.he_mac_capab_info[HE_MACCAP_CAP0_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_MAC_CAP0_MAX_NUM_OF_FRAG_MSDU);
+	} else if (os_strcmp(buf, "he_mac_minimum_fragment_size") == 0) {
+		conf->he_capab.he_mac_capab_info[HE_MACCAP_CAP1_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_MAC_CAP1_MINIMUM_FRAGMENT_SIZE);
+	} else if (os_strcmp(buf, "he_mac_trigger_frame_mac_pad_dur") == 0) {
+		conf->he_capab.he_mac_capab_info[HE_MACCAP_CAP1_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_MAC_CAP1_TRIGGER_FRAME_MAC_PAD_DUR);
+	} else if (os_strcmp(buf, "he_mac_multi_tid_aggr_support") == 0) {
+		conf->he_capab.he_mac_capab_info[HE_MACCAP_CAP1_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_MAC_CAP1_MULTI_TID_AGGR_RX_SUPPORT);
+	} else if (os_strcmp(buf, "he_mac_he_link_adaptation") == 0) {
+		conf->he_capab.he_mac_capab_info[HE_MACCAP_CAP1_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_MAC_CAP1_HE_LINK_ADAPTION_SUPPORT);
+		conf->he_capab.he_mac_capab_info[HE_MACCAP_CAP2_IDX] |=
+			SET_HE_CAP(atoi(pos) >> 1, HE_MAC_CAP2_HE_LINK_ADAPTION_SUPPORT);
+	} else if (os_strcmp(buf, "he_mac_max_a_mpdu_length_exp") == 0) {
+		conf->he_capab.he_mac_capab_info[HE_MACCAP_CAP3_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT);
+	} else if (os_strcmp(buf, "he_mac_multi_tid_aggr_tx_support") == 0) {
+		conf->he_capab.he_mac_capab_info[HE_MACCAP_CAP4_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_MAC_CAP4_MULTI_TID_AGGR_TX_SUPPORT);
+		conf->he_capab.he_mac_capab_info[HE_MACCAP_CAP5_IDX] |=
+			SET_HE_CAP(atoi(pos) >> 1, HE_MAC_CAP5_MULTI_TID_AGGR_TX_SUPPORT);
+	} else if (os_strcmp(buf, "he_phy_channel_width_set") == 0) {
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP0_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PHY_CAP0_CHANNEL_WIDTH_SET);
+	} else if (os_strcmp(buf, "he_phy_preamble_puncturing_rx") == 0) {
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP1_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PHY_CAP1_PUN_PREAM_RX);
+	} else if (os_strcmp(buf, "he_phy_su_ppdu_1x_he_ltf_08_us_gi") == 0) {
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP1_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PHY_CAP1_SU_PPDU_1XHE_LTF_0_8US_GI);
+	} else if (os_strcmp(buf, "he_phy_ndp_4x_he_ltf_and_32_us_gi") == 0) {
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP2_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PHY_CAP2_NDP_4X_HE_LTF_AND_3_2MS_GI);
+	} else if (os_strcmp(buf, "he_phy_stbc_tx_less_or_equal_80mhz") == 0) {
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP2_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PHY_CAP2_STBC_TX_LESS_OR_EQUAL_80MHz);
+	} else if (os_strcmp(buf, "he_phy_stbc_rx_less_or_equal_80mhz") == 0) {
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP2_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PHY_CAP2_STBC_RX_LESS_OR_EQUAL_80MHz);
+	} else if (os_strcmp(buf, "he_phy_doppler_rx") == 0) {
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP2_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PHY_CAP2_DOPPLER_RX);
+	} else if (os_strcmp(buf, "he_phy_doppler_tx") == 0) {
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP2_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PHY_CAP2_DOPPLER_TX);
+	} else if (os_strcmp(buf, "he_phy_full_bandwidth_ul_mu_mimo") == 0) {
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP2_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PHY_CAP2_FULL_BANDWIDTH_UL_MU_MIMO);
+	} else if (os_strcmp(buf, "he_phy_partial_bandwidth_ul_mu_mimo") == 0) {
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP2_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PHY_CAP2_PARTIAL_BANDWIDTH_UL_MU_MIMO);
+	} else if (os_strcmp(buf, "he_phy_dcm_max_constellation_tx") == 0) {
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP3_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PHY_CAP3_DCM_MAX_CONSTELLATION_TX);
+	} else if (os_strcmp(buf, "he_phy_dcm_max_constellation_rx") == 0) {
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP3_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PHY_CAP3_DCM_MAX_CONSTELLATION_RX);
+	} else if (os_strcmp(buf, "he_phy_dcm_max_nss_tx") == 0) {
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP3_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PHY_CAP3_DCM_MAX_NSS_TX);
+	} else if (os_strcmp(buf, "he_phy_dcm_max_nss_rx") == 0) {
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP3_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PHY_CAP3_DCM_MAX_NSS_RX);
+	} else if (os_strcmp(buf, "he_phy_bmformee_sts_less_or_eq_80mhz") == 0) {
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP4_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PHY_CAP4_BF_STS_LESS_OR_EQ_80MHz);
+	} else if (os_strcmp(buf, "he_phy_bmformee_sts_greater_than_80mhz") == 0) {
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP4_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PHY_CAP4_BF_STS_GREATER_THAN_80MHz);
+	} else if (os_strcmp(buf, "he_phy_num_sound_dim_less_or_eq_80mhz") == 0) {
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP5_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PHY_CAP5_NUM_SOUND_DIM_LESS_80MHz);
+	} else if (os_strcmp(buf, "he_phy_num_sound_dim_greater_80mhz") == 0) {
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP5_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PHY_CAP5_NUM_SOUND_DIM_GREAT_80MHz);
+	} else if (os_strcmp(buf, "he_phy_max_nc") == 0) {
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP7_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PHY_CAP7_MAX_NC);
+	} else if (os_strcmp(buf, "he_phy_ng_16_capable_su_feedback") == 0) {
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP5_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PHY_CAP5_NG_16_FOR_SU_FB_SUPPORT);
+	} else if (os_strcmp(buf, "he_phy_ng_16_mu_feedback") == 0) {
+		conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP5_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PHY_CAP5_NG_16_FOR_MU_FB_SUPPORT);
+	} else if (os_strcmp(buf, "he_mcs_nss_rx_less_or_eq_80mhz") == 0) {
+		conf->he_capab.he_txrx_mcs_support[0] = atoi(pos) & 0xff;
+		conf->he_capab.he_txrx_mcs_support[1] = (atoi(pos) >> 8) & 0xff;
+	} else if (os_strcmp(buf, "he_mcs_nss_tx_less_or_eq_80mhz") == 0) {
+		conf->he_capab.he_txrx_mcs_support[2] = atoi(pos) & 0xff;
+		conf->he_capab.he_txrx_mcs_support[3] = (atoi(pos) >> 8) & 0xff;
+	} else if (os_strcmp(buf, "he_mcs_nss_rx_he_mcs_map_160_mhz") == 0) {
+		conf->he_capab.he_txrx_mcs_support[4] = atoi(pos) & 0xff;
+		conf->he_capab.he_txrx_mcs_support[5] = (atoi(pos) >> 8) & 0xff;
+	} else if (os_strcmp(buf, "he_mcs_nss_tx_he_mcs_map_160_mhz") == 0) {
+			conf->he_capab.he_txrx_mcs_support[6] = atoi(pos) & 0xff;
+			conf->he_capab.he_txrx_mcs_support[7] = (atoi(pos) >> 8) & 0xff;
+	} else if (os_strcmp(buf, "he_ppe_th_nss") == 0) {
+			conf->he_capab.he_ppe_thresholds[HE_PPE_CAP0_IDX] |=
+				SET_HE_CAP(atoi(pos), HE_PPE_CAP0_NSS_M1);
+	} else if (os_strcmp(buf, "he_ppe_th_ru_index_bitmask") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP0_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP0_RU_INDEX_BITMASK);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet16_for_nss1_for_ru0") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP0_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP0_PPET16_FOR_NSS1_FOR_RU0);
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP1_IDX] |=
+			SET_HE_CAP(atoi(pos) >> 1, HE_PPE_CAP1_PPET16_FOR_NSS1_FOR_RU0);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet16_for_nss1_for_ru1") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP1_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP1_PPET16_FOR_NSS1_FOR_RU1);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet16_for_nss1_for_ru2") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP2_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP2_PPET16_FOR_NSS1_FOR_RU2);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet16_for_nss1_for_ru3") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP3_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP3_PPET16_FOR_NSS1_FOR_RU3);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet16_for_nss2_for_ru0") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP3_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP3_PPET16_FOR_NSS2_FOR_RU0);
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP4_IDX] |=
+			SET_HE_CAP(atoi(pos) >> 1, HE_PPE_CAP4_PPET16_FOR_NSS2_FOR_RU0);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet16_for_nss2_for_ru1") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP4_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP4_PPET16_FOR_NSS2_FOR_RU1);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet16_for_nss2_for_ru2") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP5_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP5_PPET16_FOR_NSS2_FOR_RU2);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet16_for_nss2_for_ru3") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP6_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP6_PPET16_FOR_NSS2_FOR_RU3);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet16_for_nss3_for_ru0") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP6_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP6_PPET16_FOR_NSS3_FOR_RU0);
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP7_IDX] |=
+			SET_HE_CAP(atoi(pos) >> 1, HE_PPE_CAP7_PPET16_FOR_NSS3_FOR_RU0);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet16_for_nss3_for_ru1") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP7_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP7_PPET16_FOR_NSS3_FOR_RU1);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet16_for_nss3_for_ru2") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP8_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP8_PPET16_FOR_NSS3_FOR_RU2);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet16_for_nss3_for_ru3") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP9_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP9_PPET16_FOR_NSS3_FOR_RU3);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet16_for_nss4_for_ru0") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP9_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP9_PPET16_FOR_NSS4_FOR_RU0);
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP10_IDX] |=
+			SET_HE_CAP(atoi(pos) >> 1, HE_PPE_CAP10_PPET16_FOR_NSS4_FOR_RU0);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet16_for_nss4_for_ru1") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP10_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP10_PPET16_FOR_NSS4_FOR_RU1);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet16_for_nss4_for_ru2") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP11_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP11_PPET16_FOR_NSS4_FOR_RU2);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet16_for_nss4_for_ru3") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP12_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP12_PPET16_FOR_NSS4_FOR_RU3);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet8_for_nss1_for_ru0") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP1_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP1_PPET8_FOR_NSS1_FOR_RU0);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet8_for_nss1_for_ru1") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP2_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP2_PPET8_FOR_NSS1_FOR_RU1);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet8_for_nss1_for_ru2") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP2_IDX] |=
+			SET_HE_CAP(atoi(pos),HE_PPE_CAP2_PPET8_FOR_NSS1_FOR_RU2 );
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP3_IDX] |=
+			SET_HE_CAP(atoi(pos) >> 2, HE_PPE_CAP3_PPET8_FOR_NSS1_FOR_RU2);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet8_for_nss1_for_ru3") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP3_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP3_PPET8_FOR_NSS1_FOR_RU3);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet8_for_nss2_for_ru0") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP4_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP4_PPET8_FOR_NSS2_FOR_RU0);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet8_for_nss2_for_ru1") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP5_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP5_PPET8_FOR_NSS2_FOR_RU1);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet8_for_nss2_for_ru2") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP5_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP5_PPET8_FOR_NSS2_FOR_RU2);
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP6_IDX] |=
+			SET_HE_CAP(atoi(pos) >> 2, HE_PPE_CAP6_PPET8_FOR_NSS2_FOR_RU2);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet8_for_nss2_for_ru3") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP6_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP6_PPET8_FOR_NSS2_FOR_RU3);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet8_for_nss3_for_ru0") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP7_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP7_PPET8_FOR_NSS3_FOR_RU0);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet8_for_nss3_for_ru1") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP8_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP8_PPET8_FOR_NSS3_FOR_RU1);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet8_for_nss3_for_ru2") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP8_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP8_PPET8_FOR_NSS3_FOR_RU2);
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP9_IDX] |=
+			SET_HE_CAP(atoi(pos) >> 2, HE_PPE_CAP9_PPET8_FOR_NSS3_FOR_RU2);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet8_for_nss3_for_ru3") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP9_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP9_PPET8_FOR_NSS3_FOR_RU3);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet8_for_nss4_for_ru0") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP10_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP10_PPET8_FOR_NSS4_FOR_RU0);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet8_for_nss4_for_ru1") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP11_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP11_PPET8_FOR_NSS4_FOR_RU1);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet8_for_nss4_for_ru2") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP11_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP11_PPET8_FOR_NSS4_FOR_RU2);
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP12_IDX] |=
+			SET_HE_CAP(atoi(pos) >> 2, HE_PPE_CAP12_PPET8_FOR_NSS4_FOR_RU2);
+	} else if (os_strcmp(buf, "he_ppe_th_ppet8_for_nss4_for_ru3") == 0) {
+		conf->he_capab.he_ppe_thresholds[HE_PPE_CAP12_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_PPE_CAP12_PPET8_FOR_NSS4_FOR_RU3);
+	} else if (os_strcmp(buf, "he_operation_bss_color") == 0) {
+		conf->he_oper.bss_color_info = atoi(pos);
+	} else if (os_strcmp(buf, "he_operation_default_pe_duration") == 0) {
+		conf->he_oper.he_oper_params[HE_OPERATION_CAP0_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_OPERATION_CAP0_DEFAULT_PE_DURATION);
+	} else if (os_strcmp(buf, "he_operation_twt_required") == 0) {
+		conf->he_oper.he_oper_params[HE_OPERATION_CAP0_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_OPERATION_CAP0_TWT_REQUIRED);
+	} else if (os_strcmp(buf, "he_operation_txop_dur_rts_th") == 0) {
+		conf->he_oper.he_oper_params[HE_OPERATION_CAP0_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_OPERATION_CAP0_TXOP_DUR_RTS_TH);
+		conf->he_oper.he_oper_params[HE_OPERATION_CAP1_IDX] |=
+			SET_HE_CAP(atoi(pos) >> 4, HE_OPERATION_CAP1_TXOP_DUR_RTS_TH);
+	} else if (os_strcmp(buf, "he_operation_er_su_disable") == 0) {
+		conf->he_oper.he_oper_params[HE_OPERATION_CAP2_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_OPERATION_CAP2_ER_SU_DISABLE);
+	} else if (os_strcmp(buf, "he_operation_partial_bss_color") == 0) {
+		conf->he_oper.bss_color_info |=
+			SET_HE_CAP(atoi(pos), HE_OPERATION_PARTIAL_BSS_COLOR);
+	} else if (os_strcmp(buf, "he_operation_vht_oper_info_present") == 0) {
+		conf->he_oper.he_oper_params[HE_OPERATION_CAP1_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_OPERATION_CAP1_VHT_OPER_INFO_PRESENT);
+	} else if (os_strcmp(buf, "he_operation_bss_color_disabled") == 0) {
+		conf->he_oper.bss_color_info |=
+			SET_HE_CAP(atoi(pos), HE_OPERATION_BSS_COLOR_DISABLED);
+	} else if (os_strcmp(buf, "he_operation_max_mcs_for_1ss") == 0) {
+		conf->he_oper.he_mcs_nss_set[0] |=
+			SET_HE_CAP(atoi(pos), HE_MCS_NSS_FOR_1SS);
+	} else if (os_strcmp(buf, "he_operation_max_mcs_for_2ss") == 0) {
+		conf->he_oper.he_mcs_nss_set[0] |=
+			SET_HE_CAP(atoi(pos), HE_MCS_NSS_FOR_2SS);
+	} else if (os_strcmp(buf, "he_operation_max_mcs_for_3ss") == 0) {
+		conf->he_oper.he_mcs_nss_set[0] |=
+			SET_HE_CAP(atoi(pos), HE_MCS_NSS_FOR_3SS);
+	} else if (os_strcmp(buf, "he_operation_max_mcs_for_4ss") == 0) {
+		conf->he_oper.he_mcs_nss_set[0] |=
+			SET_HE_CAP(atoi(pos), HE_MCS_NSS_FOR_4SS);
+	} else if (os_strcmp(buf, "he_operation_max_mcs_for_5ss") == 0) {
+		conf->he_oper.he_mcs_nss_set[1] |=
+			SET_HE_CAP(atoi(pos), HE_MCS_NSS_FOR_5SS);
+	} else if (os_strcmp(buf, "he_operation_max_mcs_for_6ss") == 0) {
+		conf->he_oper.he_mcs_nss_set[1] |=
+			SET_HE_CAP(atoi(pos), HE_MCS_NSS_FOR_6SS);
+	} else if (os_strcmp(buf, "he_operation_max_mcs_for_7ss") == 0) {
+		conf->he_oper.he_mcs_nss_set[1] |=
+			SET_HE_CAP(atoi(pos), HE_MCS_NSS_FOR_7SS);
+	} else if (os_strcmp(buf, "he_operation_max_mcs_for_8ss") == 0) {
+		conf->he_oper.he_mcs_nss_set[1] |=
+			SET_HE_CAP(atoi(pos), HE_MCS_NSS_FOR_8SS);
+	} else if (os_strcmp(buf, "he_operation_vht_channel_width") == 0) {
+		conf->he_oper.vht_op_info_chwidth = atoi(pos);
+	} else if (os_strcmp(buf, "he_operation_vht_channel_center_seg0") == 0) {
+		conf->he_oper.vht_op_info_chan_center_freq_seg0_idx = atoi(pos);
+	} else if (os_strcmp(buf, "he_operation_vht_channel_center_seg1") == 0) {
+		conf->he_oper.vht_op_info_chan_center_freq_seg1_idx = atoi(pos);
+	} else if (os_strcmp(buf, "he_mu_edca_qos_info_param_count") == 0) {
+		conf->he_mu_edca.he_qos_info |=
+			SET_HE_CAP(atoi(pos), HE_QOS_INFO_EDCA_PARAM_SET_COUNT);
+	} else if (os_strcmp(buf, "he_mu_edca_qos_info_q_ack") == 0) {
+		conf->he_mu_edca.he_qos_info |=
+			SET_HE_CAP(atoi(pos), HE_QOS_INFO_Q_ACK);
+	} else if (os_strcmp(buf, "he_mu_edca_qos_info_queue_request") == 0) {
+		conf->he_mu_edca.he_qos_info |=
+			SET_HE_CAP(atoi(pos), HE_QOS_INFO_QUEUE_REQUEST);
+	} else if (os_strcmp(buf, "he_mu_edca_qos_info_txop_request") == 0) {
+		conf->he_mu_edca.he_qos_info |=
+			SET_HE_CAP(atoi(pos), HE_QOS_INFO_TXOP_REQUEST);
+	} else if (os_strcmp(buf, "he_mu_edca_ac_be_aifsn") == 0) {
+		conf->he_mu_edca.he_mu_ac_be_param[HE_MU_AC_PARAM_ACI_AIFSN_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_MU_AC_PARAM_AIFSN);
+	} else if (os_strcmp(buf, "he_mu_edca_ac_be_acm") == 0) {
+		conf->he_mu_edca.he_mu_ac_be_param[HE_MU_AC_PARAM_ACI_AIFSN_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_MU_AC_PARAM_ACM);
+	} else if (os_strcmp(buf, "he_mu_edca_ac_be_aci") == 0) {
+		conf->he_mu_edca.he_mu_ac_be_param[HE_MU_AC_PARAM_ACI_AIFSN_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_MU_AC_PARAM_ACI);
+	} else if (os_strcmp(buf, "he_mu_edca_ac_be_ecwmin") == 0) {
+		conf->he_mu_edca.he_mu_ac_be_param[HE_MU_AC_PARAM_ECWMIN_ECWMAX_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_MU_AC_PARAM_ECWMIN);
+	} else if (os_strcmp(buf, "he_mu_edca_ac_be_ecwmax") == 0) {
+		conf->he_mu_edca.he_mu_ac_be_param[HE_MU_AC_PARAM_ECWMIN_ECWMAX_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_MU_AC_PARAM_ECWMAX);
+	} else if (os_strcmp(buf, "he_mu_edca_ac_be_timer") == 0) {
+		conf->he_mu_edca.he_mu_ac_be_param[HE_MU_AC_PARAM_MU_EDCA_TIMER_IDX] =
+			atoi(pos) & 0xff;
+	} else if (os_strcmp(buf, "he_mu_edca_ac_bk_aifsn") == 0) {
+		conf->he_mu_edca.he_mu_ac_bk_param[HE_MU_AC_PARAM_ACI_AIFSN_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_MU_AC_PARAM_AIFSN);
+	} else if (os_strcmp(buf, "he_mu_edca_ac_bk_acm") == 0) {
+		conf->he_mu_edca.he_mu_ac_bk_param[HE_MU_AC_PARAM_ACI_AIFSN_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_MU_AC_PARAM_ACM);
+	} else if (os_strcmp(buf, "he_mu_edca_ac_bk_aci") == 0) {
+		conf->he_mu_edca.he_mu_ac_bk_param[HE_MU_AC_PARAM_ACI_AIFSN_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_MU_AC_PARAM_ACI);
+	} else if (os_strcmp(buf, "he_mu_edca_ac_bk_ecwmin") == 0) {
+		conf->he_mu_edca.he_mu_ac_bk_param[HE_MU_AC_PARAM_ECWMIN_ECWMAX_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_MU_AC_PARAM_ECWMIN);
+	} else if (os_strcmp(buf, "he_mu_edca_ac_bk_ecwmax") == 0) {
+		conf->he_mu_edca.he_mu_ac_bk_param[HE_MU_AC_PARAM_ECWMIN_ECWMAX_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_MU_AC_PARAM_ECWMAX);
+	} else if (os_strcmp(buf, "he_mu_edca_ac_bk_timer") == 0) {
+		conf->he_mu_edca.he_mu_ac_bk_param[HE_MU_AC_PARAM_MU_EDCA_TIMER_IDX] =
+			atoi(pos) & 0xff;
+	} else if (os_strcmp(buf, "he_mu_edca_ac_vi_aifsn") == 0) {
+		conf->he_mu_edca.he_mu_ac_vi_param[HE_MU_AC_PARAM_ACI_AIFSN_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_MU_AC_PARAM_AIFSN);
+	} else if (os_strcmp(buf, "he_mu_edca_ac_vi_acm") == 0) {
+		conf->he_mu_edca.he_mu_ac_vi_param[HE_MU_AC_PARAM_ACI_AIFSN_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_MU_AC_PARAM_ACM);
+	} else if (os_strcmp(buf, "he_mu_edca_ac_vi_aci") == 0) {
+		conf->he_mu_edca.he_mu_ac_vi_param[HE_MU_AC_PARAM_ACI_AIFSN_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_MU_AC_PARAM_ACI);
+	} else if (os_strcmp(buf, "he_mu_edca_ac_vi_ecwmin") == 0) {
+		conf->he_mu_edca.he_mu_ac_vi_param[HE_MU_AC_PARAM_ECWMIN_ECWMAX_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_MU_AC_PARAM_ECWMIN);
+	} else if (os_strcmp(buf, "he_mu_edca_ac_vi_ecwmax") == 0) {
+		conf->he_mu_edca.he_mu_ac_vi_param[HE_MU_AC_PARAM_ECWMIN_ECWMAX_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_MU_AC_PARAM_ECWMAX);
+	} else if (os_strcmp(buf, "he_mu_edca_ac_vi_timer") == 0) {
+		conf->he_mu_edca.he_mu_ac_vi_param[HE_MU_AC_PARAM_MU_EDCA_TIMER_IDX] =
+			atoi(pos) & 0xff;
+	} else if (os_strcmp(buf, "he_mu_edca_ac_vo_aifsn") == 0) {
+		conf->he_mu_edca.he_mu_ac_vo_param[HE_MU_AC_PARAM_ACI_AIFSN_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_MU_AC_PARAM_AIFSN);
+	} else if (os_strcmp(buf, "he_mu_edca_ac_vo_acm") == 0) {
+		conf->he_mu_edca.he_mu_ac_vo_param[HE_MU_AC_PARAM_ACI_AIFSN_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_MU_AC_PARAM_ACM);
+	} else if (os_strcmp(buf, "he_mu_edca_ac_vo_aci") == 0) {
+		conf->he_mu_edca.he_mu_ac_vo_param[HE_MU_AC_PARAM_ACI_AIFSN_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_MU_AC_PARAM_ACI);
+	} else if (os_strcmp(buf, "he_mu_edca_ac_vo_ecwmin") == 0) {
+		conf->he_mu_edca.he_mu_ac_vo_param[HE_MU_AC_PARAM_ECWMIN_ECWMAX_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_MU_AC_PARAM_ECWMIN);
+	} else if (os_strcmp(buf, "he_mu_edca_ac_vo_ecwmax") == 0) {
+		conf->he_mu_edca.he_mu_ac_vo_param[HE_MU_AC_PARAM_ECWMIN_ECWMAX_IDX] |=
+			SET_HE_CAP(atoi(pos), HE_MU_AC_PARAM_ECWMAX);
+	} else if (os_strcmp(buf, "he_mu_edca_ac_vo_timer") == 0) {
+		conf->he_mu_edca.he_mu_ac_vo_param[HE_MU_AC_PARAM_MU_EDCA_TIMER_IDX] =
+			atoi(pos) & 0xff;
 #endif /* CONFIG_IEEE80211AX */
 	} else if (os_strcmp(buf, "max_listen_interval") == 0) {
 		bss->max_listen_interval = atoi(pos);
diff --git a/hostapd/hostapd.conf b/hostapd/hostapd.conf
index 26f9d3467..abdaf917d 100644
--- a/hostapd/hostapd.conf
+++ b/hostapd/hostapd.conf
@@ -760,46 +760,82 @@ wmm_ac_vo_acm=0
 # setting use_sta_nsts=1.
 #use_sta_nsts=0
 
-##### IEEE 802.11ax related configuration #####################################
+##### IEEE 802.11ax Draft 3.0 related configuration ############
+
+#he_capab=[PLUS_HTC_HE_SUPPORT][ACK_ENABLED_MULTI_TID_AGGREGATION_SUPPORT][OM_CONTROL_SUPPORT][A_MSDU_IN_A_MPDU SUPPORT][DEVICE_CLASS][PPE_THRESHOLD_PRESENT][LDPC_CODING_IN_PAYLOAD][SU_BEAMFORMER_CAPABLE][TRIGGERED_SU_BEAMFORMING_FEEDBACK][TRIGGERED_CQI_FEEDBACK][SU_PPDU_AND_HE_MU_PPDU_WITH_4X_HE_LTF_08US_GI]
 
 #ieee80211ax: Whether IEEE 802.11ax (HE) is enabled
 # 0 = disabled (default)
 # 1 = enabled
 #ieee80211ax=1
 
-#he_su_beamformer: HE single user beamformer support
-# 0 = not supported (default)
-# 1 = supported
-#he_su_beamformer=1
-
-#he_su_beamformee: HE single user beamformee support
-# 0 = not supported (default)
-# 1 = supported
-#he_su_beamformee=1
-
-#he_mu_beamformer: HE multiple user beamformer support
-# 0 = not supported (default)
-# 1 = supported
-#he_mu_beamformer=1
-
-# he_bss_color: BSS color
-# 0 = no BSS color (default)
-# unsigned integer = BSS color
-#he_bss_color=0
-
-#he_default_pe_duration: The duration of PE field in an HE PPDU in us
-# Possible values are 0 us (default), 4 us, 8 us, 12 us, and 16 us
-#he_default_pe_duration=0
-
-#he_twt_required: Whether TWT is required
-# 0 = not required (default)
-# 1 = required
-#he_twt_required=0
-
-#he_rts_threshold: Duration of STA transmission
-# 0 = not set (default)
-# unsigned integer = duration in units of 16 us
-#he_rts_threshold=0
+#he_mac_max_num_of_frag_msdus=7
+#he_mac_multi_tid_aggr_support=7
+#he_mac_max_a_mpdu_length_exp=2
+#he_mac_multi_tid_aggr_tx_support=2
+#he_phy_channel_width_set=7
+#he_phy_stbc_tx_less_or_equal_80mhz=1
+#he_phy_dcm_max_constellation_tx=2
+#he_phy_dcm_max_constellation_rx=2
+#he_phy_dcm_max_nss_tx=1
+#he_phy_dcm_max_nss_rx=1
+#he_ppe_th_nss=3
+#he_ppe_th_ru_index_bitmask=15
+#he_ppe_th_ppet8_for_nss1_for_ru0=7
+#he_ppe_th_ppet8_for_nss1_for_ru1=7
+#he_ppe_th_ppet8_for_nss1_for_ru2=7
+#he_ppe_th_ppet8_for_nss1_for_ru3=7
+#he_ppe_th_ppet8_for_nss2_for_ru0=7
+#he_ppe_th_ppet8_for_nss2_for_ru1=7
+#he_ppe_th_ppet8_for_nss2_for_ru2=7
+#he_ppe_th_ppet8_for_nss2_for_ru3=7
+#he_ppe_th_ppet8_for_nss3_for_ru0=7
+#he_ppe_th_ppet8_for_nss3_for_ru1=7
+#he_ppe_th_ppet8_for_nss3_for_ru2=7
+#he_ppe_th_ppet8_for_nss3_for_ru3=7
+#he_ppe_th_ppet8_for_nss4_for_ru0=7
+#he_ppe_th_ppet8_for_nss4_for_ru1=7
+#he_ppe_th_ppet8_for_nss4_for_ru2=7
+#he_ppe_th_ppet8_for_nss4_for_ru3=7
+#he_operation_er_su_disable=1
+#he_operation_bss_color=4
+#he_operation_default_pe_duration=4
+#he_operation_txop_dur_rts_th=31
+#he_operation_max_mcs_for_2ss=3
+#he_operation_max_mcs_for_3ss=3
+#he_operation_max_mcs_for_4ss=3
+#he_operation_max_mcs_for_5ss=3
+#he_operation_max_mcs_for_6ss=3
+#he_operation_max_mcs_for_7ss=3
+#he_operation_max_mcs_for_8ss=3
+#he_operation_vht_channel_width=1
+#he_operation_vht_channel_center_seg0=42
+#he_operation_vht_channel_center_seg1=50
+#he_operation_vht_oper_info_present=1
+#he_mu_edca_qos_info_queue_request=1
+#he_mu_edca_ac_be_aifsn=0
+#he_mu_edca_ac_be_ecwmin=15
+#he_mu_edca_ac_be_ecwmax=15
+#he_mu_edca_ac_be_timer=255
+#he_mu_edca_ac_bk_aifsn=0
+#he_mu_edca_ac_bk_aci=1
+#he_mu_edca_ac_bk_ecwmin=15
+#he_mu_edca_ac_bk_ecwmax=15
+#he_mu_edca_ac_bk_timer=255
+#he_mu_edca_ac_vi_ecwmin=15
+#he_mu_edca_ac_vi_ecwmax=15
+#he_mu_edca_ac_vi_aifsn=0
+#he_mu_edca_ac_vi_aci=2
+#he_mu_edca_ac_vi_timer=255
+#he_mu_edca_ac_vo_aifsn=0
+#he_mu_edca_ac_vo_aci=3
+#he_mu_edca_ac_vo_ecwmin=15
+#he_mu_edca_ac_vo_ecwmax=15
+#he_mu_edca_ac_vo_timer=255
+#he_mcs_nss_rx_less_or_eq_80mhz=65530
+#he_mcs_nss_tx_less_or_eq_80mhz=65530
+#he_mcs_nss_rx_he_mcs_map_160_mhz=43775
+#he_mcs_nss_tx_he_mcs_map_160_mhz=43775
 
 ##### IEEE 802.1X-2004 related configuration ##################################
 
diff --git a/src/ap/ap_config.h b/src/ap/ap_config.h
index c49e2c1c4..fd1bb8491 100644
--- a/src/ap/ap_config.h
+++ b/src/ap/ap_config.h
@@ -704,25 +704,6 @@ struct hostapd_bss_config {
 };
 
 /**
- * struct he_phy_capabilities_info - HE PHY capabilities
- */
-struct he_phy_capabilities_info {
-	Boolean he_su_beamformer;
-	Boolean he_su_beamformee;
-	Boolean he_mu_beamformer;
-};
-
-/**
- * struct he_operation - HE operation
- */
-struct he_operation {
-	u8 he_bss_color;
-	u8 he_default_pe_duration;
-	u8 he_twt_required;
-	u8 he_rts_threshold;
-};
-
-/**
  * struct hostapd_config - Per-radio interface configuration
  */
 struct hostapd_config {
@@ -841,8 +822,9 @@ struct hostapd_config {
 
 	int ieee80211ax;
 #ifdef CONFIG_IEEE80211AX
-	struct he_phy_capabilities_info he_phy_capab;
-	struct he_operation he_op;
+	struct ieee80211_he_capabilities he_capab;
+	struct ieee80211_he_operation he_oper;
+	struct ieee80211_he_mu_edca_parameter_set he_mu_edca;
 #endif /* CONFIG_IEEE80211AX */
 
 	/* VHT enable/disable config from CHAN_SWITCH */
diff --git a/src/ap/beacon.c b/src/ap/beacon.c
index 19d0bcd2a..3e62991d0 100644
--- a/src/ap/beacon.c
+++ b/src/ap/beacon.c
@@ -397,7 +397,8 @@ static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd,
 #ifdef CONFIG_IEEE80211AX
 	if (hapd->iconf->ieee80211ax) {
 		buflen += 3 + sizeof(struct ieee80211_he_capabilities) +
-			3 + sizeof(struct ieee80211_he_operation);
+			3 + sizeof(struct ieee80211_he_operation) +
+			3 + sizeof(struct ieee80211_he_mu_edca_parameter_set);
 	}
 #endif /* CONFIG_IEEE80211AX */
 
@@ -510,6 +511,7 @@ static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd,
 	if (hapd->iconf->ieee80211ax) {
 		pos = hostapd_eid_he_capab(hapd, pos);
 		pos = hostapd_eid_he_operation(hapd, pos);
+		pos = hostapd_eid_he_mu_edca_parameter_set(hapd, pos);
 	}
 #endif /* CONFIG_IEEE80211AX */
 
@@ -1085,7 +1087,8 @@ int ieee802_11_build_ap_params(struct hostapd_data *hapd,
 #ifdef CONFIG_IEEE80211AX
 	if (hapd->iconf->ieee80211ax) {
 		tail_len += 3 + sizeof(struct ieee80211_he_capabilities) +
-			3 + sizeof(struct ieee80211_he_operation);
+			3 + sizeof(struct ieee80211_he_operation) +
+			3 + sizeof(struct ieee80211_he_mu_edca_parameter_set);
 	}
 #endif /* CONFIG_IEEE80211AX */
 
@@ -1222,6 +1225,7 @@ int ieee802_11_build_ap_params(struct hostapd_data *hapd,
 	if (hapd->iconf->ieee80211ax) {
 		tailpos = hostapd_eid_he_capab(hapd, tailpos);
 		tailpos = hostapd_eid_he_operation(hapd, tailpos);
+		tailpos = hostapd_eid_he_mu_edca_parameter_set(hapd, tailpos);
 	}
 #endif /* CONFIG_IEEE80211AX */
 
diff --git a/src/ap/ieee802_11.h b/src/ap/ieee802_11.h
index 11747e135..909db1cdf 100644
--- a/src/ap/ieee802_11.h
+++ b/src/ap/ieee802_11.h
@@ -15,6 +15,9 @@ struct sta_info;
 struct hostapd_frame_info;
 struct ieee80211_ht_capabilities;
 struct ieee80211_vht_capabilities;
+#ifdef CONFIG_IEEE80211AX
+struct ieee80211_he_capabilities;
+#endif /* CONFIG_IEEE80211AX */
 struct ieee80211_mgmt;
 struct vlan_description;
 struct hostapd_sta_wpa_psk_short;
@@ -57,9 +60,11 @@ u8 * hostapd_eid_vht_operation(struct hostapd_data *hapd, u8 *eid);
 u8 * hostapd_eid_vendor_vht(struct hostapd_data *hapd, u8 *eid);
 u8 * hostapd_eid_wb_chsw_wrapper(struct hostapd_data *hapd, u8 *eid);
 u8 * hostapd_eid_txpower_envelope(struct hostapd_data *hapd, u8 *eid);
+#ifdef CONFIG_IEEE80211AX
 u8 * hostapd_eid_he_capab(struct hostapd_data *hapd, u8 *eid);
 u8 * hostapd_eid_he_operation(struct hostapd_data *hapd, u8 *eid);
-
+u8 * hostapd_eid_he_mu_edca_parameter_set(struct hostapd_data *hapd, u8 *eid);
+#endif /* CONFIG_IEEE80211AX */
 int hostapd_ht_operation_update(struct hostapd_iface *iface);
 void ieee802_11_send_sa_query_req(struct hostapd_data *hapd,
 				  const u8 *addr, const u8 *trans_id);
diff --git a/src/ap/ieee802_11_he.c b/src/ap/ieee802_11_he.c
index 1a8d46972..5c02af20c 100644
--- a/src/ap/ieee802_11_he.c
+++ b/src/ap/ieee802_11_he.c
@@ -20,69 +20,151 @@ u8 * hostapd_eid_he_capab(struct hostapd_data *hapd, u8 *eid)
 {
 	struct ieee80211_he_capabilities *cap;
 	u8 *pos = eid;
+	u8 *he_cap;
+	u8 he_txrx_mcs_size;
+	u8 size;
 
 	if (!hapd->iface->current_mode)
 		return eid;
 
-	*pos++ = WLAN_EID_EXTENSION;
-	*pos++ = 1 + sizeof(struct ieee80211_he_capabilities);
-	*pos++ = WLAN_EID_EXT_HE_CAPABILITIES;
-
-	cap = (struct ieee80211_he_capabilities *) pos;
-	os_memset(cap, 0, sizeof(*cap));
+	if(hapd->iface->conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP0_IDX] &
+			HE_PHY_CAP0_CHANNEL_WIDTH_SET_B3)
+		he_txrx_mcs_size = sizeof(cap->he_txrx_mcs_support);
+	else if(hapd->iface->conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP0_IDX] &
+			HE_PHY_CAP0_CHANNEL_WIDTH_SET_B2)
+		he_txrx_mcs_size = 2*(sizeof(cap->he_txrx_mcs_support)/3);
+	else
+		he_txrx_mcs_size = sizeof(cap->he_txrx_mcs_support)/3;
 
-	if (hapd->iface->conf->he_phy_capab.he_su_beamformer)
-		cap->he_phy_capab_info[HE_PHYCAP_SU_BEAMFORMER_CAPAB_IDX] |=
-			HE_PHYCAP_SU_BEAMFORMER_CAPAB;
+	size = sizeof(cap->he_mac_capab_info) +
+			sizeof(cap->he_phy_capab_info) +
+			he_txrx_mcs_size;
 
-	if (hapd->iface->conf->he_phy_capab.he_su_beamformee)
-		cap->he_phy_capab_info[HE_PHYCAP_SU_BEAMFORMEE_CAPAB_IDX] |=
-			HE_PHYCAP_SU_BEAMFORMEE_CAPAB;
+	if(hapd->iface->conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP6_IDX] &
+		HE_PHY_CAP6_PPE_THRESHOLD_PRESENT)
+		size += sizeof(cap->he_ppe_thresholds) ;
 
-	if (hapd->iface->conf->he_phy_capab.he_mu_beamformer)
-		cap->he_phy_capab_info[HE_PHYCAP_MU_BEAMFORMER_CAPAB_IDX] |=
-			HE_PHYCAP_MU_BEAMFORMER_CAPAB;
+	*pos++ = WLAN_EID_EXTENSION;
+	*pos++ = 1 + size;
+	*pos++ = WLAN_EID_EXT_HE_CAPABILITIES;
 
-	pos += sizeof(*cap);
+	he_cap = pos;
+	os_memset(he_cap, 0, size);
+	os_memcpy(he_cap,
+		&hapd->iface->conf->he_capab.he_mac_capab_info,
+		sizeof(cap->he_mac_capab_info));
+
+	he_cap = (u8 *) (he_cap + sizeof(cap->he_mac_capab_info));
+	os_memcpy(he_cap,
+		&hapd->iface->conf->he_capab.he_phy_capab_info,
+		sizeof(cap->he_phy_capab_info));
+
+	he_cap = (u8 *) (he_cap + sizeof(cap->he_phy_capab_info));
+	os_memcpy(he_cap,
+		&hapd->iface->conf->he_capab.he_txrx_mcs_support,
+		he_txrx_mcs_size);
+
+	if(hapd->iface->conf->he_capab.he_phy_capab_info[HE_PHYCAP_CAP6_IDX] &
+			HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
+		he_cap = (u8 *) (he_cap + he_txrx_mcs_size);
+		os_memcpy(he_cap,
+			&hapd->iface->conf->he_capab.he_ppe_thresholds,
+			sizeof(cap->he_ppe_thresholds));
+	}
+	wpa_hexdump(MSG_DEBUG, "hostapd_eid_he_capab:", pos, size);
+	pos += size;
 
 	return pos;
 }
 
 
+
 u8 * hostapd_eid_he_operation(struct hostapd_data *hapd, u8 *eid)
 {
 	struct ieee80211_he_operation *oper;
 	u8 *pos = eid;
+	u8 *he_oper;
 
 	if (!hapd->iface->current_mode)
 		return eid;
 
+	u8 size = sizeof(oper->he_oper_params) +
+				sizeof(oper->bss_color_info) +
+				sizeof(oper->he_mcs_nss_set);
+
+	if(hapd->iface->conf->he_oper.he_oper_params[HE_OPERATION_CAP1_IDX] &
+		HE_OPERATION_CAP1_VHT_OPER_INFO_PRESENT) {
+		size += sizeof(oper->vht_op_info_chwidth) +
+				sizeof(oper->vht_op_info_chan_center_freq_seg0_idx) +
+				sizeof(oper->vht_op_info_chan_center_freq_seg1_idx);
+
+		hapd->iface->conf->he_oper.vht_op_info_chwidth =
+						hapd->iface->conf->vht_oper_chwidth;
+		hapd->iface->conf->he_oper.vht_op_info_chan_center_freq_seg0_idx =
+						hapd->iface->conf->vht_oper_centr_freq_seg0_idx;
+		hapd->iface->conf->he_oper.vht_op_info_chan_center_freq_seg1_idx =
+						hapd->iface->conf->vht_oper_centr_freq_seg1_idx;
+	}
+
+	if(hapd->iface->conf->he_oper.he_oper_params[HE_OPERATION_CAP1_IDX] &
+		HE_OPERATION_CAP1_CO_LOCATED_BSS)
+		size += sizeof(oper->max_co_located_bssid_ind);
+
 	*pos++ = WLAN_EID_EXTENSION;
-	*pos++ = 1 + sizeof(struct ieee80211_he_operation);
+	*pos++ = 1 + size;
 	*pos++ = WLAN_EID_EXT_HE_OPERATION;
 
-	oper = (struct ieee80211_he_operation *) pos;
-	os_memset(oper, 0, sizeof(*oper));
+	he_oper = pos;
+	os_memset(he_oper, 0, size);
+	os_memcpy(he_oper,
+		&hapd->iface->conf->he_oper.he_oper_params,
+		sizeof(oper->he_oper_params));
+
+	he_oper = (u8 *) (he_oper + sizeof(oper->he_oper_params));
+	*he_oper = hapd->iface->conf->he_oper.bss_color_info;
 
-	if (hapd->iface->conf->he_op.he_bss_color)
-		oper->he_oper_params |= hapd->iface->conf->he_op.he_bss_color;
+	he_oper = (u8 *) (he_oper + sizeof(oper->bss_color_info));
+	os_memcpy(he_oper,
+		&hapd->iface->conf->he_oper.he_mcs_nss_set,
+		sizeof(oper->he_mcs_nss_set));
 
-	if (hapd->iface->conf->he_op.he_default_pe_duration)
-		oper->he_oper_params |=
-			(hapd->iface->conf->he_op.he_default_pe_duration <<
-			 HE_OPERATION_DFLT_PE_DURATION_OFFSET);
+	if(hapd->iface->conf->he_oper.he_oper_params[HE_OPERATION_CAP1_IDX] &
+		HE_OPERATION_CAP1_VHT_OPER_INFO_PRESENT) {
+		he_oper = (u8 *) (he_oper + sizeof(oper->he_mcs_nss_set));
+		*he_oper++ = hapd->iface->conf->he_oper.vht_op_info_chwidth;
+		*he_oper++ =
+			hapd->iface->conf->he_oper.vht_op_info_chan_center_freq_seg0_idx;
+		*he_oper++ =
+			hapd->iface->conf->he_oper.vht_op_info_chan_center_freq_seg1_idx;
+	}
 
-	if (hapd->iface->conf->he_op.he_twt_required)
-		oper->he_oper_params |= HE_OPERATION_TWT_REQUIRED;
+	if(hapd->iface->conf->he_oper.he_oper_params[HE_OPERATION_CAP1_IDX] &
+		HE_OPERATION_CAP1_CO_LOCATED_BSS)
+		*he_oper = hapd->iface->conf->he_oper.max_co_located_bssid_ind;
 
-	if (hapd->iface->conf->he_op.he_rts_threshold)
-		oper->he_oper_params |=
-			(hapd->iface->conf->he_op.he_rts_threshold <<
-			 HE_OPERATION_RTS_THRESHOLD_OFFSET);
+	wpa_hexdump(MSG_DEBUG, "hostapd_eid_he_operation:", pos, size);
 
-	/* TODO: conditional MaxBSSID Indicator subfield */
+	pos += size;
 
-	pos += sizeof(*oper);
+	return pos;
+}
+
+u8 * hostapd_eid_he_mu_edca_parameter_set(struct hostapd_data *hapd, u8 *eid)
+{
+	struct ieee80211_he_mu_edca_parameter_set *edca;
+	u8 *pos = eid;
+
+	*pos++ = WLAN_EID_EXTENSION;
+	*pos++ = 1 + sizeof(*edca);
+	*pos++ = WLAN_EID_EXT_HE_MU_EDCA_PARAMS;
+
+	edca = (struct ieee80211_he_mu_edca_parameter_set *) pos;
+	os_memcpy(edca, &hapd->iface->conf->he_mu_edca, sizeof(*edca));
+
+	wpa_hexdump(MSG_DEBUG, "hostapd_eid_he_mu_edca_parameter_set:", pos, sizeof(*edca));
+
+	pos += sizeof(*edca);
 
 	return pos;
 }
+
diff --git a/src/common/ieee802_11_defs.h b/src/common/ieee802_11_defs.h
index 178cab041..b87a17181 100644
--- a/src/common/ieee802_11_defs.h
+++ b/src/common/ieee802_11_defs.h
@@ -467,6 +467,7 @@
 #define WLAN_EID_EXT_PASSWORD_IDENTIFIER 33
 #define WLAN_EID_EXT_HE_CAPABILITIES 35
 #define WLAN_EID_EXT_HE_OPERATION 36
+#define WLAN_EID_EXT_HE_MU_EDCA_PARAMS 38
 #define WLAN_EID_EXT_OCV_OCI 54
 
 /* Extended Capabilities field */
@@ -2107,45 +2108,300 @@ enum nr_chan_width {
 struct ieee80211_he_capabilities {
 	u8 he_mac_capab_info[6];
 	u8 he_phy_capab_info[11];
-	u8 he_txrx_mcs_support[12]; /* TODO: 4, 8, or 12 octets */
-	/* PPE Thresholds (optional) */
+	u8 he_txrx_mcs_support[12];
+	u8 he_ppe_thresholds[13]; /* TODO: Considering 4 NSTS */
 } STRUCT_PACKED;
 
 struct ieee80211_he_operation {
-	u32 he_oper_params; /* HE Operation Parameters[3] and
-			     * BSS Color Information[1] */
+	u8 he_oper_params[3];
+	u8 bss_color_info;
 	u8 he_mcs_nss_set[2];
 	u8 vht_op_info_chwidth;
 	u8 vht_op_info_chan_center_freq_seg0_idx;
 	u8 vht_op_info_chan_center_freq_seg1_idx;
-	/* Followed by conditional MaxBSSID Indicator subfield (u8) */
+	u8 max_co_located_bssid_ind;
 } STRUCT_PACKED;
 
-/* HE Capabilities Information defines */
-#define HE_PHYCAP_SU_BEAMFORMER_CAPAB_IDX	3
-#define HE_PHYCAP_SU_BEAMFORMER_CAPAB		((u8) BIT(7))
-#define HE_PHYCAP_SU_BEAMFORMEE_CAPAB_IDX	4
-#define HE_PHYCAP_SU_BEAMFORMEE_CAPAB		((u8) BIT(0))
-#define HE_PHYCAP_MU_BEAMFORMER_CAPAB_IDX	4
-#define HE_PHYCAP_MU_BEAMFORMER_CAPAB		((u8) BIT(1))
-
-/* HE Operation defines */
-/* HE Operation Parameters and BSS Color Information fields */
-#define HE_OPERATION_BSS_COLOR_MASK		((u32) (BIT(0) | BIT(1) | \
-							BIT(2) | BIT(3) | \
-							BIT(4) | BIT(5)))
-#define HE_OPERATION_PARTIAL_BSS_COLOR		((u32) BIT(6))
-#define HE_OPERATION_BSS_COLOR_DISABLED		((u32) BIT(7))
-#define HE_OPERATION_DFLT_PE_DURATION_MASK	((u32) (BIT(8) | BIT(9) | \
-							BIT(10)))
-#define HE_OPERATION_DFLT_PE_DURATION_OFFSET	8
-#define HE_OPERATION_TWT_REQUIRED		((u32) BIT(11))
-#define HE_OPERATION_RTS_THRESHOLD_MASK	((u32) (BIT(12) | BIT(13) | \
-						BIT(14) | BIT(15) | \
-						BIT(16) | BIT(17) | \
-						BIT(18) | BIT(19) | \
-						BIT(20) | BIT(21)))
-#define HE_OPERATION_RTS_THRESHOLD_OFFSET	12
+struct ieee80211_he_mu_edca_parameter_set {
+	u8 he_qos_info;
+	u8 he_mu_ac_be_param[3];
+	u8 he_mu_ac_bk_param[3];
+	u8 he_mu_ac_vi_param[3];
+	u8 he_mu_ac_vo_param[3];
+} STRUCT_PACKED;
+
+/* IEEE 802.11AX DRAFT VER 3.0 */
+/* HE MAC Capabilities Information field defines */
+#define HE_MACCAP_CAP0_IDX 0
+#define HE_MAC_CAP0_HTC_HE_SUPPORT ((u8) BIT(0))
+#define HE_MAC_CAP0_TWT_REQUESTER_SUPPORT ((u8) BIT(1))
+#define HE_MAC_CAP0_TWT_RESPONDER_SUPPORT ((u8) BIT(2))
+#define HE_MAC_CAP0_FRAGMENTATION_SUPPORT ((u8) (BIT(3) | BIT(4)))
+#define HE_MAC_CAP0_MAX_NUM_OF_FRAG_MSDU ((u8) (BIT(5) | BIT(6) | BIT(7)))
+
+#define HE_MACCAP_CAP1_IDX 1
+#define HE_MAC_CAP1_MINIMUM_FRAGMENT_SIZE ((u8) (BIT(0) | BIT(1)))
+#define HE_MAC_CAP1_TRIGGER_FRAME_MAC_PAD_DUR ((u8) (BIT(2) | BIT(3)))
+#define HE_MAC_CAP1_MULTI_TID_AGGR_RX_SUPPORT ((u8) (BIT(4) | BIT(5) | BIT(6)))
+/* HE_MACCAP_HE_LINK_ADAPTION_SUPPORT  B15, B16 */
+#define HE_MAC_CAP1_HE_LINK_ADAPTION_SUPPORT ((u8) BIT(7))
+
+#define HE_MACCAP_CAP2_IDX 2
+#define HE_MAC_CAP2_HE_LINK_ADAPTION_SUPPORT ((u8) BIT(0))
+#define HE_MAC_CAP2_ALL_ACK_SUPPORT ((u8) BIT(1))
+#define HE_MAC_CAP2_TRS_SUPPORT ((u8) BIT(2))
+#define HE_MAC_CAP2_BSR_SUPPORT ((u8) BIT(3))
+#define HE_MAC_CAP2_BROADCAST_TWT_SUPPORT ((u8) BIT(4))
+#define HE_MAC_CAP2_32BIT_BA_BITMAP_SUPPORT ((u8) BIT(5))
+#define HE_MAC_CAP2_MU_CASCADING_SUPPORT ((u8) BIT(6))
+#define HE_MAC_CAP2_ACK_ENABLED_AGGREGATION_SUPPORT ((u8) BIT(7))
+
+#define HE_MACCAP_CAP3_IDX 3
+/* B24 - Reserved */
+#define HE_MAC_CAP3_OM_CONTROL_SUPPORT ((u8) BIT(1))
+#define HE_MAC_CAP3_OFDMA_RA_SUPPORT ((u8) BIT(2))
+#define HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT ((u8) (BIT(3) | BIT(4)))
+#define HE_MAC_CAP3_AMSDU_FRGMENTATION_SUPPORT ((u8) BIT(5))
+#define HE_MAC_CAP3_FLEXIBLE_TWT_SCHEDULE_SUPPORT ((u8) BIT(6))
+#define HE_MAC_CAP3_RX_CONTROL_FRAME_TO_MULTIBSS ((u8) BIT(7))
+
+#define HE_MACCAP_CAP4_IDX 4
+#define HE_MAC_CAP4_BSRP_BQRP_AMPDU_AGGREGATION ((u8) BIT(0))
+#define HE_MAC_CAP4_QTP_SUPPORT ((u8) BIT(1))
+#define HE_MAC_CAP4_BQR_SUPPORT ((u8) BIT(2))
+#define HE_MAC_CAP4_SRP_RESPONDER ((u8) BIT(3))
+#define HE_MAC_CAP4_NDP_FEEDBACK_REPORT_SUPPORT ((u8) BIT(4))
+#define HE_MAC_CAP4_OPS_SUPPORT ((u8) BIT(5))
+#define HE_MAC_CAP4_AMSDU_IN_AMPDU_SUPPORT ((u8) BIT(6))
+/* HE_MACCAP_MULTI_TID_AGGREGATION_TX_SUPPORT B39, B40, B41 */
+#define HE_MAC_CAP4_MULTI_TID_AGGR_TX_SUPPORT ((u8) (BIT(7)))
+
+#define HE_MACCAP_CAP5_IDX 5
+#define HE_MAC_CAP5_MULTI_TID_AGGR_TX_SUPPORT ((u8) (BIT(0) | BIT(1)))
+#define HE_MAC_CAP5_HE_SUBCHANNEL_SELE_TRANS_SUP ((u8) BIT(2))
+#define HE_MAC_CAP5_UL_2X996TONE_RU_SUPPORT ((u8) BIT(3))
+#define HE_MAC_CAP5_OM_CONTROL_UL_MU_DATA_DIS_RX_SUP ((u8) BIT(4))
+/* B45..B47 - Reserved */
+
+/* HE PHY Capabilities Information field defines */
+/* B0 - Reserved */
+#define HE_PHYCAP_CAP0_IDX 0
+#define HE_PHY_CAP0_CHANNEL_WIDTH_SET ((u8) (BIT(1) | BIT(2) | BIT(3) | \
+									BIT(4) | BIT(5) | BIT(6) | BIT(7)))
+#define HE_PHY_CAP0_CHANNEL_WIDTH_SET_B0 (u8) BIT(1)
+#define HE_PHY_CAP0_CHANNEL_WIDTH_SET_B1 (u8) BIT(2)
+#define HE_PHY_CAP0_CHANNEL_WIDTH_SET_B2 (u8) BIT(3)
+#define HE_PHY_CAP0_CHANNEL_WIDTH_SET_B3 (u8) BIT(4)
+#define HE_PHY_CAP0_CHANNEL_WIDTH_SET_B4 (u8) BIT(5)
+#define HE_PHY_CAP0_CHANNEL_WIDTH_SET_B5 (u8) BIT(6)
+#define HE_PHY_CAP0_CHANNEL_WIDTH_SET_B6 (u8) BIT(7)
+
+#define HE_PHYCAP_CAP1_IDX 1
+#define HE_PHY_CAP1_PUN_PREAM_RX ((u8) (BIT(0) | BIT(1) | BIT(2) | BIT(3)))
+#define HE_PHY_CAP1_DEVICE_CLASS ((u8) BIT(4))
+#define HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD ((u8) BIT(5))
+#define HE_PHY_CAP1_SU_PPDU_1XHE_LTF_0_8US_GI ((u8) BIT(6))
+/* HE_PHYCAP_MIDAMBLE_TXRX_MAX__NSTS B15 B16 */
+#define HE_PHY_CAP1_MIDAMBLE_TXRX_MAX__NSTS_PART1 ((u8) BIT(7))
+
+#define HE_PHYCAP_CAP2_IDX 2
+#define HE_PHY_CAP2_MIDAMBLE_TXRX_MAX__NSTS_PART2 ((u8) BIT(0))
+#define HE_PHY_CAP2_NDP_4X_HE_LTF_AND_3_2MS_GI ((u8) BIT(1))
+#define HE_PHY_CAP2_STBC_TX_LESS_OR_EQUAL_80MHz ((u8) BIT(2))
+#define HE_PHY_CAP2_STBC_RX_LESS_OR_EQUAL_80MHz ((u8) BIT(3))
+#define HE_PHY_CAP2_DOPPLER_TX ((u8) BIT(4))
+#define HE_PHY_CAP2_DOPPLER_RX ((u8) BIT(5))
+#define HE_PHY_CAP2_FULL_BANDWIDTH_UL_MU_MIMO ((u8) BIT(6))
+#define HE_PHY_CAP2_PARTIAL_BANDWIDTH_UL_MU_MIMO ((u8) BIT(7))
+
+#define HE_PHYCAP_CAP3_IDX 3
+#define HE_PHY_CAP3_DCM_MAX_CONSTELLATION_TX ((u8) (BIT(0) | BIT(1)))
+#define HE_PHY_CAP3_DCM_MAX_NSS_TX ((u8) BIT(2))
+#define HE_PHY_CAP3_DCM_MAX_CONSTELLATION_RX ((u8) (BIT(3) | BIT(4)))
+#define HE_PHY_CAP3_DCM_MAX_NSS_RX ((u8) BIT(5))
+#define HE_PHY_CAP3_RX_HE_MUPPDU_FROM_NON_AP_STA ((u8) BIT(6))
+#define HE_PHY_CAP3_SU_BEAMFORMER ((u8) BIT(7))
+
+#define HE_PHYCAP_CAP4_IDX 4
+#define HE_PHY_CAP4_SU_BEAMFORMEE ((u8) BIT(0))
+#define HE_PHY_CAP4_MU_BEAMFORMER ((u8) BIT(1))
+#define HE_PHY_CAP4_BF_STS_LESS_OR_EQ_80MHz ((u8) (BIT(2) | BIT(3) | BIT(4)))
+#define HE_PHY_CAP4_BF_STS_GREATER_THAN_80MHz ((u8) (BIT(5) | BIT(6) | BIT(7)))
+
+#define HE_PHYCAP_CAP5_IDX 5
+#define HE_PHY_CAP5_NUM_SOUND_DIM_LESS_80MHz ((u8) (BIT(0) | BIT(1) | BIT(2)))
+#define HE_PHY_CAP5_NUM_SOUND_DIM_GREAT_80MHz ((u8) (BIT(3) | BIT(4) | BIT(5)))
+#define HE_PHY_CAP5_NG_16_FOR_SU_FB_SUPPORT ((u8) BIT(6))
+#define HE_PHY_CAP5_NG_16_FOR_MU_FB_SUPPORT ((u8) BIT(7))
+
+#define HE_PHYCAP_CAP6_IDX 6
+#define HE_PHY_CAP6_CODEBOOK_SIZE42_FOR_SU_SUPPORT ((u8) BIT(0))
+#define HE_PHY_CAP6_CODEBOOK_SIZE75_FOR_MU_SUPPORT ((u8) BIT(1))
+#define HE_PHY_CAP6_TRIGGERED_SU_BEAMFORMING_FEEDBACK ((u8) BIT(2))
+#define HE_PHY_CAP6_TRIGGERED_MU_BEAMFORMING_PARTIAL_BW_FEEDBACK ((u8) BIT(3))
+#define HE_PHY_CAP6_TRIGGERED_CQI_FEEDBACK ((u8) BIT(4))
+#define HE_PHY_CAP6_PARTIAL_BANDWIDTH_EXTENDED_RANGE ((u8) BIT(5))
+#define HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MU_MIMO ((u8) BIT(6))
+#define HE_PHY_CAP6_PPE_THRESHOLD_PRESENT ((u8) BIT(7))
+
+#define HE_PHYCAP_CAP7_IDX 7
+#define HE_PHY_CAP7_SRP_BASED_SR_SUPPORT ((u8) BIT(0))
+#define HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPPORT ((u8) BIT(1))
+#define HE_PHY_CAP7_SU_PPDU_AND_HE_MU_WITH_4X_HE_LTF_0_8US_GI ((u8) BIT(2))
+#define HE_PHY_CAP7_MAX_NC ((u8) (BIT(3) | BIT(4) | BIT(5)))
+#define HE_PHY_CAP7_STBC_TX_GREATER_THAN_80MHz ((u8) BIT(6))
+#define HE_PHY_CAP7_STBC_RX_GREATER_THAN_80MHz ((u8) BIT(7))
+
+#define HE_PHYCAP_CAP8_IDX 8
+#define HE_PHY_CAP8_HE_ER_SU_PPDU_4X_HE_LTF_0_8_US_GI ((u8) BIT(0))
+#define HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_2_4_GHZ_BAND ((u8) BIT(1))
+#define HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU ((u8) BIT(2))
+#define HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU ((u8) BIT(3))
+#define HE_PHY_CAP8_HE_ER_SU_PPDU_1X_HE_LTF_0_8_US_GI ((u8) BIT(4))
+#define HE_PHY_CAP8_MIDAMBLE_TX_RX_2X_AND_1X_HE_LTF ((u8) BIT(5))
+#define HE_PHY_CAP8_DCM_MAX_BW ((u8) (BIT(6) | BIT(7)))
+
+#define HE_PHYCAP_CAP9_IDX 9
+#define HE_PHY_CAP9_LONGER_THAN_16_HE_SIGB_OFDM_SYMBOLS_SUPPORT ((u8) BIT(0))
+#define HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK ((u8) BIT(1))
+#define HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU_SUPPORT ((u8) BIT(2))
+#define HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU_SUPPORT ((u8) BIT(3))
+#define HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_PPDU_NON_COMP_SIGB ((u8) BIT(4))
+#define HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_PPDU_COMP_SIGB ((u8) BIT(5))
+/* B78..B87 - Reserved */
+
+/* HE-MCS and NSS set field */
+#define HE_MCS_NSS_RX_LESS_EQ_80MHZ_PART1_IDX 0
+#define HE_MCS_NSS_RX_MCS_MAP_LESS_EQ_80_MHZ_PART2_IDX 1
+#define HE_MCS_NSS_TX_MCS_MAP_LESS_EQ_80_MHZ_PART1_IDX 2
+#define HE_MCS_NSS_TX_MCS_MAP_LESS_EQ_80_MHZ_PART2_IDX 3
+#define HE_MCS_NSS_RX_MCS_MAP_160_MHZ_PART1_IDX 4
+#define HE_MCS_NSS_RX_MCS_MAP_160_MHZ_PART2_IDX 5
+#define HE_MCS_NSS_TX_MCS_MAP_160_MHZ_PART1_IDX 6
+#define HE_MCS_NSS_TX_MCS_MAP_160_MHZ_PART2_IDX 7
+#define HE_MCS_NSS_RX_MCS_MAP 0Xff
+
+#define HE_MCS_NSS_FOR_1SS ((u8) (BIT(0) | BIT(1)))
+#define HE_MCS_NSS_FOR_2SS ((u8) (BIT(2) | BIT(3)))
+#define HE_MCS_NSS_FOR_3SS ((u8) (BIT(4) | BIT(5)))
+#define HE_MCS_NSS_FOR_4SS ((u8) (BIT(6) | BIT(7)))
+#define HE_MCS_NSS_FOR_5SS ((u8) (BIT(0) | BIT(1)))
+#define HE_MCS_NSS_FOR_6SS ((u8) (BIT(2) | BIT(3)))
+#define HE_MCS_NSS_FOR_7SS ((u8) (BIT(4) | BIT(5)))
+#define HE_MCS_NSS_FOR_8SS ((u8) (BIT(6) | BIT(7)))
+
+/* HE PPE Thresholds field */
+#define HE_PPE_CAP0_IDX 0
+#define HE_PPE_CAP0_NSS_M1 ((u8) (BIT(0) | BIT(1) | BIT(2)))
+#define HE_PPE_CAP0_RU_INDEX_BITMASK ((u8) (BIT(3) | BIT(4) | BIT(5) | BIT(6)))
+#define HE_PPE_CAP0_PPET16_FOR_NSS1_FOR_RU0 ((u8) BIT(7))
+
+#define HE_PPE_CAP1_IDX 1
+#define HE_PPE_CAP1_PPET16_FOR_NSS1_FOR_RU0 ((u8) (BIT(0) | BIT(1)))
+#define HE_PPE_CAP1_PPET8_FOR_NSS1_FOR_RU0 ((u8) (BIT(2) | BIT(3) | BIT(4)))
+#define HE_PPE_CAP1_PPET16_FOR_NSS1_FOR_RU1 ((u8) (BIT(5) | BIT(6) | BIT(7)))
+
+#define HE_PPE_CAP2_IDX 2
+#define HE_PPE_CAP2_PPET8_FOR_NSS1_FOR_RU1 ((u8) (BIT(0) | BIT(1) | BIT(2)))
+#define HE_PPE_CAP2_PPET16_FOR_NSS1_FOR_RU2 ((u8) (BIT(3) | BIT(4) | BIT(5)))
+#define HE_PPE_CAP2_PPET8_FOR_NSS1_FOR_RU2 ((u8) (BIT(6) | BIT(7)))
+
+#define HE_PPE_CAP3_IDX 3
+#define HE_PPE_CAP3_PPET8_FOR_NSS1_FOR_RU2 (u8) BIT(0)
+#define HE_PPE_CAP3_PPET16_FOR_NSS1_FOR_RU3 ((u8) (BIT(1) | BIT(2) | BIT(3)))
+#define HE_PPE_CAP3_PPET8_FOR_NSS1_FOR_RU3 ((u8) (BIT(4) | BIT(5) | BIT(6)))
+#define HE_PPE_CAP3_PPET16_FOR_NSS2_FOR_RU0 ((u8) BIT(7))
+
+#define HE_PPE_CAP4_IDX 4
+#define HE_PPE_CAP4_PPET16_FOR_NSS2_FOR_RU0 ((u8) (BIT(0) | BIT(1)))
+#define HE_PPE_CAP4_PPET8_FOR_NSS2_FOR_RU0 ((u8) (BIT(2) | BIT(3) | BIT(4)))
+#define HE_PPE_CAP4_PPET16_FOR_NSS2_FOR_RU1 ((u8) (BIT(5) | BIT(6) | BIT(7)))
+
+#define HE_PPE_CAP5_IDX 5
+#define HE_PPE_CAP5_PPET8_FOR_NSS2_FOR_RU1 ((u8) (BIT(0) | BIT(1) | BIT(2)))
+#define HE_PPE_CAP5_PPET16_FOR_NSS2_FOR_RU2 ((u8) (BIT(3) | BIT(4) | BIT(5)))
+#define HE_PPE_CAP5_PPET8_FOR_NSS2_FOR_RU2 ((u8) (BIT(6) | BIT(7)))
+
+#define HE_PPE_CAP6_IDX 6
+#define HE_PPE_CAP6_PPET8_FOR_NSS2_FOR_RU2 ((u8) BIT(0))
+#define HE_PPE_CAP6_PPET16_FOR_NSS2_FOR_RU3 ((u8) (BIT(1) | BIT(2) | BIT(3)))
+#define HE_PPE_CAP6_PPET8_FOR_NSS2_FOR_RU3 ((u8) (BIT(4) | BIT(5) | BIT(6)))
+#define HE_PPE_CAP6_PPET16_FOR_NSS3_FOR_RU0 ((u8) BIT(7))
+
+#define HE_PPE_CAP7_IDX 7
+#define HE_PPE_CAP7_PPET16_FOR_NSS3_FOR_RU0 ((u8) (BIT(0) | BIT(1)))
+#define HE_PPE_CAP7_PPET8_FOR_NSS3_FOR_RU0 ((u8) (BIT(2) | BIT(3) | BIT(4)))
+#define HE_PPE_CAP7_PPET16_FOR_NSS3_FOR_RU1 ((u8) (BIT(5) | BIT(6) | BIT(7)))
+
+#define HE_PPE_CAP8_IDX 8
+#define HE_PPE_CAP8_PPET8_FOR_NSS3_FOR_RU1 ((u8) (BIT(0) | BIT(1) | BIT(2)))
+#define HE_PPE_CAP8_PPET16_FOR_NSS3_FOR_RU2 ((u8) (BIT(3) | BIT(4) | BIT(5)))
+#define HE_PPE_CAP8_PPET8_FOR_NSS3_FOR_RU2 ((u8) (BIT(6) | BIT(7)))
+
+#define HE_PPE_CAP9_IDX 9
+#define HE_PPE_CAP9_PPET8_FOR_NSS3_FOR_RU2 ((u8) BIT(0))
+#define HE_PPE_CAP9_PPET16_FOR_NSS3_FOR_RU3 ((u8) (BIT(1) | BIT(2) | BIT(3)))
+#define HE_PPE_CAP9_PPET8_FOR_NSS3_FOR_RU3 ((u8) (BIT(4) | BIT(5) | BIT(6)))
+#define HE_PPE_CAP9_PPET16_FOR_NSS4_FOR_RU0 ((u8) BIT(7))
+
+#define HE_PPE_CAP10_IDX 10
+#define HE_PPE_CAP10_PPET16_FOR_NSS4_FOR_RU0 ((u8) (BIT(0) | BIT(1)))
+#define HE_PPE_CAP10_PPET8_FOR_NSS4_FOR_RU0 ((u8) (BIT(2) | BIT(3) | BIT(4)))
+#define HE_PPE_CAP10_PPET16_FOR_NSS4_FOR_RU1 ((u8) (BIT(5) | BIT(6) | BIT(7)))
+
+#define HE_PPE_CAP11_IDX 11
+#define HE_PPE_CAP11_PPET8_FOR_NSS4_FOR_RU1 ((u8) (BIT(0) | BIT(1) | BIT(2)))
+#define HE_PPE_CAP11_PPET16_FOR_NSS4_FOR_RU2 ((u8) (BIT(3) | BIT(4) | BIT(5)))
+#define HE_PPE_CAP11_PPET8_FOR_NSS4_FOR_RU2 ((u8) (BIT(6) | BIT(7)))
+
+#define HE_PPE_CAP12_IDX 12
+#define HE_PPE_CAP12_PPET8_FOR_NSS4_FOR_RU2 ((u8) BIT(0))
+#define HE_PPE_CAP12_PPET16_FOR_NSS4_FOR_RU3 ((u8) (BIT(1) | BIT(2) | BIT(3)))
+#define HE_PPE_CAP12_PPET8_FOR_NSS4_FOR_RU3 ((u8) (BIT(4) | BIT(5) | BIT(6)))
+
+
+/* HE Operation parameter defines */
+#define HE_OPERATION_CAP0_IDX	0
+#define HE_OPERATION_CAP0_DEFAULT_PE_DURATION ((u8) (BIT(0) | BIT(1) | BIT(2)))
+#define HE_OPERATION_CAP0_TWT_REQUIRED ((u8) (BIT(3)))
+#define HE_OPERATION_CAP0_TXOP_DUR_RTS_TH ((u8) (BIT(4) | BIT(5) | \
+													BIT(6) | BIT(7)))
+
+#define HE_OPERATION_CAP1_IDX	1
+#define HE_OPERATION_CAP1_TXOP_DUR_RTS_TH ((u8) (BIT(0) | BIT(1) | \
+									BIT(2) | BIT(3) | BIT(4) | BIT(5)))
+#define HE_OPERATION_CAP1_VHT_OPER_INFO_PRESENT ((u8) BIT(6))
+#define HE_OPERATION_CAP1_CO_LOCATED_BSS ((u8) BIT(7))
+
+#define HE_OPERATION_CAP2_IDX 2
+#define HE_OPERATION_CAP2_ER_SU_DISABLE ((u8) BIT(0)) /* B16 */
+/* B17 ...B23 Reserved */
+
+/* HE BSS Color Information field defines */
+#define HE_OPERATION_BSS_COLOR ((u8) (BIT(0) | BIT(1) | \
+							BIT(2) | BIT(3) | BIT(4) | BIT(5)))
+#define HE_OPERATION_PARTIAL_BSS_COLOR ((u8) BIT(6))
+#define HE_OPERATION_BSS_COLOR_DISABLED ((u8) BIT(7))
+
+/* HE MU AC parameter record field format */
+#define HE_MU_AC_PARAM_ACI_AIFSN_IDX 0
+#define HE_MU_AC_PARAM_AIFSN ((u8) (BIT(0) | BIT(1) | BIT(2) | BIT(3)))
+#define HE_MU_AC_PARAM_ACM ((u8) BIT(4))
+#define HE_MU_AC_PARAM_ACI ((u8) (BIT(5) | BIT(6)))
+
+#define HE_MU_AC_PARAM_ECWMIN_ECWMAX_IDX 1
+#define HE_MU_AC_PARAM_ECWMAX ((u8) (BIT(0) | BIT(1) | BIT(2) | BIT(3)))
+#define HE_MU_AC_PARAM_ECWMIN ((u8) (BIT(4) | BIT(5) | BIT(6) | BIT(7)))
+
+#define HE_MU_AC_PARAM_MU_EDCA_TIMER_IDX 2
+
+/* HE QOS Info field */
+#define HE_QOS_INFO_EDCA_PARAM_SET_COUNT ((u8) (BIT(0) | BIT(1) | \
+													BIT(2) | BIT(3)))
+#define HE_QOS_INFO_Q_ACK ((u8) (BIT(4)))
+#define HE_QOS_INFO_QUEUE_REQUEST ((u8) (BIT(5)))
+#define HE_QOS_INFO_TXOP_REQUEST ((u8) (BIT(6)))
+#define HE_QOS_INFO_MORE_DATA_ACK ((u8) (BIT(7)))
 
 /* DPP Public Action frame identifiers - OUI_WFA */
 #define DPP_OUI_TYPE 0x1A
diff --git a/src/utils/common.h b/src/utils/common.h
index f824d001a..be615206f 100644
--- a/src/utils/common.h
+++ b/src/utils/common.h
@@ -310,6 +310,23 @@ static inline void WPA_PUT_LE64(u8 *a, u64 val)
 	a[0] = val & 0xff;
 }
 
+static inline u8 POS(u8 n)
+{
+	u8 pos = 0;
+	while (n) {
+		if (!(n & 1))
+			pos++;
+		else
+			break;
+		n >>= 1;
+		}
+	return pos;
+}
+
+static inline u8 SET_HE_CAP(int val, u8 mask)
+{
+	return ((u8) (mask & (val << POS(mask))));
+}
 
 #ifndef ETH_ALEN
 #define ETH_ALEN 6
-- 
2.11.0


_______________________________________________
Hostap mailing list
Hostap@xxxxxxxxxxxxxxxxxxx
http://lists.infradead.org/mailman/listinfo/hostap




[Index of Archives]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]

  Powered by Linux