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