Merge branch 'msm-core' of git://codeaurora.org/quic/kernel/dwalker/linux-msm
[pandora-kernel.git] / drivers / staging / vt6655 / 80211mgr.c
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
70 static 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
92 void
93 vMgrEncodeBeacon(
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
124 void
125 vMgrDecodeBeacon(
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
245 void
246 vMgrEncodeIBSSATIM(
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
268 void
269 vMgrDecodeIBSSATIM(
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
290 void
291 vMgrEncodeDisassociation(
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
318 void
319 vMgrDecodeDisassociation(
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
344 void
345 vMgrEncodeAssocRequest(
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
371 void
372 vMgrDecodeAssocRequest(
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
437 void
438 vMgrEncodeAssocResponse(
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
469 void
470 vMgrDecodeAssocResponse(
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
516 void
517 vMgrEncodeReassocRequest(
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
548 void
549 vMgrDecodeReassocRequest(
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
620 void
621 vMgrEncodeProbeRequest(
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
641 void
642 vMgrDecodeProbeRequest(
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
694 void
695 vMgrEncodeProbeResponse(
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
728 void
729 vMgrDecodeProbeResponse(
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
842 void
843 vMgrEncodeAuthen(
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
873 void
874 vMgrDecodeAuthen(
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
913 void
914 vMgrEncodeDeauthen(
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
940 void
941 vMgrDecodeDeauthen(
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
966 void
967 vMgrEncodeReassocResponse(
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
999 void
1000 vMgrDecodeReassocResponse(
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 }