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