diff --git a/core/mac/src/pe/include/lim_session.h b/core/mac/src/pe/include/lim_session.h index 5d27af28a009..4b0ebe7c459f 100644 --- a/core/mac/src/pe/include/lim_session.h +++ b/core/mac/src/pe/include/lim_session.h @@ -483,6 +483,7 @@ typedef struct sPESession /* Added to Support BT-AMP */ /* flag to indicate country code in beacon */ uint8_t country_info_present; uint8_t nss; + bool add_bss_failed; } tPESession, *tpPESession; /*------------------------------------------------------------------------- diff --git a/core/mac/src/pe/lim/lim_assoc_utils.c b/core/mac/src/pe/lim/lim_assoc_utils.c index c981c28b1d50..3cd37489f05a 100644 --- a/core/mac/src/pe/lim/lim_assoc_utils.c +++ b/core/mac/src/pe/lim/lim_assoc_utils.c @@ -671,13 +671,16 @@ lim_cleanup_rx_path(tpAniSirGlobal pMac, tpDphHashNode pStaDs, /* increment a debug count */ pMac->lim.gLimNumRxCleanup++; #endif - - if (psessionEntry->limSmeState == eLIM_SME_JOIN_FAILURE_STATE) { - retCode = - lim_del_bss(pMac, pStaDs, psessionEntry->bssIdx, - psessionEntry); - } else - retCode = lim_del_sta(pMac, pStaDs, true, psessionEntry); + /* Do DEL BSS or DEL STA only if ADD BSS was success */ + if (!psessionEntry->add_bss_failed) { + if (psessionEntry->limSmeState == eLIM_SME_JOIN_FAILURE_STATE) { + retCode = + lim_del_bss(pMac, pStaDs, psessionEntry->bssIdx, + psessionEntry); + } else + retCode = lim_del_sta(pMac, + pStaDs, true, psessionEntry); + } return retCode; diff --git a/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c b/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c index 0fe37fe6da02..a4afe4c5f3d6 100644 --- a/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c +++ b/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c @@ -1546,12 +1546,19 @@ lim_handle_sme_join_result(tpAniSirGlobal mac_ctx, * to SME */ lim_cleanup_rx_path(mac_ctx, sta_ds, session_entry); + /* Cleanup if add bss failed */ + if (session_entry->add_bss_failed) { + dph_delete_hash_entry(mac_ctx, + sta_ds->staAddr, sta_ds->assocId, + &session_entry->dph.dphHashTable); + goto error; + } cdf_mem_free(session_entry->pLimJoinReq); session_entry->pLimJoinReq = NULL; return; } } - +error: cdf_mem_free(session_entry->pLimJoinReq); session_entry->pLimJoinReq = NULL; /* Delete teh session if JOIN failure occurred. */ @@ -1624,9 +1631,17 @@ lim_handle_sme_reaasoc_result(tpAniSirGlobal pMac, tSirResultCodes resultCode, pStaDs->mlmStaContext.resultCode = resultCode; pStaDs->mlmStaContext.protStatusCode = protStatusCode; lim_cleanup_rx_path(pMac, pStaDs, psessionEntry); + /* Cleanup if add bss failed */ + if (psessionEntry->add_bss_failed) { + dph_delete_hash_entry(pMac, + pStaDs->staAddr, pStaDs->assocId, + &psessionEntry->dph.dphHashTable); + goto error; + } return; } } +error: /* Delete teh session if REASSOC failure occurred. */ if (resultCode != eSIR_SME_SUCCESS) { if (NULL != psessionEntry) { @@ -3056,6 +3071,7 @@ lim_process_sta_mlm_add_bss_rsp(tpAniSirGlobal mac_ctx, else mlm_assoc_cnf.resultCode = (tSirResultCodes) eSIR_SME_REFUSED; + session_entry->add_bss_failed = true; } if (mlm_assoc_cnf.resultCode != eSIR_SME_SUCCESS) {