[ARM] pxa: Gumstix Verdex PCMCIA support
[linux-2.6/verdex.git] / drivers / staging / vt6655 / 80211mgr.c
blobd309049370eb5557989b4fc8c4c27dd94156b548
1 /*
2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
3 * All rights reserved.
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.
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.
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.
19 * File: 80211mgr.c
21 * Purpose: Handles the 802.11 management support functions
23 * Author: Lyndon Chen
25 * Date: May 8, 2002
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
51 * Revision History:
55 #include "tmacro.h"
56 #include "tether.h"
57 #include "80211mgr.h"
58 #include "80211hdr.h"
59 #include "device.h"
60 #include "wpa.h"
62 /*--------------------- Static Definitions -------------------------*/
66 /*--------------------- Static Classes ----------------------------*/
68 /*--------------------- Static Variables --------------------------*/
70 static int msglevel =MSG_LEVEL_INFO;
71 //static int msglevel =MSG_LEVEL_DEBUG;
72 /*--------------------- Static Functions --------------------------*/
76 /*--------------------- Export Variables --------------------------*/
79 /*--------------------- Export Functions --------------------------*/
82 /*+
84 * Routine Description:
85 * Encode Beacon frame body offset
87 * Return Value:
88 * None.
90 -*/
92 VOID
93 vMgrEncodeBeacon(
94 IN PWLAN_FR_BEACON pFrame
97 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
99 // Fixed Fields
100 pFrame->pqwTimestamp = (PQWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
101 + WLAN_BEACON_OFF_TS);
102 pFrame->pwBeaconInterval = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
103 + WLAN_BEACON_OFF_BCN_INT);
104 pFrame->pwCapInfo = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
105 + WLAN_BEACON_OFF_CAPINFO);
107 pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_BEACON_OFF_SSID;
109 return;
114 * Routine Description:
115 * Decode Beacon frame body offset
118 * Return Value:
119 * None.
124 VOID
125 vMgrDecodeBeacon(
126 IN PWLAN_FR_BEACON pFrame
129 PWLAN_IE pItem;
131 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
133 // Fixed Fields
134 pFrame->pqwTimestamp = (PQWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
135 + WLAN_BEACON_OFF_TS);
136 pFrame->pwBeaconInterval = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
137 + WLAN_BEACON_OFF_BCN_INT);
138 pFrame->pwCapInfo = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
139 + WLAN_BEACON_OFF_CAPINFO);
141 // Information elements
142 pItem = (PWLAN_IE)((PBYTE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)))
143 + WLAN_BEACON_OFF_SSID);
144 while( ((PBYTE)pItem) < (pFrame->pBuf + pFrame->len) ){
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;
175 case WLAN_EID_RSN:
176 if (pFrame->pRSN == NULL) {
177 pFrame->pRSN = (PWLAN_IE_RSN)pItem;
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;
185 break;
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;
196 case WLAN_EID_COUNTRY: //7
197 if (pFrame->pIE_Country == NULL)
198 pFrame->pIE_Country = (PWLAN_IE_COUNTRY)pItem;
199 break;
201 case WLAN_EID_PWR_CONSTRAINT: //32
202 if (pFrame->pIE_PowerConstraint == NULL)
203 pFrame->pIE_PowerConstraint = (PWLAN_IE_PW_CONST)pItem;
204 break;
206 case WLAN_EID_CH_SWITCH: //37
207 if (pFrame->pIE_CHSW == NULL)
208 pFrame->pIE_CHSW = (PWLAN_IE_CH_SW)pItem;
209 break;
211 case WLAN_EID_QUIET: //40
212 if (pFrame->pIE_Quiet == NULL)
213 pFrame->pIE_Quiet = (PWLAN_IE_QUIET)pItem;
214 break;
216 case WLAN_EID_IBSS_DFS:
217 if (pFrame->pIE_IBSSDFS == NULL)
218 pFrame->pIE_IBSSDFS = (PWLAN_IE_IBSS_DFS)pItem;
219 break;
221 default:
222 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Unrecognized EID=%dd in beacon decode.\n", pItem->byElementID);
223 break;
226 pItem = (PWLAN_IE)(((PBYTE)pItem) + 2 + pItem->len);
229 return;
235 * Routine Description:
236 * Encode IBSS ATIM
239 * Return Value:
240 * None.
245 VOID
246 vMgrEncodeIBSSATIM(
247 IN PWLAN_FR_IBSSATIM pFrame
250 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
251 pFrame->len = WLAN_HDR_ADDR3_LEN;
253 return;
259 * Routine Description:
260 * Decode IBSS ATIM
263 * Return Value:
264 * None.
268 VOID
269 vMgrDecodeIBSSATIM(
270 IN PWLAN_FR_IBSSATIM pFrame
273 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
275 return;
281 * Routine Description:
282 * Encode Disassociation
285 * Return Value:
286 * None.
290 VOID
291 vMgrEncodeDisassociation(
292 IN PWLAN_FR_DISASSOC pFrame
295 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
298 // Fixed Fields
299 pFrame->pwReason = (PWORD)(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));
303 return;
309 * Routine Description:
310 * Decode Disassociation
313 * Return Value:
314 * None.
318 VOID
319 vMgrDecodeDisassociation(
320 IN PWLAN_FR_DISASSOC pFrame
323 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
325 // Fixed Fields
326 pFrame->pwReason = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
327 + WLAN_DISASSOC_OFF_REASON);
329 return;
334 * Routine Description:
335 * Encode Association Request
338 * Return Value:
339 * None.
344 VOID
345 vMgrEncodeAssocRequest(
346 IN PWLAN_FR_ASSOCREQ pFrame
349 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
350 // Fixed Fields
351 pFrame->pwCapInfo = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
352 + WLAN_ASSOCREQ_OFF_CAP_INFO);
353 pFrame->pwListenInterval = (PWORD)(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;
362 * Routine Description: (AP)
363 * Decode Association Request
366 * Return Value:
367 * None.
371 VOID
372 vMgrDecodeAssocRequest(
373 IN PWLAN_FR_ASSOCREQ pFrame
376 PWLAN_IE pItem;
378 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
379 // Fixed Fields
380 pFrame->pwCapInfo = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
381 + WLAN_ASSOCREQ_OFF_CAP_INFO);
382 pFrame->pwListenInterval = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
383 + WLAN_ASSOCREQ_OFF_LISTEN_INT);
385 // Information elements
386 pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
387 + WLAN_ASSOCREQ_OFF_SSID);
389 while (((PBYTE)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;
400 case WLAN_EID_RSN:
401 if (pFrame->pRSN == NULL) {
402 pFrame->pRSN = (PWLAN_IE_RSN)pItem;
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;
410 break;
411 case WLAN_EID_EXTSUPP_RATES:
412 if (pFrame->pExtSuppRates == NULL)
413 pFrame->pExtSuppRates = (PWLAN_IE_SUPP_RATES)pItem;
414 break;
416 default:
417 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Unrecognized EID=%dd in assocreq decode.\n",
418 pItem->byElementID);
419 break;
421 pItem = (PWLAN_IE)(((PBYTE)pItem) + 2 + pItem->len);
423 return;
428 * Routine Description: (AP)
429 * Encode Association Response
432 * Return Value:
433 * None.
437 VOID
438 vMgrEncodeAssocResponse(
439 IN PWLAN_FR_ASSOCRESP pFrame
442 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
444 // Fixed Fields
445 pFrame->pwCapInfo = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
446 + WLAN_ASSOCRESP_OFF_CAP_INFO);
447 pFrame->pwStatus = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
448 + WLAN_ASSOCRESP_OFF_STATUS);
449 pFrame->pwAid = (PWORD)(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));
454 return;
460 * Routine Description:
461 * Decode Association Response
464 * Return Value:
465 * None.
469 VOID
470 vMgrDecodeAssocResponse(
471 IN PWLAN_FR_ASSOCRESP pFrame
474 PWLAN_IE pItem;
476 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
478 // Fixed Fields
479 pFrame->pwCapInfo = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
480 + WLAN_ASSOCRESP_OFF_CAP_INFO);
481 pFrame->pwStatus = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
482 + WLAN_ASSOCRESP_OFF_STATUS);
483 pFrame->pwAid = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
484 + WLAN_ASSOCRESP_OFF_AID);
486 // Information elements
487 pFrame->pSuppRates = (PWLAN_IE_SUPP_RATES)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
488 + WLAN_ASSOCRESP_OFF_SUPP_RATES);
490 pItem = (PWLAN_IE)(pFrame->pSuppRates);
491 pItem = (PWLAN_IE)(((PBYTE)pItem) + 2 + pItem->len);
493 if ((((PBYTE)pItem) < (pFrame->pBuf + pFrame->len)) && (pItem->byElementID == WLAN_EID_EXTSUPP_RATES)) {
494 pFrame->pExtSuppRates = (PWLAN_IE_SUPP_RATES)pItem;
495 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pFrame->pExtSuppRates=[%p].\n", pItem);
497 else {
498 pFrame->pExtSuppRates = NULL;
500 return;
506 * Routine Description:
507 * Encode Reassociation Request
510 * Return Value:
511 * None.
515 VOID
516 vMgrEncodeReassocRequest(
517 IN PWLAN_FR_REASSOCREQ pFrame
520 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
522 // Fixed Fields
523 pFrame->pwCapInfo = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
524 + WLAN_REASSOCREQ_OFF_CAP_INFO);
525 pFrame->pwListenInterval = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
526 + WLAN_REASSOCREQ_OFF_LISTEN_INT);
527 pFrame->pAddrCurrAP = (PIEEE_ADDR)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
528 + WLAN_REASSOCREQ_OFF_CURR_AP);
529 pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_REASSOCREQ_OFF_CURR_AP + sizeof(*(pFrame->pAddrCurrAP));
531 return;
537 * Routine Description: (AP)
538 * Decode Reassociation Request
541 * Return Value:
542 * None.
547 VOID
548 vMgrDecodeReassocRequest(
549 IN PWLAN_FR_REASSOCREQ pFrame
552 PWLAN_IE pItem;
553 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
555 // Fixed Fields
556 pFrame->pwCapInfo = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
557 + WLAN_REASSOCREQ_OFF_CAP_INFO);
558 pFrame->pwListenInterval = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
559 + WLAN_REASSOCREQ_OFF_LISTEN_INT);
560 pFrame->pAddrCurrAP = (PIEEE_ADDR)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
561 + WLAN_REASSOCREQ_OFF_CURR_AP);
563 // Information elements
564 pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
565 + WLAN_REASSOCREQ_OFF_SSID);
567 while(((PBYTE)pItem) < (pFrame->pBuf + pFrame->len)) {
569 switch (pItem->byElementID){
570 case WLAN_EID_SSID:
571 if (pFrame->pSSID == NULL)
572 pFrame->pSSID = (PWLAN_IE_SSID)pItem;
573 break;
574 case WLAN_EID_SUPP_RATES:
575 if (pFrame->pSuppRates == NULL)
576 pFrame->pSuppRates = (PWLAN_IE_SUPP_RATES)pItem;
577 break;
579 case WLAN_EID_RSN:
580 if (pFrame->pRSN == NULL) {
581 pFrame->pRSN = (PWLAN_IE_RSN)pItem;
583 break;
584 case WLAN_EID_RSN_WPA:
585 if (pFrame->pRSNWPA == NULL) {
586 if (WPAb_Is_RSN((PWLAN_IE_RSN_EXT)pItem) == TRUE)
587 pFrame->pRSNWPA = (PWLAN_IE_RSN_EXT)pItem;
589 break;
591 case WLAN_EID_EXTSUPP_RATES:
592 if (pFrame->pExtSuppRates == NULL)
593 pFrame->pExtSuppRates = (PWLAN_IE_SUPP_RATES)pItem;
594 break;
595 default:
596 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Unrecognized EID=%dd in reassocreq decode.\n",
597 pItem->byElementID);
598 break;
600 pItem = (PWLAN_IE)(((PBYTE)pItem) + 2 + pItem->len);
602 return;
609 * Routine Description:
610 * Encode Probe Request
613 * Return Value:
614 * None.
619 VOID
620 vMgrEncodeProbeRequest(
621 IN PWLAN_FR_PROBEREQ pFrame
624 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
625 pFrame->len = WLAN_HDR_ADDR3_LEN;
626 return;
631 * Routine Description:
632 * Decode Probe Request
635 * Return Value:
636 * None.
640 VOID
641 vMgrDecodeProbeRequest(
642 IN PWLAN_FR_PROBEREQ pFrame
645 PWLAN_IE pItem;
647 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
649 // Information elements
650 pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)));
652 while( ((PBYTE)pItem) < (pFrame->pBuf + pFrame->len) ) {
654 switch (pItem->byElementID) {
655 case WLAN_EID_SSID:
656 if (pFrame->pSSID == NULL)
657 pFrame->pSSID = (PWLAN_IE_SSID)pItem;
658 break;
660 case WLAN_EID_SUPP_RATES:
661 if (pFrame->pSuppRates == NULL)
662 pFrame->pSuppRates = (PWLAN_IE_SUPP_RATES)pItem;
663 break;
665 case WLAN_EID_EXTSUPP_RATES:
666 if (pFrame->pExtSuppRates == NULL)
667 pFrame->pExtSuppRates = (PWLAN_IE_SUPP_RATES)pItem;
668 break;
670 default:
671 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Bad EID=%dd in probereq\n", pItem->byElementID);
672 break;
675 pItem = (PWLAN_IE)(((PBYTE)pItem) + 2 + pItem->len);
677 return;
683 * Routine Description:
684 * Encode Probe Response
687 * Return Value:
688 * None.
693 VOID
694 vMgrEncodeProbeResponse(
695 IN PWLAN_FR_PROBERESP pFrame
698 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
700 // Fixed Fields
701 pFrame->pqwTimestamp = (PQWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
702 + WLAN_PROBERESP_OFF_TS);
703 pFrame->pwBeaconInterval = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
704 + WLAN_PROBERESP_OFF_BCN_INT);
705 pFrame->pwCapInfo = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
706 + WLAN_PROBERESP_OFF_CAP_INFO);
708 pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_PROBERESP_OFF_CAP_INFO +
709 sizeof(*(pFrame->pwCapInfo));
711 return;
718 * Routine Description:
719 * Decode Probe Response
722 * Return Value:
723 * None.
727 VOID
728 vMgrDecodeProbeResponse(
729 IN PWLAN_FR_PROBERESP pFrame
732 PWLAN_IE pItem;
735 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
737 // Fixed Fields
738 pFrame->pqwTimestamp = (PQWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
739 + WLAN_PROBERESP_OFF_TS);
740 pFrame->pwBeaconInterval = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
741 + WLAN_PROBERESP_OFF_BCN_INT);
742 pFrame->pwCapInfo = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
743 + WLAN_PROBERESP_OFF_CAP_INFO);
745 // Information elements
746 pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
747 + WLAN_PROBERESP_OFF_SSID);
749 while( ((PBYTE)pItem) < (pFrame->pBuf + pFrame->len) ) {
750 switch (pItem->byElementID) {
751 case WLAN_EID_SSID:
752 if (pFrame->pSSID == NULL)
753 pFrame->pSSID = (PWLAN_IE_SSID)pItem;
754 break;
755 case WLAN_EID_SUPP_RATES:
756 if (pFrame->pSuppRates == NULL)
757 pFrame->pSuppRates = (PWLAN_IE_SUPP_RATES)pItem;
758 break;
759 case WLAN_EID_FH_PARMS:
760 break;
761 case WLAN_EID_DS_PARMS:
762 if (pFrame->pDSParms == NULL)
763 pFrame->pDSParms = (PWLAN_IE_DS_PARMS)pItem;
764 break;
765 case WLAN_EID_CF_PARMS:
766 if (pFrame->pCFParms == NULL)
767 pFrame->pCFParms = (PWLAN_IE_CF_PARMS)pItem;
768 break;
769 case WLAN_EID_IBSS_PARMS:
770 if (pFrame->pIBSSParms == NULL)
771 pFrame->pIBSSParms = (PWLAN_IE_IBSS_PARMS)pItem;
772 break;
774 case WLAN_EID_RSN:
775 if (pFrame->pRSN == NULL) {
776 pFrame->pRSN = (PWLAN_IE_RSN)pItem;
778 break;
779 case WLAN_EID_RSN_WPA:
780 if (pFrame->pRSNWPA == NULL) {
781 if (WPAb_Is_RSN((PWLAN_IE_RSN_EXT)pItem) == TRUE)
782 pFrame->pRSNWPA = (PWLAN_IE_RSN_EXT)pItem;
784 break;
785 case WLAN_EID_ERP:
786 if (pFrame->pERP == NULL)
787 pFrame->pERP = (PWLAN_IE_ERP)pItem;
788 break;
789 case WLAN_EID_EXTSUPP_RATES:
790 if (pFrame->pExtSuppRates == NULL)
791 pFrame->pExtSuppRates = (PWLAN_IE_SUPP_RATES)pItem;
792 break;
794 case WLAN_EID_COUNTRY: //7
795 if (pFrame->pIE_Country == NULL)
796 pFrame->pIE_Country = (PWLAN_IE_COUNTRY)pItem;
797 break;
799 case WLAN_EID_PWR_CONSTRAINT: //32
800 if (pFrame->pIE_PowerConstraint == NULL)
801 pFrame->pIE_PowerConstraint = (PWLAN_IE_PW_CONST)pItem;
802 break;
804 case WLAN_EID_CH_SWITCH: //37
805 if (pFrame->pIE_CHSW == NULL)
806 pFrame->pIE_CHSW = (PWLAN_IE_CH_SW)pItem;
807 break;
809 case WLAN_EID_QUIET: //40
810 if (pFrame->pIE_Quiet == NULL)
811 pFrame->pIE_Quiet = (PWLAN_IE_QUIET)pItem;
812 break;
814 case WLAN_EID_IBSS_DFS:
815 if (pFrame->pIE_IBSSDFS == NULL)
816 pFrame->pIE_IBSSDFS = (PWLAN_IE_IBSS_DFS)pItem;
817 break;
819 default:
820 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Bad EID=%dd in proberesp\n", pItem->byElementID);
821 break;
824 pItem = (PWLAN_IE)(((PBYTE)pItem) + 2 + pItem->len);
826 return;
832 * Routine Description:
833 * Encode Authentication frame
836 * Return Value:
837 * None.
841 VOID
842 vMgrEncodeAuthen(
843 IN PWLAN_FR_AUTHEN pFrame
846 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
848 // Fixed Fields
849 pFrame->pwAuthAlgorithm = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
850 + WLAN_AUTHEN_OFF_AUTH_ALG);
851 pFrame->pwAuthSequence = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
852 + WLAN_AUTHEN_OFF_AUTH_SEQ);
853 pFrame->pwStatus = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
854 + WLAN_AUTHEN_OFF_STATUS);
855 pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_AUTHEN_OFF_STATUS + sizeof(*(pFrame->pwStatus));
857 return;
863 * Routine Description:
864 * Decode Authentication
867 * Return Value:
868 * None.
872 VOID
873 vMgrDecodeAuthen(
874 IN PWLAN_FR_AUTHEN pFrame
877 PWLAN_IE pItem;
879 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
881 // Fixed Fields
882 pFrame->pwAuthAlgorithm = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
883 + WLAN_AUTHEN_OFF_AUTH_ALG);
884 pFrame->pwAuthSequence = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
885 + WLAN_AUTHEN_OFF_AUTH_SEQ);
886 pFrame->pwStatus = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
887 + WLAN_AUTHEN_OFF_STATUS);
889 // Information elements
890 pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
891 + WLAN_AUTHEN_OFF_CHALLENGE);
893 if ((((PBYTE)pItem) < (pFrame->pBuf + pFrame->len)) && (pItem->byElementID == WLAN_EID_CHALLENGE)) {
894 pFrame->pChallenge = (PWLAN_IE_CHALLENGE)pItem;
897 return;
903 * Routine Description:
904 * Encode Authentication
907 * Return Value:
908 * None.
912 VOID
913 vMgrEncodeDeauthen(
914 IN PWLAN_FR_DEAUTHEN pFrame
917 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
919 // Fixed Fields
920 pFrame->pwReason = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
921 + WLAN_DEAUTHEN_OFF_REASON);
922 pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_DEAUTHEN_OFF_REASON + sizeof(*(pFrame->pwReason));
924 return;
930 * Routine Description:
931 * Decode Deauthentication
934 * Return Value:
935 * None.
939 VOID
940 vMgrDecodeDeauthen(
941 IN PWLAN_FR_DEAUTHEN pFrame
944 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
946 // Fixed Fields
947 pFrame->pwReason = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
948 + WLAN_DEAUTHEN_OFF_REASON);
950 return;
956 * Routine Description: (AP)
957 * Encode Reassociation Response
960 * Return Value:
961 * None.
965 VOID
966 vMgrEncodeReassocResponse(
967 IN PWLAN_FR_REASSOCRESP pFrame
970 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
972 // Fixed Fields
973 pFrame->pwCapInfo = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
974 + WLAN_REASSOCRESP_OFF_CAP_INFO);
975 pFrame->pwStatus = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
976 + WLAN_REASSOCRESP_OFF_STATUS);
977 pFrame->pwAid = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
978 + WLAN_REASSOCRESP_OFF_AID);
980 pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_REASSOCRESP_OFF_AID + sizeof(*(pFrame->pwAid));
982 return;
988 * Routine Description:
989 * Decode Reassociation Response
992 * Return Value:
993 * None.
998 VOID
999 vMgrDecodeReassocResponse(
1000 IN PWLAN_FR_REASSOCRESP pFrame
1003 PWLAN_IE pItem;
1005 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
1007 // Fixed Fields
1008 pFrame->pwCapInfo = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
1009 + WLAN_REASSOCRESP_OFF_CAP_INFO);
1010 pFrame->pwStatus = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
1011 + WLAN_REASSOCRESP_OFF_STATUS);
1012 pFrame->pwAid = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
1013 + WLAN_REASSOCRESP_OFF_AID);
1015 //Information elements
1016 pFrame->pSuppRates = (PWLAN_IE_SUPP_RATES)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
1017 + WLAN_REASSOCRESP_OFF_SUPP_RATES);
1019 pItem = (PWLAN_IE)(pFrame->pSuppRates);
1020 pItem = (PWLAN_IE)(((PBYTE)pItem) + 2 + pItem->len);
1022 if ((((PBYTE)pItem) < (pFrame->pBuf + pFrame->len)) && (pItem->byElementID == WLAN_EID_EXTSUPP_RATES)) {
1023 pFrame->pExtSuppRates = (PWLAN_IE_SUPP_RATES)pItem;
1025 return;