blob: 458f494ef85115d1776ebfb9635861d955f72f3c [file] [log] [blame]
/*
* 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*/