Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
80211mgr.c
Go to the documentation of this file.
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
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))
102  pFrame->pwBeaconInterval = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
104  pFrame->pwCapInfo = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
106 
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
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))
136  pFrame->pwBeaconInterval = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
138  pFrame->pwCapInfo = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
140 
141  // Information elements
142  pItem = (PWLAN_IE)((unsigned char *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)))
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;
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
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
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
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))
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
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))
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
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))
353  pFrame->pwListenInterval = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
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
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))
382  pFrame->pwListenInterval = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
384 
385  // Information elements
386  pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
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;
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
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))
447  pFrame->pwStatus = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
449  pFrame->pwAid = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
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
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))
481  pFrame->pwStatus = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
483  pFrame->pwAid = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
485 
486  // Information elements
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
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))
526  pFrame->pwListenInterval = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
528  pFrame->pAddrCurrAP = (PIEEE_ADDR)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
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
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))
559  pFrame->pwListenInterval = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
561  pFrame->pAddrCurrAP = (PIEEE_ADDR)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
563 
564  // Information elements
565  pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
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 
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
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
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 
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
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))
704  pFrame->pwBeaconInterval = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
706  pFrame->pwCapInfo = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
708 
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
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))
741  pFrame->pwBeaconInterval = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
743  pFrame->pwCapInfo = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
745 
746  // Information elements
747  pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
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;
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
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))
852  pFrame->pwAuthSequence = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
854  pFrame->pwStatus = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
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
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))
885  pFrame->pwAuthSequence = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
887  pFrame->pwStatus = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
889 
890  // Information elements
891  pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
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
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))
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
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))
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
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))
976  pFrame->pwStatus = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
978  pFrame->pwAid = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
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
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))
1011  pFrame->pwStatus = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
1013  pFrame->pwAid = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
1015 
1016  //Information elements
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 }