diff options
Diffstat (limited to 'wl1271/stad/src/Connection_Managment/connInfra.c')
-rw-r--r-- | wl1271/stad/src/Connection_Managment/connInfra.c | 1024 |
1 files changed, 0 insertions, 1024 deletions
diff --git a/wl1271/stad/src/Connection_Managment/connInfra.c b/wl1271/stad/src/Connection_Managment/connInfra.c deleted file mode 100644 index 1f02b7d..0000000 --- a/wl1271/stad/src/Connection_Managment/connInfra.c +++ /dev/null @@ -1,1024 +0,0 @@ -/* - * connInfra.c - * - * Copyright(c) 1998 - 2010 Texas Instruments. All rights reserved. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name Texas Instruments nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** \file connInfra.c - * \brief Infra connection implementation - * - * \see connInfra.h - */ - -/***************************************************************************/ -/* */ -/* MODULE: connInfra.c */ -/* PURPOSE: Infra connection implementation */ -/* */ -/***************************************************************************/ - -#define __FILE_ID__ FILE_ID_27 -#include "tidef.h" -#include "report.h" -#include "osApi.h" -#include "conn.h" -#include "connInfra.h" -#include "timer.h" -#include "fsm.h" -#include "siteMgrApi.h" -#include "sme.h" -#include "rsnApi.h" -#include "DataCtrl_Api.h" -#include "paramOut.h" -#include "siteHash.h" -#include "smeSm.h" -#include "PowerMgr_API.h" -#include "measurementMgrApi.h" -#include "TrafficMonitorAPI.h" -#include "qosMngr_API.h" -#include "EvHandler.h" -#include "SwitchChannelApi.h" -#include "ScanCncn.h" -#include "currBss.h" -#include "healthMonitor.h" -#include "regulatoryDomainApi.h" -#include "txCtrl.h" -#include "TWDriver.h" -#include "SoftGeminiApi.h" -#include "RxQueue_api.h" - -#ifdef XCC_MODULE_INCLUDED -#include "XCCMngr.h" -#include "XCCTSMngr.h" -#endif - -#define DISCONNECT_TIMEOUT_MSEC 800 - -/* Local functions prototypes */ - -static TI_STATUS actionUnexpected(void *pData); - -static TI_STATUS actionNop(void *pData); - -static TI_STATUS connInfra_ScrWait(void *pData); - -static TI_STATUS Idle_to_Idle(void *pData); - -static TI_STATUS ScrWait_to_idle(void *pData); - -static TI_STATUS ScrWait_to_JoinWait(void *pData); - -static TI_STATUS JoinWait_to_mlmeWait(void *pData); - -static TI_STATUS JoinWait_to_WaitDisconnect(void *pData); - -static TI_STATUS mlmeWait_to_WaitDisconnect(void *pData); - -static TI_STATUS mlmeWait_to_rsnWait(void *pData); - -static TI_STATUS rsnWait_to_disconnect(void *pData); - -static TI_STATUS rsnWait_to_configHW(void *pData); - -static TI_STATUS configHW_to_connected(void *pData); - -static TI_STATUS configHW_to_disconnect(void *pData); - -static TI_STATUS connInfra_ScrWaitDisconn_to_disconnect(void *pData); - -static TI_STATUS connect_to_ScrWait(void *pData); - -static TI_STATUS prepare_send_disconnect(void *pData); - -static TI_STATUS connInfra_WaitDisconnectToIdle (void *pData); - - -static TI_STATUS stopModules( conn_t *pConn, TI_BOOL bDisconnect ); - -void InfraConnSM_ScrCB( TI_HANDLE hConn, EScrClientRequestStatus requestStatus, - EScrResourceId eResource, EScePendReason pendReason ); - -int conn_ConfigHwFinishCb(TI_HANDLE pData); - -/********************************************/ -/* Functions Implementations */ -/********************************************/ - - -/*********************************************************************** - * conn_infraConfig - *********************************************************************** -DESCRIPTION: Infra Connection configuration function, called by the conection set param function - in the selection phase. Configures the connection state machine to Infra connection mode - -INPUT: hConn - Connection handle. - -OUTPUT: - -RETURN: TI_OK on success, TI_NOK otherwise - -************************************************************************/ -TI_STATUS conn_infraConfig(conn_t *pConn) -{ - static fsm_actionCell_t smMatrix[CONN_INFRA_NUM_STATES][CONN_INFRA_NUM_EVENTS] = - { - /* next state and actions for IDLE state */ - { {STATE_CONN_INFRA_SCR_WAIT_CONN, connInfra_ScrWait}, /* "EVENT_CONNECT" */ - {STATE_CONN_INFRA_IDLE, actionNop }, /* "EVENT_SCR_SUCC"*/ - {STATE_CONN_INFRA_IDLE, actionNop }, /* "EVENT_JOIN_CMD_CMPLT */ - {STATE_CONN_INFRA_IDLE, Idle_to_Idle }, /* "EVENT_DISCONNECT" */ - {STATE_CONN_INFRA_IDLE, actionUnexpected}, /* "EVENT_MLME_SUCC"*/ - {STATE_CONN_INFRA_IDLE, actionUnexpected}, /* "EVENT_RSN_SUCC" */ - {STATE_CONN_INFRA_IDLE, actionNop}, /* "EVENT_CONFIG_HW" */ - {STATE_CONN_INFRA_IDLE, actionUnexpected} /* "EVENT_DISCONN_COMPLETE" */ - }, - - /* next state and actions for SCR_WAIT_CONN state */ - { {STATE_CONN_INFRA_SCR_WAIT_CONN , actionUnexpected}, /* "EVENT_CONNECT" */ - {STATE_CONN_INFRA_WAIT_JOIN_CMPLT, ScrWait_to_JoinWait}, /* "EVENT_SCR_SUCC"*/ - {STATE_CONN_INFRA_SCR_WAIT_CONN , actionUnexpected}, /* "EVENT_JOIN_CMD_CMPLT */ - {STATE_CONN_INFRA_IDLE, ScrWait_to_idle}, /* "EVENT_DISCONNECT" */ - {STATE_CONN_INFRA_SCR_WAIT_CONN , actionUnexpected}, /* "EVENT_MLME_SUCC"*/ - {STATE_CONN_INFRA_SCR_WAIT_CONN , actionUnexpected}, /* "EVENT_RSN_SUCC" */ - {STATE_CONN_INFRA_SCR_WAIT_CONN , actionNop}, /* "EVENT_CONFIG_HW "*/ - {STATE_CONN_INFRA_SCR_WAIT_CONN , actionNop} /* "EVENT_DISCONN_COMPLETE" */ - }, - - /* next state and actions for WAIT_JOIN_CMPLT */ - { {STATE_CONN_INFRA_WAIT_JOIN_CMPLT, actionUnexpected}, /* "EVENT_CONNECT" */ - {STATE_CONN_INFRA_WAIT_JOIN_CMPLT, actionUnexpected}, /* "EVENT_SCR_SUCC"*/ - {STATE_CONN_INFRA_MLME_WAIT, JoinWait_to_mlmeWait}, /* "EVENT_JOIN_CMD_CMPLT" */ - {STATE_CONN_INFRA_WAIT_DISCONNECT, JoinWait_to_WaitDisconnect},/* "EVENT_DISCONNECT" */ - {STATE_CONN_INFRA_WAIT_JOIN_CMPLT, actionUnexpected}, /* "EVENT_MLME_SUCC"*/ - {STATE_CONN_INFRA_WAIT_JOIN_CMPLT, actionUnexpected}, /* "EVENT_RSN_SUCC" */ - {STATE_CONN_INFRA_WAIT_JOIN_CMPLT, actionNop}, /* "EVENT_CONFIG_HW" */ - {STATE_CONN_INFRA_WAIT_JOIN_CMPLT, actionUnexpected} /* "EVENT_DISCONN_COMPLETE" */ - - }, - - /* next state and actions for MLME_WAIT state */ - { {STATE_CONN_INFRA_MLME_WAIT, actionUnexpected}, /* "EVENT_CONNECT" */ - {STATE_CONN_INFRA_MLME_WAIT, actionUnexpected}, /* "EVENT_SCR_SUCC" */ - {STATE_CONN_INFRA_MLME_WAIT, actionUnexpected}, /* "EVENT_JOIN_CMD_CMPLT"*/ - {STATE_CONN_INFRA_WAIT_DISCONNECT, mlmeWait_to_WaitDisconnect}, /* "EVENT_DISCONNECT" */ - {STATE_CONN_INFRA_RSN_WAIT, mlmeWait_to_rsnWait}, /* "EVENT_MLME_SUCC"*/ - {STATE_CONN_INFRA_MLME_WAIT, actionUnexpected}, /* "EVENT_RSN_SUCC" */ - {STATE_CONN_INFRA_MLME_WAIT, actionUnexpected}, /* "EVENT_CONFIG_HW" */ - {STATE_CONN_INFRA_MLME_WAIT, actionUnexpected} /* "EVENT_DISCONN_COMPLETE" */ - }, - - /* next state and actions for RSN_WAIT state */ - { {STATE_CONN_INFRA_RSN_WAIT, actionUnexpected}, /* "EVENT_CONNECT" */ - {STATE_CONN_INFRA_RSN_WAIT, actionUnexpected}, /* "EVENT_SCR_SUCC" */ - {STATE_CONN_INFRA_RSN_WAIT, actionUnexpected}, /* "EVENT_JOIN_CMD_CMPLT"*/ - {STATE_CONN_INFRA_WAIT_DISCONNECT, rsnWait_to_disconnect}, /* "EVENT_DISCONNECT" */ - {STATE_CONN_INFRA_RSN_WAIT, actionUnexpected}, /* "EVENT_MLME_SUCC"*/ - {STATE_CONN_INFRA_CONFIG_HW, rsnWait_to_configHW}, /* "EVENT_RSN_SUCC" */ - {STATE_CONN_INFRA_RSN_WAIT, actionUnexpected}, /* "EVENT_CONFIG_HW" */ - {STATE_CONN_INFRA_RSN_WAIT, actionUnexpected} /* "EVENT_DISCONN_COMPLETE" */ - }, - - /* next state and actions for CONFIG_HW state */ - { {STATE_CONN_INFRA_CONFIG_HW, actionUnexpected}, /* "EVENT_CONNECT" */ - {STATE_CONN_INFRA_CONFIG_HW, actionUnexpected}, /* "EVENT_SCR_SUCC" */ - {STATE_CONN_INFRA_CONFIG_HW, actionUnexpected}, /* "EVENT_JOIN_CMD_CMPLT"*/ - {STATE_CONN_INFRA_WAIT_DISCONNECT, configHW_to_disconnect}, /* "EVENT_DISCONNECT" */ - {STATE_CONN_INFRA_CONFIG_HW, actionUnexpected}, /* "EVENT_MLME_SUCC"*/ - {STATE_CONN_INFRA_CONFIG_HW, actionUnexpected}, /* "EVENT_RSN_SUCC" */ - {STATE_CONN_INFRA_CONNECTED, configHW_to_connected}, /* "EVENT_CONFIG_HW" */ - {STATE_CONN_INFRA_CONFIG_HW, actionUnexpected} /* "EVENT_DISCONN_COMPLETE" */ - }, - - /* next state and actions for CONNECTED state */ - { {STATE_CONN_INFRA_SCR_WAIT_CONN, connect_to_ScrWait}, /* "EVENT_CONNECT" */ - {STATE_CONN_INFRA_CONNECTED, actionUnexpected}, /* "EVENT_SCR_SUCC"*/ - {STATE_CONN_INFRA_CONNECTED, actionUnexpected}, /* "EVENT_JOIN_CMD_CMPLT" */ - {STATE_CONN_INFRA_SCR_WAIT_DISCONN, connInfra_ScrWait}, /* "EVENT_DISCONNECT" */ - {STATE_CONN_INFRA_CONNECTED, actionUnexpected}, /* "EVENT_MLME_SUCC"*/ - {STATE_CONN_INFRA_CONNECTED, actionUnexpected}, /* "EVENT_RSN_SUCC" */ - {STATE_CONN_INFRA_CONNECTED, actionUnexpected}, /* "STATE_CONN_INFRA_CONFIG_HW" */ - {STATE_CONN_INFRA_CONNECTED, actionUnexpected} /* "EVENT_DISCONN_COMPLETE" */ - }, - - /* next state and actions for SCR_WAIT_DISCONN state */ - { {STATE_CONN_INFRA_SCR_WAIT_DISCONN, actionUnexpected}, /* "EVENT_CONNECT" */ - {STATE_CONN_INFRA_WAIT_DISCONNECT , connInfra_ScrWaitDisconn_to_disconnect}, /* "EVENT_SCR_SUCC"*/ - {STATE_CONN_INFRA_SCR_WAIT_DISCONN, actionUnexpected}, /* "EVENT_JOIN_CMD_CMPLT */ - {STATE_CONN_INFRA_SCR_WAIT_DISCONN, ScrWait_to_idle}, /* "EVENT_DISCONNECT" */ - {STATE_CONN_INFRA_SCR_WAIT_DISCONN, actionUnexpected}, /* "EVENT_MLME_SUCC"*/ - {STATE_CONN_INFRA_SCR_WAIT_DISCONN, actionUnexpected}, /* "EVENT_RSN_SUCC" */ - {STATE_CONN_INFRA_SCR_WAIT_DISCONN, actionNop}, /* "EVENT_CONFIG_HW "*/ - {STATE_CONN_INFRA_SCR_WAIT_DISCONN, actionNop} /* "EVENT_DISCONN_COMPLETE" */ - }, - - /* next state and actions for STATE_CONN_INFRA_WAIT_DISCONNECT state */ - { {STATE_CONN_INFRA_WAIT_DISCONNECT, actionUnexpected}, /* "EVENT_CONNECT" */ - {STATE_CONN_INFRA_WAIT_DISCONNECT, actionUnexpected}, /* "STATE_CONN_INFRA_SCR_WAIT_CONN"*/ - {STATE_CONN_INFRA_WAIT_DISCONNECT, actionUnexpected}, /* "EVENT_JOIN_CMD_CMPLT" */ - {STATE_CONN_INFRA_WAIT_DISCONNECT, actionUnexpected}, /* "EVENT_DISCONNECT" */ - {STATE_CONN_INFRA_WAIT_DISCONNECT, actionUnexpected}, /* "EVENT_MLME_SUCC"*/ - {STATE_CONN_INFRA_WAIT_DISCONNECT, actionUnexpected}, /* "EVENT_RSN_SUCC" */ - {STATE_CONN_INFRA_WAIT_DISCONNECT, actionUnexpected}, /* "STATE_CONN_INFRA_CONFIG_HW" */ - {STATE_CONN_INFRA_IDLE , connInfra_WaitDisconnectToIdle} /* "EVENT_DISCONN_COMPLETE" */ - } - - }; - - scr_registerClientCB( pConn->hScr, SCR_CID_CONNECT, InfraConnSM_ScrCB, pConn ); - - return fsm_Config(pConn->infra_pFsm, (fsm_Matrix_t)smMatrix, CONN_INFRA_NUM_STATES, CONN_INFRA_NUM_EVENTS, conn_infraSMEvent, pConn->hOs); -} - -/*********************************************************************** - * conn_infraSMEvent - *********************************************************************** -DESCRIPTION: Infra Connection SM event processing function, called by the connection API - Perform the following: - - Print the state movement as a result from the event - - Calls the generic state machine event processing function which preform the following: - - Calls the correspoding callback function - - Move to next state - -INPUT: currentState - Pointer to the connection current state. - event - Received event - pConn - Connection handle - -OUTPUT: - -RETURN: TI_OK on success, TI_NOK otherwise - -************************************************************************/ -TI_STATUS conn_infraSMEvent(TI_UINT8 *currentState, TI_UINT8 event, TI_HANDLE hConn) -{ - conn_t *pConn = (conn_t *)hConn; - TI_STATUS status; - TI_UINT8 nextState; - - status = fsm_GetNextState(pConn->infra_pFsm, *currentState, event, &nextState); - if (status != TI_OK) - { - TRACE0(pConn->hReport, REPORT_SEVERITY_SM, "State machine error, failed getting next state\n"); - return(TI_NOK); - } - - TRACE3( pConn->hReport, REPORT_SEVERITY_INFORMATION, "conn_infraSMEvent: <currentState = %d, event = %d> --> nextState = %d\n", *currentState, event, nextState); - - status = fsm_Event(pConn->infra_pFsm, currentState, event, (void *)pConn); - - return status; -} - -/************************************************************************************************************/ -/* In the following section are listed the callback function used by the Infra connection state machine */ -/************************************************************************************************************/ - -/* JOIN, SET_DATA_PORT_NOTIFY, START_MLME */ -static TI_STATUS ScrWait_to_JoinWait(void *pData) -{ - TI_STATUS status; - conn_t *pConn = (conn_t *)pData; - - status = siteMgr_join(((conn_t *)pData)->hSiteMgr ); - /* If the Join command was failed we report the SME that connection failure so it could exit connecting state */ - if (status != TI_OK) - { - TRACE0(pConn->hReport, REPORT_SEVERITY_ERROR, "Join command has failed!\n"); - } - return status; -} - - -static TI_STATUS JoinWait_to_mlmeWait(void *pData) -{ - TI_STATUS status; - paramInfo_t *pParam; - conn_t *pConn = (conn_t *)pData; - - pParam = (paramInfo_t *)os_memoryAlloc(pConn->hOs, sizeof(paramInfo_t)); - if (!pParam) - { - return TI_NOK; - } - - /* Set the BA session policies to the FW */ - qosMngr_SetBaPolicies(pConn->hQosMngr); - - pParam->paramType = SITE_MGR_CURRENT_CHANNEL_PARAM; - siteMgr_getParam(pConn->hSiteMgr, pParam); - - pParam->paramType = REGULATORY_DOMAIN_TX_POWER_AFTER_SELECTION_PARAM; - pParam->content.channel = pParam->content.siteMgrCurrentChannel; - regulatoryDomain_setParam(pConn->hRegulatoryDomain, pParam); - - pParam->paramType = RX_DATA_PORT_STATUS_PARAM; - pParam->content.rxDataPortStatus = OPEN_NOTIFY; - status = rxData_setParam(pConn->hRxData, pParam); - if (status != TI_OK) - { - TRACE1( pConn->hReport, REPORT_SEVERITY_FATAL_ERROR, "JoinWait_to_mlmeWait: rxData_setParam return 0x%x.\n", status); - os_memoryFree(pConn->hOs, pParam, sizeof(paramInfo_t)); - return status; - } - - /* Update TxMgmtQueue SM to open Tx path only for Mgmt packets. */ - txMgmtQ_SetConnState (((conn_t *)pData)->hTxMgmtQ, TX_CONN_STATE_MGMT); - - /* - * Set the reassociation flag in the association logic. - */ - pParam->paramType = MLME_RE_ASSOC_PARAM; - - if( pConn->connType == CONN_TYPE_ROAM ) - pParam->content.mlmeReAssoc = TI_TRUE; - else - pParam->content.mlmeReAssoc = TI_FALSE; - - status = mlme_setParam(pConn->hMlmeSm, pParam); - - if (status != TI_OK) - { - TRACE1( pConn->hReport, REPORT_SEVERITY_FATAL_ERROR, "JoinWait_to_mlmeWait: mlme_setParam return 0x%x.\n", status); - } - os_memoryFree(pConn->hOs, pParam, sizeof(paramInfo_t)); - return mlme_start(pConn->hMlmeSm); -} - - -/* STOP_MLME, SET_DATA_PORT_CLOSE, DIS_JOIN */ -static TI_STATUS mlmeWait_to_WaitDisconnect(void *pData) -{ - TI_STATUS status; - paramInfo_t *pParam; - conn_t *pConn = (conn_t *)pData; - - status = mlme_stop( pConn->hMlmeSm, DISCONNECT_IMMEDIATE, pConn->disConnReasonToAP ); - if (status != TI_OK) - return status; - - pParam = (paramInfo_t *)os_memoryAlloc(pConn->hOs, sizeof(paramInfo_t)); - if (!pParam) - { - return TI_NOK; - } - - pParam->paramType = RX_DATA_PORT_STATUS_PARAM; - pParam->content.rxDataPortStatus = CLOSE; - rxData_setParam(pConn->hRxData, pParam); - - /* Update TxMgmtQueue SM to close Tx path. */ - txMgmtQ_SetConnState (pConn->hTxMgmtQ, TX_CONN_STATE_CLOSE); - - /* Start the disconnect complete time out timer. - Disconect Complete event, which stops the timer. */ - tmr_StartTimer (pConn->hConnTimer, conn_timeout, (TI_HANDLE)pConn, DISCONNECT_TIMEOUT_MSEC, TI_FALSE); - - /* FW will send the disconn frame according to disConnType */ - TWD_CmdFwDisconnect (pConn->hTWD, pConn->disConnType, pConn->disConnReasonToAP); - -#ifdef XCC_MODULE_INCLUDED - XCCMngr_updateIappInformation(pConn->hXCCMngr, XCC_DISASSOC); -#endif - os_memoryFree(pConn->hOs, pParam, sizeof(paramInfo_t)); - return TI_OK; -} - -/* This function is called from the WAIT_FOR_JOIN_CB_CMPLT state (before mlme_start) - - all we need to do is call siteMgr_disJoin */ -static TI_STATUS JoinWait_to_WaitDisconnect(void *pData) -{ - conn_t *pConn = (conn_t *)pData; - - /* Start the disconnect complete time out timer. - Disconect Complete event, which stops the timer. */ - tmr_StartTimer (pConn->hConnTimer, conn_timeout, (TI_HANDLE)pConn, DISCONNECT_TIMEOUT_MSEC, TI_FALSE); - - /* FW will send the disconn frame according to disConnType */ - TWD_CmdFwDisconnect (pConn->hTWD, pConn->disConnType, pConn->disConnReasonToAP); - - return TI_OK; -} - -/* SET_DATA_PORT_EAPOL, START_RSN */ -static TI_STATUS mlmeWait_to_rsnWait(void *pData) -{ - TI_STATUS status; - paramInfo_t *pParam; - conn_t *pConn = (conn_t *)pData; - - pParam = (paramInfo_t *)os_memoryAlloc(pConn->hOs, sizeof(paramInfo_t)); - if (!pParam) - { - return TI_NOK; - } - - pParam->paramType = RX_DATA_PORT_STATUS_PARAM; - pParam->content.rxDataPortStatus = OPEN_EAPOL; - status = rxData_setParam(pConn->hRxData, pParam); - os_memoryFree(pConn->hOs, pParam, sizeof(paramInfo_t)); - if (status != TI_OK) - return status; - /* Update TxMgmtQueue SM to enable EAPOL packets. */ - txMgmtQ_SetConnState (((conn_t *)pData)->hTxMgmtQ, TX_CONN_STATE_EAPOL); - - /* - * Notify that the driver is associated to the supplicant\IP stack. - */ - EvHandlerSendEvent(pConn->hEvHandler, IPC_EVENT_ASSOCIATED, NULL,0); - status = rsn_start(pConn->hRsn); - return status; -} - - - -/* STOP_RSN, SET_DATA_PORT_CLOSE, STOP_MLME, DIS_JOIN */ -static TI_STATUS rsnWait_to_disconnect(void *pData) -{ - TI_STATUS status; - paramInfo_t *pParam; - conn_t *pConn = (conn_t *)pData; - - status = rsn_stop(pConn->hRsn, pConn->disConEraseKeys); - if (status != TI_OK) - return status; - - pParam = (paramInfo_t *)os_memoryAlloc(pConn->hOs, sizeof(paramInfo_t)); - if (!pParam) - { - return TI_NOK; - } - - pParam->paramType = RX_DATA_PORT_STATUS_PARAM; - pParam->content.rxDataPortStatus = CLOSE; - status = rxData_setParam(pConn->hRxData, pParam); - os_memoryFree(pConn->hOs, pParam, sizeof(paramInfo_t)); - if (status != TI_OK) - return status; - - /* Update TxMgmtQueue SM to close Tx path for all except Mgmt packets. */ - txMgmtQ_SetConnState (pConn->hTxMgmtQ, TX_CONN_STATE_MGMT); - - status = mlme_stop( pConn->hMlmeSm, DISCONNECT_IMMEDIATE, pConn->disConnReasonToAP ); - - if (status != TI_OK) - return status; - - /* send disconnect command to firmware */ - prepare_send_disconnect(pData); - - return TI_OK; -} - - -/* STOP_RSN, SET_DATA_PORT_CLOSE, STOP_MLME, DIS_JOIN */ -static TI_STATUS configHW_to_disconnect(void *pData) -{ - TI_STATUS status; - paramInfo_t *pParam; - conn_t *pConn = (conn_t *)pData; - - status = rsn_stop(pConn->hRsn, pConn->disConEraseKeys ); - if (status != TI_OK) - return status; - - pParam = (paramInfo_t *)os_memoryAlloc(pConn->hOs, sizeof(paramInfo_t)); - if (!pParam) - { - return TI_NOK; - } - - pParam->paramType = RX_DATA_PORT_STATUS_PARAM; - pParam->content.rxDataPortStatus = CLOSE; - status = rxData_setParam(pConn->hRxData, pParam); - if (status == TI_OK) - { - /* Update TxMgmtQueue SM to close Tx path for all except Mgmt packets. */ - txMgmtQ_SetConnState (pConn->hTxMgmtQ, TX_CONN_STATE_MGMT); - - status = mlme_stop( pConn->hMlmeSm, DISCONNECT_IMMEDIATE, pConn->disConnReasonToAP ); - if (status == TI_OK) - { - pParam->paramType = REGULATORY_DOMAIN_DISCONNECT_PARAM; - regulatoryDomain_setParam(pConn->hRegulatoryDomain, pParam); - - /* Must be called AFTER mlme_stop. since De-Auth packet should be sent with the - supported rates, and stopModules clears all rates. */ - stopModules(pConn, TI_TRUE); - - /* send disconnect command to firmware */ - prepare_send_disconnect(pData); - } - } - os_memoryFree(pConn->hOs, pParam, sizeof(paramInfo_t)); - return status; -} - -static TI_STATUS connInfra_ScrWaitDisconn_to_disconnect(void *pData) -{ - TI_STATUS status; - paramInfo_t *pParam; - conn_t *pConn = (conn_t *)pData; - - status = rsn_stop(pConn->hRsn, pConn->disConEraseKeys); - if (status != TI_OK) - return status; - - pParam = (paramInfo_t *)os_memoryAlloc(pConn->hOs, sizeof(paramInfo_t)); - if (!pParam) - { - return TI_NOK; - } - - pParam->paramType = RX_DATA_PORT_STATUS_PARAM; - pParam->content.rxDataPortStatus = CLOSE; - status = rxData_setParam(pConn->hRxData, pParam); - if (status == TI_OK) - { - /* Update TxMgmtQueue SM to close Tx path for all except Mgmt packets. */ - txMgmtQ_SetConnState(pConn->hTxMgmtQ, TX_CONN_STATE_MGMT); - - pParam->paramType = REGULATORY_DOMAIN_DISCONNECT_PARAM; - regulatoryDomain_setParam(pConn->hRegulatoryDomain, pParam); - - status = mlme_stop(pConn->hMlmeSm, DISCONNECT_IMMEDIATE, pConn->disConnReasonToAP); - if (status == TI_OK) - { - /* Must be called AFTER mlme_stop. since De-Auth packet should be sent with the - supported rates, and stopModules clears all rates. */ - stopModules(pConn, TI_TRUE); - - /* send disconnect command to firmware */ - prepare_send_disconnect(pData); - } - } - os_memoryFree(pConn->hOs, pParam, sizeof(paramInfo_t)); - return status; - -} - - -static TI_STATUS rsnWait_to_configHW(void *pData) -{ - conn_t *pConn=(conn_t *)pData; - TI_STATUS status; - paramInfo_t *pParam; - - pParam = (paramInfo_t *)os_memoryAlloc(pConn->hOs, sizeof(paramInfo_t)); - if (!pParam) - { - return TI_NOK; - } - - /* Open the RX to DATA */ - pParam->paramType = RX_DATA_PORT_STATUS_PARAM; - pParam->content.rxDataPortStatus = OPEN; - status = rxData_setParam(pConn->hRxData, pParam); - os_memoryFree(pConn->hOs, pParam, sizeof(paramInfo_t)); - if (status != TI_OK) - return status; - - status = qosMngr_connect(pConn->hQosMngr); - if (status != TI_OK) - { - TRACE2(pConn->hReport, REPORT_SEVERITY_ERROR, "Infra Conn status=%d, have to return (%d)\n",status,__LINE__); - return status; - } - - status = measurementMgr_connected(pConn->hMeasurementMgr); - if (status != TI_OK) - { - TRACE2(pConn->hReport, REPORT_SEVERITY_ERROR, "Infra Conn status=%d, have to return (%d)\n",status,__LINE__); - return status; - } - - status = TrafficMonitor_Start(pConn->hTrafficMonitor); - if (status != TI_OK) - { - TRACE2(pConn->hReport, REPORT_SEVERITY_ERROR, "Infra Conn status=%d, have to return (%d)\n",status,__LINE__); - return status; - } - - healthMonitor_setState(pConn->hHealthMonitor, HEALTH_MONITOR_STATE_CONNECTED); - - switchChannel_start(pConn->hSwitchChannel); - - scanCncn_SwitchToConnected (pConn->hScanCncn); - - PowerMgr_startPS(pConn->hPwrMngr); - - TRACE1(pConn->hReport, REPORT_SEVERITY_INFORMATION, "rsnWait_to_configHW: setStaStatus %d\n",STA_STATE_CONNECTED); - TWD_CmdSetStaState(pConn->hTWD, STA_STATE_CONNECTED, (void *)conn_ConfigHwFinishCb, pData); - - return TI_OK; -} - -/* last command of rsnWait_to_configHW callback */ -int conn_ConfigHwFinishCb(TI_HANDLE pData) -{ - conn_t *pConn = (conn_t *)pData; - - TRACE0(pConn->hReport, REPORT_SEVERITY_INFORMATION, "conn_MboxFlushFinishCb: called \n"); - return conn_infraSMEvent(&pConn->state, CONN_INFRA_HW_CONFIGURED, pConn); -} - -static TI_STATUS configHW_to_connected(void *pData) -{ - conn_t *pConn=(conn_t *)pData; - EScrResourceId uResourceIndex; - - /* Update TxMgmtQueue SM to open Tx path to all packets. */ - txMgmtQ_SetConnState (((conn_t *)pData)->hTxMgmtQ, TX_CONN_STATE_OPEN); - -#ifdef XCC_MODULE_INCLUDED - XCCMngr_updateIappInformation(pConn->hXCCMngr, XCC_ASSOC_OK); -#endif - - /* Start keep alive process */ - siteMgr_start(pConn->hSiteMgr); - - /* free both SCR resources */ - for (uResourceIndex = SCR_RESOURCE_SERVING_CHANNEL; - uResourceIndex < SCR_RESOURCE_NUM_OF_RESOURCES; - uResourceIndex++) - { - scr_clientComplete(pConn->hScr, SCR_CID_CONNECT, uResourceIndex ); - pConn->scrRequested[ uResourceIndex ] = TI_FALSE; - } - - /* Update current BSS connection type and mode */ - currBSS_updateConnectedState(pConn->hCurrBss, TI_TRUE, BSS_INFRASTRUCTURE); - - pConn->pConnStatusCB( pConn->connStatCbObj, STATUS_SUCCESSFUL, 0); - - SoftGemini_SetPSmode(pConn->hSoftGemini); -#ifdef REPORT_LOG - TRACE0(pConn->hReport, REPORT_SEVERITY_CONSOLE, "************ NEW CONNECTION ************\n"); - WLAN_OS_REPORT(("************ NEW CONNECTION ************\n")); - siteMgr_printPrimarySiteDesc(pConn->hSiteMgr); - TRACE0(pConn->hReport, REPORT_SEVERITY_CONSOLE, "****************************************\n"); - WLAN_OS_REPORT(("****************************************\n")); -#else - os_printf("%s: *** NEW CONNECTION ***\n", __func__); -#endif - - return TI_OK; -} - - -static TI_STATUS actionUnexpected(void *pData) -{ -#ifdef TI_DBG - conn_t *pConn = (conn_t *)pData; - - TRACE0(pConn->hReport, REPORT_SEVERITY_SM, "State machine error, unexpected Event\n\n"); -#endif /*TI_DBG*/ - - return TI_OK; -} - -static TI_STATUS actionNop(void *pData) -{ - return TI_OK; -} - - -static TI_STATUS connInfra_ScrWait(void *pData) -{ - conn_t *pConn = (conn_t *)pData; - EScrClientRequestStatus scrReplyStatus[ SCR_RESOURCE_NUM_OF_RESOURCES ]; - EScePendReason scrPendReason[ SCR_RESOURCE_NUM_OF_RESOURCES ]; - EScrResourceId uResourceIndex; - - TRACE0( pConn->hReport, REPORT_SEVERITY_INFORMATION, "Infra Connnect SM: Requesting SCR.\n"); - - /* request the SCR for both resources, and act according to return status */ - for (uResourceIndex = SCR_RESOURCE_SERVING_CHANNEL; - uResourceIndex < SCR_RESOURCE_NUM_OF_RESOURCES; - uResourceIndex++) - { - scrReplyStatus[ uResourceIndex ] = scr_clientRequest( pConn->hScr, SCR_CID_CONNECT, - uResourceIndex, - &(scrPendReason[ uResourceIndex ])); - pConn->scrRequested[ uResourceIndex ] = TI_TRUE; - - /* sanity check */ - if ((scrReplyStatus[ uResourceIndex ] > SCR_CRS_PEND) || - (scrReplyStatus[ uResourceIndex ] < SCR_CRS_RUN)) - { - TRACE2(pConn->hReport, REPORT_SEVERITY_ERROR , "Idle_to_ScrWait: SCR for resource %d returned status %d\n", uResourceIndex, scrReplyStatus[ uResourceIndex ]); - return TI_NOK; - } - } - - /* analyze SCR results: */ - /* both returned run - continue to next stage */ - if ((SCR_CRS_RUN == scrReplyStatus[ SCR_RESOURCE_SERVING_CHANNEL ]) && - (SCR_CRS_RUN == scrReplyStatus[ SCR_RESOURCE_PERIODIC_SCAN ])) - { - /* send an SCR SUCCESS event to the SM */ - TRACE0( pConn->hReport, REPORT_SEVERITY_INFORMATION, "Infra Conn: SCR acquired.\n"); - conn_infraSMEvent(&pConn->state, CONN_INFRA_SCR_SUCC, (TI_HANDLE) pConn); - } - else - { - /* mark which resource is pending (or both) */ - for (uResourceIndex = SCR_RESOURCE_PERIODIC_SCAN; - uResourceIndex < SCR_RESOURCE_NUM_OF_RESOURCES; - uResourceIndex++) - { - if (SCR_CRS_PEND == scrReplyStatus[ uResourceIndex ]) - { - TRACE2( pConn->hReport, REPORT_SEVERITY_INFORMATION, "Infra Conn: SCR pending for resource %d with pend reason: %d, stay in wait SCR state.\n", uResourceIndex, scrPendReason); - pConn->bScrAcquired[ uResourceIndex ] = TI_FALSE; - } - else - { - pConn->bScrAcquired[ uResourceIndex ] = TI_TRUE; - } - } - } - return TI_OK; -} - - - -void InfraConnSM_ScrCB( TI_HANDLE hConn, EScrClientRequestStatus requestStatus, - EScrResourceId eResource, EScePendReason pendReason ) -{ - conn_t *pConn = (conn_t *)hConn; - - TRACE2( pConn->hReport, REPORT_SEVERITY_INFORMATION, "InfraConnSM_ScrCB called by SCR for resource %d. Status is: %d.\n", eResource, requestStatus); - - /* act according to the request staus */ - switch ( requestStatus ) - { - case SCR_CRS_RUN: - TRACE0( pConn->hReport, REPORT_SEVERITY_INFORMATION, "Infra Conn: SCR acquired.\n"); - /* mark that the SCR was acquired for this resource */ - pConn->bScrAcquired[ eResource ] = TI_TRUE; - - /* if both resources had now been acquired */ - if ((TI_TRUE == pConn->bScrAcquired[ SCR_RESOURCE_SERVING_CHANNEL ]) && - (TI_TRUE == pConn->bScrAcquired[ SCR_RESOURCE_PERIODIC_SCAN ])) - { - /* send an SCR SUCCESS event to the SM */ - conn_infraSMEvent(&pConn->state, CONN_INFRA_SCR_SUCC, (TI_HANDLE) pConn); - } - break; - - case SCR_CRS_FW_RESET: - /* Ignore FW reset, the MLME SM will handle re-try of the conn */ - TRACE0( pConn->hReport, REPORT_SEVERITY_INFORMATION, "Infra Conn: Recovery occured.\n"); - break; - - default: - TRACE3( pConn->hReport, REPORT_SEVERITY_ERROR, "Illegal SCR request status:%d, pend reason:%d, resource: %d.\n", requestStatus, pendReason, eResource); - break; - } -} - - - -static TI_STATUS ScrWait_to_idle(void *pData) -{ - conn_t *pConn = (conn_t *)pData; - EScrResourceId uResourceIndex; - - TRACE0( pConn->hReport, REPORT_SEVERITY_INFORMATION, "Infra Connnect SM: Stop event while in SCR wait, moving to IDLE.\n"); - - /* free both SCR resources */ - for (uResourceIndex = SCR_RESOURCE_SERVING_CHANNEL; - uResourceIndex < SCR_RESOURCE_NUM_OF_RESOURCES; - uResourceIndex++) - { - scr_clientComplete(pConn->hScr, SCR_CID_CONNECT, uResourceIndex ); - pConn->scrRequested[ uResourceIndex ] = TI_FALSE; - } - - /* - * Call the connection lost callback set by the SME or AP_CONN. - */ - pConn->pConnStatusCB( pConn->connStatCbObj, pConn->smContext.disAssocEventReason, pConn->smContext.disAssocEventStatusCode); - - return TI_OK; -} - - -static TI_STATUS stopModules( conn_t *pConn, TI_BOOL bDisconnect ) -{ - - measurementMgr_disconnected(pConn->hMeasurementMgr); - - rxData_stop(pConn->hRxData); - - ctrlData_stop(pConn->hCtrlData); - - TrafficMonitor_Stop(pConn->hTrafficMonitor); - - switchChannel_stop(pConn->hSwitchChannel); - - healthMonitor_setState(pConn->hHealthMonitor, HEALTH_MONITOR_STATE_DISCONNECTED); - - siteMgr_stop(pConn->hSiteMgr); - - /* stopping power save */ - PowerMgr_stopPS(pConn->hPwrMngr, bDisconnect); - - scanCncn_SwitchToNotConnected (pConn->hScanCncn); - - /* Set Current BSS Module to stop triggerring roaming events */ - currBSS_updateConnectedState(pConn->hCurrBss, TI_FALSE, BSS_INFRASTRUCTURE); - - SoftGemini_unSetPSmode(pConn->hSoftGemini); - - return TI_OK; -} - - -static TI_STATUS prepare_send_disconnect(void *pData) -{ - conn_t *pConn = (conn_t *)pData; - - txCtrlParams_setEapolEncryptionStatus(pConn->hTxCtrl, DEF_EAPOL_ENCRYPTION_STATUS); - qosMngr_disconnect (pConn->hQosMngr, TI_TRUE); - -#ifdef XCC_MODULE_INCLUDED - measurementMgr_disableTsMetrics(pConn->hMeasurementMgr, MAX_NUM_OF_AC); -#endif - - /* Start the disconnect complete time out timer. - Disconect Complete event, which stops the timer. */ - tmr_StartTimer (pConn->hConnTimer, conn_timeout, (TI_HANDLE)pConn, DISCONNECT_TIMEOUT_MSEC, TI_FALSE); - - /* FW will send the disconn frame according to disConnType */ - TWD_CmdFwDisconnect (pConn->hTWD, pConn->disConnType, pConn->disConnReasonToAP); - -#ifdef XCC_MODULE_INCLUDED - XCCMngr_updateIappInformation(pConn->hXCCMngr, XCC_DISASSOC); -#endif - - return TI_OK; -} - -static TI_STATUS connInfra_WaitDisconnectToIdle(void *pData) -{ - conn_t *pConn = (conn_t *)pData; - EScrResourceId uResourceIndex; - - /* close all BA sessions */ - TWD_CloseAllBaSessions(pConn->hTWD); - - /* Stop the disconnect timeout timer. */ - tmr_StopTimer (pConn->hConnTimer); - - /* - * In case of connection failuer we might get here without freeing the SCR. - */ - for (uResourceIndex = SCR_RESOURCE_SERVING_CHANNEL; - uResourceIndex < SCR_RESOURCE_NUM_OF_RESOURCES; - uResourceIndex++) - { - if (pConn->scrRequested[ uResourceIndex ] == TI_TRUE) - { - scr_clientComplete(pConn->hScr, SCR_CID_CONNECT, uResourceIndex ); - pConn->scrRequested[ uResourceIndex ] = TI_FALSE; - } - } - - /* - * Call the connection lost callback set by the SME or AP_CONN. - */ - pConn->pConnStatusCB( pConn->connStatCbObj, pConn->smContext.disAssocEventReason, pConn->smContext.disAssocEventStatusCode); - - return TI_OK; -} - -static TI_STATUS connect_to_ScrWait(void *pData) -{ - TI_STATUS status; - paramInfo_t *pParam; - conn_t *pConn = (conn_t *)pData; - - /* - * This function performs roaming by two steps: - * First - close the current connection without notify the SME. - * Second - start new connection in reassociation mode. - */ - - /* close all BA sessions */ - TWD_CloseAllBaSessions(pConn->hTWD); - - status = rsn_stop(pConn->hRsn, pConn->disConEraseKeys); - if (status != TI_OK) - return status; - - pParam = (paramInfo_t *)os_memoryAlloc(pConn->hOs, sizeof(paramInfo_t)); - if (!pParam) - { - return TI_NOK; - } - - pParam->paramType = RX_DATA_PORT_STATUS_PARAM; - pParam->content.rxDataPortStatus = CLOSE; - status = rxData_setParam(pConn->hRxData, pParam); - if (status == TI_OK) - { - /* Update TxMgmtQueue SM to close Tx path. */ - txMgmtQ_SetConnState (((conn_t *)pData)->hTxMgmtQ, TX_CONN_STATE_CLOSE); - - status = mlme_stop(pConn->hMlmeSm, DISCONNECT_IMMEDIATE, pConn->disConnReasonToAP); - if (status == TI_OK) - { - pParam->paramType = REGULATORY_DOMAIN_DISCONNECT_PARAM; - regulatoryDomain_setParam(pConn->hRegulatoryDomain, pParam); - -#ifdef XCC_MODULE_INCLUDED - XCCMngr_updateIappInformation(pConn->hXCCMngr, XCC_DISASSOC); -#endif - /* Must be called AFTER mlme_stop. since De-Auth packet should be sent with the - supported rates, and stopModules clears all rates. */ - stopModules(pConn, TI_FALSE); - - txCtrlParams_setEapolEncryptionStatus(pConn->hTxCtrl, DEF_EAPOL_ENCRYPTION_STATUS); - qosMngr_disconnect (pConn->hQosMngr, TI_FALSE); - - /* - * Start new connection. - */ - connInfra_ScrWait(pConn); - } - } - - os_memoryFree(pConn->hOs, pParam, sizeof(paramInfo_t)); - return status; -} - -static TI_STATUS Idle_to_Idle(void *pData) -{ - conn_t *pConn = (conn_t *)pData; - - /* - * In case we are in IDLE and getting DISCONNECT event, we need to inform - * the SME\AP_connection that we are disconnected. - * Call the connection lost callback set by the SME or AP_CONN. - */ - pConn->pConnStatusCB( pConn->connStatCbObj, pConn->smContext.disAssocEventReason, pConn->smContext.disAssocEventStatusCode); - - return TI_OK; -} - -/*********************************************************************** - connInfra_JoinCmpltNotification - *********************************************************************** -DESCRIPTION: Call back upon receving Join Event Complete. - -INPUT: hSiteMgr - site mgr handle. - -OUTPUT: - -RETURN: -************************************************************************/ -TI_STATUS connInfra_JoinCmpltNotification(TI_HANDLE hconn) -{ - conn_t *pConn = (conn_t *)hconn; - - TRACE0(pConn->hReport, REPORT_SEVERITY_INFORMATION, "connInfra_JoinCmpltNotification: has been called\n"); - - if (pConn->currentConnType == CONNECTION_INFRA ) { - conn_infraSMEvent(&pConn->state, CONN_INFRA_JOIN_CMD_CMPLT, pConn); - } - - return TI_OK; -} - -void connInfra_DisconnectComplete (conn_t *pConn, TI_UINT8 *data, TI_UINT8 dataLength) -{ - /* send an DISCONNECT COMPLETE event to the SM */ - conn_infraSMEvent(&pConn->state, CONN_INFRA_DISCONN_COMPLETE, (TI_HANDLE) pConn); -} |