summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRajeev Kumar <rajekuma@qca.qualcomm.com>2014-07-20 21:07:56 -0700
committerAkash Patel <c_akashp@qca.qualcomm.com>2014-07-22 22:01:30 -0700
commit9ced17330a77104da65aa6234ecdeab145ec7c67 (patch)
tree0b7363265b607895bddc8b2746404cd67366fdbc
parentbc246399aa512f810c7fd87aada70a801a7e0883 (diff)
qcacld: Fix of scan list empty caused by deauth frames
Fix of race condition between deauth and ROAM preauth/ ROAM Re-assoc by dequeuing ROAM command from SME active list after CSR state is changed to IDLE state. Change-Id: I0a458226ec7fbc880d37f64221bdc7171f342cfd CRs-Fixed: 697004
-rw-r--r--CORE/SME/src/csr/csrApiRoam.c16
-rw-r--r--CORE/SME/src/csr/csrCmdProcess.c15
-rw-r--r--CORE/SME/src/csr/csrInsideApi.h2
-rw-r--r--CORE/SME/src/csr/csrNeighborRoam.c2
4 files changed, 29 insertions, 6 deletions
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index e3aeb34c3c47..e8c6e6a0828a 100644
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -6795,7 +6795,7 @@ eHalStatus csrRoamEnqueuePreauth(tpAniSirGlobal pMac, tANI_U32 sessionId, tpSirB
return (status);
}
-eHalStatus csrRoamDequeuePreauth(tpAniSirGlobal pMac)
+eHalStatus csrDequeueRoamCommand(tpAniSirGlobal pMac, eCsrRoamReason reason)
{
tListElem *pEntry;
tSmeCmd *pCommand;
@@ -6804,14 +6804,24 @@ eHalStatus csrRoamDequeuePreauth(tpAniSirGlobal pMac)
{
pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
if ( (eSmeCommandRoam == pCommand->command) &&
- (eCsrPerformPreauth == pCommand->u.roamCmd.roamReason))
+ (eCsrPerformPreauth == reason))
{
smsLog( pMac, LOG1, FL("DQ-Command = %d, Reason = %d"),
pCommand->command, pCommand->u.roamCmd.roamReason);
if (csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK )) {
csrReleaseCommandPreauth( pMac, pCommand );
}
- } else {
+ }
+ else if ((eSmeCommandRoam == pCommand->command) &&
+ (eCsrSmeIssuedFTReassoc == reason))
+ {
+ smsLog( pMac, LOG1, FL("DQ-Command = %d, Reason = %d"),
+ pCommand->command, pCommand->u.roamCmd.roamReason);
+ if (csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK )) {
+ csrReleaseCommandRoam( pMac, pCommand );
+ }
+ }
+ else {
smsLog( pMac, LOGE, FL("Command = %d, Reason = %d "),
pCommand->command, pCommand->u.roamCmd.roamReason);
}
diff --git a/CORE/SME/src/csr/csrCmdProcess.c b/CORE/SME/src/csr/csrCmdProcess.c
index ff05c32bf0ff..9e6cdb3da86c 100644
--- a/CORE/SME/src/csr/csrCmdProcess.c
+++ b/CORE/SME/src/csr/csrCmdProcess.c
@@ -158,7 +158,20 @@ eHalStatus csrMsgProcessor( tpAniSirGlobal pMac, void *pMsgBuf )
}
else
{
- smsLog(pMac, LOGW, " Message 0x%04X is not handled by CSR. CSR state is %d ", pSmeRsp->messageType, pMac->roam.curState[pSmeRsp->sessionId]);
+ smsLog(pMac, LOGE, "Message 0x%04X is not handled by CSR "
+ " CSR state is %d session Id %d", pSmeRsp->messageType,
+ pMac->roam.curState[pSmeRsp->sessionId], pSmeRsp->sessionId);
+
+ if (eWNI_SME_FT_PRE_AUTH_RSP == pSmeRsp->messageType) {
+ smsLog(pMac, LOGE, "Dequeue eSmeCommandRoam command"
+ " with reason eCsrPerformPreauth");
+ csrDequeueRoamCommand(pMac, eCsrPerformPreauth);
+ }
+ else if (eWNI_SME_REASSOC_RSP == pSmeRsp->messageType) {
+ smsLog(pMac, LOGE, "Dequeue eSmeCommandRoam command"
+ " with reason eCsrSmeIssuedFTReassoc");
+ csrDequeueRoamCommand(pMac, eCsrSmeIssuedFTReassoc);
+ }
}
break;
}
diff --git a/CORE/SME/src/csr/csrInsideApi.h b/CORE/SME/src/csr/csrInsideApi.h
index 46be5f9c1193..d6fc72f0cbc4 100644
--- a/CORE/SME/src/csr/csrInsideApi.h
+++ b/CORE/SME/src/csr/csrInsideApi.h
@@ -1000,7 +1000,7 @@ eHalStatus csrGetCurrentCountryCode(tpAniSirGlobal pMac, tANI_U8 *pCountry);
eHalStatus csrRoamEnqueuePreauth(tpAniSirGlobal pMac, tANI_U32 sessionId, tpSirBssDescription pBssDescription,
eCsrRoamReason reason, tANI_BOOLEAN fImmediate);
-eHalStatus csrRoamDequeuePreauth(tpAniSirGlobal pMac);
+eHalStatus csrDequeueRoamCommand(tpAniSirGlobal pMac, eCsrRoamReason reason);
#ifdef FEATURE_WLAN_LFR
void csrInitOccupiedChannelsList(tpAniSirGlobal pMac);
tANI_BOOLEAN csrNeighborRoamIsNewConnectedProfile(tpAniSirGlobal pMac);
diff --git a/CORE/SME/src/csr/csrNeighborRoam.c b/CORE/SME/src/csr/csrNeighborRoam.c
index 4062ae50845e..ebae4e53dc2c 100644
--- a/CORE/SME/src/csr/csrNeighborRoam.c
+++ b/CORE/SME/src/csr/csrNeighborRoam.c
@@ -1512,7 +1512,7 @@ eHalStatus csrNeighborRoamPreauthRspHandler(tpAniSirGlobal pMac, tSirRetStatus l
#endif
DEQ_PREAUTH:
- csrRoamDequeuePreauth(pMac);
+ csrDequeueRoamCommand(pMac, eCsrPerformPreauth);
return preauthProcessed;
}
#endif /* WLAN_FEATURE_NEIGHBOR_ROAMING */