Ver código fonte

qcacld-3.0: Fix STA sending SMPS force mode when connected to 1x1 AP

qcacld-2.0 to qcacld-3.0 propagation

Peer supported NSS should be updated based on the presence of HT
and VHT capabilities in the beacon/probe response IE from the AP.
Also, update session supported NSS during reassociation. Otherwise,
station will end up sending SMPS action frames to AP which only
supports 1x1 mode.

CRs-Fixed: 979545
Change-Id: Ie2dbfbb577f08c5090101e1330184e72a9f6cd46
Archana Ramachandran 9 anos atrás
pai
commit
5482d6a4d0

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

@@ -1399,7 +1399,7 @@ tSirRetStatus lim_populate_vht_mcs_set(tpAniSirGlobal mac_ctx,
 	}
 	rates->vhtTxHighestDataRate = (uint16_t) val;
 
-	if (peer_vht_caps == NULL)
+	if ((peer_vht_caps == NULL) || (!peer_vht_caps->present))
 		return eSIR_SUCCESS;
 
 	rates->vhtTxHighestDataRate =

+ 12 - 2
core/mac/src/pe/lim/lim_ft.c

@@ -686,9 +686,19 @@ void lim_fill_ft_session(tpAniSirGlobal pMac,
 
 	pftSessionEntry->enableHtSmps = psessionEntry->enableHtSmps;
 	pftSessionEntry->smpsMode = psessionEntry->smpsMode;
-	lim_log(pMac, LOG1, FL("FT session enable smps: %d mode: %d"),
+	/*
+	 * By default supported NSS 1x1 is set to true
+	 * and later on updated while determining session
+	 * supported rates which is the intersection of
+	 * self and peer rates
+	 */
+	pftSessionEntry->supported_nss_1x1 = true;
+	lim_log(pMac, LOG1,
+		FL("FT enable smps: %d mode: %d supported nss 1x1: %d"),
 		pftSessionEntry->enableHtSmps,
-		pftSessionEntry->smpsMode);
+		pftSessionEntry->smpsMode,
+		pftSessionEntry->supported_nss_1x1);
+
 
 	qdf_mem_free(pBeaconStruct);
 }

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

@@ -1729,11 +1729,19 @@ __lim_process_sme_join_req(tpAniSirGlobal mac_ctx, uint32_t *msg_buf)
 		session->htSmpsvalue = sme_join_req->htSmps;
 		session->send_smps_action =
 			sme_join_req->send_smps_action;
+		/*
+		 * By default supported NSS 1x1 is set to true
+		 * and later on updated while determining session
+		 * supported rates which is the intersection of
+		 * self and peer rates
+		 */
+		session->supported_nss_1x1 = true;
 		lim_log(mac_ctx, LOG1,
-			FL("enable Smps: %d mode: %d send action: %d"),
+			FL("enable Smps: %d mode: %d send action: %d supported nss 1x1: %d"),
 			session->enableHtSmps,
 			session->htSmpsvalue,
-			session->send_smps_action);
+			session->send_smps_action,
+			session->supported_nss_1x1);
 
 		/*Store Persona */
 		session->pePersona = sme_join_req->staPersona;
@@ -2154,10 +2162,11 @@ static void __lim_process_sme_reassoc_req(tpAniSirGlobal mac_ctx,
 	session_entry->send_smps_action =
 		reassoc_req->send_smps_action;
 	lim_log(mac_ctx, LOG1,
-		FL("enableHtSmps: %d htSmps: %d send action: %d"),
+		FL("enableHtSmps: %d htSmps: %d send action: %d supported nss 1x1: %d"),
 		session_entry->enableHtSmps,
 		session_entry->htSmpsvalue,
-		session_entry->send_smps_action);
+		session_entry->send_smps_action,
+		session_entry->supported_nss_1x1);
 	/*
 	 * Reassociate request is expected
 	 * in link established state only.

+ 8 - 0
core/sme/src/csr/csr_api_roam.c

@@ -8638,11 +8638,19 @@ static void csr_roam_roaming_state_reassoc_rsp_processor(tpAniSirGlobal pMac,
 		&pMac->roam.neighborRoamInfo[pSmeJoinRsp->sessionId];
 	tCsrRoamInfo roamInfo;
 	uint32_t roamId = 0;
+	tCsrRoamSession *csr_session;
 
 	if (eSIR_SME_SUCCESS == pSmeJoinRsp->statusCode) {
 		QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
 			  FL("CSR SmeReassocReq Successful"));
 		result = eCsrReassocSuccess;
+		csr_session = CSR_GET_SESSION(pMac, pSmeJoinRsp->sessionId);
+		if (NULL != csr_session) {
+			csr_session->supported_nss_1x1 =
+				pSmeJoinRsp->supported_nss_1x1;
+			sms_log(pMac, LOG1, FL("SME session supported nss: %d"),
+				csr_session->supported_nss_1x1);
+		}
 		/*
 		 * Since the neighbor roam algorithm uses reassoc req for
 		 * handoff instead of join, we need the response contents while