diff options
| author | Agrawal Ashish <ashishka@qti.qualcomm.com> | 2016-03-09 18:59:04 +0530 |
|---|---|---|
| committer | Anjaneedevi Kapparapu <akappa@codeaurora.org> | 2016-07-12 16:41:22 +0530 |
| commit | e6596d488894e07acb66769d15dd8a975dfd9922 (patch) | |
| tree | 78327e025bb81e946e604c87efd82b5bb5be9211 | |
| parent | e8f621788605c385651529b858342ae70edea53a (diff) | |
qcacld-2.0: Fix firmware assertion caused by vdev delete
qcacld-3.0 to qcacld-2.0 propagation
Currently the SME session is deleted during interface change API and
a new session is not opened until SAP is ready to start. This will
cause crash when scan API is invoked. This fix opens the SME session
after interface type is changed, so that it can be used to scan and
SAP later.
Change-Id: I3c4f8da14dbc70a3102fb1892bb101eb1a90a00d
CRs-fixed: 968572
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_assoc.c | 1 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_hostapd.c | 22 | ||||
| -rwxr-xr-x | CORE/HDD/src/wlan_hdd_main.c | 69 | ||||
| -rw-r--r-- | CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c | 3 | ||||
| -rw-r--r-- | CORE/SAP/inc/sapApi.h | 5 | ||||
| -rw-r--r-- | CORE/SAP/src/sapApiLinkCntl.c | 22 | ||||
| -rw-r--r-- | CORE/SAP/src/sapFsm.c | 150 | ||||
| -rw-r--r-- | CORE/SAP/src/sapInternal.h | 9 | ||||
| -rw-r--r-- | CORE/SAP/src/sapModule.c | 147 |
9 files changed, 201 insertions, 227 deletions
diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c index cbef5df7accd..65ec664f2edb 100644 --- a/CORE/HDD/src/wlan_hdd_assoc.c +++ b/CORE/HDD/src/wlan_hdd_assoc.c @@ -3832,6 +3832,7 @@ hdd_smeRoamCallback(void *pContext, tCsrRoamInfo *pRoamInfo, tANI_U32 roamId, case eCSR_ROAM_SESSION_OPENED: set_bit(SME_SESSION_OPENED, &pAdapter->event_flags); complete(&pAdapter->session_open_comp_var); + hddLog(LOG1, FL("session %d opened"), pAdapter->sessionId); break; #if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR) diff --git a/CORE/HDD/src/wlan_hdd_hostapd.c b/CORE/HDD/src/wlan_hdd_hostapd.c index 480aafb07d5b..042ecda1c346 100644 --- a/CORE/HDD/src/wlan_hdd_hostapd.c +++ b/CORE/HDD/src/wlan_hdd_hostapd.c @@ -6579,6 +6579,8 @@ VOS_STATUS hdd_init_ap_mode( hdd_adapter_t *pAdapter ) v_CONTEXT_t pVosContext = (WLAN_HDD_GET_CTX(pAdapter))->pvosContext; v_CONTEXT_t sapContext=NULL; enum dfs_mode mode; + tVOS_CON_MODE device_mode; + uint32_t session_id = CSR_SESSION_ID_INVALID; #endif int ret; @@ -6608,13 +6610,27 @@ VOS_STATUS hdd_init_ap_mode( hdd_adapter_t *pAdapter ) wlan_hdd_get_dfs_mode(mode); - status = WLANSAP_Start(sapContext); + if (pAdapter->device_mode == WLAN_HDD_P2P_GO) { + device_mode = VOS_P2P_GO_MODE; + } else if (pAdapter->device_mode == WLAN_HDD_SOFTAP) { + device_mode = VOS_STA_SAP_MODE; + } else { + VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, + FL("Invalid device_mode for AP: %d"), pAdapter->device_mode); + return VOS_STATUS_E_FAILURE; + } + + status = WLANSAP_Start(sapContext, device_mode, + pAdapter->macAddressCurrent.bytes, + &session_id); if ( ! VOS_IS_STATUS_SUCCESS( status ) ) { VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: WLANSAP_Start failed!!")); WLANSAP_Close(sapContext); + pAdapter->sessionCtx.ap.sapContext = NULL; return status; } + pAdapter->sessionId = session_id; #endif // Allocate the Wireless Extensions state structure @@ -6632,6 +6648,7 @@ VOS_STATUS hdd_init_ap_mode( hdd_adapter_t *pAdapter ) VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,("ERROR: hdd_set_hostapd failed!!")); #ifdef WLAN_FEATURE_MBSSID WLANSAP_Close(sapContext); + pAdapter->sessionCtx.ap.sapContext = NULL; #endif return status; } @@ -6642,6 +6659,7 @@ VOS_STATUS hdd_init_ap_mode( hdd_adapter_t *pAdapter ) VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: Hostapd HDD vos event init failed!!")); #ifdef WLAN_FEATURE_MBSSID WLANSAP_Close(sapContext); + pAdapter->sessionCtx.ap.sapContext = NULL; #endif return status; } @@ -6654,6 +6672,7 @@ VOS_STATUS hdd_init_ap_mode( hdd_adapter_t *pAdapter ) "ERROR: Hostapd HDD stop bss event init failed!!"); #ifdef WLAN_FEATURE_MBSSID WLANSAP_Close(sapContext); + pAdapter->sessionCtx.ap.sapContext = NULL; #endif return status; } @@ -6705,6 +6724,7 @@ error_wmm_init: hdd_softap_deinit_tx_rx( pAdapter ); #ifdef WLAN_FEATURE_MBSSID WLANSAP_Close(sapContext); + pAdapter->sessionCtx.ap.sapContext = NULL; #endif EXIT(); return status; diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c index d30ed2fbd7a0..f6bfb51c6ce0 100755 --- a/CORE/HDD/src/wlan_hdd_main.c +++ b/CORE/HDD/src/wlan_hdd_main.c @@ -11412,6 +11412,43 @@ void wlan_hdd_reset_prob_rspies(hdd_adapter_t* pHostapdAdapter) } } +/** + * hdd_wait_for_sme_close_sesion() - Close and wait for SME session close + * @hdd_ctx: HDD context which is already NULL validated + * @adapter: HDD adapter which is already NULL validated + * + * Close the SME session and wait for its completion, if needed. + * + * Return: None + */ +static void hdd_wait_for_sme_close_sesion(hdd_context_t *hdd_ctx, + hdd_adapter_t *adapter) +{ + unsigned long rc; + + if (!test_bit(SME_SESSION_OPENED, &adapter->event_flags)) { + hddLog(LOGE, FL("session is not opened:%d"), adapter->sessionId); + return; + } + + INIT_COMPLETION(adapter->session_close_comp_var); + if (eHAL_STATUS_SUCCESS == + sme_CloseSession(hdd_ctx->hHal, adapter->sessionId, + hdd_smeCloseSessionCallback, + adapter)) { + /* + * Block on a completion variable. Can't wait + * forever though. + */ + rc = wait_for_completion_timeout( + &adapter->session_close_comp_var, + msecs_to_jiffies + (WLAN_WAIT_TIME_SESSIONOPENCLOSE)); + if (!rc) + hddLog(LOGE, FL("failure waiting for session_close_comp_var")); + } +} + VOS_STATUS hdd_stop_adapter( hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter, const v_BOOL_t bCloseSession) { @@ -11469,11 +11506,11 @@ VOS_STATUS hdd_stop_adapter( hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter, { hddLog(LOGE, "%s: failed to post disconnect event to SME", __func__); - } - memset(&wrqu, '\0', sizeof(wrqu)); - wrqu.ap_addr.sa_family = ARPHRD_ETHER; - memset(wrqu.ap_addr.sa_data,'\0',ETH_ALEN); - wireless_send_event(pAdapter->dev, SIOCGIWAP, &wrqu, NULL); + } + memset(&wrqu, '\0', sizeof(wrqu)); + wrqu.ap_addr.sa_family = ARPHRD_ETHER; + memset(wrqu.ap_addr.sa_data,'\0',ETH_ALEN); + wireless_send_event(pAdapter->dev, SIOCGIWAP, &wrqu, NULL); } else { @@ -11499,24 +11536,8 @@ VOS_STATUS hdd_stop_adapter( hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter, /* It is possible that the caller of this function does not * wish to close the session */ - if (VOS_TRUE == bCloseSession && - test_bit(SME_SESSION_OPENED, &pAdapter->event_flags)) - { - INIT_COMPLETION(pAdapter->session_close_comp_var); - if (eHAL_STATUS_SUCCESS == - sme_CloseSession(pHddCtx->hHal, pAdapter->sessionId, - hdd_smeCloseSessionCallback, pAdapter)) - { - //Block on a completion variable. Can't wait forever though. - rc = wait_for_completion_timeout( - &pAdapter->session_close_comp_var, - msecs_to_jiffies(WLAN_WAIT_TIME_SESSIONOPENCLOSE)); - if (!rc) { - hddLog(LOGE, "%s: failure waiting for session_close_comp_var", - __func__); - } - } - } + if (bCloseSession) + hdd_wait_for_sme_close_sesion(pHddCtx, pAdapter); break; case WLAN_HDD_SOFTAP: @@ -11602,6 +11623,8 @@ VOS_STATUS hdd_stop_adapter( hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter, pAdapter->sessionCtx.ap.beacon = NULL; } mutex_unlock(&pHddCtx->sap_lock); + if (bCloseSession) + hdd_wait_for_sme_close_sesion(pHddCtx, pAdapter); break; case WLAN_HDD_OCB: diff --git a/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c b/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c index 64939fe8a436..9df20b3955f1 100644 --- a/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c +++ b/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c @@ -2342,7 +2342,8 @@ void limProcessMlmDelStaRsp( tpAniSirGlobal pMac, tpSirMsgQ limMsgQ ) if(NULL == pDeleteStaParams || NULL == (psessionEntry = peFindSessionBySessionId(pMac, pDeleteStaParams->sessionId))) { - limLog(pMac, LOGP,FL("Session Does not exist or invalid body pointer in message")); + limLog(pMac, LOGP,FL("Session Does not exist or invalid body pointer in message: %d"), + pDeleteStaParams->sessionId); if(pDeleteStaParams != NULL) { vos_mem_free(pDeleteStaParams); diff --git a/CORE/SAP/inc/sapApi.h b/CORE/SAP/inc/sapApi.h index 9a8f915f8725..a3cbbd68d7ba 100644 --- a/CORE/SAP/inc/sapApi.h +++ b/CORE/SAP/inc/sapApi.h @@ -992,7 +992,10 @@ v_PVOID_t WLANSAP_Open(v_PVOID_t pvosGCtx); VOS_STATUS WLANSAP_Start ( - v_PVOID_t pvosGCtx + v_PVOID_t pvosGCtx, + tVOS_CON_MODE mode, + uint8_t *addr, + uint32_t *session_id ); /*========================================================================== diff --git a/CORE/SAP/src/sapApiLinkCntl.c b/CORE/SAP/src/sapApiLinkCntl.c index 1fe613868e1f..92d0e8f16ce3 100644 --- a/CORE/SAP/src/sapApiLinkCntl.c +++ b/CORE/SAP/src/sapApiLinkCntl.c @@ -533,20 +533,6 @@ WLANSAP_PreStartBssAcsScanCallback eSAP_ACS_CHANNEL_SELECTED, (v_PVOID_t) eSAP_STATUS_SUCCESS); } - - if (psapContext->isScanSessionOpen) - { - if(eHAL_STATUS_SUCCESS != sme_CloseSession(halHandle, - psapContext->sessionId, NULL, NULL)) - { - VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, - "In %s CloseSession error", __func__); - } else { - psapContext->isScanSessionOpen = eSAP_FALSE; - } - } - psapContext->sessionId = 0xff; - return halStatus; } @@ -615,12 +601,10 @@ WLANSAP_RoamCallback case eCSR_ROAM_SESSION_OPENED: { VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, - FL("Before switch on roamStatus = %d"), - roamStatus); + FL("Session %d opened successfully"), + sapContext->sessionId); sapContext->isSapSessionOpen = eSAP_TRUE; - halStatus = sme_RoamConnect(hHal, sapContext->sessionId, - &sapContext->csrRoamProfile, - &sapContext->csrRoamId); + vos_event_set(&sapContext->sap_session_opened_evt); break; } diff --git a/CORE/SAP/src/sapFsm.c b/CORE/SAP/src/sapFsm.c index 7d5d2390cc99..5f55eb805e2e 100644 --- a/CORE/SAP/src/sapFsm.c +++ b/CORE/SAP/src/sapFsm.c @@ -2423,31 +2423,22 @@ sapGotoChannelSel return VOS_STATUS_SUCCESS; }// sapGotoChannelSel +#define SAP_OPEN_SESSION_TIMEOUT 500 -/*========================================================================== - FUNCTION sap_OpenSession - - DESCRIPTION - Function for opening SME and SAP sessions when system is in SoftAP role - - DEPENDENCIES - NA. - - PARAMETERS - - IN - hHal : Hal handle - sapContext : Sap Context value - - RETURN VALUE - The VOS_STATUS code associated with performing the operation - - VOS_STATUS_SUCCESS: Success +/** + * sap_OpenSession() - Opens a SAP session + * @hHal: Hal handle + * @sapContext: Sap Context value + * @session_id: Pointer to the session id + * + * Function for opening SME and SAP sessions when system is in SoftAP role + * + * Return: eHalStatus + */ - SIDE EFFECTS -============================================================================*/ -VOS_STATUS -sap_OpenSession (tHalHandle hHal, ptSapContext sapContext) +eHalStatus +sap_OpenSession (tHalHandle hHal, ptSapContext sapContext, + uint32_t *session_id) { tANI_U32 type, subType; eHalStatus halStatus; @@ -2464,6 +2455,7 @@ sap_OpenSession (tHalHandle hHal, ptSapContext sapContext) VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_FATAL, "failed to get vdev type"); return VOS_STATUS_E_FAILURE; } + vos_event_reset(&sapContext->sap_session_opened_evt); /* Open SME Session for Softap */ halStatus = sme_OpenSession(hHal, &WLANSAP_RoamCallback, @@ -2482,12 +2474,22 @@ sap_OpenSession (tHalHandle hHal, ptSapContext sapContext) } sme_set_allowed_action_frames(hHal, ALLOWED_ACTION_FRAMES_BITMAP0_SAP); + status = vos_wait_single_event( + &sapContext->sap_session_opened_evt, + SAP_OPEN_SESSION_TIMEOUT); + if (!VOS_IS_STATUS_SUCCESS(status)) { + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, + "wait for sap open session event timed out"); + return VOS_STATUS_E_FAILURE; + } pMac->sap.sapCtxList [ sapContext->sessionId ].sessionID = sapContext->sessionId; pMac->sap.sapCtxList [ sapContext->sessionId ].pSapContext = sapContext; pMac->sap.sapCtxList [ sapContext->sessionId ].sapPersona= sapContext->csrRoamProfile.csrPersona; + *session_id = sapContext->sessionId; + sapContext->isSapSessionOpen = eSAP_TRUE; return VOS_STATUS_SUCCESS; } @@ -2555,17 +2557,17 @@ sapGotoStarting eSME_REASON_OTHER); } - halStatus = sap_OpenSession(hHal, sapContext); + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO, + "%s: session: %d", __func__, sapContext->sessionId); - if(eHAL_STATUS_SUCCESS != halStatus ) - { + halStatus = sme_RoamConnect(hHal, sapContext->sessionId, + &sapContext->csrRoamProfile, + &sapContext->csrRoamId); + if (eHAL_STATUS_SUCCESS != halStatus) VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, - "Error: In %s calling sap_OpenSession status = %d", - __func__, halStatus); - return VOS_STATUS_E_FAILURE; - } + "%s: Failed to issue sme_RoamConnect", __func__); + return halStatus; - return VOS_STATUS_SUCCESS; }// sapGotoStarting /*========================================================================== @@ -3145,6 +3147,7 @@ eHalStatus sap_CloseSession(tHalHandle hHal, sapContext->isCacStartNotified = VOS_FALSE; sapContext->isCacEndNotified = VOS_FALSE; pMac->sap.sapCtxList[sapContext->sessionId].pSapContext = NULL; + sapContext->isSapSessionOpen = false; if (NULL == sap_find_valid_concurrent_session(hHal)) { @@ -3417,44 +3420,37 @@ sapFsm if ((msg == eSAP_HDD_START_INFRA_BSS)) { /* Transition from eSAP_DISCONNECTED to eSAP_CH_SELECT (both without substates) */ - VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, new from state %s => %s", - __func__, "eSAP_DISCONNECTED", "eSAP_CH_SELECT"); - - /* There can be one SAP Session for softap */ - if (sapContext->isSapSessionOpen == eSAP_TRUE) - { - VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_FATAL, - "%s:SME Session is already opened\n",__func__); - return VOS_STATUS_E_EXISTS; - } - - sapContext->sessionId = 0xff; - - if ((sapContext->channel == AUTO_CHANNEL_SELECT) && - (sapContext->isScanSessionOpen == eSAP_FALSE)) - { - tANI_U32 type, subType; - tHalHandle hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx); - if (NULL == hHal) - { - VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, - "In %s, NULL hHal in state %s, msg %d", - __func__, "eSAP_DISCONNECTED", msg); + VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, new from state %s => %s, session id %d", + __func__, "eSAP_DISCONNECTED", "eSAP_CH_SELECT", sapContext->sessionId); + + if (sapContext->isSapSessionOpen == eSAP_FALSE) { + uint32_t type, subtype; + if (sapContext->csrRoamProfile.csrPersona == + VOS_P2P_GO_MODE) + vosStatus = vos_get_vdev_types(VOS_P2P_GO_MODE, + &type, &subtype); + else + vosStatus = vos_get_vdev_types(VOS_STA_SAP_MODE, + &type, &subtype); + if (VOS_STATUS_SUCCESS != vosStatus) { + VOS_TRACE(VOS_MODULE_ID_SAP, + VOS_TRACE_LEVEL_FATAL, + "failed to get vdev type"); + return VOS_STATUS_E_FAILURE; } - else if(VOS_STATUS_SUCCESS == vos_get_vdev_types(VOS_STA_MODE, - &type, &subType)) { - /* Open SME Session for scan */ - if(eHAL_STATUS_SUCCESS != sme_OpenSession(hHal, - NULL, sapContext, sapContext->self_mac_addr, - &sapContext->sessionId, type, subType)) - { - VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, - "Error: In %s calling sme_OpenSession", __func__); - } else { - sapContext->isScanSessionOpen = eSAP_TRUE; - } + /* Open SME Session for scan */ + vosStatus = sme_OpenSession(hHal, NULL, + sapContext, sapContext->self_mac_addr, + &sapContext->sessionId, type, subtype); + if (VOS_STATUS_SUCCESS != vosStatus) { + VOS_TRACE(VOS_MODULE_ID_SAP, + VOS_TRACE_LEVEL_ERROR, + FL("Error: calling sme_OpenSession")); + return VOS_STATUS_E_FAILURE; } + sapContext->isSapSessionOpen = eSAP_TRUE; } + /* init dfs channel nol */ sapInitDfsChannelNolList(sapContext); @@ -3512,26 +3508,6 @@ sapFsm break; case eSAP_CH_SELECT: - if (sapContext->isScanSessionOpen == eSAP_TRUE) - { - /* scan completed, so close the session */ - tHalHandle hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx); - if (NULL == hHal) - { - VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, "In %s, NULL hHal in state %s, msg %d", - __func__, "eSAP_CH_SELECT", msg); - } else { - if(eHAL_STATUS_SUCCESS != sme_CloseSession(hHal, - sapContext->sessionId, NULL, NULL)) - { - VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, "In %s CloseSession error event msg %d", - __func__, msg); - } else { - sapContext->isScanSessionOpen = eSAP_FALSE; - } - } - sapContext->sessionId = 0xff; - } if (msg == eSAP_MAC_SCAN_COMPLETE) { @@ -3924,7 +3900,7 @@ sapFsm else { sapContext->isSapSessionOpen = eSAP_FALSE; - if (!HAL_STATUS_SUCCESS( + if (!(eHAL_STATUS_SUCCESS == sap_CloseSession(hHal, sapContext, sapRoamSessionCloseCallback, TRUE))) diff --git a/CORE/SAP/src/sapInternal.h b/CORE/SAP/src/sapInternal.h index b90046f583ef..e4054623b289 100644 --- a/CORE/SAP/src/sapInternal.h +++ b/CORE/SAP/src/sapInternal.h @@ -299,7 +299,7 @@ typedef struct sSapContext { uint16_t beacon_tx_rate; tSirMacRateSet supp_rate_set; tSirMacRateSet extended_rate_set; - + vos_event_t sap_session_opened_evt; } *ptSapContext; @@ -1086,6 +1086,13 @@ void sap_config_acs_result(tHalHandle hal, ptSapContext sap_ctx, */ bool sap_check_in_avoid_ch_list(ptSapContext sap_ctx, uint8_t channel); #endif + +eHalStatus sap_OpenSession(tHalHandle hHal, ptSapContext sapContext, + uint32_t *session_id); +eHalStatus sap_CloseSession(tHalHandle hHal, + ptSapContext sapContext, + csrRoamSessionCloseCallback callback, + v_BOOL_t valid); #ifdef __cplusplus } #endif diff --git a/CORE/SAP/src/sapModule.c b/CORE/SAP/src/sapModule.c index ec75cbf419fe..cf04ef96e5b6 100644 --- a/CORE/SAP/src/sapModule.c +++ b/CORE/SAP/src/sapModule.c @@ -146,68 +146,63 @@ v_PVOID_t WLANSAP_Open(v_PVOID_t pvosGCtx) return pSapCtx; }// WLANSAP_Open -/*========================================================================== - FUNCTION WLANSAP_Start - - DESCRIPTION - Called as part of the overall start procedure (vos_start). SAP will - use this call to register with TL as the SAP entity for - SAP RSN frames. - - DEPENDENCIES - - PARAMETERS - - IN - pCtx : Pointer to the global vos context; a handle to SAP's - control block can be extracted from its context - When MBSSID feature is enabled, SAP context is directly - passed to SAP APIs - - RETURN VALUE - The result code associated with performing the operation - - VOS_STATUS_E_FAULT: Pointer to SAP cb is NULL ; access would cause a page - fault - VOS_STATUS_SUCCESS: Success - - SIDE EFFECTS -============================================================================*/ - +/** + * WLANSAP_Start() - wlan start SAP. + * @pCtx: Pointer to the global cds context; a handle to SAP's + * control block can be extracted from its context + * When MBSSID feature is enabled, SAP context is directly + * passed to SAP APIs + * @mode: Device mode + * @addr: MAC address of the SAP + * @session_id: Pointer to the session id + * + * Called as part of the overall start procedure (cds_enable). SAP will + * use this call to register with TL as the SAP entity for SAP RSN frames. + * + * Return: The result code associated with performing the operation + * VOS_STATUS_E_FAULT: Pointer to SAP cb is NULL; + * access would cause a page fault. + * VOS_STATUS_SUCCESS: Success + */ VOS_STATUS WLANSAP_Start ( - v_PVOID_t pCtx + v_PVOID_t pCtx, + tVOS_CON_MODE mode, + uint8_t *addr, + uint32_t *session_id ) { ptSapContext pSapCtx = NULL; + VOS_STATUS vos_status; + tHalHandle hal; /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, - "WLANSAP_Start invoked successfully"); + "WLANSAP_Start invoked successfully"); /*------------------------------------------------------------------------ - Sanity check - Extract SAP control block - ------------------------------------------------------------------------*/ + Sanity check + Extract SAP control block + ------------------------------------------------------------------------*/ pSapCtx = VOS_GET_SAP_CB(pCtx); if ( NULL == pSapCtx ) { VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, - "%s: Invalid SAP pointer from pCtx", __func__); + "%s: Invalid SAP pointer from pCtx", __func__); return VOS_STATUS_E_FAULT; } /*------------------------------------------------------------------------ - For now, presume security is not enabled. - -----------------------------------------------------------------------*/ + For now, presume security is not enabled. + -----------------------------------------------------------------------*/ pSapCtx->ucSecEnabled = WLANSAP_SECURITY_ENABLED_STATE; /*------------------------------------------------------------------------ - Now configure the roaming profile links. To SSID and bssid. - ------------------------------------------------------------------------*/ + Now configure the roaming profile links. To SSID and bssid. + ------------------------------------------------------------------------*/ // We have room for two SSIDs. pSapCtx->csrRoamProfile.SSIDs.numOfSSIDs = 1; // This is true for now. pSapCtx->csrRoamProfile.SSIDs.SSIDList = pSapCtx->SSIDList; //Array of two @@ -217,6 +212,9 @@ WLANSAP_Start pSapCtx->csrRoamProfile.BSSIDs.numOfBSSIDs = 1; // This is true for now. pSapCtx->csrRoamProfile.BSSIDs.bssid = &pSapCtx->bssid; + pSapCtx->csrRoamProfile.csrPersona = mode; + vos_mem_copy(pSapCtx->self_mac_addr, addr, VOS_MAC_ADDR_SIZE); + vos_event_init(&pSapCtx->sap_session_opened_evt); // Now configure the auth type in the roaming profile. To open. pSapCtx->csrRoamProfile.negotiatedAuthType = eCSR_AUTH_TYPE_OPEN_SYSTEM; // open is the default @@ -224,10 +222,17 @@ WLANSAP_Start if( !VOS_IS_STATUS_SUCCESS( vos_lock_init( &pSapCtx->SapGlobalLock))) { VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, - "WLANSAP_Start failed init lock"); + "WLANSAP_Start failed init lock"); return VOS_STATUS_E_FAULT; } - + hal = (tHalHandle) VOS_GET_HAL_CB(pSapCtx->pvosGCtx); + vos_status = sap_OpenSession(hal, pSapCtx, session_id); + if (VOS_STATUS_SUCCESS != vos_status) { + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, + "Error: In %s calling sap_OpenSession status = %d", + __func__, vos_status); + return VOS_STATUS_E_FAILURE; + } return VOS_STATUS_SUCCESS; }/* WLANSAP_Start */ @@ -383,6 +388,7 @@ WLANSAP_CleanCB v_U32_t freeFlag // 0 /*do not empty*/); ) { + tHalHandle hal; /*------------------------------------------------------------------------ Sanity check SAP control block ------------------------------------------------------------------------*/ @@ -399,6 +405,13 @@ WLANSAP_CleanCB ------------------------------------------------------------------------*/ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "WLANSAP_CleanCB"); + hal = (tHalHandle) VOS_GET_HAL_CB(pSapCtx->pvosGCtx); + if (eSAP_TRUE == pSapCtx->isSapSessionOpen && hal) { + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO, + "close existing SAP session"); + sap_CloseSession(hal, pSapCtx, NULL, false); + } + vos_mem_zero( pSapCtx, sizeof(tSapContext)); pSapCtx->pvosGCtx = NULL; @@ -409,7 +422,6 @@ WLANSAP_CleanCB __func__, pSapCtx->sapsMachine, pSapCtx); pSapCtx->sessionId = 0; pSapCtx->channel = 0; - pSapCtx->isSapSessionOpen = eSAP_FALSE; return VOS_STATUS_SUCCESS; }// WLANSAP_CleanCB @@ -3770,44 +3782,11 @@ WLANSAP_ACS_CHSelect(v_PVOID_t pvosGCtx, return VOS_STATUS_E_FAULT; } - if (sapContext->isSapSessionOpen == eSAP_TRUE) { - VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_FATAL, - "%s:SME Session is already opened\n",__func__); - return VOS_STATUS_E_EXISTS; - } - - sapContext->sessionId = 0xff; pMac = PMAC_STRUCT( hHal ); sapContext->acs_cfg = &pConfig->acs_cfg; sapContext->csrRoamProfile.phyMode = sapContext->acs_cfg->hw_mode; - if (sapContext->isScanSessionOpen == eSAP_FALSE) { - tANI_U32 type, subType; - -#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE - if((sapContext->acs_cfg->skip_scan_status != eSAP_SKIP_ACS_SCAN) && - (VOS_STATUS_SUCCESS == - vos_get_vdev_types(VOS_STA_MODE, &type, &subType))) { -#else - if(VOS_STATUS_SUCCESS == - vos_get_vdev_types(VOS_STA_MODE, &type, &subType)) { -#endif - /* - * Open SME Session for scan - */ - if(eHAL_STATUS_SUCCESS != sme_OpenSession(hHal, NULL, sapContext, - sapContext->self_mac_addr, - &sapContext->sessionId, - type, subType)) { - VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, - "Error: In %s calling sme_OpenSession", __func__); - return VOS_STATUS_E_FAILURE; - } - else - sapContext->isScanSessionOpen = eSAP_TRUE; - } - /* * Copy the HDD callback function to report the * ACS result after scan in SAP context callback function. @@ -3855,32 +3834,12 @@ WLANSAP_ACS_CHSelect(v_PVOID_t pvosGCtx, FL("Scan Req Failed/ACS Overridden, Selected channel = %d"), sapContext->channel); - if (sapContext->isScanSessionOpen == eSAP_TRUE) { - /* acs scan not needed so close the session */ - tHalHandle hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx); - if (hHal == NULL) { - VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, - "%s: HAL Handle NULL. ACS Scan session close fail!", - __func__); - return VOS_STATUS_E_FAILURE; - } - if (eHAL_STATUS_SUCCESS == sme_CloseSession(hHal, - sapContext->sessionId, NULL, NULL)) { - sapContext->isScanSessionOpen = eSAP_FALSE; - } else { - VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, - "%s: ACS Scan session close fail!", __func__); - } - sapContext->sessionId = 0xff; - } - return sapSignalHDDevent(sapContext, NULL, eSAP_ACS_CHANNEL_SELECTED, (v_PVOID_t) eSAP_STATUS_SUCCESS); } else if (VOS_STATUS_SUCCESS == vosStatus) VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, FL("Successfully Issued a Pre Start Bss Scan Request")); - } return vosStatus; } /** |
