diff options
Diffstat (limited to 'wilink_6_1/stad/src/Sta_Management/authSm.c')
-rw-r--r-- | wilink_6_1/stad/src/Sta_Management/authSm.c | 624 |
1 files changed, 624 insertions, 0 deletions
diff --git a/wilink_6_1/stad/src/Sta_Management/authSm.c b/wilink_6_1/stad/src/Sta_Management/authSm.c new file mode 100644 index 0000000..7260f63 --- /dev/null +++ b/wilink_6_1/stad/src/Sta_Management/authSm.c @@ -0,0 +1,624 @@ +/* + * authSm.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 authSM.c + * \brief 802.11 authentication SM source + * + * \see authSM.h + */ + + +/***************************************************************************/ +/* */ +/* MODULE: authSM.c */ +/* PURPOSE: 802.11 authentication SM source */ +/* */ +/***************************************************************************/ + +#define __FILE_ID__ FILE_ID_64 +#include "osApi.h" + +#include "paramOut.h" +#include "fsm.h" +#include "report.h" +#include "timer.h" +#include "mlmeApi.h" +#include "mlmeBuilder.h" +#include "authSm.h" +#include "openAuthSm.h" +#include "sharedKeyAuthSm.h" +#include "DrvMainModules.h" + +/* Constants */ + +/** number of states in the state machine */ +#define AUTH_SM_MAX_NUM_STATES 4 + +/** number of events in the state machine */ +#define AUTH_SM_MAX_NUM_EVENTS 8 + +/* Enumerations */ + +/* Typedefs */ + +/* Structures */ + +/* External data definitions */ + +/* External functions definitions */ + +/* Global variables */ + +/* Local function prototypes */ + +/* functions */ + +/** +* +* auth_create - allocate memory for authentication SM +* +* \b Description: +* +* Allocate memory for authentication SM. \n +* Allocates memory for Association context. \n +* Allocates memory for authentication timer. \n +* Allocates memory for authentication SM matrix. \n +* +* \b ARGS: +* +* I - hOs - OS context \n +* +* \b RETURNS: +* +* TI_OK if successful, TI_NOK otherwise. +* +* \sa rsn_mainSecSmKeysOnlyStop() +*/ +TI_HANDLE auth_create(TI_HANDLE hOs) +{ + auth_t *pHandle; + TI_STATUS status; + + /* allocate authentication context memory */ + pHandle = (auth_t*)os_memoryAlloc(hOs, sizeof(auth_t)); + if (pHandle == NULL) + { + return NULL; + } + + os_memoryZero(hOs, pHandle, sizeof(auth_t)); + + pHandle->hOs = hOs; + + /* allocate memory for authentication state machine */ + status = fsm_Create(hOs, &pHandle->pAuthSm, AUTH_SM_MAX_NUM_STATES, AUTH_SM_MAX_NUM_EVENTS); + if (status != TI_OK) + { + os_memoryFree(hOs, pHandle, sizeof(auth_t)); + return NULL; + } + + return pHandle; +} + + +/** +* +* auth_unload - unload authentication SM from memory +* +* \b Description: +* +* Unload authentication SM from memory +* +* \b ARGS: +* +* I - hAuth - Authentication SM context \n +* +* \b RETURNS: +* +* TI_OK if successful, TI_NOK otherwise. +* +* \sa rsn_mainSecSmKeysOnlyStop() +*/ +TI_STATUS auth_unload(TI_HANDLE hAuth) +{ + TI_STATUS status; + auth_t *pHandle; + + pHandle = (auth_t*)hAuth; + + status = fsm_Unload(pHandle->hOs, pHandle->pAuthSm); + if (status != TI_OK) + { + /* report failure but don't stop... */ +TRACE0(pHandle->hReport, REPORT_SEVERITY_ERROR, "AUTH_SM: Error releasing FSM memory \n"); + } + + if (pHandle->hAuthSmTimer) + { + tmr_DestroyTimer (pHandle->hAuthSmTimer); + } + + os_memoryFree(pHandle->hOs, pHandle, sizeof(auth_t)); + + return TI_OK; +} + +/** +* +* auth_init - Init required handles and module variables, +* +* \b Description: +* +* Init required handles and module variables, +* +* \b ARGS: +* +* I - pStadHandles - The driver modules handles \n +* +* \b RETURNS: +* +* void +* +* \sa auth_Create, auth_Unload +*/ +void auth_init (TStadHandlesList *pStadHandles) +{ + auth_t *pHandle = (auth_t*)(pStadHandles->hAuth); + + pHandle->hMlme = pStadHandles->hMlmeSm; + pHandle->hRsn = pStadHandles->hRsn; + pHandle->hReport = pStadHandles->hReport; + pHandle->hOs = pStadHandles->hOs; + pHandle->hTimer = pStadHandles->hTimer; +} + + +TI_STATUS auth_SetDefaults (TI_HANDLE hAuth, authInitParams_t *pAuthInitParams) +{ + auth_t *pHandle = (TI_HANDLE) hAuth; + + pHandle->timeout = pAuthInitParams->authResponseTimeout; + pHandle->maxCount = pAuthInitParams->authMaxRetryCount; + + pHandle->retryCount = 0; + pHandle->authRejectCount = 0; + pHandle->authTimeoutCount = 0; + + pHandle->authType = AUTH_LEGACY_NONE; + + /* allocate OS timer memory */ + pHandle->hAuthSmTimer = tmr_CreateTimer (pHandle->hTimer); + if (pHandle->hAuthSmTimer == NULL) + { + TRACE0(pHandle->hReport, REPORT_SEVERITY_ERROR, "auth_SetDefaults(): Failed to create hAuthSmTimer!\n"); + return TI_NOK; + } + + return TI_OK; +} + + +/** +* +* auth_start - Start event for the authentication SM +* +* \b Description: +* +* Start event for the authentication SM +* +* \b ARGS: +* +* I - hAuth - Authentication SM context \n +* +* \b RETURNS: +* +* TI_OK if successful, TI_NOK otherwise. +* +* \sa auth_Stop, auth_Recv +*/ +TI_STATUS auth_start(TI_HANDLE hAuth) +{ + auth_t *pHandle = (auth_t*)hAuth; + + if (pHandle == NULL) + { + return TI_NOK; + } + + if (pHandle->authType == AUTH_LEGACY_NONE) + { + TRACE0(pHandle->hReport, REPORT_SEVERITY_ERROR, "auth_start: pHandle->authType == AUTH_LEGACY_NONE\n"); + return TI_NOK; + } + + switch (pHandle->authType) + { + case AUTH_LEGACY_RESERVED1: + case AUTH_LEGACY_OPEN_SYSTEM: + return auth_osSMEvent(&pHandle->currentState, OPEN_AUTH_SM_EVENT_START, pHandle); + + case AUTH_LEGACY_SHARED_KEY: + return auth_skSMEvent(&pHandle->currentState, SHARED_KEY_AUTH_SM_EVENT_START, pHandle); + + default: + TRACE0(pHandle->hReport, REPORT_SEVERITY_ERROR, "auth_start: pHandle->authType unknown.\n"); + return TI_NOK; + } +} + +/** +* +* auth_stop - Stop event for the authentication SM +* +* \b Description: +* +* Stop event for the authentication SM +* +* \b ARGS: +* +* I - hAuth - Authentication SM context \n +* +* \b RETURNS: +* +* TI_OK if successful, TI_NOK otherwise. +* +* \sa auth_Start, auth_Recv +*/ +TI_STATUS auth_stop(TI_HANDLE hAuth, TI_BOOL sendDeAuth, mgmtStatus_e reason ) +{ + auth_t *pHandle; + + pHandle = (auth_t*)hAuth; + + if (pHandle == NULL) + return TI_NOK; + + if (pHandle->authType == AUTH_LEGACY_NONE) + return TI_NOK; + + if( sendDeAuth == TI_TRUE ) + { + deAuth_t deAuth; + deAuth.reason = ENDIAN_HANDLE_WORD(reason); + mlmeBuilder_sendFrame(pHandle->hMlme, DE_AUTH, (TI_UINT8*)&deAuth, sizeof(deAuth_t), 0); + } + + switch (pHandle->authType) + { + case AUTH_LEGACY_RESERVED1: + case AUTH_LEGACY_OPEN_SYSTEM: + return auth_osSMEvent(&pHandle->currentState, OPEN_AUTH_SM_EVENT_STOP, pHandle); + + case AUTH_LEGACY_SHARED_KEY: + return auth_skSMEvent(&pHandle->currentState, SHARED_KEY_AUTH_SM_EVENT_STOP, pHandle); + + default: + return TI_NOK; + } +} + +/** +* +* auth_recv - Recive a message from the AP +* +* \b Description: +* +* Parse a message form the AP and perform the appropriate event. +* +* \b ARGS: +* +* I - hAuth - Authentication SM context \n +* +* \b RETURNS: +* +* TI_OK if successful, TI_NOK otherwise. +* +* \sa auth_Start, auth_Stop +*/ +TI_STATUS auth_recv(TI_HANDLE hAuth, mlmeFrameInfo_t *pFrame) +{ + auth_t *pHandle; + + pHandle = (auth_t*)hAuth; + + if (pHandle == NULL) + return TI_NOK; + + if (pFrame->subType != AUTH) + return TI_NOK; + + if (pHandle->authType == AUTH_LEGACY_NONE) + return TI_NOK; + + if (pFrame->content.auth.status != STATUS_SUCCESSFUL) + pHandle->authRejectCount++; + + switch (pHandle->authType) + { + case AUTH_LEGACY_RESERVED1: + case AUTH_LEGACY_OPEN_SYSTEM: + return openAuth_Recv(hAuth, pFrame); + + case AUTH_LEGACY_SHARED_KEY: + return sharedKeyAuth_Recv(hAuth, pFrame); + + default: + return TI_OK; + } +} + +/** +* +* auth_getParam - Get a specific parameter from the authentication SM +* +* \b Description: +* +* Get a specific parameter from the authentication SM. +* +* \b ARGS: +* +* I - hAuth - Authentication SM context \n +* I/O - pParam - Parameter \n +* +* \b RETURNS: +* +* TI_OK if successful, TI_NOK otherwise. +* +* \sa auth_Start, auth_Stop +*/ +TI_STATUS auth_getParam(TI_HANDLE hAuth, paramInfo_t *pParam) +{ + auth_t *pHandle; + + pHandle = (auth_t*)hAuth; + + if ((pHandle == NULL) || (pParam == NULL)) + { + return TI_NOK; + } + + switch (pParam->paramType) + { + case AUTH_RESPONSE_TIMEOUT_PARAM: + pParam->content.authResponseTimeout = pHandle->timeout; + break; + + case AUTH_COUNTERS_PARAM: + pParam->content.siteMgrTiWlanCounters.AuthRejects = pHandle->authRejectCount; + pParam->content.siteMgrTiWlanCounters.AuthTimeouts = pHandle->authTimeoutCount; + break; + + case AUTH_LEGACY_TYPE_PARAM: + pParam->content.authLegacyAuthType = pHandle->authType; + break; + + default: + return TI_NOK; + } + + return TI_OK; +} + +/** +* +* auth_setParam - Set a specific parameter to the authentication SM +* +* \b Description: +* +* Set a specific parameter to the authentication SM. +* +* \b ARGS: +* +* I - hAuth - Authentication SM context \n +* I/O - pParam - Parameter \n +* +* \b RETURNS: +* +* TI_OK if successful, TI_NOK otherwise. +* +* \sa auth_Start, auth_Stop +*/ +TI_STATUS auth_setParam(TI_HANDLE hAuth, paramInfo_t *pParam) +{ + auth_t *pHandle; + + pHandle = (auth_t*)hAuth; + + if ((pHandle == NULL) || (pParam == NULL)) + { + return TI_NOK; + } + + switch (pParam->paramType) + { + case AUTH_LEGACY_TYPE_PARAM: + pHandle->authType = pParam->content.authLegacyAuthType; + + switch (pHandle->authType) + { + case AUTH_LEGACY_RESERVED1: + case AUTH_LEGACY_OPEN_SYSTEM: + openAuth_Config(hAuth, pHandle->hOs); + break; + + case AUTH_LEGACY_SHARED_KEY: + sharedKeyAuth_Config(hAuth, pHandle->hOs); + break; + + default: + return TI_NOK; + } + break; + + case AUTH_RESPONSE_TIMEOUT_PARAM: + if ((pParam->content.authResponseTimeout >= AUTH_RESPONSE_TIMEOUT_MIN) && + (pParam->content.authResponseTimeout <= AUTH_RESPONSE_TIMEOUT_MAX)) + { + pHandle->timeout = pParam->content.authResponseTimeout; + } + else + { + return TI_NOK; + } + break; + + default: + return TI_NOK; + } + + return TI_OK; +} + +/** +* +* auth_smTimeout - Set a specific parameter to the authentication SM +* +* \b Description: +* +* Set a specific parameter to the authentication SM. +* +* \b ARGS: +* +* I - hAuth - authentication SM context \n +* I - bTwdInitOccured - Indicates if TWDriver recovery occured since timer started \n +* +* \b RETURNS: +* +* TI_OK if successful, TI_NOK otherwise. +* +* \sa auth_Start, auth_Stop +*/ +void auth_smTimeout (TI_HANDLE hAuth, TI_BOOL bTwdInitOccured) +{ + auth_t *pHandle; + + pHandle = (auth_t*)hAuth; + + if (pHandle == NULL) + return; + + if (pHandle->authType == AUTH_LEGACY_NONE) + return; + + pHandle->authTimeoutCount++; + + switch (pHandle->authType) + { + case AUTH_LEGACY_RESERVED1: + case AUTH_LEGACY_OPEN_SYSTEM: + openAuth_Timeout(pHandle); + break; + + case AUTH_LEGACY_SHARED_KEY: + sharedKey_Timeout(pHandle); + break; + + default: + break; + } +} + +/***************************************************************************** +** +** Authentication messages builder/Parser +** +*****************************************************************************/ + +/** +* +* auth_smMsgBuild - Build an authentication message and send it to the mlme builder +* +* \b Description: +* +* Build an authentication message and send it to the mlme builder. +* +* \b ARGS: +* +* I - pAssoc - Association SM context \n +* I/O - pParam - Parameter \n +* +* \b RETURNS: +* +* TI_OK if successful, TI_NOK otherwise. +* +* \sa auth_Start, auth_Stop +*/ +TI_STATUS auth_smMsgBuild(auth_t *pCtx, TI_UINT16 seq, TI_UINT16 statusCode, TI_UINT8* pChallange, TI_UINT8 challangeLen) +{ + TI_STATUS status; + TI_UINT8 len; + TI_UINT8 authMsg[MAX_AUTH_MSG_LEN]; + authMsg_t *pAuthMsg; + dot11_CHALLENGE_t *pDot11Challenge; + TI_UINT8 wepOpt; + + wepOpt = 0; + + pAuthMsg = (authMsg_t*)authMsg; + + /* insert algorithm */ + pAuthMsg->authAlgo = (TI_UINT16)pCtx->authType; + + /* insert sequense */ + pAuthMsg->seqNum = ENDIAN_HANDLE_WORD(seq); + + /* insert status code */ + pAuthMsg->status = ENDIAN_HANDLE_WORD(statusCode); + + len = sizeof(pAuthMsg->authAlgo) + sizeof(pAuthMsg->seqNum) + sizeof(pAuthMsg->status); + + if (pChallange != NULL) + { + pDot11Challenge = (dot11_CHALLENGE_t*)&authMsg[len]; + + pDot11Challenge->hdr[0] = CHALLANGE_TEXT_IE_ID; + pDot11Challenge->hdr[1] = challangeLen; + + os_memoryCopy(pCtx->hOs, (void *)pDot11Challenge->text, pChallange, challangeLen); + len += challangeLen + 2; + + wepOpt = 1; + } + + status = mlmeBuilder_sendFrame(pCtx->hMlme, AUTH, authMsg, len, wepOpt); + + return status; +} + + + + + + + |