Browse Source

qcacld-3.0: Fix the issue with duplicate HE caps advertisement

HE caps and HE op IE are derived in driver and also sent from
hostapd as part of additional IE. additional IEs are appended at
end of the beacon frame hence the duplicate IEs are observed.
Strip out the HE caps and HE op IE from additional IE after the
IEs are derived in driver.

Change-Id: Ia11b16ef8e7d376e5c1ef44d54e1cd1885f5b842
CRs-Fixed: 2159867
Kiran Kumar Lokere 7 years ago
parent
commit
3a5b4243c0
2 changed files with 27 additions and 22 deletions
  1. 25 21
      core/mac/src/pe/lim/lim_utils.c
  2. 2 1
      core/mac/src/sys/legacy/src/utils/src/parser_api.c

+ 25 - 21
core/mac/src/pe/lim/lim_utils.c

@@ -7315,25 +7315,27 @@ void lim_update_stads_he_caps(tpDphHashNode sta_ds, tpSirAssocRsp assoc_rsp,
 
 void lim_update_usr_he_cap(tpAniSirGlobal mac_ctx, tpPESession session)
 {
-	const uint8_t *vendor_ie;
 	tSirAddIeParams *add_ie = &session->addIeParams;
 	tDot11fIEhe_cap *he_cap = &session->he_config;
 	struct he_cap_network_endian *he_cap_from_ie;
-
-	vendor_ie = wlan_get_ext_ie_ptr_from_ext_id(
-			HE_CAP_OUI_TYPE, HE_CAP_OUI_SIZE,
-			add_ie->probeRespBCNData_buff,
-			add_ie->probeRespBCNDataLen);
-	if (!vendor_ie) {
-		pe_err("11AX: Unable to parse HE Caps");
+	uint8_t extracted_buff[DOT11F_IE_HE_CAP_MAX_LEN + 2];
+	enum eSirRetStatus status;
+	qdf_mem_zero(extracted_buff, sizeof(extracted_buff));
+	status = lim_strip_ie(mac_ctx, add_ie->probeRespBCNData_buff,
+			&add_ie->probeRespBCNDataLen,
+			DOT11F_EID_HE_CAP, ONE_BYTE,
+			HE_CAP_OUI_TYPE, (uint8_t)HE_CAP_OUI_SIZE,
+			extracted_buff, DOT11F_IE_HE_CAP_MAX_LEN);
+	if (eSIR_SUCCESS != status) {
+		pe_debug("Failed to strip HE cap IE status: %d", status);
 		return;
 	}
 
 	pe_debug("Before update: su_beamformer: %d, su_beamformee: %d, mu_beamformer: %d",
 		he_cap->su_beamformer, he_cap->su_beamformee, he_cap->mu_beamformer);
 
-	he_cap_from_ie =
-		(struct he_cap_network_endian *)&vendor_ie[HE_OP_OUI_SIZE + 2];
+	he_cap_from_ie = (struct he_cap_network_endian *)
+					&extracted_buff[HE_CAP_OUI_SIZE + 2];
 
 	he_cap->su_beamformer =
 		he_cap->su_beamformer & he_cap_from_ie->su_beamformer;
@@ -7350,22 +7352,24 @@ void lim_decide_he_op(tpAniSirGlobal mac_ctx, tpAddBssParams add_bss,
 		      tpPESession session)
 {
 	uint32_t val;
-	const uint8_t *vendor_ie;
 	struct he_ops_network_endian *he_ops_from_ie;
 	tDot11fIEhe_op *he_ops = &add_bss->he_op;
 	tSirAddIeParams *add_ie = &session->addIeParams;
-
-	vendor_ie = wlan_get_ext_ie_ptr_from_ext_id(
-			HE_OP_OUI_TYPE, HE_OP_OUI_SIZE,
-			add_ie->probeRespBCNData_buff,
-			add_ie->probeRespBCNDataLen);
-	if (!vendor_ie) {
-		pe_err("11AX: Unable to parse HE Operation");
+	uint8_t extracted_buff[DOT11F_IE_HE_OP_MAX_LEN + 2];
+	enum eSirRetStatus status;
+
+	qdf_mem_zero(extracted_buff, sizeof(extracted_buff));
+	status = lim_strip_ie(mac_ctx, add_ie->probeRespBCNData_buff,
+			&add_ie->probeRespBCNDataLen,
+			DOT11F_EID_HE_OP, ONE_BYTE,
+			HE_OP_OUI_TYPE, (uint8_t)HE_OP_OUI_SIZE,
+			extracted_buff, DOT11F_IE_HE_OP_MAX_LEN);
+	if (eSIR_SUCCESS != status) {
+		pe_debug("Failed to strip HE OP IE status: %d", status);
 		return;
 	}
-
-	he_ops_from_ie =
-		(struct he_ops_network_endian *)&vendor_ie[HE_OP_OUI_SIZE + 2];
+	he_ops_from_ie = (struct he_ops_network_endian *)
+					&extracted_buff[HE_OP_OUI_SIZE + 2];
 
 	he_ops->bss_color = he_ops_from_ie->bss_color;
 	he_ops->default_pe = he_ops_from_ie->default_pe;

+ 2 - 1
core/mac/src/sys/legacy/src/utils/src/parser_api.c

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
  *
  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
  *
@@ -6265,6 +6265,7 @@ QDF_STATUS populate_dot11f_he_operation(tpAniSirGlobal mac_ctx,
 	qdf_mem_copy(he_op, &session->he_op, sizeof(*he_op));
 
 	he_op->vht_oper_present = 1;
+	he_op->present = 1;
 	if (session->ch_width > CH_WIDTH_40MHZ) {
 		he_op->vht_oper.info.chan_width = 1;
 		he_op->vht_oper.info.center_freq_seg0 =