Browse Source

qcacld-3.0: Add support to decode EHT cap IE

Currently parser code doesn't have support to decode optional
fields in EHT capability IE which are dependent on HE cap IE.

To achive this, add API to decode EHT cap IE in assoc request or
response frames.

Change-Id: Ie1781de079ecc6c4860fdcb4a2abb3ffeff10fc0
CRs-Fixed: 3135825
Deeksha Gupta 3 years ago
parent
commit
59122a1e30

+ 27 - 0
core/mac/src/include/parser_api.h

@@ -1473,6 +1473,24 @@ QDF_STATUS populate_dot11f_eht_operation(struct mac_context *mac_ctx,
  */
 void lim_ieee80211_pack_ehtcap(uint8_t *ie, tDot11fIEeht_cap dot11f_eht_cap,
 			       tDot11fIEhe_cap dot11f_he_cap, bool is_band_2g);
+
+/**
+ * lim_strip_and_decode_eht_cap() - API to decode EHT capabilities IE
+ * @ie: source ie address
+ * @ie_len: source ie length
+ * @dot11f_eht_cap: output pointer to dot11f EHT capabilities IE structure
+ * @dot11f_he_cap: dot11f HE capabilities IE structure
+ * @freq: frequency
+ *
+ * This API is used to strip and decode EHT caps IE which is of varaible in
+ * in length depending on the HE capabilities IE content.
+ * Return: QDF_STATUS
+ */
+QDF_STATUS lim_strip_and_decode_eht_cap(uint8_t *ie, uint16_t ie_len,
+					tDot11fIEeht_cap *dot11f_eht_cap,
+					tDot11fIEhe_cap dot11f_he_cap,
+					uint16_t freq);
+
 #else
 static inline QDF_STATUS
 populate_dot11f_eht_caps(struct mac_context *mac_ctx,
@@ -1495,6 +1513,15 @@ static inline void lim_ieee80211_pack_ehtcap(uint8_t *ie,
 					     bool is_band_2g)
 {
 }
+
+static inline
+QDF_STATUS lim_strip_and_decode_eht_cap(uint8_t *ie, uint16_t ie_len,
+					tDot11fIEeht_cap *dot11f_eht_cap,
+					tDot11fIEhe_cap dot11f_he_cap,
+					uint16_t freq)
+{
+	return QDF_STATUS_SUCCESS;
+}
 #endif
 
 #ifdef WLAN_FEATURE_11BE_MLO

+ 13 - 1
core/mac/src/pe/lim/lim_process_assoc_req_frame.c

@@ -264,8 +264,20 @@ static bool lim_chk_assoc_req_parse_error(struct mac_context *mac_ctx,
 		status = sir_convert_reassoc_req_frame2_struct(mac_ctx,
 						frm_body, frame_len, assoc_req);
 
-	if (status == QDF_STATUS_SUCCESS)
+	if (status == QDF_STATUS_SUCCESS) {
+		status = lim_strip_and_decode_eht_cap(
+					frm_body + WLAN_ASSOC_REQ_IES_OFFSET,
+					frame_len - WLAN_ASSOC_REQ_IES_OFFSET,
+					&assoc_req->eht_cap,
+					assoc_req->he_cap,
+					session->curr_op_freq);
+		if (status != QDF_STATUS_SUCCESS) {
+			pe_err("Failed to extract eht cap");
+			return false;
+		}
+
 		return true;
+	}
 
 	pe_warn("Assoc Req rejected: frame parsing error. source addr:"
 			QDF_MAC_ADDR_FMT, QDF_MAC_ADDR_REF(sa));

+ 13 - 0
core/mac/src/pe/lim/lim_process_assoc_rsp_frame.c

@@ -996,6 +996,19 @@ lim_process_assoc_rsp_frame(struct mac_context *mac_ctx, uint8_t *rx_pkt_info,
 		return;
 	}
 
+	if (lim_is_session_eht_capable(session_entry)) {
+		status = lim_strip_and_decode_eht_cap(
+					body + WLAN_ASSOC_RSP_IES_OFFSET,
+					frame_len - WLAN_ASSOC_RSP_IES_OFFSET,
+					&assoc_rsp->eht_cap,
+					assoc_rsp->he_cap,
+					session_entry->curr_op_freq);
+		if (status != QDF_STATUS_SUCCESS) {
+			pe_err("Failed to extract eht cap");
+			return;
+		}
+	}
+
 	if (!assoc_rsp->suppRatesPresent) {
 		pe_debug("assoc response does not have supported rate set");
 		qdf_mem_copy(&assoc_rsp->supportedRates,

+ 1 - 1
core/mac/src/pe/lim/lim_send_management_frames.c

@@ -1879,9 +1879,9 @@ lim_send_assoc_rsp_mgmt_frame(struct mac_context *mac_ctx,
 
 		is_band_2g =
 			WLAN_REG_IS_24GHZ_CH_FREQ(pe_session->curr_op_freq);
-
 		lim_ieee80211_pack_ehtcap(eht_cap_ie, frm.eht_cap, frm.he_cap,
 					  is_band_2g);
+
 		eht_cap_ie_len = eht_cap_ie[1] + 2;
 
 		/* Copy the EHT IE to the end of the frame */

+ 410 - 0
core/mac/src/sys/legacy/src/utils/src/parser_api.c

@@ -6821,6 +6821,25 @@ populate_dot11f_he_bss_color_change(struct mac_context *mac_ctx,
 
 #ifdef WLAN_FEATURE_11BE
 
+/**
+ * lim_get_ext_ie_ptr_from_ext_id() - Find out ext ie
+ * @ie: source ie address
+ * @ie_len: source ie length
+ *
+ * This API is used to find out ext ie from ext id
+ *
+ * Return: vendor ie address - success
+ *         NULL - failure
+ */
+static
+const uint8_t *lim_get_ext_ie_ptr_from_ext_id(const uint8_t *ie,
+					      uint16_t ie_len)
+{
+	return wlan_get_ext_ie_ptr_from_ext_id(EHT_CAP_OUI_TYPE,
+					       EHT_CAP_OUI_SIZE,
+					       ie, ie_len);
+}
+
 /* 1 byte ext id, 2 bytes mac cap, 8 bytes phy cap */
 #define EHTCAP_FIXED_LEN 11
 #define EHTCAP_MACBYTE_IDX0      0
@@ -7351,6 +7370,397 @@ enum EHT_PER_BW_TXRX_MCS_NSS_MAP_IDX {
 				      EHTCAP_PHY_TB_SOUNDING_FEEDBACK_RL_IDX, \
 				      EHTCAP_PHY_TB_SOUNDING_FEEDBACK_RL_BITS, \
 				      value)
+static
+QDF_STATUS lim_ieee80211_unpack_ehtcap(const uint8_t *eht_cap_ie,
+				       tDot11fIEeht_cap *dot11f_eht_cap,
+				       tDot11fIEhe_cap dot11f_he_cap,
+				       bool is_band_2g)
+{
+	struct wlan_ie_ehtcaps *ehtcap  = (struct wlan_ie_ehtcaps *)eht_cap_ie;
+	uint32_t idx = 0;
+	uint32_t mcs_map_len;
+
+	if (!eht_cap_ie || !(ehtcap->elem_id == DOT11F_EID_EHT_CAP &&
+			     ehtcap->elem_id_extn == 0x6c)) {
+		pe_err("Invalid EHT cap IE");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	qdf_mem_zero(dot11f_eht_cap, (sizeof(tDot11fIEeht_cap)));
+
+	dot11f_eht_cap->present = 1;
+	dot11f_eht_cap->nsep_pri_access =
+		    EHTCAP_MAC_NSEPPRIACCESS_GET_FROM_IE(ehtcap->eht_mac_cap);
+
+	dot11f_eht_cap->eht_om_ctl =
+		    EHTCAP_MAC_EHTOMCTRL_GET_FROM_IE(ehtcap->eht_mac_cap);
+
+	dot11f_eht_cap->triggered_txop_sharing_mode1 =
+		    EHTCAP_MAC_TRIGTXOP_MODE1_GET_FROM_IE(ehtcap->eht_mac_cap);
+
+	dot11f_eht_cap->triggered_txop_sharing_mode2 =
+		    EHTCAP_MAC_TRIGTXOP_MODE2_GET_FROM_IE(ehtcap->eht_mac_cap);
+
+	dot11f_eht_cap->restricted_twt =
+		    EHTCAP_MAC_RESTRICTED_TWT_GET_FROM_IE(ehtcap->eht_mac_cap);
+
+	dot11f_eht_cap->scs_traffic_desc =
+		  EHTCAP_MAC_SCS_TRAFFIC_DESC_GET_FROM_IE(ehtcap->eht_mac_cap);
+
+	dot11f_eht_cap->max_mpdu_len =
+		  EHTCAP_MAC_MAX_MPDU_LEN_GET_FROM_IE(ehtcap->eht_mac_cap);
+
+	dot11f_eht_cap->support_320mhz_6ghz =
+			EHTCAP_PHY_320MHZIN6GHZ_GET_FROM_IE(
+				ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->ru_242tone_wt_20mhz =
+			EHTCAP_PHY_242TONERUBWGT20MHZ_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->ndp_4x_eht_ltf_3dot2_us_gi =
+			EHTCAP_PHY_NDP4XEHTLTFAND320NSGI_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->partial_bw_mu_mimo =
+			EHTCAP_PHY_PARTIALBWULMU_GET_FROM_IE(
+				     ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->su_beamformer =
+	      EHTCAP_PHY_SUBFMR_GET_FROM_IE(ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->su_beamformee =
+	      EHTCAP_PHY_SUBFME_GET_FROM_IE(ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->bfee_ss_le_80mhz =
+			EHTCAP_PHY_BFMESSLT80MHZ_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->bfee_ss_160mhz =
+			EHTCAP_PHY_BFMESS160MHZ_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->bfee_ss_320mhz =
+			EHTCAP_PHY_BFMESS320MHZ_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->num_sounding_dim_le_80mhz =
+			EHTCAP_PHY_NUMSOUNDLT80MHZ_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->num_sounding_dim_160mhz =
+			EHTCAP_PHY_NUMSOUND160MHZ_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->num_sounding_dim_320mhz =
+			EHTCAP_PHY_NUMSOUND320MHZ_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->ng_16_su_feedback =
+			EHTCAP_PHY_NG16SUFB_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->ng_16_mu_feedback =
+			EHTCAP_PHY_NG16MUFB_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->cb_sz_4_2_su_feedback =
+			EHTCAP_PHY_CODBK42SUFB_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->cb_sz_7_5_su_feedback =
+			EHTCAP_PHY_CODBK75MUFB_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->trig_su_bforming_feedback =
+			EHTCAP_PHY_TRIGSUBFFB_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->trig_mu_bforming_partial_bw_feedback =
+			EHTCAP_PHY_TRIGMUBFPARTBWFB_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->triggered_cqi_feedback =
+			EHTCAP_PHY_TRIGCQIFB_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->partial_bw_dl_mu_mimo =
+			EHTCAP_PHY_PARTBWDLMUMIMO_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->psr_based_sr =
+			EHTCAP_PHY_PSRSR_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->power_boost_factor =
+			EHTCAP_PHY_PWRBSTFACTOR_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->eht_mu_ppdu_4x_ltf_0_8_us_gi =
+			EHTCAP_PHY_4XEHTMULTFAND800NSGI_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->max_nc =
+			EHTCAP_PHY_MAXNC_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->non_trig_cqi_feedback =
+			EHTCAP_PHY_NONTRIGCQIFB_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->tx_1024_4096_qam_lt_242_tone_ru =
+			EHTCAP_PHY_TX1024AND4096QAMLT242TONERU_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->rx_1024_4096_qam_lt_242_tone_ru =
+			EHTCAP_PHY_RX1024AND4096QAMLT242TONERU_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->ppet_present =
+			EHTCAP_PHY_PPETHRESPRESENT_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->common_nominal_pkt_padding =
+			EHTCAP_PHY_CMNNOMPKTPAD_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->max_num_eht_ltf =
+			EHTCAP_PHY_MAXNUMEHTLTF_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->mcs_15 =
+			EHTCAP_PHY_SUPMCS15_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->eht_dup_6ghz =
+			EHTCAP_PHY_EHTDUPIN6GHZ_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->op_sta_rx_ndp_wider_bw_20mhz =
+			EHTCAP_PHY_20MHZOPSTARXNDPWIDERBW_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->non_ofdma_ul_mu_mimo_le_80mhz =
+			EHTCAP_PHY_NONOFDMAULMUMIMOLT80MHZ_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->non_ofdma_ul_mu_mimo_160mhz =
+			EHTCAP_PHY_NONOFDMAULMUMIMO160MHZ_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->non_ofdma_ul_mu_mimo_320mhz =
+			EHTCAP_PHY_NONOFDMAULMUMIMO320MHZ_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->mu_bformer_le_80mhz =
+			EHTCAP_PHY_MUBFMRLT80MHZ_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->mu_bformer_160mhz =
+			EHTCAP_PHY_MUBFMR160MHZ_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->mu_bformer_320mhz =
+			EHTCAP_PHY_MUBFMR320MHZ_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	dot11f_eht_cap->tb_sounding_feedback_rl =
+			EHTCAP_PHY_TB_SOUNDING_FB_RL_GET_FROM_IE(
+					ehtcap->eht_phy_cap.phy_cap_bytes);
+
+	/* Fill EHT MCS and NSS set field */
+	if ((is_band_2g && !dot11f_he_cap.chan_width_0) ||
+	    (!is_band_2g && !dot11f_he_cap.chan_width_1 &&
+	     !dot11f_he_cap.chan_width_2 && !dot11f_he_cap.chan_width_3)) {
+		dot11f_eht_cap->bw_20_rx_max_nss_for_mcs_0_to_7 =
+			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
+				      EHTCAP_RX_MCS_NSS_MAP_IDX,
+				      EHTCAP_RX_MCS_NSS_MAP_BITS);
+
+		dot11f_eht_cap->bw_20_tx_max_nss_for_mcs_0_to_7 =
+			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
+				      EHTCAP_TX_MCS_NSS_MAP_IDX,
+				      EHTCAP_TX_MCS_NSS_MAP_BITS);
+		idx++;
+
+		dot11f_eht_cap->bw_20_rx_max_nss_for_mcs_8_and_9 =
+			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
+				      EHTCAP_RX_MCS_NSS_MAP_IDX,
+				      EHTCAP_RX_MCS_NSS_MAP_BITS);
+
+		dot11f_eht_cap->bw_20_tx_max_nss_for_mcs_8_and_9 =
+			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
+				      EHTCAP_TX_MCS_NSS_MAP_IDX,
+				      EHTCAP_TX_MCS_NSS_MAP_BITS);
+		idx++;
+
+		dot11f_eht_cap->bw_20_rx_max_nss_for_mcs_10_and_11 =
+			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
+				      EHTCAP_RX_MCS_NSS_MAP_IDX,
+				      EHTCAP_RX_MCS_NSS_MAP_BITS);
+
+		dot11f_eht_cap->bw_20_rx_max_nss_for_mcs_10_and_11 =
+			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
+				      EHTCAP_TX_MCS_NSS_MAP_IDX,
+				      EHTCAP_TX_MCS_NSS_MAP_BITS);
+		idx++;
+
+		dot11f_eht_cap->bw_20_rx_max_nss_for_mcs_12_and_13 =
+			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
+				      EHTCAP_RX_MCS_NSS_MAP_IDX,
+				      EHTCAP_RX_MCS_NSS_MAP_BITS);
+
+		dot11f_eht_cap->bw_20_rx_max_nss_for_mcs_12_and_13 =
+			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
+				      EHTCAP_TX_MCS_NSS_MAP_IDX,
+				      EHTCAP_TX_MCS_NSS_MAP_BITS);
+		idx++;
+	}
+
+	if ((is_band_2g && dot11f_he_cap.chan_width_0) ||
+	    (!is_band_2g && dot11f_he_cap.chan_width_1)) {
+		dot11f_eht_cap->bw_le_80_rx_max_nss_for_mcs_0_to_9 =
+			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
+				      EHTCAP_RX_MCS_NSS_MAP_IDX,
+				      EHTCAP_RX_MCS_NSS_MAP_BITS);
+
+		dot11f_eht_cap->bw_le_80_tx_max_nss_for_mcs_0_to_9 =
+			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
+				      EHTCAP_TX_MCS_NSS_MAP_IDX,
+				      EHTCAP_TX_MCS_NSS_MAP_BITS);
+		idx++;
+
+		dot11f_eht_cap->bw_le_80_rx_max_nss_for_mcs_10_and_11 =
+			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
+				      EHTCAP_RX_MCS_NSS_MAP_IDX,
+				      EHTCAP_RX_MCS_NSS_MAP_BITS);
+
+		dot11f_eht_cap->bw_le_80_tx_max_nss_for_mcs_10_and_11 =
+			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
+				      EHTCAP_TX_MCS_NSS_MAP_IDX,
+				      EHTCAP_TX_MCS_NSS_MAP_BITS);
+		idx++;
+
+		dot11f_eht_cap->bw_le_80_rx_max_nss_for_mcs_12_and_13 =
+			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
+				      EHTCAP_RX_MCS_NSS_MAP_IDX,
+				      EHTCAP_RX_MCS_NSS_MAP_BITS);
+
+		dot11f_eht_cap->bw_le_80_rx_max_nss_for_mcs_12_and_13 =
+			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
+				      EHTCAP_TX_MCS_NSS_MAP_IDX,
+				      EHTCAP_TX_MCS_NSS_MAP_BITS);
+		idx++;
+	}
+
+	if ((dot11f_he_cap.chan_width_6 | dot11f_he_cap.chan_width_5 |
+	     dot11f_he_cap.chan_width_4 | dot11f_he_cap.chan_width_3 |
+	     dot11f_he_cap.chan_width_2 | dot11f_he_cap.chan_width_1 |
+	     dot11f_he_cap.chan_width_0) == 1) {
+		dot11f_eht_cap->bw_160_rx_max_nss_for_mcs_0_to_9 =
+			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
+				      EHTCAP_RX_MCS_NSS_MAP_IDX,
+				      EHTCAP_RX_MCS_NSS_MAP_BITS);
+
+		dot11f_eht_cap->bw_160_tx_max_nss_for_mcs_0_to_9 =
+			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
+				      EHTCAP_TX_MCS_NSS_MAP_IDX,
+				      EHTCAP_TX_MCS_NSS_MAP_BITS);
+		idx++;
+
+		dot11f_eht_cap->bw_160_rx_max_nss_for_mcs_10_and_11 =
+			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
+				      EHTCAP_RX_MCS_NSS_MAP_IDX,
+				      EHTCAP_RX_MCS_NSS_MAP_BITS);
+
+		dot11f_eht_cap->bw_160_tx_max_nss_for_mcs_10_and_11 =
+			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
+				      EHTCAP_TX_MCS_NSS_MAP_IDX,
+				      EHTCAP_TX_MCS_NSS_MAP_BITS);
+		idx++;
+
+		dot11f_eht_cap->bw_160_rx_max_nss_for_mcs_12_and_13 =
+			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
+				      EHTCAP_RX_MCS_NSS_MAP_IDX,
+				      EHTCAP_RX_MCS_NSS_MAP_BITS);
+
+		dot11f_eht_cap->bw_160_rx_max_nss_for_mcs_12_and_13 =
+			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
+				      EHTCAP_TX_MCS_NSS_MAP_IDX,
+				      EHTCAP_TX_MCS_NSS_MAP_BITS);
+		idx++;
+	}
+
+	if (dot11f_eht_cap->support_320mhz_6ghz) {
+		dot11f_eht_cap->bw_320_rx_max_nss_for_mcs_0_to_9 =
+			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
+				      EHTCAP_RX_MCS_NSS_MAP_IDX,
+				      EHTCAP_RX_MCS_NSS_MAP_BITS);
+
+		dot11f_eht_cap->bw_320_tx_max_nss_for_mcs_0_to_9 =
+			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
+				      EHTCAP_TX_MCS_NSS_MAP_IDX,
+				      EHTCAP_TX_MCS_NSS_MAP_BITS);
+		idx++;
+
+		dot11f_eht_cap->bw_320_rx_max_nss_for_mcs_10_and_11 =
+			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
+				      EHTCAP_RX_MCS_NSS_MAP_IDX,
+				      EHTCAP_RX_MCS_NSS_MAP_BITS);
+
+		dot11f_eht_cap->bw_320_tx_max_nss_for_mcs_10_and_11 =
+			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
+				      EHTCAP_TX_MCS_NSS_MAP_IDX,
+				      EHTCAP_TX_MCS_NSS_MAP_BITS);
+		idx++;
+
+		dot11f_eht_cap->bw_320_rx_max_nss_for_mcs_12_and_13 =
+			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
+				      EHTCAP_RX_MCS_NSS_MAP_IDX,
+				      EHTCAP_RX_MCS_NSS_MAP_BITS);
+
+		dot11f_eht_cap->bw_320_rx_max_nss_for_mcs_12_and_13 =
+			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
+				      EHTCAP_TX_MCS_NSS_MAP_IDX,
+				      EHTCAP_TX_MCS_NSS_MAP_BITS);
+		idx++;
+	}
+
+	/* Fill in TxRx EHT NSS & MCS support */
+	mcs_map_len = idx;
+	//ehtcap->elem_len = EHTCAP_FIXED_LEN + mcs_map_len;
+	//ehtcaplen = ehtcap->elem_len + WLAN_IE_HDR_LEN;
+
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS lim_strip_and_decode_eht_cap(uint8_t *ie, uint16_t ie_len,
+					tDot11fIEeht_cap *dot11f_eht_cap,
+					tDot11fIEhe_cap dot11f_he_cap,
+					uint16_t freq)
+{
+	const uint8_t *eht_cap_ie;
+	bool is_band_2g;
+	QDF_STATUS status;
+
+	eht_cap_ie = lim_get_ext_ie_ptr_from_ext_id(ie, ie_len);
+
+	if (!eht_cap_ie)
+		return QDF_STATUS_SUCCESS;
+
+	is_band_2g = WLAN_REG_IS_24GHZ_CH_FREQ(freq);
+
+	status = lim_ieee80211_unpack_ehtcap(eht_cap_ie, dot11f_eht_cap,
+					     dot11f_he_cap,
+					     is_band_2g);
+
+	if (status != QDF_STATUS_SUCCESS) {
+		pe_err("Failed to extract eht cap");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
 
 void lim_ieee80211_pack_ehtcap(uint8_t *ie, tDot11fIEeht_cap dot11f_eht_cap,
 			       tDot11fIEhe_cap dot11f_he_cap, bool is_band_2g)