Home | History | Annotate | Download | only in rsn
      1 /****************************************************************************
      2 **+-----------------------------------------------------------------------+**
      3 **|                                                                       |**
      4 **| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved.      |**
      5 **| All rights reserved.                                                  |**
      6 **|                                                                       |**
      7 **| Redistribution and use in source and binary forms, with or without    |**
      8 **| modification, are permitted provided that the following conditions    |**
      9 **| are met:                                                              |**
     10 **|                                                                       |**
     11 **|  * Redistributions of source code must retain the above copyright     |**
     12 **|    notice, this list of conditions and the following disclaimer.      |**
     13 **|  * Redistributions in binary form must reproduce the above copyright  |**
     14 **|    notice, this list of conditions and the following disclaimer in    |**
     15 **|    the documentation and/or other materials provided with the         |**
     16 **|    distribution.                                                      |**
     17 **|  * Neither the name Texas Instruments nor the names of its            |**
     18 **|    contributors may be used to endorse or promote products derived    |**
     19 **|    from this software without specific prior written permission.      |**
     20 **|                                                                       |**
     21 **| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |**
     22 **| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |**
     23 **| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
     24 **| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |**
     25 **| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
     26 **| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |**
     27 **| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
     28 **| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
     29 **| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |**
     30 **| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
     31 **| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |**
     32 **|                                                                       |**
     33 **+-----------------------------------------------------------------------+**
     34 ****************************************************************************/
     35 
     36 /** \file admCtrl.c
     37  *  \brief Admission control API implimentation
     38  *
     39  *  \see admCtrl.h
     40  */
     41 
     42 #include "osApi.h"
     43 
     44 #include "paramOut.h"
     45 #include "paramIn.h"
     46 
     47 #include "utils.h"
     48 #include "fsm.h"
     49 #include "report.h"
     50 #include "mlmeApi.h"
     51 #include "DataCtrl_Api.h"
     52 
     53 #include "TI_IPC_Api.h"
     54 
     55 #include "rsn.h"
     56 #include "admCtrl.h"
     57 
     58 #include "admCtrlWpa.h"
     59 #include "admCtrlWpa2.h"
     60 #include "admCtrlNone.h"
     61 #include "admCtrlWep.h"
     62 #include "EvHandler.h"
     63 
     64 /* Constants */
     65 
     66 /* Enumerations */
     67 
     68 /* Typedefs */
     69 
     70 /* Structures */
     71 
     72 /* External data definitions */
     73 
     74 /* Local functions definitions */
     75 
     76 /* Global variables */
     77 
     78 /* Function prototypes */
     79 
     80 TI_STATUS admCtrl_setAuthSuite(admCtrl_t *pAdmCtrl, authSuite_e authSuite);
     81 
     82 TI_STATUS admCtrl_getAuthSuite(admCtrl_t *pAdmCtrl, authSuite_e *pSuite);
     83 
     84 TI_STATUS admCtrl_setNetworkMode(admCtrl_t *pAdmCtrl, rsn_networkMode_t mode);
     85 
     86 TI_STATUS admCtrl_setExtAuthMode(admCtrl_t *pAdmCtrl, externalAuthMode_e extAuthMode);
     87 
     88 TI_STATUS admCtrl_getExtAuthMode(admCtrl_t *pAdmCtrl, externalAuthMode_e *pExtAuthMode);
     89 
     90 TI_STATUS admCtrl_setUcastSuite(admCtrl_t *pAdmCtrl, cipherSuite_e suite);
     91 
     92 TI_STATUS admCtrl_setBcastSuite(admCtrl_t *pAdmCtrl, cipherSuite_e suite);
     93 
     94 TI_STATUS admCtrl_getCipherSuite(admCtrl_t *pAdmCtrl, cipherSuite_e *pSuite);
     95 
     96 TI_STATUS admCtrl_setKeyMngSuite(admCtrl_t *pAdmCtrl, rsn_keyMngSuite_e suite);
     97 
     98 TI_STATUS admCtrl_getMixedMode(admCtrl_t *pAdmCtrl, BOOL *pMixedMode);
     99 
    100 TI_STATUS admCtrl_setMixedMode(admCtrl_t *pAdmCtrl, BOOL mixedMode);
    101 
    102 TI_STATUS admCtrl_getAuthEncrCapability(admCtrl_t *pAdmCtrl,
    103                    rsnAuthEncrCapability_t   *authEncrCapability);
    104 
    105 TI_STATUS admCtrl_getPromoteFlags(admCtrl_t *pAdmCtrl, UINT32 *WPAPromoteFlags);
    106 
    107 TI_STATUS admCtrl_setPromoteFlags(admCtrl_t *pAdmCtrl, UINT32 WPAPromoteFlags);
    108 
    109 TI_STATUS admCtrl_getWPAMixedModeSupport(admCtrl_t *pAdmCtrl, UINT32 *support);
    110 
    111 TI_STATUS admCtrl_checkSetSuite(admCtrl_t *pAdmCtrl, cipherSuite_e suite, BOOL Broadcast);
    112 
    113 #ifdef EXC_MODULE_INCLUDED
    114 TI_STATUS admCtrl_setNetworkEap(admCtrl_t *pAdmCtrl, OS_EXC_NETWORK_EAP networkEap);
    115 
    116 TI_STATUS admCtrl_getNetworkEap(admCtrl_t *pAdmCtrl, OS_EXC_NETWORK_EAP *networkEap);
    117 #endif
    118 
    119 /**
    120 *
    121 * admCtrl_create
    122 *
    123 * \b Description:
    124 *
    125 * Create the admission control context.
    126 *
    127 * \b ARGS:
    128 *
    129 *  I   - role - admission cotrol role (AP or Station)  \n
    130 *  I   - authSuite - authentication suite to work with \n
    131 *
    132 * \b RETURNS:
    133 *
    134 *  OK on success, NOK on failure.
    135 *
    136 * \sa
    137 */
    138 admCtrl_t* admCtrl_create(TI_HANDLE hOs)
    139 {
    140 	admCtrl_t 		*pHandle;
    141 
    142 	/* allocate rsniation context memory */
    143 	pHandle = (admCtrl_t*)os_memoryAlloc(hOs, sizeof(admCtrl_t));
    144 	if (pHandle == NULL)
    145 	{
    146 		return NULL;
    147 	}
    148 
    149 	os_memoryZero(hOs, pHandle, sizeof(admCtrl_t));
    150 
    151     pHandle->preAuthTimerWpa2 = os_timerCreate(hOs, admCtrlWpa2_preAuthTimerExpire, pHandle);
    152 
    153     /* If we failed to create the timer - exit with error */
    154     if (pHandle->preAuthTimerWpa2 == NULL)
    155     {
    156        os_memoryFree(pHandle->hOs, pHandle, sizeof(admCtrl_t));
    157        return NULL;
    158     }
    159 	pHandle->hOs = hOs;
    160 
    161 	return pHandle;
    162 }
    163 
    164 /**
    165 *
    166 * admCtrl_unload
    167 *
    168 * \b Description:
    169 *
    170 * Unload admission control module from memory
    171 *
    172 * \b ARGS:
    173 *
    174 *  I   - hAdmCtrl - Admossion control context  \n
    175 *
    176 * \b RETURNS:
    177 *
    178 *  OK if successful, NOK otherwise.
    179 *
    180 * \sa admCtrl_create
    181 */
    182 TI_STATUS admCtrl_unload(admCtrl_t *pAdmCtrl)
    183 {
    184 	if (pAdmCtrl == NULL)
    185 	{
    186 		return NOK;
    187 	}
    188 
    189     /* Stop and destroy the wpa2 pre-authentication timer */
    190    os_timerStop(pAdmCtrl->hOs, pAdmCtrl->preAuthTimerWpa2);
    191    utils_nullTimerDestroy(pAdmCtrl->hOs, pAdmCtrl->preAuthTimerWpa2);
    192 	os_memoryFree(pAdmCtrl->hOs, pAdmCtrl, sizeof(admCtrl_t));
    193 
    194 	return OK;
    195 }
    196 
    197 /**
    198 *
    199 * admCtrl_config
    200 *
    201 * \b Description:
    202 *
    203 * Configure the admission control module.
    204 *
    205 * \b ARGS:
    206 *
    207 *  I   - role - admission cotrol role (AP or Station)  \n
    208 *  I   - authSuite - authentication suite to work with \n
    209 *
    210 * \b RETURNS:
    211 *
    212 *  OK on success, NOK on failure.
    213 *
    214 * \sa
    215 */
    216 TI_STATUS admCtrl_config(TI_HANDLE hAdmCtrl,
    217 					  TI_HANDLE hMlme,
    218 					  TI_HANDLE hRx,
    219 					  TI_HANDLE hReport,
    220 					  TI_HANDLE hOs,
    221 					  struct _rsn_t *pRsn,
    222 					  TI_HANDLE hExcMngr,
    223 					  TI_HANDLE hPowerMgr,
    224 	                  TI_HANDLE	hEvHandler,
    225 					  rsnInitParams_t *pInitParam)
    226 {
    227 	admCtrl_t		*pAdmCtrl;
    228 	TI_STATUS			status;
    229 
    230 	if (hAdmCtrl == NULL)
    231 	{
    232 		return NOK;
    233 	}
    234 
    235 	pAdmCtrl = (admCtrl_t*)hAdmCtrl;
    236 
    237 	pAdmCtrl->pRsn = pRsn;
    238 	pAdmCtrl->hMlme = hMlme;
    239 	pAdmCtrl->hRx = hRx;
    240 	pAdmCtrl->hReport = hReport;
    241 	pAdmCtrl->hOs = hOs;
    242 	pAdmCtrl->hExcMngr = hExcMngr;
    243 	pAdmCtrl->hPowerMgr = hPowerMgr;
    244     pAdmCtrl->hEvHandler = hEvHandler;
    245 
    246 	/* Initialize admission control parameters */
    247 	pAdmCtrl->role = RSN_PAE_SUPP;
    248 	pAdmCtrl->networkMode = RSN_INFRASTRUCTURE;
    249 	pAdmCtrl->authSuite	= pInitParam->authSuite;
    250 	pAdmCtrl->externalAuthMode = pInitParam->externalAuthMode;
    251     pAdmCtrl->mixedMode = pInitParam->mixedMode;
    252 
    253     if (pInitParam->privacyOn)
    254     {
    255         pAdmCtrl->broadcastSuite = RSN_CIPHER_WEP;
    256         pAdmCtrl->unicastSuite = RSN_CIPHER_WEP;
    257     } else {
    258         pAdmCtrl->broadcastSuite = RSN_CIPHER_NONE;
    259         pAdmCtrl->unicastSuite = RSN_CIPHER_NONE;
    260     }
    261 
    262 	pAdmCtrl->preAuthSupport     = pInitParam->preAuthSupport;
    263     pAdmCtrl->preAuthTimeout     = pInitParam->preAuthTimeout;
    264 	pAdmCtrl->WPAMixedModeEnable = pInitParam->WPAMixedModeEnable;
    265 	/*pAdmCtrl->PMKIDCandListDelay = pInitParam->PMKIDCandListDelay;*/
    266 	pAdmCtrl->MaxNumOfPMKIDs     = PMKID_MAX_NUMBER;
    267 
    268 	/* Initialize admission control member functions */
    269 	pAdmCtrl->setAuthSuite = admCtrl_setAuthSuite;
    270 	pAdmCtrl->setNetworkMode = admCtrl_setNetworkMode;
    271 	pAdmCtrl->getAuthSuite = admCtrl_getAuthSuite;
    272 	pAdmCtrl->setExtAuthMode = admCtrl_setExtAuthMode;
    273 	pAdmCtrl->getExtAuthMode = admCtrl_getExtAuthMode;
    274 	pAdmCtrl->setUcastSuite	= admCtrl_setUcastSuite;
    275 	pAdmCtrl->setBcastSuite = admCtrl_setBcastSuite;
    276 	pAdmCtrl->getCipherSuite = admCtrl_getCipherSuite;
    277 	pAdmCtrl->setKeyMngSuite = admCtrl_setKeyMngSuite;
    278     pAdmCtrl->getMixedMode = admCtrl_getMixedMode;
    279     pAdmCtrl->setMixedMode = admCtrl_setMixedMode;
    280     pAdmCtrl->getAuthEncrCap = admCtrl_getAuthEncrCapability;
    281     pAdmCtrl->getPmkidList   = admCtrl_nullGetPMKIDlist;
    282     pAdmCtrl->setPmkidList   = admCtrl_nullSetPMKIDlist;
    283     pAdmCtrl->resetPmkidList = admCtrl_resetPMKIDlist;
    284     pAdmCtrl->getPromoteFlags = admCtrl_getPromoteFlags;
    285     pAdmCtrl->setPromoteFlags = admCtrl_setPromoteFlags;
    286     pAdmCtrl->getWPAMixedModeSupport = admCtrl_getWPAMixedModeSupport;
    287 #ifdef EXC_MODULE_INCLUDED
    288 	pAdmCtrl->setNetworkEap = admCtrl_setNetworkEap;
    289 	pAdmCtrl->getNetworkEap = admCtrl_getNetworkEap;
    290     pAdmCtrl->networkEapMode = OS_EXC_NETWORK_EAP_OFF;
    291 #endif
    292 
    293 	pAdmCtrl->getPreAuthStatus = admCtrl_nullGetPreAuthStatus;
    294 	pAdmCtrl->startPreAuth	= admCtrl_nullStartPreAuth;
    295     pAdmCtrl->get802_1x_AkmExists = admCtrl_nullGet802_1x_AkmExists;
    296     /* Zero number of sent wpa2 preauthentication candidates */
    297     pAdmCtrl->numberOfPreAuthCandidates = 0;
    298 
    299 	status = admCtrl_subConfig(pAdmCtrl);
    300 
    301 	return status;
    302 }
    303 
    304 /**
    305 *
    306 * admCtrl_subConfig
    307 *
    308 * \b Description:
    309 *
    310 * Configure the admission control module according to the Privacy Mode.
    311 *
    312 * \b ARGS:
    313 *
    314 *  I   - pAdmCtrl - pointer to admission cotrol context  \n
    315 *
    316 * \b RETURNS:
    317 *
    318 *  OK on success, NOK on failure.
    319 *
    320 * \sa
    321 */
    322 TI_STATUS admCtrl_subConfig(TI_HANDLE hAdmCtrl)
    323 
    324 {
    325     admCtrl_t* pAdmCtrl = (admCtrl_t*)hAdmCtrl;
    326 	TI_STATUS status;
    327 
    328 	switch(pAdmCtrl->externalAuthMode)
    329 	{
    330 	case RSN_EXT_AUTH_MODE_WPA:
    331 	case RSN_EXT_AUTH_MODE_WPAPSK:
    332 	case RSN_EXT_AUTH_MODE_WPANONE:
    333 		status = admCtrlWpa_config(pAdmCtrl);
    334 		break;
    335 
    336 	case RSN_EXT_AUTH_MODE_WPA2:
    337 	case RSN_EXT_AUTH_MODE_WPA2PSK:
    338 		status = admCtrlWpa2_config(pAdmCtrl);
    339 		break;
    340 
    341 	default:
    342 		if(pAdmCtrl->unicastSuite==RSN_CIPHER_NONE)
    343 		{
    344 			status = admCtrlNone_config(pAdmCtrl);
    345 		}
    346 		else
    347 		{
    348 			status = admCtrlWep_config(pAdmCtrl);
    349 		}
    350 		break;
    351 
    352 	}
    353 
    354 	return status;
    355 
    356 }
    357 
    358 /**
    359 *
    360 * admCtrl_setNetworkMode - Change current network mode.
    361 *
    362 * \b Description:
    363 *
    364 * Change current network mode.
    365 *
    366 * \b ARGS:
    367 *
    368 *  I   - pAdmCtrl - context \n
    369 *  I   - mode - network association mode (Infustrucure/IBSS) \n
    370 *
    371 * \b RETURNS:
    372 *
    373 *  OK on success, NOK on failure.
    374 *
    375 * \sa
    376 */
    377 TI_STATUS admCtrl_setNetworkMode(admCtrl_t *pAdmCtrl, rsn_networkMode_t mode)
    378 {
    379     pAdmCtrl->networkMode = mode;
    380 
    381     return OK;
    382 }
    383 
    384 /**
    385 *
    386 * admCtrl_setAuthSuite - Change current authentication suite.
    387 *
    388 * \b Description:
    389 *
    390 * Change current authentication suite.
    391 *
    392 * \b ARGS:
    393 *
    394 *  I   - pAdmCtrl - context \n
    395 *  I   - authSuite - authentication suite to work with \n
    396 *
    397 * \b RETURNS:
    398 *
    399 *  OK on success, NOK on failure.
    400 *
    401 * \sa
    402 */
    403 TI_STATUS admCtrl_setAuthSuite(admCtrl_t *pAdmCtrl, authSuite_e authSuite)
    404 {
    405 	TI_STATUS 		status = NOK;
    406 
    407 	if (pAdmCtrl == NULL)
    408 	{
    409 		return NOK;
    410 	}
    411 
    412 	if (pAdmCtrl->authSuite == authSuite)
    413 	{
    414 		return OK;
    415 	}
    416 
    417 	if (pAdmCtrl->authSuite > RSN_AUTH_AUTO_SWITCH)
    418 	{
    419 		return NOK;
    420 	}
    421 	pAdmCtrl->externalAuthMode = (externalAuthMode_e)authSuite;
    422 	pAdmCtrl->authSuite = authSuite;
    423 	status = admCtrl_subConfig(pAdmCtrl);
    424 	return status;
    425 }
    426 
    427 
    428 /**
    429 *
    430 * admCtrl_getAuthSuite  - Get current authentication suite.
    431 *
    432 * \b Description:
    433 *
    434 * Get current authentication suite.
    435 *
    436 * \b ARGS:
    437 *
    438 *  I   - pAdmCtrl - context \n
    439 *  O   - suite - key management suite to work with \n
    440 *
    441 * \b RETURNS:
    442 *
    443 *  OK on success, NOK on failure.
    444 *
    445 * \sa
    446 */
    447 TI_STATUS admCtrl_getAuthSuite(admCtrl_t *pAdmCtrl, authSuite_e *pSuite)
    448 {
    449 	if (pAdmCtrl == NULL)
    450 	{
    451 		return NOK;
    452 	}
    453 
    454 	*pSuite = pAdmCtrl->authSuite;
    455 
    456 	return OK;
    457 }
    458 
    459 /**
    460 *
    461 * admCtrl_setExtAuthMode  - Set current External authentication Mode Status.
    462 *
    463 * \b Description:
    464 *
    465 * Set current External authentication Mode Status.
    466 *
    467 * \b ARGS:
    468 *
    469 *  I   - pAdmCtrl - context \n
    470 *  I   - extAuthMode - External authentication Mode \n
    471 *
    472 * \b RETURNS:
    473 *
    474 *  OK on success, NOK on failure.
    475 *
    476 * \sa
    477 */
    478 TI_STATUS admCtrl_setExtAuthMode(admCtrl_t *pAdmCtrl, externalAuthMode_e extAuthMode)
    479 {
    480 
    481 	if (extAuthMode >= RSN_EXT_AUTH_MODEMAX)
    482 	{
    483 		return NOK;
    484 	}
    485 
    486 
    487 	if (pAdmCtrl->externalAuthMode == extAuthMode)
    488 	{
    489 		return OK;
    490 	}
    491 	pAdmCtrl->externalAuthMode = extAuthMode;
    492 	if (extAuthMode <= RSN_EXT_AUTH_MODE_AUTO_SWITCH)
    493 	{
    494 		pAdmCtrl->authSuite = (authSuite_e)extAuthMode;
    495 	}
    496 	else
    497 	{
    498 		pAdmCtrl->authSuite = RSN_AUTH_OPEN;
    499 	}
    500 
    501 	return (admCtrl_subConfig(pAdmCtrl));
    502 }
    503 
    504 /**
    505 *
    506 * admCtrl_getExtAuthMode  - Get current External authentication Mode Status.
    507 *
    508 * \b Description:
    509 *
    510 * Get current External Mode Status.
    511 *
    512 * \b ARGS:
    513 *
    514 *  I   - pAdmCtrl - context \n
    515 *  I   - pExtAuthMode - EXC External Mode Status \n
    516 *
    517 * \b RETURNS:
    518 *
    519 *  OK on success, NOK on failure.
    520 *
    521 * \sa
    522 */
    523 TI_STATUS admCtrl_getExtAuthMode(admCtrl_t *pAdmCtrl, externalAuthMode_e *pExtAuthMode)
    524 {
    525 	*pExtAuthMode = pAdmCtrl->externalAuthMode;
    526 
    527 	return OK;
    528 }
    529 
    530 
    531 /**
    532 *
    533 * admCtrl_checkSetSuite -
    534 *
    535 * \b Description:
    536 *
    537 * Check the validity/support of the cipher suite according to
    538 * the admission control parameters
    539 *
    540 * \b ARGS:
    541 *
    542 *  I   - pAdmCtrl - context \n
    543 *  I   - suite - cipher suite to check \n
    544 *
    545 * \b RETURNS:
    546 *
    547 *  OK on success, NOK on failure.
    548 *
    549 * \sa
    550 */
    551 TI_STATUS admCtrl_checkSetSuite(admCtrl_t *pAdmCtrl, cipherSuite_e suite, BOOL Broadcast)
    552 {
    553 	if (pAdmCtrl->externalAuthMode<=RSN_EXT_AUTH_MODE_AUTO_SWITCH)
    554 	{
    555 		if ((suite==RSN_CIPHER_NONE) || (suite==RSN_CIPHER_WEP) || (suite==RSN_CIPHER_WEP104))
    556 		{
    557 			return OK;
    558 		}
    559 	}
    560 	else
    561 	{
    562 		if ((suite==RSN_CIPHER_TKIP) || (suite==RSN_CIPHER_WEP) ||
    563 			(suite==RSN_CIPHER_WEP104) || (suite==RSN_CIPHER_AES_CCMP))
    564 		{
    565 			return OK;
    566 		}
    567 		else if (!Broadcast && (suite==RSN_CIPHER_NONE))
    568 		{
    569 			return OK;
    570 		}
    571 	}
    572 	return NOK;
    573 }
    574 
    575 /**
    576 *
    577 * admCtrl_setUcastSuite  - Set current unicast cipher suite support.
    578 *
    579 * \b Description:
    580 *
    581 * Set current unicast cipher suite support.
    582 *
    583 * \b ARGS:
    584 *
    585 *  I   - pAdmCtrl - context \n
    586 *  I   - suite - cipher suite to work with \n
    587 *
    588 * \b RETURNS:
    589 *
    590 *  OK on success, NOK on failure.
    591 *
    592 * \sa
    593 */
    594 TI_STATUS admCtrl_setUcastSuite(admCtrl_t *pAdmCtrl, cipherSuite_e suite)
    595 {
    596 	TI_STATUS status;
    597 
    598 	if (suite == pAdmCtrl->unicastSuite)
    599 	{
    600 		return OK;
    601 	}
    602 	status = admCtrl_checkSetSuite(pAdmCtrl, suite, FALSE);
    603 	if (status == OK)
    604 	{
    605 		pAdmCtrl->unicastSuite = suite;
    606 		status = admCtrl_subConfig(pAdmCtrl);
    607 	}
    608 
    609 	return status;
    610 }
    611 
    612 /**
    613 *
    614 * admCtrl_setBcastSuite  - Set current broadcast cipher suite support.
    615 *
    616 * \b Description:
    617 *
    618 * Set current broadcast cipher suite support.
    619 *
    620 * \b ARGS:
    621 *
    622 *  I   - pAdmCtrl - context \n
    623 *  I   - suite - cipher suite to work with \n
    624 *
    625 * \b RETURNS:
    626 *
    627 *  OK on success, NOK on failure.
    628 *
    629 * \sa
    630 */
    631 TI_STATUS admCtrl_setBcastSuite(admCtrl_t *pAdmCtrl, cipherSuite_e suite)
    632 {
    633 	TI_STATUS status;
    634 
    635 	if (suite == pAdmCtrl->broadcastSuite)
    636 	{
    637 		return OK;
    638 	}
    639 
    640 	status = admCtrl_checkSetSuite(pAdmCtrl, suite, TRUE);
    641 	if (status == OK)
    642 	{
    643 		pAdmCtrl->broadcastSuite = suite;
    644 		status = admCtrl_subConfig(pAdmCtrl);
    645 	}
    646 	return status;
    647 
    648 }
    649 
    650 /**
    651 *
    652 * admCtrl_getCipherSuite  - Set current broadcast cipher suite support.
    653 *
    654 * \b Description:
    655 *
    656 * Set current broadcast cipher suite support.
    657 *
    658 * \b ARGS:
    659 *
    660 *  I   - pAdmCtrl - context \n
    661 *  O   - suite - cipher suite to work with \n
    662 *
    663 * \b RETURNS:
    664 *
    665 *  OK on success, NOK on failure.
    666 *
    667 * \sa
    668 */
    669 TI_STATUS admCtrl_getCipherSuite(admCtrl_t *pAdmCtrl, cipherSuite_e *pSuite)
    670 {
    671 	if (pAdmCtrl == NULL)
    672 	{
    673 		return NOK;
    674 	}
    675 
    676 	*pSuite = (pAdmCtrl->broadcastSuite > pAdmCtrl->unicastSuite) ? pAdmCtrl->broadcastSuite :pAdmCtrl->unicastSuite;
    677 
    678 	return OK;
    679 }
    680 
    681 /**
    682 *
    683 * admCtrl_setKeyMngSuite  - Set current key management suite support.
    684 *
    685 * \b Description:
    686 *
    687 * Set current key management suite support.
    688 *
    689 * \b ARGS:
    690 *
    691 *  I   - pAdmCtrl - context \n
    692 *  I   - suite - key management suite to work with \n
    693 *
    694 * \b RETURNS:
    695 *
    696 *  OK on success, NOK on failure.
    697 *
    698 * \sa
    699 */
    700 TI_STATUS admCtrl_setKeyMngSuite(admCtrl_t *pAdmCtrl, rsn_keyMngSuite_e suite)
    701 {
    702     pAdmCtrl->keyMngSuite = suite;
    703 
    704 	return OK;
    705 }
    706 
    707 
    708 /**
    709 *
    710 * admCtrl_parseIe  - Parse a required information element.
    711 *
    712 * \b Description:
    713 *
    714 * Parse an Aironet information element.
    715 * Builds a structure of all the capabilities described in the Aironet IE.
    716 * We look at Flags field only to determine KP and MIC bits value
    717 *
    718 * \b ARGS:
    719 *
    720 *  I   - pAdmCtrl - pointer to admCtrl context
    721 *  I   - pAironetIe - pointer to Aironet IE buffer  \n
    722 *  O   - pAironetData - capabilities structure
    723 *
    724 *
    725 * \b RETURNS:
    726 *
    727 * OK on success, NOK on failure.
    728 *
    729 * \sa
    730 */
    731 TI_STATUS admCtrl_parseIe(admCtrl_t *pAdmCtrl, rsnData_t *pRsnData, UINT8 **pIe, UINT8 IeId)
    732 {
    733 
    734 	dot11_eleHdr_t   *eleHdr;
    735 	INT16			 length;
    736 	UINT8            *pCurIe;
    737 
    738 
    739 	*pIe = NULL;
    740 
    741 	if ((pRsnData == NULL) || (pRsnData->ieLen==0))
    742 	{
    743 	   return OK;
    744 	}
    745 
    746 	pCurIe = pRsnData->pIe;
    747 
    748 	length = pRsnData->ieLen;
    749 	while (length>0)
    750 	{
    751 		eleHdr = (dot11_eleHdr_t*)pCurIe;
    752 
    753 		if (length<(eleHdr->eleLen+2))
    754 		{
    755 			WLAN_REPORT_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG,
    756 								("admCtrl_parseIe ERROR: pRsnData->ieLen=%d, length=%d\n\n", pRsnData->ieLen,length));
    757 			return OK;
    758 		}
    759 
    760 		if (eleHdr->eleId == IeId)
    761 		{
    762             *pIe = (UINT8*)eleHdr;
    763             break;
    764 		}
    765 		length -= eleHdr->eleLen+2;
    766 		pCurIe += eleHdr->eleLen+2;
    767 	}
    768 	return OK;
    769 }
    770 
    771 /**
    772 *
    773 * admCtrl_setMixedMode  - Set current mixed Mode Status.
    774 *
    775 * \b Description:
    776 *
    777 * Set current mixed Mode Status.
    778 *
    779 * \b ARGS:
    780 *
    781 *  I   - pAdmCtrl - context \n
    782 *  I   - authMode - mixed Mode \n
    783 *
    784 * \b RETURNS:
    785 *
    786 *  OK on success, NOK on failure.
    787 *
    788 * \sa
    789 */
    790 TI_STATUS admCtrl_setMixedMode(admCtrl_t *pAdmCtrl, BOOL mixedMode)
    791 {
    792 
    793 	if (pAdmCtrl->mixedMode == mixedMode)
    794 	{
    795 		return OK;
    796 	}
    797 	pAdmCtrl->mixedMode = mixedMode;
    798 
    799 	return OK;
    800 }
    801 
    802 /**
    803 *
    804 * admCtrl_getMixedMode  - Get current mixed Mode Status.
    805 *
    806 * \b Description:
    807 *
    808 * Get current mixed Mode Status.
    809 *
    810 * \b ARGS:
    811 *
    812 *  I   - pAdmCtrl - context \n
    813 *  I   - pAuthMode - mixed Mode Status \n
    814 *
    815 * \b RETURNS:
    816 *
    817 *  OK on success, NOK on failure.
    818 *
    819 * \sa
    820 */
    821 TI_STATUS admCtrl_getMixedMode(admCtrl_t *pAdmCtrl, BOOL *pMixedMode)
    822 {
    823 	*pMixedMode = pAdmCtrl->mixedMode;
    824 
    825 	return OK;
    826 }
    827 
    828 
    829 
    830 /* This table presents supported pairs of auth.mode/cipher type */
    831 static 	authEncrPairList_t  supportedAuthEncrPairs[MAX_AUTH_ENCR_PAIR] =
    832 {
    833 	{RSN_EXT_AUTH_MODE_OPEN,       RSN_CIPHER_NONE},
    834 	{RSN_EXT_AUTH_MODE_OPEN,       RSN_CIPHER_WEP},
    835 	{RSN_EXT_AUTH_MODE_SHARED_KEY, RSN_CIPHER_NONE},
    836 	{RSN_EXT_AUTH_MODE_SHARED_KEY, RSN_CIPHER_WEP},
    837 	{RSN_EXT_AUTH_MODE_WPA,        RSN_CIPHER_TKIP},
    838 	{RSN_EXT_AUTH_MODE_WPA,        RSN_CIPHER_AES_CCMP},
    839 	{RSN_EXT_AUTH_MODE_WPAPSK,     RSN_CIPHER_TKIP},
    840 	{RSN_EXT_AUTH_MODE_WPAPSK,     RSN_CIPHER_AES_CCMP},
    841 	{RSN_EXT_AUTH_MODE_WPANONE,    RSN_CIPHER_NONE},    /* No encryption in IBSS mode */
    842 	{RSN_EXT_AUTH_MODE_WPA2,       RSN_CIPHER_TKIP},
    843 	{RSN_EXT_AUTH_MODE_WPA2,       RSN_CIPHER_AES_CCMP},
    844 	{RSN_EXT_AUTH_MODE_WPA2PSK,    RSN_CIPHER_TKIP},
    845 	{RSN_EXT_AUTH_MODE_WPA2PSK,    RSN_CIPHER_AES_CCMP}
    846 };
    847 
    848 /**
    849 *
    850 * admCtrl_getAuthEncrCapability  - Get all supported pais of
    851 *                                  authenticationmode/cipher suite
    852 *
    853 * \b Description:
    854 *
    855 *    Returns all supported pais of authenticationmode/cipher suite
    856 *
    857 * \b ARGS:
    858 *
    859 *  I   - pAdmCtrl - context \n
    860 *  I   - authEncrCapability - ptr to list of auth.mode/cipher pairs \n
    861 *
    862 * \b RETURNS:
    863 *
    864 *  OK on success, NOK on failure.
    865 *
    866 * \sa
    867 */
    868 
    869 TI_STATUS admCtrl_getAuthEncrCapability(admCtrl_t *pAdmCtrl,
    870                                         rsnAuthEncrCapability_t   *authEncrCapability)
    871 {
    872     int i = 0;
    873 
    874     if(!authEncrCapability)
    875         return NOK;
    876 
    877     /* The current driver code version  uses the above hardcoded list */
    878     /* of auth/encr pairs */
    879 
    880     authEncrCapability->NoOfAuthEncrPairSupported = MAX_AUTH_ENCR_PAIR;
    881     authEncrCapability->NoOfPMKIDs                = PMKID_MAX_NUMBER;
    882 
    883     WLAN_REPORT_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG,
    884     ("admCtrl get AuthEncr capability:  No. of auth/encr pairs = %d, No of PMKIDs = %d \n",
    885         authEncrCapability->NoOfAuthEncrPairSupported,  authEncrCapability->NoOfPMKIDs));
    886 
    887     /* Copy the hardcoded table of the auth.mode/cipher type */
    888     for (i = 0; i < MAX_AUTH_ENCR_PAIR; i++)
    889     {
    890         authEncrCapability->authEncrPairs[i].authenticationMode =
    891             supportedAuthEncrPairs[i].authenticationMode;
    892         authEncrCapability->authEncrPairs[i].cipherSuite        =
    893             supportedAuthEncrPairs[i].cipherSuite;
    894 
    895         WLAN_REPORT_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG,
    896             ("admCtrl get AuthEncr pair list: i = %d, auth mode = %d , cipher suite = %d \n", i,
    897                        authEncrCapability->authEncrPairs[i].authenticationMode,
    898                        authEncrCapability->authEncrPairs[i].cipherSuite));
    899     }
    900 
    901     return OK;
    902 }
    903 
    904 
    905 TI_STATUS admCtrl_nullSetPMKIDlist(admCtrl_t *pAdmCtrl, OS_802_11_PMKID  *pmkIdList)
    906 {
    907 
    908     return CONFIGURATION_NOT_VALID;
    909 }
    910 
    911 TI_STATUS admCtrl_nullGetPMKIDlist(admCtrl_t *pAdmCtrl, OS_802_11_PMKID  *pmkIdList)
    912 {
    913 
    914     return CONFIGURATION_NOT_VALID;
    915 }
    916 
    917 
    918 TI_STATUS admCtrl_resetPMKIDlist(admCtrl_t *pAdmCtrl)
    919 {
    920 
    921     os_memoryZero(pAdmCtrl->hOs, (PVOID)&pAdmCtrl->pmkid_cache, sizeof(pmkid_cache_t));
    922     return OK;
    923 }
    924 
    925 TI_STATUS admCtrl_getWPAMixedModeSupport(admCtrl_t *pAdmCtrl, UINT32 *support)
    926 {
    927 
    928     if(pAdmCtrl->WPAMixedModeEnable)
    929        *support = ADMCTRL_WPA_OPTION_MAXVALUE;
    930     else
    931        *support = 0;
    932 
    933     return OK;
    934 }
    935 
    936 TI_STATUS admCtrl_getPromoteFlags(admCtrl_t *pAdmCtrl, UINT32 *WPAPromoteFlags)
    937 {
    938     *WPAPromoteFlags = pAdmCtrl->WPAPromoteFlags;
    939     return OK;
    940 }
    941 
    942 TI_STATUS admCtrl_setPromoteFlags(admCtrl_t *pAdmCtrl, UINT32 WPAPromoteFlags)
    943 {
    944     if(WPAPromoteFlags > ADMCTRL_WPA_OPTION_MAXVALUE)
    945         return NOK;
    946 
    947     if(!pAdmCtrl->WPAMixedModeEnable)
    948        return NOK;
    949 
    950     pAdmCtrl->WPAPromoteFlags = WPAPromoteFlags;
    951     return OK;
    952 }
    953 
    954 BOOL admCtrl_nullGetPreAuthStatus(admCtrl_t *pAdmCtrl, macAddress_t *givenAP, UINT8 *cacheIndex)
    955 {
    956     return FALSE;
    957 }
    958 
    959 
    960 TI_STATUS admCtrl_nullStartPreAuth(admCtrl_t *pAdmCtrl, bssidList4PreAuth_t *pBssidList)
    961 {
    962 	return OK;
    963 }
    964 
    965 TI_STATUS admCtrl_nullGet802_1x_AkmExists (admCtrl_t *pAdmCtrl, BOOL *wpa_802_1x_AkmExists)
    966 {
    967     *wpa_802_1x_AkmExists = FALSE;
    968     return OK;
    969 }
    970 
    971 /*-----------------------------------------------------------------------------
    972 Routine Name: admCtrl_notifyPreAuthStatus
    973 Routine Description: This routine is used to notify higher level application of the pre-authentication status
    974 Arguments: newStatus - pre authentication status
    975 Return Value:
    976 -----------------------------------------------------------------------------*/
    977 void admCtrl_notifyPreAuthStatus (admCtrl_t *pAdmCtrl, preAuthStatusEvent_e newStatus)
    978 {
    979     UINT32 memBuff;
    980 
    981     memBuff = (UINT32) newStatus;
    982 
    983     EvHandlerSendEvent(pAdmCtrl->hEvHandler, IPC_EVENT_WPA2_PREAUTHENTICATION,
    984                             (UINT8*)&memBuff, sizeof(UINT32));
    985 
    986 }
    987 
    988 #ifdef EXC_MODULE_INCLUDED
    989 
    990 /**
    991 *
    992 * admCtrl_setNetworkEap  - Set current Network EAP Mode Status.
    993 *
    994 * \b Description:
    995 *
    996 * Set current Network EAP Mode Status..
    997 *
    998 * \b ARGS:
    999 *
   1000 *  I   - pAdmCtrl - context \n
   1001 *  I   - networkEap - Network EAP Mode \n
   1002 *
   1003 * \b RETURNS:
   1004 *
   1005 *  OK on success, NOK on failure.
   1006 *
   1007 * \sa
   1008 */
   1009 TI_STATUS admCtrl_setNetworkEap(admCtrl_t *pAdmCtrl, OS_EXC_NETWORK_EAP networkEap)
   1010 {
   1011 	if (pAdmCtrl==NULL)
   1012 		return NOK;
   1013 
   1014 	if (pAdmCtrl->networkEapMode == networkEap)
   1015 	{
   1016 		return OK;
   1017 	}
   1018 	pAdmCtrl->networkEapMode = networkEap;
   1019 
   1020 	return OK;
   1021 }
   1022 
   1023 /**
   1024 *
   1025 * admCtrl_getNetworkEap  - Get current Network EAP Mode Status.
   1026 *
   1027 * \b Description:
   1028 *
   1029 * Get current Network EAP Mode Status.
   1030 *
   1031 * \b ARGS:
   1032 *
   1033 *  I   - pAdmCtrl - context \n
   1034 *  I   - networkEap - Network EAP Mode \n
   1035 *
   1036 * \b RETURNS:
   1037 *
   1038 *  OK on success, NOK on failure.
   1039 *
   1040 * \sa
   1041 */
   1042 TI_STATUS admCtrl_getNetworkEap(admCtrl_t *pAdmCtrl, OS_EXC_NETWORK_EAP *networkEap)
   1043 {
   1044 
   1045 	if (pAdmCtrl==NULL)
   1046 	{
   1047 		return NOK;
   1048 	}
   1049 
   1050 	switch (pAdmCtrl->networkEapMode)
   1051 	{
   1052 	case OS_EXC_NETWORK_EAP_OFF:
   1053 		*networkEap = OS_EXC_NETWORK_EAP_OFF;
   1054 		break;
   1055 	case OS_EXC_NETWORK_EAP_ON:
   1056 	case OS_EXC_NETWORK_EAP_ALLOWED:
   1057 	case OS_EXC_NETWORK_EAP_PREFERRED:
   1058 		*networkEap = OS_EXC_NETWORK_EAP_ON;
   1059 		break;
   1060 	default:
   1061 		return NOK;
   1062 /*		break; - unreachable */
   1063 	}
   1064 
   1065 	return OK;
   1066 }
   1067 #endif /* EXC_MODULE_INCLUDED*/
   1068 
   1069