/* * admCtrl.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 admCtrl.c * \brief Admission control API implimentation * * \see admCtrl.h */ /**************************************************************************** * * * MODULE: Admission Control * * PURPOSE: Admission Control Module API * * * ****************************************************************************/ #define __FILE_ID__ FILE_ID_16 #include "osApi.h" #include "paramOut.h" #include "timer.h" #include "fsm.h" #include "report.h" #include "mlmeApi.h" #include "DataCtrl_Api.h" #include "TI_IPC_Api.h" #include "rsn.h" #include "admCtrl.h" #include "admCtrlWpa.h" #include "admCtrlWpa2.h" #include "admCtrlNone.h" #include "admCtrlWep.h" #include "EvHandler.h" /* Constants */ /* Enumerations */ /* Typedefs */ /* Structures */ /* External data definitions */ /* Local functions definitions */ /* Global variables */ /* Function prototypes */ TI_STATUS admCtrl_setAuthSuite(admCtrl_t *pAdmCtrl, EAuthSuite authSuite); TI_STATUS admCtrl_getAuthSuite(admCtrl_t *pAdmCtrl, EAuthSuite *pSuite); TI_STATUS admCtrl_setNetworkMode(admCtrl_t *pAdmCtrl, ERsnNetworkMode mode); TI_STATUS admCtrl_setExtAuthMode(admCtrl_t *pAdmCtrl, EExternalAuthMode extAuthMode); TI_STATUS admCtrl_getExtAuthMode(admCtrl_t *pAdmCtrl, EExternalAuthMode *pExtAuthMode); TI_STATUS admCtrl_setUcastSuite(admCtrl_t *pAdmCtrl, ECipherSuite suite); TI_STATUS admCtrl_setBcastSuite(admCtrl_t *pAdmCtrl, ECipherSuite suite); TI_STATUS admCtrl_getCipherSuite(admCtrl_t *pAdmCtrl, ECipherSuite *pSuite); TI_STATUS admCtrl_setKeyMngSuite(admCtrl_t *pAdmCtrl, ERsnKeyMngSuite suite); TI_STATUS admCtrl_getMixedMode(admCtrl_t *pAdmCtrl, TI_BOOL *pMixedMode); TI_STATUS admCtrl_setMixedMode(admCtrl_t *pAdmCtrl, TI_BOOL mixedMode); TI_STATUS admCtrl_getAuthEncrCapability(admCtrl_t *pAdmCtrl, rsnAuthEncrCapability_t *authEncrCapability); TI_STATUS admCtrl_getPromoteFlags(admCtrl_t *pAdmCtrl, TI_UINT32 *WPAPromoteFlags); TI_STATUS admCtrl_setPromoteFlags(admCtrl_t *pAdmCtrl, TI_UINT32 WPAPromoteFlags); TI_STATUS admCtrl_getWPAMixedModeSupport(admCtrl_t *pAdmCtrl, TI_UINT32 *support); TI_STATUS admCtrl_checkSetSuite(admCtrl_t *pAdmCtrl, ECipherSuite suite, TI_BOOL Broadcast); #ifdef XCC_MODULE_INCLUDED TI_STATUS admCtrl_setNetworkEap(admCtrl_t *pAdmCtrl, OS_XCC_NETWORK_EAP networkEap); TI_STATUS admCtrl_getNetworkEap(admCtrl_t *pAdmCtrl, OS_XCC_NETWORK_EAP *networkEap); #endif /** * * admCtrl_create * * \b Description: * * Create the admission control context. * * \b ARGS: * * I - role - admission cotrol role (AP or Station) \n * I - authSuite - authentication suite to work with \n * * \b RETURNS: * * TI_OK on success, TI_NOK on failure. * * \sa */ admCtrl_t* admCtrl_create(TI_HANDLE hOs) { admCtrl_t *pHandle; /* allocate rsniation context memory */ pHandle = (admCtrl_t*)os_memoryAlloc(hOs, sizeof(admCtrl_t)); if (pHandle == NULL) { return NULL; } os_memoryZero(hOs, pHandle, sizeof(admCtrl_t)); pHandle->hOs = hOs; return pHandle; } /** * * admCtrl_unload * * \b Description: * * Unload admission control module from memory * * \b ARGS: * * I - hAdmCtrl - Admossion control context \n * * \b RETURNS: * * TI_OK if successful, TI_NOK otherwise. * * \sa admCtrl_create */ TI_STATUS admCtrl_unload (admCtrl_t *pAdmCtrl) { if (pAdmCtrl == NULL) { return TI_NOK; } /* Destroy the wpa2 pre-authentication timer and free the module's memory */ if (pAdmCtrl->hPreAuthTimerWpa2) { tmr_DestroyTimer (pAdmCtrl->hPreAuthTimerWpa2); } os_memoryFree (pAdmCtrl->hOs, pAdmCtrl, sizeof(admCtrl_t)); return TI_OK; } /** * * admCtrl_config * * \b Description: * * Configure the admission control module. * * \b ARGS: * * I - role - admission cotrol role (AP or Station) \n * I - authSuite - authentication suite to work with \n * * \b RETURNS: * * TI_OK on success, TI_NOK on failure. * * \sa */ TI_STATUS admCtrl_config (TI_HANDLE hAdmCtrl, TI_HANDLE hMlme, TI_HANDLE hRx, TI_HANDLE hReport, TI_HANDLE hOs, struct _rsn_t *pRsn, TI_HANDLE hXCCMngr, TI_HANDLE hPowerMgr, TI_HANDLE hEvHandler, TI_HANDLE hTimer, TI_HANDLE hCurrBss, TRsnInitParams *pInitParam) { admCtrl_t *pAdmCtrl; TI_STATUS status; if (hAdmCtrl == NULL) { return TI_NOK; } pAdmCtrl = (admCtrl_t*)hAdmCtrl; pAdmCtrl->pRsn = pRsn; pAdmCtrl->hMlme = hMlme; pAdmCtrl->hRx = hRx; pAdmCtrl->hReport = hReport; pAdmCtrl->hOs = hOs; pAdmCtrl->hXCCMngr = hXCCMngr; pAdmCtrl->hPowerMgr = hPowerMgr; pAdmCtrl->hEvHandler = hEvHandler; pAdmCtrl->hTimer = hTimer; pAdmCtrl->hCurrBss = hCurrBss; /* Initialize admission control parameters */ pAdmCtrl->role = RSN_PAE_SUPP; pAdmCtrl->networkMode = RSN_INFRASTRUCTURE; pAdmCtrl->authSuite = pInitParam->authSuite; pAdmCtrl->externalAuthMode = pInitParam->externalAuthMode; pAdmCtrl->mixedMode = pInitParam->mixedMode; if (pInitParam->privacyOn) { pAdmCtrl->broadcastSuite = TWD_CIPHER_WEP; pAdmCtrl->unicastSuite = TWD_CIPHER_WEP; } else { pAdmCtrl->broadcastSuite = TWD_CIPHER_NONE; pAdmCtrl->unicastSuite = TWD_CIPHER_NONE; } pAdmCtrl->preAuthSupport = pInitParam->preAuthSupport; pAdmCtrl->preAuthTimeout = pInitParam->preAuthTimeout; pAdmCtrl->WPAMixedModeEnable = pInitParam->WPAMixedModeEnable; /*pAdmCtrl->PMKIDCandListDelay = pInitParam->PMKIDCandListDelay;*/ pAdmCtrl->MaxNumOfPMKIDs = PMKID_MAX_NUMBER; /* Initialize admission control member functions */ pAdmCtrl->setAuthSuite = admCtrl_setAuthSuite; pAdmCtrl->setNetworkMode = admCtrl_setNetworkMode; pAdmCtrl->getAuthSuite = admCtrl_getAuthSuite; pAdmCtrl->setExtAuthMode = admCtrl_setExtAuthMode; pAdmCtrl->getExtAuthMode = admCtrl_getExtAuthMode; pAdmCtrl->setUcastSuite = admCtrl_setUcastSuite; pAdmCtrl->setBcastSuite = admCtrl_setBcastSuite; pAdmCtrl->getCipherSuite = admCtrl_getCipherSuite; pAdmCtrl->setKeyMngSuite = admCtrl_setKeyMngSuite; pAdmCtrl->getMixedMode = admCtrl_getMixedMode; pAdmCtrl->setMixedMode = admCtrl_setMixedMode; pAdmCtrl->getAuthEncrCap = admCtrl_getAuthEncrCapability; pAdmCtrl->getPmkidList = admCtrl_nullGetPMKIDlist; pAdmCtrl->setPmkidList = admCtrl_nullSetPMKIDlist; pAdmCtrl->resetPmkidList = admCtrl_resetPMKIDlist; pAdmCtrl->getPromoteFlags = admCtrl_getPromoteFlags; pAdmCtrl->setPromoteFlags = admCtrl_setPromoteFlags; pAdmCtrl->getWPAMixedModeSupport = admCtrl_getWPAMixedModeSupport; #ifdef XCC_MODULE_INCLUDED pAdmCtrl->setNetworkEap = admCtrl_setNetworkEap; pAdmCtrl->getNetworkEap = admCtrl_getNetworkEap; pAdmCtrl->networkEapMode = OS_XCC_NETWORK_EAP_OFF; #endif pAdmCtrl->getPreAuthStatus = admCtrl_nullGetPreAuthStatus; pAdmCtrl->startPreAuth = admCtrl_nullStartPreAuth; pAdmCtrl->get802_1x_AkmExists = admCtrl_nullGet802_1x_AkmExists; /* Zero number of sent wpa2 preauthentication candidates */ pAdmCtrl->numberOfPreAuthCandidates = 0; /* Create hPreAuthTimerWpa2 timer */ pAdmCtrl->hPreAuthTimerWpa2 = tmr_CreateTimer (pAdmCtrl->hTimer); if (pAdmCtrl->hPreAuthTimerWpa2 == NULL) { TRACE0(pAdmCtrl->hReport, REPORT_SEVERITY_ERROR , "admCtrl_config(): Failed to create hPreAuthTimerWpa2!\n"); } status = admCtrl_subConfig(pAdmCtrl); return status; } /** * * admCtrl_subConfig * * \b Description: * * Configure the admission control module according to the Privacy Mode. * * \b ARGS: * * I - pAdmCtrl - pointer to admission cotrol context \n * * \b RETURNS: * * TI_OK on success, TI_NOK on failure. * * \sa */ TI_STATUS admCtrl_subConfig(TI_HANDLE hAdmCtrl) { admCtrl_t* pAdmCtrl = (admCtrl_t*)hAdmCtrl; TI_STATUS status; switch(pAdmCtrl->externalAuthMode) { case RSN_EXT_AUTH_MODE_WPA: case RSN_EXT_AUTH_MODE_WPAPSK: case RSN_EXT_AUTH_MODE_WPANONE: status = admCtrlWpa_config(pAdmCtrl); break; case RSN_EXT_AUTH_MODE_WPA2: case RSN_EXT_AUTH_MODE_WPA2PSK: status = admCtrlWpa2_config(pAdmCtrl); break; default: if(pAdmCtrl->unicastSuite==TWD_CIPHER_NONE) { status = admCtrlNone_config(pAdmCtrl); } else { status = admCtrlWep_config(pAdmCtrl); } break; } return status; } /** * * admCtrl_setNetworkMode - Change current network mode. * * \b Description: * * Change current network mode. * * \b ARGS: * * I - pAdmCtrl - context \n * I - mode - network association mode (Infustrucure/IBSS) \n * * \b RETURNS: * * TI_OK on success, TI_NOK on failure. * * \sa */ TI_STATUS admCtrl_setNetworkMode(admCtrl_t *pAdmCtrl, ERsnNetworkMode mode) { pAdmCtrl->networkMode = mode; return TI_OK; } /** * * admCtrl_setAuthSuite - Change current authentication suite. * * \b Description: * * Change current authentication suite. * * \b ARGS: * * I - pAdmCtrl - context \n * I - authSuite - authentication suite to work with \n * * \b RETURNS: * * TI_OK on success, TI_NOK on failure. * * \sa */ TI_STATUS admCtrl_setAuthSuite(admCtrl_t *pAdmCtrl, EAuthSuite authSuite) { TI_STATUS status = TI_NOK; if (pAdmCtrl == NULL) { return TI_NOK; } if (pAdmCtrl->authSuite == authSuite) { return TI_OK; } if (pAdmCtrl->authSuite > RSN_AUTH_AUTO_SWITCH) { return TI_NOK; } pAdmCtrl->externalAuthMode = (EExternalAuthMode)authSuite; pAdmCtrl->authSuite = authSuite; status = admCtrl_subConfig(pAdmCtrl); return status; } /** * * admCtrl_getAuthSuite - Get current authentication suite. * * \b Description: * * Get current authentication suite. * * \b ARGS: * * I - pAdmCtrl - context \n * O - suite - key management suite to work with \n * * \b RETURNS: * * TI_OK on success, TI_NOK on failure. * * \sa */ TI_STATUS admCtrl_getAuthSuite(admCtrl_t *pAdmCtrl, EAuthSuite *pSuite) { if (pAdmCtrl == NULL) { return TI_NOK; } *pSuite = pAdmCtrl->authSuite; return TI_OK; } /** * * admCtrl_setExtAuthMode - Set current External authentication Mode Status. * * \b Description: * * Set current External authentication Mode Status. * * \b ARGS: * * I - pAdmCtrl - context \n * I - extAuthMode - External authentication Mode \n * * \b RETURNS: * * TI_OK on success, TI_NOK on failure. * * \sa */ TI_STATUS admCtrl_setExtAuthMode(admCtrl_t *pAdmCtrl, EExternalAuthMode extAuthMode) { if (extAuthMode >= RSN_EXT_AUTH_MODEMAX) { return TI_NOK; } if (pAdmCtrl->externalAuthMode == extAuthMode) { return TI_OK; } pAdmCtrl->externalAuthMode = extAuthMode; if (extAuthMode <= RSN_EXT_AUTH_MODE_AUTO_SWITCH) { pAdmCtrl->authSuite = (EAuthSuite)extAuthMode; } else { pAdmCtrl->authSuite = RSN_AUTH_OPEN; } return (admCtrl_subConfig(pAdmCtrl)); } /** * * admCtrl_getExtAuthMode - Get current External authentication Mode Status. * * \b Description: * * Get current External Mode Status. * * \b ARGS: * * I - pAdmCtrl - context \n * I - pExtAuthMode - XCC External Mode Status \n * * \b RETURNS: * * TI_OK on success, TI_NOK on failure. * * \sa */ TI_STATUS admCtrl_getExtAuthMode(admCtrl_t *pAdmCtrl, EExternalAuthMode *pExtAuthMode) { *pExtAuthMode = pAdmCtrl->externalAuthMode; return TI_OK; } /** * * admCtrl_checkSetSuite - * * \b Description: * * Check the validity/support of the cipher suite according to * the admission control parameters * * \b ARGS: * * I - pAdmCtrl - context \n * I - suite - cipher suite to check \n * * \b RETURNS: * * TI_OK on success, TI_NOK on failure. * * \sa */ TI_STATUS admCtrl_checkSetSuite(admCtrl_t *pAdmCtrl, ECipherSuite suite, TI_BOOL Broadcast) { if (pAdmCtrl->externalAuthMode<=RSN_EXT_AUTH_MODE_AUTO_SWITCH) { if ((suite==TWD_CIPHER_NONE) || (suite==TWD_CIPHER_WEP) || (suite==TWD_CIPHER_WEP104)) { return TI_OK; } #ifdef GEM_SUPPORTED else if (suite==TWD_CIPHER_GEM) { return TI_OK; } #endif } else { if ((suite==TWD_CIPHER_TKIP) || (suite==TWD_CIPHER_WEP) || (suite==TWD_CIPHER_WEP104) || (suite==TWD_CIPHER_AES_CCMP)) { return TI_OK; } #ifdef GEM_SUPPORTED else if (suite==TWD_CIPHER_GEM) { return TI_OK; } #endif else if (!Broadcast && (suite==TWD_CIPHER_NONE)) { return TI_OK; } } return TI_NOK; } /** * * admCtrl_setUcastSuite - Set current unicast cipher suite support. * * \b Description: * * Set current unicast cipher suite support. * * \b ARGS: * * I - pAdmCtrl - context \n * I - suite - cipher suite to work with \n * * \b RETURNS: * * TI_OK on success, TI_NOK on failure. * * \sa */ TI_STATUS admCtrl_setUcastSuite(admCtrl_t *pAdmCtrl, ECipherSuite suite) { TI_STATUS status; if (suite == pAdmCtrl->unicastSuite) { return TI_OK; } status = admCtrl_checkSetSuite(pAdmCtrl, suite, TI_FALSE); if (status == TI_OK) { pAdmCtrl->unicastSuite = suite; status = admCtrl_subConfig(pAdmCtrl); } return status; } /** * * admCtrl_setBcastSuite - Set current broadcast cipher suite support. * * \b Description: * * Set current broadcast cipher suite support. * * \b ARGS: * * I - pAdmCtrl - context \n * I - suite - cipher suite to work with \n * * \b RETURNS: * * TI_OK on success, TI_NOK on failure. * * \sa */ TI_STATUS admCtrl_setBcastSuite(admCtrl_t *pAdmCtrl, ECipherSuite suite) { TI_STATUS status; if (suite == pAdmCtrl->broadcastSuite) { return TI_OK; } status = admCtrl_checkSetSuite(pAdmCtrl, suite, TI_TRUE); if (status == TI_OK) { pAdmCtrl->broadcastSuite = suite; status = admCtrl_subConfig(pAdmCtrl); } return status; } /** * * admCtrl_getCipherSuite - Set current broadcast cipher suite support. * * \b Description: * * Set current broadcast cipher suite support. * * \b ARGS: * * I - pAdmCtrl - context \n * O - suite - cipher suite to work with \n * * \b RETURNS: * * TI_OK on success, TI_NOK on failure. * * \sa */ TI_STATUS admCtrl_getCipherSuite(admCtrl_t *pAdmCtrl, ECipherSuite *pSuite) { if (pAdmCtrl == NULL) { return TI_NOK; } *pSuite = (pAdmCtrl->broadcastSuite > pAdmCtrl->unicastSuite) ? pAdmCtrl->broadcastSuite :pAdmCtrl->unicastSuite; return TI_OK; } /** * * admCtrl_setKeyMngSuite - Set current key management suite support. * * \b Description: * * Set current key management suite support. * * \b ARGS: * * I - pAdmCtrl - context \n * I - suite - key management suite to work with \n * * \b RETURNS: * * TI_OK on success, TI_NOK on failure. * * \sa */ TI_STATUS admCtrl_setKeyMngSuite(admCtrl_t *pAdmCtrl, ERsnKeyMngSuite suite) { pAdmCtrl->keyMngSuite = suite; return TI_OK; } /** * * admCtrl_parseIe - Parse a required information element. * * \b Description: * * Parse an Aironet information element. * Builds a structure of all the capabilities described in the Aironet IE. * We look at Flags field only to determine KP and MIC bits value * * \b ARGS: * * I - pAdmCtrl - pointer to admCtrl context * I - pAironetIe - pointer to Aironet IE buffer \n * O - pAironetData - capabilities structure * * * \b RETURNS: * * TI_OK on success, TI_NOK on failure. * * \sa */ TI_STATUS admCtrl_parseIe(admCtrl_t *pAdmCtrl, TRsnData *pRsnData, TI_UINT8 **pIe, TI_UINT8 IeId) { dot11_eleHdr_t *eleHdr; TI_INT16 length; TI_UINT8 *pCurIe; *pIe = NULL; if ((pRsnData == NULL) || (pRsnData->ieLen==0)) { return TI_OK; } pCurIe = pRsnData->pIe; length = pRsnData->ieLen; while (length>0) { eleHdr = (dot11_eleHdr_t*)pCurIe; if (length<((*eleHdr)[1] + 2)) { TRACE2(pAdmCtrl->hReport, REPORT_SEVERITY_INFORMATION, "admCtrl_parseIe ERROR: pRsnData->ieLen=%d, length=%d\n\n", pRsnData->ieLen,length); return TI_OK; } if ((*eleHdr)[0] == IeId) { *pIe = (TI_UINT8*)eleHdr; break; } length -= (*eleHdr)[1] + 2; pCurIe += (*eleHdr)[1] + 2; } return TI_OK; } /** * * admCtrl_setMixedMode - Set current mixed Mode Status. * * \b Description: * * Set current mixed Mode Status. * * \b ARGS: * * I - pAdmCtrl - context \n * I - authMode - mixed Mode \n * * \b RETURNS: * * TI_OK on success, TI_NOK on failure. * * \sa */ TI_STATUS admCtrl_setMixedMode(admCtrl_t *pAdmCtrl, TI_BOOL mixedMode) { if (pAdmCtrl->mixedMode == mixedMode) { return TI_OK; } pAdmCtrl->mixedMode = mixedMode; return TI_OK; } /** * * admCtrl_getMixedMode - Get current mixed Mode Status. * * \b Description: * * Get current mixed Mode Status. * * \b ARGS: * * I - pAdmCtrl - context \n * I - pAuthMode - mixed Mode Status \n * * \b RETURNS: * * TI_OK on success, TI_NOK on failure. * * \sa */ TI_STATUS admCtrl_getMixedMode(admCtrl_t *pAdmCtrl, TI_BOOL *pMixedMode) { *pMixedMode = pAdmCtrl->mixedMode; return TI_OK; } /* This table presents supported pairs of auth.mode/cipher type */ static authEncrPairList_t supportedAuthEncrPairs[MAX_AUTH_ENCR_PAIR] = { {RSN_EXT_AUTH_MODE_OPEN, TWD_CIPHER_NONE}, {RSN_EXT_AUTH_MODE_OPEN, TWD_CIPHER_WEP}, {RSN_EXT_AUTH_MODE_SHARED_KEY, TWD_CIPHER_NONE}, {RSN_EXT_AUTH_MODE_SHARED_KEY, TWD_CIPHER_WEP}, {RSN_EXT_AUTH_MODE_WPA, TWD_CIPHER_TKIP}, {RSN_EXT_AUTH_MODE_WPA, TWD_CIPHER_AES_CCMP}, {RSN_EXT_AUTH_MODE_WPAPSK, TWD_CIPHER_TKIP}, {RSN_EXT_AUTH_MODE_WPAPSK, TWD_CIPHER_AES_CCMP}, {RSN_EXT_AUTH_MODE_WPANONE, TWD_CIPHER_NONE}, /* No encryption in IBSS mode */ {RSN_EXT_AUTH_MODE_WPA2, TWD_CIPHER_TKIP}, {RSN_EXT_AUTH_MODE_WPA2, TWD_CIPHER_AES_CCMP}, {RSN_EXT_AUTH_MODE_WPA2PSK, TWD_CIPHER_TKIP}, {RSN_EXT_AUTH_MODE_WPA2PSK, TWD_CIPHER_AES_CCMP} }; /** * * admCtrl_getAuthEncrCapability - Get all supported pais of * authenticationmode/cipher suite * * \b Description: * * Returns all supported pais of authenticationmode/cipher suite * * \b ARGS: * * I - pAdmCtrl - context \n * I - authEncrCapability - ptr to list of auth.mode/cipher pairs \n * * \b RETURNS: * * TI_OK on success, TI_NOK on failure. * * \sa */ TI_STATUS admCtrl_getAuthEncrCapability(admCtrl_t *pAdmCtrl, rsnAuthEncrCapability_t *authEncrCapability) { int i = 0; if(!authEncrCapability) return TI_NOK; /* The current driver code version uses the above hardcoded list */ /* of auth/encr pairs */ authEncrCapability->NoOfAuthEncrPairSupported = MAX_AUTH_ENCR_PAIR; authEncrCapability->NoOfPMKIDs = PMKID_MAX_NUMBER; TRACE2(pAdmCtrl->hReport, REPORT_SEVERITY_INFORMATION, "admCtrl get AuthEncr capability: No. of auth/encr pairs = %d, No of PMKIDs = %d \n", authEncrCapability->NoOfAuthEncrPairSupported, authEncrCapability->NoOfPMKIDs); /* Copy the hardcoded table of the auth.mode/cipher type */ for (i = 0; i < MAX_AUTH_ENCR_PAIR; i++) { authEncrCapability->authEncrPairs[i].authenticationMode = supportedAuthEncrPairs[i].authenticationMode; authEncrCapability->authEncrPairs[i].cipherSuite = supportedAuthEncrPairs[i].cipherSuite; TRACE3(pAdmCtrl->hReport, REPORT_SEVERITY_INFORMATION, "admCtrl get AuthEncr pair list: i = %d, auth mode = %d , cipher suite = %d \n", i, authEncrCapability->authEncrPairs[i].authenticationMode, authEncrCapability->authEncrPairs[i].cipherSuite); } return TI_OK; } TI_STATUS admCtrl_nullSetPMKIDlist(admCtrl_t *pAdmCtrl, OS_802_11_PMKID *pmkIdList) { return CONFIGURATION_NOT_VALID; } TI_STATUS admCtrl_nullGetPMKIDlist(admCtrl_t *pAdmCtrl, OS_802_11_PMKID *pmkIdList) { return CONFIGURATION_NOT_VALID; } TI_STATUS admCtrl_resetPMKIDlist(admCtrl_t *pAdmCtrl) { os_memoryZero(pAdmCtrl->hOs, (void*)&pAdmCtrl->pmkid_cache, sizeof(pmkid_cache_t)); return TI_OK; } TI_STATUS admCtrl_getWPAMixedModeSupport(admCtrl_t *pAdmCtrl, TI_UINT32 *support) { if(pAdmCtrl->WPAMixedModeEnable) *support = ADMCTRL_WPA_OPTION_MAXVALUE; else *support = 0; return TI_OK; } TI_STATUS admCtrl_getPromoteFlags(admCtrl_t *pAdmCtrl, TI_UINT32 *WPAPromoteFlags) { *WPAPromoteFlags = pAdmCtrl->WPAPromoteFlags; return TI_OK; } TI_STATUS admCtrl_setPromoteFlags(admCtrl_t *pAdmCtrl, TI_UINT32 WPAPromoteFlags) { if(WPAPromoteFlags > ADMCTRL_WPA_OPTION_MAXVALUE) return TI_NOK; if(!pAdmCtrl->WPAMixedModeEnable) return TI_NOK; pAdmCtrl->WPAPromoteFlags = WPAPromoteFlags; return TI_OK; } TI_BOOL admCtrl_nullGetPreAuthStatus(admCtrl_t *pAdmCtrl, TMacAddr *givenAP, TI_UINT8 *cacheIndex) { return TI_FALSE; } TI_STATUS admCtrl_nullStartPreAuth(admCtrl_t *pAdmCtrl, TBssidList4PreAuth *pBssidList) { return TI_OK; } TI_STATUS admCtrl_nullGet802_1x_AkmExists (admCtrl_t *pAdmCtrl, TI_BOOL *wpa_802_1x_AkmExists) { *wpa_802_1x_AkmExists = TI_FALSE; return TI_OK; } /*----------------------------------------------------------------------------- Routine Name: admCtrl_notifyPreAuthStatus Routine Description: This routine is used to notify higher level application of the pre-authentication status Arguments: newStatus - pre authentication status Return Value: -----------------------------------------------------------------------------*/ void admCtrl_notifyPreAuthStatus (admCtrl_t *pAdmCtrl, preAuthStatusEvent_e newStatus) { TI_UINT32 memBuff; memBuff = (TI_UINT32) newStatus; EvHandlerSendEvent(pAdmCtrl->hEvHandler, IPC_EVENT_WPA2_PREAUTHENTICATION, (TI_UINT8*)&memBuff, sizeof(TI_UINT32)); } #ifdef XCC_MODULE_INCLUDED /** * * admCtrl_setNetworkEap - Set current Network EAP Mode Status. * * \b Description: * * Set current Network EAP Mode Status.. * * \b ARGS: * * I - pAdmCtrl - context \n * I - networkEap - Network EAP Mode \n * * \b RETURNS: * * TI_OK on success, TI_NOK on failure. * * \sa */ TI_STATUS admCtrl_setNetworkEap(admCtrl_t *pAdmCtrl, OS_XCC_NETWORK_EAP networkEap) { if (pAdmCtrl==NULL) return TI_NOK; if (pAdmCtrl->networkEapMode == networkEap) { return TI_OK; } pAdmCtrl->networkEapMode = networkEap; return TI_OK; } /** * * admCtrl_getNetworkEap - Get current Network EAP Mode Status. * * \b Description: * * Get current Network EAP Mode Status. * * \b ARGS: * * I - pAdmCtrl - context \n * I - networkEap - Network EAP Mode \n * * \b RETURNS: * * TI_OK on success, TI_NOK on failure. * * \sa */ TI_STATUS admCtrl_getNetworkEap(admCtrl_t *pAdmCtrl, OS_XCC_NETWORK_EAP *networkEap) { if (pAdmCtrl==NULL) { return TI_NOK; } switch (pAdmCtrl->networkEapMode) { case OS_XCC_NETWORK_EAP_OFF: *networkEap = OS_XCC_NETWORK_EAP_OFF; break; case OS_XCC_NETWORK_EAP_ON: case OS_XCC_NETWORK_EAP_ALLOWED: case OS_XCC_NETWORK_EAP_PREFERRED: *networkEap = OS_XCC_NETWORK_EAP_ON; break; default: return TI_NOK; /* break; - unreachable */ } return TI_OK; } #endif /* XCC_MODULE_INCLUDED*/