Home | History | Annotate | Download | only in Connection_Managment
      1 /*
      2  * admCtrl.c
      3  *
      4  * Copyright(c) 1998 - 2009 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 /** \file admCtrl.c
     35  *  \brief Admission control API implimentation
     36  *
     37  *  \see admCtrl.h
     38  */
     39 
     40 /****************************************************************************
     41  *                                                                          *
     42  *   MODULE:  Admission Control                                             *
     43  *   PURPOSE: Admission Control Module API                                  *
     44  *                                                                          *
     45  ****************************************************************************/
     46 
     47 #define __FILE_ID__  FILE_ID_16
     48 #include "osApi.h"
     49 #include "paramOut.h"
     50 #include "timer.h"
     51 #include "fsm.h"
     52 #include "report.h"
     53 #include "mlmeApi.h"
     54 #include "DataCtrl_Api.h"
     55 #include "TI_IPC_Api.h"
     56 #include "rsn.h"
     57 #include "admCtrl.h"
     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, EAuthSuite authSuite);
     81 
     82 TI_STATUS admCtrl_getAuthSuite(admCtrl_t *pAdmCtrl, EAuthSuite *pSuite);
     83 
     84 TI_STATUS admCtrl_setNetworkMode(admCtrl_t *pAdmCtrl, ERsnNetworkMode mode);
     85 
     86 TI_STATUS admCtrl_setExtAuthMode(admCtrl_t *pAdmCtrl, EExternalAuthMode extAuthMode);
     87 
     88 TI_STATUS admCtrl_getExtAuthMode(admCtrl_t *pAdmCtrl, EExternalAuthMode *pExtAuthMode);
     89 
     90 TI_STATUS admCtrl_setUcastSuite(admCtrl_t *pAdmCtrl, ECipherSuite suite);
     91 
     92 TI_STATUS admCtrl_setBcastSuite(admCtrl_t *pAdmCtrl, ECipherSuite suite);
     93 
     94 TI_STATUS admCtrl_getCipherSuite(admCtrl_t *pAdmCtrl, ECipherSuite *pSuite);
     95 
     96 TI_STATUS admCtrl_setKeyMngSuite(admCtrl_t *pAdmCtrl, ERsnKeyMngSuite suite);
     97 
     98 TI_STATUS admCtrl_getMixedMode(admCtrl_t *pAdmCtrl, TI_BOOL *pMixedMode);
     99 
    100 TI_STATUS admCtrl_setMixedMode(admCtrl_t *pAdmCtrl, TI_BOOL mixedMode);
    101 
    102 TI_STATUS admCtrl_getAuthEncrCapability(admCtrl_t *pAdmCtrl,
    103                    rsnAuthEncrCapability_t   *authEncrCapability);
    104 
    105 TI_STATUS admCtrl_getPromoteFlags(admCtrl_t *pAdmCtrl, TI_UINT32 *WPAPromoteFlags);
    106 
    107 TI_STATUS admCtrl_setPromoteFlags(admCtrl_t *pAdmCtrl, TI_UINT32 WPAPromoteFlags);
    108 
    109 TI_STATUS admCtrl_getWPAMixedModeSupport(admCtrl_t *pAdmCtrl, TI_UINT32 *support);
    110 
    111 TI_STATUS admCtrl_checkSetSuite(admCtrl_t *pAdmCtrl, ECipherSuite suite, TI_BOOL Broadcast);
    112 
    113 #ifdef XCC_MODULE_INCLUDED
    114 TI_STATUS admCtrl_setNetworkEap(admCtrl_t *pAdmCtrl, OS_XCC_NETWORK_EAP networkEap);
    115 
    116 TI_STATUS admCtrl_getNetworkEap(admCtrl_t *pAdmCtrl, OS_XCC_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 *  TI_OK on success, TI_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->hOs = hOs;
    152 
    153     return pHandle;
    154 }
    155 
    156 /**
    157 *
    158 * admCtrl_unload
    159 *
    160 * \b Description:
    161 *
    162 * Unload admission control module from memory
    163 *
    164 * \b ARGS:
    165 *
    166 *  I   - hAdmCtrl - Admossion control context  \n
    167 *
    168 * \b RETURNS:
    169 *
    170 *  TI_OK if successful, TI_NOK otherwise.
    171 *
    172 * \sa admCtrl_create
    173 */
    174 TI_STATUS admCtrl_unload (admCtrl_t *pAdmCtrl)
    175 {
    176     if (pAdmCtrl == NULL)
    177     {
    178         return TI_NOK;
    179     }
    180 
    181     /* Destroy the wpa2 pre-authentication timer and free the module's memory */
    182 	if (pAdmCtrl->hPreAuthTimerWpa2)
    183 	{
    184 		tmr_DestroyTimer (pAdmCtrl->hPreAuthTimerWpa2);
    185 	}
    186     os_memoryFree (pAdmCtrl->hOs, pAdmCtrl, sizeof(admCtrl_t));
    187 
    188     return TI_OK;
    189 }
    190 
    191 /**
    192 *
    193 * admCtrl_config
    194 *
    195 * \b Description:
    196 *
    197 * Configure the admission control module.
    198 *
    199 * \b ARGS:
    200 *
    201 *  I   - role - admission cotrol role (AP or Station)  \n
    202 *  I   - authSuite - authentication suite to work with \n
    203 *
    204 * \b RETURNS:
    205 *
    206 *  TI_OK on success, TI_NOK on failure.
    207 *
    208 * \sa
    209 */
    210 TI_STATUS admCtrl_config (TI_HANDLE hAdmCtrl,
    211                           TI_HANDLE hMlme,
    212                           TI_HANDLE hRx,
    213                           TI_HANDLE hReport,
    214                           TI_HANDLE hOs,
    215                           struct _rsn_t *pRsn,
    216                           TI_HANDLE hXCCMngr,
    217                           TI_HANDLE hPowerMgr,
    218                           TI_HANDLE hEvHandler,
    219                           TI_HANDLE hTimer,
    220                           TI_HANDLE hCurrBss,
    221                           TRsnInitParams *pInitParam)
    222 {
    223     admCtrl_t       *pAdmCtrl;
    224     TI_STATUS           status;
    225 
    226     if (hAdmCtrl == NULL)
    227     {
    228         return TI_NOK;
    229     }
    230 
    231     pAdmCtrl = (admCtrl_t*)hAdmCtrl;
    232 
    233     pAdmCtrl->pRsn = pRsn;
    234     pAdmCtrl->hMlme = hMlme;
    235     pAdmCtrl->hRx = hRx;
    236     pAdmCtrl->hReport = hReport;
    237     pAdmCtrl->hOs = hOs;
    238     pAdmCtrl->hXCCMngr = hXCCMngr;
    239     pAdmCtrl->hPowerMgr = hPowerMgr;
    240     pAdmCtrl->hEvHandler = hEvHandler;
    241     pAdmCtrl->hTimer = hTimer;
    242     pAdmCtrl->hCurrBss = hCurrBss;
    243 
    244     /* Initialize admission control parameters */
    245     pAdmCtrl->role = RSN_PAE_SUPP;
    246     pAdmCtrl->networkMode = RSN_INFRASTRUCTURE;
    247     pAdmCtrl->authSuite = pInitParam->authSuite;
    248     pAdmCtrl->externalAuthMode = pInitParam->externalAuthMode;
    249     pAdmCtrl->mixedMode = pInitParam->mixedMode;
    250 
    251     if (pInitParam->privacyOn)
    252     {
    253         pAdmCtrl->broadcastSuite = TWD_CIPHER_WEP;
    254         pAdmCtrl->unicastSuite = TWD_CIPHER_WEP;
    255     } else {
    256         pAdmCtrl->broadcastSuite = TWD_CIPHER_NONE;
    257         pAdmCtrl->unicastSuite = TWD_CIPHER_NONE;
    258     }
    259 
    260     pAdmCtrl->preAuthSupport     = pInitParam->preAuthSupport;
    261     pAdmCtrl->preAuthTimeout     = pInitParam->preAuthTimeout;
    262     pAdmCtrl->WPAMixedModeEnable = pInitParam->WPAMixedModeEnable;
    263     /*pAdmCtrl->PMKIDCandListDelay = pInitParam->PMKIDCandListDelay;*/
    264     pAdmCtrl->MaxNumOfPMKIDs     = PMKID_MAX_NUMBER;
    265 
    266     /* Initialize admission control member functions */
    267     pAdmCtrl->setAuthSuite = admCtrl_setAuthSuite;
    268     pAdmCtrl->setNetworkMode = admCtrl_setNetworkMode;
    269     pAdmCtrl->getAuthSuite = admCtrl_getAuthSuite;
    270     pAdmCtrl->setExtAuthMode = admCtrl_setExtAuthMode;
    271     pAdmCtrl->getExtAuthMode = admCtrl_getExtAuthMode;
    272     pAdmCtrl->setUcastSuite = admCtrl_setUcastSuite;
    273     pAdmCtrl->setBcastSuite = admCtrl_setBcastSuite;
    274     pAdmCtrl->getCipherSuite = admCtrl_getCipherSuite;
    275     pAdmCtrl->setKeyMngSuite = admCtrl_setKeyMngSuite;
    276     pAdmCtrl->getMixedMode = admCtrl_getMixedMode;
    277     pAdmCtrl->setMixedMode = admCtrl_setMixedMode;
    278     pAdmCtrl->getAuthEncrCap = admCtrl_getAuthEncrCapability;
    279     pAdmCtrl->getPmkidList   = admCtrl_nullGetPMKIDlist;
    280     pAdmCtrl->setPmkidList   = admCtrl_nullSetPMKIDlist;
    281     pAdmCtrl->resetPmkidList = admCtrl_resetPMKIDlist;
    282     pAdmCtrl->getPromoteFlags = admCtrl_getPromoteFlags;
    283     pAdmCtrl->setPromoteFlags = admCtrl_setPromoteFlags;
    284     pAdmCtrl->getWPAMixedModeSupport = admCtrl_getWPAMixedModeSupport;
    285 #ifdef XCC_MODULE_INCLUDED
    286     pAdmCtrl->setNetworkEap = admCtrl_setNetworkEap;
    287     pAdmCtrl->getNetworkEap = admCtrl_getNetworkEap;
    288     pAdmCtrl->networkEapMode = OS_XCC_NETWORK_EAP_OFF;
    289 #endif
    290 
    291     pAdmCtrl->getPreAuthStatus = admCtrl_nullGetPreAuthStatus;
    292     pAdmCtrl->startPreAuth  = admCtrl_nullStartPreAuth;
    293     pAdmCtrl->get802_1x_AkmExists = admCtrl_nullGet802_1x_AkmExists;
    294     /* Zero number of sent wpa2 preauthentication candidates */
    295     pAdmCtrl->numberOfPreAuthCandidates = 0;
    296 
    297     /* Create hPreAuthTimerWpa2 timer */
    298     pAdmCtrl->hPreAuthTimerWpa2 = tmr_CreateTimer (pAdmCtrl->hTimer);
    299     if (pAdmCtrl->hPreAuthTimerWpa2 == NULL)
    300     {
    301         TRACE0(pAdmCtrl->hReport, REPORT_SEVERITY_ERROR , "admCtrl_config(): Failed to create hPreAuthTimerWpa2!\n");
    302     }
    303 
    304     status = admCtrl_subConfig(pAdmCtrl);
    305 
    306     return status;
    307 }
    308 
    309 /**
    310 *
    311 * admCtrl_subConfig
    312 *
    313 * \b Description:
    314 *
    315 * Configure the admission control module according to the Privacy Mode.
    316 *
    317 * \b ARGS:
    318 *
    319 *  I   - pAdmCtrl - pointer to admission cotrol context  \n
    320 *
    321 * \b RETURNS:
    322 *
    323 *  TI_OK on success, TI_NOK on failure.
    324 *
    325 * \sa
    326 */
    327 TI_STATUS admCtrl_subConfig(TI_HANDLE hAdmCtrl)
    328 
    329 {
    330     admCtrl_t* pAdmCtrl = (admCtrl_t*)hAdmCtrl;
    331     TI_STATUS status;
    332 
    333     switch(pAdmCtrl->externalAuthMode)
    334     {
    335     case RSN_EXT_AUTH_MODE_WPA:
    336     case RSN_EXT_AUTH_MODE_WPAPSK:
    337     case RSN_EXT_AUTH_MODE_WPANONE:
    338         status = admCtrlWpa_config(pAdmCtrl);
    339         break;
    340 
    341     case RSN_EXT_AUTH_MODE_WPA2:
    342     case RSN_EXT_AUTH_MODE_WPA2PSK:
    343         status = admCtrlWpa2_config(pAdmCtrl);
    344         break;
    345 
    346     default:
    347         if(pAdmCtrl->unicastSuite==TWD_CIPHER_NONE)
    348         {
    349             status = admCtrlNone_config(pAdmCtrl);
    350         }
    351         else
    352         {
    353             status = admCtrlWep_config(pAdmCtrl);
    354         }
    355         break;
    356 
    357     }
    358 
    359     return status;
    360 
    361 }
    362 
    363 /**
    364 *
    365 * admCtrl_setNetworkMode - Change current network mode.
    366 *
    367 * \b Description:
    368 *
    369 * Change current network mode.
    370 *
    371 * \b ARGS:
    372 *
    373 *  I   - pAdmCtrl - context \n
    374 *  I   - mode - network association mode (Infustrucure/IBSS) \n
    375 *
    376 * \b RETURNS:
    377 *
    378 *  TI_OK on success, TI_NOK on failure.
    379 *
    380 * \sa
    381 */
    382 TI_STATUS admCtrl_setNetworkMode(admCtrl_t *pAdmCtrl, ERsnNetworkMode mode)
    383 {
    384     pAdmCtrl->networkMode = mode;
    385 
    386     return TI_OK;
    387 }
    388 
    389 /**
    390 *
    391 * admCtrl_setAuthSuite - Change current authentication suite.
    392 *
    393 * \b Description:
    394 *
    395 * Change current authentication suite.
    396 *
    397 * \b ARGS:
    398 *
    399 *  I   - pAdmCtrl - context \n
    400 *  I   - authSuite - authentication suite to work with \n
    401 *
    402 * \b RETURNS:
    403 *
    404 *  TI_OK on success, TI_NOK on failure.
    405 *
    406 * \sa
    407 */
    408 TI_STATUS admCtrl_setAuthSuite(admCtrl_t *pAdmCtrl, EAuthSuite authSuite)
    409 {
    410     TI_STATUS       status = TI_NOK;
    411 
    412     if (pAdmCtrl == NULL)
    413     {
    414         return TI_NOK;
    415     }
    416 
    417     if (pAdmCtrl->authSuite == authSuite)
    418     {
    419         return TI_OK;
    420     }
    421 
    422     if (pAdmCtrl->authSuite > RSN_AUTH_AUTO_SWITCH)
    423     {
    424         return TI_NOK;
    425     }
    426     pAdmCtrl->externalAuthMode = (EExternalAuthMode)authSuite;
    427     pAdmCtrl->authSuite = authSuite;
    428     status = admCtrl_subConfig(pAdmCtrl);
    429     return status;
    430 }
    431 
    432 
    433 /**
    434 *
    435 * admCtrl_getAuthSuite  - Get current authentication suite.
    436 *
    437 * \b Description:
    438 *
    439 * Get current authentication suite.
    440 *
    441 * \b ARGS:
    442 *
    443 *  I   - pAdmCtrl - context \n
    444 *  O   - suite - key management suite to work with \n
    445 *
    446 * \b RETURNS:
    447 *
    448 *  TI_OK on success, TI_NOK on failure.
    449 *
    450 * \sa
    451 */
    452 TI_STATUS admCtrl_getAuthSuite(admCtrl_t *pAdmCtrl, EAuthSuite *pSuite)
    453 {
    454     if (pAdmCtrl == NULL)
    455     {
    456         return TI_NOK;
    457     }
    458 
    459     *pSuite = pAdmCtrl->authSuite;
    460 
    461     return TI_OK;
    462 }
    463 
    464 /**
    465 *
    466 * admCtrl_setExtAuthMode  - Set current External authentication Mode Status.
    467 *
    468 * \b Description:
    469 *
    470 * Set current External authentication Mode Status.
    471 *
    472 * \b ARGS:
    473 *
    474 *  I   - pAdmCtrl - context \n
    475 *  I   - extAuthMode - External authentication Mode \n
    476 *
    477 * \b RETURNS:
    478 *
    479 *  TI_OK on success, TI_NOK on failure.
    480 *
    481 * \sa
    482 */
    483 TI_STATUS admCtrl_setExtAuthMode(admCtrl_t *pAdmCtrl, EExternalAuthMode extAuthMode)
    484 {
    485 
    486     if (extAuthMode >= RSN_EXT_AUTH_MODEMAX)
    487     {
    488         return TI_NOK;
    489     }
    490 
    491 
    492     if (pAdmCtrl->externalAuthMode == extAuthMode)
    493     {
    494         return TI_OK;
    495     }
    496     pAdmCtrl->externalAuthMode = extAuthMode;
    497     if (extAuthMode <= RSN_EXT_AUTH_MODE_AUTO_SWITCH)
    498     {
    499         pAdmCtrl->authSuite = (EAuthSuite)extAuthMode;
    500     }
    501     else
    502     {
    503         pAdmCtrl->authSuite = RSN_AUTH_OPEN;
    504     }
    505 
    506     return (admCtrl_subConfig(pAdmCtrl));
    507 }
    508 
    509 /**
    510 *
    511 * admCtrl_getExtAuthMode  - Get current External authentication Mode Status.
    512 *
    513 * \b Description:
    514 *
    515 * Get current External Mode Status.
    516 *
    517 * \b ARGS:
    518 *
    519 *  I   - pAdmCtrl - context \n
    520 *  I   - pExtAuthMode - XCC External Mode Status \n
    521 *
    522 * \b RETURNS:
    523 *
    524 *  TI_OK on success, TI_NOK on failure.
    525 *
    526 * \sa
    527 */
    528 TI_STATUS admCtrl_getExtAuthMode(admCtrl_t *pAdmCtrl, EExternalAuthMode *pExtAuthMode)
    529 {
    530     *pExtAuthMode = pAdmCtrl->externalAuthMode;
    531 
    532     return TI_OK;
    533 }
    534 
    535 
    536 /**
    537 *
    538 * admCtrl_checkSetSuite -
    539 *
    540 * \b Description:
    541 *
    542 * Check the validity/support of the cipher suite according to
    543 * the admission control parameters
    544 *
    545 * \b ARGS:
    546 *
    547 *  I   - pAdmCtrl - context \n
    548 *  I   - suite - cipher suite to check \n
    549 *
    550 * \b RETURNS:
    551 *
    552 *  TI_OK on success, TI_NOK on failure.
    553 *
    554 * \sa
    555 */
    556 TI_STATUS admCtrl_checkSetSuite(admCtrl_t *pAdmCtrl, ECipherSuite suite, TI_BOOL Broadcast)
    557 {
    558     if (pAdmCtrl->externalAuthMode<=RSN_EXT_AUTH_MODE_AUTO_SWITCH)
    559     {
    560         if ((suite==TWD_CIPHER_NONE) || (suite==TWD_CIPHER_WEP) || (suite==TWD_CIPHER_WEP104))
    561         {
    562             return TI_OK;
    563         }
    564     }
    565     else
    566     {
    567         if ((suite==TWD_CIPHER_TKIP) || (suite==TWD_CIPHER_WEP) ||
    568             (suite==TWD_CIPHER_WEP104) || (suite==TWD_CIPHER_AES_CCMP))
    569         {
    570             return TI_OK;
    571         }
    572         else if (!Broadcast && (suite==TWD_CIPHER_NONE))
    573         {
    574             return TI_OK;
    575         }
    576     }
    577     return TI_NOK;
    578 }
    579 
    580 /**
    581 *
    582 * admCtrl_setUcastSuite  - Set current unicast cipher suite support.
    583 *
    584 * \b Description:
    585 *
    586 * Set current unicast cipher suite support.
    587 *
    588 * \b ARGS:
    589 *
    590 *  I   - pAdmCtrl - context \n
    591 *  I   - suite - cipher suite to work with \n
    592 *
    593 * \b RETURNS:
    594 *
    595 *  TI_OK on success, TI_NOK on failure.
    596 *
    597 * \sa
    598 */
    599 TI_STATUS admCtrl_setUcastSuite(admCtrl_t *pAdmCtrl, ECipherSuite suite)
    600 {
    601     TI_STATUS status;
    602 
    603     if (suite == pAdmCtrl->unicastSuite)
    604     {
    605         return TI_OK;
    606     }
    607     status = admCtrl_checkSetSuite(pAdmCtrl, suite, TI_FALSE);
    608     if (status == TI_OK)
    609     {
    610         pAdmCtrl->unicastSuite = suite;
    611         status = admCtrl_subConfig(pAdmCtrl);
    612     }
    613 
    614     return status;
    615 }
    616 
    617 /**
    618 *
    619 * admCtrl_setBcastSuite  - Set current broadcast cipher suite support.
    620 *
    621 * \b Description:
    622 *
    623 * Set current broadcast cipher suite support.
    624 *
    625 * \b ARGS:
    626 *
    627 *  I   - pAdmCtrl - context \n
    628 *  I   - suite - cipher suite to work with \n
    629 *
    630 * \b RETURNS:
    631 *
    632 *  TI_OK on success, TI_NOK on failure.
    633 *
    634 * \sa
    635 */
    636 TI_STATUS admCtrl_setBcastSuite(admCtrl_t *pAdmCtrl, ECipherSuite suite)
    637 {
    638     TI_STATUS status;
    639 
    640     if (suite == pAdmCtrl->broadcastSuite)
    641     {
    642         return TI_OK;
    643     }
    644 
    645     status = admCtrl_checkSetSuite(pAdmCtrl, suite, TI_TRUE);
    646     if (status == TI_OK)
    647     {
    648         pAdmCtrl->broadcastSuite = suite;
    649         status = admCtrl_subConfig(pAdmCtrl);
    650     }
    651     return status;
    652 
    653 }
    654 
    655 /**
    656 *
    657 * admCtrl_getCipherSuite  - Set current broadcast cipher suite support.
    658 *
    659 * \b Description:
    660 *
    661 * Set current broadcast cipher suite support.
    662 *
    663 * \b ARGS:
    664 *
    665 *  I   - pAdmCtrl - context \n
    666 *  O   - suite - cipher suite to work with \n
    667 *
    668 * \b RETURNS:
    669 *
    670 *  TI_OK on success, TI_NOK on failure.
    671 *
    672 * \sa
    673 */
    674 TI_STATUS admCtrl_getCipherSuite(admCtrl_t *pAdmCtrl, ECipherSuite *pSuite)
    675 {
    676     if (pAdmCtrl == NULL)
    677     {
    678         return TI_NOK;
    679     }
    680 
    681     *pSuite = (pAdmCtrl->broadcastSuite > pAdmCtrl->unicastSuite) ? pAdmCtrl->broadcastSuite :pAdmCtrl->unicastSuite;
    682 
    683     return TI_OK;
    684 }
    685 
    686 /**
    687 *
    688 * admCtrl_setKeyMngSuite  - Set current key management suite support.
    689 *
    690 * \b Description:
    691 *
    692 * Set current key management suite support.
    693 *
    694 * \b ARGS:
    695 *
    696 *  I   - pAdmCtrl - context \n
    697 *  I   - suite - key management suite to work with \n
    698 *
    699 * \b RETURNS:
    700 *
    701 *  TI_OK on success, TI_NOK on failure.
    702 *
    703 * \sa
    704 */
    705 TI_STATUS admCtrl_setKeyMngSuite(admCtrl_t *pAdmCtrl, ERsnKeyMngSuite suite)
    706 {
    707     pAdmCtrl->keyMngSuite = suite;
    708 
    709     return TI_OK;
    710 }
    711 
    712 
    713 /**
    714 *
    715 * admCtrl_parseIe  - Parse a required information element.
    716 *
    717 * \b Description:
    718 *
    719 * Parse an Aironet information element.
    720 * Builds a structure of all the capabilities described in the Aironet IE.
    721 * We look at Flags field only to determine KP and MIC bits value
    722 *
    723 * \b ARGS:
    724 *
    725 *  I   - pAdmCtrl - pointer to admCtrl context
    726 *  I   - pAironetIe - pointer to Aironet IE buffer  \n
    727 *  O   - pAironetData - capabilities structure
    728 *
    729 *
    730 * \b RETURNS:
    731 *
    732 * TI_OK on success, TI_NOK on failure.
    733 *
    734 * \sa
    735 */
    736 TI_STATUS admCtrl_parseIe(admCtrl_t *pAdmCtrl, TRsnData *pRsnData, TI_UINT8 **pIe, TI_UINT8 IeId)
    737 {
    738 
    739     dot11_eleHdr_t      *eleHdr;
    740     TI_INT16             length;
    741     TI_UINT8            *pCurIe;
    742 
    743 
    744     *pIe = NULL;
    745 
    746     if ((pRsnData == NULL) || (pRsnData->ieLen==0))
    747     {
    748        return TI_OK;
    749     }
    750 
    751     pCurIe = pRsnData->pIe;
    752 
    753     length = pRsnData->ieLen;
    754     while (length>0)
    755     {
    756         eleHdr = (dot11_eleHdr_t*)pCurIe;
    757 
    758         if (length<((*eleHdr)[1] + 2))
    759         {
    760             TRACE2(pAdmCtrl->hReport, REPORT_SEVERITY_INFORMATION, "admCtrl_parseIe ERROR: pRsnData->ieLen=%d, length=%d\n\n", pRsnData->ieLen,length);
    761             return TI_OK;
    762         }
    763 
    764         if ((*eleHdr)[0] == IeId)
    765         {
    766             *pIe = (TI_UINT8*)eleHdr;
    767             break;
    768         }
    769         length -= (*eleHdr)[1] + 2;
    770         pCurIe += (*eleHdr)[1] + 2;
    771     }
    772     return TI_OK;
    773 }
    774 
    775 /**
    776 *
    777 * admCtrl_setMixedMode  - Set current mixed Mode Status.
    778 *
    779 * \b Description:
    780 *
    781 * Set current mixed Mode Status.
    782 *
    783 * \b ARGS:
    784 *
    785 *  I   - pAdmCtrl - context \n
    786 *  I   - authMode - mixed Mode \n
    787 *
    788 * \b RETURNS:
    789 *
    790 *  TI_OK on success, TI_NOK on failure.
    791 *
    792 * \sa
    793 */
    794 TI_STATUS admCtrl_setMixedMode(admCtrl_t *pAdmCtrl, TI_BOOL mixedMode)
    795 {
    796 
    797     if (pAdmCtrl->mixedMode == mixedMode)
    798     {
    799         return TI_OK;
    800     }
    801     pAdmCtrl->mixedMode = mixedMode;
    802 
    803     return TI_OK;
    804 }
    805 
    806 /**
    807 *
    808 * admCtrl_getMixedMode  - Get current mixed Mode Status.
    809 *
    810 * \b Description:
    811 *
    812 * Get current mixed Mode Status.
    813 *
    814 * \b ARGS:
    815 *
    816 *  I   - pAdmCtrl - context \n
    817 *  I   - pAuthMode - mixed Mode Status \n
    818 *
    819 * \b RETURNS:
    820 *
    821 *  TI_OK on success, TI_NOK on failure.
    822 *
    823 * \sa
    824 */
    825 TI_STATUS admCtrl_getMixedMode(admCtrl_t *pAdmCtrl, TI_BOOL *pMixedMode)
    826 {
    827     *pMixedMode = pAdmCtrl->mixedMode;
    828 
    829     return TI_OK;
    830 }
    831 
    832 
    833 
    834 /* This table presents supported pairs of auth.mode/cipher type */
    835 static  authEncrPairList_t  supportedAuthEncrPairs[MAX_AUTH_ENCR_PAIR] =
    836 {
    837     {RSN_EXT_AUTH_MODE_OPEN,       TWD_CIPHER_NONE},
    838     {RSN_EXT_AUTH_MODE_OPEN,       TWD_CIPHER_WEP},
    839     {RSN_EXT_AUTH_MODE_SHARED_KEY, TWD_CIPHER_NONE},
    840     {RSN_EXT_AUTH_MODE_SHARED_KEY, TWD_CIPHER_WEP},
    841     {RSN_EXT_AUTH_MODE_WPA,        TWD_CIPHER_TKIP},
    842     {RSN_EXT_AUTH_MODE_WPA,        TWD_CIPHER_AES_CCMP},
    843     {RSN_EXT_AUTH_MODE_WPAPSK,     TWD_CIPHER_TKIP},
    844     {RSN_EXT_AUTH_MODE_WPAPSK,     TWD_CIPHER_AES_CCMP},
    845     {RSN_EXT_AUTH_MODE_WPANONE,    TWD_CIPHER_NONE},    /* No encryption in IBSS mode */
    846     {RSN_EXT_AUTH_MODE_WPA2,       TWD_CIPHER_TKIP},
    847     {RSN_EXT_AUTH_MODE_WPA2,       TWD_CIPHER_AES_CCMP},
    848     {RSN_EXT_AUTH_MODE_WPA2PSK,    TWD_CIPHER_TKIP},
    849     {RSN_EXT_AUTH_MODE_WPA2PSK,    TWD_CIPHER_AES_CCMP}
    850 };
    851 
    852 /**
    853 *
    854 * admCtrl_getAuthEncrCapability  - Get all supported pais of
    855 *                                  authenticationmode/cipher suite
    856 *
    857 * \b Description:
    858 *
    859 *    Returns all supported pais of authenticationmode/cipher suite
    860 *
    861 * \b ARGS:
    862 *
    863 *  I   - pAdmCtrl - context \n
    864 *  I   - authEncrCapability - ptr to list of auth.mode/cipher pairs \n
    865 *
    866 * \b RETURNS:
    867 *
    868 *  TI_OK on success, TI_NOK on failure.
    869 *
    870 * \sa
    871 */
    872 
    873 TI_STATUS admCtrl_getAuthEncrCapability(admCtrl_t *pAdmCtrl,
    874                                         rsnAuthEncrCapability_t   *authEncrCapability)
    875 {
    876     int i = 0;
    877 
    878     if(!authEncrCapability)
    879         return TI_NOK;
    880 
    881     /* The current driver code version  uses the above hardcoded list */
    882     /* of auth/encr pairs */
    883 
    884     authEncrCapability->NoOfAuthEncrPairSupported = MAX_AUTH_ENCR_PAIR;
    885     authEncrCapability->NoOfPMKIDs                = PMKID_MAX_NUMBER;
    886 
    887     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);
    888 
    889     /* Copy the hardcoded table of the auth.mode/cipher type */
    890     for (i = 0; i < MAX_AUTH_ENCR_PAIR; i++)
    891     {
    892         authEncrCapability->authEncrPairs[i].authenticationMode =
    893             supportedAuthEncrPairs[i].authenticationMode;
    894         authEncrCapability->authEncrPairs[i].cipherSuite        =
    895             supportedAuthEncrPairs[i].cipherSuite;
    896 
    897         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);
    898     }
    899 
    900     return TI_OK;
    901 }
    902 
    903 
    904 TI_STATUS admCtrl_nullSetPMKIDlist(admCtrl_t *pAdmCtrl, OS_802_11_PMKID  *pmkIdList)
    905 {
    906 
    907     return CONFIGURATION_NOT_VALID;
    908 }
    909 
    910 TI_STATUS admCtrl_nullGetPMKIDlist(admCtrl_t *pAdmCtrl, OS_802_11_PMKID  *pmkIdList)
    911 {
    912 
    913     return CONFIGURATION_NOT_VALID;
    914 }
    915 
    916 
    917 TI_STATUS admCtrl_resetPMKIDlist(admCtrl_t *pAdmCtrl)
    918 {
    919 
    920     os_memoryZero(pAdmCtrl->hOs, (void*)&pAdmCtrl->pmkid_cache, sizeof(pmkid_cache_t));
    921     return TI_OK;
    922 }
    923 
    924 TI_STATUS admCtrl_getWPAMixedModeSupport(admCtrl_t *pAdmCtrl, TI_UINT32 *support)
    925 {
    926 
    927     if(pAdmCtrl->WPAMixedModeEnable)
    928        *support = ADMCTRL_WPA_OPTION_MAXVALUE;
    929     else
    930        *support = 0;
    931 
    932     return TI_OK;
    933 }
    934 
    935 TI_STATUS admCtrl_getPromoteFlags(admCtrl_t *pAdmCtrl, TI_UINT32 *WPAPromoteFlags)
    936 {
    937     *WPAPromoteFlags = pAdmCtrl->WPAPromoteFlags;
    938     return TI_OK;
    939 }
    940 
    941 TI_STATUS admCtrl_setPromoteFlags(admCtrl_t *pAdmCtrl, TI_UINT32 WPAPromoteFlags)
    942 {
    943     if(WPAPromoteFlags > ADMCTRL_WPA_OPTION_MAXVALUE)
    944         return TI_NOK;
    945 
    946     if(!pAdmCtrl->WPAMixedModeEnable)
    947        return TI_NOK;
    948 
    949     pAdmCtrl->WPAPromoteFlags = WPAPromoteFlags;
    950     return TI_OK;
    951 }
    952 
    953 TI_BOOL admCtrl_nullGetPreAuthStatus(admCtrl_t *pAdmCtrl, TMacAddr *givenAP, TI_UINT8 *cacheIndex)
    954 {
    955     return TI_FALSE;
    956 }
    957 
    958 
    959 TI_STATUS admCtrl_nullStartPreAuth(admCtrl_t *pAdmCtrl, TBssidList4PreAuth *pBssidList)
    960 {
    961     return TI_OK;
    962 }
    963 
    964 TI_STATUS admCtrl_nullGet802_1x_AkmExists (admCtrl_t *pAdmCtrl, TI_BOOL *wpa_802_1x_AkmExists)
    965 {
    966     *wpa_802_1x_AkmExists = TI_FALSE;
    967     return TI_OK;
    968 }
    969 
    970 /*-----------------------------------------------------------------------------
    971 Routine Name: admCtrl_notifyPreAuthStatus
    972 Routine Description: This routine is used to notify higher level application of the pre-authentication status
    973 Arguments: newStatus - pre authentication status
    974 Return Value:
    975 -----------------------------------------------------------------------------*/
    976 void admCtrl_notifyPreAuthStatus (admCtrl_t *pAdmCtrl, preAuthStatusEvent_e newStatus)
    977 {
    978     TI_UINT32 memBuff;
    979 
    980     memBuff = (TI_UINT32) newStatus;
    981 
    982     EvHandlerSendEvent(pAdmCtrl->hEvHandler, IPC_EVENT_WPA2_PREAUTHENTICATION,
    983                             (TI_UINT8*)&memBuff, sizeof(TI_UINT32));
    984 
    985 }
    986 
    987 #ifdef XCC_MODULE_INCLUDED
    988 
    989 /**
    990 *
    991 * admCtrl_setNetworkEap  - Set current Network EAP Mode Status.
    992 *
    993 * \b Description:
    994 *
    995 * Set current Network EAP Mode Status..
    996 *
    997 * \b ARGS:
    998 *
    999 *  I   - pAdmCtrl - context \n
   1000 *  I   - networkEap - Network EAP Mode \n
   1001 *
   1002 * \b RETURNS:
   1003 *
   1004 *  TI_OK on success, TI_NOK on failure.
   1005 *
   1006 * \sa
   1007 */
   1008 TI_STATUS admCtrl_setNetworkEap(admCtrl_t *pAdmCtrl, OS_XCC_NETWORK_EAP networkEap)
   1009 {
   1010     if (pAdmCtrl==NULL)
   1011         return TI_NOK;
   1012 
   1013     if (pAdmCtrl->networkEapMode == networkEap)
   1014     {
   1015         return TI_OK;
   1016     }
   1017     pAdmCtrl->networkEapMode = networkEap;
   1018 
   1019     return TI_OK;
   1020 }
   1021 
   1022 /**
   1023 *
   1024 * admCtrl_getNetworkEap  - Get current Network EAP Mode Status.
   1025 *
   1026 * \b Description:
   1027 *
   1028 * Get current Network EAP Mode Status.
   1029 *
   1030 * \b ARGS:
   1031 *
   1032 *  I   - pAdmCtrl - context \n
   1033 *  I   - networkEap - Network EAP Mode \n
   1034 *
   1035 * \b RETURNS:
   1036 *
   1037 *  TI_OK on success, TI_NOK on failure.
   1038 *
   1039 * \sa
   1040 */
   1041 TI_STATUS admCtrl_getNetworkEap(admCtrl_t *pAdmCtrl, OS_XCC_NETWORK_EAP *networkEap)
   1042 {
   1043 
   1044     if (pAdmCtrl==NULL)
   1045     {
   1046         return TI_NOK;
   1047     }
   1048 
   1049     switch (pAdmCtrl->networkEapMode)
   1050     {
   1051     case OS_XCC_NETWORK_EAP_OFF:
   1052         *networkEap = OS_XCC_NETWORK_EAP_OFF;
   1053         break;
   1054     case OS_XCC_NETWORK_EAP_ON:
   1055     case OS_XCC_NETWORK_EAP_ALLOWED:
   1056     case OS_XCC_NETWORK_EAP_PREFERRED:
   1057         *networkEap = OS_XCC_NETWORK_EAP_ON;
   1058         break;
   1059     default:
   1060         return TI_NOK;
   1061 /*      break; - unreachable */
   1062     }
   1063 
   1064     return TI_OK;
   1065 }
   1066 #endif /* XCC_MODULE_INCLUDED*/
   1067 
   1068