Merge "wlan: hdd: send protocol reason code for auth fail"
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index 56cdab8..f8bfbe9 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -220,6 +220,16 @@
#define CFG_IMPS_MAXIMUM_SLEEP_TIME_MAX ( 65535 )
#define CFG_IMPS_MAXIMUM_SLEEP_TIME_DEFAULT ( 15 )
+/*If there is scan on STA interface back to back with
+ *time diff nDeferScanTimeInterval, driver will not
+ *issue a new scan. Driver will return cached result to kernel.
+ *the interval is in msec
+ */
+#define CFG_DEFER_SCAN_TIME_INTERVAL "gDeferScanTimeInterval"
+#define CFG_DEFER_SCAN_TIME_INTERVAL_MIN ( 0 )
+#define CFG_DEFER_SCAN_TIME_INTERVAL_MAX ( 65535 )
+#define CFG_DEFER_SCAN_TIME_INTERVAL_DEFAULT ( 2000 )
+
//BMPS = BeaconModePowerSave
#define CFG_ENABLE_BMPS_NAME "gEnableBmps"
#define CFG_ENABLE_BMPS_MIN ( 0 )
@@ -2393,6 +2403,7 @@
v_BOOL_t ShortSlotTimeEnabled;
v_BOOL_t Is11dSupportEnabled;
v_BOOL_t Is11hSupportEnabled;
+ v_U32_t nDeferScanTimeInterval;
v_BOOL_t fEnforce11dChannels;
v_BOOL_t fSupplicantCountryCodeHasPriority;
v_BOOL_t fEnforceCountryCodeMatch;
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index df67b4e..ebf03cf 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -767,6 +767,10 @@
hdd_scan_pending_option_e scan_pending_option;
tANI_U8 sessionId;
+ /* time to store last station scan done. */
+ v_TIME_t last_scan_timestamp;
+ tANI_U8 last_scan_channelList[WNI_CFG_VALID_CHANNEL_LIST_LEN];
+ tANI_U8 last_scan_numChannels;
}hdd_scaninfo_t;
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index ef1b2a6..5acb5b6 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -417,6 +417,13 @@
CFG_IMPS_MAXIMUM_SLEEP_TIME_MIN,
CFG_IMPS_MAXIMUM_SLEEP_TIME_MAX ),
+ REG_VARIABLE( CFG_DEFER_SCAN_TIME_INTERVAL, WLAN_PARAM_Integer,
+ hdd_config_t, nDeferScanTimeInterval,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_DEFER_SCAN_TIME_INTERVAL_DEFAULT,
+ CFG_DEFER_SCAN_TIME_INTERVAL_MIN,
+ CFG_DEFER_SCAN_TIME_INTERVAL_MAX ),
+
REG_VARIABLE( CFG_IMPS_MODERATE_SLEEP_TIME_NAME, WLAN_PARAM_Integer,
hdd_config_t, nImpsModSleepTime,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -3617,7 +3624,8 @@
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gRoamtoDFSChannel] Value = [%u] ",pHddCtx->cfg_ini->allowDFSChannelRoam);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gMaxConcurrentActiveSessions] Value = [%u] ", pHddCtx->cfg_ini->gMaxConcurrentActiveSessions);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gAcsScanBandPreference] Value = [%u] ",pHddCtx->cfg_ini->acsScanBandPreference);
- VOS_TRACE (VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,"Name = [gACSBandSwitchThreshold] value = [%u]\n",pHddCtx->cfg_ini->acsBandSwitchThreshold);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gACSBandSwitchThreshold] value = [%u]\n",pHddCtx->cfg_ini->acsBandSwitchThreshold);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gDeferScanTimeInterval] value = [%u]\n",pHddCtx->cfg_ini->nDeferScanTimeInterval);
}
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index cf86cab..ae0a6b5 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -9426,6 +9426,7 @@
int ret = 0;
bool aborted = false;
long waitRet = 0;
+ tANI_U8 i;
ENTER();
@@ -9510,6 +9511,27 @@
/* Scan is no longer pending */
pScanInfo->mScanPending = VOS_FALSE;
+ /* last_scan_timestamp is used to decide if new scan
+ * is needed or not on station interface. If last station
+ * scan time and new station scan time is less then
+ * last_scan_timestamp ; driver will return cached scan.
+ */
+ if (req->no_cck == FALSE && status == eCSR_SCAN_SUCCESS) // no_cck will be set during p2p find
+ {
+ pScanInfo->last_scan_timestamp = vos_timer_get_system_time();
+
+ if ( req->n_channels )
+ {
+ for (i = 0; i < req->n_channels ; i++ )
+ {
+ pHddCtx->scan_info.last_scan_channelList[i] = req->channels[i]->hw_value;
+ }
+ /* store no of channel scanned */
+ pHddCtx->scan_info.last_scan_numChannels= req->n_channels;
+ }
+
+ }
+
/*
* cfg80211_scan_done informing NL80211 about completion
* of scanning
@@ -9656,6 +9678,7 @@
int status;
hdd_scaninfo_t *pScanInfo = NULL;
v_U8_t* pP2pIe = NULL;
+ int ret = 0;
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))
struct net_device *dev = NULL;
@@ -9786,6 +9809,7 @@
hddLog(VOS_TRACE_LEVEL_INFO, "scan request for ssid = %d",
(int)request->n_ssids);
+
/* Even though supplicant doesn't provide any SSIDs, n_ssids is set to 1.
* Becasue of this, driver is assuming that this is not wildcard scan and so
* is not aging out the scan results.
@@ -9888,6 +9912,39 @@
/* set requestType to full scan */
scanRequest.requestType = eCSR_SCAN_REQUEST_FULL_SCAN;
+ /* if there is back to back scan happening in driver with in
+ * nDeferScanTimeInterval interval driver should defer new scan request
+ * and should provide last cached scan results instead of new channel list.
+ * This rule is not applicable if scan is p2p scan.
+ * This condition will work only in case when last request no of channels
+ * and channels are exactly same as new request.
+ */
+ if (pScanInfo->last_scan_timestamp !=0 &&
+ (FALSE == request->no_cck) && // no_cck is set during p2p find.
+ ((vos_timer_get_system_time() - pScanInfo->last_scan_timestamp ) < pHddCtx->cfg_ini->nDeferScanTimeInterval))
+ {
+ if (pScanInfo->last_scan_numChannels == scanRequest.ChannelInfo.numOfChannels &&
+ vos_mem_compare(pScanInfo->last_scan_channelList,
+ channelList, pScanInfo->last_scan_numChannels))
+ {
+ hddLog(VOS_TRACE_LEVEL_WARN,
+ " New and old station scan time differ is less then %u",
+ pHddCtx->cfg_ini->nDeferScanTimeInterval);
+
+ ret = wlan_hdd_cfg80211_update_bss((WLAN_HDD_GET_CTX(pAdapter))->wiphy,
+ pAdapter);
+
+ hddLog(VOS_TRACE_LEVEL_WARN,
+ "Return old cached scan as all channels"
+ "and no of channles are same");
+ if (0 > ret)
+ hddLog(VOS_TRACE_LEVEL_INFO, "%s: NO SCAN result", __func__);
+
+ cfg80211_scan_done(request, eCSR_SCAN_SUCCESS);
+ return eHAL_STATUS_SUCCESS ;
+ }
+ }
+
/* Flush the scan results(only p2p beacons) for STA scan and P2P
* search (Flush on both full scan and social scan but not on single
* channel scan).P2P search happens on 3 social channels (1, 6, 11)
diff --git a/CORE/HDD/src/wlan_hdd_hostapd.c b/CORE/HDD/src/wlan_hdd_hostapd.c
index 8919893..0d88f2e 100644
--- a/CORE/HDD/src/wlan_hdd_hostapd.c
+++ b/CORE/HDD/src/wlan_hdd_hostapd.c
@@ -171,8 +171,18 @@
--------------------------------------------------------------------------*/
int hdd_hostapd_open (struct net_device *dev)
{
+ hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
+
ENTER();
+ if(!test_bit(SOFTAP_BSS_STARTED, &pAdapter->event_flags))
+ {
+ //WMM_INIT OR BSS_START not completed
+ hddLog( LOGW, "Ignore hostadp open request");
+ EXIT();
+ return 0;
+ }
+
MTRACE(vos_trace(VOS_MODULE_ID_HDD,
TRACE_CODE_HDD_HOSTAPD_OPEN_REQUEST, NO_SESSION, 0));
//Turn ON carrier state
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 80bebbc..ab6df87 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -7193,6 +7193,11 @@
clear_bit(WMM_INIT_DONE, &pAdapter->event_flags);
}
+ if (test_bit(SOFTAP_BSS_STARTED, &pAdapter->event_flags))
+ {
+ clear_bit(SOFTAP_BSS_STARTED, &pAdapter->event_flags);
+ }
+
#ifdef FEATURE_WLAN_BATCH_SCAN
if (eHDD_BATCH_SCAN_STATE_STARTED == pAdapter->batchScanState)
{
diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c
index b1e534d..49d6f09 100644
--- a/CORE/WDA/src/wlan_qct_wda.c
+++ b/CORE/WDA/src/wlan_qct_wda.c
@@ -7998,18 +7998,65 @@
}
return CONVERT_WDI2VOS_STATUS(status) ;
}
+
+/*
+ * FUNCTION: WDA_ExitImpsRespCallback
+ * send Exit IMPS RSP back to PE
+ */
+void WDA_ExitImpsRespCallback(WDI_Status status, void* pUserData)
+{
+ tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
+ tWDA_CbContext *pWDA;
+
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+ "<------ %s " ,__func__);
+
+ if (NULL == pWdaParams)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: pWdaParams received NULL", __func__);
+ VOS_ASSERT(0);
+ return;
+ }
+ pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
+
+ vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
+ vos_mem_free(pWdaParams);
+
+ WDA_SendMsg(pWDA, WDA_EXIT_IMPS_RSP, NULL , (status));
+ return;
+}
+
/*
* FUNCTION: WDA_ExitImpsReqCallback
- * send Exit IMPS RSP back to PE
*/
void WDA_ExitImpsReqCallback(WDI_Status status, void* pUserData)
{
- tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
+ tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
"<------ %s " ,__func__);
- WDA_SendMsg(pWDA, WDA_EXIT_IMPS_RSP, NULL , (status)) ;
- return ;
+ if(NULL == pWdaParams)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: pWdaParams received NULL", __func__);
+ VOS_ASSERT(0);
+ return;
+ }
+
+ if (IS_WDI_STATUS_FAILURE(status))
+ {
+ vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
+ vos_mem_free(pWdaParams);
+ if (WDI_STATUS_DEV_INTERNAL_FAILURE == status)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ FL("reload wlan driver"));
+ wpalWlanReload();
+ }
+ }
+ return;
}
+
/*
* FUNCTION: WDA_ProcessExitImpsReq
* Request to WDI to Exit IMPS power state.
@@ -8017,23 +8064,47 @@
VOS_STATUS WDA_ProcessExitImpsReq(tWDA_CbContext *pWDA)
{
WDI_Status status = WDI_STATUS_SUCCESS ;
+ tWDA_ReqParams *pWdaParams;
+ WDI_ExitImpsReqParamsType *wdiExitImpsReqParams;
+
VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
"------> %s " ,__func__);
- status = WDI_ExitImpsReq((WDI_ExitImpsRspCb)WDA_ExitImpsReqCallback, pWDA);
- if(IS_WDI_STATUS_FAILURE(status))
+ wdiExitImpsReqParams = (WDI_ExitImpsReqParamsType *)vos_mem_malloc(
+ sizeof(WDI_ExitImpsReqParamsType));
+ if (NULL == wdiExitImpsReqParams)
{
- if (WDI_STATUS_DEV_INTERNAL_FAILURE == status)
- {
- VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
- FL("reload wlan driver"));
- wpalWlanReload();
- }
- else
- {
- VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
- "Failure in Exit IMPS REQ WDI API, free all the memory " );
- WDA_SendMsg(pWDA, WDA_EXIT_IMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
- }
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: VOS MEM Alloc Failure", __func__);
+ VOS_ASSERT(0);
+ return VOS_STATUS_E_NOMEM;
+ }
+ pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams));
+ if(NULL == pWdaParams)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: VOS MEM Alloc Failure", __func__);
+ VOS_ASSERT(0);
+ vos_mem_free(wdiExitImpsReqParams);
+ return VOS_STATUS_E_NOMEM;
+ }
+ wdiExitImpsReqParams->wdiReqStatusCB = WDA_ExitImpsReqCallback;
+ wdiExitImpsReqParams->pUserData = pWdaParams;
+
+ /* Store param pointer as passed in by caller */
+ /* store Params pass it to WDI */
+ pWdaParams->wdaWdiApiMsgParam = wdiExitImpsReqParams;
+ pWdaParams->pWdaContext = pWDA;
+ pWdaParams->wdaMsgParam = wdiExitImpsReqParams;
+ status = WDI_ExitImpsReq(wdiExitImpsReqParams,
+ (WDI_ExitImpsRspCb)WDA_ExitImpsRespCallback,
+ pWdaParams);
+ if (IS_WDI_STATUS_FAILURE(status))
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "Failure in Exit IMPS REQ WDI API, free all the memory " );
+ vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
+ vos_mem_free(pWdaParams);
+ WDA_SendMsg(pWDA, WDA_EXIT_IMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
}
return CONVERT_WDI2VOS_STATUS(status) ;
}
diff --git a/CORE/WDI/CP/inc/wlan_qct_wdi.h b/CORE/WDI/CP/inc/wlan_qct_wdi.h
index a9cd910..1cd9fae 100644
--- a/CORE/WDI/CP/inc/wlan_qct_wdi.h
+++ b/CORE/WDI/CP/inc/wlan_qct_wdi.h
@@ -3801,6 +3801,20 @@
}WDI_EnterImpsReqParamsType;
/*---------------------------------------------------------------------------
+ WDI_ExitImpsReqParamsType
+ Exit IMPS parameters passed to WDI from WDA
+----------------------------------------------------------------------------*/
+typedef struct
+{
+ /*Request status callback offered by UMAC */
+ WDI_ReqStatusCb wdiReqStatusCB;
+ /*The user data passed in by UMAC, it will be sent back when the above
+ function pointer will be called */
+ void* pUserData;
+
+}WDI_ExitImpsReqParamsType;
+
+/*---------------------------------------------------------------------------
WDI_EnterBmpsReqParamsType
Enter BMPS parameters passed from WDI to WDA
---------------------------------------------------------------------------*/
@@ -9022,6 +9036,7 @@
WDI_Status
WDI_ExitImpsReq
(
+ WDI_ExitImpsReqParamsType *pwdiExitImpsReqParams,
WDI_ExitImpsRspCb wdiExitImpsRspCb,
void* pUserData
);
diff --git a/CORE/WDI/CP/src/wlan_qct_wdi.c b/CORE/WDI/CP/src/wlan_qct_wdi.c
index dc04d81..9f50dd8 100644
--- a/CORE/WDI/CP/src/wlan_qct_wdi.c
+++ b/CORE/WDI/CP/src/wlan_qct_wdi.c
@@ -3759,6 +3759,7 @@
WDI_Status
WDI_ExitImpsReq
(
+ WDI_ExitImpsReqParamsType *pwdiExitImpsReqParams,
WDI_ExitImpsRspCb wdiExitImpsRspCb,
void* pUserData
)
@@ -3781,8 +3782,8 @@
Fill in Event data and post to the Main FSM
------------------------------------------------------------------------*/
wdiEventData.wdiRequest = WDI_EXIT_IMPS_REQ;
- wdiEventData.pEventData = NULL;
- wdiEventData.uEventDataSize = 0;
+ wdiEventData.pEventData = pwdiExitImpsReqParams;
+ wdiEventData.uEventDataSize = sizeof(*pwdiExitImpsReqParams);
wdiEventData.pCBfnc = wdiExitImpsRspCb;
wdiEventData.pUserData = pUserData;
@@ -13797,13 +13798,16 @@
wpt_uint8* pSendBuffer = NULL;
wpt_uint16 usDataOffset = 0;
wpt_uint16 usSendSize = 0;
+ WDI_ExitImpsReqParamsType *pwdiExitImpsReqParams = NULL;
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/*-------------------------------------------------------------------------
Sanity check
-------------------------------------------------------------------------*/
if (( NULL == pEventData ) ||
- ( NULL == (wdiExitImpsRspCb = (WDI_ExitImpsRspCb)pEventData->pCBfnc)))
+ ( NULL == (wdiExitImpsRspCb = (WDI_ExitImpsRspCb)pEventData->pCBfnc)) ||
+ (NULL == (pwdiExitImpsReqParams =
+ (WDI_ExitImpsReqParamsType*)pEventData->pEventData)))
{
WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
"%s: Invalid parameters", __func__);
@@ -13826,7 +13830,8 @@
WDI_ASSERT(0);
return WDI_STATUS_E_FAILURE;
}
-
+ pWDICtx->wdiReqStatusCB = pwdiExitImpsReqParams->wdiReqStatusCB;
+ pWDICtx->pReqStatusUserData = pwdiExitImpsReqParams->pUserData;
/*-------------------------------------------------------------------------
Send Get STA Request to HAL
-------------------------------------------------------------------------*/
@@ -22083,7 +22088,8 @@
WDI_getRespMsgString(pWDICtx->wdiExpectedResponse),
pWDICtx->wdiExpectedResponse);
- wdiStatus = WDI_STATUS_E_FAILURE;
+ wdiStatus = (ret == eWLAN_PAL_STATUS_E_FAILURE) ?
+ WDI_STATUS_DEV_INTERNAL_FAILURE : WDI_STATUS_E_FAILURE;
}
else
{
@@ -22116,8 +22122,10 @@
(wdiStatus) to WDI_STATUS_PENDING. This makes sure that WDA doesnt
end up repeating the functonality in the req callback for the
WDI_STATUS_E_FAILURE case*/
- if (wdiStatus == WDI_STATUS_E_FAILURE)
+ if (wdiStatus != WDI_STATUS_SUCCESS)
+ {
wdiStatus = WDI_STATUS_PENDING;
+ }
}
if ( wdiStatus == WDI_STATUS_SUCCESS )
@@ -22133,10 +22141,6 @@
{
/*Inform upper stack layers that a transport fatal error occurred*/
WDI_DetectedDeviceError(pWDICtx, WDI_ERR_TRANSPORT_FAILURE);
- if (eWLAN_PAL_STATUS_E_FAILURE == ret)
- {
- wdiStatus = WDI_STATUS_DEV_INTERNAL_FAILURE;
- }
}
return wdiStatus;