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

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

 



Hi Jouni,

Please find my answers below.

The last one of these makes sense and I applied those parts with some cleanup and a change to make the addition of the element conditional on
those parameters being set in the configuration.
>> Thanks

Why would this replace the existing mechanism and not build on top of it?
>> We find the existing mechanism as in-complete in some parts. So we have modified some of the existing mechanism but not replaced it completely.

Are all the HE Operation element configuration items something that should be exposed through configuration parameters in hostapd instead of
automatically generated and updated dynamically during operation?
>> Since 11ax is in draft stage and subjected to change, We feel it is good to exposed through configuration parameters. This is how it works for us and ease of configuration during wifi 11ax plugfests.

 I'd prefer to see this split into separate patches to address HE Capabilities and HE Operation
>> Agreed, I will take this in to consideration and will split the patches as you suggested.

Please let me if this answers your question. Or if you have any further concerns/questions, do let me know.

Regards,
Siva
-----Original Message-----
From: Jouni Malinen [mailto:j@xxxxx] 
Sent: Wednesday, January 9, 2019 04:27 AM
To: Mullati, Siva <siva.mullati@xxxxxxxxx>
Cc: hostap@xxxxxxxxxxxxxxxxxxx
Subject: Re: [PATCH] Update IEEE802.11 ax (HE) definitions to D3.0

On Mon, Jan 07, 2019 at 02:56:24PM +0530, Siva Mullati wrote:
> 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.

The title and commit message for this commit are quite misleading since
the current definition and configuration for HE in hostap.git is already
based on P802.11ax/D3.0. This patch seems to be doing couple of other
things:
- replace the way HE is configured in hostapd.conf
- replace the way HE Capab/Info elements are defined (and extend these
  definitions to cover more subfields)
- add MU EDCA Parameter Set element configuration and generation

The last one of these makes sense and I applied those parts with some
cleanup and a change to make the addition of the element conditional on
those parameters being set in the configuration.

The other parts of the patch would need quite a bit more justification.
Why would this replace the existing mechanism and not build on top of
it? Are all the HE Operation element configuration items something that
should be exposed through configuration parameters in hostapd instead of
automatically generated and updated dynamically during operation?

I'm including the remaining changes in patch format below. I'd prefer to
see this split into separate patches to address HE Capabilities and HE
Operation. I'd also like to see this extend the existing functionality
and configuration options rather than replacing them. If there is desire
to replace something, please provide more justification for doing so.

- Jouni


 hostapd/config_file.c        | 490 +++++++++++++++++++++++++++++++++++++++++--
 hostapd/hostapd.conf         |  85 ++++----
 src/ap/ap_config.h           |  23 +-
 src/ap/ieee802_11.h          |   1 +
 src/ap/ieee802_11_he.c       | 133 ++++++++----
 src/common/ieee802_11_defs.h | 288 ++++++++++++++++++++++---
 6 files changed, 883 insertions(+), 137 deletions(-)

diff --git a/hostapd/config_file.c b/hostapd/config_file.c
index daaa484..0da79d1 100644
--- a/hostapd/config_file.c
+++ b/hostapd/config_file.c
@@ -1380,10 +1380,125 @@ static int hostapd_config_vht_capab(struct hostapd_config *conf,
 
 
 #ifdef CONFIG_IEEE80211AX
+
 static u8 set_he_cap(int val, u8 mask)
 {
 	return (u8) (mask & (val << ffs(mask)));
 }
+
+
+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 */
 
 
@@ -3391,20 +3506,367 @@ 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);
diff --git a/hostapd/hostapd.conf b/hostapd/hostapd.conf
index 739d367..a6e5a0c 100644
--- a/hostapd/hostapd.conf
+++ b/hostapd/hostapd.conf
@@ -760,47 +760,58 @@ 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_param_count
 #he_mu_edca_qos_info_q_ack
 #he_mu_edca_qos_info_queue_request=1
@@ -824,6 +835,10 @@ wmm_ac_vo_acm=0
 #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 990d0d1..fd1bb84 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,8 @@ 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 */
 
diff --git a/src/ap/ieee802_11.h b/src/ap/ieee802_11.h
index 5082226..71162e4 100644
--- a/src/ap/ieee802_11.h
+++ b/src/ap/ieee802_11.h
@@ -15,6 +15,7 @@ struct sta_info;
 struct hostapd_frame_info;
 struct ieee80211_ht_capabilities;
 struct ieee80211_vht_capabilities;
+struct ieee80211_he_capabilities;
 struct ieee80211_mgmt;
 struct vlan_description;
 struct hostapd_sta_wpa_psk_short;
diff --git a/src/ap/ieee802_11_he.c b/src/ap/ieee802_11_he.c
index 0721358..81a3408 100644
--- a/src/ap/ieee802_11_he.c
+++ b/src/ap/ieee802_11_he.c
@@ -20,30 +20,59 @@ 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;
+	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;
 
-	cap = (struct ieee80211_he_capabilities *) pos;
-	os_memset(cap, 0, sizeof(*cap));
+	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_beamformer)
-		cap->he_phy_capab_info[HE_PHYCAP_SU_BEAMFORMER_CAPAB_IDX] |=
-			HE_PHYCAP_SU_BEAMFORMER_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_su_beamformee)
-		cap->he_phy_capab_info[HE_PHYCAP_SU_BEAMFORMEE_CAPAB_IDX] |=
-			HE_PHYCAP_SU_BEAMFORMEE_CAPAB;
-
-	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;
 }
@@ -53,36 +82,68 @@ u8 * hostapd_eid_he_operation(struct hostapd_data *hapd, u8 *eid)
 {
 	struct ieee80211_he_operation *oper;
 	u8 *pos = eid;
+	u8 *he_oper;
+	u8 size;
 
 	if (!hapd->iface->current_mode)
 		return eid;
 
-	*pos++ = WLAN_EID_EXTENSION;
-	*pos++ = 1 + sizeof(struct ieee80211_he_operation);
-	*pos++ = WLAN_EID_EXT_HE_OPERATION;
-
-	oper = (struct ieee80211_he_operation *) pos;
-	os_memset(oper, 0, sizeof(*oper));
+	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_op.he_bss_color)
-		oper->he_oper_params |= hapd->iface->conf->he_op.he_bss_color;
+	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);
 
-	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);
+	*pos++ = WLAN_EID_EXTENSION;
+	*pos++ = 1 + size;
+	*pos++ = WLAN_EID_EXT_HE_OPERATION;
 
-	if (hapd->iface->conf->he_op.he_twt_required)
-		oper->he_oper_params |= HE_OPERATION_TWT_REQUIRED;
+	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;
+
+	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_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_rts_threshold)
-		oper->he_oper_params |=
-			(hapd->iface->conf->he_op.he_rts_threshold <<
-			 HE_OPERATION_RTS_THRESHOLD_OFFSET);
+	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;
 
-	/* TODO: conditional MaxBSSID Indicator subfield */
+	wpa_hexdump(MSG_DEBUG, "hostapd_eid_he_operation:", pos, size);
 
-	pos += sizeof(*oper);
+	pos += size;
 
 	return pos;
 }
diff --git a/src/common/ieee802_11_defs.h b/src/common/ieee802_11_defs.h
index cc512c6..1e3763b 100644
--- a/src/common/ieee802_11_defs.h
+++ b/src/common/ieee802_11_defs.h
@@ -2108,46 +2108,20 @@ 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];
@@ -2156,6 +2130,258 @@ struct ieee80211_he_mu_edca_parameter_set {
 	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 */
 /* ACI/AIFSN */
 #define HE_MU_AC_PARAM_ACI_IDX 0
-- 
2.7.4

-- 
Jouni Malinen                                            PGP id EFC895FA

_______________________________________________
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