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