Jelajahi Sumber

qcacld-3.0: Strip duplicate HE in beacon template

HE capabilities and HE operation IEs will be populated
in function sch_set_fixed_beacon_fields().
And duplicated one from additional IE need to be
stripped if any.

Change-Id: Ic5f508782ff23b3e99f433a31eee9df58c1c40a6
CRs-Fixed: 2666373
Lin Bai 5 tahun lalu
induk
melakukan
aa65aa169f

+ 4 - 4
core/mac/src/pe/lim/lim_process_sme_req_messages.c

@@ -488,8 +488,8 @@ lim_send_start_vdev_req(struct pe_session *session, tLimMlmStartReq *mlm_start_r
 }
 
 #ifdef WLAN_FEATURE_11AX
-static void lim_strip_he_ies_from_add_ies(struct mac_context *mac_ctx,
-					  struct pe_session *session)
+void lim_strip_he_ies_from_add_ies(struct mac_context *mac_ctx,
+				   struct pe_session *session)
 {
 	struct add_ie_params *add_ie = &session->add_ie_params;
 	QDF_STATUS status;
@@ -517,8 +517,8 @@ static void lim_strip_he_ies_from_add_ies(struct mac_context *mac_ctx,
 		pe_debug("Failed to strip HE op IE status: %d", status);
 }
 #else
-static inline void lim_strip_he_ies_from_add_ies(struct mac_context *mac_ctx,
-						 struct pe_session *session)
+void lim_strip_he_ies_from_add_ies(struct mac_context *mac_ctx,
+				   struct pe_session *session)
 {
 }
 #endif

+ 12 - 0
core/mac/src/pe/lim/lim_utils.h

@@ -910,6 +910,18 @@ QDF_STATUS lim_strip_extcap_update_struct(struct mac_context *mac_ctx,
 void lim_merge_extcap_struct(tDot11fIEExtCap *dst, tDot11fIEExtCap *src,
 		bool add);
 
+/**
+ * lim_strip_he_ies_from_add_ies() - This function strip HE IE from add_ie
+ * @mac_ctx: pointer to mac context
+ * @pe_session: pointer to PE session
+ *
+ * This API is to strip HE IE from add_ie
+ *
+ * Return: none
+ */
+void lim_strip_he_ies_from_add_ies(struct mac_context *mac_ctx,
+				   struct pe_session *session);
+
 #ifdef WLAN_FEATURE_11W
 /**
  * lim_del_pmf_sa_query_timer() - This function deletes SA query timer

+ 12 - 4
core/mac/src/pe/sch/sch_beacon_gen.c

@@ -111,9 +111,11 @@ sch_append_addn_ie(struct mac_context *mac_ctx, struct pe_session *session,
 
 	valid_ie = (addn_ielen <= WNI_CFG_PROBE_RSP_BCN_ADDNIE_DATA_LEN &&
 		    addn_ielen && (addn_ielen <= bcn_size_left));
-
-	if (!valid_ie)
+	if (!valid_ie) {
+		pe_err("addn_ielen %d exceed left %d",
+		       addn_ielen, bcn_size_left);
 		return status;
+	}
 
 	qdf_mem_zero(&ext_p2p_ie[0], DOT11F_IE_P2PBEACON_MAX_LEN + 2);
 	/*
@@ -486,6 +488,7 @@ sch_set_fixed_beacon_fields(struct mac_context *mac_ctx, struct pe_session *sess
 	if (session->limSystemRole != eLIM_STA_IN_IBSS_ROLE)
 		populate_dot11f_ext_cap(mac_ctx, is_vht_enabled, &bcn_2->ExtCap,
 					session);
+
 	populate_dot11f_ext_supp_rates(mac_ctx,
 				POPULATE_DOT11F_RATES_OPERATIONAL,
 				&bcn_2->ExtSuppRates, session);
@@ -501,6 +504,7 @@ sch_set_fixed_beacon_fields(struct mac_context *mac_ctx, struct pe_session *sess
 	if (session->limWmeEnabled)
 		populate_dot11f_wmm(mac_ctx, &bcn_2->WMMInfoAp,
 				&bcn_2->WMMParams, &bcn_2->WMMCaps, session);
+
 	if (LIM_IS_AP_ROLE(session)) {
 		if (session->wps_state != SAP_WPS_DISABLED) {
 			populate_dot11f_beacon_wpsi_es(mac_ctx,
@@ -555,11 +559,16 @@ sch_set_fixed_beacon_fields(struct mac_context *mac_ctx, struct pe_session *sess
 					sizeof(tDot11fIEWscProbeRes));
 			}
 		}
-
 	}
 
 	addnie_present = (session->add_ie_params.probeRespBCNDataLen != 0);
 	if (addnie_present) {
+		/*
+		 * Strip HE cap/op from additional IE buffer if any, as they
+		 * should be populated already.
+		 */
+		lim_strip_he_ies_from_add_ies(mac_ctx, session);
+
 		addn_ielen = session->add_ie_params.probeRespBCNDataLen;
 		addn_ie = qdf_mem_malloc(addn_ielen);
 		if (!addn_ie) {
@@ -586,7 +595,6 @@ sch_set_fixed_beacon_fields(struct mac_context *mac_ctx, struct pe_session *sess
 			lim_merge_extcap_struct(&bcn_2->ExtCap,
 						&extracted_extcap,
 						true);
-
 	}
 
 	if (session->vhtCapability && session->gLimOperatingMode.present) {