Jelajahi Sumber

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 beacon frames.

Change-Id: I2f2c5de1dcc49a4fc1b70364d751926edaff8faa
CRs-Fixed: 3159696
Deeksha Gupta 3 tahun lalu
induk
melakukan
e59ec6bf79

+ 8 - 0
core/mac/src/pe/lim/lim_process_sme_req_messages.c

@@ -5175,6 +5175,14 @@ void lim_process_tpe_ie_from_beacon(struct mac_context *mac,
 		pe_debug("warnings (0x%08x, %d bytes):", status, buf_len);
 	}
 
+	status = lim_strip_and_decode_eht_cap(buf, buf_len, &bcn_ie->eht_cap,
+					      bcn_ie->he_cap,
+					      session->curr_op_freq);
+	if (status != QDF_STATUS_SUCCESS) {
+		pe_err("Failed to extract eht cap");
+		return;
+	}
+
 	lim_parse_tpe_ie(mac, session, bcn_ie->transmit_power_env,
 			 bcn_ie->num_transmit_power_env, &bcn_ie->he_op,
 			 has_tpe_updated);

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

@@ -4052,7 +4052,9 @@ sir_beacon_ie_ese_bcn_report(struct mac_context *mac,
 	   for Bcn report mandatory Ies */
 	uint16_t numBytes = 0, freeBytes = 0;
 	uint8_t *pos = NULL;
+	uint32_t freq;
 
+	freq = WMA_GET_RX_FREQ(pPayload);
 	/* Zero-init our [out] parameter, */
 	qdf_mem_zero((uint8_t *) &eseBcnReportMandatoryIe,
 		    sizeof(eseBcnReportMandatoryIe));
@@ -4073,6 +4075,18 @@ sir_beacon_ie_ese_bcn_report(struct mac_context *mac,
 		pe_debug("There were warnings while unpacking Beacon IEs (0x%08x, %d bytes):",
 			status, nPayload);
 	}
+
+	status = lim_strip_and_decode_eht_cap(pPayload + WLAN_BEACON_IES_OFFSET,
+					      nPayload - WLAN_BEACON_IES_OFFSET,
+					      &pBies->eht_cap,
+					      pBies->he_cap,
+					      freq);
+	if (status != QDF_STATUS_SUCCESS) {
+		pe_err("Failed to extract eht cap");
+		qdf_mem_free(pBies);
+		return status;
+	}
+
 	/* & "transliterate" from a 'tDot11fBeaconIEs' to a 'eseBcnReportMandatoryIe'... */
 	if (!pBies->SSID.present) {
 		pe_debug("Mandatory IE SSID not present!");
@@ -4319,7 +4333,9 @@ sir_parse_beacon_ie(struct mac_context *mac,
 {
 	tDot11fBeaconIEs *pBies;
 	uint32_t status;
+	uint32_t freq;
 
+	freq = WMA_GET_RX_FREQ(pPayload);
 	/* Zero-init our [out] parameter, */
 	qdf_mem_zero((uint8_t *) pBeaconStruct, sizeof(tSirProbeRespBeacon));
 
@@ -4341,6 +4357,18 @@ sir_parse_beacon_ie(struct mac_context *mac,
 	} else if (DOT11F_WARNED(status)) {
 		pe_debug("warnings (0x%08x, %d bytes):", status, nPayload);
 	}
+
+	status = lim_strip_and_decode_eht_cap(pPayload + WLAN_BEACON_IES_OFFSET,
+					      nPayload - WLAN_BEACON_IES_OFFSET,
+					      &pBies->eht_cap,
+					      pBies->he_cap,
+					      freq);
+	if (status != QDF_STATUS_SUCCESS) {
+		pe_err("Failed to extract eht cap");
+		qdf_mem_free(pBies);
+		return QDF_STATUS_E_FAILURE;
+	}
+
 	/* & "transliterate" from a 'tDot11fBeaconIEs' to a 'tSirProbeRespBeacon'... */
 	if (!pBies->SSID.present) {
 		pe_debug("Mandatory IE SSID not present!");
@@ -4637,10 +4665,12 @@ sir_convert_beacon_frame2_struct(struct mac_context *mac,
 	uint32_t status, nPayload;
 	uint8_t *pPayload;
 	tpSirMacMgmtHdr pHdr;
+	uint32_t freq;
 
 	pPayload = WMA_GET_RX_MPDU_DATA(pFrame);
 	nPayload = WMA_GET_RX_PAYLOAD_LEN(pFrame);
 	pHdr = WMA_GET_RX_MAC_HEADER(pFrame);
+	freq = WMA_GET_RX_FREQ(pFrame);
 
 	/* Zero-init our [out] parameter, */
 	qdf_mem_zero((uint8_t *) pBeaconStruct, sizeof(tSirProbeRespBeacon));
@@ -4662,6 +4692,18 @@ sir_convert_beacon_frame2_struct(struct mac_context *mac,
 		qdf_mem_free(pBeacon);
 		return QDF_STATUS_E_FAILURE;
 	}
+
+	status = lim_strip_and_decode_eht_cap(pPayload + WLAN_BEACON_IES_OFFSET,
+					      nPayload - WLAN_BEACON_IES_OFFSET,
+					      &pBeacon->eht_cap,
+					      pBeacon->he_cap,
+					      freq);
+	if (status != QDF_STATUS_SUCCESS) {
+		pe_err("Failed to extract eht cap");
+		qdf_mem_free(pBeacon);
+		return QDF_STATUS_E_FAILURE;
+	}
+
 	/* & "transliterate" from a 'tDot11fBeacon' to a 'tSirProbeRespBeacon'... */
 	/* Timestamp */
 	qdf_mem_copy((uint8_t *) pBeaconStruct->timeStamp,
@@ -9114,6 +9156,7 @@ QDF_STATUS wlan_parse_bss_description_ies(struct mac_context *mac_ctx,
 					  tDot11fBeaconIEs *ie_struct)
 {
 	int ie_len = wlan_get_ielen_from_bss_description(bss_desc);
+	QDF_STATUS status;
 
 	if (ie_len <= 0 || !ie_struct) {
 		pe_err("BSS description has invalid IE : %d", ie_len);
@@ -9126,6 +9169,15 @@ QDF_STATUS wlan_parse_bss_description_ies(struct mac_context *mac_ctx,
 		return QDF_STATUS_E_FAILURE;
 	}
 
+	status = lim_strip_and_decode_eht_cap((uint8_t *)bss_desc->ieFields,
+					      ie_len, &ie_struct->eht_cap,
+					      ie_struct->he_cap,
+					      bss_desc->chan_freq);
+	if (status != QDF_STATUS_SUCCESS) {
+		pe_err("Failed to extract eht cap");
+		return QDF_STATUS_E_FAILURE;
+	}
+
 	return QDF_STATUS_SUCCESS;
 }