Răsfoiți Sursa

qcacld-3.0: Fix pmfComebackTimer during roaming

qcacld-2.0 to qcacld-3.0 propagation

Currently pmfComebackTimer is not initialized during roaming. This
can lead to error in pe_delete_session when driver tries to destroy
pmfComebackTimer. Fix this by initializing pmfComebackTimer during
roaming. Also, handle status eSIR_MAC_TRY_AGAIN_LATER as failure
during roaming.

Change-Id: Ic9c4e996c4078d09ef7cd9b3b073105d94eb53fb
CRs-Fixed: 1037640
Padma, Santhosh Kumar 8 ani în urmă
părinte
comite
dcba34f1c1

+ 14 - 0
core/mac/src/pe/lim/lim_ft.c

@@ -493,6 +493,7 @@ void lim_fill_ft_session(tpAniSirGlobal pMac,
 	tSchBeaconStruct *pBeaconStruct;
 	uint32_t selfDot11Mode;
 	ePhyChanBondState cbEnabledMode;
+	QDF_STATUS status;
 
 	pBeaconStruct = qdf_mem_malloc(sizeof(tSchBeaconStruct));
 	if (NULL == pBeaconStruct) {
@@ -678,6 +679,19 @@ void lim_fill_ft_session(tpAniSirGlobal pMac,
 	pftSessionEntry->encryptType = psessionEntry->encryptType;
 #ifdef WLAN_FEATURE_11W
 	pftSessionEntry->limRmfEnabled = psessionEntry->limRmfEnabled;
+
+	if (pftSessionEntry->limRmfEnabled) {
+		pftSessionEntry->pmfComebackTimerInfo.pMac = pMac;
+		pftSessionEntry->pmfComebackTimerInfo.sessionID =
+				psessionEntry->smeSessionId;
+		status = qdf_mc_timer_init(&pftSessionEntry->pmfComebackTimer,
+			QDF_TIMER_TYPE_SW, lim_pmf_comeback_timer_callback,
+			(void *)&pftSessionEntry->pmfComebackTimerInfo);
+		if (!QDF_IS_STATUS_SUCCESS(status))
+			lim_log(pMac, LOGE,
+				FL("cannot init pmf comeback timer."));
+	}
+
 #endif
 	if ((pftSessionEntry->limRFBand == SIR_BAND_2_4_GHZ) &&
 		(pftSessionEntry->htSupportedChannelWidthSet ==

+ 25 - 2
core/mac/src/pe/lim/lim_process_assoc_rsp_frame.c

@@ -810,11 +810,34 @@ lim_process_assoc_rsp_frame(tpAniSirGlobal mac_ctx,
 					timeout_value)) {
 				lim_log(mac_ctx, LOGE,
 					FL("Failed to start comeback timer."));
+
+				assoc_cnf.resultCode = eSIR_SME_ASSOC_REFUSED;
+				assoc_cnf.protStatusCode =
+					eSIR_MAC_UNSPEC_FAILURE_STATUS;
+
+				/*
+				 * Delete Pre-auth context for the
+				 * associated BSS
+				 */
+				if (lim_search_pre_auth_list(mac_ctx, hdr->sa))
+					lim_delete_pre_auth_node(mac_ctx,
+						hdr->sa);
+
+				goto assocReject;
 			}
 		} else {
 			lim_log(mac_ctx, LOGW,
-				FL("ASSOC resp with try again event recvd. "
-				"But try again time interval IE is wrong."));
+				FL("ASSOC resp with try again event recvd, but try again time interval IE is wrong"));
+
+			assoc_cnf.resultCode = eSIR_SME_ASSOC_REFUSED;
+			assoc_cnf.protStatusCode =
+				eSIR_MAC_UNSPEC_FAILURE_STATUS;
+
+			/* Delete Pre-auth context for the associated BSS */
+			if (lim_search_pre_auth_list(mac_ctx, hdr->sa))
+				lim_delete_pre_auth_node(mac_ctx, hdr->sa);
+
+			goto assocReject;
 		}
 		qdf_mem_free(beacon);
 		qdf_mem_free(assoc_rsp);