wlan: Process deauth from reassoc AP to trigger disconnect.
Existing PE/LIM code adopts "make before break" principle, whereas LFR
uses "break before make" policy. Upon receiving a deauth from
reassociating AP, PE/LIM attempts to change channel and switch to the
old AP. Since the previous session was already torn down (by SME during
fast roaming) soon after pre-auth, we fail to process channel switch
response due to no pLimMlmReassocReq and throw an assert. Due to this,
we land in a limbo state and never disconnect. This eventually leads to
several timeouts, HDD queue fill errors since HDD/supplicant still think
that there is an active connection.
This is being fixed by sending an assoc response confirmation with a
failure status to SME (upon receipt of deauth) so that SME layer
triggers the clean-up and tears down the connection.
Change-Id: I040b7cedb87e43647964fd438cf78f66ba683c53
CR-Fixed: 411088
diff --git a/CORE/MAC/src/pe/lim/limAssocUtils.c b/CORE/MAC/src/pe/lim/limAssocUtils.c
index a0807c3..dd10532 100644
--- a/CORE/MAC/src/pe/lim/limAssocUtils.c
+++ b/CORE/MAC/src/pe/lim/limAssocUtils.c
@@ -1394,6 +1394,28 @@
}
}
+void
+limPostReassocFailure(tpAniSirGlobal pMac,
+ tSirResultCodes resultCode,
+ tANI_U16 protStatusCode,tpPESession psessionEntry)
+{
+ tLimMlmReassocCnf mlmReassocCnf;
+
+ psessionEntry->limMlmState = eLIM_MLM_LINK_ESTABLISHED_STATE;
+ MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, eLIM_MLM_LINK_ESTABLISHED_STATE));
+
+ // 'Change' timer for future activations
+ limDeactivateAndChangeTimer(pMac, eLIM_REASSOC_FAIL_TIMER);
+
+ mlmReassocCnf.resultCode = resultCode;
+ mlmReassocCnf.protStatusCode = protStatusCode;
+ /* Update PE session Id */
+ mlmReassocCnf.sessionId = psessionEntry->peSessionId;
+ limPostSmeMessage(pMac,
+ LIM_MLM_REASSOC_CNF,
+ (tANI_U32 *) &mlmReassocCnf);
+} /*** end limPostReassocFailure() ***/
+
/**
* limRestorePreReassocState()
*