فهرست منبع

qcacld-3.0: Fix WME ParamSetCount error

qcacld-2.0 to qcacld-3.0 propagation

During the WFA WME test, the ParamSetCount in beacon
IE is mismatch with the value in ASSOC response.
The root cause is the value will be updated when
station gets connected no matter the WME parameter
changing or not.
The fix is to avoid updating the ParamSetCount count
when there is no change in the WME parameters.

Change-Id: Ied4cb68c6bbf210084bc3f94607354f2054f7fc0
CRs-Fixed: 1080760
Liangwei Dong 8 سال پیش
والد
کامیت
f6e005e87b
1فایلهای تغییر یافته به همراه40 افزوده شده و 11 حذف شده
  1. 40 11
      core/mac/src/pe/sch/sch_message.c

+ 40 - 11
core/mac/src/pe/sch/sch_message.c

@@ -189,7 +189,6 @@ void sch_process_message(tpAniSirGlobal pMac, tpSirMsgQ pSchMsg)
 		case WNI_CFG_EDCA_WME_ACVI:
 		case WNI_CFG_EDCA_WME_ACVO:
 			if (LIM_IS_AP_ROLE(psessionEntry)) {
-				psessionEntry->gLimEdcaParamSetCount++;
 				sch_qos_update_broadcast(pMac, psessionEntry);
 			}
 			break;
@@ -298,9 +297,9 @@ sch_get_params(tpAniSirGlobal pMac,
  * @mac_ctx:          mac global context
  * @session:       pesession entry
  *
- * Return: void
+ * Return: true if wmm param updated, false if wmm param not updated
  */
-static void
+static bool
 broadcast_wmm_of_concurrent_sta_session(tpAniSirGlobal mac_ctx,
 					tpPESession session)
 {
@@ -327,7 +326,13 @@ broadcast_wmm_of_concurrent_sta_session(tpAniSirGlobal mac_ctx,
 	}
 
 	if (concurrent_session == NULL)
-		return;
+		return false;
+
+	if (!qdf_mem_cmp(session->gLimEdcaParamsBC,
+	   concurrent_session->gLimEdcaParams,
+	   sizeof(concurrent_session->gLimEdcaParams)))
+		return false;
+
 	/*
 	 * Once atleast one concurrent session on same channel is found and WMM
 	 * broadcast params for current SoftAP/GO session updated, return
@@ -351,6 +356,7 @@ broadcast_wmm_of_concurrent_sta_session(tpAniSirGlobal mac_ctx,
 		       session->gLimEdcaParamsBC[j].cw.max,
 		       session->gLimEdcaParamsBC[j].txoplimit);)
 	}
+	return true;
 }
 
 void sch_qos_update_broadcast(tpAniSirGlobal pMac, tpPESession psessionEntry)
@@ -359,6 +365,7 @@ void sch_qos_update_broadcast(tpAniSirGlobal pMac, tpPESession psessionEntry)
 	uint32_t cwminidx, cwmaxidx, txopidx;
 	uint32_t phyMode;
 	uint8_t i;
+	bool updated = false;
 
 	if (sch_get_params(pMac, params, false) != eSIR_SUCCESS) {
 		PELOGE(sch_log(pMac, LOGE, FL("QosUpdateBroadcast: failed"));)
@@ -384,16 +391,36 @@ void sch_qos_update_broadcast(tpAniSirGlobal pMac, tpPESession psessionEntry)
 	}
 
 	for (i = 0; i < MAX_NUM_AC; i++) {
-		psessionEntry->gLimEdcaParamsBC[i].aci.acm =
+		if (psessionEntry->gLimEdcaParamsBC[i].aci.acm !=
+			(uint8_t) params[i][WNI_CFG_EDCA_PROFILE_ACM_IDX]) {
+			psessionEntry->gLimEdcaParamsBC[i].aci.acm =
 			(uint8_t) params[i][WNI_CFG_EDCA_PROFILE_ACM_IDX];
-		psessionEntry->gLimEdcaParamsBC[i].aci.aifsn =
+			updated = true;
+		}
+		if (psessionEntry->gLimEdcaParamsBC[i].aci.aifsn !=
+			(uint8_t) params[i][WNI_CFG_EDCA_PROFILE_AIFSN_IDX]) {
+			psessionEntry->gLimEdcaParamsBC[i].aci.aifsn =
 			(uint8_t) params[i][WNI_CFG_EDCA_PROFILE_AIFSN_IDX];
-		psessionEntry->gLimEdcaParamsBC[i].cw.min =
+			updated = true;
+		}
+		if (psessionEntry->gLimEdcaParamsBC[i].cw.min !=
+			convert_cw(GET_CW(&params[i][cwminidx]))) {
+			psessionEntry->gLimEdcaParamsBC[i].cw.min =
 			convert_cw(GET_CW(&params[i][cwminidx]));
-		psessionEntry->gLimEdcaParamsBC[i].cw.max =
+			updated = true;
+		}
+		if (psessionEntry->gLimEdcaParamsBC[i].cw.max !=
+			convert_cw(GET_CW(&params[i][cwmaxidx]))) {
+			psessionEntry->gLimEdcaParamsBC[i].cw.max =
 			convert_cw(GET_CW(&params[i][cwmaxidx]));
-		psessionEntry->gLimEdcaParamsBC[i].txoplimit =
+			updated = true;
+		}
+		if (psessionEntry->gLimEdcaParamsBC[i].txoplimit !=
+			(uint16_t) params[i][txopidx]) {
+			psessionEntry->gLimEdcaParamsBC[i].txoplimit =
 			(uint16_t) params[i][txopidx];
+			updated = true;
+		}
 
 		PELOG1(sch_log
 			       (pMac, LOG1,
@@ -408,7 +435,10 @@ void sch_qos_update_broadcast(tpAniSirGlobal pMac, tpPESession psessionEntry)
 	}
 
 	/* If there exists a concurrent STA-AP session, use its WMM params to broadcast in beacons. WFA Wifi Direct test plan 6.1.14 requirement */
-	broadcast_wmm_of_concurrent_sta_session(pMac, psessionEntry);
+	if (broadcast_wmm_of_concurrent_sta_session(pMac, psessionEntry))
+		updated = true;
+	if (updated)
+		psessionEntry->gLimEdcaParamSetCount++;
 
 	if (sch_set_fixed_beacon_fields(pMac, psessionEntry) != eSIR_SUCCESS)
 		PELOGE(sch_log(pMac, LOGE, "Unable to set beacon fields!");)
@@ -567,7 +597,6 @@ void sch_edca_profile_update(tpAniSirGlobal pMac, tpPESession psessionEntry)
 	if (LIM_IS_AP_ROLE(psessionEntry) ||
 	    LIM_IS_IBSS_ROLE(psessionEntry)) {
 		sch_qos_update_local(pMac, psessionEntry);
-		psessionEntry->gLimEdcaParamSetCount++;
 		sch_qos_update_broadcast(pMac, psessionEntry);
 	}
 }