wlan: serialize ula callback initialization
Serialize ULA callback initialization between
MC Thread and TX Thread to avoid race condition.
CRs-Fixed: 806914
Change-Id: I6c53339f40225b165a57f197a61dfe128b07da5f
diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c
index e6cb53b..632c6d6 100644
--- a/CORE/HDD/src/wlan_hdd_wext.c
+++ b/CORE/HDD/src/wlan_hdd_wext.c
@@ -1277,10 +1277,10 @@
{
hdd_adapter_t *pAdapter = (hdd_adapter_t*)callbackContext;
- if (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic)
+ if ( (pAdapter == NULL) || (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic))
{
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "%s: Invalid pAdapter magic", __func__);
+ "%s: Invalid pAdapter magic/ pAdapter is NULL", __func__);
}
else
{
diff --git a/CORE/TL/src/wlan_qct_tl.c b/CORE/TL/src/wlan_qct_tl.c
index 3378207..3b9761a 100644
--- a/CORE/TL/src/wlan_qct_tl.c
+++ b/CORE/TL/src/wlan_qct_tl.c
@@ -1150,17 +1150,37 @@
return VOS_STATUS_E_FAILURE;
}
+ if (!VOS_IS_STATUS_SUCCESS(vos_lock_acquire(&(pClientSTA->ulaLock))))
+ {
+ TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
+ "%s Get ULA Lock Fail", __func__));
+ return VOS_STATUS_E_FAILURE;
+ }
+
if (pClientSTA->isEapolM4Transmitted ||
pClientSTA->tlState == WLANTL_STA_AUTHENTICATED)
{
TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO,
"WLAN TL: M4 is already received on %s", __func__));
+ if (!VOS_IS_STATUS_SUCCESS(vos_lock_release(&(pClientSTA->ulaLock))))
+ {
+ TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
+ "%s Release ULA Lock Fail", __func__));
+ return VOS_STATUS_E_FAILURE;
+ }
return VOS_STATUS_E_ALREADY;
}
pClientSTA->pfnSTAUlaComplete = (WLANTL_STAUlaCompleteCBType) callbackRoutine;
pClientSTA->pUlaCBCtx = callbackContext;
+ if (!VOS_IS_STATUS_SUCCESS(vos_lock_release(&(pClientSTA->ulaLock))))
+ {
+ TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
+ "%s Release ULA Lock Fail", __func__));
+ return VOS_STATUS_E_FAILURE;
+ }
+
return VOS_STATUS_SUCCESS;
}
@@ -1308,6 +1328,7 @@
pClientSTA->wSTADesc.ucSTAId = pwSTADescType->ucSTAId;
pClientSTA->ptkInstalled = 0;
pClientSTA->isEapolM4Transmitted = 0;
+ vos_lock_init(&pClientSTA->ulaLock);
TLLOG2(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
"WLAN TL:Registering STA Client ID: %d with UC %d and BC %d",
@@ -1601,6 +1622,8 @@
vos_lock_destroy(&pTLCb->atlSTAClients[ucSTAId]->atlBAReorderInfo[ucIndex].reorderLock);
}
+ /* delete ulaLock*/
+ vos_lock_destroy(&pTLCb->atlSTAClients[ucSTAId]->ulaLock);
#ifdef FEATURE_WLAN_TDLS
/* decrement ucTdlsPeerCount only if it is non-zero */
if(WLAN_STA_TDLS == pTLCb->atlSTAClients[ucSTAId]->wSTADesc.wSTAType
@@ -7655,11 +7678,25 @@
// call ULA complete once M4 BD is filled.
if (tlMetaInfo.ucEapolSubType == EAPOL_M4)
{
+ if (!VOS_IS_STATUS_SUCCESS(vos_lock_acquire(&(pClientSTA->ulaLock))))
+ {
+ TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
+ "%s Get ULA Lock Fail", __func__));
+ return VOS_STATUS_E_FAILURE;
+ }
+
pClientSTA->isEapolM4Transmitted = 1;
if (pClientSTA->pfnSTAUlaComplete)
pClientSTA->pfnSTAUlaComplete(pClientSTA->pUlaCBCtx);
pClientSTA->pfnSTAUlaComplete = NULL;
pClientSTA->pUlaCBCtx = NULL;
+
+ if (!VOS_IS_STATUS_SUCCESS(vos_lock_release(&(pClientSTA->ulaLock))))
+ {
+ TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
+ "%s Release ULA Lock Fail", __func__));
+ return VOS_STATUS_E_FAILURE;
+ }
}
/*-----------------------------------------------------------------------
diff --git a/CORE/TL/src/wlan_qct_tli.h b/CORE/TL/src/wlan_qct_tli.h
index 93794d2..07852da 100644
--- a/CORE/TL/src/wlan_qct_tli.h
+++ b/CORE/TL/src/wlan_qct_tli.h
@@ -688,6 +688,7 @@
/* Flag to check EAPOL 4/4 recevied by TL*/
v_U8_t isEapolM4Transmitted;
+ vos_lock_t ulaLock;
v_U32_t linkCapacity;