diff options
Diffstat (limited to 'wl1271/stad/src/Connection_Managment/rsn.c')
-rw-r--r-- | wl1271/stad/src/Connection_Managment/rsn.c | 2442 |
1 files changed, 0 insertions, 2442 deletions
diff --git a/wl1271/stad/src/Connection_Managment/rsn.c b/wl1271/stad/src/Connection_Managment/rsn.c deleted file mode 100644 index 0222010..0000000 --- a/wl1271/stad/src/Connection_Managment/rsn.c +++ /dev/null @@ -1,2442 +0,0 @@ -/* - * rsn.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 rsn.c - * \brief 802.11 rsniation SM source - * - * \see rsnSM.h - */ - - -/***************************************************************************/ -/* */ -/* MODULE: rsnSM.c */ -/* PURPOSE: 802.11 rsniation SM source */ -/* */ -/***************************************************************************/ - -#define __FILE_ID__ FILE_ID_40 -#include "osApi.h" -#include "paramOut.h" -#include "timer.h" -#include "report.h" -#include "DataCtrl_Api.h" -#include "siteMgrApi.h" -#include "smeApi.h" -#include "mainSecSm.h" -#include "admCtrl.h" -#include "rsnApi.h" -#include "rsn.h" -#include "keyParser.h" -#include "EvHandler.h" -#include "TI_IPC_Api.h" -#include "sme.h" -#include "apConn.h" -#include "802_11Defs.h" -#include "externalSec.h" -#include "connApi.h" -#ifdef XCC_MODULE_INCLUDED -#include "admCtrlWpa.h" -#include "XCCMngr.h" -#include "admCtrlXCC.h" -#endif -#include "TWDriver.h" -#include "DrvMainModules.h" -#include "PowerMgr_API.h" - -/* Constants */ - -/* Enumerations */ - -/* Typedefs */ - -/* Structures */ - -/* External data definitions */ - -/* External functions definitions */ - -/* Global variables */ - -/* Local function prototypes */ -TI_STATUS rsn_sendKeysNotSet(rsn_t *pRsn); -void rsn_pairwiseReKeyTimeout(TI_HANDLE hRsn, TI_BOOL bTwdInitOccured); -void rsn_groupReKeyTimeout(TI_HANDLE hRsn, TI_BOOL bTwdInitOccured); -void rsn_micFailureReportTimeout (TI_HANDLE hRsn, TI_BOOL bTwdInitOccured); -static rsn_siteBanEntry_t * findEntryForInsert(TI_HANDLE hRsn); -static rsn_siteBanEntry_t * findBannedSiteAndCleanup(TI_HANDLE hRsn, TMacAddr siteBssid); - -/* functions */ - -/** -* -* rsn_Create - allocate memory for rsniation SM -* -* \b Description: -* -* Allocate memory for rsniation SM. \n -* Allocates memory for Rsniation context. \n -* Allocates memory for rsniation timer. \n -* Allocates memory for rsniation SM matrix. \n -* -* \b ARGS: -* -* I - hOs - OS context \n -* -* \b RETURNS: -* -* TI_OK if successful, TI_NOK otherwise. -* -* \sa rsn_mainSecKeysOnlyStop() -*/ -TI_HANDLE rsn_create(TI_HANDLE hOs) -{ - rsn_t *pRsn; - - /* allocate rsniation context memory */ - pRsn = (rsn_t*)os_memoryAlloc (hOs, sizeof(rsn_t)); - if (pRsn == NULL) - { - return NULL; - } - - os_memoryZero (hOs, pRsn, sizeof(rsn_t)); - - /* create admission control */ - pRsn->pAdmCtrl = admCtrl_create (hOs); - if (pRsn->pAdmCtrl == NULL) - { - os_memoryFree (hOs, pRsn, sizeof(rsn_t)); - return NULL; - } - - /* create main security SM */ - pRsn->pMainSecSm = mainSec_create (hOs); - if (pRsn->pMainSecSm == NULL) - { - admCtrl_unload (pRsn->pAdmCtrl); - os_memoryFree (hOs, pRsn, sizeof(rsn_t)); - return NULL; - } - - pRsn->pKeyParser = pRsn->pMainSecSm->pKeyParser; - - pRsn->hOs = hOs; - - return pRsn; -} - - -/** -* -* rsn_Unload - unload rsniation SM from memory -* -* \b Description: -* -* Unload rsniation SM from memory -* -* \b ARGS: -* -* I - hRsn - rsniation SM context \n -* -* \b RETURNS: -* -* TI_OK if successful, TI_NOK otherwise. -* -* \sa rsn_mainSecKeysOnlyStop() -*/ -TI_STATUS rsn_unload (TI_HANDLE hRsn) -{ - rsn_t *pRsn; - TI_STATUS status; - - if (hRsn == NULL) - { - return TI_NOK; - } - - pRsn = (rsn_t*)hRsn; - - if (pRsn->hMicFailureReportWaitTimer) - { - tmr_DestroyTimer (pRsn->hMicFailureReportWaitTimer); - } - if (pRsn->hMicFailureGroupReKeyTimer) - { - tmr_DestroyTimer (pRsn->hMicFailureGroupReKeyTimer); - } - if (pRsn->hMicFailurePairwiseReKeyTimer) - { - tmr_DestroyTimer (pRsn->hMicFailurePairwiseReKeyTimer); - } - - status = admCtrl_unload (pRsn->pAdmCtrl); - status = mainSec_unload (pRsn->pMainSecSm); - - os_memoryFree (pRsn->hOs, hRsn, sizeof(rsn_t)); - - return status; -} - - -/** -* -* rsn_init - Init module -* -* \b Description: -* -* Init module handles and variables. -* -* \b RETURNS: -* -* void -* -* \sa rsn_Create, rsn_Unload -*/ -void rsn_init (TStadHandlesList *pStadHandles) -{ - rsn_t *pRsn = (rsn_t*)(pStadHandles->hRsn); - - pRsn->eGroupKeyUpdate = GROUP_KEY_UPDATE_FALSE; - pRsn->ePairwiseKeyUpdate = PAIRWISE_KEY_UPDATE_FALSE; - pRsn->PrivacyOptionImplemented = TI_TRUE; - - pRsn->hTxCtrl = pStadHandles->hTxCtrl; - pRsn->hRx = pStadHandles->hRxData; - pRsn->hConn = pStadHandles->hConn; - pRsn->hTWD = pStadHandles->hTWD; - pRsn->hCtrlData = pStadHandles->hCtrlData; - pRsn->hSiteMgr = pStadHandles->hSiteMgr; - pRsn->hReport = pStadHandles->hReport; - pRsn->hOs = pStadHandles->hOs; - pRsn->hXCCMngr = pStadHandles->hXCCMngr; - pRsn->hEvHandler= pStadHandles->hEvHandler; - pRsn->hSmeSm = pStadHandles->hSme; - pRsn->hAPConn = pStadHandles->hAPConnection; - pRsn->hMlme = pStadHandles->hMlmeSm; - pRsn->hPowerMgr = pStadHandles->hPowerMgr; - pRsn->hTimer = pStadHandles->hTimer; - pRsn->hCurrBss = pStadHandles->hCurrBss; - - pRsn->setPaeConfig = rsn_setPaeConfig; - pRsn->getNetworkMode = rsn_getNetworkMode; - pRsn->setKey = rsn_setKey; - pRsn->removeKey = rsn_removeKey; - pRsn->reportStatus = rsn_reportStatus; - pRsn->setDefaultKeyId = rsn_setDefaultKeyId; - pRsn->getPortStatus = rsn_getPortStatus; - pRsn->setPortStatus = rsn_setPortStatus; - - pRsn->defaultKeysOn = TI_TRUE; - pRsn->eapType = OS_EAP_TYPE_NONE; - pRsn->numOfBannedSites = 0; - pRsn->genericIE.length = 0; -} - - -TI_STATUS rsn_SetDefaults (TI_HANDLE hRsn, TRsnInitParams *pInitParam) -{ - rsn_t *pRsn = (rsn_t*)hRsn; - TI_UINT8 keyIndex; - TI_STATUS status; - - /* Create the module's timers */ - pRsn->hMicFailureReportWaitTimer = tmr_CreateTimer (pRsn->hTimer); - if (pRsn->hMicFailureReportWaitTimer == NULL) - { - TRACE0(pRsn->hReport, REPORT_SEVERITY_ERROR, "rsn_SetDefaults(): Failed to create hMicFailureReportWaitTimer!\n"); - return TI_NOK; - } - pRsn->hMicFailureGroupReKeyTimer = tmr_CreateTimer (pRsn->hTimer); - if (pRsn->hMicFailureGroupReKeyTimer == NULL) - { - TRACE0(pRsn->hReport, REPORT_SEVERITY_ERROR, "rsn_SetDefaults(): Failed to create hMicFailureGroupReKeyTimer!\n"); - return TI_NOK; - } - - /* Configure the RSN external mode (by default we're in internal mode) */ - pRsn->bRsnExternalMode = 0; - - - pRsn->hMicFailurePairwiseReKeyTimer = tmr_CreateTimer (pRsn->hTimer); - if (pRsn->hMicFailurePairwiseReKeyTimer == NULL) - { - TRACE0(pRsn->hReport, REPORT_SEVERITY_ERROR, "rsn_SetDefaults(): Failed to create hMicFailurePairwiseReKeyTimer!\n"); - return TI_NOK; - } - - pRsn->bPairwiseMicFailureFilter = pInitParam->bPairwiseMicFailureFilter; - /* config the admission control with the authentication suite selected. - Admission control will configure the main security SM. */ - status = admCtrl_config (pRsn->pAdmCtrl, - pRsn->hMlme, - pRsn->hRx, - pRsn->hReport, - pRsn->hOs, - pRsn, - pRsn->hXCCMngr, - pRsn->hPowerMgr, - pRsn->hEvHandler, - pRsn->hTimer, - pRsn->hCurrBss, - pInitParam); - - if (status != TI_OK) - { - return status; - } - - /* Configure keys from registry */ - if (pInitParam->privacyOn) - { - pRsn->wepStaticKey = TI_TRUE; - } - - pRsn->defaultKeyId = pInitParam->defaultKeyId; - for (keyIndex = 0; keyIndex < MAX_KEYS_NUM; keyIndex++) - { - os_memoryCopy (pRsn->hOs, &pRsn->keys[keyIndex], &pInitParam->keys[keyIndex], sizeof(TSecurityKeys)); - if (pRsn->keys[keyIndex].keyType != KEY_NULL) - { - pRsn->wepDefaultKeys[keyIndex] = TI_TRUE; - } - pRsn->keys_en [keyIndex] = TI_FALSE; - } - - return status; -} - - -/** -* -* rsn_reconfig - re-configure a rsniation -* -* \b Description: -* -* Re-configure rsniation -* -* \b ARGS: -* -* I - hRsn - Rsniation SM context \n -* -* \b RETURNS: -* -* TI_OK if successful, TI_NOK otherwise. -* -* \sa rsn_Create, rsn_Unload -*/ -TI_STATUS rsn_reconfig (TI_HANDLE hRsn) -{ - rsn_t *pRsn = (rsn_t *)hRsn; - TI_UINT8 keyIndex; - - /* Mark all keys as removed */ - for (keyIndex = 0; keyIndex < MAX_KEYS_NUM; keyIndex++) - pRsn->keys_en [keyIndex] = TI_FALSE; - - return TI_OK; -} - - -/** -* -* rsn_setDefaultKeys - -* -* \b Description: -* -* -* -* \b ARGS: -* -* I - hRsn - Rsn SM context \n -* -* \b RETURNS: -* -* TI_OK if successful, TI_NOK otherwise. -* -* \sa rsn_Stop, rsn_Recv -*/ -TI_STATUS rsn_setDefaultKeys(rsn_t *pRsn) -{ - TI_STATUS status = TI_OK; - TTwdParamInfo tTwdParam; - TI_UINT8 keyIndex; - - for (keyIndex = 0; keyIndex < MAX_KEYS_NUM; keyIndex++) - { - /* Set the WEP key to the HAL */ - if (pRsn->wepDefaultKeys[keyIndex] /*pRsn->keys[keyIndex].encLen>0*/) - { - /* Change key type to WEP-key before setting*/ - pRsn->keys[keyIndex].keyType = KEY_WEP; - - status = pRsn->pMainSecSm->setKey (pRsn->pMainSecSm, &pRsn->keys[keyIndex]); - - if (status != TI_OK) - { - TRACE1(pRsn->hReport, REPORT_SEVERITY_ERROR, "RSN: Setting key #%d failed \n", keyIndex); - return status; - } - } - } - - /* Now we configure default key ID to the HAL */ - if (pRsn->defaultKeyId < MAX_KEYS_NUM) - { - tTwdParam.paramType = TWD_RSN_DEFAULT_KEY_ID_PARAM_ID; - tTwdParam.content.configureCmdCBParams.pCb = &pRsn->defaultKeyId; - tTwdParam.content.configureCmdCBParams.fCb = NULL; - tTwdParam.content.configureCmdCBParams.hCb = NULL; - status = TWD_SetParam (pRsn->hTWD, &tTwdParam); - - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: default key ID =%d \n", pRsn->defaultKeyId); - } - - return status; -} - - -/** -* -* rsn_Start - Start event for the rsniation SM -* -* \b Description: -* -* Start event for the rsniation SM -* -* \b ARGS: -* -* I - hRsn - Rsniation SM context \n -* -* \b RETURNS: -* -* TI_OK if successful, TI_NOK otherwise. -* -* \sa rsn_Stop, rsn_Recv -*/ -TI_STATUS rsn_start(TI_HANDLE hRsn) -{ - TI_STATUS status; - rsn_t *pRsn; - ECipherSuite suite; - EExternalAuthMode extAuthMode; - TTwdParamInfo tTwdParam; - - pRsn = (rsn_t*)hRsn; - - if (pRsn == NULL) - { - return TI_NOK; - } - - TRACE0(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "rsn_start ...\n"); - pRsn->rsnStartedTs = os_timeStampMs (pRsn->hOs); - - status = pRsn->pMainSecSm->start (pRsn->pMainSecSm); - /* Set keys that need to be set */ - pRsn->defaultKeysOn = TI_FALSE; - pRsn->pAdmCtrl->getCipherSuite (pRsn->pAdmCtrl, &suite); - pRsn->pAdmCtrl->getExtAuthMode (pRsn->pAdmCtrl, &extAuthMode); - - if (pRsn->wepStaticKey && ( (suite == TWD_CIPHER_WEP) || (suite == TWD_CIPHER_CKIP) ) ) - { /* set default WEP keys */ - status = rsn_sendKeysNotSet (pRsn); - pRsn->eapType = OS_EAP_TYPE_NONE; - } - else if (suite == TWD_CIPHER_NONE && extAuthMode != RSN_EXT_AUTH_MODE_OPEN) - { /* remove previously WEP key for SHARED */ - pRsn->wepStaticKey = TI_FALSE; - status = rsn_removedDefKeys (pRsn); - - /* Set None to HAL */ - tTwdParam.paramType = TWD_RSN_SECURITY_MODE_PARAM_ID; - tTwdParam.content.rsnEncryptionStatus = (ECipherSuite)TWD_CIPHER_NONE; - status = TWD_SetParam (pRsn->hTWD, &tTwdParam); - - } - else if (suite==TWD_CIPHER_NONE) - { - pRsn->eapType = OS_EAP_TYPE_NONE; - } - - return status; -} - - -TI_STATUS rsn_sendKeysNotSet(rsn_t *pRsn) -{ - TI_UINT8 keyIndex; - OS_802_11_KEY rsnOsKey; - TI_STATUS status = TI_OK; - - for (keyIndex = 0; keyIndex < MAX_KEYS_NUM; keyIndex++) - { - if (pRsn->wepDefaultKeys[keyIndex]) - { - rsnOsKey.KeyIndex = pRsn->keys[keyIndex].keyIndex; - rsnOsKey.KeyLength = pRsn->keys[keyIndex].encLen; - rsnOsKey.Length = sizeof(rsnOsKey); - - /* Change key type to WEP-key before setting*/ - pRsn->keys[keyIndex].keyType = KEY_WEP; - - MAC_COPY (rsnOsKey.BSSID, pRsn->keys[keyIndex].macAddress); - os_memoryCopy (pRsn->hOs, &rsnOsKey.KeyRSC, - (void *)pRsn->keys[keyIndex].keyRsc, - KEY_RSC_LEN); - os_memoryCopy (pRsn->hOs, rsnOsKey.KeyMaterial, - (void *)pRsn->keys[keyIndex].encKey, - MAX_KEY_LEN /*pRsn->keys[keyIndex].encLen*/); - - /* Set WEP transmit key mask on the default key */ - if (keyIndex == pRsn->defaultKeyId) - { - rsnOsKey.KeyIndex |= 0x80000000; - } - - status = pRsn->pKeyParser->recv (pRsn->pKeyParser, (TI_UINT8*)&rsnOsKey, sizeof(rsnOsKey)); - } - } - - return status; -} - - -TI_STATUS rsn_removedDefKeys (TI_HANDLE hRsn) -{ - TI_UINT8 keyIndex; - rsn_t *pRsn = (rsn_t*)hRsn; - - TRACE0(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "rsn_removedDefKeys Enter \n"); - - for (keyIndex = 0; keyIndex < MAX_KEYS_NUM; keyIndex++) - { - TSecurityKeys key; - - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "rsn_removedDefKeys, Remove keyId=%d\n", keyIndex); - - pRsn->wepDefaultKeys[keyIndex] = TI_FALSE; - os_memoryCopy (pRsn->hOs, &key, &pRsn->keys[keyIndex], sizeof(TSecurityKeys)); - pRsn->removeKey (pRsn, &key); - - /* Set WEP transmit key mask on the default key */ - if (keyIndex == pRsn->defaultKeyId) - { - pRsn->defaultKeyId = 0; - } - } - - return TI_OK; -} - - -/** -* -* rsn_Stop - Stop event for the rsniation SM -* -* \b Description: -* -* Stop event for the rsniation SM -* -* \b ARGS: -* -* I - hRsn - Rsniation SM context \n -* -* \b RETURNS: -* -* TI_OK if successful, TI_NOK otherwise. -* -* \sa rsn_Start, rsn_Recv -*/ -TI_STATUS rsn_stop (TI_HANDLE hRsn, TI_BOOL removeKeys) -{ - TI_STATUS status; - rsn_t *pRsn; - TI_UINT8 keyIndex; - TSecurityKeys key; - - pRsn = (rsn_t*)hRsn; - - if (pRsn == NULL) - { - return TI_NOK; - } - - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: calling STOP... removeKeys=%d\n", removeKeys); - - for (keyIndex = 0; keyIndex < MAX_KEYS_NUM; keyIndex++) - { - os_memoryCopy (pRsn->hOs, &key, &pRsn->keys[keyIndex], sizeof(TSecurityKeys)); - key.keyIndex = keyIndex; - - if (!pRsn->wepDefaultKeys[keyIndex]) - { /* Remove only dynamic keys. Default keys are removed by calling: rsn_removedDefKeys() */ - TRACE2(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "rsn_stop, Remove keyIndex=%d, key.keyIndex=%d\n",keyIndex, key.keyIndex); - - TRACE_INFO_HEX(pRsn->hReport, (TI_UINT8 *)key.macAddress, 6); - - pRsn->removeKey (pRsn, &key); - } - - } - - tmr_StopTimer (pRsn->hMicFailureReportWaitTimer); - - /* Stop the pre-authentication timer in case we are disconnecting */ - tmr_StopTimer (pRsn->pAdmCtrl->hPreAuthTimerWpa2); - - status = pRsn->pMainSecSm->stop (pRsn->pMainSecSm); - - pRsn->eGroupKeyUpdate = GROUP_KEY_UPDATE_FALSE; - pRsn->ePairwiseKeyUpdate = PAIRWISE_KEY_UPDATE_FALSE; - pRsn->defaultKeysOn = TI_TRUE; - -#ifdef XCC_MODULE_INCLUDED - pRsn->pAdmCtrl->networkEapMode = OS_XCC_NETWORK_EAP_OFF; -#endif - - if (removeKeys) - { /* reset PMKID list if exist */ - pRsn->pAdmCtrl->resetPmkidList (pRsn->pAdmCtrl); - /* reset unicast and broadcast ciphers after disconnect */ - pRsn->pAdmCtrl->unicastSuite = TWD_CIPHER_NONE; - pRsn->pAdmCtrl->broadcastSuite = TWD_CIPHER_NONE; - } - - return status; -} - -TI_STATUS rsn_getParamEncryptionStatus(TI_HANDLE hRsn, ECipherSuite *rsnStatus) -{ /* RSN_ENCRYPTION_STATUS_PARAM */ - rsn_t *pRsn = (rsn_t *)hRsn; - TI_STATUS status = TI_NOK; - - if ( (NULL == pRsn) || (NULL == rsnStatus) ) - { - return status; - } - status = pRsn->pAdmCtrl->getCipherSuite(pRsn->pAdmCtrl, rsnStatus); - return status; -} - -/** -* -* rsn_GetParam - Get a specific parameter from the rsniation SM -* -* \b Description: -* -* Get a specific parameter from the rsniation SM. -* -* \b ARGS: -* -* I - hRsn - Rsniation SM context \n -* I/O - pParam - Parameter \n -* -* \b RETURNS: -* -* TI_OK if successful, TI_NOK otherwise. -* -* \sa rsn_Start, rsn_Stop -*/ -TI_STATUS rsn_getParam(TI_HANDLE hRsn, void *param) -{ - rsn_t *pRsn = (rsn_t *)hRsn; - paramInfo_t *pParam = (paramInfo_t *)param; - TI_STATUS status = TI_OK; - - if ( (NULL == pRsn) || (NULL == pParam) ) - { - return TI_NOK; - } - - switch (pParam->paramType) - { - case RSN_PRIVACY_OPTION_IMPLEMENTED_PARAM: - pParam->content.rsnPrivacyOptionImplemented = TI_TRUE; - break; - - case RSN_KEY_PARAM: - pParam->content.pRsnKey = &pRsn->keys[pParam->content.pRsnKey->keyIndex]; - if (pParam->content.pRsnKey->keyIndex == pRsn->defaultKeyId) - { - pParam->content.pRsnKey->keyIndex |= 0x80000000; - TRACE1(pRsn->hReport, REPORT_SEVERITY_WARNING, "default Key: %d\n", pRsn->defaultKeyId); - } - break; - - case RSN_SECURITY_STATE_PARAM: - status = pRsn->pMainSecSm->getAuthState (pRsn->pMainSecSm, (TIWLN_SECURITY_STATE*)&(pParam->content.rsnAuthState)); - break; - - case RSN_ENCRYPTION_STATUS_PARAM: - status = pRsn->pAdmCtrl->getCipherSuite (pRsn->pAdmCtrl, &pParam->content.rsnEncryptionStatus); - break; - - case RSN_EXT_AUTHENTICATION_MODE: - status = pRsn->pAdmCtrl->getExtAuthMode (pRsn->pAdmCtrl, &pParam->content.rsnExtAuthneticationMode); - break; - - case RSN_MIXED_MODE: - status = pRsn->pAdmCtrl->getMixedMode (pRsn->pAdmCtrl, &pParam->content.rsnMixedMode); - break; - - case RSN_AUTH_ENCR_CAPABILITY: - status = pRsn->pAdmCtrl->getAuthEncrCap(pRsn->pAdmCtrl, pParam->content.pRsnAuthEncrCapability); - break; - - case RSN_PMKID_LIST: - pParam->content.rsnPMKIDList.Length = pParam->paramLength; - status = pRsn->pAdmCtrl->getPmkidList (pRsn->pAdmCtrl, &pParam->content.rsnPMKIDList); - pParam->paramLength = pParam->content.rsnPMKIDList.Length + 2 * sizeof(TI_UINT32); - break; - - case RSN_PRE_AUTH_STATUS: - { - TI_UINT8 cacheIndex; - - pParam->content.rsnPreAuthStatus = pRsn->pAdmCtrl->getPreAuthStatus (pRsn->pAdmCtrl, &pParam->content.rsnApMac, &cacheIndex); - } - break; - - case RSN_WPA_PROMOTE_AVAILABLE_OPTIONS: - status = pRsn->pAdmCtrl->getWPAMixedModeSupport (pRsn->pAdmCtrl, &pParam->content.rsnWPAMixedModeSupport); - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: Get WPA Mixed MODE support %d \n",pParam->content.rsnWPAMixedModeSupport); - break; - - case RSN_WPA_PROMOTE_OPTIONS: - status = pRsn->pAdmCtrl->getPromoteFlags (pRsn->pAdmCtrl, - &pParam->content.rsnWPAPromoteFlags); - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: Get WPA promote flags %d \n",pParam->content.rsnWPAPromoteFlags); - - break; - -#ifdef XCC_MODULE_INCLUDED - case RSN_XCC_NETWORK_EAP: - status = pRsn->pAdmCtrl->getNetworkEap (pRsn->pAdmCtrl, &pParam->content.networkEap); - break; -#endif - case RSN_EAP_TYPE: - pParam->content.eapType = pRsn->eapType; - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: Get RSN_EAP_TYPE eapType %d \n", pParam->content.eapType); - break; - - case WPA_801_1X_AKM_EXISTS: - - status = pRsn->pAdmCtrl->get802_1x_AkmExists(pRsn->pAdmCtrl, &pParam->content.wpa_802_1x_AkmExists); - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: Get WPA_801_1X_AKM_EXISTS %d \n", pParam->content.wpa_802_1x_AkmExists); - break; - - case RSN_DEFAULT_KEY_ID: - pParam->content.rsnDefaultKeyID = pRsn->defaultKeyId; - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: Get RSN_DEFAULT_KEY_ID %d \n", pParam->content.rsnDefaultKeyID); - break; - - case RSN_PORT_STATUS_PARAM: - TRACE0(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: Get Port Status\n" ); - - if (pRsn->bRsnExternalMode) { - pParam->content.rsnPortStatus = pRsn->getPortStatus( pRsn ); - } else { - status = TI_NOK; - } - break; - - case RSN_EXTERNAL_MODE_PARAM: - TRACE0(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: Get External Mode\n" ); - - pParam->content.rsnExternalMode = pRsn->bRsnExternalMode; - break; - - default: - return TI_NOK; - } - - return status; -} - - -/** -* -* rsn_SetParam - Set a specific parameter to the rsniation SM -* -* \b Description: -* -* Set a specific parameter to the rsniation SM. -* -* \b ARGS: -* -* I - hRsn - Rsniation SM context \n -* I/O - pParam - Parameter \n -* -* \b RETURNS: -* -* TI_OK if successful, TI_NOK otherwise. -* -* \sa rsn_Start, rsn_Stop -*/ -TI_STATUS rsn_setParam (TI_HANDLE hRsn, void *param) -{ - rsn_t *pRsn; - paramInfo_t *pParam = (paramInfo_t*)param; - TTwdParamInfo tTwdParam; - TI_STATUS status = TI_OK; - - pRsn = (rsn_t*)hRsn; - - if ( (NULL == pRsn) || (NULL == pParam) ) - { - return TI_NOK; - } - - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: Set rsn_setParam %X \n", pParam->paramType); - - switch (pParam->paramType) - { - - case RSN_DEFAULT_KEY_ID: - { - TI_UINT8 defKeyId, i; - - defKeyId = pParam->content.rsnDefaultKeyID; - - if(defKeyId >= MAX_KEYS_NUM) - { - TRACE0(pRsn->hReport, REPORT_SEVERITY_ERROR, "RSN: Error - the value of the default Key Id is incorrect \n"); - return TI_NOK; - } - - /* Clean transmit flag (1 in the bit31) in the previous default key */ - for(i = 0; i < MAX_KEYS_NUM; i++) - { - pRsn->keys[i].keyIndex &= 0x7FFFFFFF; - } - - /* Set the default key ID value in the RSN data structure */ - pRsn->defaultKeyId = defKeyId; - - /* Set the default key ID in the HAL */ - tTwdParam.paramType = TWD_RSN_DEFAULT_KEY_ID_PARAM_ID; - tTwdParam.content.configureCmdCBParams.pCb = &pRsn->defaultKeyId; - tTwdParam.content.configureCmdCBParams.fCb = NULL; - tTwdParam.content.configureCmdCBParams.hCb = NULL; - status = TWD_SetParam (pRsn->hTWD, &tTwdParam); - - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: default key ID =%d \n", pRsn->defaultKeyId); - - sme_Restart (pRsn->hSmeSm); - break; - } - - case RSN_ADD_KEY_PARAM: - { - TI_UINT8 keyIndex, i = 0; - ECipherSuite cipherSuite; - - status = pRsn->pAdmCtrl->getCipherSuite (pRsn->pAdmCtrl, &cipherSuite); - if (status !=TI_OK) - { - return status; - } - - TRACE2(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: Set RSN_ADD_KEY_PARAM KeyIndex %x , keyLength=%d\n", pParam->content.rsnOsKey.KeyIndex,pParam->content.rsnOsKey.KeyLength); - keyIndex = (TI_UINT8)pParam->content.rsnOsKey.KeyIndex; - if (keyIndex >= MAX_KEYS_NUM) - { - return TI_NOK; - } - - status = pRsn->pKeyParser->recv (pRsn->pKeyParser, (TI_UINT8*)&pParam->content.rsnOsKey, sizeof(pParam->content.rsnOsKey)); - - if (status != TI_OK) - { -TRACE1(pRsn->hReport, REPORT_SEVERITY_WARNING, ": pRsn->pKeyParser->recv satus returned with status=%x. returning with NOK\n", status); - return TI_NOK; - } - - /* If the Key is not BAD, it may be that WEP key is sent before WEP status is set, - save the key, and set it later at rsn_start */ - - /* If default Key not cleaned by calling rsn_removedDefKeys for keyIndex, Clean it */ - if (pRsn->wepDefaultKeys[keyIndex] == TI_TRUE) - { - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "Set RSN_ADD_KEY_PARAM KeyIndex %x\n", keyIndex); - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "Set RSN_ADD_KEY_PARAM wepDefaultKeys=%d\n", pRsn->wepDefaultKeys[keyIndex]); - - pRsn->wepDefaultKeys[keyIndex] = TI_FALSE; - - } - - pRsn->keys[keyIndex].keyIndex = pParam->content.rsnOsKey.KeyIndex; - pRsn->keys[keyIndex].encLen = pParam->content.rsnOsKey.KeyLength; - MAC_COPY (pRsn->keys[keyIndex].macAddress, pParam->content.rsnOsKey.BSSID); - os_memoryCopy (pRsn->hOs, (void *)pRsn->keys[keyIndex].keyRsc, (TI_UINT8*)&(pParam->content.rsnOsKey.KeyRSC), KEY_RSC_LEN); - os_memoryCopy (pRsn->hOs, (void *)pRsn->keys[keyIndex].encKey, pParam->content.rsnOsKey.KeyMaterial, MAX_KEY_LEN); - - /* Process the transmit flag (31-st bit of keyIndex). */ - /* If the added key has the TX bit set to TI_TRUE (i.e. the key */ - /* is the new transmit key (default key), update */ - /* RSN data def.key Id and clean this bit in all other keys */ - if (pParam->content.rsnOsKey.KeyIndex & 0x80000000) - { - pRsn->defaultKeyId = keyIndex; - - for (i = 0; i < MAX_KEYS_NUM; i ++) - { - if (i != keyIndex) - { - pRsn->keys[i].keyIndex &= 0x7FFFFFFF; - } - } - } - - if (pRsn->defaultKeysOn) - { /* This is a WEP default key */ - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN_ADD_KEY_PARAM, Default key configured - keyIndex=%d-TI_TRUE\n", keyIndex); - - pRsn->wepDefaultKeys[keyIndex] = TI_TRUE; - pRsn->wepStaticKey = TI_TRUE; - status = TI_OK; - } - break; - } - case RSN_REMOVE_KEY_PARAM: - { - TI_UINT8 keyIndex; - ECipherSuite cipherSuite; - - status = pRsn->pAdmCtrl->getCipherSuite (pRsn->pAdmCtrl, &cipherSuite); - if (status !=TI_OK) - { - return status; - } - /*if (cipherSuite == RSN_CIPHER_NONE) - { - TRACE0(pRsn->hReport, REPORT_SEVERITY_ERROR, "RSN: Error Remove Wep/Key when no encryption \n"); - return TI_NOK; - }*/ - - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: Set RSN_REMOVE_KEY_PARAM KeyIndex %x \n", pParam->content.rsnOsKey.KeyIndex); - keyIndex = (TI_UINT8)pParam->content.rsnOsKey.KeyIndex; - if (keyIndex >= MAX_KEYS_NUM) - { - return TI_NOK; - } - - status = pRsn->pKeyParser->remove (pRsn->pKeyParser, - (TI_UINT8*)&pParam->content.rsnOsKey, - sizeof(pParam->content.rsnOsKey)); - - if (status == TI_OK) - { - pRsn->keys[keyIndex].keyType = KEY_NULL; - pRsn->keys[keyIndex].keyIndex &= 0x000000FF; - } - - break; - } - - case RSN_ENCRYPTION_STATUS_PARAM: - { - ECipherSuite cipherSuite; - - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: Set RSN_ENCRYPTION_STATUS_PARAM rsnEncryptionStatus %d \n", pParam->content.rsnEncryptionStatus); - - pRsn->pAdmCtrl->getCipherSuite (pRsn->pAdmCtrl, &cipherSuite); - if (cipherSuite != pParam->content.rsnEncryptionStatus) - { - status = pRsn->pAdmCtrl->setUcastSuite (pRsn->pAdmCtrl, pParam->content.rsnEncryptionStatus); - status = pRsn->pAdmCtrl->setBcastSuite (pRsn->pAdmCtrl, pParam->content.rsnEncryptionStatus); - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, " status = %d \n", status); - } - pRsn->defaultKeysOn = TI_TRUE; - } - break; - - case RSN_EXT_AUTHENTICATION_MODE: - { - EExternalAuthMode extAuthMode; - - pRsn->pAdmCtrl->getExtAuthMode (pRsn->pAdmCtrl, &extAuthMode); - if (pParam->content.rsnExtAuthneticationMode!=extAuthMode) - { - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: Set RSN_EXT_AUTHENTICATION_MODE rsnExtAuthneticationMode %d \n", pParam->content.rsnExtAuthneticationMode); - - /* -TRACE0(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: remove all Keys\n"); - - for (keyIndex=0; keyIndex<MAX_KEYS_NUM; keyIndex++) - { - os_memoryCopy(pRsn->hOs, &key, &pRsn->keys[keyIndex], sizeof(TSecurityKeys)); - pRsn->removeKey(pRsn, &key); - - }*/ - - status = pRsn->pAdmCtrl->setExtAuthMode (pRsn->pAdmCtrl, pParam->content.rsnExtAuthneticationMode); - } - pRsn->defaultKeysOn = TI_TRUE; - } - break; - -#ifdef XCC_MODULE_INCLUDED - case RSN_XCC_NETWORK_EAP: - { - OS_XCC_NETWORK_EAP networkEap; - - pRsn->pAdmCtrl->getNetworkEap (pRsn->pAdmCtrl, &networkEap); - if (networkEap != pParam->content.networkEap) - { - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: Set RSN_XCC_NETWORK_EAP networkEap %d \n", pParam->content.networkEap); - - status = pRsn->pAdmCtrl->setNetworkEap (pRsn->pAdmCtrl, pParam->content.networkEap); - if (status == TI_OK) - { - /*status = RE_SCAN_NEEDED;*/ - } - } - } - break; -#endif - case RSN_MIXED_MODE: - { - TI_BOOL mixedMode; - - pRsn->pAdmCtrl->getMixedMode (pRsn->pAdmCtrl, &mixedMode); - if (mixedMode!=pParam->content.rsnMixedMode) - { - status = pRsn->pAdmCtrl->setMixedMode (pRsn->pAdmCtrl, pParam->content.rsnMixedMode); - - TRACE2(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: Set RSN_MIXED_MODE mixedMode %d, status=%d \n", pParam->content.rsnMixedMode, status); - } - break; - } - - case RSN_PMKID_LIST: - TRACE0(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: Set RSN_PMKID_LIST \n"); - - TRACE_INFO_HEX(pRsn->hReport, (TI_UINT8*)&pParam->content.rsnPMKIDList ,sizeof(OS_802_11_PMKID)); - status = pRsn->pAdmCtrl->setPmkidList (pRsn->pAdmCtrl, - &pParam->content.rsnPMKIDList); - if(status == TI_OK) - { - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: Set RSN_PMKID_LIST: %d PMKID entries has been added to the cache.\n", pParam->content.rsnPMKIDList.BSSIDInfoCount); - } - else - { - TRACE0(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: Set RSN_PMKID_LIST failure"); - } - break; - - case RSN_WPA_PROMOTE_OPTIONS: - status = pRsn->pAdmCtrl->setPromoteFlags (pRsn->pAdmCtrl, - pParam->content.rsnWPAPromoteFlags); - if(status == TI_OK) - { - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: Set WPA promote options: %d \n", pParam->content.rsnWPAPromoteFlags); - } - else - { - TRACE0(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: Set WPA promote options failure"); - } - break; - - case RSN_EAP_TYPE: - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: Set RSN_EAP_TYPE eapType %d \n", pParam->content.eapType); - - pRsn->eapType = pParam->content.eapType; - pRsn->defaultKeysOn = TI_TRUE; - break; - - case RSN_SET_KEY_PARAM: - { - TSecurityKeys *pSecurityKey = pParam->content.pRsnKey; - TI_UINT32 keyIndex; - TI_UINT8 j=0; - - TRACE2(pRsn->hReport,REPORT_SEVERITY_INFORMATION,"RSN:Set RSN_SET_KEY_PARAM KeyIndex %x,keyLength=%d\n",pSecurityKey->keyIndex,pSecurityKey->encLen); - - if(pSecurityKey->keyIndex >= MAX_KEYS_NUM) - { - return TI_NOK; - } - - keyIndex = (TI_UINT8)pSecurityKey->keyIndex; - /* Remove the key when the length is 0, or the type is not set */ - if ( (pSecurityKey->keyType == KEY_NULL) || - (pSecurityKey->encLen == 0)) - { - /* Clearing a key */ - status = rsn_removeKey( pRsn, pSecurityKey ); - break; - } - else - { - status = rsn_setKey (pRsn, pSecurityKey); /* send key to FW*/ - - if (status == TI_OK) - { - //os_memoryCopy(pKeyDerive->hOs,&pRsn->pKeyParser->pUcastKey/pBcastKey, pEncodedKey, sizeof(encodedKeyMaterial_t)); - } /* check this copy */ - - - /* If the Key is not BAD, it may be that WEP key is sent before WEP status is set, - save the key, and set it later at rsn_start */ - - pRsn->keys[keyIndex].keyIndex = pSecurityKey->keyIndex; - pRsn->keys[keyIndex].encLen = pSecurityKey->encLen; - MAC_COPY (pRsn->keys[keyIndex].macAddress, pSecurityKey->macAddress); - os_memoryCopy(pRsn->hOs,(void*)pRsn->keys[keyIndex].keyRsc, (TI_UINT8*)&(pSecurityKey->keyRsc), KEY_RSC_LEN); - os_memoryCopy (pRsn->hOs, (void *)pRsn->keys[keyIndex].encKey, (void*)pSecurityKey->encKey, MAX_KEY_LEN); - - /* Process the transmit flag (31-st bit of keyIndex). */ - /* If the added key has the TX bit set to TI_TRUE (i.e. the key */ - /* is the new transmit key (default key), update */ - /* RSN data def.key Id and clean this bit in all other keys */ - if (pSecurityKey->keyIndex & 0x80000000) - { - pRsn->defaultKeyId = keyIndex; - - for (j = 0; j < MAX_KEYS_NUM; j++) - { - if (j != keyIndex) - { - pRsn->keys[j].keyIndex &= 0x7FFFFFFF; - } - } - } - - if (pRsn->defaultKeysOn) - { /* This is a WEP default key */ - TRACE1(pRsn->hReport,REPORT_SEVERITY_INFORMATION, "RSN_SET_KEY_PARAM, Default key configured-keyIndex=%d-TI_TRUE\n", keyIndex); - - pRsn->wepDefaultKeys[keyIndex] = TI_TRUE; - pRsn->wepStaticKey = TI_TRUE; - status = TI_OK; - } - break; - } - } - break; - - - case RSN_PORT_STATUS_PARAM: - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: Set Port Status %d \n", pParam->content.rsnPortStatus); - - if (pRsn->bRsnExternalMode) { - status = pRsn->setPortStatus( hRsn, pParam->content.rsnPortStatus ); - } else { - status = TI_NOK; - } - break; - - case RSN_GENERIC_IE_PARAM: - TRACE4(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: Set Generic IE: length=%d, IE=%02x%02x%02x... \n", - pParam->content.rsnGenericIE.length, - pParam->content.rsnGenericIE.data[0], pParam->content.rsnGenericIE.data[1],pParam->content.rsnGenericIE.data[2] ); - - status = TI_OK; - - /* make sure it's a valid IE: datal-ength > 2 AND a matching length field */ - if ((pParam->content.rsnGenericIE.length > 2) && - ((pParam->content.rsnGenericIE.data[1] + 2) == pParam->content.rsnGenericIE.length)) { - /* Setting the IE */ - pRsn->genericIE.length = pParam->content.rsnGenericIE.length; - os_memoryCopy(pRsn->hOs,(void*)pRsn->genericIE.data, (TI_UINT8*)pParam->content.rsnGenericIE.data, pParam->content.rsnGenericIE.length); - } else if ( pParam->content.rsnGenericIE.length == 0 ) { - /* Deleting the IE */ - pRsn->genericIE.length = pParam->content.rsnGenericIE.length; - } else { - TRACE0(pRsn->hReport, REPORT_SEVERITY_ERROR, "RSN: Set Generic IE: FAILED sanity checks \n" ); - status = TI_NOK; - } - break; - - case RSN_EXTERNAL_MODE_PARAM: - TRACE0(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: Set External Mode\n" ); - - pRsn->bRsnExternalMode = pParam->content.rsnExternalMode; - break; - - default: - return TI_NOK; - } - - return status; -} - - -/** -* -* rsn_eventRecv - Set a specific parameter to the rsniation SM -* -* \b Description: -* -* Set a specific parameter to the rsniation SM. -* -* \b ARGS: -* -* I - hRsn - Rsniation SM context \n -* I/O - pParam - Parameter \n -* -* \b RETURNS: -* -* TI_OK if successful, TI_NOK otherwise. -* -* \sa rsn_Start, rsn_Stop -*/ -TI_STATUS rsn_reportStatus (rsn_t *pRsn, TI_STATUS rsnStatus) -{ - TI_STATUS status = TI_OK; - paramInfo_t param; - EExternalAuthMode extAuthMode; - - if (pRsn == NULL) - { - return TI_NOK; - } - - if (rsnStatus == TI_OK) - { - /* set EAPOL encryption status according to authentication protocol */ - pRsn->rsnCompletedTs = os_timeStampMs (pRsn->hOs); - - 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); - - /* set WEP invoked mode according to cipher suite */ - switch (pRsn->paeConfig.unicastSuite) - { - case TWD_CIPHER_NONE: - param.content.txDataCurrentPrivacyInvokedMode = TI_FALSE; - break; - - default: - param.content.txDataCurrentPrivacyInvokedMode = TI_TRUE; - break; - } - - if (pRsn->bRsnExternalMode) { - param.content.txDataCurrentPrivacyInvokedMode = TI_TRUE; - txCtrlParams_setEapolEncryptionStatus (pRsn->hTxCtrl, TI_FALSE); - } - - txCtrlParams_setCurrentPrivacyInvokedMode(pRsn->hTxCtrl, param.content.txDataCurrentPrivacyInvokedMode); - /* The value of exclude unencrypted should be as privacy invoked */ - param.paramType = RX_DATA_EXCLUDE_UNENCRYPTED_PARAM; - rxData_setParam (pRsn->hRx, ¶m); - - param.paramType = RX_DATA_EXCLUDE_BROADCAST_UNENCRYPTED_PARAM; - if (pRsn->pAdmCtrl->mixedMode) - { /* do not exclude Broadcast packets */ - param.content.txDataCurrentPrivacyInvokedMode = TI_FALSE; - } - rxData_setParam (pRsn->hRx, ¶m); - } - - else - rsnStatus = (TI_STATUS)STATUS_SECURITY_FAILURE; - - status = conn_reportRsnStatus (pRsn->hConn, (mgmtStatus_e)rsnStatus); - - if (status!=TI_OK) - { - return status; - } - - if (rsnStatus == TI_OK) - { - EvHandlerSendEvent (pRsn->hEvHandler, IPC_EVENT_AUTH_SUCC, NULL, 0); - } - - TRACE0(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: rsn_reportStatus \n"); - - return TI_OK; -} - - -/** -* -* rsn_eventRecv - Set a specific parameter to the rsniation SM -* -* \b Description: -* -* Set a specific parameter to the rsniation SM. -* -* \b ARGS: -* -* I - hRsn - Rsniation SM context \n -* I/O - pParam - Parameter \n -* -* \b RETURNS: -* -* TI_OK if successful, TI_NOK otherwise. -* -* \sa rsn_Start, rsn_Stop -*/ -TI_STATUS rsn_setPaeConfig(rsn_t *pRsn, TRsnPaeConfig *pPaeConfig) -{ - TI_STATUS status; - mainSecInitData_t initData; - - if ( (NULL == pRsn) || (NULL == pPaeConfig) ) - { - return TI_NOK; - } - - TRACE2(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: Calling set PAE config..., unicastSuite = %d, broadcastSuite = %d \n", pPaeConfig->unicastSuite, pPaeConfig->broadcastSuite); - - os_memoryCopy(pRsn->hOs, &pRsn->paeConfig, pPaeConfig, sizeof(TRsnPaeConfig)); - - initData.pPaeConfig = &pRsn->paeConfig; - - status = mainSec_config (pRsn->pMainSecSm, - &initData, - pRsn, - pRsn->hReport, - pRsn->hOs, - pRsn->hCtrlData, - pRsn->hEvHandler, - pRsn->hConn, - pRsn->hTimer); - - return status; -} - - -/** -* -* rsn_eventRecv - Set a specific parameter to the rsniation SM -* -* \b Description: -* -* Set a specific parameter to the rsniation SM. -* -* \b ARGS: -* -* I - hRsn - Rsniation SM context \n -* I/O - pParam - Parameter \n -* -* \b RETURNS: -* -* TI_OK if successful, TI_NOK otherwise. -* -* \sa rsn_Start, rsn_Stop -*/ -TI_STATUS rsn_getNetworkMode(rsn_t *pRsn, ERsnNetworkMode *pNetMode) -{ - paramInfo_t param; - TI_STATUS status; - - param.paramType = CTRL_DATA_CURRENT_BSS_TYPE_PARAM; - - status = ctrlData_getParam (pRsn->hCtrlData, ¶m); - - if (status == TI_OK) - { - if (param.content.ctrlDataCurrentBssType == BSS_INFRASTRUCTURE) - { - *pNetMode = RSN_INFRASTRUCTURE; - } - else - { - *pNetMode = RSN_IBSS; - } - } - else - { - return TI_NOK; - } - - return TI_OK; -} - - -/** -* -* rsn_eventRecv - Set a specific parameter to the rsniation SM -* -* \b Description: -* -* Set a specific parameter to the rsniation SM. -* -* \b ARGS: -* -* I - hRsn - Rsniation SM context \n -* I/O - pParam - Parameter \n -* -* \b RETURNS: -* -* TI_OK if successful, TI_NOK otherwise. -* -* \sa rsn_Start, rsn_Stop -*/ -TI_STATUS rsn_evalSite(TI_HANDLE hRsn, TRsnData *pRsnData, TRsnSiteParams *pRsnSiteParams, TI_UINT32 *pMetric) -{ - - rsn_t *pRsn; - TI_STATUS status; - - if ( (NULL == pRsnData) || (NULL == hRsn) ) - { - *pMetric = 0; - return TI_NOK; - } - - pRsn = (rsn_t*)hRsn; - - if (rsn_isSiteBanned(hRsn, pRsnSiteParams->bssid) == TI_TRUE) - { - *pMetric = 0; - TRACE0(pRsn->hReport, REPORT_SEVERITY_INFORMATION, ": Site is banned!\n"); - return TI_NOK; - } - - if ( pRsn->bRsnExternalMode ) { - /* In external mode, the supplicant is responsible to make sure that site security matches */ - status = TI_OK; - } else { - status = pRsn->pAdmCtrl->evalSite (pRsn->pAdmCtrl, pRsnData, pRsnSiteParams, pMetric); - } - - TRACE2(pRsn->hReport, REPORT_SEVERITY_INFORMATION, ": pMetric=%d status=%d\n", *pMetric, status); - - return status; -} - - -/** -* -* rsn_getInfoElement - -* -* \b Description: -* -* Get the RSN information element. -* -* \b ARGS: -* -* I - hRsn - Rsn SM context \n -* I/O - pRsnIe - Pointer to the return information element \n -* I/O - pRsnIeLen - Pointer to the returned IE's length \n -* -* \b RETURNS: -* -* TI_OK if successful, TI_NOK otherwise. -* -* \sa -*/ -TI_STATUS rsn_getInfoElement(TI_HANDLE hRsn, TI_UINT8 *pRsnIe, TI_UINT32 *pRsnIeLen) -{ - rsn_t *pRsn; - TI_STATUS status; - TI_UINT32 ie_len = 0; - - if ( (NULL == hRsn) || (NULL == pRsnIe) || (NULL == pRsnIeLen) ) - { - return TI_NOK; - } - - pRsn = (rsn_t*)hRsn; - - if (!pRsn->bRsnExternalMode) - { - - status = pRsn->pAdmCtrl->getInfoElement (pRsn->pAdmCtrl, pRsnIe, &ie_len); - - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "rsn_getInfoElement pRsnIeLen= %d\n",*pRsnIeLen); - - if ( status != TI_OK ) { - return status; - } - - pRsnIe += ie_len; - } - - status = rsn_getGenInfoElement(hRsn, pRsnIe, pRsnIeLen); - - *pRsnIeLen += ie_len; - - return status; - -} - - -#ifdef XCC_MODULE_INCLUDED -/** -* -* rsn_getXCCExtendedInfoElement - -* -* \b Description: -* -* Get the Aironet information element. -* -* \b ARGS: -* -* I - hRsn - Rsn SM context \n -* I/O - pRsnIe - Pointer to the return information element \n -* I/O - pRsnIeLen - Pointer to the returned IE's length \n -* -* \b RETURNS: -* -* TI_OK if successful, TI_NOK otherwise. -* -* \sa -*/ -TI_STATUS rsn_getXCCExtendedInfoElement(TI_HANDLE hRsn, TI_UINT8 *pRsnIe, TI_UINT8 *pRsnIeLen) -{ - rsn_t *pRsn; - TI_STATUS status; - - if ( (NULL == hRsn) || (NULL == pRsnIe) || (NULL == pRsnIeLen) ) - { - return TI_NOK; - } - - pRsn = (rsn_t*)hRsn; - - status = admCtrlXCC_getInfoElement (pRsn->pAdmCtrl, pRsnIe, pRsnIeLen); - - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "rsn_getXCCExtendedInfoElement pRsnIeLen= %d\n",*pRsnIeLen); - - return status; -} -#endif - - -/** -* -* rsn_eventRecv - Set a specific parameter to the rsniation SM -* -* \b Description: -* -* Set a specific parameter to the rsniation SM. -* -* \b ARGS: -* -* I - hRsn - Rsniation SM context \n -* I/O - pParam - Parameter \n -* -* \b RETURNS: -* -* TI_OK if successful, TI_NOK otherwise. -* -* \sa rsn_Start, rsn_Stop -*/ -TI_STATUS rsn_setSite(TI_HANDLE hRsn, TRsnData *pRsnData, TI_UINT8 *pAssocIe, TI_UINT8 *pAssocIeLen) -{ - rsn_t *pRsn; - TI_STATUS status; - - if ( (NULL == pRsnData) || (NULL == hRsn) ) - { - *pAssocIeLen = 0; - return TI_NOK; - } - - pRsn = (rsn_t*)hRsn; - - status = pRsn->pAdmCtrl->setSite (pRsn->pAdmCtrl, pRsnData, pAssocIe, pAssocIeLen); - - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "rsn_setSite ieLen= %d\n",pRsnData->ieLen); - return status; -} - - -TI_STATUS rsn_setKey (rsn_t *pRsn, TSecurityKeys *pKey) -{ - TTwdParamInfo tTwdParam; - TI_UINT8 keyIndex; - TI_BOOL macIsBroadcast = TI_FALSE; - TI_STATUS status = TI_OK; - - if (pRsn == NULL || pKey == NULL) - { - return TI_NOK; - } - - keyIndex = (TI_UINT8)pKey->keyIndex; - if (keyIndex >= MAX_KEYS_NUM) - { - return TI_NOK; - } - - if (pKey->keyType != KEY_NULL) - { - - /* If in external mode, set driver's security mode according to the key */ - if (pRsn->bRsnExternalMode) { - tTwdParam.paramType = TWD_RSN_SECURITY_MODE_PARAM_ID; - - switch (pKey->keyType) { - case KEY_TKIP: - tTwdParam.content.rsnEncryptionStatus = (ECipherSuite)TWD_CIPHER_TKIP; - break; - case KEY_AES: - tTwdParam.content.rsnEncryptionStatus = (ECipherSuite)TWD_CIPHER_AES_CCMP; - break; -#ifdef GEM_SUPPORTED - case KEY_GEM: - tTwdParam.content.rsnEncryptionStatus = (ECipherSuite)TWD_CIPHER_GEM; - status = pRsn->pAdmCtrl->setUcastSuite (pRsn->pAdmCtrl, TWD_CIPHER_GEM); - status = pRsn->pAdmCtrl->setBcastSuite (pRsn->pAdmCtrl, TWD_CIPHER_GEM); - break; -#endif - case KEY_WEP: - tTwdParam.content.rsnEncryptionStatus = (ECipherSuite)TWD_CIPHER_WEP; - break; - case KEY_NULL: - case KEY_XCC: - default: - tTwdParam.content.rsnEncryptionStatus = (ECipherSuite)TWD_CIPHER_NONE; - break; - } - status = TWD_SetParam(pRsn->hTWD, &tTwdParam); - if ( status != TI_OK ) { - return status; - } - } - - /* set the size to reserve for encryption to the tx */ - /* update this parameter only in accordance with pairwise key setting */ - if (!MAC_BROADCAST(pKey->macAddress)) - { - - /* set the size to reserve for encryption to the tx */ - switch (pKey->keyType) - { - case KEY_TKIP: - txCtrlParams_setEncryptionFieldSizes (pRsn->hTxCtrl, IV_FIELD_SIZE); - break; - case KEY_AES: - txCtrlParams_setEncryptionFieldSizes (pRsn->hTxCtrl, AES_AFTER_HEADER_FIELD_SIZE); - break; -#ifdef GEM_SUPPORTED - case KEY_GEM: -#endif - case KEY_WEP: - case KEY_NULL: - case KEY_XCC: - default: - txCtrlParams_setEncryptionFieldSizes (pRsn->hTxCtrl, 0); - break; - } - - } - - pRsn->keys[keyIndex].keyType = pKey->keyType; - pRsn->keys[keyIndex].keyIndex = keyIndex; - - if (!pRsn->bRsnExternalMode) { - - macIsBroadcast = MAC_BROADCAST (pKey->macAddress); - if ((pRsn->keys[keyIndex].keyType != KEY_NULL )&& - macIsBroadcast && !MAC_BROADCAST((pRsn->keys[keyIndex].macAddress))) - { /* In case a new Group key is set instead of a Unicast key, - first remove the UNIcast key from FW */ - rsn_removeKey(pRsn, &pRsn->keys[keyIndex]); - } - - if (macIsBroadcast) - { - TRACE0(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: rsn_setKey, Group ReKey timer started\n"); - tmr_StopTimer (pRsn->hMicFailureGroupReKeyTimer); - tmr_StartTimer (pRsn->hMicFailureGroupReKeyTimer, - rsn_groupReKeyTimeout, - (TI_HANDLE)pRsn, - RSN_MIC_FAILURE_RE_KEY_TIMEOUT, - TI_FALSE); - pRsn->eGroupKeyUpdate = GROUP_KEY_UPDATE_TRUE; - } - else - { - if (pRsn->bPairwiseMicFailureFilter) /* the value of this flag is taken from registry */ - { - TRACE0(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: rsn_setKey, Pairwise ReKey timer started\n"); - tmr_StopTimer (pRsn->hMicFailurePairwiseReKeyTimer); - tmr_StartTimer (pRsn->hMicFailurePairwiseReKeyTimer, - rsn_pairwiseReKeyTimeout, - (TI_HANDLE)pRsn, - RSN_MIC_FAILURE_RE_KEY_TIMEOUT, - TI_FALSE); - pRsn->ePairwiseKeyUpdate = PAIRWISE_KEY_UPDATE_TRUE; - } - } - } - - /* Mark key as added */ - pRsn->keys_en [keyIndex] = TI_TRUE; - - tTwdParam.paramType = TWD_RSN_KEY_ADD_PARAM_ID; - tTwdParam.content.configureCmdCBParams.pCb = (TI_UINT8*) pKey; - tTwdParam.content.configureCmdCBParams.fCb = NULL; - tTwdParam.content.configureCmdCBParams.hCb = NULL; - status = TWD_SetParam (pRsn->hTWD, &tTwdParam); - TRACE3(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: rsn_setKey, KeyType=%d, KeyId = 0x%lx,encLen=0x%x\n", pKey->keyType,pKey->keyIndex, pKey->encLen); - - TRACE0(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "\nEncKey = "); - - TRACE_INFO_HEX(pRsn->hReport, (TI_UINT8 *)pKey->encKey, pKey->encLen); - - if (pKey->keyType != KEY_WEP) - { - TRACE0(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "\nMac address = "); - TRACE_INFO_HEX(pRsn->hReport, (TI_UINT8 *)pKey->macAddress, MAC_ADDR_LEN); - TRACE0(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "\nRSC = "); - TRACE_INFO_HEX(pRsn->hReport, (TI_UINT8 *)pKey->keyRsc, KEY_RSC_LEN); - TRACE0(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "\nMic RX = "); - TRACE_INFO_HEX(pRsn->hReport, (TI_UINT8 *)pKey->micRxKey, MAX_KEY_LEN); - TRACE0(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "\nMic TX = "); - TRACE_INFO_HEX(pRsn->hReport, (TI_UINT8 *)pKey->micTxKey, MAX_KEY_LEN); - } - } - - return status; -} - - -TI_STATUS rsn_removeKey (rsn_t *pRsn, TSecurityKeys *pKey) -{ - TI_STATUS status = TI_OK; - TTwdParamInfo tTwdParam; - TI_UINT8 keyIndex; - - if (pRsn == NULL || pKey == NULL) - { - return TI_NOK; - } - - keyIndex = (TI_UINT8)pKey->keyIndex; - if (keyIndex >= MAX_KEYS_NUM) - { - return TI_NOK; - } - - TRACE2(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "rsn_removeKey Entry, keyType=%d, keyIndex=0x%lx\n",pKey->keyType, keyIndex); - - /* Now set to the RSN structure. */ - if (pRsn->keys_en[keyIndex]) - { - tTwdParam.paramType = TWD_RSN_KEY_REMOVE_PARAM_ID; - /*os_memoryCopy(pRsn->hOs, &tTwdParam.content.rsnKey, pKey, sizeof(TSecurityKeys));*/ - tTwdParam.content.configureCmdCBParams.pCb = (TI_UINT8*) pKey; - tTwdParam.content.configureCmdCBParams.fCb = NULL; - tTwdParam.content.configureCmdCBParams.hCb = NULL; - - if ( pKey->keyType == KEY_NULL ) { - /* If keytype is unknown, retreive it from the RSN context */ - pKey->keyType = pRsn->keys[keyIndex].keyType; - } - - /* If keyType is TKIP or AES, set the encLen to the KEY enc len - 16 */ - if (pKey->keyType == KEY_TKIP || pKey->keyType == KEY_AES) - { - pKey->encLen = 16; - if (keyIndex != 0) - { - const TI_UINT8 broadcast[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - /* - * if keyType is TKIP or AES, and the key index is broadcast, overwrite the MAC address as broadcast - * for removing the Broadcast key from the FW - */ - MAC_COPY (pKey->macAddress, broadcast); - } - } - else if (pKey->keyType == KEY_WEP) - { - /* In full driver we use only WEP default keys. To remove it we make sure that the MAC address is NULL */ - os_memoryZero(pRsn->hOs,(void*)pKey->macAddress,sizeof(TMacAddr)); - } - - - /* Mark key as deleted */ - pRsn->keys_en[keyIndex] = TI_FALSE; - - status = TWD_SetParam (pRsn->hTWD, &tTwdParam); - - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "rsn_removeKey in whal, status =%d\n", status); - - /* clean the key flags*/ - pRsn->keys[keyIndex].keyIndex &= 0x000000FF; - pRsn->keys[keyIndex].keyType = KEY_NULL; - pRsn->keys[keyIndex].encLen = 0; - pRsn->wepDefaultKeys[keyIndex] = TI_FALSE; - } - - return status; -} - - -TI_STATUS rsn_setDefaultKeyId(rsn_t *pRsn, TI_UINT8 keyId) -{ - TI_STATUS status = TI_OK; - TTwdParamInfo tTwdParam; - - if (pRsn == NULL) - { - return TI_NOK; - } - pRsn->defaultKeyId = keyId; - /* Now we configure default key ID to the HAL */ - tTwdParam.paramType = TWD_RSN_DEFAULT_KEY_ID_PARAM_ID; - tTwdParam.content.configureCmdCBParams.pCb = &keyId; - tTwdParam.content.configureCmdCBParams.fCb = NULL; - tTwdParam.content.configureCmdCBParams.hCb = NULL; - status = TWD_SetParam (pRsn->hTWD, &tTwdParam); - - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "RSN: rsn_setDefaultKeyId, KeyId = 0x%lx\n", keyId); - return status; -} - - -TI_STATUS rsn_reportAuthFailure(TI_HANDLE hRsn, EAuthStatus authStatus) -{ - TI_STATUS status = TI_OK; - rsn_t *pRsn; - paramInfo_t param; - - if (hRsn==NULL) - { - return TI_NOK; - } - - pRsn = (rsn_t*)hRsn; - - /* Remove AP from candidate list for a specified amount of time */ - param.paramType = CTRL_DATA_CURRENT_BSSID_PARAM; - status = ctrlData_getParam(pRsn->hCtrlData, ¶m); - if (status != TI_OK) - { -TRACE0(pRsn->hReport, REPORT_SEVERITY_ERROR, "rsn_reportAuthFailure, unable to retrieve BSSID \n"); - } - else - { - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "current station is banned from the roaming candidates list for %d Ms\n", RSN_AUTH_FAILURE_TIMEOUT); - - rsn_banSite(hRsn, param.content.ctrlDataCurrentBSSID, RSN_SITE_BAN_LEVEL_FULL, RSN_AUTH_FAILURE_TIMEOUT); - } - - -#ifdef XCC_MODULE_INCLUDED -TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "CALLING rougeAP, status= %d \n",authStatus); - status = XCCMngr_rogueApDetected (pRsn->hXCCMngr, authStatus); -#endif - TI_VOIDCAST(pRsn); - return status; -} - - -/****** -This is the CB function for mic failure event from the FW -*******/ -TI_STATUS rsn_reportMicFailure(TI_HANDLE hRsn, TI_UINT8 *pType, TI_UINT32 Length) -{ - rsn_t *pRsn = (rsn_t *) hRsn; - ERsnSiteBanLevel banLevel; - OS_802_11_AUTHENTICATION_REQUEST *request; - TI_UINT8 AuthBuf[sizeof(TI_UINT32) + sizeof(OS_802_11_AUTHENTICATION_REQUEST)]; - paramInfo_t param; - TI_UINT8 failureType; - - failureType = *pType; - - if (((pRsn->paeConfig.unicastSuite == TWD_CIPHER_TKIP) && (failureType == KEY_TKIP_MIC_PAIRWISE)) || - ((pRsn->paeConfig.broadcastSuite == TWD_CIPHER_TKIP) && (failureType == KEY_TKIP_MIC_GROUP))) - { - /* check if the MIC failure is group and group key update */ - /* was performed during the last 3 seconds */ - if ((failureType == KEY_TKIP_MIC_GROUP) && - (pRsn->eGroupKeyUpdate == GROUP_KEY_UPDATE_TRUE)) - { - TRACE0(pRsn->hReport, REPORT_SEVERITY_INFORMATION, ": Group MIC failure ignored, key update was performed within the last 3 seconds.\n"); - return TI_OK; - } - - /* check if the MIC failure is pairwise and pairwise key update */ - /* was performed during the last 3 seconds */ - if ((failureType == KEY_TKIP_MIC_PAIRWISE) && - (pRsn->ePairwiseKeyUpdate == PAIRWISE_KEY_UPDATE_TRUE)) - { - TRACE0(pRsn->hReport, REPORT_SEVERITY_INFORMATION, ": Pairwise MIC failure ignored, key update was performed within the last 3 seconds.\n"); - return TI_OK; - } - - /* Prepare the Authentication Request */ - 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; - if (ctrlData_getParam (pRsn->hCtrlData, ¶m) != TI_OK) - { - return TI_NOK; - } - - /* Generate 802 Media specific indication event */ - *(TI_UINT32*)AuthBuf = os802_11StatusType_Authentication; - - MAC_COPY (request->BSSID, param.content.ctrlDataCurrentBSSID); - - if (failureType == KEY_TKIP_MIC_PAIRWISE) - { - request->Flags = OS_802_11_REQUEST_PAIRWISE_ERROR; - } - else - { - request->Flags = OS_802_11_REQUEST_GROUP_ERROR; - } - - EvHandlerSendEvent (pRsn->hEvHandler, - IPC_EVENT_MEDIA_SPECIFIC, - (TI_UINT8*)AuthBuf, - sizeof(TI_UINT32) + sizeof(OS_802_11_AUTHENTICATION_REQUEST)); - - if ( pRsn->bRsnExternalMode ) { - return TI_OK; - } - - /* Update and check the ban level to decide what actions need to take place */ - banLevel = rsn_banSite (hRsn, param.content.ctrlDataCurrentBSSID, RSN_SITE_BAN_LEVEL_HALF, RSN_MIC_FAILURE_TIMEOUT); - if (banLevel == RSN_SITE_BAN_LEVEL_FULL) - { - /* Site is banned so prepare to disconnect */ - TRACE0(pRsn->hReport, REPORT_SEVERITY_INFORMATION, ": Second MIC failure, closing Rx port...\n"); - - param.paramType = RX_DATA_PORT_STATUS_PARAM; - param.content.rxDataPortStatus = CLOSE; - rxData_setParam(pRsn->hRx, ¶m); - - /* stop the mic failure Report timer and start a new one for 0.5 seconds */ - tmr_StopTimer (pRsn->hMicFailureReportWaitTimer); - apConn_setDeauthPacketReasonCode(pRsn->hAPConn, STATUS_MIC_FAILURE); - tmr_StartTimer (pRsn->hMicFailureReportWaitTimer, - rsn_micFailureReportTimeout, - (TI_HANDLE)pRsn, - RSN_MIC_FAILURE_REPORT_TIMEOUT, - TI_FALSE); - } - else - { - /* Site is only half banned so nothing needs to be done for now */ - TRACE0(pRsn->hReport, REPORT_SEVERITY_INFORMATION, ": First MIC failure, business as usual for now...\n"); - } - } - - return TI_OK; -} - - -void rsn_groupReKeyTimeout(TI_HANDLE hRsn, TI_BOOL bTwdInitOccured) -{ - rsn_t *pRsn; - - pRsn = (rsn_t*)hRsn; - - if (pRsn == NULL) - { - return; - } - - pRsn->eGroupKeyUpdate = GROUP_KEY_UPDATE_FALSE; -} - - -void rsn_pairwiseReKeyTimeout(TI_HANDLE hRsn, TI_BOOL bTwdInitOccured) -{ - rsn_t *pRsn; - - pRsn = (rsn_t*)hRsn; - - if (pRsn == NULL) - { - return; - } - - pRsn->ePairwiseKeyUpdate = PAIRWISE_KEY_UPDATE_FALSE; -} - -void rsn_micFailureReportTimeout (TI_HANDLE hRsn, TI_BOOL bTwdInitOccured) -{ - rsn_t *pRsn; - - pRsn = (rsn_t*)hRsn; - - if (pRsn == NULL) - { - return; - } - - TRACE0(pRsn->hReport, REPORT_SEVERITY_INFORMATION, ": MIC failure reported, disassociating...\n"); - - apConn_reportRoamingEvent (pRsn->hAPConn, ROAMING_TRIGGER_SECURITY_ATTACK, NULL); -} - - -/** -* -* rsn_resetPMKIDList - -* -* \b Description: -* Cleans up the PMKID cache. -* Called when SSID is being changed. -* -* \b ARGS: -* -* I - hRsn - Rsniation SM context \n -* -* \b RETURNS: -* -* TI_OK if successful, TI_NOK otherwise. -*/ - -TI_STATUS rsn_resetPMKIDList(TI_HANDLE hRsn) -{ - rsn_t *pRsn = (rsn_t*)hRsn; - - if (!pRsn) - return TI_NOK; - - return (pRsn->pAdmCtrl->resetPmkidList (pRsn->pAdmCtrl)); -} - - -void rsn_debugFunc(TI_HANDLE hRsn) -{ - rsn_t *pRsn; - - if (hRsn == NULL) - { - return; - } - pRsn = (rsn_t*)hRsn; - - WLAN_OS_REPORT(("rsnStartedTs, ts = %d\n", pRsn->rsnStartedTs)); - WLAN_OS_REPORT(("rsnCompletedTs, ts = %d\n", pRsn->rsnCompletedTs)); -} - - -/** -* -* rsn_startPreAuth - -* -* \b Description: -* -* Start pre-authentication on a list of given BSSIDs. -* -* \b ARGS: -* -* I - hRsn - Rsniation SM context \n -* I/O - pBssidList - list of BSSIDs that require Pre-Auth \n -* -* \b RETURNS: -* -* TI_OK if successful, TI_NOK otherwise. -* -* \sa -*/ -TI_STATUS rsn_startPreAuth(TI_HANDLE hRsn, TBssidList4PreAuth *pBssidList) -{ - rsn_t *pRsn; - TI_STATUS status; - - if ( (NULL == hRsn) || (NULL == pBssidList) ) - { - return TI_NOK; - } - - pRsn = (rsn_t*)hRsn; - - status = pRsn->pAdmCtrl->startPreAuth (pRsn->pAdmCtrl, pBssidList); - - TRACE0(pRsn->hReport, REPORT_SEVERITY_INFORMATION, "rsn_startPreAuth \n"); - - return status; -} - - -/** - * - * isSiteBanned - - * - * \b Description: - * - * Returns whether or not the site with the specified Bssid is banned or not. - * - * \b ARGS: - * - * I - hRsn - RSN module context \n - * I - siteBssid - The desired site's bssid \n - * - * \b RETURNS: - * - * TI_NOK iff site is banned. - * - */ -TI_BOOL rsn_isSiteBanned(TI_HANDLE hRsn, TMacAddr siteBssid) -{ - rsn_t * pRsn = (rsn_t *) hRsn; - rsn_siteBanEntry_t * entry; - - /* Check if site is in the list */ - if ((entry = findBannedSiteAndCleanup(hRsn, siteBssid)) == NULL) - { - return TI_FALSE; - } - - TRACE7(pRsn->hReport, REPORT_SEVERITY_INFORMATION, ": Site %02X-%02X-%02X-%02X-%02X-%02X found with ban level %d...\n", siteBssid[0], siteBssid[1], siteBssid[2], siteBssid[3], siteBssid[4], siteBssid[5], entry->banLevel); - - return (entry->banLevel == RSN_SITE_BAN_LEVEL_FULL); -} - - -/** - * - * rsn_PortStatus_Set API implementation- - * - * \b Description: - * - * set the status port according to the status flag - * - * \b ARGS: - * - * I - hRsn - RSN module context \n - * I - state - The status flag \n - * - * \b RETURNS: - * - * TI_STATUS. - * - */ -TI_STATUS rsn_setPortStatus(TI_HANDLE hRsn, TI_BOOL state) -{ - rsn_t *pRsn = (rsn_t *)hRsn; - struct externalSec_t *pExtSec; - - pExtSec = pRsn->pMainSecSm->pExternalSec; - pExtSec->bPortStatus = state; - if (state) - pRsn->reportStatus( pRsn, TI_OK ); - return externalSec_rsnComplete(pExtSec); -} - - -/** - * - * rsn_banSite - - * - * \b Description: - * - * Bans the specified site from being associated to for the specified duration. - * If a ban level of WARNING is given and no previous ban was in effect the - * warning is marked down but other than that nothing happens. In case a previous - * warning (or ban of course) is still in effect - * - * \b ARGS: - * - * I - hRsn - RSN module context \n - * I - siteBssid - The desired site's bssid \n - * I - banLevel - The desired level of ban (Warning / Ban) - * I - durationMs - The duration of ban in milliseconds - * - * \b RETURNS: - * - * The level of ban (warning / banned). - * - */ -ERsnSiteBanLevel rsn_banSite(TI_HANDLE hRsn, TMacAddr siteBssid, ERsnSiteBanLevel banLevel, TI_UINT32 durationMs) -{ - rsn_t * pRsn = (rsn_t *) hRsn; - rsn_siteBanEntry_t * entry; - - /* Try finding the site in the list */ - if ((entry = findBannedSiteAndCleanup(hRsn, siteBssid)) != NULL) - { - /* Site found so a previous ban is still in effect */ - TRACE6(pRsn->hReport, REPORT_SEVERITY_INFORMATION, ": Site %02X-%02X-%02X-%02X-%02X-%02X found and has been set to ban level full!\n", siteBssid[0], siteBssid[1], siteBssid[2], siteBssid[3], siteBssid[4], siteBssid[5]); - - entry->banLevel = RSN_SITE_BAN_LEVEL_FULL; - } - else - { - /* Site doesn't appear in the list, so find a place to insert it */ - TRACE7(pRsn->hReport, REPORT_SEVERITY_INFORMATION, ": Site %02X-%02X-%02X-%02X-%02X-%02X added with ban level %d!\n", siteBssid[0], siteBssid[1], siteBssid[2], siteBssid[3], siteBssid[4], siteBssid[5], banLevel); - - entry = findEntryForInsert (hRsn); - - MAC_COPY (entry->siteBssid, siteBssid); - entry->banLevel = banLevel; - - pRsn->numOfBannedSites++; - } - - entry->banStartedMs = os_timeStampMs (pRsn->hOs); - entry->banDurationMs = durationMs; - - return entry->banLevel; -} - - -/** - * - * findEntryForInsert - - * - * \b Description: - * - * Returns a place to insert a new banned site. - * - * \b ARGS: - * - * I - hRsn - RSN module context \n - * - * \b RETURNS: - * - * A pointer to a suitable site entry. - * - */ -static rsn_siteBanEntry_t * findEntryForInsert(TI_HANDLE hRsn) -{ - rsn_t * pRsn = (rsn_t *) hRsn; - - /* In the extreme case that the list is full we overwrite an old entry */ - if (pRsn->numOfBannedSites == RSN_MAX_NUMBER_OF_BANNED_SITES) - { - TRACE0(pRsn->hReport, REPORT_SEVERITY_ERROR, ": No room left to insert new banned site, overwriting old one!\n"); - - return &(pRsn->bannedSites[0]); - } - - return &(pRsn->bannedSites[pRsn->numOfBannedSites]); -} - - -/** - * - * findBannedSiteAndCleanup - - * - * \b Description: - * - * Searches the banned sites list for the desired site while cleaning up - * expired sites found along the way. - * - * Note that this function might change the structure of the banned sites - * list so old iterators into the list might be invalidated. - * - * \b ARGS: - * - * I - hRsn - RSN module context \n - * I - siteBssid - The desired site's bssid \n - * - * \b RETURNS: - * - * A pointer to the desired site's entry if found, - * NULL otherwise. - * - */ -static rsn_siteBanEntry_t * findBannedSiteAndCleanup(TI_HANDLE hRsn, TMacAddr siteBssid) -{ - rsn_t * pRsn = (rsn_t *) hRsn; - int iter; - - for (iter = 0; iter < pRsn->numOfBannedSites; iter++) - { - /* If this entry has expired we'd like to clean it up */ - if (os_timeStampMs(pRsn->hOs) - pRsn->bannedSites[iter].banStartedMs >= pRsn->bannedSites[iter].banDurationMs) - { - TRACE1(pRsn->hReport, REPORT_SEVERITY_INFORMATION, ": Found expired entry at index %d, cleaning it up...\n", iter); - - /* Replace this entry with the last one */ - pRsn->bannedSites[iter] = pRsn->bannedSites[pRsn->numOfBannedSites - 1]; - pRsn->numOfBannedSites--; - - /* we now repeat the iteration on this entry */ - iter--; - - continue; - } - - /* Is this the entry for the site we're looking for? */ - if (MAC_EQUAL (siteBssid, pRsn->bannedSites[iter].siteBssid)) - { - TRACE7(pRsn->hReport, REPORT_SEVERITY_INFORMATION, ": Site %02X-%02X-%02X-%02X-%02X-%02X found at index %d!\n", siteBssid[0], siteBssid[1], siteBssid[2], siteBssid[3], siteBssid[4], siteBssid[5], iter); - - return &pRsn->bannedSites[iter]; - } - } - - /* Entry not found... */ - TRACE6(pRsn->hReport, REPORT_SEVERITY_INFORMATION, ": Site %02X-%02X-%02X-%02X-%02X-%02X not found...\n", siteBssid[0], siteBssid[1], siteBssid[2], siteBssid[3], siteBssid[4], siteBssid[5]); - - return NULL; -} - -/** - * - * rsn_getPortStatus - - * - * \b Description: - * - * Returns the extrenalSec port status - * - * \b ARGS: - * - * pRsn - pointer to RSN module context \n - * - * \b RETURNS: - * - * TI_BOOL - the port status True = Open , False = Close - * - */ -TI_BOOL rsn_getPortStatus(rsn_t *pRsn) -{ - struct externalSec_t *pExtSec; - - pExtSec = pRsn->pMainSecSm->pExternalSec; - return pExtSec->bPortStatus; -} - -/** - * - * rsn_getGenInfoElement - - * - * \b Description: - * - * Copies the Generic IE to a given buffer - * - * \b ARGS: - * - * I pRsn - pointer to RSN module context \n - * O out_buff - pointer to the output buffer \n - * O out_buf_length - length of data copied into output buffer \n - * - * \b RETURNS: - * - * TI_UINT8 - The amount of bytes copied. - * - */ -TI_STATUS rsn_getGenInfoElement(rsn_t *pRsn, TI_UINT8 *out_buff, TI_UINT32 *out_buf_length) -{ - if ( !(pRsn && out_buff && out_buf_length) ) { - return TI_NOK; - } - - *out_buf_length = pRsn->genericIE.length; - if (pRsn->genericIE.length > 0) { - os_memoryCopy(pRsn->hOs, out_buff, pRsn->genericIE.data, pRsn->genericIE.length); - } - - return TI_OK; -} - -/** - * - * rsn_clearGenInfoElement - - * - * \b Description: - * - * Clears the Generic IE - * - * \b ARGS: - * - * I pRsn - pointer to RSN module context \n - * - */ -void rsn_clearGenInfoElement(rsn_t *pRsn ) -{ - os_memoryZero(pRsn->hOs, &pRsn->genericIE, sizeof(pRsn->genericIE)); -} - - -#ifdef RSN_NOT_USED - -static TI_INT16 convertAscii2Unicode(TI_INT8* userPwd, TI_INT16 len) -{ - TI_INT16 i; - TI_INT8 unsiiPwd[MAX_PASSWD_LEN]; - - - for (i=0; i<len; i++) - { - unsiiPwd[i] = userPwd[i]; - } - for (i=0; i<len; i++) - { - userPwd[i*2] = unsiiPwd[i]; - userPwd[i*2+1] = 0; - } - return (TI_INT16)(len*2); -} - -#endif - -/*************************************************************************** -* rsn_reAuth * -**************************************************************************** -* DESCRIPTION: This is a callback function called by the whalWPA module whenever -* a broadcast TKIP key was configured to the FW. -* It does the following: -* - resets the ReAuth flag -* - stops the ReAuth timer -* - restore the PS state -* - Send RE_AUTH_COMPLETED event to the upper layer. -* -* INPUTS: hRsn - the object -* -* OUTPUT: None -* -* RETURNS: None -* -***************************************************************************/ -void rsn_reAuth(TI_HANDLE hRsn) -{ - rsn_t *pRsn; - - pRsn = (rsn_t*)hRsn; - - if (pRsn == NULL) - { - return; - } - - if (rxData_IsReAuthInProgress(pRsn->hRx)) - { - rxData_SetReAuthInProgress(pRsn->hRx, TI_FALSE); - rxData_StopReAuthActiveTimer(pRsn->hRx); - rxData_ReauthDisablePriority(pRsn->hRx); - EvHandlerSendEvent(pRsn->hEvHandler, IPC_EVENT_RE_AUTH_COMPLETED, NULL, 0); - } -} |