/* * mainKeysSm.c * * Copyright(c) 1998 - 2009 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 mainKeySM.c * \brief Main key state machine implementation. * * \see mainKeySM.h */ /**************************************************************************** * * * MODULE: Main key SM * * PURPOSE: Main key SM implmentation * * * ****************************************************************************/ #define __FILE_ID__ FILE_ID_36 #include "osApi.h" #include "paramOut.h" #include "timer.h" #include "report.h" #include "rsn.h" #include "rsnApi.h" #include "smeApi.h" #include "mainSecSm.h" #include "keyParser.h" #include "broadcastKeySM.h" #include "unicastKeySM.h" #include "mainKeysSm.h" #include "mainKeysSmInternal.h" #include "DataCtrl_Api.h" #include "admCtrl.h" #include "EvHandler.h" #include "TI_IPC_Api.h" #include "connApi.h" static TI_STATUS mainKeys_smEvent(struct _mainKeys_t *pMainKeys, TI_UINT8 event, void* pData); /** * * mainKeys_create * * \b Description: * * Allocate memory for the main security context, and create all the rest of the needed contexts. * * \b ARGS: * * I - hOs - OS handle for OS operations. * * \b RETURNS: * * pointer to main security context. If failed, returns NULL. * * \sa */ mainKeys_t* mainKeys_create(TI_HANDLE hOs) { mainKeys_t *pHandle; TI_STATUS status; /* allocate association context memory */ pHandle = (mainKeys_t*)os_memoryAlloc(hOs, sizeof(mainKeys_t)); if (pHandle == NULL) { return NULL; } os_memoryZero(hOs, pHandle, sizeof(mainKeys_t)); /* allocate memory for association state machine */ status = fsm_Create(hOs, &pHandle->pMainKeysSm, MAIN_KEYS_NUM_STATES, MAIN_KEYS_NUM_EVENTS); if (status != TI_OK) { os_memoryFree(hOs, pHandle, sizeof(mainKeys_t)); return NULL; } pHandle->pKeyParser = keyParser_create(hOs); if (pHandle->pKeyParser == NULL) { fsm_Unload(hOs, pHandle->pMainKeysSm); os_memoryFree(hOs, pHandle, sizeof(mainKeys_t)); return NULL; } pHandle->pBcastSm = broadcastKey_create(hOs); if (pHandle->pBcastSm == NULL) { keyParser_unload(pHandle->pKeyParser); fsm_Unload(hOs, pHandle->pMainKeysSm); os_memoryFree(hOs, pHandle, sizeof(mainKeys_t)); return NULL; } pHandle->pUcastSm = unicastKey_create(hOs); if (pHandle->pBcastSm == NULL) { broadcastKey_unload(pHandle->pBcastSm); keyParser_unload(pHandle->pKeyParser); fsm_Unload(hOs, pHandle->pMainKeysSm); os_memoryFree(hOs, pHandle, sizeof(mainKeys_t)); return NULL; } pHandle->hOs = hOs; /* At first Timeout we will send MediaSpecific Event */ /* At any other Timeout we will send the Timeout Event */ pHandle->mainKeysTimeoutCounter = TI_FALSE; return pHandle; } /** * * mainKeys_config * * \b Description: * * Init main security state machine state machine * * \b ARGS: * * none * * \b RETURNS: * * TI_OK on success, TI_NOK otherwise. * * \sa */ TI_STATUS mainKeys_config (mainKeys_t *pMainKeys, TRsnPaeConfig *pPaeConfig, void *pParent, TI_HANDLE hReport, TI_HANDLE hOs, TI_HANDLE hCtrlData, TI_HANDLE hEvHandler, TI_HANDLE hConn, TI_HANDLE hRsn, TI_HANDLE hTimer) { TI_STATUS status; /** Main key State Machine matrix */ fsm_actionCell_t mainKeysSM_matrix[MAIN_KEYS_NUM_STATES][MAIN_KEYS_NUM_EVENTS] = { /* next state and actions for IDLE state */ { {MAIN_KEYS_STATE_START, (fsm_Action_t)mainKeys_startIdle}, {MAIN_KEYS_STATE_IDLE, (fsm_Action_t)mainKeySmNop}, {MAIN_KEYS_STATE_IDLE, (fsm_Action_t)mainKeySmUnexpected}, {MAIN_KEYS_STATE_IDLE, (fsm_Action_t)mainKeySmUnexpected}, {MAIN_KEYS_STATE_IDLE, (fsm_Action_t)mainKeySmUnexpected} }, /* next state and actions for START state */ { {MAIN_KEYS_STATE_START, (fsm_Action_t)mainKeySmUnexpected}, {MAIN_KEYS_STATE_IDLE, (fsm_Action_t)mainKeys_stopStart}, {MAIN_KEYS_STATE_UNICAST_COMPLETE, (fsm_Action_t)mainKeySmNop}, {MAIN_KEYS_STATE_BROADCAST_COMPLETE, (fsm_Action_t)mainKeySmNop}, {MAIN_KEYS_STATE_START, (fsm_Action_t)mainKeys_smTimeOut} }, /* next state and actions for UNICAST COMPLETE state */ { {MAIN_KEYS_STATE_UNICAST_COMPLETE, (fsm_Action_t)mainKeySmUnexpected}, {MAIN_KEYS_STATE_IDLE, (fsm_Action_t)mainKeys_stopUcastComplete}, {MAIN_KEYS_STATE_UNICAST_COMPLETE, (fsm_Action_t)mainKeySmNop}, {MAIN_KEYS_STATE_COMPLETE, (fsm_Action_t)mainKeys_bcastCompleteUcastComplete}, {MAIN_KEYS_STATE_UNICAST_COMPLETE, (fsm_Action_t)mainKeys_smTimeOut} }, /* next state and actions for BROADCAST COMPLETE state */ { {MAIN_KEYS_STATE_BROADCAST_COMPLETE, (fsm_Action_t)mainKeySmUnexpected}, {MAIN_KEYS_STATE_IDLE, (fsm_Action_t)mainKeys_stopBcastComplete}, {MAIN_KEYS_STATE_COMPLETE, (fsm_Action_t)mainKeys_ucastCompleteBcastComplete}, {MAIN_KEYS_STATE_BROADCAST_COMPLETE, (fsm_Action_t)mainKeySmNop}, {MAIN_KEYS_STATE_BROADCAST_COMPLETE, (fsm_Action_t)mainKeys_smTimeOut} }, /* next state and actions for COMPLETE state */ { {MAIN_KEYS_STATE_COMPLETE, (fsm_Action_t)mainKeySmUnexpected}, {MAIN_KEYS_STATE_IDLE, (fsm_Action_t)mainKeys_stopComplete}, {MAIN_KEYS_STATE_COMPLETE, (fsm_Action_t)mainKeySmNop}, {MAIN_KEYS_STATE_COMPLETE, (fsm_Action_t)mainKeySmNop}, {MAIN_KEYS_STATE_COMPLETE, (fsm_Action_t)mainKeySmUnexpected} } }; pMainKeys->hCtrlData = hCtrlData; pMainKeys->hOs = hOs; pMainKeys->hReport = hReport; pMainKeys->hEvHandler = hEvHandler; pMainKeys->hConn = hConn; pMainKeys->hRsn = hRsn; pMainKeys->hTimer = hTimer; pMainKeys->pParent = pParent; pMainKeys->keysTimeout = MAIN_KEYS_TIMEOUT; pMainKeys->start = mainKeys_start; pMainKeys->stop = mainKeys_stop; pMainKeys->reportUcastStatus = mainKeys_reportUcastStatus; pMainKeys->reportBcastStatus = mainKeys_reportBcastStatus; pMainKeys->setKey = mainKeys_setKey; pMainKeys->removeKey = mainKeys_removeKey; pMainKeys->setDefaultKeyId = mainKeys_setDefaultKeyId; pMainKeys->getSessionKey = mainKeys_getSessionKey; pMainKeys->currentState = MAIN_KEYS_STATE_IDLE; /* allocate OS timer memory */ if (pMainKeys->hSessionTimer == NULL) { pMainKeys->hSessionTimer = tmr_CreateTimer (pMainKeys->hTimer); if (pMainKeys->hSessionTimer == NULL) { TRACE0(pMainKeys->hReport, REPORT_SEVERITY_ERROR, "mainKeys_config(): Failed to create hSessionTimer!\n"); return TI_NOK; } } status = fsm_Config(pMainKeys->pMainKeysSm, &mainKeysSM_matrix[0][0], MAIN_KEYS_NUM_STATES, MAIN_KEYS_NUM_EVENTS, NULL, pMainKeys->hOs); if (status != TI_OK) { TRACE0(pMainKeys->hReport, REPORT_SEVERITY_ERROR, "MAIN_KEYS_SM: Error in configuring SM\n"); return status; } status = keyParser_config(pMainKeys->pKeyParser, pPaeConfig, pMainKeys->pUcastSm, pMainKeys->pBcastSm, pMainKeys, hReport, hOs, hCtrlData); if (status != TI_OK) { TRACE0(pMainKeys->hReport, REPORT_SEVERITY_ERROR, "MAIN_KEYS_SM: Error in configuring key parser\n"); return status; } status = broadcastKey_config(pMainKeys->pBcastSm, pPaeConfig, pMainKeys, hReport, hOs); if (status != TI_OK) { TRACE0(pMainKeys->hReport, REPORT_SEVERITY_ERROR, "MAIN_KEYS_SM: Error in configuring broadcast key SM\n"); return status; } status = unicastKey_config(pMainKeys->pUcastSm, pPaeConfig, pMainKeys, hReport, hOs); if (status != TI_OK) { TRACE0(pMainKeys->hReport, REPORT_SEVERITY_ERROR, "MAIN_KEYS_SM: Error in configuring unicast key SM\n"); return status; } return TI_OK; } /** * * mainKeys_config * * \b Description: * * Init main security state machine state machine * * \b ARGS: * * none * * \b RETURNS: * * TI_OK on success, TI_NOK otherwise. * * \sa */ TI_STATUS mainKeys_unload(mainKeys_t *pMainKeys) { TI_STATUS status; if (pMainKeys == NULL) { return TI_NOK; } status = fsm_Unload(pMainKeys->hOs, pMainKeys->pMainKeysSm); if (status != TI_OK) { /* report failure but don't stop... */ TRACE0(pMainKeys->hReport, REPORT_SEVERITY_ERROR, "MAIN_KEYS_SM: Error releasing FSM memory \n"); } if (pMainKeys->hSessionTimer) { tmr_DestroyTimer (pMainKeys->hSessionTimer); } pMainKeys->hSessionTimer = NULL; status = keyParser_unload(pMainKeys->pKeyParser); if (status != TI_OK) { /* report failure but don't stop... */ TRACE0(pMainKeys->hReport, REPORT_SEVERITY_ERROR, "MAIN_KEYS_SM: Error unloading key parser\n"); } status = broadcastKey_unload(pMainKeys->pBcastSm); if (status != TI_OK) { /* report failure but don't stop... */ TRACE0(pMainKeys->hReport, REPORT_SEVERITY_ERROR, "MAIN_KEYS_SM: Error unloading broadcast key SM\n"); } status = unicastKey_unload(pMainKeys->pUcastSm); if (status != TI_OK) { /* report failure but don't stop... */ TRACE0(pMainKeys->hReport, REPORT_SEVERITY_ERROR, "MAIN_KEYS_SM: Error unloading unicast key SM\n"); } os_memoryFree(pMainKeys->hOs, pMainKeys, sizeof(mainKeys_t)); return TI_OK; } /** * * rsn_mainKeySmStart * * \b Description: * * START event handler * * \b ARGS: * * I - pCtrlB - station control block \n * * \b RETURNS: * * TI_OK on success, TI_NOK otherwise. * * \sa rsn_mainKeySmStop() */ TI_STATUS mainKeys_start(struct _mainKeys_t *pMainKeys) { TI_STATUS status; status = mainKeys_smEvent(pMainKeys, MAIN_KEYS_EVENT_START, pMainKeys); return status; } /** * * rsn_mainKeySmStop * * \b Description: * * STOP event handler * * \b ARGS: * * I - pCtrlB - station control block \n * * \b RETURNS: * * TI_OK on success, TI_NOK otherwise. * * \sa rsn_mainKeySmStart() */ TI_STATUS mainKeys_stop(struct _mainKeys_t *pMainKeys) { TI_STATUS status; status = mainKeys_smEvent(pMainKeys, MAIN_KEYS_EVENT_STOP, pMainKeys); return status; } /** * * rsn_mainKeySmReportUnicastComplete * * \b Description: * * UNICAST_COMPLETE event handler * * \b ARGS: * * I - pCtrlB - station control block \n * * \b RETURNS: * * TI_OK on success, TI_NOK otherwise. * * \sa rsn_mainKeySmReportBroadcastComplete() */ TI_STATUS mainKeys_reportUcastStatus(struct _mainKeys_t *pMainKeys, TI_STATUS ucastStatus) { TI_STATUS status=TI_NOK; EExternalAuthMode extAuthMode; struct _rsn_t *pRsn = pMainKeys->pParent->pParent; if (ucastStatus == TI_OK) { txCtrlParams_setCurrentPrivacyInvokedMode(pRsn->hTxCtrl, TI_TRUE); status = pRsn->pAdmCtrl->getExtAuthMode(pRsn->pAdmCtrl, &extAuthMode); if (status != TI_OK) { return status; } if (extAuthMode >= RSN_EXT_AUTH_MODE_WPA) { txCtrlParams_setEapolEncryptionStatus(pRsn->hTxCtrl, TI_TRUE); } else { txCtrlParams_setEapolEncryptionStatus(pRsn->hTxCtrl, TI_FALSE); } status = mainKeys_smEvent(pMainKeys, MAIN_KEYS_EVENT_UCAST_COMPLETE, pMainKeys); } return status; } /** * * rsn_mainKeySmReportBroadcastComplete * * \b Description: * * BROADCAST_COMPLETE event handler * * \b ARGS: * * I - pCtrlB - station control block \n * * \b RETURNS: * * TI_OK on success, TI_NOK otherwise. * * \sa rsn_mainKeySmReportUnicastComplete() */ TI_STATUS mainKeys_reportBcastStatus(struct _mainKeys_t *pMainKeys, TI_STATUS bcastStatus) { TI_STATUS status=TI_NOK; if (bcastStatus == TI_OK) { status = mainKeys_smEvent(pMainKeys, MAIN_KEYS_EVENT_BCAST_COMPLETE, pMainKeys); } return status; } /** * * mainKeySmSessionTimeout * * \b Description: * * SESSION_TIMEOUOT event handler * * \b ARGS: * * I - pData - station control block \n * * \b RETURNS: * * TI_OK on success, TI_NOK otherwise. */ TI_STATUS mainKeys_setKey(struct _mainKeys_t *pMainKeys, TSecurityKeys *pKey) { return (pMainKeys->pParent->setKey(pMainKeys->pParent, pKey)); } /** * * mainKeySmSessionTimeout * * \b Description: * * SESSION_TIMEOUOT event handler * * \b ARGS: * * I - pData - station control block \n * * \b RETURNS: * * TI_OK on success, TI_NOK otherwise. */ TI_STATUS mainKeys_removeKey(struct _mainKeys_t *pMainKeys, TSecurityKeys *pKey) { return (pMainKeys->pParent->removeKey(pMainKeys->pParent, pKey)); } /** * * mainKeySmSessionTimeout * * \b Description: * * SESSION_TIMEOUOT event handler * * \b ARGS: * * I - pData - station control block \n * * \b RETURNS: * * TI_OK on success, TI_NOK otherwise. */ TI_STATUS mainKeys_setDefaultKeyId(struct _mainKeys_t *pMainKeys, TI_UINT8 keyId) { return (pMainKeys->pParent->setDefaultKeyId(pMainKeys->pParent, keyId)); } /** * * mainKeySmSessionTimeout * * \b Description: * * SESSION_TIMEOUOT event handler * * \b ARGS: * * I - pData - station control block \n * * \b RETURNS: * * TI_OK on success, TI_NOK otherwise. */ TI_STATUS mainKeys_getSessionKey(struct _mainKeys_t *pMainKeys, TI_UINT8 *pKey, TI_UINT32 *pKeyLen) { TI_STATUS status; status = pMainKeys->pParent->getSessionKey(pMainKeys->pParent, pKey, pKeyLen); return status; } /** * * mainKeySmSessionTimeout * * \b Description: * * SESSION_TIMEOUOT event handler * * \b ARGS: * * I - pMainKeys - module handle \n * I - bTwdInitOccured - Indicates if TWDriver recovery occured since timer started \n * * \b RETURNS: * * TI_OK on success, TI_NOK otherwise. */ void mainKeys_sessionTimeout(void *pMainKeys, TI_BOOL bTwdInitOccured) { mainKeys_smEvent(pMainKeys, MAIN_KEYS_EVENT_SESSION_TIMEOUOT, pMainKeys); } static TI_STATUS mainKeys_smEvent(struct _mainKeys_t *pMainKeys, TI_UINT8 event, void* pData) { TI_STATUS status; TI_UINT8 nextState; status = fsm_GetNextState(pMainKeys->pMainKeysSm, pMainKeys->currentState, event, &nextState); if (status != TI_OK) { TRACE0(pMainKeys->hReport, REPORT_SEVERITY_ERROR, "MAIN_KEYS_SM: ERROR - failed getting next state \n"); return(TI_NOK); } TRACE3( pMainKeys->hReport, REPORT_SEVERITY_INFORMATION, "mainKeys_smEvent: <currentState = %d, event = %d> --> nextState = %d\n", pMainKeys->currentState, event, nextState); status = fsm_Event(pMainKeys->pMainKeysSm, &pMainKeys->currentState, event, pData); return status; } /** * * mainKeySmStartSubKeySmsAndTimer * * \b Description: * * Starts unicast & broadcast key SMs and session timer. * * \b ARGS: * * I - pData - station control block \n * * \b RETURNS: * * TI_OK on success, TI_NOK otherwise. */ TI_STATUS mainKeys_startIdle(struct _mainKeys_t *pMainKeys) { TI_STATUS status; status = pMainKeys->pUcastSm->start(pMainKeys->pUcastSm); if (status != TI_OK) { return TI_NOK; } status = pMainKeys->pBcastSm->start(pMainKeys->pBcastSm); if (status != TI_OK) { return TI_NOK; } tmr_StartTimer (pMainKeys->hSessionTimer, mainKeys_sessionTimeout, (TI_HANDLE)pMainKeys, pMainKeys->keysTimeout, TI_FALSE); status = pMainKeys->pKeyParser->replayReset(pMainKeys->pKeyParser); return status; } /** * * mainKeySmStopSubKeySmsAndTimer * * \b Description: * * Stops unicast & broadcast key SMs and session timer. * * \b ARGS: * * I - pData - station control block \n * * \b RETURNS: * * TI_OK on success, TI_NOK otherwise. */ TI_STATUS mainKeys_stopStart(struct _mainKeys_t *pMainKeys) { TI_STATUS status = TI_OK; status = pMainKeys->pUcastSm->stop(pMainKeys->pUcastSm); if (status != TI_OK) { return TI_NOK; } status = pMainKeys->pBcastSm->stop(pMainKeys->pBcastSm); if (status != TI_OK) { return TI_NOK; } tmr_StopTimer (pMainKeys->hSessionTimer); return status; } /** * * mainKeySmStopSubKeySmsAndTimer * * \b Description: * * Stops unicast & broadcast key SMs and session timer. * * \b ARGS: * * I - pData - station control block \n * * \b RETURNS: * * TI_OK on success, TI_NOK otherwise. */ TI_STATUS mainKeys_stopUcastComplete(struct _mainKeys_t *pMainKeys) { TI_STATUS status = TI_OK; status = pMainKeys->pUcastSm->stop(pMainKeys->pUcastSm); if (status != TI_OK) { return TI_NOK; } status = pMainKeys->pBcastSm->stop(pMainKeys->pBcastSm); if (status != TI_OK) { return TI_NOK; } tmr_StopTimer (pMainKeys->hSessionTimer); return status; } /** * * mainKeySmReportComplete * * \b Description: * * Report key complete to the main security SM. * * \b ARGS: * * I - pData - station control block \n * * \b RETURNS: * * TI_OK on success, TI_NOK otherwise. */ TI_STATUS mainKeys_bcastCompleteUcastComplete(struct _mainKeys_t *pMainKeys) { TI_STATUS status; TRACE0(pMainKeys->hReport, REPORT_SEVERITY_INFORMATION, "mainKeys_bcastCompleteUcastComplete - sending Interrogate \n"); tmr_StopTimer (pMainKeys->hSessionTimer); status = pMainKeys->pParent->reportKeysStatus(pMainKeys->pParent, TI_OK); return status; } /** * * mainKeySmStopSubKeySmsAndTimer * * \b Description: * * Stops unicast & broadcast key SMs and session timer. * * \b ARGS: * * I - pData - station control block \n * * \b RETURNS: * * TI_OK on success, TI_NOK otherwise. */ TI_STATUS mainKeys_stopBcastComplete(struct _mainKeys_t *pMainKeys) { TI_STATUS status = TI_OK; status = pMainKeys->pUcastSm->stop(pMainKeys->pUcastSm); if (status != TI_OK) { return TI_NOK; } status = pMainKeys->pBcastSm->stop(pMainKeys->pBcastSm); if (status != TI_OK) { return TI_NOK; } tmr_StopTimer (pMainKeys->hSessionTimer); return status; } /** * * mainKeySmReportComplete * * \b Description: * * Report key complete to the main security SM. * * \b ARGS: * * I - pData - station control block \n * * \b RETURNS: * * TI_OK on success, TI_NOK otherwise. */ TI_STATUS mainKeys_ucastCompleteBcastComplete(struct _mainKeys_t *pMainKeys) { TI_STATUS status; TRACE0(pMainKeys->hReport, REPORT_SEVERITY_INFORMATION, "mainKeys_ucastCompleteBcastComplete \n"); tmr_StopTimer (pMainKeys->hSessionTimer); pMainKeys->mainKeysTimeoutCounter = TI_FALSE; status = pMainKeys->pParent->reportKeysStatus(pMainKeys->pParent, TI_OK); return status; } /** * * mainKeySmStopSubKeySmsAndTimer * * \b Description: * * Stops unicast & broadcast key SMs and session timer. * * \b ARGS: * * I - pData - station control block \n * * \b RETURNS: * * TI_OK on success, TI_NOK otherwise. */ TI_STATUS mainKeys_stopComplete(struct _mainKeys_t *pMainKeys) { TI_STATUS status = TI_OK; status = pMainKeys->pUcastSm->stop(pMainKeys->pUcastSm); if (status != TI_OK) { return TI_NOK; } status = pMainKeys->pBcastSm->stop(pMainKeys->pBcastSm); if (status != TI_OK) { return TI_NOK; } return status; } /** * * mainKeySmLogMessage * * \b Description: * * Prints Log messge.\n * Start session timer. * * \b ARGS: * * I - pData - station control block \n * * \b RETURNS: * * TI_OK on success, TI_NOK otherwise. */ TI_STATUS mainKeys_smTimeOut(void* data) { OS_802_11_AUTHENTICATION_REQUEST *request; TI_UINT8 AuthBuf[sizeof(TI_UINT32) + sizeof(OS_802_11_AUTHENTICATION_REQUEST)]; paramInfo_t param; TI_STATUS status; struct _mainKeys_t *pMainKeys = (struct _mainKeys_t *)data; TRACE1(pMainKeys->hReport, REPORT_SEVERITY_INFORMATION, "MAIN_KEY_SM: TRAP: Session Timeout for station , mainKeysTimeoutCounter=%d\n", pMainKeys->mainKeysTimeoutCounter); request = (OS_802_11_AUTHENTICATION_REQUEST *)(AuthBuf + sizeof(TI_UINT32)); request->Length = sizeof(OS_802_11_AUTHENTICATION_REQUEST); param.paramType = CTRL_DATA_CURRENT_BSSID_PARAM; status = ctrlData_getParam(pMainKeys->hCtrlData, ¶m); if (status != TI_OK) { return TI_NOK; } TRACE1(pMainKeys->hReport, REPORT_SEVERITY_INFORMATION, "current station is banned from the roaming candidates list for %d Ms\n", RSN_MAIN_KEYS_SESSION_TIMEOUT); rsn_banSite(pMainKeys->hRsn, param.content.ctrlDataCurrentBSSID, RSN_SITE_BAN_LEVEL_FULL, RSN_MAIN_KEYS_SESSION_TIMEOUT); /* mainKeysTimeoutCounter is a boolean variable, With states: */ /* TI_TRUE - It is a Timeout Association Event */ /* TI_FALSE - It is a Media specific Event */ if (!pMainKeys->mainKeysTimeoutCounter) { /* Fill Media specific indication fields and send to OS/User */ MAC_COPY (request->BSSID, param.content.ctrlDataCurrentBSSID); request->Flags = OS_802_11_REQUEST_REAUTH; *(TI_UINT32*)AuthBuf = os802_11StatusType_Authentication; TRACE1(pMainKeys->hReport, REPORT_SEVERITY_INFORMATION, " %d Ms\n",RSN_MAIN_KEYS_SESSION_TIMEOUT); EvHandlerSendEvent(pMainKeys->hEvHandler, IPC_EVENT_MEDIA_SPECIFIC, (TI_UINT8*)AuthBuf, sizeof(TI_UINT32) + sizeof(OS_802_11_AUTHENTICATION_REQUEST)); tmr_StartTimer (pMainKeys->hSessionTimer, mainKeys_sessionTimeout, (TI_HANDLE)pMainKeys, pMainKeys->keysTimeout, TI_FALSE); pMainKeys->mainKeysTimeoutCounter = TI_TRUE; } else { pMainKeys->mainKeysTimeoutCounter = TI_FALSE; rsn_reportAuthFailure(pMainKeys->hRsn, RSN_AUTH_STATUS_TIMEOUT); conn_reportRsnStatus(pMainKeys->hConn, (mgmtStatus_e)STATUS_SECURITY_FAILURE); } return TI_OK; } TI_STATUS mainKeySmUnexpected(struct _mainKeys_t *pMainKeys) { TRACE0(pMainKeys->hReport, REPORT_SEVERITY_ERROR, "MAIN_KEY_SM: ERROR UnExpected Event\n"); return(TI_OK); } TI_STATUS mainKeySmNop(struct _mainKeys_t *pMainKeys) { return(TI_OK); } void mainKeys_reAuth(TI_HANDLE pHandle) { mainKeys_t *pMainKeys = (mainKeys_t *)pHandle; rsn_reAuth(pMainKeys->hRsn); }