1/* 2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. 3 * All rights reserved. 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License along 16 * with this program; if not, write to the Free Software Foundation, Inc., 17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * File: 80211mgr.c 20 * 21 * Purpose: Handles the 802.11 management support functions 22 * 23 * Author: Lyndon Chen 24 * 25 * Date: May 8, 2002 26 * 27 * Functions: 28 * vMgrEncodeBeacon - Encode the Beacon frame 29 * vMgrDecodeBeacon - Decode the Beacon frame 30 * vMgrEncodeIBSSATIM - Encode the IBSS ATIM frame 31 * vMgrDecodeIBSSATIM - Decode the IBSS ATIM frame 32 * vMgrEncodeDisassociation - Encode the Disassociation frame 33 * vMgrDecodeDisassociation - Decode the Disassociation frame 34 * vMgrEncodeAssocRequest - Encode the Association request frame 35 * vMgrDecodeAssocRequest - Decode the Association request frame 36 * vMgrEncodeAssocResponse - Encode the Association response frame 37 * vMgrDecodeAssocResponse - Decode the Association response frame 38 * vMgrEncodeReAssocRequest - Encode the ReAssociation request frame 39 * vMgrDecodeReAssocRequest - Decode the ReAssociation request frame 40 * vMgrEncodeProbeRequest - Encode the Probe request frame 41 * vMgrDecodeProbeRequest - Decode the Probe request frame 42 * vMgrEncodeProbeResponse - Encode the Probe response frame 43 * vMgrDecodeProbeResponse - Decode the Probe response frame 44 * vMgrEncodeAuthen - Encode the Authentication frame 45 * vMgrDecodeAuthen - Decode the Authentication frame 46 * vMgrEncodeDeauthen - Encode the DeAuthentication frame 47 * vMgrDecodeDeauthen - Decode the DeAuthentication frame 48 * vMgrEncodeReassocResponse - Encode the Reassociation response frame 49 * vMgrDecodeReassocResponse - Decode the Reassociation response frame 50 * 51 * Revision History: 52 * 53 */ 54 55#include "tmacro.h" 56#include "tether.h" 57#include "80211mgr.h" 58#include "80211hdr.h" 59#include "device.h" 60#include "wpa.h" 61 62/*--------------------- Static Definitions -------------------------*/ 63 64 65 66/*--------------------- Static Classes ----------------------------*/ 67 68/*--------------------- Static Variables --------------------------*/ 69 70static int msglevel =MSG_LEVEL_INFO; 71//static int msglevel =MSG_LEVEL_DEBUG; 72/*--------------------- Static Functions --------------------------*/ 73 74 75 76/*--------------------- Export Variables --------------------------*/ 77 78 79/*--------------------- Export Functions --------------------------*/ 80 81 82/*+ 83 * 84 * Routine Description: 85 * Encode Beacon frame body offset 86 * 87 * Return Value: 88 * None. 89 * 90-*/ 91 92void 93vMgrEncodeBeacon( 94 PWLAN_FR_BEACON pFrame 95 ) 96{ 97 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; 98 99 // Fixed Fields 100 pFrame->pqwTimestamp = (PQWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 101 + WLAN_BEACON_OFF_TS); 102 pFrame->pwBeaconInterval = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 103 + WLAN_BEACON_OFF_BCN_INT); 104 pFrame->pwCapInfo = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 105 + WLAN_BEACON_OFF_CAPINFO); 106 107 pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_BEACON_OFF_SSID; 108 109 return; 110} 111 112/*+ 113 * 114 * Routine Description: 115 * Decode Beacon frame body offset 116 * 117 * 118 * Return Value: 119 * None. 120 * 121-*/ 122 123 124void 125vMgrDecodeBeacon( 126 PWLAN_FR_BEACON pFrame 127 ) 128{ 129 PWLAN_IE pItem; 130 131 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; 132 133 // Fixed Fields 134 pFrame->pqwTimestamp = (PQWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 135 + WLAN_BEACON_OFF_TS); 136 pFrame->pwBeaconInterval = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 137 + WLAN_BEACON_OFF_BCN_INT); 138 pFrame->pwCapInfo = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 139 + WLAN_BEACON_OFF_CAPINFO); 140 141 // Information elements 142 pItem = (PWLAN_IE)((unsigned char *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))) 143 + WLAN_BEACON_OFF_SSID); 144 while( ((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len) ){ 145 146 switch (pItem->byElementID) { 147 case WLAN_EID_SSID: 148 if (pFrame->pSSID == NULL) 149 pFrame->pSSID = (PWLAN_IE_SSID)pItem; 150 break; 151 case WLAN_EID_SUPP_RATES: 152 if (pFrame->pSuppRates == NULL) 153 pFrame->pSuppRates = (PWLAN_IE_SUPP_RATES)pItem; 154 break; 155 case WLAN_EID_FH_PARMS: 156 //pFrame->pFHParms = (PWLAN_IE_FH_PARMS)pItem; 157 break; 158 case WLAN_EID_DS_PARMS: 159 if (pFrame->pDSParms == NULL) 160 pFrame->pDSParms = (PWLAN_IE_DS_PARMS)pItem; 161 break; 162 case WLAN_EID_CF_PARMS: 163 if (pFrame->pCFParms == NULL) 164 pFrame->pCFParms = (PWLAN_IE_CF_PARMS)pItem; 165 break; 166 case WLAN_EID_IBSS_PARMS: 167 if (pFrame->pIBSSParms == NULL) 168 pFrame->pIBSSParms = (PWLAN_IE_IBSS_PARMS)pItem; 169 break; 170 case WLAN_EID_TIM: 171 if (pFrame->pTIM == NULL) 172 pFrame->pTIM = (PWLAN_IE_TIM)pItem; 173 break; 174 175 case WLAN_EID_RSN: 176 if (pFrame->pRSN == NULL) { 177 pFrame->pRSN = (PWLAN_IE_RSN)pItem; 178 } 179 break; 180 case WLAN_EID_RSN_WPA: 181 if (pFrame->pRSNWPA == NULL) { 182 if (WPAb_Is_RSN((PWLAN_IE_RSN_EXT)pItem) == true) 183 pFrame->pRSNWPA = (PWLAN_IE_RSN_EXT)pItem; 184 } 185 break; 186 187 case WLAN_EID_ERP: 188 if (pFrame->pERP == NULL) 189 pFrame->pERP = (PWLAN_IE_ERP)pItem; 190 break; 191 case WLAN_EID_EXTSUPP_RATES: 192 if (pFrame->pExtSuppRates == NULL) 193 pFrame->pExtSuppRates = (PWLAN_IE_SUPP_RATES)pItem; 194 break; 195 196 case WLAN_EID_COUNTRY: //7 197 if (pFrame->pIE_Country == NULL) 198 pFrame->pIE_Country = (PWLAN_IE_COUNTRY)pItem; 199 break; 200 201 case WLAN_EID_PWR_CONSTRAINT: //32 202 if (pFrame->pIE_PowerConstraint == NULL) 203 pFrame->pIE_PowerConstraint = (PWLAN_IE_PW_CONST)pItem; 204 break; 205 206 case WLAN_EID_CH_SWITCH: //37 207 if (pFrame->pIE_CHSW == NULL) 208 pFrame->pIE_CHSW = (PWLAN_IE_CH_SW)pItem; 209 break; 210 211 case WLAN_EID_QUIET: //40 212 if (pFrame->pIE_Quiet == NULL) 213 pFrame->pIE_Quiet = (PWLAN_IE_QUIET)pItem; 214 break; 215 216 case WLAN_EID_IBSS_DFS: 217 if (pFrame->pIE_IBSSDFS == NULL) 218 pFrame->pIE_IBSSDFS = (PWLAN_IE_IBSS_DFS)pItem; 219 break; 220 221 default: 222 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Unrecognized EID=%dd in beacon decode.\n", pItem->byElementID); 223 break; 224 225 } 226 pItem = (PWLAN_IE)(((unsigned char *)pItem) + 2 + pItem->len); 227 } 228 229 return; 230} 231 232 233/*+ 234 * 235 * Routine Description: 236 * Encode IBSS ATIM 237 * 238 * 239 * Return Value: 240 * None. 241 * 242-*/ 243 244 245void 246vMgrEncodeIBSSATIM( 247 PWLAN_FR_IBSSATIM pFrame 248 ) 249{ 250 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; 251 pFrame->len = WLAN_HDR_ADDR3_LEN; 252 253 return; 254} 255 256 257/*+ 258 * 259 * Routine Description: 260 * Decode IBSS ATIM 261 * 262 * 263 * Return Value: 264 * None. 265 * 266-*/ 267 268void 269vMgrDecodeIBSSATIM( 270 PWLAN_FR_IBSSATIM pFrame 271 ) 272{ 273 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; 274 275 return; 276} 277 278 279/*+ 280 * 281 * Routine Description: 282 * Encode Disassociation 283 * 284 * 285 * Return Value: 286 * None. 287 * 288-*/ 289 290void 291vMgrEncodeDisassociation( 292 PWLAN_FR_DISASSOC pFrame 293 ) 294{ 295 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; 296 297 298 // Fixed Fields 299 pFrame->pwReason = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 300 + WLAN_DISASSOC_OFF_REASON); 301 pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_DISASSOC_OFF_REASON + sizeof(*(pFrame->pwReason)); 302 303 return; 304} 305 306 307/*+ 308 * 309 * Routine Description: 310 * Decode Disassociation 311 * 312 * 313 * Return Value: 314 * None. 315 * 316-*/ 317 318void 319vMgrDecodeDisassociation( 320 PWLAN_FR_DISASSOC pFrame 321 ) 322{ 323 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; 324 325 // Fixed Fields 326 pFrame->pwReason = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 327 + WLAN_DISASSOC_OFF_REASON); 328 329 return; 330} 331 332/*+ 333 * 334 * Routine Description: 335 * Encode Association Request 336 * 337 * 338 * Return Value: 339 * None. 340 * 341-*/ 342 343 344void 345vMgrEncodeAssocRequest( 346 PWLAN_FR_ASSOCREQ pFrame 347 ) 348{ 349 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; 350 // Fixed Fields 351 pFrame->pwCapInfo = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 352 + WLAN_ASSOCREQ_OFF_CAP_INFO); 353 pFrame->pwListenInterval = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 354 + WLAN_ASSOCREQ_OFF_LISTEN_INT); 355 pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_ASSOCREQ_OFF_LISTEN_INT + sizeof(*(pFrame->pwListenInterval)); 356 return; 357} 358 359 360/*+ 361 * 362 * Routine Description: (AP) 363 * Decode Association Request 364 * 365 * 366 * Return Value: 367 * None. 368 * 369-*/ 370 371void 372vMgrDecodeAssocRequest( 373 PWLAN_FR_ASSOCREQ pFrame 374 ) 375{ 376 PWLAN_IE pItem; 377 378 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; 379 // Fixed Fields 380 pFrame->pwCapInfo = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 381 + WLAN_ASSOCREQ_OFF_CAP_INFO); 382 pFrame->pwListenInterval = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 383 + WLAN_ASSOCREQ_OFF_LISTEN_INT); 384 385 // Information elements 386 pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 387 + WLAN_ASSOCREQ_OFF_SSID); 388 389 while (((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len)) { 390 switch (pItem->byElementID){ 391 case WLAN_EID_SSID: 392 if (pFrame->pSSID == NULL) 393 pFrame->pSSID = (PWLAN_IE_SSID)pItem; 394 break; 395 case WLAN_EID_SUPP_RATES: 396 if (pFrame->pSuppRates == NULL) 397 pFrame->pSuppRates = (PWLAN_IE_SUPP_RATES)pItem; 398 break; 399 400 case WLAN_EID_RSN: 401 if (pFrame->pRSN == NULL) { 402 pFrame->pRSN = (PWLAN_IE_RSN)pItem; 403 } 404 break; 405 case WLAN_EID_RSN_WPA: 406 if (pFrame->pRSNWPA == NULL) { 407 if (WPAb_Is_RSN((PWLAN_IE_RSN_EXT)pItem) == true) 408 pFrame->pRSNWPA = (PWLAN_IE_RSN_EXT)pItem; 409 } 410 break; 411 case WLAN_EID_EXTSUPP_RATES: 412 if (pFrame->pExtSuppRates == NULL) 413 pFrame->pExtSuppRates = (PWLAN_IE_SUPP_RATES)pItem; 414 break; 415 416 default: 417 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Unrecognized EID=%dd in assocreq decode.\n", 418 pItem->byElementID); 419 break; 420 } 421 pItem = (PWLAN_IE)(((unsigned char *)pItem) + 2 + pItem->len); 422 } 423 return; 424} 425 426/*+ 427 * 428 * Routine Description: (AP) 429 * Encode Association Response 430 * 431 * 432 * Return Value: 433 * None. 434 * 435-*/ 436 437void 438vMgrEncodeAssocResponse( 439 PWLAN_FR_ASSOCRESP pFrame 440 ) 441{ 442 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; 443 444 // Fixed Fields 445 pFrame->pwCapInfo = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 446 + WLAN_ASSOCRESP_OFF_CAP_INFO); 447 pFrame->pwStatus = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 448 + WLAN_ASSOCRESP_OFF_STATUS); 449 pFrame->pwAid = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 450 + WLAN_ASSOCRESP_OFF_AID); 451 pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_ASSOCRESP_OFF_AID 452 + sizeof(*(pFrame->pwAid)); 453 454 return; 455} 456 457 458/*+ 459 * 460 * Routine Description: 461 * Decode Association Response 462 * 463 * 464 * Return Value: 465 * None. 466 * 467-*/ 468 469void 470vMgrDecodeAssocResponse( 471 PWLAN_FR_ASSOCRESP pFrame 472 ) 473{ 474 PWLAN_IE pItem; 475 476 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; 477 478 // Fixed Fields 479 pFrame->pwCapInfo = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 480 + WLAN_ASSOCRESP_OFF_CAP_INFO); 481 pFrame->pwStatus = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 482 + WLAN_ASSOCRESP_OFF_STATUS); 483 pFrame->pwAid = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 484 + WLAN_ASSOCRESP_OFF_AID); 485 486 // Information elements 487 pFrame->pSuppRates = (PWLAN_IE_SUPP_RATES)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 488 + WLAN_ASSOCRESP_OFF_SUPP_RATES); 489 490 pItem = (PWLAN_IE)(pFrame->pSuppRates); 491 pItem = (PWLAN_IE)(((unsigned char *)pItem) + 2 + pItem->len); 492 493 if ((((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len)) && 494 (pItem->byElementID == WLAN_EID_EXTSUPP_RATES)) { 495 pFrame->pExtSuppRates = (PWLAN_IE_SUPP_RATES)pItem; 496 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pFrame->pExtSuppRates=[%p].\n", pItem); 497 } 498 else { 499 pFrame->pExtSuppRates = NULL; 500 } 501 return; 502} 503 504 505/*+ 506 * 507 * Routine Description: 508 * Encode Reassociation Request 509 * 510 * 511 * Return Value: 512 * None. 513 * 514-*/ 515 516void 517vMgrEncodeReassocRequest( 518 PWLAN_FR_REASSOCREQ pFrame 519 ) 520{ 521 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; 522 523 // Fixed Fields 524 pFrame->pwCapInfo = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 525 + WLAN_REASSOCREQ_OFF_CAP_INFO); 526 pFrame->pwListenInterval = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 527 + WLAN_REASSOCREQ_OFF_LISTEN_INT); 528 pFrame->pAddrCurrAP = (PIEEE_ADDR)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 529 + WLAN_REASSOCREQ_OFF_CURR_AP); 530 pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_REASSOCREQ_OFF_CURR_AP + sizeof(*(pFrame->pAddrCurrAP)); 531 532 return; 533} 534 535 536/*+ 537 * 538 * Routine Description: (AP) 539 * Decode Reassociation Request 540 * 541 * 542 * Return Value: 543 * None. 544 * 545-*/ 546 547 548void 549vMgrDecodeReassocRequest( 550 PWLAN_FR_REASSOCREQ pFrame 551 ) 552{ 553 PWLAN_IE pItem; 554 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; 555 556 // Fixed Fields 557 pFrame->pwCapInfo = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 558 + WLAN_REASSOCREQ_OFF_CAP_INFO); 559 pFrame->pwListenInterval = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 560 + WLAN_REASSOCREQ_OFF_LISTEN_INT); 561 pFrame->pAddrCurrAP = (PIEEE_ADDR)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 562 + WLAN_REASSOCREQ_OFF_CURR_AP); 563 564 // Information elements 565 pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 566 + WLAN_REASSOCREQ_OFF_SSID); 567 568 while(((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len)) { 569 570 switch (pItem->byElementID){ 571 case WLAN_EID_SSID: 572 if (pFrame->pSSID == NULL) 573 pFrame->pSSID = (PWLAN_IE_SSID)pItem; 574 break; 575 case WLAN_EID_SUPP_RATES: 576 if (pFrame->pSuppRates == NULL) 577 pFrame->pSuppRates = (PWLAN_IE_SUPP_RATES)pItem; 578 break; 579 580 case WLAN_EID_RSN: 581 if (pFrame->pRSN == NULL) { 582 pFrame->pRSN = (PWLAN_IE_RSN)pItem; 583 } 584 break; 585 case WLAN_EID_RSN_WPA: 586 if (pFrame->pRSNWPA == NULL) { 587 if (WPAb_Is_RSN((PWLAN_IE_RSN_EXT)pItem) == true) 588 pFrame->pRSNWPA = (PWLAN_IE_RSN_EXT)pItem; 589 } 590 break; 591 592 case WLAN_EID_EXTSUPP_RATES: 593 if (pFrame->pExtSuppRates == NULL) 594 pFrame->pExtSuppRates = (PWLAN_IE_SUPP_RATES)pItem; 595 break; 596 default: 597 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Unrecognized EID=%dd in reassocreq decode.\n", 598 pItem->byElementID); 599 break; 600 } 601 pItem = (PWLAN_IE)(((unsigned char *)pItem) + 2 + pItem->len); 602 } 603 return; 604} 605 606 607 608/*+ 609 * 610 * Routine Description: 611 * Encode Probe Request 612 * 613 * 614 * Return Value: 615 * None. 616 * 617-*/ 618 619 620void 621vMgrEncodeProbeRequest( 622 PWLAN_FR_PROBEREQ pFrame 623 ) 624{ 625 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; 626 pFrame->len = WLAN_HDR_ADDR3_LEN; 627 return; 628} 629 630/*+ 631 * 632 * Routine Description: 633 * Decode Probe Request 634 * 635 * 636 * Return Value: 637 * None. 638 * 639-*/ 640 641void 642vMgrDecodeProbeRequest( 643 PWLAN_FR_PROBEREQ pFrame 644 ) 645{ 646 PWLAN_IE pItem; 647 648 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; 649 650 // Information elements 651 pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))); 652 653 while( ((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len) ) { 654 655 switch (pItem->byElementID) { 656 case WLAN_EID_SSID: 657 if (pFrame->pSSID == NULL) 658 pFrame->pSSID = (PWLAN_IE_SSID)pItem; 659 break; 660 661 case WLAN_EID_SUPP_RATES: 662 if (pFrame->pSuppRates == NULL) 663 pFrame->pSuppRates = (PWLAN_IE_SUPP_RATES)pItem; 664 break; 665 666 case WLAN_EID_EXTSUPP_RATES: 667 if (pFrame->pExtSuppRates == NULL) 668 pFrame->pExtSuppRates = (PWLAN_IE_SUPP_RATES)pItem; 669 break; 670 671 default: 672 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Bad EID=%dd in probereq\n", pItem->byElementID); 673 break; 674 } 675 676 pItem = (PWLAN_IE)(((unsigned char *)pItem) + 2 + pItem->len); 677 } 678 return; 679} 680 681 682/*+ 683 * 684 * Routine Description: 685 * Encode Probe Response 686 * 687 * 688 * Return Value: 689 * None. 690 * 691-*/ 692 693 694void 695vMgrEncodeProbeResponse( 696 PWLAN_FR_PROBERESP pFrame 697 ) 698{ 699 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; 700 701 // Fixed Fields 702 pFrame->pqwTimestamp = (PQWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 703 + WLAN_PROBERESP_OFF_TS); 704 pFrame->pwBeaconInterval = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 705 + WLAN_PROBERESP_OFF_BCN_INT); 706 pFrame->pwCapInfo = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 707 + WLAN_PROBERESP_OFF_CAP_INFO); 708 709 pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_PROBERESP_OFF_CAP_INFO + 710 sizeof(*(pFrame->pwCapInfo)); 711 712 return; 713} 714 715 716 717/*+ 718 * 719 * Routine Description: 720 * Decode Probe Response 721 * 722 * 723 * Return Value: 724 * None. 725 * 726-*/ 727 728void 729vMgrDecodeProbeResponse( 730 PWLAN_FR_PROBERESP pFrame 731 ) 732{ 733 PWLAN_IE pItem; 734 735 736 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; 737 738 // Fixed Fields 739 pFrame->pqwTimestamp = (PQWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 740 + WLAN_PROBERESP_OFF_TS); 741 pFrame->pwBeaconInterval = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 742 + WLAN_PROBERESP_OFF_BCN_INT); 743 pFrame->pwCapInfo = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 744 + WLAN_PROBERESP_OFF_CAP_INFO); 745 746 // Information elements 747 pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 748 + WLAN_PROBERESP_OFF_SSID); 749 750 while( ((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len) ) { 751 switch (pItem->byElementID) { 752 case WLAN_EID_SSID: 753 if (pFrame->pSSID == NULL) 754 pFrame->pSSID = (PWLAN_IE_SSID)pItem; 755 break; 756 case WLAN_EID_SUPP_RATES: 757 if (pFrame->pSuppRates == NULL) 758 pFrame->pSuppRates = (PWLAN_IE_SUPP_RATES)pItem; 759 break; 760 case WLAN_EID_FH_PARMS: 761 break; 762 case WLAN_EID_DS_PARMS: 763 if (pFrame->pDSParms == NULL) 764 pFrame->pDSParms = (PWLAN_IE_DS_PARMS)pItem; 765 break; 766 case WLAN_EID_CF_PARMS: 767 if (pFrame->pCFParms == NULL) 768 pFrame->pCFParms = (PWLAN_IE_CF_PARMS)pItem; 769 break; 770 case WLAN_EID_IBSS_PARMS: 771 if (pFrame->pIBSSParms == NULL) 772 pFrame->pIBSSParms = (PWLAN_IE_IBSS_PARMS)pItem; 773 break; 774 775 case WLAN_EID_RSN: 776 if (pFrame->pRSN == NULL) { 777 pFrame->pRSN = (PWLAN_IE_RSN)pItem; 778 } 779 break; 780 case WLAN_EID_RSN_WPA: 781 if (pFrame->pRSNWPA == NULL) { 782 if (WPAb_Is_RSN((PWLAN_IE_RSN_EXT)pItem) == true) 783 pFrame->pRSNWPA = (PWLAN_IE_RSN_EXT)pItem; 784 } 785 break; 786 case WLAN_EID_ERP: 787 if (pFrame->pERP == NULL) 788 pFrame->pERP = (PWLAN_IE_ERP)pItem; 789 break; 790 case WLAN_EID_EXTSUPP_RATES: 791 if (pFrame->pExtSuppRates == NULL) 792 pFrame->pExtSuppRates = (PWLAN_IE_SUPP_RATES)pItem; 793 break; 794 795 case WLAN_EID_COUNTRY: //7 796 if (pFrame->pIE_Country == NULL) 797 pFrame->pIE_Country = (PWLAN_IE_COUNTRY)pItem; 798 break; 799 800 case WLAN_EID_PWR_CONSTRAINT: //32 801 if (pFrame->pIE_PowerConstraint == NULL) 802 pFrame->pIE_PowerConstraint = (PWLAN_IE_PW_CONST)pItem; 803 break; 804 805 case WLAN_EID_CH_SWITCH: //37 806 if (pFrame->pIE_CHSW == NULL) 807 pFrame->pIE_CHSW = (PWLAN_IE_CH_SW)pItem; 808 break; 809 810 case WLAN_EID_QUIET: //40 811 if (pFrame->pIE_Quiet == NULL) 812 pFrame->pIE_Quiet = (PWLAN_IE_QUIET)pItem; 813 break; 814 815 case WLAN_EID_IBSS_DFS: 816 if (pFrame->pIE_IBSSDFS == NULL) 817 pFrame->pIE_IBSSDFS = (PWLAN_IE_IBSS_DFS)pItem; 818 break; 819 820 default: 821 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Bad EID=%dd in proberesp\n", pItem->byElementID); 822 break; 823 } 824 825 pItem = (PWLAN_IE)(((unsigned char *)pItem) + 2 + pItem->len); 826 } 827 return; 828} 829 830 831/*+ 832 * 833 * Routine Description: 834 * Encode Authentication frame 835 * 836 * 837 * Return Value: 838 * None. 839 * 840-*/ 841 842void 843vMgrEncodeAuthen( 844 PWLAN_FR_AUTHEN pFrame 845 ) 846{ 847 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; 848 849 // Fixed Fields 850 pFrame->pwAuthAlgorithm = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 851 + WLAN_AUTHEN_OFF_AUTH_ALG); 852 pFrame->pwAuthSequence = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 853 + WLAN_AUTHEN_OFF_AUTH_SEQ); 854 pFrame->pwStatus = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 855 + WLAN_AUTHEN_OFF_STATUS); 856 pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_AUTHEN_OFF_STATUS + sizeof(*(pFrame->pwStatus)); 857 858 return; 859} 860 861 862/*+ 863 * 864 * Routine Description: 865 * Decode Authentication 866 * 867 * 868 * Return Value: 869 * None. 870 * 871-*/ 872 873void 874vMgrDecodeAuthen( 875 PWLAN_FR_AUTHEN pFrame 876 ) 877{ 878 PWLAN_IE pItem; 879 880 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; 881 882 // Fixed Fields 883 pFrame->pwAuthAlgorithm = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 884 + WLAN_AUTHEN_OFF_AUTH_ALG); 885 pFrame->pwAuthSequence = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 886 + WLAN_AUTHEN_OFF_AUTH_SEQ); 887 pFrame->pwStatus = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 888 + WLAN_AUTHEN_OFF_STATUS); 889 890 // Information elements 891 pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 892 + WLAN_AUTHEN_OFF_CHALLENGE); 893 894 if ((((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len)) && (pItem->byElementID == WLAN_EID_CHALLENGE)) { 895 pFrame->pChallenge = (PWLAN_IE_CHALLENGE)pItem; 896 } 897 898 return; 899} 900 901 902/*+ 903 * 904 * Routine Description: 905 * Encode Authentication 906 * 907 * 908 * Return Value: 909 * None. 910 * 911-*/ 912 913void 914vMgrEncodeDeauthen( 915 PWLAN_FR_DEAUTHEN pFrame 916 ) 917{ 918 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; 919 920 // Fixed Fields 921 pFrame->pwReason = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 922 + WLAN_DEAUTHEN_OFF_REASON); 923 pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_DEAUTHEN_OFF_REASON + sizeof(*(pFrame->pwReason)); 924 925 return; 926} 927 928 929/*+ 930 * 931 * Routine Description: 932 * Decode Deauthentication 933 * 934 * 935 * Return Value: 936 * None. 937 * 938-*/ 939 940void 941vMgrDecodeDeauthen( 942 PWLAN_FR_DEAUTHEN pFrame 943 ) 944{ 945 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; 946 947 // Fixed Fields 948 pFrame->pwReason = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 949 + WLAN_DEAUTHEN_OFF_REASON); 950 951 return; 952} 953 954 955/*+ 956 * 957 * Routine Description: (AP) 958 * Encode Reassociation Response 959 * 960 * 961 * Return Value: 962 * None. 963 * 964-*/ 965 966void 967vMgrEncodeReassocResponse( 968 PWLAN_FR_REASSOCRESP pFrame 969 ) 970{ 971 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; 972 973 // Fixed Fields 974 pFrame->pwCapInfo = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 975 + WLAN_REASSOCRESP_OFF_CAP_INFO); 976 pFrame->pwStatus = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 977 + WLAN_REASSOCRESP_OFF_STATUS); 978 pFrame->pwAid = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 979 + WLAN_REASSOCRESP_OFF_AID); 980 981 pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_REASSOCRESP_OFF_AID + sizeof(*(pFrame->pwAid)); 982 983 return; 984} 985 986 987/*+ 988 * 989 * Routine Description: 990 * Decode Reassociation Response 991 * 992 * 993 * Return Value: 994 * None. 995 * 996-*/ 997 998 999void 1000vMgrDecodeReassocResponse( 1001 PWLAN_FR_REASSOCRESP pFrame 1002 ) 1003{ 1004 PWLAN_IE pItem; 1005 1006 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; 1007 1008 // Fixed Fields 1009 pFrame->pwCapInfo = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 1010 + WLAN_REASSOCRESP_OFF_CAP_INFO); 1011 pFrame->pwStatus = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 1012 + WLAN_REASSOCRESP_OFF_STATUS); 1013 pFrame->pwAid = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 1014 + WLAN_REASSOCRESP_OFF_AID); 1015 1016 //Information elements 1017 pFrame->pSuppRates = (PWLAN_IE_SUPP_RATES)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 1018 + WLAN_REASSOCRESP_OFF_SUPP_RATES); 1019 1020 pItem = (PWLAN_IE)(pFrame->pSuppRates); 1021 pItem = (PWLAN_IE)(((unsigned char *)pItem) + 2 + pItem->len); 1022 1023 if ((((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len)) && 1024 (pItem->byElementID == WLAN_EID_EXTSUPP_RATES)) { 1025 pFrame->pExtSuppRates = (PWLAN_IE_SUPP_RATES)pItem; 1026 } 1027 return; 1028} 1029