C++程序  |  327行  |  9.09 KB

/*
 * admCtrlNone.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_17
#include "osApi.h"
#include "paramOut.h"
#include "fsm.h"
#include "report.h"
#include "mlmeApi.h"
#include "DataCtrl_Api.h"
#include "rsn.h"
#include "admCtrl.h"
#include "admCtrlNone.h"
#ifdef XCC_MODULE_INCLUDED
#include "XCCMngr.h"
#include "admCtrlWpa.h"
#include "admCtrlXCC.h"
#endif
#include "TWDriver.h"


/* Constants */

/* Enumerations */

/* Typedefs */

/* Structures */

/* External data definitions */

/* Local functions definitions */

/* Global variables */

/* Function prototypes */

/**
*
* admCtrlNone_config  - Configure empty admission control.
*
* \b Description: 
*
* Configure empty admission control.
*
* \b ARGS:
*
*  I   - pAdmCtrl - context \n
*  
* \b RETURNS:
*
*  TI_OK on success, TI_NOK on failure.
*
* \sa 
*/
TI_STATUS admCtrlNone_config(admCtrl_t *pAdmCtrl)
{
	TI_STATUS			status;
	TRsnPaeConfig   	paeConfig;

#ifdef XCC_MODULE_INCLUDED
	TTwdParamInfo   	tTwdParam;
#endif

	if ((pAdmCtrl->authSuite !=	RSN_AUTH_OPEN ) &&
		(pAdmCtrl->authSuite !=	RSN_AUTH_SHARED_KEY) &&
		(pAdmCtrl->authSuite !=	RSN_AUTH_AUTO_SWITCH))	{
		/* The default is OPEN */
		pAdmCtrl->authSuite =	RSN_AUTH_OPEN;
	}
	
	/* set admission control parameters */
    pAdmCtrl->keyMngSuite = RSN_KEY_MNG_NONE;
	pAdmCtrl->externalAuthMode = (EExternalAuthMode)pAdmCtrl->authSuite;
	
	/* set callback functions (API) */
	pAdmCtrl->getInfoElement = admCtrlNone_getInfoElement;
	pAdmCtrl->setSite = admCtrlNone_setSite;
	pAdmCtrl->evalSite = admCtrlNone_evalSite;

	pAdmCtrl->getPmkidList	 = admCtrl_nullGetPMKIDlist;
	pAdmCtrl->setPmkidList	 = admCtrl_nullSetPMKIDlist;
	pAdmCtrl->resetPmkidList = admCtrl_resetPMKIDlist;
	pAdmCtrl->getPreAuthStatus = admCtrl_nullGetPreAuthStatus;
	pAdmCtrl->startPreAuth	= admCtrl_nullStartPreAuth;
    pAdmCtrl->get802_1x_AkmExists = admCtrl_nullGet802_1x_AkmExists;


	
	/* set cipher suite */
	pAdmCtrl->broadcastSuite =  TWD_CIPHER_NONE;
	pAdmCtrl->unicastSuite = TWD_CIPHER_NONE;


	/* set PAE parametrs */
	paeConfig.authProtocol = pAdmCtrl->externalAuthMode;
	paeConfig.unicastSuite = pAdmCtrl->unicastSuite;
	paeConfig.broadcastSuite = pAdmCtrl->broadcastSuite;
	paeConfig.keyExchangeProtocol = pAdmCtrl->keyMngSuite;
	/* set default PAE configuration */
	status = pAdmCtrl->pRsn->setPaeConfig(pAdmCtrl->pRsn, &paeConfig);
						
#ifdef XCC_MODULE_INCLUDED
	/* Clean MIC and KP in HAL and re-send WEP-keys  */
	tTwdParam.paramType = TWD_RSN_XCC_SW_ENC_ENABLE_PARAM_ID; 
	tTwdParam.content.rsnXCCSwEncFlag = TI_FALSE;
	status = TWD_SetParam(pAdmCtrl->pRsn->hTWD, &tTwdParam);

	tTwdParam.paramType = TWD_RSN_XCC_MIC_FIELD_ENABLE_PARAM_ID; 
	tTwdParam.content.rsnXCCMicFieldFlag = TI_FALSE;
	status = TWD_SetParam(pAdmCtrl->pRsn->hTWD, &tTwdParam);
#endif /*XCC_MODULE_INCLUDED*/

	return status;
}


/**
*
* admCtrlNone_getInfoElement - Get the current information element.
*
* \b Description: 
*
* Get the current information element.
*
* \b ARGS:
*
*  I   - pAdmCtrl - context \n
*  I   - pIe - IE buffer \n
*  I   - pLength - length of IE \n
*  
* \b RETURNS:
*
*  TI_OK on success, TI_NOK on failure.
*
* \sa 
*/
TI_STATUS admCtrlNone_getInfoElement(admCtrl_t *pAdmCtrl, TI_UINT8 *pIe, TI_UINT32 *pLength)
{
	*pLength = 0;
	pIe = NULL;

	TI_VOIDCAST(pIe);
	return TI_OK;
}
/**
*
* admCtrlNone_setSite  - Set current primary site parameters for registration.
*
* \b Description: 
*
* Set current primary site parameters for registration.
*
* \b ARGS:
*
*  I   - pAdmCtrl - context \n
*  I   - pRsnData - site's RSN data \n
*  O   - pAssocIe - result IE of evaluation \n
*  O   - pAssocIeLen - length of result IE of evaluation \n
*  
* \b RETURNS:
*
*  TI_OK on site is aproved, TI_NOK on site is rejected.
*
* \sa 
*/
TI_STATUS admCtrlNone_setSite(admCtrl_t *pAdmCtrl, TRsnData *pRsnData, TI_UINT8 *pAssocIe, TI_UINT8 *pAssocIeLen)
{
	TI_STATUS			status;
	paramInfo_t			param;
	TTwdParamInfo		tTwdParam;
	EAuthSuite			authSuite;

	admCtrlNone_config(pAdmCtrl);

	authSuite = pAdmCtrl->authSuite;

  /* Config the default keys */
	if ((authSuite == RSN_AUTH_SHARED_KEY) || (authSuite == RSN_AUTH_AUTO_SWITCH))
	{   /* Configure Security status in HAL */
		tTwdParam.paramType = TWD_RSN_SECURITY_MODE_PARAM_ID;
		tTwdParam.content.rsnEncryptionStatus = (ECipherSuite)TWD_CIPHER_WEP;
		status = TWD_SetParam(pAdmCtrl->pRsn->hTWD, &tTwdParam);
		/* Configure the keys in HAL */
		rsn_setDefaultKeys(pAdmCtrl->pRsn);
	}

#ifdef XCC_MODULE_INCLUDED
	admCtrlXCC_setExtendedParams(pAdmCtrl, pRsnData);
#endif

	/* Now we configure the MLME module with the 802.11 legacy authentication suite, 
		THe MLME will configure later the authentication module */
	param.paramType = MLME_LEGACY_TYPE_PARAM;
	switch (authSuite)
	{
	case RSN_AUTH_OPEN:
		param.content.mlmeLegacyAuthType = AUTH_LEGACY_OPEN_SYSTEM;
		break;

	case RSN_AUTH_SHARED_KEY: 
		param.content.mlmeLegacyAuthType = AUTH_LEGACY_SHARED_KEY;
		break;

	case RSN_AUTH_AUTO_SWITCH:
		param.content.mlmeLegacyAuthType = AUTH_LEGACY_AUTO_SWITCH;
		break;

	default:
		return TI_NOK;
	}
	
	status = mlme_setParam(pAdmCtrl->hMlme, &param);
	if (status != TI_OK)
	{
		return status;
	}

	param.paramType = RX_DATA_EAPOL_DESTINATION_PARAM;
	param.content.rxDataEapolDestination = OS_ABS_LAYER;
	status = rxData_setParam(pAdmCtrl->hRx, &param);
	if (status != TI_OK)
	{
		return status;
	}

	/* Configure privacy status in HAL */
	if (authSuite == RSN_AUTH_OPEN)
	{
		tTwdParam.paramType = TWD_RSN_SECURITY_MODE_PARAM_ID;
		tTwdParam.content.rsnEncryptionStatus = (ECipherSuite)TWD_CIPHER_NONE;
		status = TWD_SetParam(pAdmCtrl->pRsn->hTWD, &tTwdParam);
	}

	return status;
}

/**
*
* admCtrlNone_evalSite  - Evaluate site for registration.
*
* \b Description: 
*
* evaluate site RSN capabilities against the station's cap.
* If the BSS type is infrastructure, the station matches the site only if it's WEP status is same as the site
* In IBSS, it does not matter
*
* \b ARGS:
*
*  I   - pAdmCtrl - Context \n
*  I   - pRsnData - site's RSN data \n
*  O   - pEvaluation - Result of evaluation \n
*  
* \b RETURNS:
*
*  TI_OK 
*
* \sa 
*/
TI_STATUS admCtrlNone_evalSite(admCtrl_t *pAdmCtrl, TRsnData *pRsnData, TRsnSiteParams *pRsnSiteParams, TI_UINT32 *pEvaluation)
{
	if ((pAdmCtrl==NULL) || (pEvaluation==NULL)){
		return TI_NOK;
	}
	*pEvaluation = 1;
	
	/* Check privacy bit if not in mixed mode */
	if (!pAdmCtrl->mixedMode)
	{   /* There's no mixed mode, so make sure that the privacy Bit is off*/
		if (pRsnData->privacy)
		{
			*pEvaluation = 0;
			return TI_NOK;
		}
	}

    TRACE1(pAdmCtrl->hReport, REPORT_SEVERITY_INFORMATION, "admCtrlNone_evalSite:  pEvaluation=%d\n\n", *pEvaluation);

   	return TI_OK;
	
}