diff options
| author | Abhishek Singh <absingh@qti.qualcomm.com> | 2015-11-26 17:05:48 +0530 |
|---|---|---|
| committer | Anjaneedevi Kapparapu <akappa@codeaurora.org> | 2015-12-04 16:21:40 +0530 |
| commit | f78d94580efd6cd60d53ad5baa3f31342a97df64 (patch) | |
| tree | e0d72db048b8901055c7c34a24b49558db4865f4 | |
| parent | 38f1aa5597dad2ebf5a22e53812871e22d42ccfa (diff) | |
qcacld-2.0: Abort preauth if disconnect is received for the current AP.
prima to qcacld-2.0 propagation.
If preauth is in progress with too many APs in the roamable AP
list and at the same time disconnect is received from supplicant as
part of unload, the deauth req will be queued in sme pending list
till csr completes the preauth process.
Now as part of unload, driver may purge the sme pending command list
and with it the disconnect command may also get removed if preauth
takes too much time.
This will lead to DEL BSS missing before HAL STOP and thus crash.
To avoid this abort the preauth process once disconnect is received.
Change-Id: I1c35f0c7e38295cfadafdad69f0b9a99ba61404c
CRs-Fixed: 942579
| -rw-r--r-- | CORE/SME/src/csr/csrApiRoam.c | 2 | ||||
| -rw-r--r-- | CORE/SME/src/csr/csrInsideApi.h | 2 | ||||
| -rw-r--r-- | CORE/SME/src/csr/csrNeighborRoam.c | 11 |
3 files changed, 14 insertions, 1 deletions
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c index 3f270a1fdc27..34164bff7956 100644 --- a/CORE/SME/src/csr/csrApiRoam.c +++ b/CORE/SME/src/csr/csrApiRoam.c @@ -7858,7 +7858,7 @@ eHalStatus csrRoamSaveConnectedInfomation(tpAniSirGlobal pMac, tANI_U32 sessionI } -static boolean is_disconnect_pending(tpAniSirGlobal pmac, +boolean is_disconnect_pending(tpAniSirGlobal pmac, uint8_t sessionid) { tListElem *entry = NULL; diff --git a/CORE/SME/src/csr/csrInsideApi.h b/CORE/SME/src/csr/csrInsideApi.h index 071d0120e663..bc0742373e42 100644 --- a/CORE/SME/src/csr/csrInsideApi.h +++ b/CORE/SME/src/csr/csrInsideApi.h @@ -1064,6 +1064,8 @@ void csrClearVotesForCountryInfo(tpAniSirGlobal pMac); eHalStatus csr_send_ext_change_channel(tpAniSirGlobal mac_ctx, uint32_t channel, uint8_t session_id); +boolean is_disconnect_pending(tpAniSirGlobal pmac, uint8_t sessionid); + #ifdef QCA_HT_2040_COEX eHalStatus csrSetHT2040Mode(tpAniSirGlobal pMac, tANI_U32 sessionId, ePhyChanBondState cbMode, tANI_BOOLEAN obssEnabled); diff --git a/CORE/SME/src/csr/csrNeighborRoam.c b/CORE/SME/src/csr/csrNeighborRoam.c index d726de255530..9aa6dd950022 100644 --- a/CORE/SME/src/csr/csrNeighborRoam.c +++ b/CORE/SME/src/csr/csrNeighborRoam.c @@ -1579,6 +1579,7 @@ eHalStatus csrNeighborRoamPreauthRspHandler(tpAniSirGlobal pMac, { tpCsrNeighborRoamBSSInfo pNeighborBssNode = NULL; tListElem *pEntry; + bool is_dis_pending = false; smsLog(pMac, LOGE, FL("Preauth failed retry number %d, status = 0x%x"), pNeighborRoamInfo->FTRoamInfo.numPreAuthRetries, limStatus); @@ -1631,11 +1632,21 @@ eHalStatus csrNeighborRoamPreauthRspHandler(tpAniSirGlobal pMac, } } + is_dis_pending = is_disconnect_pending(pMac, sessionId); + if (is_dis_pending) { + smsLog(pMac, LOGE, + FL(" Disconnect in progress, Abort preauth")); + goto abort_preauth; + } + + + /* Issue preauth request for the same/next entry */ if (eHAL_STATUS_SUCCESS == csrNeighborRoamIssuePreauthReq(pMac, sessionId)) goto DEQ_PREAUTH; +abort_preauth: #ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD if (csrRoamIsRoamOffloadScanEnabled(pMac)) { |
