blob: 1ed0f260b1620f657f6c881d8a66ee651b678d22 [file] [log] [blame]
Forest Bond5449c682009-04-25 10:30:44 -04001/*
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 *
Forest Bond5449c682009-04-25 10:30:44 -040019 * File: 80211mgr.c
20 *
Uwe Kleine-König658ce9d2009-07-23 08:33:56 +020021 * Purpose: Handles the 802.11 management support functions
Forest Bond5449c682009-04-25 10:30:44 -040022 *
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
Forest Bond5449c682009-04-25 10:30:44 -040055#include "tmacro.h"
Forest Bond5449c682009-04-25 10:30:44 -040056#include "tether.h"
Forest Bond5449c682009-04-25 10:30:44 -040057#include "80211mgr.h"
Forest Bond5449c682009-04-25 10:30:44 -040058#include "80211hdr.h"
Forest Bond5449c682009-04-25 10:30:44 -040059#include "device.h"
Forest Bond5449c682009-04-25 10:30:44 -040060#include "wpa.h"
Forest Bond5449c682009-04-25 10:30:44 -040061
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
Charles Clément6b35b7b2010-05-07 12:30:19 -070092void
Forest Bond5449c682009-04-25 10:30:44 -040093vMgrEncodeBeacon(
Charles Clément3a215e02010-05-12 20:54:39 -070094 PWLAN_FR_BEACON pFrame
Forest Bond5449c682009-04-25 10:30:44 -040095 )
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);
Charles Clément15df6c22010-06-05 15:13:48 -0700102 pFrame->pwBeaconInterval = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400103 + WLAN_BEACON_OFF_BCN_INT);
Charles Clément15df6c22010-06-05 15:13:48 -0700104 pFrame->pwCapInfo = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400105 + 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
Charles Clément6b35b7b2010-05-07 12:30:19 -0700124void
Forest Bond5449c682009-04-25 10:30:44 -0400125vMgrDecodeBeacon(
Charles Clément3a215e02010-05-12 20:54:39 -0700126 PWLAN_FR_BEACON pFrame
Forest Bond5449c682009-04-25 10:30:44 -0400127 )
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);
Charles Clément15df6c22010-06-05 15:13:48 -0700136 pFrame->pwBeaconInterval = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400137 + WLAN_BEACON_OFF_BCN_INT);
Charles Clément15df6c22010-06-05 15:13:48 -0700138 pFrame->pwCapInfo = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400139 + WLAN_BEACON_OFF_CAPINFO);
140
141 // Information elements
Charles Clément2989e962010-06-05 15:13:47 -0700142 pItem = (PWLAN_IE)((unsigned char *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)))
Forest Bond5449c682009-04-25 10:30:44 -0400143 + WLAN_BEACON_OFF_SSID);
Charles Clément2989e962010-06-05 15:13:47 -0700144 while( ((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len) ){
Forest Bond5449c682009-04-25 10:30:44 -0400145
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) {
Charles Clément1b120682010-08-01 17:15:48 +0200182 if (WPAb_Is_RSN((PWLAN_IE_RSN_EXT)pItem) == true)
Forest Bond5449c682009-04-25 10:30:44 -0400183 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:
Jim Lieb7e809a92009-07-30 10:27:21 -0700222 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Unrecognized EID=%dd in beacon decode.\n", pItem->byElementID);
Forest Bond5449c682009-04-25 10:30:44 -0400223 break;
224
225 }
Charles Clément2989e962010-06-05 15:13:47 -0700226 pItem = (PWLAN_IE)(((unsigned char *)pItem) + 2 + pItem->len);
Forest Bond5449c682009-04-25 10:30:44 -0400227 }
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
Charles Clément6b35b7b2010-05-07 12:30:19 -0700245void
Forest Bond5449c682009-04-25 10:30:44 -0400246vMgrEncodeIBSSATIM(
Charles Clément3a215e02010-05-12 20:54:39 -0700247 PWLAN_FR_IBSSATIM pFrame
Forest Bond5449c682009-04-25 10:30:44 -0400248 )
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
Charles Clément6b35b7b2010-05-07 12:30:19 -0700268void
Forest Bond5449c682009-04-25 10:30:44 -0400269vMgrDecodeIBSSATIM(
Charles Clément3a215e02010-05-12 20:54:39 -0700270 PWLAN_FR_IBSSATIM pFrame
Forest Bond5449c682009-04-25 10:30:44 -0400271 )
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
Charles Clément6b35b7b2010-05-07 12:30:19 -0700290void
Forest Bond5449c682009-04-25 10:30:44 -0400291vMgrEncodeDisassociation(
Charles Clément3a215e02010-05-12 20:54:39 -0700292 PWLAN_FR_DISASSOC pFrame
Forest Bond5449c682009-04-25 10:30:44 -0400293 )
294{
295 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
296
297
298 // Fixed Fields
Charles Clément15df6c22010-06-05 15:13:48 -0700299 pFrame->pwReason = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400300 + 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
Charles Clément6b35b7b2010-05-07 12:30:19 -0700318void
Forest Bond5449c682009-04-25 10:30:44 -0400319vMgrDecodeDisassociation(
Charles Clément3a215e02010-05-12 20:54:39 -0700320 PWLAN_FR_DISASSOC pFrame
Forest Bond5449c682009-04-25 10:30:44 -0400321 )
322{
323 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
324
325 // Fixed Fields
Charles Clément15df6c22010-06-05 15:13:48 -0700326 pFrame->pwReason = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400327 + 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
Charles Clément6b35b7b2010-05-07 12:30:19 -0700344void
Forest Bond5449c682009-04-25 10:30:44 -0400345vMgrEncodeAssocRequest(
Charles Clément3a215e02010-05-12 20:54:39 -0700346 PWLAN_FR_ASSOCREQ pFrame
Forest Bond5449c682009-04-25 10:30:44 -0400347 )
348{
349 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
350 // Fixed Fields
Charles Clément15df6c22010-06-05 15:13:48 -0700351 pFrame->pwCapInfo = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400352 + WLAN_ASSOCREQ_OFF_CAP_INFO);
Charles Clément15df6c22010-06-05 15:13:48 -0700353 pFrame->pwListenInterval = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400354 + 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
Charles Clément6b35b7b2010-05-07 12:30:19 -0700371void
Forest Bond5449c682009-04-25 10:30:44 -0400372vMgrDecodeAssocRequest(
Charles Clément3a215e02010-05-12 20:54:39 -0700373 PWLAN_FR_ASSOCREQ pFrame
Forest Bond5449c682009-04-25 10:30:44 -0400374 )
375{
376 PWLAN_IE pItem;
377
378 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
379 // Fixed Fields
Charles Clément15df6c22010-06-05 15:13:48 -0700380 pFrame->pwCapInfo = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400381 + WLAN_ASSOCREQ_OFF_CAP_INFO);
Charles Clément15df6c22010-06-05 15:13:48 -0700382 pFrame->pwListenInterval = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400383 + 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
Charles Clément2989e962010-06-05 15:13:47 -0700389 while (((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len)) {
Forest Bond5449c682009-04-25 10:30:44 -0400390 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) {
Charles Clément1b120682010-08-01 17:15:48 +0200407 if (WPAb_Is_RSN((PWLAN_IE_RSN_EXT)pItem) == true)
Forest Bond5449c682009-04-25 10:30:44 -0400408 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:
Jim Lieb7e809a92009-07-30 10:27:21 -0700417 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Unrecognized EID=%dd in assocreq decode.\n",
Forest Bond5449c682009-04-25 10:30:44 -0400418 pItem->byElementID);
419 break;
420 }
Charles Clément2989e962010-06-05 15:13:47 -0700421 pItem = (PWLAN_IE)(((unsigned char *)pItem) + 2 + pItem->len);
Forest Bond5449c682009-04-25 10:30:44 -0400422 }
423 return;
424}
425
426/*+
427 *
428 * Routine Description: (AP)
429 * Encode Association Response
430 *
431 *
432 * Return Value:
433 * None.
434 *
435-*/
436
Charles Clément6b35b7b2010-05-07 12:30:19 -0700437void
Forest Bond5449c682009-04-25 10:30:44 -0400438vMgrEncodeAssocResponse(
Charles Clément3a215e02010-05-12 20:54:39 -0700439 PWLAN_FR_ASSOCRESP pFrame
Forest Bond5449c682009-04-25 10:30:44 -0400440 )
441{
442 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
443
444 // Fixed Fields
Charles Clément15df6c22010-06-05 15:13:48 -0700445 pFrame->pwCapInfo = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400446 + WLAN_ASSOCRESP_OFF_CAP_INFO);
Charles Clément15df6c22010-06-05 15:13:48 -0700447 pFrame->pwStatus = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400448 + WLAN_ASSOCRESP_OFF_STATUS);
Charles Clément15df6c22010-06-05 15:13:48 -0700449 pFrame->pwAid = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400450 + 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
Charles Clément6b35b7b2010-05-07 12:30:19 -0700469void
Forest Bond5449c682009-04-25 10:30:44 -0400470vMgrDecodeAssocResponse(
Charles Clément3a215e02010-05-12 20:54:39 -0700471 PWLAN_FR_ASSOCRESP pFrame
Forest Bond5449c682009-04-25 10:30:44 -0400472 )
473{
474 PWLAN_IE pItem;
475
476 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
477
478 // Fixed Fields
Charles Clément15df6c22010-06-05 15:13:48 -0700479 pFrame->pwCapInfo = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400480 + WLAN_ASSOCRESP_OFF_CAP_INFO);
Charles Clément15df6c22010-06-05 15:13:48 -0700481 pFrame->pwStatus = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400482 + WLAN_ASSOCRESP_OFF_STATUS);
Charles Clément15df6c22010-06-05 15:13:48 -0700483 pFrame->pwAid = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400484 + 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);
Charles Clément2989e962010-06-05 15:13:47 -0700491 pItem = (PWLAN_IE)(((unsigned char *)pItem) + 2 + pItem->len);
Forest Bond5449c682009-04-25 10:30:44 -0400492
Charles Clément2989e962010-06-05 15:13:47 -0700493 if ((((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len)) &&
494 (pItem->byElementID == WLAN_EID_EXTSUPP_RATES)) {
Forest Bond5449c682009-04-25 10:30:44 -0400495 pFrame->pExtSuppRates = (PWLAN_IE_SUPP_RATES)pItem;
Jim Lieb7e809a92009-07-30 10:27:21 -0700496 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pFrame->pExtSuppRates=[%p].\n", pItem);
Forest Bond5449c682009-04-25 10:30:44 -0400497 }
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
Charles Clément6b35b7b2010-05-07 12:30:19 -0700516void
Forest Bond5449c682009-04-25 10:30:44 -0400517vMgrEncodeReassocRequest(
Charles Clément3a215e02010-05-12 20:54:39 -0700518 PWLAN_FR_REASSOCREQ pFrame
Forest Bond5449c682009-04-25 10:30:44 -0400519 )
520{
521 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
522
523 // Fixed Fields
Charles Clément15df6c22010-06-05 15:13:48 -0700524 pFrame->pwCapInfo = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400525 + WLAN_REASSOCREQ_OFF_CAP_INFO);
Charles Clément15df6c22010-06-05 15:13:48 -0700526 pFrame->pwListenInterval = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400527 + 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
Charles Clément6b35b7b2010-05-07 12:30:19 -0700548void
Forest Bond5449c682009-04-25 10:30:44 -0400549vMgrDecodeReassocRequest(
Charles Clément3a215e02010-05-12 20:54:39 -0700550 PWLAN_FR_REASSOCREQ pFrame
Forest Bond5449c682009-04-25 10:30:44 -0400551 )
552{
553 PWLAN_IE pItem;
554 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
555
556 // Fixed Fields
Charles Clément15df6c22010-06-05 15:13:48 -0700557 pFrame->pwCapInfo = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400558 + WLAN_REASSOCREQ_OFF_CAP_INFO);
Charles Clément15df6c22010-06-05 15:13:48 -0700559 pFrame->pwListenInterval = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400560 + 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
Charles Clément2989e962010-06-05 15:13:47 -0700568 while(((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len)) {
Forest Bond5449c682009-04-25 10:30:44 -0400569
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) {
Charles Clément1b120682010-08-01 17:15:48 +0200587 if (WPAb_Is_RSN((PWLAN_IE_RSN_EXT)pItem) == true)
Forest Bond5449c682009-04-25 10:30:44 -0400588 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:
Jim Lieb7e809a92009-07-30 10:27:21 -0700597 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Unrecognized EID=%dd in reassocreq decode.\n",
Forest Bond5449c682009-04-25 10:30:44 -0400598 pItem->byElementID);
599 break;
600 }
Charles Clément2989e962010-06-05 15:13:47 -0700601 pItem = (PWLAN_IE)(((unsigned char *)pItem) + 2 + pItem->len);
Forest Bond5449c682009-04-25 10:30:44 -0400602 }
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
Charles Clément6b35b7b2010-05-07 12:30:19 -0700620void
Forest Bond5449c682009-04-25 10:30:44 -0400621vMgrEncodeProbeRequest(
Charles Clément3a215e02010-05-12 20:54:39 -0700622 PWLAN_FR_PROBEREQ pFrame
Forest Bond5449c682009-04-25 10:30:44 -0400623 )
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
Charles Clément6b35b7b2010-05-07 12:30:19 -0700641void
Forest Bond5449c682009-04-25 10:30:44 -0400642vMgrDecodeProbeRequest(
Charles Clément3a215e02010-05-12 20:54:39 -0700643 PWLAN_FR_PROBEREQ pFrame
Forest Bond5449c682009-04-25 10:30:44 -0400644 )
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
Charles Clément2989e962010-06-05 15:13:47 -0700653 while( ((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len) ) {
Forest Bond5449c682009-04-25 10:30:44 -0400654
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:
Jim Lieb7e809a92009-07-30 10:27:21 -0700672 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Bad EID=%dd in probereq\n", pItem->byElementID);
Forest Bond5449c682009-04-25 10:30:44 -0400673 break;
674 }
675
Charles Clément2989e962010-06-05 15:13:47 -0700676 pItem = (PWLAN_IE)(((unsigned char *)pItem) + 2 + pItem->len);
Forest Bond5449c682009-04-25 10:30:44 -0400677 }
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
Charles Clément6b35b7b2010-05-07 12:30:19 -0700694void
Forest Bond5449c682009-04-25 10:30:44 -0400695vMgrEncodeProbeResponse(
Charles Clément3a215e02010-05-12 20:54:39 -0700696 PWLAN_FR_PROBERESP pFrame
Forest Bond5449c682009-04-25 10:30:44 -0400697 )
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);
Charles Clément15df6c22010-06-05 15:13:48 -0700704 pFrame->pwBeaconInterval = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400705 + WLAN_PROBERESP_OFF_BCN_INT);
Charles Clément15df6c22010-06-05 15:13:48 -0700706 pFrame->pwCapInfo = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400707 + 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
Charles Clément6b35b7b2010-05-07 12:30:19 -0700728void
Forest Bond5449c682009-04-25 10:30:44 -0400729vMgrDecodeProbeResponse(
Charles Clément3a215e02010-05-12 20:54:39 -0700730 PWLAN_FR_PROBERESP pFrame
Forest Bond5449c682009-04-25 10:30:44 -0400731 )
732{
733 PWLAN_IE pItem;
Forest Bond5449c682009-04-25 10:30:44 -0400734
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);
Charles Clément15df6c22010-06-05 15:13:48 -0700741 pFrame->pwBeaconInterval = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400742 + WLAN_PROBERESP_OFF_BCN_INT);
Charles Clément15df6c22010-06-05 15:13:48 -0700743 pFrame->pwCapInfo = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400744 + 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
Charles Clément2989e962010-06-05 15:13:47 -0700750 while( ((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len) ) {
Forest Bond5449c682009-04-25 10:30:44 -0400751 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) {
Charles Clément1b120682010-08-01 17:15:48 +0200782 if (WPAb_Is_RSN((PWLAN_IE_RSN_EXT)pItem) == true)
Forest Bond5449c682009-04-25 10:30:44 -0400783 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:
Jim Lieb7e809a92009-07-30 10:27:21 -0700821 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Bad EID=%dd in proberesp\n", pItem->byElementID);
Forest Bond5449c682009-04-25 10:30:44 -0400822 break;
823 }
824
Charles Clément2989e962010-06-05 15:13:47 -0700825 pItem = (PWLAN_IE)(((unsigned char *)pItem) + 2 + pItem->len);
Forest Bond5449c682009-04-25 10:30:44 -0400826 }
827 return;
828}
829
830
831/*+
832 *
833 * Routine Description:
834 * Encode Authentication frame
835 *
836 *
837 * Return Value:
838 * None.
839 *
840-*/
841
Charles Clément6b35b7b2010-05-07 12:30:19 -0700842void
Forest Bond5449c682009-04-25 10:30:44 -0400843vMgrEncodeAuthen(
Charles Clément3a215e02010-05-12 20:54:39 -0700844 PWLAN_FR_AUTHEN pFrame
Forest Bond5449c682009-04-25 10:30:44 -0400845 )
846{
847 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
848
849 // Fixed Fields
Charles Clément15df6c22010-06-05 15:13:48 -0700850 pFrame->pwAuthAlgorithm = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400851 + WLAN_AUTHEN_OFF_AUTH_ALG);
Charles Clément15df6c22010-06-05 15:13:48 -0700852 pFrame->pwAuthSequence = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400853 + WLAN_AUTHEN_OFF_AUTH_SEQ);
Charles Clément15df6c22010-06-05 15:13:48 -0700854 pFrame->pwStatus = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400855 + 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
Charles Clément6b35b7b2010-05-07 12:30:19 -0700873void
Forest Bond5449c682009-04-25 10:30:44 -0400874vMgrDecodeAuthen(
Charles Clément3a215e02010-05-12 20:54:39 -0700875 PWLAN_FR_AUTHEN pFrame
Forest Bond5449c682009-04-25 10:30:44 -0400876 )
877{
878 PWLAN_IE pItem;
879
880 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
881
882 // Fixed Fields
Charles Clément15df6c22010-06-05 15:13:48 -0700883 pFrame->pwAuthAlgorithm = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400884 + WLAN_AUTHEN_OFF_AUTH_ALG);
Charles Clément15df6c22010-06-05 15:13:48 -0700885 pFrame->pwAuthSequence = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400886 + WLAN_AUTHEN_OFF_AUTH_SEQ);
Charles Clément15df6c22010-06-05 15:13:48 -0700887 pFrame->pwStatus = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400888 + 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
Charles Clément2989e962010-06-05 15:13:47 -0700894 if ((((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len)) && (pItem->byElementID == WLAN_EID_CHALLENGE)) {
Forest Bond5449c682009-04-25 10:30:44 -0400895 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
Charles Clément6b35b7b2010-05-07 12:30:19 -0700913void
Forest Bond5449c682009-04-25 10:30:44 -0400914vMgrEncodeDeauthen(
Charles Clément3a215e02010-05-12 20:54:39 -0700915 PWLAN_FR_DEAUTHEN pFrame
Forest Bond5449c682009-04-25 10:30:44 -0400916 )
917{
918 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
919
920 // Fixed Fields
Charles Clément15df6c22010-06-05 15:13:48 -0700921 pFrame->pwReason = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400922 + 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
Charles Clément6b35b7b2010-05-07 12:30:19 -0700940void
Forest Bond5449c682009-04-25 10:30:44 -0400941vMgrDecodeDeauthen(
Charles Clément3a215e02010-05-12 20:54:39 -0700942 PWLAN_FR_DEAUTHEN pFrame
Forest Bond5449c682009-04-25 10:30:44 -0400943 )
944{
945 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
946
947 // Fixed Fields
Charles Clément15df6c22010-06-05 15:13:48 -0700948 pFrame->pwReason = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400949 + 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
Charles Clément6b35b7b2010-05-07 12:30:19 -0700966void
Forest Bond5449c682009-04-25 10:30:44 -0400967vMgrEncodeReassocResponse(
Charles Clément3a215e02010-05-12 20:54:39 -0700968 PWLAN_FR_REASSOCRESP pFrame
Forest Bond5449c682009-04-25 10:30:44 -0400969 )
970{
971 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
972
973 // Fixed Fields
Charles Clément15df6c22010-06-05 15:13:48 -0700974 pFrame->pwCapInfo = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400975 + WLAN_REASSOCRESP_OFF_CAP_INFO);
Charles Clément15df6c22010-06-05 15:13:48 -0700976 pFrame->pwStatus = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400977 + WLAN_REASSOCRESP_OFF_STATUS);
Charles Clément15df6c22010-06-05 15:13:48 -0700978 pFrame->pwAid = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -0400979 + 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
Charles Clément6b35b7b2010-05-07 12:30:19 -0700999void
Forest Bond5449c682009-04-25 10:30:44 -04001000vMgrDecodeReassocResponse(
Charles Clément3a215e02010-05-12 20:54:39 -07001001 PWLAN_FR_REASSOCRESP pFrame
Forest Bond5449c682009-04-25 10:30:44 -04001002 )
1003{
1004 PWLAN_IE pItem;
1005
1006 pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
1007
1008 // Fixed Fields
Charles Clément15df6c22010-06-05 15:13:48 -07001009 pFrame->pwCapInfo = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -04001010 + WLAN_REASSOCRESP_OFF_CAP_INFO);
Charles Clément15df6c22010-06-05 15:13:48 -07001011 pFrame->pwStatus = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -04001012 + WLAN_REASSOCRESP_OFF_STATUS);
Charles Clément15df6c22010-06-05 15:13:48 -07001013 pFrame->pwAid = (unsigned short *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
Forest Bond5449c682009-04-25 10:30:44 -04001014 + 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);
Charles Clément2989e962010-06-05 15:13:47 -07001021 pItem = (PWLAN_IE)(((unsigned char *)pItem) + 2 + pItem->len);
Forest Bond5449c682009-04-25 10:30:44 -04001022
Charles Clément2989e962010-06-05 15:13:47 -07001023 if ((((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len)) &&
1024 (pItem->byElementID == WLAN_EID_EXTSUPP_RATES)) {
Forest Bond5449c682009-04-25 10:30:44 -04001025 pFrame->pExtSuppRates = (PWLAN_IE_SUPP_RATES)pItem;
1026 }
1027 return;
1028}