wlan: Fix race condition in new cfg80211 APIs
Newly added cfg80211 APIs are not SSR protected; when SSR is in porgress
these APIs should be blocked.
Change-Id: Iafbb569808f645b7679548311cca5b2484eabee4
CR-Fixed: 409532
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 444787a..098d039 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -1712,6 +1712,12 @@
"%s: HDD adapter context is Null", __FUNCTION__);
return -ENODEV;
}
+ if ((WLAN_HDD_GET_CTX(pAdapter))->isLogpInProgress)
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s:LOGP in Progress. Ignore!!!", __func__);
+ return -EAGAIN;
+ }
pHddCtx = (hdd_context_t*)pAdapter->pHddCtx;
if (NULL == pHddCtx)
@@ -1846,6 +1852,11 @@
hddLog(VOS_TRACE_LEVEL_INFO_HIGH, "device mode=%d\n", pAdapter->device_mode);
+ if ((WLAN_HDD_GET_CTX(pAdapter))->isLogpInProgress)
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:LOGP in Progress. Ignore!!!",__func__);
+ return -EAGAIN;
+ }
if ((pAdapter->device_mode == WLAN_HDD_SOFTAP)
#ifdef WLAN_FEATURE_P2P
|| (pAdapter->device_mode == WLAN_HDD_P2P_GO)
@@ -1888,6 +1899,11 @@
hddLog(VOS_TRACE_LEVEL_INFO, "%s: device_mode = %d\n",
__func__, pAdapter->device_mode);
+ if ((WLAN_HDD_GET_CTX(pAdapter))->isLogpInProgress)
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:LOGP in Progress. Ignore!!!",__func__);
+ return -EAGAIN;
+ }
if ((pAdapter->device_mode == WLAN_HDD_SOFTAP)
#ifdef WLAN_FEATURE_P2P
@@ -3033,6 +3049,11 @@
hddLog(VOS_TRACE_LEVEL_INFO,
"%s: device_mode = %d freq = %d \n",__func__,
pAdapter->device_mode, chan->center_freq);
+ if ((WLAN_HDD_GET_CTX(pAdapter))->isLogpInProgress)
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:LOGP in Progress. Ignore!!!",__func__);
+ return -EAGAIN;
+ }
/*
* Do freq to chan conversion
diff --git a/CORE/HDD/src/wlan_hdd_p2p.c b/CORE/HDD/src/wlan_hdd_p2p.c
index 51ae0ce..da84f5b 100644
--- a/CORE/HDD/src/wlan_hdd_p2p.c
+++ b/CORE/HDD/src/wlan_hdd_p2p.c
@@ -232,6 +232,12 @@
return -EBUSY;
}
+ if (((hdd_context_t*)pAdapter->pHddCtx)->isLogpInProgress)
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s:LOGP in Progress. Ignore!!!", __func__);
+ return -EAGAIN;
+ }
pRemainChanCtx = vos_mem_malloc( sizeof(hdd_remain_on_chan_ctx_t) );
if( NULL == pRemainChanCtx )
{
@@ -359,6 +365,12 @@
hddLog( LOG1, "Cancel remain on channel req");
+ if (((hdd_context_t*)pAdapter->pHddCtx)->isLogpInProgress)
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s:LOGP in Progress. Ignore!!!", __func__);
+ return -EAGAIN;
+ }
/* FIXME cancel currently running remain on chan.
* Need to check cookie and cancel accordingly
*/
@@ -978,6 +990,16 @@
return NULL;
}
+ if (pHddCtx->isLogpInProgress)
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s:LOGP in Progress. Ignore!!!", __func__);
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38))
+ return NULL;
+#else
+ return -EAGAIN;
+#endif
+ }
if ( pHddCtx->cfg_ini->isP2pDeviceAddrAdministrated )
{
if( (NL80211_IFTYPE_P2P_GO == type) ||
@@ -1025,6 +1047,12 @@
hddLog(VOS_TRACE_LEVEL_INFO, "%s: device_mode = %d",
__func__,pVirtAdapter->device_mode);
+ if (pHddCtx->isLogpInProgress)
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s:LOGP in Progress. Ignore!!!", __func__);
+ return -EAGAIN;
+ }
wlan_hdd_release_intf_addr( pHddCtx,
pVirtAdapter->macAddressCurrent.bytes );