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