Merge commit '3ff195b011d7decf501a4d55aeed312731094796' into for-linus
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / staging / vt6656 / wmgr.c
CommitLineData
92b96797
FB
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 *
20 * File: wmgr.c
21 *
22 * Purpose: Handles the 802.11 management functions
23 *
24 * Author: Lyndon Chen
25 *
26 * Date: May 8, 2002
27 *
28 * Functions:
29 * nsMgrObjectInitial - Initialize Management Objet data structure
30 * vMgrObjectReset - Reset Management Objet data structure
31 * vMgrAssocBeginSta - Start associate function
32 * vMgrReAssocBeginSta - Start reassociate function
33 * vMgrDisassocBeginSta - Start disassociate function
34 * s_vMgrRxAssocRequest - Handle Rcv associate_request
35 * s_vMgrRxAssocResponse - Handle Rcv associate_response
36 * vMrgAuthenBeginSta - Start authentication function
37 * vMgrDeAuthenDeginSta - Start deauthentication function
38 * s_vMgrRxAuthentication - Handle Rcv authentication
39 * s_vMgrRxAuthenSequence_1 - Handle Rcv authentication sequence 1
40 * s_vMgrRxAuthenSequence_2 - Handle Rcv authentication sequence 2
41 * s_vMgrRxAuthenSequence_3 - Handle Rcv authentication sequence 3
42 * s_vMgrRxAuthenSequence_4 - Handle Rcv authentication sequence 4
43 * s_vMgrRxDisassociation - Handle Rcv disassociation
44 * s_vMgrRxBeacon - Handle Rcv Beacon
45 * vMgrCreateOwnIBSS - Create ad_hoc IBSS or AP BSS
46 * vMgrJoinBSSBegin - Join BSS function
47 * s_vMgrSynchBSS - Synch & adopt BSS parameters
48 * s_MgrMakeBeacon - Create Baecon frame
49 * s_MgrMakeProbeResponse - Create Probe Response frame
50 * s_MgrMakeAssocRequest - Create Associate Request frame
51 * s_MgrMakeReAssocRequest - Create ReAssociate Request frame
52 * s_vMgrRxProbeResponse - Handle Rcv probe_response
53 * s_vMrgRxProbeRequest - Handle Rcv probe_request
54 * bMgrPrepareBeaconToSend - Prepare Beacon frame
55 * s_vMgrLogStatus - Log 802.11 Status
56 * vMgrRxManagePacket - Rcv management frame dispatch function
57 * s_vMgrFormatTIM- Assember TIM field of beacon
58 * vMgrTimerInit- Initial 1-sec and command call back funtions
59 *
60 * Revision History:
61 *
62 */
63
92b96797 64#include "tmacro.h"
92b96797 65#include "desc.h"
92b96797 66#include "device.h"
92b96797 67#include "card.h"
92b96797 68#include "80211hdr.h"
92b96797 69#include "80211mgr.h"
92b96797 70#include "wmgr.h"
92b96797 71#include "wcmd.h"
92b96797 72#include "mac.h"
92b96797 73#include "bssdb.h"
92b96797 74#include "power.h"
92b96797 75#include "datarate.h"
92b96797 76#include "baseband.h"
92b96797 77#include "rxtx.h"
92b96797 78#include "wpa.h"
92b96797 79#include "rf.h"
92b96797 80#include "iowpa.h"
92b96797 81#include "control.h"
92b96797 82#include "rndis.h"
9d26d60f 83
92b96797
FB
84/*--------------------- Static Definitions -------------------------*/
85
86
87
88/*--------------------- Static Classes ----------------------------*/
89
90/*--------------------- Static Variables --------------------------*/
91static int msglevel =MSG_LEVEL_INFO;
92//static int msglevel =MSG_LEVEL_DEBUG;
93
94/*--------------------- Static Functions --------------------------*/
95//2008-0730-01<Add>by MikeLiu
96static BOOL ChannelExceedZoneType(
97 IN PSDevice pDevice,
98 IN BYTE byCurrChannel
99 );
100
101// Association/diassociation functions
102static
103PSTxMgmtPacket
104s_MgrMakeAssocRequest(
105 IN PSDevice pDevice,
106 IN PSMgmtObject pMgmt,
107 IN PBYTE pDAddr,
108 IN WORD wCurrCapInfo,
109 IN WORD wListenInterval,
110 IN PWLAN_IE_SSID pCurrSSID,
111 IN PWLAN_IE_SUPP_RATES pCurrRates,
112 IN PWLAN_IE_SUPP_RATES pCurrExtSuppRates
113 );
114
115static
116VOID
117s_vMgrRxAssocRequest(
118 IN PSDevice pDevice,
119 IN PSMgmtObject pMgmt,
120 IN PSRxMgmtPacket pRxPacket,
121 IN UINT uNodeIndex
122 );
123
124static
125PSTxMgmtPacket
126s_MgrMakeReAssocRequest(
127 IN PSDevice pDevice,
128 IN PSMgmtObject pMgmt,
129 IN PBYTE pDAddr,
130 IN WORD wCurrCapInfo,
131 IN WORD wListenInterval,
132 IN PWLAN_IE_SSID pCurrSSID,
133 IN PWLAN_IE_SUPP_RATES pCurrRates,
134 IN PWLAN_IE_SUPP_RATES pCurrExtSuppRates
135 );
136
137static
138VOID
139s_vMgrRxAssocResponse(
140 IN PSDevice pDevice,
141 IN PSMgmtObject pMgmt,
142 IN PSRxMgmtPacket pRxPacket,
143 IN BOOL bReAssocType
144 );
145
146static
147VOID
148s_vMgrRxDisassociation(
149 IN PSDevice pDevice,
150 IN PSMgmtObject pMgmt,
151 IN PSRxMgmtPacket pRxPacket
152 );
153
154// Authentication/deauthen functions
155static
156VOID
157s_vMgrRxAuthenSequence_1(
158 IN PSDevice pDevice,
159 IN PSMgmtObject pMgmt,
160 IN PWLAN_FR_AUTHEN pFrame
161 );
162
163static
164VOID
165s_vMgrRxAuthenSequence_2(
166 IN PSDevice pDevice,
167 IN PSMgmtObject pMgmt,
168 IN PWLAN_FR_AUTHEN pFrame
169 );
170
171static
172VOID
173s_vMgrRxAuthenSequence_3(
174 IN PSDevice pDevice,
175 IN PSMgmtObject pMgmt,
176 IN PWLAN_FR_AUTHEN pFrame
177 );
178
179static
180VOID
181s_vMgrRxAuthenSequence_4(
182 IN PSDevice pDevice,
183 IN PSMgmtObject pMgmt,
184 IN PWLAN_FR_AUTHEN pFrame
185 );
186
187static
188VOID
189s_vMgrRxAuthentication(
190 IN PSDevice pDevice,
191 IN PSMgmtObject pMgmt,
192 IN PSRxMgmtPacket pRxPacket
193 );
194
195static
196VOID
197s_vMgrRxDeauthentication(
198 IN PSDevice pDevice,
199 IN PSMgmtObject pMgmt,
200 IN PSRxMgmtPacket pRxPacket
201 );
202
203// Scan functions
204// probe request/response functions
205static
206VOID
207s_vMgrRxProbeRequest(
208 IN PSDevice pDevice,
209 IN PSMgmtObject pMgmt,
210 IN PSRxMgmtPacket pRxPacket
211 );
212
213static
214VOID
215s_vMgrRxProbeResponse(
216 IN PSDevice pDevice,
217 IN PSMgmtObject pMgmt,
218 IN PSRxMgmtPacket pRxPacket
219 );
220
221// beacon functions
222static
223VOID
224s_vMgrRxBeacon(
225 IN PSDevice pDevice,
226 IN PSMgmtObject pMgmt,
227 IN PSRxMgmtPacket pRxPacket,
228 IN BOOL bInScan
229 );
230
231static
232VOID
233s_vMgrFormatTIM(
234 IN PSMgmtObject pMgmt,
235 IN PWLAN_IE_TIM pTIM
236 );
237
238static
239PSTxMgmtPacket
240s_MgrMakeBeacon(
241 IN PSDevice pDevice,
242 IN PSMgmtObject pMgmt,
243 IN WORD wCurrCapInfo,
244 IN WORD wCurrBeaconPeriod,
245 IN UINT uCurrChannel,
246 IN WORD wCurrATIMWinodw,
247 IN PWLAN_IE_SSID pCurrSSID,
248 IN PBYTE pCurrBSSID,
249 IN PWLAN_IE_SUPP_RATES pCurrSuppRates,
250 IN PWLAN_IE_SUPP_RATES pCurrExtSuppRates
251 );
252
253
254// Association response
255static
256PSTxMgmtPacket
257s_MgrMakeAssocResponse(
258 IN PSDevice pDevice,
259 IN PSMgmtObject pMgmt,
260 IN WORD wCurrCapInfo,
261 IN WORD wAssocStatus,
262 IN WORD wAssocAID,
263 IN PBYTE pDstAddr,
264 IN PWLAN_IE_SUPP_RATES pCurrSuppRates,
265 IN PWLAN_IE_SUPP_RATES pCurrExtSuppRates
266 );
267
268// ReAssociation response
269static
270PSTxMgmtPacket
271s_MgrMakeReAssocResponse(
272 IN PSDevice pDevice,
273 IN PSMgmtObject pMgmt,
274 IN WORD wCurrCapInfo,
275 IN WORD wAssocStatus,
276 IN WORD wAssocAID,
277 IN PBYTE pDstAddr,
278 IN PWLAN_IE_SUPP_RATES pCurrSuppRates,
279 IN PWLAN_IE_SUPP_RATES pCurrExtSuppRates
280 );
281
282// Probe response
283static
284PSTxMgmtPacket
285s_MgrMakeProbeResponse(
286 IN PSDevice pDevice,
287 IN PSMgmtObject pMgmt,
288 IN WORD wCurrCapInfo,
289 IN WORD wCurrBeaconPeriod,
290 IN UINT uCurrChannel,
291 IN WORD wCurrATIMWinodw,
292 IN PBYTE pDstAddr,
293 IN PWLAN_IE_SSID pCurrSSID,
294 IN PBYTE pCurrBSSID,
295 IN PWLAN_IE_SUPP_RATES pCurrSuppRates,
296 IN PWLAN_IE_SUPP_RATES pCurrExtSuppRates,
297 IN BYTE byPHYType
298 );
299
300// received status
301static
302VOID
303s_vMgrLogStatus(
304 IN PSMgmtObject pMgmt,
305 IN WORD wStatus
306 );
307
308
309static
310VOID
311s_vMgrSynchBSS (
312 IN PSDevice pDevice,
313 IN UINT uBSSMode,
314 IN PKnownBSS pCurr,
315 OUT PCMD_STATUS pStatus
316 );
317
318
319static BOOL
320s_bCipherMatch (
321 IN PKnownBSS pBSSNode,
322 IN NDIS_802_11_ENCRYPTION_STATUS EncStatus,
323 OUT PBYTE pbyCCSPK,
324 OUT PBYTE pbyCCSGK
325 );
326
327 static VOID Encyption_Rebuild(
328 IN PSDevice pDevice,
329 IN PKnownBSS pCurr
330 );
331
332
333
334/*--------------------- Export Variables --------------------------*/
335
336
337/*--------------------- Export Functions --------------------------*/
338
339
340/*+
341 *
342 * Routine Description:
343 * Allocates and initializes the Management object.
344 *
345 * Return Value:
346 * Ndis_staus.
347 *
348-*/
349
350VOID
351vMgrObjectInit(
352 IN HANDLE hDeviceContext
353 )
354{
355 PSDevice pDevice = (PSDevice)hDeviceContext;
356 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
357 int ii;
358
359
360 pMgmt->pbyPSPacketPool = &pMgmt->byPSPacketPool[0];
361 pMgmt->pbyMgmtPacketPool = &pMgmt->byMgmtPacketPool[0];
362 pMgmt->uCurrChannel = pDevice->uChannel;
363 for(ii=0;ii<WLAN_BSSID_LEN;ii++) {
364 pMgmt->abyDesireBSSID[ii] = 0xFF;
365 }
366 pMgmt->sAssocInfo.AssocInfo.Length = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);
367 //memset(pMgmt->abyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN +1);
368 pMgmt->byCSSPK = KEY_CTL_NONE;
369 pMgmt->byCSSGK = KEY_CTL_NONE;
370 pMgmt->wIBSSBeaconPeriod = DEFAULT_IBSS_BI;
371 BSSvClearBSSList((HANDLE)pDevice, FALSE);
372
373 init_timer(&pMgmt->sTimerSecondCallback);
374 pMgmt->sTimerSecondCallback.data = (ULONG)pDevice;
375 pMgmt->sTimerSecondCallback.function = (TimerFunction)BSSvSecondCallBack;
376 pMgmt->sTimerSecondCallback.expires = RUN_AT(HZ);
377
378 init_timer(&pDevice->sTimerCommand);
379 pDevice->sTimerCommand.data = (ULONG)pDevice;
380 pDevice->sTimerCommand.function = (TimerFunction)vRunCommand;
381 pDevice->sTimerCommand.expires = RUN_AT(HZ);
382
383//2007-0115-10<Add>by MikeLiu
384 #ifdef TxInSleep
385 init_timer(&pDevice->sTimerTxData);
386 pDevice->sTimerTxData.data = (ULONG)pDevice;
387 pDevice->sTimerTxData.function = (TimerFunction)BSSvSecondTxData;
388 pDevice->sTimerTxData.expires = RUN_AT(10*HZ); //10s callback
389 pDevice->fTxDataInSleep = FALSE;
390 pDevice->IsTxDataTrigger = FALSE;
391 pDevice->nTxDataTimeCout = 0;
392 #endif
393
394 pDevice->cbFreeCmdQueue = CMD_Q_SIZE;
395 pDevice->uCmdDequeueIdx = 0;
396 pDevice->uCmdEnqueueIdx = 0;
397 pDevice->eCommandState = WLAN_CMD_IDLE;
398 pDevice->bCmdRunning = FALSE;
399 pDevice->bCmdClear = FALSE;
400
401 return;
402}
403
404
405
406/*+
407 *
408 * Routine Description:
409 * Start the station association procedure. Namely, send an
410 * association request frame to the AP.
411 *
412 * Return Value:
413 * None.
414 *
415-*/
416
417
418VOID
419vMgrAssocBeginSta(
420 IN HANDLE hDeviceContext,
421 IN PSMgmtObject pMgmt,
422 OUT PCMD_STATUS pStatus
423 )
424{
425 PSDevice pDevice = (PSDevice)hDeviceContext;
426 PSTxMgmtPacket pTxPacket;
427
428
429 pMgmt->wCurrCapInfo = 0;
430 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_ESS(1);
431 if (pDevice->bEncryptionEnable) {
432 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_PRIVACY(1);
433 }
434 // always allow receive short preamble
435 //if (pDevice->byPreambleType == 1) {
436 // pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1);
437 //}
438 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1);
439 if (pMgmt->wListenInterval == 0)
440 pMgmt->wListenInterval = 1; // at least one.
441
442 // ERP Phy (802.11g) should support short preamble.
443 if (pMgmt->eCurrentPHYMode == PHY_TYPE_11G) {
444 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1);
445 if (pDevice->bShortSlotTime == TRUE)
446 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTSLOTTIME(1);
447
448 } else if (pMgmt->eCurrentPHYMode == PHY_TYPE_11B) {
449 if (pDevice->byPreambleType == 1) {
450 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1);
451 }
452 }
453 if (pMgmt->b11hEnable == TRUE)
454 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SPECTRUMMNG(1);
455
456 // build an assocreq frame and send it
457 pTxPacket = s_MgrMakeAssocRequest
458 (
459 pDevice,
460 pMgmt,
461 pMgmt->abyCurrBSSID,
462 pMgmt->wCurrCapInfo,
463 pMgmt->wListenInterval,
464 (PWLAN_IE_SSID)pMgmt->abyCurrSSID,
465 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
466 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates
467 );
468
469 if (pTxPacket != NULL ){
470 // send the frame
471 *pStatus = csMgmt_xmit(pDevice, pTxPacket);
472 if (*pStatus == CMD_STATUS_PENDING) {
473 pMgmt->eCurrState = WMAC_STATE_ASSOCPENDING;
474 *pStatus = CMD_STATUS_SUCCESS;
475 }
476 }
477 else
478 *pStatus = CMD_STATUS_RESOURCES;
479
480 return ;
481}
482
483
484/*+
485 *
486 * Routine Description:
487 * Start the station re-association procedure.
488 *
489 * Return Value:
490 * None.
491 *
492-*/
493
494VOID
495vMgrReAssocBeginSta(
496 IN HANDLE hDeviceContext,
497 IN PSMgmtObject pMgmt,
498 OUT PCMD_STATUS pStatus
499 )
500{
501 PSDevice pDevice = (PSDevice)hDeviceContext;
502 PSTxMgmtPacket pTxPacket;
503
504
505
506 pMgmt->wCurrCapInfo = 0;
507 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_ESS(1);
508 if (pDevice->bEncryptionEnable) {
509 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_PRIVACY(1);
510 }
511
512 //if (pDevice->byPreambleType == 1) {
513 // pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1);
514 //}
515 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1);
516
517 if (pMgmt->wListenInterval == 0)
518 pMgmt->wListenInterval = 1; // at least one.
519
520
521 // ERP Phy (802.11g) should support short preamble.
522 if (pMgmt->eCurrentPHYMode == PHY_TYPE_11G) {
523 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1);
524 if (pDevice->bShortSlotTime == TRUE)
525 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTSLOTTIME(1);
526
527 } else if (pMgmt->eCurrentPHYMode == PHY_TYPE_11B) {
528 if (pDevice->byPreambleType == 1) {
529 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1);
530 }
531 }
532 if (pMgmt->b11hEnable == TRUE)
533 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SPECTRUMMNG(1);
534
535
536 pTxPacket = s_MgrMakeReAssocRequest
537 (
538 pDevice,
539 pMgmt,
540 pMgmt->abyCurrBSSID,
541 pMgmt->wCurrCapInfo,
542 pMgmt->wListenInterval,
543 (PWLAN_IE_SSID)pMgmt->abyCurrSSID,
544 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
545 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates
546 );
547
548 if (pTxPacket != NULL ){
549 // send the frame
550 *pStatus = csMgmt_xmit(pDevice, pTxPacket);
551 if (*pStatus != CMD_STATUS_PENDING) {
552 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Reassociation tx failed.\n");
553 }
554 else {
555 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Reassociation tx sending.\n");
556 }
557 }
558
559
560 return ;
561}
562
563/*+
564 *
565 * Routine Description:
566 * Send an dis-association request frame to the AP.
567 *
568 * Return Value:
569 * None.
570 *
571-*/
572
573VOID
574vMgrDisassocBeginSta(
575 IN HANDLE hDeviceContext,
576 IN PSMgmtObject pMgmt,
577 IN PBYTE abyDestAddress,
578 IN WORD wReason,
579 OUT PCMD_STATUS pStatus
580 )
581{
582 PSDevice pDevice = (PSDevice)hDeviceContext;
583 PSTxMgmtPacket pTxPacket = NULL;
584 WLAN_FR_DISASSOC sFrame;
585
586 pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
587 memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_DISASSOC_FR_MAXLEN);
588 pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
589
590 // Setup the sFrame structure
591 sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
592 sFrame.len = WLAN_DISASSOC_FR_MAXLEN;
593
594 // format fixed field frame structure
595 vMgrEncodeDisassociation(&sFrame);
596
597 // Setup the header
598 sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
599 (
600 WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
601 WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_DISASSOC)
602 ));
603
604 memcpy( sFrame.pHdr->sA3.abyAddr1, abyDestAddress, WLAN_ADDR_LEN);
605 memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
606 memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
607
608 // Set reason code
609 *(sFrame.pwReason) = cpu_to_le16(wReason);
610 pTxPacket->cbMPDULen = sFrame.len;
611 pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
612
613 // send the frame
614 *pStatus = csMgmt_xmit(pDevice, pTxPacket);
615 if (*pStatus == CMD_STATUS_PENDING) {
616 pMgmt->eCurrState = WMAC_STATE_IDLE;
617 *pStatus = CMD_STATUS_SUCCESS;
618 };
619
620 return;
621}
622
623
624
625/*+
626 *
627 * Routine Description:(AP function)
628 * Handle incoming station association request frames.
629 *
630 * Return Value:
631 * None.
632 *
633-*/
634
635static
636VOID
637s_vMgrRxAssocRequest(
638 IN PSDevice pDevice,
639 IN PSMgmtObject pMgmt,
640 IN PSRxMgmtPacket pRxPacket,
641 IN UINT uNodeIndex
642 )
643{
644 WLAN_FR_ASSOCREQ sFrame;
645 CMD_STATUS Status;
646 PSTxMgmtPacket pTxPacket;
647 WORD wAssocStatus = 0;
648 WORD wAssocAID = 0;
649 UINT uRateLen = WLAN_RATES_MAXLEN;
650 BYTE abyCurrSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
651 BYTE abyCurrExtSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
652
653
654 if (pMgmt->eCurrMode != WMAC_MODE_ESS_AP)
655 return;
656 // node index not found
657 if (!uNodeIndex)
658 return;
659
660 //check if node is authenticated
661 //decode the frame
662 memset(&sFrame, 0, sizeof(WLAN_FR_ASSOCREQ));
663 memset(abyCurrSuppRates, 0, WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1);
664 memset(abyCurrExtSuppRates, 0, WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1);
665 sFrame.len = pRxPacket->cbMPDULen;
666 sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
667
668 vMgrDecodeAssocRequest(&sFrame);
669
670 if (pMgmt->sNodeDBTable[uNodeIndex].eNodeState >= NODE_AUTH) {
671 pMgmt->sNodeDBTable[uNodeIndex].eNodeState = NODE_ASSOC;
672 pMgmt->sNodeDBTable[uNodeIndex].wCapInfo = cpu_to_le16(*sFrame.pwCapInfo);
673 pMgmt->sNodeDBTable[uNodeIndex].wListenInterval = cpu_to_le16(*sFrame.pwListenInterval);
674 pMgmt->sNodeDBTable[uNodeIndex].bPSEnable =
675 WLAN_GET_FC_PWRMGT(sFrame.pHdr->sA3.wFrameCtl) ? TRUE : FALSE;
676 // Todo: check sta basic rate, if ap can't support, set status code
677 if (pDevice->byBBType == BB_TYPE_11B) {
678 uRateLen = WLAN_RATES_MAXLEN_11B;
679 }
680 abyCurrSuppRates[0] = WLAN_EID_SUPP_RATES;
681 abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pSuppRates,
682 (PWLAN_IE_SUPP_RATES)abyCurrSuppRates,
683 uRateLen);
684 abyCurrExtSuppRates[0] = WLAN_EID_EXTSUPP_RATES;
685 if (pDevice->byBBType == BB_TYPE_11G) {
686 abyCurrExtSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pExtSuppRates,
687 (PWLAN_IE_SUPP_RATES)abyCurrExtSuppRates,
688 uRateLen);
689 } else {
690 abyCurrExtSuppRates[1] = 0;
691 }
692
693
694 RATEvParseMaxRate((PVOID)pDevice,
695 (PWLAN_IE_SUPP_RATES)abyCurrSuppRates,
696 (PWLAN_IE_SUPP_RATES)abyCurrExtSuppRates,
697 FALSE, // do not change our basic rate
698 &(pMgmt->sNodeDBTable[uNodeIndex].wMaxBasicRate),
699 &(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate),
700 &(pMgmt->sNodeDBTable[uNodeIndex].wSuppRate),
701 &(pMgmt->sNodeDBTable[uNodeIndex].byTopCCKBasicRate),
702 &(pMgmt->sNodeDBTable[uNodeIndex].byTopOFDMBasicRate)
703 );
704
705 // set max tx rate
706 pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate =
707 pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate;
708 // Todo: check sta preamble, if ap can't support, set status code
709 pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble =
710 WLAN_GET_CAP_INFO_SHORTPREAMBLE(*sFrame.pwCapInfo);
711 pMgmt->sNodeDBTable[uNodeIndex].bShortSlotTime =
712 WLAN_GET_CAP_INFO_SHORTSLOTTIME(*sFrame.pwCapInfo);
713 pMgmt->sNodeDBTable[uNodeIndex].wAID = (WORD)uNodeIndex;
714 wAssocStatus = WLAN_MGMT_STATUS_SUCCESS;
715 wAssocAID = (WORD)uNodeIndex;
716 // check if ERP support
717 if(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate > RATE_11M)
718 pMgmt->sNodeDBTable[uNodeIndex].bERPExist = TRUE;
719
720 if (pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate <= RATE_11M) {
721 // B only STA join
722 pDevice->bProtectMode = TRUE;
723 pDevice->bNonERPPresent = TRUE;
724 }
725 if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble == FALSE) {
726 pDevice->bBarkerPreambleMd = TRUE;
727 }
728
729 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Associate AID= %d \n", wAssocAID);
730 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "MAC=%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X \n",
731 sFrame.pHdr->sA3.abyAddr2[0],
732 sFrame.pHdr->sA3.abyAddr2[1],
733 sFrame.pHdr->sA3.abyAddr2[2],
734 sFrame.pHdr->sA3.abyAddr2[3],
735 sFrame.pHdr->sA3.abyAddr2[4],
736 sFrame.pHdr->sA3.abyAddr2[5]
737 ) ;
738 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Max Support rate = %d \n",
739 pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate);
740 }
741
742
743 // assoc response reply..
744 pTxPacket = s_MgrMakeAssocResponse
745 (
746 pDevice,
747 pMgmt,
748 pMgmt->wCurrCapInfo,
749 wAssocStatus,
750 wAssocAID,
751 sFrame.pHdr->sA3.abyAddr2,
752 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
753 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates
754 );
755 if (pTxPacket != NULL ){
756
757 if (pDevice->bEnableHostapd) {
758 return;
759 }
760 /* send the frame */
761 Status = csMgmt_xmit(pDevice, pTxPacket);
762 if (Status != CMD_STATUS_PENDING) {
763 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Assoc response tx failed\n");
764 }
765 else {
766 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Assoc response tx sending..\n");
767 }
768
769 }
770
771 return;
772}
773
774
775/*+
776 *
777 * Description:(AP function)
778 * Handle incoming station re-association request frames.
779 *
780 * Parameters:
781 * In:
782 * pMgmt - Management Object structure
783 * pRxPacket - Received Packet
784 * Out:
785 * none
786 *
787 * Return Value: None.
788 *
789-*/
790
791static
792VOID
793s_vMgrRxReAssocRequest(
794 IN PSDevice pDevice,
795 IN PSMgmtObject pMgmt,
796 IN PSRxMgmtPacket pRxPacket,
797 IN UINT uNodeIndex
798 )
799{
800 WLAN_FR_REASSOCREQ sFrame;
801 CMD_STATUS Status;
802 PSTxMgmtPacket pTxPacket;
803 WORD wAssocStatus = 0;
804 WORD wAssocAID = 0;
805 UINT uRateLen = WLAN_RATES_MAXLEN;
806 BYTE abyCurrSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
807 BYTE abyCurrExtSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
808
809 if (pMgmt->eCurrMode != WMAC_MODE_ESS_AP)
810 return;
811 // node index not found
812 if (!uNodeIndex)
813 return;
814 //check if node is authenticated
815 //decode the frame
816 memset(&sFrame, 0, sizeof(WLAN_FR_REASSOCREQ));
817 sFrame.len = pRxPacket->cbMPDULen;
818 sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
819 vMgrDecodeReassocRequest(&sFrame);
820
821 if (pMgmt->sNodeDBTable[uNodeIndex].eNodeState >= NODE_AUTH) {
822 pMgmt->sNodeDBTable[uNodeIndex].eNodeState = NODE_ASSOC;
823 pMgmt->sNodeDBTable[uNodeIndex].wCapInfo = cpu_to_le16(*sFrame.pwCapInfo);
824 pMgmt->sNodeDBTable[uNodeIndex].wListenInterval = cpu_to_le16(*sFrame.pwListenInterval);
825 pMgmt->sNodeDBTable[uNodeIndex].bPSEnable =
826 WLAN_GET_FC_PWRMGT(sFrame.pHdr->sA3.wFrameCtl) ? TRUE : FALSE;
827 // Todo: check sta basic rate, if ap can't support, set status code
828
829 if (pDevice->byBBType == BB_TYPE_11B) {
830 uRateLen = WLAN_RATES_MAXLEN_11B;
831 }
832
833 abyCurrSuppRates[0] = WLAN_EID_SUPP_RATES;
834 abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pSuppRates,
835 (PWLAN_IE_SUPP_RATES)abyCurrSuppRates,
836 uRateLen);
837 abyCurrExtSuppRates[0] = WLAN_EID_EXTSUPP_RATES;
838 if (pDevice->byBBType == BB_TYPE_11G) {
839 abyCurrExtSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pExtSuppRates,
840 (PWLAN_IE_SUPP_RATES)abyCurrExtSuppRates,
841 uRateLen);
842 } else {
843 abyCurrExtSuppRates[1] = 0;
844 }
845
846
847 RATEvParseMaxRate((PVOID)pDevice,
848 (PWLAN_IE_SUPP_RATES)abyCurrSuppRates,
849 (PWLAN_IE_SUPP_RATES)abyCurrExtSuppRates,
850 FALSE, // do not change our basic rate
851 &(pMgmt->sNodeDBTable[uNodeIndex].wMaxBasicRate),
852 &(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate),
853 &(pMgmt->sNodeDBTable[uNodeIndex].wSuppRate),
854 &(pMgmt->sNodeDBTable[uNodeIndex].byTopCCKBasicRate),
855 &(pMgmt->sNodeDBTable[uNodeIndex].byTopOFDMBasicRate)
856 );
857
858 // set max tx rate
859 pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate =
860 pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate;
861 // Todo: check sta preamble, if ap can't support, set status code
862 pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble =
863 WLAN_GET_CAP_INFO_SHORTPREAMBLE(*sFrame.pwCapInfo);
864 pMgmt->sNodeDBTable[uNodeIndex].bShortSlotTime =
865 WLAN_GET_CAP_INFO_SHORTSLOTTIME(*sFrame.pwCapInfo);
866 pMgmt->sNodeDBTable[uNodeIndex].wAID = (WORD)uNodeIndex;
867 wAssocStatus = WLAN_MGMT_STATUS_SUCCESS;
868 wAssocAID = (WORD)uNodeIndex;
869
870 // if suppurt ERP
871 if(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate > RATE_11M)
872 pMgmt->sNodeDBTable[uNodeIndex].bERPExist = TRUE;
873
874 if (pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate <= RATE_11M) {
875 // B only STA join
876 pDevice->bProtectMode = TRUE;
877 pDevice->bNonERPPresent = TRUE;
878 }
879 if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble == FALSE) {
880 pDevice->bBarkerPreambleMd = TRUE;
881 }
882
883 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Rx ReAssociate AID= %d \n", wAssocAID);
884 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "MAC=%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X \n",
885 sFrame.pHdr->sA3.abyAddr2[0],
886 sFrame.pHdr->sA3.abyAddr2[1],
887 sFrame.pHdr->sA3.abyAddr2[2],
888 sFrame.pHdr->sA3.abyAddr2[3],
889 sFrame.pHdr->sA3.abyAddr2[4],
890 sFrame.pHdr->sA3.abyAddr2[5]
891 ) ;
892 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Max Support rate = %d \n",
893 pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate);
894
895 }
896
897
898 // assoc response reply..
899 pTxPacket = s_MgrMakeReAssocResponse
900 (
901 pDevice,
902 pMgmt,
903 pMgmt->wCurrCapInfo,
904 wAssocStatus,
905 wAssocAID,
906 sFrame.pHdr->sA3.abyAddr2,
907 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
908 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates
909 );
910
911 if (pTxPacket != NULL ){
912 /* send the frame */
913 if (pDevice->bEnableHostapd) {
914 return;
915 }
916 Status = csMgmt_xmit(pDevice, pTxPacket);
917 if (Status != CMD_STATUS_PENDING) {
918 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:ReAssoc response tx failed\n");
919 }
920 else {
921 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:ReAssoc response tx sending..\n");
922 }
923 }
924 return;
925}
926
927
928/*+
929 *
930 * Routine Description:
931 * Handle incoming association response frames.
932 *
933 * Return Value:
934 * None.
935 *
936-*/
937
938static
939VOID
940s_vMgrRxAssocResponse(
941 IN PSDevice pDevice,
942 IN PSMgmtObject pMgmt,
943 IN PSRxMgmtPacket pRxPacket,
944 IN BOOL bReAssocType
945 )
946{
947 WLAN_FR_ASSOCRESP sFrame;
948 PWLAN_IE_SSID pItemSSID;
949 PBYTE pbyIEs;
950 viawget_wpa_header *wpahdr;
951
952
953
954 if (pMgmt->eCurrState == WMAC_STATE_ASSOCPENDING ||
955 pMgmt->eCurrState == WMAC_STATE_ASSOC) {
956
957 sFrame.len = pRxPacket->cbMPDULen;
958 sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
959 // decode the frame
960 vMgrDecodeAssocResponse(&sFrame);
961 if ((sFrame.pwCapInfo == 0) ||
962 (sFrame.pwStatus == 0) ||
963 (sFrame.pwAid == 0) ||
964 (sFrame.pSuppRates == 0)){
965 DBG_PORT80(0xCC);
966 return;
967 };
968
969 pMgmt->sAssocInfo.AssocInfo.ResponseFixedIEs.Capabilities = *(sFrame.pwCapInfo);
970 pMgmt->sAssocInfo.AssocInfo.ResponseFixedIEs.StatusCode = *(sFrame.pwStatus);
971 pMgmt->sAssocInfo.AssocInfo.ResponseFixedIEs.AssociationId = *(sFrame.pwAid);
972 pMgmt->sAssocInfo.AssocInfo.AvailableResponseFixedIEs |= 0x07;
973
974 pMgmt->sAssocInfo.AssocInfo.ResponseIELength = sFrame.len - 24 - 6;
975 pMgmt->sAssocInfo.AssocInfo.OffsetResponseIEs = pMgmt->sAssocInfo.AssocInfo.OffsetRequestIEs + pMgmt->sAssocInfo.AssocInfo.RequestIELength;
976 pbyIEs = pMgmt->sAssocInfo.abyIEs;
977 pbyIEs += pMgmt->sAssocInfo.AssocInfo.RequestIELength;
978 memcpy(pbyIEs, (sFrame.pBuf + 24 +6), pMgmt->sAssocInfo.AssocInfo.ResponseIELength);
979
980 // save values and set current BSS state
981 if (cpu_to_le16((*(sFrame.pwStatus))) == WLAN_MGMT_STATUS_SUCCESS ){
982 // set AID
983 pMgmt->wCurrAID = cpu_to_le16((*(sFrame.pwAid)));
984 if ( (pMgmt->wCurrAID >> 14) != (BIT0 | BIT1) )
985 {
986 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "AID from AP, has two msb clear.\n");
987 };
988 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Association Successful, AID=%d.\n", pMgmt->wCurrAID & ~(BIT14|BIT15));
989 pMgmt->eCurrState = WMAC_STATE_ASSOC;
990 BSSvUpdateAPNode((HANDLE)pDevice, sFrame.pwCapInfo, sFrame.pSuppRates, sFrame.pExtSuppRates);
991 pItemSSID = (PWLAN_IE_SSID)pMgmt->abyCurrSSID;
992 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Link with AP(SSID): %s\n", pItemSSID->abySSID);
993 pDevice->bLinkPass = TRUE;
994 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_INTER);
995 if ((pDevice->bWPADEVUp) && (pDevice->skb != NULL)) {
996 if(skb_tailroom(pDevice->skb) <(sizeof(viawget_wpa_header)+pMgmt->sAssocInfo.AssocInfo.ResponseIELength+
997 pMgmt->sAssocInfo.AssocInfo.RequestIELength)) { //data room not enough
998 dev_kfree_skb(pDevice->skb);
999 pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1000 }
1001 wpahdr = (viawget_wpa_header *)pDevice->skb->data;
1002 wpahdr->type = VIAWGET_ASSOC_MSG;
1003 wpahdr->resp_ie_len = pMgmt->sAssocInfo.AssocInfo.ResponseIELength;
1004 wpahdr->req_ie_len = pMgmt->sAssocInfo.AssocInfo.RequestIELength;
1005 memcpy(pDevice->skb->data + sizeof(viawget_wpa_header), pMgmt->sAssocInfo.abyIEs, wpahdr->req_ie_len);
1006 memcpy(pDevice->skb->data + sizeof(viawget_wpa_header) + wpahdr->req_ie_len,
1007 pbyIEs,
1008 wpahdr->resp_ie_len
1009 );
1010 skb_put(pDevice->skb, sizeof(viawget_wpa_header) + wpahdr->resp_ie_len + wpahdr->req_ie_len);
1011 pDevice->skb->dev = pDevice->wpadev;
d899d403 1012 skb_reset_mac_header(pDevice->skb);
92b96797
FB
1013 pDevice->skb->pkt_type = PACKET_HOST;
1014 pDevice->skb->protocol = htons(ETH_P_802_2);
1015 memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
1016 netif_rx(pDevice->skb);
1017 pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1018 }
1019//2008-0409-07, <Add> by Einsn Liu
1020#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1021 //if(pDevice->bWPASuppWextEnabled == TRUE)
1022 {
1023 BYTE buf[512];
1024 size_t len;
1025 union iwreq_data wrqu;
1026 int we_event;
1027
1028 memset(buf, 0, 512);
1029
1030 len = pMgmt->sAssocInfo.AssocInfo.RequestIELength;
1031 if(len) {
1032 memcpy(buf, pMgmt->sAssocInfo.abyIEs, len);
1033 memset(&wrqu, 0, sizeof (wrqu));
1034 wrqu.data.length = len;
1035 we_event = IWEVASSOCREQIE;
1036 PRINT_K("wireless_send_event--->IWEVASSOCREQIE\n");
1037 wireless_send_event(pDevice->dev, we_event, &wrqu, buf);
1038 }
1039
1040 memset(buf, 0, 512);
1041 len = pMgmt->sAssocInfo.AssocInfo.ResponseIELength;
1042
1043 if(len) {
1044 memcpy(buf, pbyIEs, len);
1045 memset(&wrqu, 0, sizeof (wrqu));
1046 wrqu.data.length = len;
1047 we_event = IWEVASSOCRESPIE;
1048 PRINT_K("wireless_send_event--->IWEVASSOCRESPIE\n");
1049 wireless_send_event(pDevice->dev, we_event, &wrqu, buf);
1050 }
1051
1052 memset(&wrqu, 0, sizeof (wrqu));
1053 memcpy(wrqu.ap_addr.sa_data, &pMgmt->abyCurrBSSID[0], ETH_ALEN);
1054 wrqu.ap_addr.sa_family = ARPHRD_ETHER;
1055 PRINT_K("wireless_send_event--->SIOCGIWAP(associated)\n");
1056 wireless_send_event(pDevice->dev, SIOCGIWAP, &wrqu, NULL);
1057
1058 }
1059#endif //#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1060//End Add -- //2008-0409-07, <Add> by Einsn Liu
1061 }
1062 else {
1063 if (bReAssocType) {
1064 pMgmt->eCurrState = WMAC_STATE_IDLE;
1065 }
1066 else {
1067 // jump back to the auth state and indicate the error
1068 pMgmt->eCurrState = WMAC_STATE_AUTH;
1069 }
1070 s_vMgrLogStatus(pMgmt,cpu_to_le16((*(sFrame.pwStatus))));
1071 }
1072
1073 }
1074
1075#if 1
1076#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1077//need clear flags related to Networkmanager
1078 pDevice->bwextstep0 = FALSE;
1079 pDevice->bwextstep1 = FALSE;
1080 pDevice->bwextstep2 = FALSE;
1081 pDevice->bwextstep3 = FALSE;
1082 pDevice->bWPASuppWextEnabled = FALSE;
1083#endif
1084#endif
1085
1086if(pMgmt->eCurrState == WMAC_STATE_ASSOC)
1087 timer_expire(pDevice->sTimerCommand, 0);
1088
1089 return;
1090}
1091
1092
1093
1094/*+
1095 *
1096 * Routine Description:
1097 * Start the station authentication procedure. Namely, send an
1098 * authentication frame to the AP.
1099 *
1100 * Return Value:
1101 * None.
1102 *
1103-*/
1104
1105VOID
1106vMgrAuthenBeginSta(
1107 IN HANDLE hDeviceContext,
1108 IN PSMgmtObject pMgmt,
1109 OUT PCMD_STATUS pStatus
1110 )
1111{
1112 PSDevice pDevice = (PSDevice)hDeviceContext;
1113 WLAN_FR_AUTHEN sFrame;
1114 PSTxMgmtPacket pTxPacket = NULL;
1115
1116 pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
1117 memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_AUTHEN_FR_MAXLEN);
1118 pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
1119 sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
1120 sFrame.len = WLAN_AUTHEN_FR_MAXLEN;
1121 vMgrEncodeAuthen(&sFrame);
1122 /* insert values */
1123 sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
1124 (
1125 WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
1126 WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_AUTHEN)
1127 ));
1128 memcpy( sFrame.pHdr->sA3.abyAddr1, pMgmt->abyCurrBSSID, WLAN_ADDR_LEN);
1129 memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
1130 memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
1131 if (pMgmt->bShareKeyAlgorithm)
1132 *(sFrame.pwAuthAlgorithm) = cpu_to_le16(WLAN_AUTH_ALG_SHAREDKEY);
1133 else
1134 *(sFrame.pwAuthAlgorithm) = cpu_to_le16(WLAN_AUTH_ALG_OPENSYSTEM);
1135
1136 *(sFrame.pwAuthSequence) = cpu_to_le16(1);
1137 /* Adjust the length fields */
1138 pTxPacket->cbMPDULen = sFrame.len;
1139 pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
1140
1141 *pStatus = csMgmt_xmit(pDevice, pTxPacket);
1142 if (*pStatus == CMD_STATUS_PENDING){
1143 pMgmt->eCurrState = WMAC_STATE_AUTHPENDING;
1144 *pStatus = CMD_STATUS_SUCCESS;
1145 }
1146
1147 return ;
1148}
1149
1150
1151
1152/*+
1153 *
1154 * Routine Description:
1155 * Start the station(AP) deauthentication procedure. Namely, send an
1156 * deauthentication frame to the AP or Sta.
1157 *
1158 * Return Value:
1159 * None.
1160 *
1161-*/
1162
1163VOID
1164vMgrDeAuthenBeginSta(
1165 IN HANDLE hDeviceContext,
1166 IN PSMgmtObject pMgmt,
1167 IN PBYTE abyDestAddress,
1168 IN WORD wReason,
1169 OUT PCMD_STATUS pStatus
1170 )
1171{
1172 PSDevice pDevice = (PSDevice)hDeviceContext;
1173 WLAN_FR_DEAUTHEN sFrame;
1174 PSTxMgmtPacket pTxPacket = NULL;
1175
1176
1177 pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
1178 memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_DEAUTHEN_FR_MAXLEN);
1179 pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
1180 sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
1181 sFrame.len = WLAN_DEAUTHEN_FR_MAXLEN;
1182 vMgrEncodeDeauthen(&sFrame);
1183 /* insert values */
1184 sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
1185 (
1186 WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
1187 WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_DEAUTHEN)
1188 ));
1189
1190 memcpy( sFrame.pHdr->sA3.abyAddr1, abyDestAddress, WLAN_ADDR_LEN);
1191 memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
1192 memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
1193
1194 *(sFrame.pwReason) = cpu_to_le16(wReason); // deauthen. bcs left BSS
1195 /* Adjust the length fields */
1196 pTxPacket->cbMPDULen = sFrame.len;
1197 pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
1198
1199 *pStatus = csMgmt_xmit(pDevice, pTxPacket);
1200 if (*pStatus == CMD_STATUS_PENDING){
1201 *pStatus = CMD_STATUS_SUCCESS;
1202 }
1203
1204
1205 return ;
1206}
1207
1208
1209/*+
1210 *
1211 * Routine Description:
1212 * Handle incoming authentication frames.
1213 *
1214 * Return Value:
1215 * None.
1216 *
1217-*/
1218
1219static
1220VOID
1221s_vMgrRxAuthentication(
1222 IN PSDevice pDevice,
1223 IN PSMgmtObject pMgmt,
1224 IN PSRxMgmtPacket pRxPacket
1225 )
1226{
1227 WLAN_FR_AUTHEN sFrame;
1228
1229 // we better be an AP or a STA in AUTHPENDING otherwise ignore
1230 if (!(pMgmt->eCurrMode == WMAC_MODE_ESS_AP ||
1231 pMgmt->eCurrState == WMAC_STATE_AUTHPENDING)) {
1232 return;
1233 }
1234
1235 // decode the frame
1236 sFrame.len = pRxPacket->cbMPDULen;
1237 sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
1238 vMgrDecodeAuthen(&sFrame);
1239 switch (cpu_to_le16((*(sFrame.pwAuthSequence )))){
1240 case 1:
1241 //AP funciton
1242 s_vMgrRxAuthenSequence_1(pDevice,pMgmt, &sFrame);
1243 break;
1244 case 2:
1245 s_vMgrRxAuthenSequence_2(pDevice, pMgmt, &sFrame);
1246 break;
1247 case 3:
1248 //AP funciton
1249 s_vMgrRxAuthenSequence_3(pDevice, pMgmt, &sFrame);
1250 break;
1251 case 4:
1252 s_vMgrRxAuthenSequence_4(pDevice, pMgmt, &sFrame);
1253 break;
1254 default:
1255 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Auth Sequence error, seq = %d\n",
1256 cpu_to_le16((*(sFrame.pwAuthSequence))));
1257 break;
1258 }
1259 return;
1260}
1261
1262
1263
1264/*+
1265 *
1266 * Routine Description:
1267 * Handles incoming authen frames with sequence 1. Currently
1268 * assumes we're an AP. So far, no one appears to use authentication
1269 * in Ad-Hoc mode.
1270 *
1271 * Return Value:
1272 * None.
1273 *
1274-*/
1275
1276
1277static
1278VOID
1279s_vMgrRxAuthenSequence_1(
1280 IN PSDevice pDevice,
1281 IN PSMgmtObject pMgmt,
1282 IN PWLAN_FR_AUTHEN pFrame
1283 )
1284{
1285 PSTxMgmtPacket pTxPacket = NULL;
1286 UINT uNodeIndex;
1287 WLAN_FR_AUTHEN sFrame;
1288 PSKeyItem pTransmitKey;
1289
1290 // Insert a Node entry
1291 if (!BSSbIsSTAInNodeDB(pDevice, pFrame->pHdr->sA3.abyAddr2, &uNodeIndex)) {
1292 BSSvCreateOneNode((PSDevice)pDevice, &uNodeIndex);
1293 memcpy(pMgmt->sNodeDBTable[uNodeIndex].abyMACAddr, pFrame->pHdr->sA3.abyAddr2,
1294 WLAN_ADDR_LEN);
1295 }
1296
1297 if (pMgmt->bShareKeyAlgorithm) {
1298 pMgmt->sNodeDBTable[uNodeIndex].eNodeState = NODE_KNOWN;
1299 pMgmt->sNodeDBTable[uNodeIndex].byAuthSequence = 1;
1300 }
1301 else {
1302 pMgmt->sNodeDBTable[uNodeIndex].eNodeState = NODE_AUTH;
1303 }
1304
1305 // send auth reply
1306 pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
1307 memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_AUTHEN_FR_MAXLEN);
1308 pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
1309 sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
1310 sFrame.len = WLAN_AUTHEN_FR_MAXLEN;
1311 // format buffer structure
1312 vMgrEncodeAuthen(&sFrame);
1313 // insert values
1314 sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
1315 (
1316 WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
1317 WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_AUTHEN)|
1318 WLAN_SET_FC_ISWEP(0)
1319 ));
1320 memcpy( sFrame.pHdr->sA3.abyAddr1, pFrame->pHdr->sA3.abyAddr2, WLAN_ADDR_LEN);
1321 memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
1322 memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
1323 *(sFrame.pwAuthAlgorithm) = *(pFrame->pwAuthAlgorithm);
1324 *(sFrame.pwAuthSequence) = cpu_to_le16(2);
1325
1326 if (cpu_to_le16(*(pFrame->pwAuthAlgorithm)) == WLAN_AUTH_ALG_SHAREDKEY) {
1327 if (pMgmt->bShareKeyAlgorithm)
1328 *(sFrame.pwStatus) = cpu_to_le16(WLAN_MGMT_STATUS_SUCCESS);
1329 else
1330 *(sFrame.pwStatus) = cpu_to_le16(WLAN_MGMT_STATUS_UNSUPPORTED_AUTHALG);
1331 }
1332 else {
1333 if (pMgmt->bShareKeyAlgorithm)
1334 *(sFrame.pwStatus) = cpu_to_le16(WLAN_MGMT_STATUS_UNSUPPORTED_AUTHALG);
1335 else
1336 *(sFrame.pwStatus) = cpu_to_le16(WLAN_MGMT_STATUS_SUCCESS);
1337 }
1338
1339 if (pMgmt->bShareKeyAlgorithm &&
1340 (cpu_to_le16(*(sFrame.pwStatus)) == WLAN_MGMT_STATUS_SUCCESS)) {
1341
1342 sFrame.pChallenge = (PWLAN_IE_CHALLENGE)(sFrame.pBuf + sFrame.len);
1343 sFrame.len += WLAN_CHALLENGE_IE_LEN;
1344 sFrame.pChallenge->byElementID = WLAN_EID_CHALLENGE;
1345 sFrame.pChallenge->len = WLAN_CHALLENGE_LEN;
1346 memset(pMgmt->abyChallenge, 0, WLAN_CHALLENGE_LEN);
1347 // get group key
1348 if(KeybGetTransmitKey(&(pDevice->sKey), pDevice->abyBroadcastAddr, GROUP_KEY, &pTransmitKey) == TRUE) {
1349 rc4_init(&pDevice->SBox, pDevice->abyPRNG, pTransmitKey->uKeyLength+3);
1350 rc4_encrypt(&pDevice->SBox, pMgmt->abyChallenge, pMgmt->abyChallenge, WLAN_CHALLENGE_LEN);
1351 }
1352 memcpy(sFrame.pChallenge->abyChallenge, pMgmt->abyChallenge , WLAN_CHALLENGE_LEN);
1353 }
1354
1355 /* Adjust the length fields */
1356 pTxPacket->cbMPDULen = sFrame.len;
1357 pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
1358 // send the frame
1359 if (pDevice->bEnableHostapd) {
1360 return;
1361 }
1362 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Authreq_reply sequence_1 tx.. \n");
1363 if (csMgmt_xmit(pDevice, pTxPacket) != CMD_STATUS_PENDING) {
1364 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Authreq_reply sequence_1 tx failed.\n");
1365 }
1366 return;
1367}
1368
1369
1370
1371/*+
1372 *
1373 * Routine Description:
1374 * Handles incoming auth frames with sequence number 2. Currently
1375 * assumes we're a station.
1376 *
1377 *
1378 * Return Value:
1379 * None.
1380 *
1381-*/
1382
1383static
1384VOID
1385s_vMgrRxAuthenSequence_2(
1386 IN PSDevice pDevice,
1387 IN PSMgmtObject pMgmt,
1388 IN PWLAN_FR_AUTHEN pFrame
1389 )
1390{
1391 WLAN_FR_AUTHEN sFrame;
1392 PSTxMgmtPacket pTxPacket = NULL;
1393
1394
1395 switch (cpu_to_le16((*(pFrame->pwAuthAlgorithm))))
1396 {
1397 case WLAN_AUTH_ALG_OPENSYSTEM:
1398 if ( cpu_to_le16((*(pFrame->pwStatus))) == WLAN_MGMT_STATUS_SUCCESS ){
1399 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "802.11 Authen (OPEN) Successful.\n");
1400 pMgmt->eCurrState = WMAC_STATE_AUTH;
1401 timer_expire(pDevice->sTimerCommand, 0);
1402 }
1403 else {
1404 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "802.11 Authen (OPEN) Failed.\n");
1405 s_vMgrLogStatus(pMgmt, cpu_to_le16((*(pFrame->pwStatus))));
1406 pMgmt->eCurrState = WMAC_STATE_IDLE;
1407 }
1408 if (pDevice->eCommandState == WLAN_AUTHENTICATE_WAIT ) {
1409// spin_unlock_irq(&pDevice->lock);
1410// vCommandTimerWait((HANDLE)pDevice, 0);
1411// spin_lock_irq(&pDevice->lock);
1412 }
1413
1414 break;
1415
1416 case WLAN_AUTH_ALG_SHAREDKEY:
1417
1418 if (cpu_to_le16((*(pFrame->pwStatus))) == WLAN_MGMT_STATUS_SUCCESS) {
1419 pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
1420 memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_AUTHEN_FR_MAXLEN);
1421 pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
1422 sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
1423 sFrame.len = WLAN_AUTHEN_FR_MAXLEN;
1424 // format buffer structure
1425 vMgrEncodeAuthen(&sFrame);
1426 // insert values
1427 sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
1428 (
1429 WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
1430 WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_AUTHEN)|
1431 WLAN_SET_FC_ISWEP(1)
1432 ));
1433 memcpy( sFrame.pHdr->sA3.abyAddr1, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
1434 memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
1435 memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
1436 *(sFrame.pwAuthAlgorithm) = *(pFrame->pwAuthAlgorithm);
1437 *(sFrame.pwAuthSequence) = cpu_to_le16(3);
1438 *(sFrame.pwStatus) = cpu_to_le16(WLAN_MGMT_STATUS_SUCCESS);
1439 sFrame.pChallenge = (PWLAN_IE_CHALLENGE)(sFrame.pBuf + sFrame.len);
1440 sFrame.len += WLAN_CHALLENGE_IE_LEN;
1441 sFrame.pChallenge->byElementID = WLAN_EID_CHALLENGE;
1442 sFrame.pChallenge->len = WLAN_CHALLENGE_LEN;
1443 memcpy( sFrame.pChallenge->abyChallenge, pFrame->pChallenge->abyChallenge, WLAN_CHALLENGE_LEN);
1444 // Adjust the length fields
1445 pTxPacket->cbMPDULen = sFrame.len;
1446 pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
1447 // send the frame
1448 if (csMgmt_xmit(pDevice, pTxPacket) != CMD_STATUS_PENDING) {
1449 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Auth_reply sequence_2 tx failed.\n");
1450 }
1451 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Auth_reply sequence_2 tx ...\n");
1452 }
1453 else {
1454 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:rx Auth_reply sequence_2 status error ...\n");
1455 if ( pDevice->eCommandState == WLAN_AUTHENTICATE_WAIT ) {
1456// spin_unlock_irq(&pDevice->lock);
1457// vCommandTimerWait((HANDLE)pDevice, 0);
1458// spin_lock_irq(&pDevice->lock);
1459 }
1460 s_vMgrLogStatus(pMgmt, cpu_to_le16((*(pFrame->pwStatus))));
1461 }
1462 break;
1463 default:
1464 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt: rx auth.seq = 2 unknown AuthAlgorithm=%d\n", cpu_to_le16((*(pFrame->pwAuthAlgorithm))));
1465 break;
1466 }
1467 return;
1468}
1469
1470
1471
1472/*+
1473 *
1474 * Routine Description:
1475 * Handles incoming authen frames with sequence 3. Currently
1476 * assumes we're an AP. This function assumes the frame has
1477 * already been successfully decrypted.
1478 *
1479 *
1480 * Return Value:
1481 * None.
1482 *
1483-*/
1484
1485static
1486VOID
1487s_vMgrRxAuthenSequence_3(
1488 IN PSDevice pDevice,
1489 IN PSMgmtObject pMgmt,
1490 IN PWLAN_FR_AUTHEN pFrame
1491 )
1492{
1493 PSTxMgmtPacket pTxPacket = NULL;
1494 UINT uStatusCode = 0 ;
1495 UINT uNodeIndex = 0;
1496 WLAN_FR_AUTHEN sFrame;
1497
1498 if (!WLAN_GET_FC_ISWEP(pFrame->pHdr->sA3.wFrameCtl)) {
1499 uStatusCode = WLAN_MGMT_STATUS_CHALLENGE_FAIL;
1500 goto reply;
1501 }
1502 if (BSSbIsSTAInNodeDB(pDevice, pFrame->pHdr->sA3.abyAddr2, &uNodeIndex)) {
1503 if (pMgmt->sNodeDBTable[uNodeIndex].byAuthSequence != 1) {
1504 uStatusCode = WLAN_MGMT_STATUS_RX_AUTH_NOSEQ;
1505 goto reply;
1506 }
1507 if (memcmp(pMgmt->abyChallenge, pFrame->pChallenge->abyChallenge, WLAN_CHALLENGE_LEN) != 0) {
1508 uStatusCode = WLAN_MGMT_STATUS_CHALLENGE_FAIL;
1509 goto reply;
1510 }
1511 }
1512 else {
1513 uStatusCode = WLAN_MGMT_STATUS_UNSPEC_FAILURE;
1514 goto reply;
1515 }
1516
1517 if (uNodeIndex) {
1518 pMgmt->sNodeDBTable[uNodeIndex].eNodeState = NODE_AUTH;
1519 pMgmt->sNodeDBTable[uNodeIndex].byAuthSequence = 0;
1520 }
1521 uStatusCode = WLAN_MGMT_STATUS_SUCCESS;
1522 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Challenge text check ok..\n");
1523
1524reply:
1525 // send auth reply
1526 pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
1527 memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_AUTHEN_FR_MAXLEN);
1528 pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
1529 sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
1530 sFrame.len = WLAN_AUTHEN_FR_MAXLEN;
1531 // format buffer structure
1532 vMgrEncodeAuthen(&sFrame);
1533 /* insert values */
1534 sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
1535 (
1536 WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
1537 WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_AUTHEN)|
1538 WLAN_SET_FC_ISWEP(0)
1539 ));
1540 memcpy( sFrame.pHdr->sA3.abyAddr1, pFrame->pHdr->sA3.abyAddr2, WLAN_ADDR_LEN);
1541 memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
1542 memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
1543 *(sFrame.pwAuthAlgorithm) = *(pFrame->pwAuthAlgorithm);
1544 *(sFrame.pwAuthSequence) = cpu_to_le16(4);
1545 *(sFrame.pwStatus) = cpu_to_le16(uStatusCode);
1546
1547 /* Adjust the length fields */
1548 pTxPacket->cbMPDULen = sFrame.len;
1549 pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
1550 // send the frame
1551 if (pDevice->bEnableHostapd) {
1552 return;
1553 }
1554 if (csMgmt_xmit(pDevice, pTxPacket) != CMD_STATUS_PENDING) {
1555 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Authreq_reply sequence_4 tx failed.\n");
1556 }
1557 return;
1558
1559}
1560
1561
1562
1563/*+
1564 *
1565 * Routine Description:
1566 * Handles incoming authen frames with sequence 4
1567 *
1568 *
1569 * Return Value:
1570 * None.
1571 *
1572-*/
1573static
1574VOID
1575s_vMgrRxAuthenSequence_4(
1576 IN PSDevice pDevice,
1577 IN PSMgmtObject pMgmt,
1578 IN PWLAN_FR_AUTHEN pFrame
1579 )
1580{
1581
1582 if ( cpu_to_le16((*(pFrame->pwStatus))) == WLAN_MGMT_STATUS_SUCCESS ){
1583 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "802.11 Authen (SHAREDKEY) Successful.\n");
1584 pMgmt->eCurrState = WMAC_STATE_AUTH;
1585 timer_expire(pDevice->sTimerCommand, 0);
1586 }
1587 else{
1588 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "802.11 Authen (SHAREDKEY) Failed.\n");
1589 s_vMgrLogStatus(pMgmt, cpu_to_le16((*(pFrame->pwStatus))) );
1590 pMgmt->eCurrState = WMAC_STATE_IDLE;
1591 }
1592
1593 if ( pDevice->eCommandState == WLAN_AUTHENTICATE_WAIT ) {
1594// spin_unlock_irq(&pDevice->lock);
1595// vCommandTimerWait((HANDLE)pDevice, 0);
1596// spin_lock_irq(&pDevice->lock);
1597 }
1598
1599}
1600
1601/*+
1602 *
1603 * Routine Description:
1604 * Handles incoming disassociation frames
1605 *
1606 *
1607 * Return Value:
1608 * None.
1609 *
1610-*/
1611
1612static
1613VOID
1614s_vMgrRxDisassociation(
1615 IN PSDevice pDevice,
1616 IN PSMgmtObject pMgmt,
1617 IN PSRxMgmtPacket pRxPacket
1618 )
1619{
1620 WLAN_FR_DISASSOC sFrame;
1621 UINT uNodeIndex = 0;
1622 CMD_STATUS CmdStatus;
1623 viawget_wpa_header *wpahdr;
1624
1625 if ( pMgmt->eCurrMode == WMAC_MODE_ESS_AP ){
1626 // if is acting an AP..
1627 // a STA is leaving this BSS..
1628 sFrame.len = pRxPacket->cbMPDULen;
1629 sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
1630 if (BSSbIsSTAInNodeDB(pDevice, pRxPacket->p80211Header->sA3.abyAddr2, &uNodeIndex)) {
1631 BSSvRemoveOneNode(pDevice, uNodeIndex);
1632 }
1633 else {
1634 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Rx disassoc, sta not found\n");
1635 }
1636 }
1637 else if (pMgmt->eCurrMode == WMAC_MODE_ESS_STA ){
1638 sFrame.len = pRxPacket->cbMPDULen;
1639 sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
1640 vMgrDecodeDisassociation(&sFrame);
1641 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "AP disassociated me, reason=%d.\n", cpu_to_le16(*(sFrame.pwReason)));
1642
1643 pDevice->fWPA_Authened = FALSE;
1644 if ((pDevice->bWPADEVUp) && (pDevice->skb != NULL)) {
1645 wpahdr = (viawget_wpa_header *)pDevice->skb->data;
1646 wpahdr->type = VIAWGET_DISASSOC_MSG;
1647 wpahdr->resp_ie_len = 0;
1648 wpahdr->req_ie_len = 0;
1649 skb_put(pDevice->skb, sizeof(viawget_wpa_header));
1650 pDevice->skb->dev = pDevice->wpadev;
d899d403 1651 skb_reset_mac_header(pDevice->skb);
92b96797
FB
1652 pDevice->skb->pkt_type = PACKET_HOST;
1653 pDevice->skb->protocol = htons(ETH_P_802_2);
1654 memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
1655 netif_rx(pDevice->skb);
1656 pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1657 };
1658
1659 //TODO: do something let upper layer know or
1660 //try to send associate packet again because of inactivity timeout
1661 if (pMgmt->eCurrState == WMAC_STATE_ASSOC) {
1662 pDevice->bLinkPass = FALSE;
1663 pMgmt->sNodeDBTable[0].bActive = FALSE;
1664 pDevice->byReAssocCount = 0;
1665 pMgmt->eCurrState = WMAC_STATE_AUTH; // jump back to the auth state!
1666 pDevice->eCommandState = WLAN_ASSOCIATE_WAIT;
1667 vMgrReAssocBeginSta((PSDevice)pDevice, pMgmt, &CmdStatus);
1668 if(CmdStatus == CMD_STATUS_PENDING) {
1669 pDevice->byReAssocCount ++;
1670 return; //mike add: you'll retry for many times, so it cann't be regarded as disconnected!
1671 }
1672 };
1673
1674 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1675 // if(pDevice->bWPASuppWextEnabled == TRUE)
1676 {
1677 union iwreq_data wrqu;
1678 memset(&wrqu, 0, sizeof (wrqu));
1679 wrqu.ap_addr.sa_family = ARPHRD_ETHER;
1680 PRINT_K("wireless_send_event--->SIOCGIWAP(disassociated)\n");
1681 wireless_send_event(pDevice->dev, SIOCGIWAP, &wrqu, NULL);
1682 }
1683 #endif
1684 }
1685 /* else, ignore it */
1686
1687 return;
1688}
1689
1690
1691/*+
1692 *
1693 * Routine Description:
1694 * Handles incoming deauthentication frames
1695 *
1696 *
1697 * Return Value:
1698 * None.
1699 *
1700-*/
1701
1702static
1703VOID
1704s_vMgrRxDeauthentication(
1705 IN PSDevice pDevice,
1706 IN PSMgmtObject pMgmt,
1707 IN PSRxMgmtPacket pRxPacket
1708 )
1709{
1710 WLAN_FR_DEAUTHEN sFrame;
1711 UINT uNodeIndex = 0;
1712 viawget_wpa_header *wpahdr;
1713
1714
1715 if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP ){
1716 //Todo:
1717 // if is acting an AP..
1718 // a STA is leaving this BSS..
1719 sFrame.len = pRxPacket->cbMPDULen;
1720 sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
1721 if (BSSbIsSTAInNodeDB(pDevice, pRxPacket->p80211Header->sA3.abyAddr2, &uNodeIndex)) {
1722 BSSvRemoveOneNode(pDevice, uNodeIndex);
1723 }
1724 else {
1725 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Rx deauth, sta not found\n");
1726 }
1727 }
1728 else {
1729 if (pMgmt->eCurrMode == WMAC_MODE_ESS_STA ) {
1730 sFrame.len = pRxPacket->cbMPDULen;
1731 sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
1732 vMgrDecodeDeauthen(&sFrame);
1733 pDevice->fWPA_Authened = FALSE;
1734 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "AP deauthed me, reason=%d.\n", cpu_to_le16((*(sFrame.pwReason))));
1735 // TODO: update BSS list for specific BSSID if pre-authentication case
1736 if (IS_ETH_ADDRESS_EQUAL(sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID)) {
1737 if (pMgmt->eCurrState >= WMAC_STATE_AUTHPENDING) {
1738 pMgmt->sNodeDBTable[0].bActive = FALSE;
1739 pMgmt->eCurrMode = WMAC_MODE_STANDBY;
1740 pMgmt->eCurrState = WMAC_STATE_IDLE;
1741 netif_stop_queue(pDevice->dev);
1742 pDevice->bLinkPass = FALSE;
1743 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_SLOW);
1744 }
1745 };
1746
1747 if ((pDevice->bWPADEVUp) && (pDevice->skb != NULL)) {
1748 wpahdr = (viawget_wpa_header *)pDevice->skb->data;
1749 wpahdr->type = VIAWGET_DISASSOC_MSG;
1750 wpahdr->resp_ie_len = 0;
1751 wpahdr->req_ie_len = 0;
1752 skb_put(pDevice->skb, sizeof(viawget_wpa_header));
1753 pDevice->skb->dev = pDevice->wpadev;
d899d403 1754 skb_reset_mac_header(pDevice->skb);
92b96797
FB
1755 pDevice->skb->pkt_type = PACKET_HOST;
1756 pDevice->skb->protocol = htons(ETH_P_802_2);
1757 memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
1758 netif_rx(pDevice->skb);
1759 pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1760 };
1761
1762 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1763 // if(pDevice->bWPASuppWextEnabled == TRUE)
1764 {
1765 union iwreq_data wrqu;
1766 memset(&wrqu, 0, sizeof (wrqu));
1767 wrqu.ap_addr.sa_family = ARPHRD_ETHER;
1768 PRINT_K("wireless_send_event--->SIOCGIWAP(disauthen)\n");
1769 wireless_send_event(pDevice->dev, SIOCGIWAP, &wrqu, NULL);
1770 }
1771 #endif
1772
1773 }
1774 /* else, ignore it. TODO: IBSS authentication service
1775 would be implemented here */
1776 };
1777 return;
1778}
1779
1780//2008-0730-01<Add>by MikeLiu
1781/*+
1782 *
1783 * Routine Description:
1784 * check if current channel is match ZoneType.
1785 *for USA:1~11;
1786 * Japan:1~13;
1787 * Europe:1~13
1788 * Return Value:
1789 * True:exceed;
1790 * False:normal case
1791-*/
1792static BOOL
1793ChannelExceedZoneType(
1794 IN PSDevice pDevice,
1795 IN BYTE byCurrChannel
1796 )
1797{
1798 BOOL exceed=FALSE;
1799
1800 switch(pDevice->byZoneType) {
1801 case 0x00: //USA:1~11
1802 if((byCurrChannel<1) ||(byCurrChannel>11))
1803 exceed = TRUE;
1804 break;
1805 case 0x01: //Japan:1~13
1806 case 0x02: //Europe:1~13
1807 if((byCurrChannel<1) ||(byCurrChannel>13))
1808 exceed = TRUE;
1809 break;
1810 default: //reserve for other zonetype
1811 break;
1812 }
1813
1814 return exceed;
1815}
1816
1817/*+
1818 *
1819 * Routine Description:
1820 * Handles and analysis incoming beacon frames.
1821 *
1822 *
1823 * Return Value:
1824 * None.
1825 *
1826-*/
1827
1828static
1829VOID
1830s_vMgrRxBeacon(
1831 IN PSDevice pDevice,
1832 IN PSMgmtObject pMgmt,
1833 IN PSRxMgmtPacket pRxPacket,
1834 IN BOOL bInScan
1835 )
1836{
1837
1838 PKnownBSS pBSSList;
1839 WLAN_FR_BEACON sFrame;
1840 QWORD qwTSFOffset;
1841 BOOL bIsBSSIDEqual = FALSE;
1842 BOOL bIsSSIDEqual = FALSE;
1843 BOOL bTSFLargeDiff = FALSE;
1844 BOOL bTSFOffsetPostive = FALSE;
1845 BOOL bUpdateTSF = FALSE;
1846 BOOL bIsAPBeacon = FALSE;
1847 BOOL bIsChannelEqual = FALSE;
1848 UINT uLocateByteIndex;
1849 BYTE byTIMBitOn = 0;
1850 WORD wAIDNumber = 0;
1851 UINT uNodeIndex;
1852 QWORD qwTimestamp, qwLocalTSF;
1853 QWORD qwCurrTSF;
1854 WORD wStartIndex = 0;
1855 WORD wAIDIndex = 0;
1856 BYTE byCurrChannel = pRxPacket->byRxChannel;
1857 ERPObject sERP;
1858 UINT uRateLen = WLAN_RATES_MAXLEN;
1859 BOOL bChannelHit = FALSE;
1860 BYTE byOldPreambleType;
1861
1862
1863
1864 if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP)
1865 return;
1866
1867 memset(&sFrame, 0, sizeof(WLAN_FR_BEACON));
1868 sFrame.len = pRxPacket->cbMPDULen;
1869 sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
1870
1871 // decode the beacon frame
1872 vMgrDecodeBeacon(&sFrame);
1873
1874 if ((sFrame.pwBeaconInterval == 0) ||
1875 (sFrame.pwCapInfo == 0) ||
1876 (sFrame.pSSID == 0) ||
1877 (sFrame.pSuppRates == 0) ) {
1878 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Rx beacon frame error\n");
1879 return;
1880 };
1881
1882
1883 if( byCurrChannel > CB_MAX_CHANNEL_24G )
1884 {
1885 if (sFrame.pDSParms != NULL) {
1886 if (byCurrChannel == RFaby11aChannelIndex[sFrame.pDSParms->byCurrChannel-1])
1887 bChannelHit = TRUE;
1888 byCurrChannel = RFaby11aChannelIndex[sFrame.pDSParms->byCurrChannel-1];
1889 } else {
1890 bChannelHit = TRUE;
1891 }
1892
1893 } else {
1894 if (sFrame.pDSParms != NULL) {
1895 if (byCurrChannel == sFrame.pDSParms->byCurrChannel)
1896 bChannelHit = TRUE;
1897 byCurrChannel = sFrame.pDSParms->byCurrChannel;
1898 } else {
1899 bChannelHit = TRUE;
1900 }
1901 }
1902
1903//2008-0730-01<Add>by MikeLiu
1904if(ChannelExceedZoneType(pDevice,byCurrChannel)==TRUE)
1905 return;
1906
1907 if (sFrame.pERP != NULL) {
1908 sERP.byERP = sFrame.pERP->byContext;
1909 sERP.bERPExist = TRUE;
1910
1911 } else {
1912 sERP.bERPExist = FALSE;
1913 sERP.byERP = 0;
1914 }
1915
1916 pBSSList = BSSpAddrIsInBSSList((HANDLE)pDevice, sFrame.pHdr->sA3.abyAddr3, sFrame.pSSID);
1917 if (pBSSList == NULL) {
1918 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Beacon/insert: RxChannel = : %d\n", byCurrChannel);
1919 BSSbInsertToBSSList((HANDLE)pDevice,
1920 sFrame.pHdr->sA3.abyAddr3,
1921 *sFrame.pqwTimestamp,
1922 *sFrame.pwBeaconInterval,
1923 *sFrame.pwCapInfo,
1924 byCurrChannel,
1925 sFrame.pSSID,
1926 sFrame.pSuppRates,
1927 sFrame.pExtSuppRates,
1928 &sERP,
1929 sFrame.pRSN,
1930 sFrame.pRSNWPA,
1931 sFrame.pIE_Country,
1932 sFrame.pIE_Quiet,
1933 sFrame.len - WLAN_HDR_ADDR3_LEN,
1934 sFrame.pHdr->sA4.abyAddr4, // payload of beacon
1935 (HANDLE)pRxPacket
1936 );
1937 }
1938 else {
1939// DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"update bcn: RxChannel = : %d\n", byCurrChannel);
1940 BSSbUpdateToBSSList((HANDLE)pDevice,
1941 *sFrame.pqwTimestamp,
1942 *sFrame.pwBeaconInterval,
1943 *sFrame.pwCapInfo,
1944 byCurrChannel,
1945 bChannelHit,
1946 sFrame.pSSID,
1947 sFrame.pSuppRates,
1948 sFrame.pExtSuppRates,
1949 &sERP,
1950 sFrame.pRSN,
1951 sFrame.pRSNWPA,
1952 sFrame.pIE_Country,
1953 sFrame.pIE_Quiet,
1954 pBSSList,
1955 sFrame.len - WLAN_HDR_ADDR3_LEN,
1956 sFrame.pHdr->sA4.abyAddr4, // payload of probresponse
1957 (HANDLE)pRxPacket
1958 );
1959
1960 }
1961
1962 if (bInScan) {
1963 return;
1964 }
1965
1966 if(byCurrChannel == (BYTE)pMgmt->uCurrChannel)
1967 bIsChannelEqual = TRUE;
1968
1969 if (bIsChannelEqual && (pMgmt->eCurrMode == WMAC_MODE_ESS_AP)) {
1970
1971 // if rx beacon without ERP field
1972 if (sERP.bERPExist) {
1973 if (WLAN_GET_ERP_USE_PROTECTION(sERP.byERP)){
1974 pDevice->byERPFlag |= WLAN_SET_ERP_USE_PROTECTION(1);
1975 pDevice->wUseProtectCntDown = USE_PROTECT_PERIOD;
1976 }
1977 }
1978 else {
1979 pDevice->byERPFlag |= WLAN_SET_ERP_USE_PROTECTION(1);
1980 pDevice->wUseProtectCntDown = USE_PROTECT_PERIOD;
1981 }
1982
1983 if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
1984 if(!WLAN_GET_CAP_INFO_SHORTPREAMBLE(*sFrame.pwCapInfo))
1985 pDevice->byERPFlag |= WLAN_SET_ERP_BARKER_MODE(1);
1986 if(!sERP.bERPExist)
1987 pDevice->byERPFlag |= WLAN_SET_ERP_NONERP_PRESENT(1);
1988 }
1989 }
1990
1991 // check if BSSID the same
1992 if (memcmp(sFrame.pHdr->sA3.abyAddr3,
1993 pMgmt->abyCurrBSSID,
1994 WLAN_BSSID_LEN) == 0) {
1995
1996 bIsBSSIDEqual = TRUE;
1997 pDevice->uCurrRSSI = pRxPacket->uRSSI;
1998 pDevice->byCurrSQ = pRxPacket->bySQ;
1999 if (pMgmt->sNodeDBTable[0].uInActiveCount != 0) {
2000 pMgmt->sNodeDBTable[0].uInActiveCount = 0;
2001 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BCN:Wake Count= [%d]\n", pMgmt->wCountToWakeUp);
2002 }
2003 }
2004 // check if SSID the same
2005 if (sFrame.pSSID->len == ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->len) {
2006 if (memcmp(sFrame.pSSID->abySSID,
2007 ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->abySSID,
2008 sFrame.pSSID->len
2009 ) == 0) {
2010 bIsSSIDEqual = TRUE;
2011 };
2012 }
2013
2014 if ((WLAN_GET_CAP_INFO_ESS(*sFrame.pwCapInfo)== TRUE) &&
2015 (bIsBSSIDEqual == TRUE) &&
2016 (bIsSSIDEqual == TRUE) &&
2017 (pMgmt->eCurrMode == WMAC_MODE_ESS_STA) &&
2018 (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
2019 // add state check to prevent reconnect fail since we'll receive Beacon
2020
2021 bIsAPBeacon = TRUE;
2022 if (pBSSList != NULL) {
2023
2024 // Sync ERP field
2025 if ((pBSSList->sERP.bERPExist == TRUE) && (pDevice->byBBType == BB_TYPE_11G)) {
2026 if ((pBSSList->sERP.byERP & WLAN_EID_ERP_USE_PROTECTION) != pDevice->bProtectMode) {//0000 0010
2027 pDevice->bProtectMode = (pBSSList->sERP.byERP & WLAN_EID_ERP_USE_PROTECTION);
2028 if (pDevice->bProtectMode) {
2029 MACvEnableProtectMD(pDevice);
2030 } else {
2031 MACvDisableProtectMD(pDevice);
2032 }
2033 vUpdateIFS(pDevice);
2034 }
2035 if ((pBSSList->sERP.byERP & WLAN_EID_ERP_NONERP_PRESENT) != pDevice->bNonERPPresent) {//0000 0001
2036 pDevice->bNonERPPresent = (pBSSList->sERP.byERP & WLAN_EID_ERP_USE_PROTECTION);
2037 }
2038 if ((pBSSList->sERP.byERP & WLAN_EID_ERP_BARKER_MODE) != pDevice->bBarkerPreambleMd) {//0000 0100
2039 pDevice->bBarkerPreambleMd = (pBSSList->sERP.byERP & WLAN_EID_ERP_BARKER_MODE);
2040 //BarkerPreambleMd has higher priority than shortPreamble bit in Cap
2041 if (pDevice->bBarkerPreambleMd) {
2042 MACvEnableBarkerPreambleMd(pDevice);
2043 } else {
2044 MACvDisableBarkerPreambleMd(pDevice);
2045 }
2046 }
2047 }
2048 // Sync Short Slot Time
2049 if (WLAN_GET_CAP_INFO_SHORTSLOTTIME(pBSSList->wCapInfo) != pDevice->bShortSlotTime) {
2050 BOOL bShortSlotTime;
2051
2052 bShortSlotTime = WLAN_GET_CAP_INFO_SHORTSLOTTIME(pBSSList->wCapInfo);
2053 //DBG_PRN_WLAN05(("Set Short Slot Time: %d\n", pDevice->bShortSlotTime));
2054 //Kyle check if it is OK to set G.
2055 if (pDevice->byBBType == BB_TYPE_11A) {
2056 bShortSlotTime = TRUE;
2057 }
2058 else if (pDevice->byBBType == BB_TYPE_11B) {
2059 bShortSlotTime = FALSE;
2060 }
2061 if (bShortSlotTime != pDevice->bShortSlotTime) {
2062 pDevice->bShortSlotTime = bShortSlotTime;
2063 BBvSetShortSlotTime(pDevice);
2064 vUpdateIFS(pDevice);
2065 }
2066 }
2067
2068 //
2069 // Preamble may change dynamiclly
2070 //
2071 byOldPreambleType = pDevice->byPreambleType;
2072 if (WLAN_GET_CAP_INFO_SHORTPREAMBLE(pBSSList->wCapInfo)) {
2073 pDevice->byPreambleType = pDevice->byShortPreamble;
2074 }
2075 else {
2076 pDevice->byPreambleType = 0;
2077 }
2078 if (pDevice->byPreambleType != byOldPreambleType)
2079 CARDvSetRSPINF(pDevice, (BYTE)pDevice->byBBType);
2080 //
2081 // Basic Rate Set may change dynamiclly
2082 //
2083 if (pBSSList->eNetworkTypeInUse == PHY_TYPE_11B) {
2084 uRateLen = WLAN_RATES_MAXLEN_11B;
2085 }
2086 pMgmt->abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)pBSSList->abySuppRates,
2087 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
2088 uRateLen);
2089 pMgmt->abyCurrExtSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)pBSSList->abyExtSuppRates,
2090 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates,
2091 uRateLen);
2092 RATEvParseMaxRate( (PVOID)pDevice,
2093 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
2094 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates,
2095 TRUE,
2096 &(pMgmt->sNodeDBTable[0].wMaxBasicRate),
2097 &(pMgmt->sNodeDBTable[0].wMaxSuppRate),
2098 &(pMgmt->sNodeDBTable[0].wSuppRate),
2099 &(pMgmt->sNodeDBTable[0].byTopCCKBasicRate),
2100 &(pMgmt->sNodeDBTable[0].byTopOFDMBasicRate)
2101 );
2102
2103 }
2104 }
2105
2106// DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Beacon 2 \n");
2107 // check if CF field exisit
2108 if (WLAN_GET_CAP_INFO_ESS(*sFrame.pwCapInfo)) {
2109 if (sFrame.pCFParms->wCFPDurRemaining > 0) {
2110 // TODO: deal with CFP period to set NAV
2111 };
2112 };
2113
2114 HIDWORD(qwTimestamp) = cpu_to_le32(HIDWORD(*sFrame.pqwTimestamp));
2115 LODWORD(qwTimestamp) = cpu_to_le32(LODWORD(*sFrame.pqwTimestamp));
2116 HIDWORD(qwLocalTSF) = HIDWORD(pRxPacket->qwLocalTSF);
2117 LODWORD(qwLocalTSF) = LODWORD(pRxPacket->qwLocalTSF);
2118
2119 // check if beacon TSF larger or small than our local TSF
2120 if (HIDWORD(qwTimestamp) == HIDWORD(qwLocalTSF)) {
2121 if (LODWORD(qwTimestamp) >= LODWORD(qwLocalTSF)) {
2122 bTSFOffsetPostive = TRUE;
2123 }
2124 else {
2125 bTSFOffsetPostive = FALSE;
2126 }
2127 }
2128 else if (HIDWORD(qwTimestamp) > HIDWORD(qwLocalTSF)) {
2129 bTSFOffsetPostive = TRUE;
2130 }
2131 else if (HIDWORD(qwTimestamp) < HIDWORD(qwLocalTSF)) {
2132 bTSFOffsetPostive = FALSE;
2133 };
2134
2135 if (bTSFOffsetPostive) {
2136 qwTSFOffset = CARDqGetTSFOffset(pRxPacket->byRxRate, (qwTimestamp), (qwLocalTSF));
2137 }
2138 else {
2139 qwTSFOffset = CARDqGetTSFOffset(pRxPacket->byRxRate, (qwLocalTSF), (qwTimestamp));
2140 }
2141
2142 if (HIDWORD(qwTSFOffset) != 0 ||
2143 (LODWORD(qwTSFOffset) > TRIVIAL_SYNC_DIFFERENCE )) {
2144 bTSFLargeDiff = TRUE;
2145 }
2146
2147
2148 // if infra mode
2149 if (bIsAPBeacon == TRUE) {
2150
2151 // Infra mode: Local TSF always follow AP's TSF if Difference huge.
2152 if (bTSFLargeDiff)
2153 bUpdateTSF = TRUE;
2154
2155 if ((pDevice->bEnablePSMode == TRUE) &&(sFrame.pTIM != 0)) {
2156
2157 // deal with DTIM, analysis TIM
2158 pMgmt->bMulticastTIM = WLAN_MGMT_IS_MULTICAST_TIM(sFrame.pTIM->byBitMapCtl) ? TRUE : FALSE ;
2159 pMgmt->byDTIMCount = sFrame.pTIM->byDTIMCount;
2160 pMgmt->byDTIMPeriod = sFrame.pTIM->byDTIMPeriod;
2161 wAIDNumber = pMgmt->wCurrAID & ~(BIT14|BIT15);
2162
2163 // check if AID in TIM field bit on
2164 // wStartIndex = N1
2165 wStartIndex = WLAN_MGMT_GET_TIM_OFFSET(sFrame.pTIM->byBitMapCtl) << 1;
2166 // AIDIndex = N2
2167 wAIDIndex = (wAIDNumber >> 3);
2168 if ((wAIDNumber > 0) && (wAIDIndex >= wStartIndex)) {
2169 uLocateByteIndex = wAIDIndex - wStartIndex;
2170 // len = byDTIMCount + byDTIMPeriod + byDTIMPeriod + byVirtBitMap[0~250]
2171 if (sFrame.pTIM->len >= (uLocateByteIndex + 4)) {
2172 byTIMBitOn = (0x01) << ((wAIDNumber) % 8);
2173 pMgmt->bInTIM = sFrame.pTIM->byVirtBitMap[uLocateByteIndex] & byTIMBitOn ? TRUE : FALSE;
2174 }
2175 else {
2176 pMgmt->bInTIM = FALSE;
2177 };
2178 }
2179 else {
2180 pMgmt->bInTIM = FALSE;
2181 };
2182
2183 if (pMgmt->bInTIM ||
2184 (pMgmt->bMulticastTIM && (pMgmt->byDTIMCount == 0))) {
2185 pMgmt->bInTIMWake = TRUE;
2186 // send out ps-poll packet
2187// DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "BCN:In TIM\n");
2188 if (pMgmt->bInTIM) {
2189 PSvSendPSPOLL((PSDevice)pDevice);
2190// DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "BCN:PS-POLL sent..\n");
2191 };
2192
2193 }
2194 else {
2195 pMgmt->bInTIMWake = FALSE;
2196 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "BCN: Not In TIM..\n");
2197 if (pDevice->bPWBitOn == FALSE) {
2198 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "BCN: Send Null Packet\n");
2199 if (PSbSendNullPacket(pDevice))
2200 pDevice->bPWBitOn = TRUE;
2201 }
2202 if(PSbConsiderPowerDown(pDevice, FALSE, FALSE)) {
2203 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "BCN: Power down now...\n");
2204 };
2205 }
2206
2207 }
2208
2209 }
2210 // if adhoc mode
2211 if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) && !bIsAPBeacon && bIsChannelEqual) {
2212 if (bIsBSSIDEqual) {
2213 // Use sNodeDBTable[0].uInActiveCount as IBSS beacons received count.
2214 if (pMgmt->sNodeDBTable[0].uInActiveCount != 0)
2215 pMgmt->sNodeDBTable[0].uInActiveCount = 0;
2216
2217 // adhoc mode:TSF updated only when beacon larger then local TSF
2218 if (bTSFLargeDiff && bTSFOffsetPostive &&
2219 (pMgmt->eCurrState == WMAC_STATE_JOINTED))
2220 bUpdateTSF = TRUE;
2221
2222 // During dpc, already in spinlocked.
2223 if (BSSbIsSTAInNodeDB(pDevice, sFrame.pHdr->sA3.abyAddr2, &uNodeIndex)) {
2224
2225 // Update the STA, (Techically the Beacons of all the IBSS nodes
2226 // should be identical, but that's not happening in practice.
2227 pMgmt->abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pSuppRates,
2228 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
2229 WLAN_RATES_MAXLEN_11B);
2230 RATEvParseMaxRate( (PVOID)pDevice,
2231 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
2232 NULL,
2233 TRUE,
2234 &(pMgmt->sNodeDBTable[uNodeIndex].wMaxBasicRate),
2235 &(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate),
2236 &(pMgmt->sNodeDBTable[uNodeIndex].wSuppRate),
2237 &(pMgmt->sNodeDBTable[uNodeIndex].byTopCCKBasicRate),
2238 &(pMgmt->sNodeDBTable[uNodeIndex].byTopOFDMBasicRate)
2239 );
2240 pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble = WLAN_GET_CAP_INFO_SHORTPREAMBLE(*sFrame.pwCapInfo);
2241 pMgmt->sNodeDBTable[uNodeIndex].bShortSlotTime = WLAN_GET_CAP_INFO_SHORTSLOTTIME(*sFrame.pwCapInfo);
2242 pMgmt->sNodeDBTable[uNodeIndex].uInActiveCount = 0;
2243 }
2244 else {
2245 // Todo, initial Node content
2246 BSSvCreateOneNode((PSDevice)pDevice, &uNodeIndex);
2247
2248 pMgmt->abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pSuppRates,
2249 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
2250 WLAN_RATES_MAXLEN_11B);
2251 RATEvParseMaxRate( (PVOID)pDevice,
2252 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
2253 NULL,
2254 TRUE,
2255 &(pMgmt->sNodeDBTable[uNodeIndex].wMaxBasicRate),
2256 &(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate),
2257 &(pMgmt->sNodeDBTable[uNodeIndex].wSuppRate),
2258 &(pMgmt->sNodeDBTable[uNodeIndex].byTopCCKBasicRate),
2259 &(pMgmt->sNodeDBTable[uNodeIndex].byTopOFDMBasicRate)
2260 );
2261
2262 memcpy(pMgmt->sNodeDBTable[uNodeIndex].abyMACAddr, sFrame.pHdr->sA3.abyAddr2, WLAN_ADDR_LEN);
2263 pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble = WLAN_GET_CAP_INFO_SHORTPREAMBLE(*sFrame.pwCapInfo);
2264 pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate = pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate;
2265/*
2266 pMgmt->sNodeDBTable[uNodeIndex].bShortSlotTime = WLAN_GET_CAP_INFO_SHORTSLOTTIME(*sFrame.pwCapInfo);
2267 if(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate > RATE_11M)
2268 pMgmt->sNodeDBTable[uNodeIndex].bERPExist = TRUE;
2269*/
2270 }
2271
2272 // if other stations jointed, indicate connect to upper layer..
2273 if (pMgmt->eCurrState == WMAC_STATE_STARTED) {
2274 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Current IBSS State: [Started]........to: [Jointed] \n");
2275 pMgmt->eCurrState = WMAC_STATE_JOINTED;
2276 pDevice->bLinkPass = TRUE;
2277 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_INTER);
2278 if (netif_queue_stopped(pDevice->dev)){
2279 netif_wake_queue(pDevice->dev);
2280 }
2281 pMgmt->sNodeDBTable[0].bActive = TRUE;
2282 pMgmt->sNodeDBTable[0].uInActiveCount = 0;
2283
2284 };
2285 }
2286 else if (bIsSSIDEqual) {
2287
2288 // See other adhoc sta with the same SSID but BSSID is different.
2289 // adpot this vars only when TSF larger then us.
2290 if (bTSFLargeDiff && bTSFOffsetPostive) {
2291 // we don't support ATIM under adhoc mode
2292 // if ( sFrame.pIBSSParms->wATIMWindow == 0) {
2293 // adpot this vars
2294 // TODO: check sFrame cap if privacy on, and support rate syn
2295 memcpy(pMgmt->abyCurrBSSID, sFrame.pHdr->sA3.abyAddr3, WLAN_BSSID_LEN);
2296 memcpy(pDevice->abyBSSID, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
2297 pMgmt->wCurrATIMWindow = cpu_to_le16(sFrame.pIBSSParms->wATIMWindow);
2298 pMgmt->wCurrBeaconPeriod = cpu_to_le16(*sFrame.pwBeaconInterval);
2299 pMgmt->abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pSuppRates,
2300 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
2301 WLAN_RATES_MAXLEN_11B);
2302 // set HW beacon interval and re-synchronizing....
2303 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Rejoining to Other Adhoc group with same SSID........\n");
2304
2305 MACvWriteBeaconInterval(pDevice, pMgmt->wCurrBeaconPeriod);
2306 CARDvAdjustTSF(pDevice, pRxPacket->byRxRate, qwTimestamp, pRxPacket->qwLocalTSF);
2307 CARDvUpdateNextTBTT(pDevice, qwTimestamp, pMgmt->wCurrBeaconPeriod);
2308
2309 // Turn off bssid filter to avoid filter others adhoc station which bssid is different.
2310 MACvWriteBSSIDAddress(pDevice, pMgmt->abyCurrBSSID);
2311
2312 byOldPreambleType = pDevice->byPreambleType;
2313 if (WLAN_GET_CAP_INFO_SHORTPREAMBLE(*sFrame.pwCapInfo)) {
2314 pDevice->byPreambleType = pDevice->byShortPreamble;
2315 }
2316 else {
2317 pDevice->byPreambleType = 0;
2318 }
2319 if (pDevice->byPreambleType != byOldPreambleType)
2320 CARDvSetRSPINF(pDevice, (BYTE)pDevice->byBBType);
2321
2322
2323 // MACvRegBitsOff(pDevice->PortOffset, MAC_REG_RCR, RCR_BSSID);
2324 // set highest basic rate
2325 // s_vSetHighestBasicRate(pDevice, (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates);
2326 // Prepare beacon frame
2327 bMgrPrepareBeaconToSend((HANDLE)pDevice, pMgmt);
2328 // }
2329 };
2330 }
2331 };
2332 // endian issue ???
2333 // Update TSF
2334 if (bUpdateTSF) {
2335 CARDbGetCurrentTSF(pDevice, &qwCurrTSF);
2336 CARDvAdjustTSF(pDevice, pRxPacket->byRxRate, qwTimestamp , pRxPacket->qwLocalTSF);
2337 CARDbGetCurrentTSF(pDevice, &qwCurrTSF);
2338 CARDvUpdateNextTBTT(pDevice, qwTimestamp, pMgmt->wCurrBeaconPeriod);
2339 }
2340
2341 return;
2342}
2343
2344
2345
2346/*+
2347 *
2348 * Routine Description:
2349 * Instructs the hw to create a bss using the supplied
2350 * attributes. Note that this implementation only supports Ad-Hoc
2351 * BSS creation.
2352 *
2353 *
2354 * Return Value:
2355 * CMD_STATUS
2356 *
2357-*/
2358VOID
2359vMgrCreateOwnIBSS(
2360 IN HANDLE hDeviceContext,
2361 OUT PCMD_STATUS pStatus
2362 )
2363{
2364 PSDevice pDevice = (PSDevice)hDeviceContext;
2365 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
2366 WORD wMaxBasicRate;
2367 WORD wMaxSuppRate;
2368 BYTE byTopCCKBasicRate;
2369 BYTE byTopOFDMBasicRate;
2370 QWORD qwCurrTSF;
2371 UINT ii;
2372 BYTE abyRATE[] = {0x82, 0x84, 0x8B, 0x96, 0x24, 0x30, 0x48, 0x6C, 0x0C, 0x12, 0x18, 0x60};
2373 BYTE abyCCK_RATE[] = {0x82, 0x84, 0x8B, 0x96};
2374 BYTE abyOFDM_RATE[] = {0x0C, 0x12, 0x18, 0x24, 0x30, 0x48, 0x60, 0x6C};
2375 WORD wSuppRate;
2376
2377
2378
2379 HIDWORD(qwCurrTSF) = 0;
2380 LODWORD(qwCurrTSF) = 0;
2381
2382 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Create Basic Service Set .......\n");
2383
2384 if (pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA) {
2385 if ((pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) &&
2386 (pDevice->eEncryptionStatus != Ndis802_11Encryption2Enabled) &&
2387 (pDevice->eEncryptionStatus != Ndis802_11Encryption3Enabled)) {
2388 // encryption mode error
2389 *pStatus = CMD_STATUS_FAILURE;
2390 return;
2391 }
2392 }
2393
2394 pMgmt->abyCurrSuppRates[0] = WLAN_EID_SUPP_RATES;
2395 pMgmt->abyCurrExtSuppRates[0] = WLAN_EID_EXTSUPP_RATES;
2396
2397 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
2398 pMgmt->eCurrentPHYMode = pMgmt->byAPBBType;
2399 } else {
2400 if (pDevice->byBBType == BB_TYPE_11G)
2401 pMgmt->eCurrentPHYMode = PHY_TYPE_11G;
2402 if (pDevice->byBBType == BB_TYPE_11B)
2403 pMgmt->eCurrentPHYMode = PHY_TYPE_11B;
2404 if (pDevice->byBBType == BB_TYPE_11A)
2405 pMgmt->eCurrentPHYMode = PHY_TYPE_11A;
2406 }
2407
2408 if (pMgmt->eCurrentPHYMode != PHY_TYPE_11A) {
2409 pMgmt->abyCurrSuppRates[1] = WLAN_RATES_MAXLEN_11B;
2410 pMgmt->abyCurrExtSuppRates[1] = 0;
2411 for (ii = 0; ii < 4; ii++)
2412 pMgmt->abyCurrSuppRates[2+ii] = abyRATE[ii];
2413 } else {
2414 pMgmt->abyCurrSuppRates[1] = 8;
2415 pMgmt->abyCurrExtSuppRates[1] = 0;
2416 for (ii = 0; ii < 8; ii++)
2417 pMgmt->abyCurrSuppRates[2+ii] = abyRATE[ii];
2418 }
2419
2420
2421 if (pMgmt->eCurrentPHYMode == PHY_TYPE_11G) {
2422 pMgmt->abyCurrSuppRates[1] = 8;
2423 pMgmt->abyCurrExtSuppRates[1] = 4;
2424 for (ii = 0; ii < 4; ii++)
2425 pMgmt->abyCurrSuppRates[2+ii] = abyCCK_RATE[ii];
2426 for (ii = 4; ii < 8; ii++)
2427 pMgmt->abyCurrSuppRates[2+ii] = abyOFDM_RATE[ii-4];
2428 for (ii = 0; ii < 4; ii++)
2429 pMgmt->abyCurrExtSuppRates[2+ii] = abyOFDM_RATE[ii+4];
2430 }
2431
2432
2433 // Disable Protect Mode
2434 pDevice->bProtectMode = 0;
2435 MACvDisableProtectMD(pDevice);
2436
2437 pDevice->bBarkerPreambleMd = 0;
2438 MACvDisableBarkerPreambleMd(pDevice);
2439
2440 // Kyle Test 2003.11.04
2441
2442 // set HW beacon interval
2443 if (pMgmt->wIBSSBeaconPeriod == 0)
2444 pMgmt->wIBSSBeaconPeriod = DEFAULT_IBSS_BI;
2445 MACvWriteBeaconInterval(pDevice, pMgmt->wIBSSBeaconPeriod);
2446
2447 CARDbGetCurrentTSF(pDevice, &qwCurrTSF);
2448 // clear TSF counter
2449 CARDbClearCurrentTSF(pDevice);
2450
2451 // enable TSF counter
2452 MACvRegBitsOn(pDevice,MAC_REG_TFTCTL,TFTCTL_TSFCNTREN);
2453 // set Next TBTT
2454 CARDvSetFirstNextTBTT(pDevice, pMgmt->wIBSSBeaconPeriod);
2455
2456 pMgmt->uIBSSChannel = pDevice->uChannel;
2457
2458 if (pMgmt->uIBSSChannel == 0)
2459 pMgmt->uIBSSChannel = DEFAULT_IBSS_CHANNEL;
2460
2461 // set channel and clear NAV
2462 CARDbSetMediaChannel(pDevice, pMgmt->uIBSSChannel);
2463 pMgmt->uCurrChannel = pMgmt->uIBSSChannel;
2464
2465 pDevice->byPreambleType = pDevice->byShortPreamble;
2466
2467 // set basic rate
2468
2469 RATEvParseMaxRate((PVOID)pDevice, (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
2470 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates, TRUE,
2471 &wMaxBasicRate, &wMaxSuppRate, &wSuppRate,
2472 &byTopCCKBasicRate, &byTopOFDMBasicRate);
2473
2474
2475
2476 if (pDevice->byBBType == BB_TYPE_11A) {
2477 pDevice->bShortSlotTime = TRUE;
2478 } else {
2479 pDevice->bShortSlotTime = FALSE;
2480 }
2481 BBvSetShortSlotTime(pDevice);
2482 // vUpdateIFS() use pDevice->bShortSlotTime as parameter so it must be called
2483 // after setting ShortSlotTime.
2484 // CARDvSetBSSMode call vUpdateIFS()
2485 CARDvSetBSSMode(pDevice);
2486
2487 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
2488 MACvRegBitsOn(pDevice, MAC_REG_HOSTCR, HOSTCR_AP);
2489 pMgmt->eCurrMode = WMAC_MODE_ESS_AP;
2490 }
2491
2492 if (pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA) {
2493 MACvRegBitsOn(pDevice, MAC_REG_HOSTCR, HOSTCR_ADHOC);
2494 pMgmt->eCurrMode = WMAC_MODE_IBSS_STA;
2495 }
2496
2497 // Adopt pre-configured IBSS vars to current vars
2498 pMgmt->eCurrState = WMAC_STATE_STARTED;
2499 pMgmt->wCurrBeaconPeriod = pMgmt->wIBSSBeaconPeriod;
2500 pMgmt->uCurrChannel = pMgmt->uIBSSChannel;
2501 pMgmt->wCurrATIMWindow = pMgmt->wIBSSATIMWindow;
2502 pDevice->uCurrRSSI = 0;
2503 pDevice->byCurrSQ = 0;
2504
2505//20080131-04,<Add> by Mike Liu
2506#ifdef Adhoc_STA
2507 memcpy(pMgmt->abyDesireSSID,pMgmt->abyAdHocSSID,
2508 ((PWLAN_IE_SSID)pMgmt->abyAdHocSSID)->len + WLAN_IEHDR_LEN);
2509#endif
2510
2511 memset(pMgmt->abyCurrSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
2512 memcpy(pMgmt->abyCurrSSID,
2513 pMgmt->abyDesireSSID,
2514 ((PWLAN_IE_SSID)pMgmt->abyDesireSSID)->len + WLAN_IEHDR_LEN
2515 );
2516
2517 if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
2518 // AP mode BSSID = MAC addr
2519 memcpy(pMgmt->abyCurrBSSID, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
2520 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO"AP beacon created BSSID:%02x-%02x-%02x-%02x-%02x-%02x \n",
2521 pMgmt->abyCurrBSSID[0],
2522 pMgmt->abyCurrBSSID[1],
2523 pMgmt->abyCurrBSSID[2],
2524 pMgmt->abyCurrBSSID[3],
2525 pMgmt->abyCurrBSSID[4],
2526 pMgmt->abyCurrBSSID[5]
2527 );
2528 }
2529
2530 if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
2531
2532 // BSSID selected must be randomized as spec 11.1.3
2533 pMgmt->abyCurrBSSID[5] = (BYTE) (LODWORD(qwCurrTSF)& 0x000000ff);
2534 pMgmt->abyCurrBSSID[4] = (BYTE)((LODWORD(qwCurrTSF)& 0x0000ff00) >> 8);
2535 pMgmt->abyCurrBSSID[3] = (BYTE)((LODWORD(qwCurrTSF)& 0x00ff0000) >> 16);
2536 pMgmt->abyCurrBSSID[2] = (BYTE)((LODWORD(qwCurrTSF)& 0x00000ff0) >> 4);
2537 pMgmt->abyCurrBSSID[1] = (BYTE)((LODWORD(qwCurrTSF)& 0x000ff000) >> 12);
2538 pMgmt->abyCurrBSSID[0] = (BYTE)((LODWORD(qwCurrTSF)& 0x0ff00000) >> 20);
2539 pMgmt->abyCurrBSSID[5] ^= pMgmt->abyMACAddr[0];
2540 pMgmt->abyCurrBSSID[4] ^= pMgmt->abyMACAddr[1];
2541 pMgmt->abyCurrBSSID[3] ^= pMgmt->abyMACAddr[2];
2542 pMgmt->abyCurrBSSID[2] ^= pMgmt->abyMACAddr[3];
2543 pMgmt->abyCurrBSSID[1] ^= pMgmt->abyMACAddr[4];
2544 pMgmt->abyCurrBSSID[0] ^= pMgmt->abyMACAddr[5];
2545 pMgmt->abyCurrBSSID[0] &= ~IEEE_ADDR_GROUP;
2546 pMgmt->abyCurrBSSID[0] |= IEEE_ADDR_UNIVERSAL;
2547
2548
2549 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO"Adhoc beacon created bssid:%02x-%02x-%02x-%02x-%02x-%02x \n",
2550 pMgmt->abyCurrBSSID[0],
2551 pMgmt->abyCurrBSSID[1],
2552 pMgmt->abyCurrBSSID[2],
2553 pMgmt->abyCurrBSSID[3],
2554 pMgmt->abyCurrBSSID[4],
2555 pMgmt->abyCurrBSSID[5]
2556 );
2557 }
2558
2559 // set BSSID filter
2560 MACvWriteBSSIDAddress(pDevice, pMgmt->abyCurrBSSID);
2561 memcpy(pDevice->abyBSSID, pMgmt->abyCurrBSSID, WLAN_ADDR_LEN);
2562
2563 MACvRegBitsOn(pDevice, MAC_REG_RCR, RCR_BSSID);
2564 pDevice->byRxMode |= RCR_BSSID;
2565 pMgmt->bCurrBSSIDFilterOn = TRUE;
2566
2567 // Set Capability Info
2568 pMgmt->wCurrCapInfo = 0;
2569
2570 if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
2571 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_ESS(1);
2572 pMgmt->byDTIMPeriod = DEFAULT_DTIM_PERIOD;
2573 pMgmt->byDTIMCount = pMgmt->byDTIMPeriod - 1;
2574 pDevice->eOPMode = OP_MODE_AP;
2575 }
2576
2577 if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
2578 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_IBSS(1);
2579 pDevice->eOPMode = OP_MODE_ADHOC;
2580 }
2581
2582 if (pDevice->bEncryptionEnable) {
2583 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_PRIVACY(1);
2584 if (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) {
2585 if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2586 pMgmt->byCSSPK = KEY_CTL_CCMP;
2587 pMgmt->byCSSGK = KEY_CTL_CCMP;
2588 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2589 pMgmt->byCSSPK = KEY_CTL_TKIP;
2590 pMgmt->byCSSGK = KEY_CTL_TKIP;
2591 } else {
2592 pMgmt->byCSSPK = KEY_CTL_NONE;
2593 pMgmt->byCSSGK = KEY_CTL_WEP;
2594 }
2595 } else {
2596 pMgmt->byCSSPK = KEY_CTL_WEP;
2597 pMgmt->byCSSGK = KEY_CTL_WEP;
2598 }
2599 };
2600
2601 pMgmt->byERPContext = 0;
2602
2603 if (pDevice->byPreambleType == 1) {
2604 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1);
2605 } else {
2606 pMgmt->wCurrCapInfo &= (~WLAN_SET_CAP_INFO_SHORTPREAMBLE(1));
2607 }
2608
2609 pMgmt->eCurrState = WMAC_STATE_STARTED;
2610 // Prepare beacon to send
2611 if (bMgrPrepareBeaconToSend((HANDLE)pDevice, pMgmt)) {
2612 *pStatus = CMD_STATUS_SUCCESS;
2613 }
2614 return ;
2615}
2616
2617
2618
2619/*+
2620 *
2621 * Routine Description:
2622 * Instructs wmac to join a bss using the supplied attributes.
2623 * The arguments may the BSSID or SSID and the rest of the
2624 * attributes are obtained from the scan result of known bss list.
2625 *
2626 *
2627 * Return Value:
2628 * None.
2629 *
2630-*/
2631
2632VOID
2633vMgrJoinBSSBegin(
2634 IN HANDLE hDeviceContext,
2635 OUT PCMD_STATUS pStatus
2636 )
2637{
2638
2639 PSDevice pDevice = (PSDevice)hDeviceContext;
2640 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
2641 PKnownBSS pCurr = NULL;
2642 UINT ii, uu;
2643 PWLAN_IE_SUPP_RATES pItemRates = NULL;
2644 PWLAN_IE_SUPP_RATES pItemExtRates = NULL;
2645 PWLAN_IE_SSID pItemSSID;
2646 UINT uRateLen = WLAN_RATES_MAXLEN;
2647 WORD wMaxBasicRate = RATE_1M;
2648 WORD wMaxSuppRate = RATE_1M;
2649 WORD wSuppRate;
2650 BYTE byTopCCKBasicRate = RATE_1M;
2651 BYTE byTopOFDMBasicRate = RATE_1M;
2652 BOOL bShortSlotTime = FALSE;
2653
2654
2655 for (ii = 0; ii < MAX_BSS_NUM; ii++) {
2656 if (pMgmt->sBSSList[ii].bActive == TRUE)
2657 break;
2658 }
2659
2660 if (ii == MAX_BSS_NUM) {
2661 *pStatus = CMD_STATUS_RESOURCES;
2662 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "BSS finding:BSS list is empty.\n");
2663 return;
2664 };
2665
2666 // memset(pMgmt->abyDesireBSSID, 0, WLAN_BSSID_LEN);
2667 // Search known BSS list for prefer BSSID or SSID
2668
2669 pCurr = BSSpSearchBSSList(pDevice,
2670 pMgmt->abyDesireBSSID,
2671 pMgmt->abyDesireSSID,
2672 pDevice->eConfigPHYMode
2673 );
2674
2675 if (pCurr == NULL){
2676 *pStatus = CMD_STATUS_RESOURCES;
2677 pItemSSID = (PWLAN_IE_SSID)pMgmt->abyDesireSSID;
2678 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Scanning [%s] not found, disconnected !\n", pItemSSID->abySSID);
2679 return;
2680 };
2681
2682 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "AP(BSS) finding:Found a AP(BSS)..\n");
2683
2684 if (WLAN_GET_CAP_INFO_ESS(cpu_to_le16(pCurr->wCapInfo))){
2685
2686 if ((pMgmt->eAuthenMode == WMAC_AUTH_WPA)||(pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK)) {
2687/*
2688 if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2689 if (WPA_SearchRSN(0, WPA_TKIP, pCurr) == FALSE) {
2690 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"No match RSN info. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
2691 // encryption mode error
2692 pMgmt->eCurrState = WMAC_STATE_IDLE;
2693 return;
2694 }
2695 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2696 if (WPA_SearchRSN(0, WPA_AESCCMP, pCurr) == FALSE) {
2697 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"No match RSN info. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
2698 // encryption mode error
2699 pMgmt->eCurrState = WMAC_STATE_IDLE;
2700 return;
2701 }
2702 }
2703*/
2704 }
2705
2706#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
2707 //if(pDevice->bWPASuppWextEnabled == TRUE)
2708 Encyption_Rebuild(pDevice, pCurr);
2709#endif
2710
2711 // Infrastructure BSS
2712 s_vMgrSynchBSS(pDevice,
2713 WMAC_MODE_ESS_STA,
2714 pCurr,
2715 pStatus
2716 );
2717
2718 if (*pStatus == CMD_STATUS_SUCCESS){
2719
2720 // Adopt this BSS state vars in Mgmt Object
2721 pMgmt->uCurrChannel = pCurr->uChannel;
2722
2723 memset(pMgmt->abyCurrSuppRates, 0 , WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1);
2724 memset(pMgmt->abyCurrExtSuppRates, 0 , WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1);
2725
2726 if (pCurr->eNetworkTypeInUse == PHY_TYPE_11B) {
2727 uRateLen = WLAN_RATES_MAXLEN_11B;
2728 }
2729
2730 pItemRates = (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates;
2731 pItemExtRates = (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates;
2732
2733 // Parse Support Rate IE
2734 pItemRates->byElementID = WLAN_EID_SUPP_RATES;
2735 pItemRates->len = RATEuSetIE((PWLAN_IE_SUPP_RATES)pCurr->abySuppRates,
2736 pItemRates,
2737 uRateLen);
2738
2739 // Parse Extension Support Rate IE
2740 pItemExtRates->byElementID = WLAN_EID_EXTSUPP_RATES;
2741 pItemExtRates->len = RATEuSetIE((PWLAN_IE_SUPP_RATES)pCurr->abyExtSuppRates,
2742 pItemExtRates,
2743 uRateLen);
2744 // Stuffing Rate IE
2745 if ((pItemExtRates->len > 0) && (pItemRates->len < 8)) {
2746 for (ii = 0; ii < (UINT)(8 - pItemRates->len); ) {
2747 pItemRates->abyRates[pItemRates->len + ii] = pItemExtRates->abyRates[ii];
2748 ii ++;
2749 if (pItemExtRates->len <= ii)
2750 break;
2751 }
2752 pItemRates->len += (BYTE)ii;
2753 if (pItemExtRates->len - ii > 0) {
2754 pItemExtRates->len -= (BYTE)ii;
2755 for (uu = 0; uu < pItemExtRates->len; uu ++) {
2756 pItemExtRates->abyRates[uu] = pItemExtRates->abyRates[uu + ii];
2757 }
2758 } else {
2759 pItemExtRates->len = 0;
2760 }
2761 }
2762
2763 RATEvParseMaxRate((PVOID)pDevice, pItemRates, pItemExtRates, TRUE,
2764 &wMaxBasicRate, &wMaxSuppRate, &wSuppRate,
2765 &byTopCCKBasicRate, &byTopOFDMBasicRate);
2766 vUpdateIFS(pDevice);
2767 // TODO: deal with if wCapInfo the privacy is on, but station WEP is off
2768 // TODO: deal with if wCapInfo the PS-Pollable is on.
2769 pMgmt->wCurrBeaconPeriod = pCurr->wBeaconInterval;
2770 memset(pMgmt->abyCurrSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
2771 memcpy(pMgmt->abyCurrBSSID, pCurr->abyBSSID, WLAN_BSSID_LEN);
2772 memcpy(pMgmt->abyCurrSSID, pCurr->abySSID, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
2773
2774 pMgmt->eCurrMode = WMAC_MODE_ESS_STA;
2775
2776 pMgmt->eCurrState = WMAC_STATE_JOINTED;
2777 // Adopt BSS state in Adapter Device Object
2778 pDevice->eOPMode = OP_MODE_INFRASTRUCTURE;
2779 memcpy(pDevice->abyBSSID, pCurr->abyBSSID, WLAN_BSSID_LEN);
2780
2781 // Add current BSS to Candidate list
2782 // This should only works for WPA2 BSS, and WPA2 BSS check must be done before.
2783 if (pMgmt->eAuthenMode == WMAC_AUTH_WPA2) {
2784 BOOL bResult = bAdd_PMKID_Candidate((HANDLE)pDevice, pMgmt->abyCurrBSSID, &pCurr->sRSNCapObj);
2785 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"bAdd_PMKID_Candidate: 1(%d)\n", bResult);
2786 if (bResult == FALSE) {
2787 vFlush_PMKID_Candidate((HANDLE)pDevice);
2788 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"vFlush_PMKID_Candidate: 4\n");
2789 bAdd_PMKID_Candidate((HANDLE)pDevice, pMgmt->abyCurrBSSID, &pCurr->sRSNCapObj);
2790 }
2791 }
2792
2793 // Preamble type auto-switch: if AP can receive short-preamble cap,
2794 // we can turn on too.
2795 if (WLAN_GET_CAP_INFO_SHORTPREAMBLE(pCurr->wCapInfo)) {
2796 pDevice->byPreambleType = pDevice->byShortPreamble;
2797 }
2798 else {
2799 pDevice->byPreambleType = 0;
2800 }
2801 // Change PreambleType must set RSPINF again
2802 CARDvSetRSPINF(pDevice, (BYTE)pDevice->byBBType);
2803
2804 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Join ESS\n");
2805
2806 if (pCurr->eNetworkTypeInUse == PHY_TYPE_11G) {
2807
2808 if ((pCurr->sERP.byERP & WLAN_EID_ERP_USE_PROTECTION) != pDevice->bProtectMode) {//0000 0010
2809 pDevice->bProtectMode = (pCurr->sERP.byERP & WLAN_EID_ERP_USE_PROTECTION);
2810 if (pDevice->bProtectMode) {
2811 MACvEnableProtectMD(pDevice);
2812 } else {
2813 MACvDisableProtectMD(pDevice);
2814 }
2815 vUpdateIFS(pDevice);
2816 }
2817 if ((pCurr->sERP.byERP & WLAN_EID_ERP_NONERP_PRESENT) != pDevice->bNonERPPresent) {//0000 0001
2818 pDevice->bNonERPPresent = (pCurr->sERP.byERP & WLAN_EID_ERP_USE_PROTECTION);
2819 }
2820 if ((pCurr->sERP.byERP & WLAN_EID_ERP_BARKER_MODE) != pDevice->bBarkerPreambleMd) {//0000 0100
2821 pDevice->bBarkerPreambleMd = (pCurr->sERP.byERP & WLAN_EID_ERP_BARKER_MODE);
2822 //BarkerPreambleMd has higher priority than shortPreamble bit in Cap
2823 if (pDevice->bBarkerPreambleMd) {
2824 MACvEnableBarkerPreambleMd(pDevice);
2825 } else {
2826 MACvDisableBarkerPreambleMd(pDevice);
2827 }
2828 }
2829 }
2830 //DBG_PRN_WLAN05(("wCapInfo: %X\n", pCurr->wCapInfo));
2831 if (WLAN_GET_CAP_INFO_SHORTSLOTTIME(pCurr->wCapInfo) != pDevice->bShortSlotTime) {
2832 if (pDevice->byBBType == BB_TYPE_11A) {
2833 bShortSlotTime = TRUE;
2834 }
2835 else if (pDevice->byBBType == BB_TYPE_11B) {
2836 bShortSlotTime = FALSE;
2837 }
2838 else {
2839 bShortSlotTime = WLAN_GET_CAP_INFO_SHORTSLOTTIME(pCurr->wCapInfo);
2840 }
2841 //DBG_PRN_WLAN05(("Set Short Slot Time: %d\n", pDevice->bShortSlotTime));
2842 if (bShortSlotTime != pDevice->bShortSlotTime) {
2843 pDevice->bShortSlotTime = bShortSlotTime;
2844 BBvSetShortSlotTime(pDevice);
2845 vUpdateIFS(pDevice);
2846 }
2847 }
2848
2849 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"End of Join AP -- A/B/G Action\n");
2850 }
2851 else {
2852 pMgmt->eCurrState = WMAC_STATE_IDLE;
2853 };
2854
2855
2856 }
2857 else {
2858 // ad-hoc mode BSS
2859 if (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) {
2860
2861 if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2862/*
2863 if (WPA_SearchRSN(0, WPA_TKIP, pCurr) == FALSE) {
2864 // encryption mode error
2865 pMgmt->eCurrState = WMAC_STATE_IDLE;
2866 return;
2867 }
2868*/
2869 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2870/*
2871 if (WPA_SearchRSN(0, WPA_AESCCMP, pCurr) == FALSE) {
2872 // encryption mode error
2873 pMgmt->eCurrState = WMAC_STATE_IDLE;
2874 return;
2875 }
2876*/
2877 } else {
2878 // encryption mode error
2879 pMgmt->eCurrState = WMAC_STATE_IDLE;
2880 return;
2881 }
2882 }
2883
2884 s_vMgrSynchBSS(pDevice,
2885 WMAC_MODE_IBSS_STA,
2886 pCurr,
2887 pStatus
2888 );
2889
2890 if (*pStatus == CMD_STATUS_SUCCESS){
2891 // Adopt this BSS state vars in Mgmt Object
2892 // TODO: check if CapInfo privacy on, but we don't..
2893 pMgmt->uCurrChannel = pCurr->uChannel;
2894
2895
2896 // Parse Support Rate IE
2897 pMgmt->abyCurrSuppRates[0] = WLAN_EID_SUPP_RATES;
2898 pMgmt->abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)pCurr->abySuppRates,
2899 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
2900 WLAN_RATES_MAXLEN_11B);
2901 // set basic rate
2902 RATEvParseMaxRate((PVOID)pDevice, (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
2903 NULL, TRUE, &wMaxBasicRate, &wMaxSuppRate, &wSuppRate,
2904 &byTopCCKBasicRate, &byTopOFDMBasicRate);
2905 vUpdateIFS(pDevice);
2906 pMgmt->wCurrCapInfo = pCurr->wCapInfo;
2907 pMgmt->wCurrBeaconPeriod = pCurr->wBeaconInterval;
2908 memset(pMgmt->abyCurrSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN);
2909 memcpy(pMgmt->abyCurrBSSID, pCurr->abyBSSID, WLAN_BSSID_LEN);
2910 memcpy(pMgmt->abyCurrSSID, pCurr->abySSID, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN);
2911// pMgmt->wCurrATIMWindow = pCurr->wATIMWindow;
2912 pMgmt->eCurrMode = WMAC_MODE_IBSS_STA;
2913 pMgmt->eCurrState = WMAC_STATE_STARTED;
2914 // Adopt BSS state in Adapter Device Object
2915 pDevice->eOPMode = OP_MODE_ADHOC;
2916 pDevice->bLinkPass = TRUE;
2917 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_INTER);
2918 memcpy(pDevice->abyBSSID, pCurr->abyBSSID, WLAN_BSSID_LEN);
2919
2920 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Join IBSS ok:%02x-%02x-%02x-%02x-%02x-%02x \n",
2921 pMgmt->abyCurrBSSID[0],
2922 pMgmt->abyCurrBSSID[1],
2923 pMgmt->abyCurrBSSID[2],
2924 pMgmt->abyCurrBSSID[3],
2925 pMgmt->abyCurrBSSID[4],
2926 pMgmt->abyCurrBSSID[5]
2927 );
2928 // Preamble type auto-switch: if AP can receive short-preamble cap,
2929 // and if registry setting is short preamble we can turn on too.
2930
2931 if (WLAN_GET_CAP_INFO_SHORTPREAMBLE(pCurr->wCapInfo)) {
2932 pDevice->byPreambleType = pDevice->byShortPreamble;
2933 }
2934 else {
2935 pDevice->byPreambleType = 0;
2936 }
2937 // Change PreambleType must set RSPINF again
2938 CARDvSetRSPINF(pDevice, (BYTE)pDevice->byBBType);
2939
2940 // Prepare beacon
2941 bMgrPrepareBeaconToSend((HANDLE)pDevice, pMgmt);
2942 }
2943 else {
2944 pMgmt->eCurrState = WMAC_STATE_IDLE;
2945 };
2946 };
2947 return;
2948}
2949
2950
2951
2952/*+
2953 *
2954 * Routine Description:
2955 * Set HW to synchronize a specific BSS from known BSS list.
2956 *
2957 *
2958 * Return Value:
2959 * PCM_STATUS
2960 *
2961-*/
2962static
2963VOID
2964s_vMgrSynchBSS (
2965 IN PSDevice pDevice,
2966 IN UINT uBSSMode,
2967 IN PKnownBSS pCurr,
2968 OUT PCMD_STATUS pStatus
2969 )
2970{
2971 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
2972 //1M, 2M, 5M, 11M, 18M, 24M, 36M, 54M
2973 BYTE abyCurrSuppRatesG[] = {WLAN_EID_SUPP_RATES, 8, 0x02, 0x04, 0x0B, 0x16, 0x24, 0x30, 0x48, 0x6C};
2974 BYTE abyCurrExtSuppRatesG[] = {WLAN_EID_EXTSUPP_RATES, 4, 0x0C, 0x12, 0x18, 0x60};
2975 //6M, 9M, 12M, 48M
2976 BYTE abyCurrSuppRatesA[] = {WLAN_EID_SUPP_RATES, 8, 0x0C, 0x12, 0x18, 0x24, 0x30, 0x48, 0x60, 0x6C};
2977 BYTE abyCurrSuppRatesB[] = {WLAN_EID_SUPP_RATES, 4, 0x02, 0x04, 0x0B, 0x16};
2978
2979
2980 *pStatus = CMD_STATUS_FAILURE;
2981
2982 if (s_bCipherMatch(pCurr,
2983 pDevice->eEncryptionStatus,
2984 &(pMgmt->byCSSPK),
2985 &(pMgmt->byCSSGK)) == FALSE) {
2986 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "s_bCipherMatch Fail .......\n");
2987 return;
2988 }
2989
2990 pMgmt->pCurrBSS = pCurr;
2991
2992 // if previous mode is IBSS.
2993 if(pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
2994 MACvRegBitsOff(pDevice, MAC_REG_TCR, TCR_AUTOBCNTX);
2995 }
2996
2997 // Init the BSS informations
2998 pDevice->bCCK = TRUE;
2999 pDevice->bProtectMode = FALSE;
3000 MACvDisableProtectMD(pDevice);
3001 pDevice->bBarkerPreambleMd = FALSE;
3002 MACvDisableBarkerPreambleMd(pDevice);
3003 pDevice->bNonERPPresent = FALSE;
3004 pDevice->byPreambleType = 0;
3005 pDevice->wBasicRate = 0;
3006 // Set Basic Rate
3007 CARDbAddBasicRate((PVOID)pDevice, RATE_1M);
3008
3009 // calculate TSF offset
3010 // TSF Offset = Received Timestamp TSF - Marked Local's TSF
3011 CARDvAdjustTSF(pDevice, pCurr->byRxRate, pCurr->qwBSSTimestamp, pCurr->qwLocalTSF);
3012
3013 // set HW beacon interval
3014 MACvWriteBeaconInterval(pDevice, pCurr->wBeaconInterval);
3015
3016 // set Next TBTT
3017 // Next TBTT = ((local_current_TSF / beacon_interval) + 1 ) * beacon_interval
3018 CARDvSetFirstNextTBTT(pDevice, pCurr->wBeaconInterval);
3019
3020 // set BSSID
3021 MACvWriteBSSIDAddress(pDevice, pCurr->abyBSSID);
3022
3e362598 3023 memcpy(pMgmt->abyCurrBSSID, pCurr->abyBSSID, 6);
92b96797
FB
3024
3025 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Sync:set CurrBSSID address = %02x-%02x-%02x=%02x-%02x-%02x\n",
3026 pMgmt->abyCurrBSSID[0],
3027 pMgmt->abyCurrBSSID[1],
3028 pMgmt->abyCurrBSSID[2],
3029 pMgmt->abyCurrBSSID[3],
3030 pMgmt->abyCurrBSSID[4],
3031 pMgmt->abyCurrBSSID[5]);
3032
3033 if (pCurr->eNetworkTypeInUse == PHY_TYPE_11A) {
3034 if ((pDevice->eConfigPHYMode == PHY_TYPE_11A) ||
3035 (pDevice->eConfigPHYMode == PHY_TYPE_AUTO)) {
3036 pDevice->byBBType = BB_TYPE_11A;
3037 pMgmt->eCurrentPHYMode = PHY_TYPE_11A;
3038 pDevice->bShortSlotTime = TRUE;
3039 BBvSetShortSlotTime(pDevice);
3040 CARDvSetBSSMode(pDevice);
3041 } else {
3042 return;
3043 }
3044 } else if (pCurr->eNetworkTypeInUse == PHY_TYPE_11B) {
3045 if ((pDevice->eConfigPHYMode == PHY_TYPE_11B) ||
3046 (pDevice->eConfigPHYMode == PHY_TYPE_11G) ||
3047 (pDevice->eConfigPHYMode == PHY_TYPE_AUTO)) {
3048 pDevice->byBBType = BB_TYPE_11B;
3049 pMgmt->eCurrentPHYMode = PHY_TYPE_11B;
3050 pDevice->bShortSlotTime = FALSE;
3051 BBvSetShortSlotTime(pDevice);
3052 CARDvSetBSSMode(pDevice);
3053 } else {
3054 return;
3055 }
3056 } else {
3057 if ((pDevice->eConfigPHYMode == PHY_TYPE_11G) ||
3058 (pDevice->eConfigPHYMode == PHY_TYPE_AUTO)) {
3059 pDevice->byBBType = BB_TYPE_11G;
3060 pMgmt->eCurrentPHYMode = PHY_TYPE_11G;
3061 pDevice->bShortSlotTime = TRUE;
3062 BBvSetShortSlotTime(pDevice);
3063 CARDvSetBSSMode(pDevice);
3064 } else if (pDevice->eConfigPHYMode == PHY_TYPE_11B) {
3065 pDevice->byBBType = BB_TYPE_11B;
3066 pDevice->bShortSlotTime = FALSE;
3067 BBvSetShortSlotTime(pDevice);
3068 CARDvSetBSSMode(pDevice);
3069 } else {
3070 return;
3071 }
3072 }
3073
3074 if (uBSSMode == WMAC_MODE_ESS_STA) {
3075 MACvRegBitsOff(pDevice, MAC_REG_HOSTCR, HOSTCR_ADHOC);
3076 MACvRegBitsOn(pDevice, MAC_REG_RCR, RCR_BSSID);
3077 pDevice->byRxMode |= RCR_BSSID;
3078 pMgmt->bCurrBSSIDFilterOn = TRUE;
3079 }
3080
3081 // set channel and clear NAV
3082 CARDbSetMediaChannel(pDevice, pCurr->uChannel);
3083 pMgmt->uCurrChannel = pCurr->uChannel;
3084 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "<----s_bSynchBSS Set Channel [%d]\n", pCurr->uChannel);
3085
3086 if ((pDevice->bUpdateBBVGA) &&
3087 (pDevice->byBBVGACurrent != pDevice->abyBBVGA[0])) {
3088 pDevice->byBBVGACurrent = pDevice->abyBBVGA[0];
3089 BBvSetVGAGainOffset(pDevice, pDevice->byBBVGACurrent);
3090 BBvSetShortSlotTime(pDevice);
3091 }
3092 //
3093 // Notes:
3094 // 1. In Ad-hoc mode : check if received others beacon as jointed indication,
3095 // otherwise we will start own IBSS.
3096 // 2. In Infra mode : Supposed we already synchronized with AP right now.
3097
3098 if (uBSSMode == WMAC_MODE_IBSS_STA) {
3099 MACvRegBitsOn(pDevice, MAC_REG_HOSTCR, HOSTCR_ADHOC);
3100 MACvRegBitsOn(pDevice, MAC_REG_RCR, RCR_BSSID);
3101 pDevice->byRxMode |= RCR_BSSID;
3102 pMgmt->bCurrBSSIDFilterOn = TRUE;
3103 };
3104
3105 if (pDevice->byBBType == BB_TYPE_11A) {
3e362598 3106 memcpy(pMgmt->abyCurrSuppRates, &abyCurrSuppRatesA[0], sizeof(abyCurrSuppRatesA));
92b96797
FB
3107 pMgmt->abyCurrExtSuppRates[1] = 0;
3108 } else if (pDevice->byBBType == BB_TYPE_11B) {
3e362598 3109 memcpy(pMgmt->abyCurrSuppRates, &abyCurrSuppRatesB[0], sizeof(abyCurrSuppRatesB));
92b96797
FB
3110 pMgmt->abyCurrExtSuppRates[1] = 0;
3111 } else {
3e362598
JL
3112 memcpy(pMgmt->abyCurrSuppRates, &abyCurrSuppRatesG[0], sizeof(abyCurrSuppRatesG));
3113 memcpy(pMgmt->abyCurrExtSuppRates, &abyCurrExtSuppRatesG[0], sizeof(abyCurrExtSuppRatesG));
92b96797
FB
3114 }
3115 pMgmt->byERPContext = pCurr->sERP.byERP;
3116
3117 *pStatus = CMD_STATUS_SUCCESS;
3118
3119 return;
3120};
3121
3122
3123//mike add: fix NetworkManager 0.7.0 hidden ssid mode in WPA encryption
3124// ,need reset eAuthenMode and eEncryptionStatus
3125 static VOID Encyption_Rebuild(
3126 IN PSDevice pDevice,
3127 IN PKnownBSS pCurr
3128 )
3129 {
3130 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
3131 // UINT ii , uSameBssidNum=0;
3132
3133 // for (ii = 0; ii < MAX_BSS_NUM; ii++) {
3134 // if (pMgmt->sBSSList[ii].bActive &&
3135 // IS_ETH_ADDRESS_EQUAL(pMgmt->sBSSList[ii].abyBSSID, pCurr->abyBSSID)) {
3136 // uSameBssidNum++;
3137 // }
3138 // }
3139 // if( uSameBssidNum>=2) { //we only check AP in hidden sssid mode
3140 if ((pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK) || //networkmanager 0.7.0 does not give the pairwise-key selsection,
3141 (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK)) { // so we need re-selsect it according to real pairwise-key info.
3142 if(pCurr->bWPAValid == TRUE) { //WPA-PSK
3143 pMgmt->eAuthenMode = WMAC_AUTH_WPAPSK;
3144 if(pCurr->abyPKType[0] == WPA_TKIP) {
3145 pDevice->eEncryptionStatus = Ndis802_11Encryption2Enabled; //TKIP
3146 PRINT_K("Encyption_Rebuild--->ssid reset config to [WPAPSK-TKIP]\n");
3147 }
3148 else if(pCurr->abyPKType[0] == WPA_AESCCMP) {
3149 pDevice->eEncryptionStatus = Ndis802_11Encryption3Enabled; //AES
3150 PRINT_K("Encyption_Rebuild--->ssid reset config to [WPAPSK-AES]\n");
3151 }
3152 }
3153 else if(pCurr->bWPA2Valid == TRUE) { //WPA2-PSK
3154 pMgmt->eAuthenMode = WMAC_AUTH_WPA2PSK;
3155 if(pCurr->abyCSSPK[0] == WLAN_11i_CSS_TKIP) {
3156 pDevice->eEncryptionStatus = Ndis802_11Encryption2Enabled; //TKIP
3157 PRINT_K("Encyption_Rebuild--->ssid reset config to [WPA2PSK-TKIP]\n");
3158 }
3159 else if(pCurr->abyCSSPK[0] == WLAN_11i_CSS_CCMP) {
3160 pDevice->eEncryptionStatus = Ndis802_11Encryption3Enabled; //AES
3161 PRINT_K("Encyption_Rebuild--->ssid reset config to [WPA2PSK-AES]\n");
3162 }
3163 }
3164 }
3165 // }
3166 return;
3167 }
3168
3169
3170/*+
3171 *
3172 * Routine Description:
3173 * Format TIM field
3174 *
3175 *
3176 * Return Value:
3177 * VOID
3178 *
3179-*/
3180
3181static
3182VOID
3183s_vMgrFormatTIM(
3184 IN PSMgmtObject pMgmt,
3185 IN PWLAN_IE_TIM pTIM
3186 )
3187{
3188 BYTE byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
3189 BYTE byMap;
3190 UINT ii, jj;
3191 BOOL bStartFound = FALSE;
3192 BOOL bMulticast = FALSE;
3193 WORD wStartIndex = 0;
3194 WORD wEndIndex = 0;
3195
3196
3197 // Find size of partial virtual bitmap
3198 for (ii = 0; ii < (MAX_NODE_NUM + 1); ii++) {
3199 byMap = pMgmt->abyPSTxMap[ii];
3200 if (!ii) {
3201 // Mask out the broadcast bit which is indicated separately.
3202 bMulticast = (byMap & byMask[0]) != 0;
3203 if(bMulticast) {
3204 pMgmt->sNodeDBTable[0].bRxPSPoll = TRUE;
3205 }
3206 byMap = 0;
3207 }
3208 if (byMap) {
3209 if (!bStartFound) {
3210 bStartFound = TRUE;
3211 wStartIndex = (WORD)ii;
3212 }
3213 wEndIndex = (WORD)ii;
3214 }
3215 };
3216
3217
3218 // Round start index down to nearest even number
3219 wStartIndex &= ~BIT0;
3220
3221 // Round end index up to nearest even number
3222 wEndIndex = ((wEndIndex + 1) & ~BIT0);
3223
3224 // Size of element payload
3225
3226 pTIM->len = 3 + (wEndIndex - wStartIndex) + 1;
3227
3228 // Fill in the Fixed parts of the TIM
3229 pTIM->byDTIMCount = pMgmt->byDTIMCount;
3230 pTIM->byDTIMPeriod = pMgmt->byDTIMPeriod;
3231 pTIM->byBitMapCtl = (bMulticast ? TIM_MULTICAST_MASK : 0) |
3232 (((wStartIndex >> 1) << 1) & TIM_BITMAPOFFSET_MASK);
3233
3234 // Append variable part of TIM
3235
3236 for (ii = wStartIndex, jj =0 ; ii <= wEndIndex; ii++, jj++) {
3237 pTIM->byVirtBitMap[jj] = pMgmt->abyPSTxMap[ii];
3238 }
3239
3240 // Aid = 0 don't used.
3241 pTIM->byVirtBitMap[0] &= ~BIT0;
3242}
3243
3244
3245/*+
3246 *
3247 * Routine Description:
3248 * Constructs an Beacon frame( Ad-hoc mode)
3249 *
3250 *
3251 * Return Value:
3252 * PTR to frame; or NULL on allocation failue
3253 *
3254-*/
3255
3256static
3257PSTxMgmtPacket
3258s_MgrMakeBeacon(
3259 IN PSDevice pDevice,
3260 IN PSMgmtObject pMgmt,
3261 IN WORD wCurrCapInfo,
3262 IN WORD wCurrBeaconPeriod,
3263 IN UINT uCurrChannel,
3264 IN WORD wCurrATIMWinodw,
3265 IN PWLAN_IE_SSID pCurrSSID,
3266 IN PBYTE pCurrBSSID,
3267 IN PWLAN_IE_SUPP_RATES pCurrSuppRates,
3268 IN PWLAN_IE_SUPP_RATES pCurrExtSuppRates
3269 )
3270{
3271 PSTxMgmtPacket pTxPacket = NULL;
3272 WLAN_FR_BEACON sFrame;
3273 BYTE abyBroadcastAddr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
3274
3275
3276 // prepare beacon frame
3277 pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
3278 memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_BEACON_FR_MAXLEN);
3279 pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
3280 // Setup the sFrame structure.
3281 sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
3282 sFrame.len = WLAN_BEACON_FR_MAXLEN;
3283 vMgrEncodeBeacon(&sFrame);
3284 // Setup the header
3285 sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
3286 (
3287 WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
3288 WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_BEACON)
3289 ));
3290
3291 if (pDevice->bEnablePSMode) {
3292 sFrame.pHdr->sA3.wFrameCtl |= cpu_to_le16((WORD)WLAN_SET_FC_PWRMGT(1));
3293 }
3294
3295 memcpy( sFrame.pHdr->sA3.abyAddr1, abyBroadcastAddr, WLAN_ADDR_LEN);
3296 memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
3297 memcpy( sFrame.pHdr->sA3.abyAddr3, pCurrBSSID, WLAN_BSSID_LEN);
3298 *sFrame.pwBeaconInterval = cpu_to_le16(wCurrBeaconPeriod);
3299 *sFrame.pwCapInfo = cpu_to_le16(wCurrCapInfo);
3300 // Copy SSID
3301 sFrame.pSSID = (PWLAN_IE_SSID)(sFrame.pBuf + sFrame.len);
3302 sFrame.len += ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->len + WLAN_IEHDR_LEN;
3303 memcpy(sFrame.pSSID,
3304 pCurrSSID,
3305 ((PWLAN_IE_SSID)pCurrSSID)->len + WLAN_IEHDR_LEN
3306 );
3307 // Copy the rate set
3308 sFrame.pSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
3309 sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN;
3310 memcpy(sFrame.pSuppRates,
3311 pCurrSuppRates,
3312 ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN
3313 );
3314 // DS parameter
3315 if (pDevice->byBBType != BB_TYPE_11A) {
3316 sFrame.pDSParms = (PWLAN_IE_DS_PARMS)(sFrame.pBuf + sFrame.len);
3317 sFrame.len += (1) + WLAN_IEHDR_LEN;
3318 sFrame.pDSParms->byElementID = WLAN_EID_DS_PARMS;
3319 sFrame.pDSParms->len = 1;
3320 sFrame.pDSParms->byCurrChannel = (BYTE)uCurrChannel;
3321 }
3322 // TIM field
3323 if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
3324 sFrame.pTIM = (PWLAN_IE_TIM)(sFrame.pBuf + sFrame.len);
3325 sFrame.pTIM->byElementID = WLAN_EID_TIM;
3326 s_vMgrFormatTIM(pMgmt, sFrame.pTIM);
3327 sFrame.len += (WLAN_IEHDR_LEN + sFrame.pTIM->len);
3328 }
3329
3330 if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
3331
3332 // IBSS parameter
3333 sFrame.pIBSSParms = (PWLAN_IE_IBSS_PARMS)(sFrame.pBuf + sFrame.len);
3334 sFrame.len += (2) + WLAN_IEHDR_LEN;
3335 sFrame.pIBSSParms->byElementID = WLAN_EID_IBSS_PARMS;
3336 sFrame.pIBSSParms->len = 2;
3337 sFrame.pIBSSParms->wATIMWindow = wCurrATIMWinodw;
3338 if (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) {
3339 /* RSN parameter */
3340 sFrame.pRSNWPA = (PWLAN_IE_RSN_EXT)(sFrame.pBuf + sFrame.len);
3341 sFrame.pRSNWPA->byElementID = WLAN_EID_RSN_WPA;
3342 sFrame.pRSNWPA->len = 12;
3343 sFrame.pRSNWPA->abyOUI[0] = 0x00;
3344 sFrame.pRSNWPA->abyOUI[1] = 0x50;
3345 sFrame.pRSNWPA->abyOUI[2] = 0xf2;
3346 sFrame.pRSNWPA->abyOUI[3] = 0x01;
3347 sFrame.pRSNWPA->wVersion = 1;
3348 sFrame.pRSNWPA->abyMulticast[0] = 0x00;
3349 sFrame.pRSNWPA->abyMulticast[1] = 0x50;
3350 sFrame.pRSNWPA->abyMulticast[2] = 0xf2;
3351 if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled)
3352 sFrame.pRSNWPA->abyMulticast[3] = 0x04;//AES
3353 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled)
3354 sFrame.pRSNWPA->abyMulticast[3] = 0x02;//TKIP
3355 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled)
3356 sFrame.pRSNWPA->abyMulticast[3] = 0x01;//WEP40
3357 else
3358 sFrame.pRSNWPA->abyMulticast[3] = 0x00;//NONE
3359
3360 // Pairwise Key Cipher Suite
3361 sFrame.pRSNWPA->wPKCount = 0;
3362 // Auth Key Management Suite
3363 *((PWORD)(sFrame.pBuf + sFrame.len + sFrame.pRSNWPA->len))=0;
3364 sFrame.pRSNWPA->len +=2;
3365
3366 // RSN Capabilites
3367 *((PWORD)(sFrame.pBuf + sFrame.len + sFrame.pRSNWPA->len))=0;
3368 sFrame.pRSNWPA->len +=2;
3369 sFrame.len += sFrame.pRSNWPA->len + WLAN_IEHDR_LEN;
3370 }
3371 }
3372
3373
3374 if (pMgmt->eCurrentPHYMode == PHY_TYPE_11G) {
3375 sFrame.pERP = (PWLAN_IE_ERP)(sFrame.pBuf + sFrame.len);
3376 sFrame.len += 1 + WLAN_IEHDR_LEN;
3377 sFrame.pERP->byElementID = WLAN_EID_ERP;
3378 sFrame.pERP->len = 1;
3379 sFrame.pERP->byContext = 0;
3380 if (pDevice->bProtectMode == TRUE)
3381 sFrame.pERP->byContext |= WLAN_EID_ERP_USE_PROTECTION;
3382 if (pDevice->bNonERPPresent == TRUE)
3383 sFrame.pERP->byContext |= WLAN_EID_ERP_NONERP_PRESENT;
3384 if (pDevice->bBarkerPreambleMd == TRUE)
3385 sFrame.pERP->byContext |= WLAN_EID_ERP_BARKER_MODE;
3386 }
3387 if (((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len != 0) {
3388 sFrame.pExtSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
3389 sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
3e362598 3390 memcpy(sFrame.pExtSuppRates,
92b96797
FB
3391 pCurrExtSuppRates,
3392 ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN
3393 );
3394 }
3395 // hostapd wpa/wpa2 IE
3396 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) && (pDevice->bEnableHostapd == TRUE)) {
3397 if (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) {
3398 if (pMgmt->wWPAIELen != 0) {
3399 sFrame.pRSN = (PWLAN_IE_RSN)(sFrame.pBuf + sFrame.len);
3400 memcpy(sFrame.pRSN, pMgmt->abyWPAIE, pMgmt->wWPAIELen);
3401 sFrame.len += pMgmt->wWPAIELen;
3402 }
3403 }
3404 }
3405
3406 /* Adjust the length fields */
3407 pTxPacket->cbMPDULen = sFrame.len;
3408 pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
3409
3410 return pTxPacket;
3411}
3412
3413
3414
3415
3416
3417/*+
3418 *
3419 * Routine Description:
3420 * Constructs an Prob-response frame
3421 *
3422 *
3423 * Return Value:
3424 * PTR to frame; or NULL on allocation failue
3425 *
3426-*/
3427
3428
3429
3430
3431PSTxMgmtPacket
3432s_MgrMakeProbeResponse(
3433 IN PSDevice pDevice,
3434 IN PSMgmtObject pMgmt,
3435 IN WORD wCurrCapInfo,
3436 IN WORD wCurrBeaconPeriod,
3437 IN UINT uCurrChannel,
3438 IN WORD wCurrATIMWinodw,
3439 IN PBYTE pDstAddr,
3440 IN PWLAN_IE_SSID pCurrSSID,
3441 IN PBYTE pCurrBSSID,
3442 IN PWLAN_IE_SUPP_RATES pCurrSuppRates,
3443 IN PWLAN_IE_SUPP_RATES pCurrExtSuppRates,
3444 IN BYTE byPHYType
3445 )
3446{
3447 PSTxMgmtPacket pTxPacket = NULL;
3448 WLAN_FR_PROBERESP sFrame;
3449
3450
3451
3452 pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
3453 memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_PROBERESP_FR_MAXLEN);
3454 pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
3455 // Setup the sFrame structure.
3456 sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
3457 sFrame.len = WLAN_PROBERESP_FR_MAXLEN;
3458 vMgrEncodeProbeResponse(&sFrame);
3459 // Setup the header
3460 sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
3461 (
3462 WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
3463 WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_PROBERESP)
3464 ));
3465 memcpy( sFrame.pHdr->sA3.abyAddr1, pDstAddr, WLAN_ADDR_LEN);
3466 memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
3467 memcpy( sFrame.pHdr->sA3.abyAddr3, pCurrBSSID, WLAN_BSSID_LEN);
3468 *sFrame.pwBeaconInterval = cpu_to_le16(wCurrBeaconPeriod);
3469 *sFrame.pwCapInfo = cpu_to_le16(wCurrCapInfo);
3470
3471 if (byPHYType == BB_TYPE_11B) {
3472 *sFrame.pwCapInfo &= cpu_to_le16((WORD)~(WLAN_SET_CAP_INFO_SHORTSLOTTIME(1)));
3473 }
3474
3475 // Copy SSID
3476 sFrame.pSSID = (PWLAN_IE_SSID)(sFrame.pBuf + sFrame.len);
3477 sFrame.len += ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->len + WLAN_IEHDR_LEN;
3478 memcpy(sFrame.pSSID,
3479 pCurrSSID,
3480 ((PWLAN_IE_SSID)pCurrSSID)->len + WLAN_IEHDR_LEN
3481 );
3482 // Copy the rate set
3483 sFrame.pSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
3484
3485 sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN;
3486 memcpy(sFrame.pSuppRates,
3487 pCurrSuppRates,
3488 ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN
3489 );
3490
3491 // DS parameter
3492 if (pDevice->byBBType != BB_TYPE_11A) {
3493 sFrame.pDSParms = (PWLAN_IE_DS_PARMS)(sFrame.pBuf + sFrame.len);
3494 sFrame.len += (1) + WLAN_IEHDR_LEN;
3495 sFrame.pDSParms->byElementID = WLAN_EID_DS_PARMS;
3496 sFrame.pDSParms->len = 1;
3497 sFrame.pDSParms->byCurrChannel = (BYTE)uCurrChannel;
3498 }
3499
3500 if (pMgmt->eCurrMode != WMAC_MODE_ESS_AP) {
3501 // IBSS parameter
3502 sFrame.pIBSSParms = (PWLAN_IE_IBSS_PARMS)(sFrame.pBuf + sFrame.len);
3503 sFrame.len += (2) + WLAN_IEHDR_LEN;
3504 sFrame.pIBSSParms->byElementID = WLAN_EID_IBSS_PARMS;
3505 sFrame.pIBSSParms->len = 2;
3506 sFrame.pIBSSParms->wATIMWindow = 0;
3507 }
3508 if (pDevice->byBBType == BB_TYPE_11G) {
3509 sFrame.pERP = (PWLAN_IE_ERP)(sFrame.pBuf + sFrame.len);
3510 sFrame.len += 1 + WLAN_IEHDR_LEN;
3511 sFrame.pERP->byElementID = WLAN_EID_ERP;
3512 sFrame.pERP->len = 1;
3513 sFrame.pERP->byContext = 0;
3514 if (pDevice->bProtectMode == TRUE)
3515 sFrame.pERP->byContext |= WLAN_EID_ERP_USE_PROTECTION;
3516 if (pDevice->bNonERPPresent == TRUE)
3517 sFrame.pERP->byContext |= WLAN_EID_ERP_NONERP_PRESENT;
3518 if (pDevice->bBarkerPreambleMd == TRUE)
3519 sFrame.pERP->byContext |= WLAN_EID_ERP_BARKER_MODE;
3520 }
3521
3522 if (((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len != 0) {
3523 sFrame.pExtSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
3524 sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
3e362598 3525 memcpy(sFrame.pExtSuppRates,
92b96797
FB
3526 pCurrExtSuppRates,
3527 ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN
3528 );
3529 }
3530
3531 // hostapd wpa/wpa2 IE
3532 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) && (pDevice->bEnableHostapd == TRUE)) {
3533 if (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) {
3534 if (pMgmt->wWPAIELen != 0) {
3535 sFrame.pRSN = (PWLAN_IE_RSN)(sFrame.pBuf + sFrame.len);
3536 memcpy(sFrame.pRSN, pMgmt->abyWPAIE, pMgmt->wWPAIELen);
3537 sFrame.len += pMgmt->wWPAIELen;
3538 }
3539 }
3540 }
3541
3542 // Adjust the length fields
3543 pTxPacket->cbMPDULen = sFrame.len;
3544 pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
3545
3546 return pTxPacket;
3547}
3548
3549
3550
3551/*+
3552 *
3553 * Routine Description:
3554 * Constructs an association request frame
3555 *
3556 *
3557 * Return Value:
3558 * A ptr to frame or NULL on allocation failue
3559 *
3560-*/
3561
3562
3563PSTxMgmtPacket
3564s_MgrMakeAssocRequest(
3565 IN PSDevice pDevice,
3566 IN PSMgmtObject pMgmt,
3567 IN PBYTE pDAddr,
3568 IN WORD wCurrCapInfo,
3569 IN WORD wListenInterval,
3570 IN PWLAN_IE_SSID pCurrSSID,
3571 IN PWLAN_IE_SUPP_RATES pCurrRates,
3572 IN PWLAN_IE_SUPP_RATES pCurrExtSuppRates
3573 )
3574{
3575 PSTxMgmtPacket pTxPacket = NULL;
3576 WLAN_FR_ASSOCREQ sFrame;
3577 PBYTE pbyIEs;
3578 PBYTE pbyRSN;
3579
3580
3581 pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
3582 memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_ASSOCREQ_FR_MAXLEN);
3583 pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
3584 // Setup the sFrame structure.
3585 sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
3586 sFrame.len = WLAN_ASSOCREQ_FR_MAXLEN;
3587 // format fixed field frame structure
3588 vMgrEncodeAssocRequest(&sFrame);
3589 // Setup the header
3590 sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
3591 (
3592 WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
3593 WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_ASSOCREQ)
3594 ));
3595 memcpy( sFrame.pHdr->sA3.abyAddr1, pDAddr, WLAN_ADDR_LEN);
3596 memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
3597 memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
3598
3599 // Set the capibility and listen interval
3600 *(sFrame.pwCapInfo) = cpu_to_le16(wCurrCapInfo);
3601 *(sFrame.pwListenInterval) = cpu_to_le16(wListenInterval);
3602
3603 // sFrame.len point to end of fixed field
3604 sFrame.pSSID = (PWLAN_IE_SSID)(sFrame.pBuf + sFrame.len);
3605 sFrame.len += pCurrSSID->len + WLAN_IEHDR_LEN;
3606 memcpy(sFrame.pSSID, pCurrSSID, pCurrSSID->len + WLAN_IEHDR_LEN);
3607
3608 pMgmt->sAssocInfo.AssocInfo.RequestIELength = pCurrSSID->len + WLAN_IEHDR_LEN;
3609 pMgmt->sAssocInfo.AssocInfo.OffsetRequestIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);
3610 pbyIEs = pMgmt->sAssocInfo.abyIEs;
3e362598 3611 memcpy(pbyIEs, pCurrSSID, pCurrSSID->len + WLAN_IEHDR_LEN);
92b96797
FB
3612 pbyIEs += pCurrSSID->len + WLAN_IEHDR_LEN;
3613
3614 // Copy the rate set
3615 sFrame.pSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
3616 if ((pDevice->byBBType == BB_TYPE_11B) && (pCurrRates->len > 4))
3617 sFrame.len += 4 + WLAN_IEHDR_LEN;
3618 else
3619 sFrame.len += pCurrRates->len + WLAN_IEHDR_LEN;
3620 memcpy(sFrame.pSuppRates, pCurrRates, pCurrRates->len + WLAN_IEHDR_LEN);
3621
3622 // Copy the extension rate set
3623 if ((pDevice->byBBType == BB_TYPE_11G) && (pCurrExtSuppRates->len > 0)) {
3624 sFrame.pExtSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
3625 sFrame.len += pCurrExtSuppRates->len + WLAN_IEHDR_LEN;
3626 memcpy(sFrame.pExtSuppRates, pCurrExtSuppRates, pCurrExtSuppRates->len + WLAN_IEHDR_LEN);
3627 }
3628
3629 pMgmt->sAssocInfo.AssocInfo.RequestIELength += pCurrRates->len + WLAN_IEHDR_LEN;
3e362598 3630 memcpy(pbyIEs, pCurrRates, pCurrRates->len + WLAN_IEHDR_LEN);
92b96797
FB
3631 pbyIEs += pCurrRates->len + WLAN_IEHDR_LEN;
3632
3633
3634 if (((pMgmt->eAuthenMode == WMAC_AUTH_WPA) ||
3635 (pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK) ||
3636 (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE)) &&
3637 (pMgmt->pCurrBSS != NULL)) {
3638 /* WPA IE */
3639 sFrame.pRSNWPA = (PWLAN_IE_RSN_EXT)(sFrame.pBuf + sFrame.len);
3640 sFrame.pRSNWPA->byElementID = WLAN_EID_RSN_WPA;
3641 sFrame.pRSNWPA->len = 16;
3642 sFrame.pRSNWPA->abyOUI[0] = 0x00;
3643 sFrame.pRSNWPA->abyOUI[1] = 0x50;
3644 sFrame.pRSNWPA->abyOUI[2] = 0xf2;
3645 sFrame.pRSNWPA->abyOUI[3] = 0x01;
3646 sFrame.pRSNWPA->wVersion = 1;
3647 //Group Key Cipher Suite
3648 sFrame.pRSNWPA->abyMulticast[0] = 0x00;
3649 sFrame.pRSNWPA->abyMulticast[1] = 0x50;
3650 sFrame.pRSNWPA->abyMulticast[2] = 0xf2;
3651 if (pMgmt->byCSSGK == KEY_CTL_WEP) {
3652 sFrame.pRSNWPA->abyMulticast[3] = pMgmt->pCurrBSS->byGKType;
3653 } else if (pMgmt->byCSSGK == KEY_CTL_TKIP) {
3654 sFrame.pRSNWPA->abyMulticast[3] = WPA_TKIP;
3655 } else if (pMgmt->byCSSGK == KEY_CTL_CCMP) {
3656 sFrame.pRSNWPA->abyMulticast[3] = WPA_AESCCMP;
3657 } else {
3658 sFrame.pRSNWPA->abyMulticast[3] = WPA_NONE;
3659 }
3660 // Pairwise Key Cipher Suite
3661 sFrame.pRSNWPA->wPKCount = 1;
3662 sFrame.pRSNWPA->PKSList[0].abyOUI[0] = 0x00;
3663 sFrame.pRSNWPA->PKSList[0].abyOUI[1] = 0x50;
3664 sFrame.pRSNWPA->PKSList[0].abyOUI[2] = 0xf2;
3665 if (pMgmt->byCSSPK == KEY_CTL_TKIP) {
3666 sFrame.pRSNWPA->PKSList[0].abyOUI[3] = WPA_TKIP;
3667 } else if (pMgmt->byCSSPK == KEY_CTL_CCMP) {
3668 sFrame.pRSNWPA->PKSList[0].abyOUI[3] = WPA_AESCCMP;
3669 } else {
3670 sFrame.pRSNWPA->PKSList[0].abyOUI[3] = WPA_NONE;
3671 }
3672 // Auth Key Management Suite
3673 pbyRSN = (PBYTE)(sFrame.pBuf + sFrame.len + 2 + sFrame.pRSNWPA->len);
3674 *pbyRSN++=0x01;
3675 *pbyRSN++=0x00;
3676 *pbyRSN++=0x00;
3677
3678 *pbyRSN++=0x50;
3679 *pbyRSN++=0xf2;
3680 if (pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK) {
3681 *pbyRSN++=WPA_AUTH_PSK;
3682 }
3683 else if (pMgmt->eAuthenMode == WMAC_AUTH_WPA) {
3684 *pbyRSN++=WPA_AUTH_IEEE802_1X;
3685 }
3686 else {
3687 *pbyRSN++=WPA_NONE;
3688 }
3689
3690 sFrame.pRSNWPA->len +=6;
3691
3692 // RSN Capabilites
3693
3694 *pbyRSN++=0x00;
3695 *pbyRSN++=0x00;
3696 sFrame.pRSNWPA->len +=2;
3697
3698 sFrame.len += sFrame.pRSNWPA->len + WLAN_IEHDR_LEN;
3699 // copy to AssocInfo. for OID_802_11_ASSOCIATION_INFORMATION
3700 pMgmt->sAssocInfo.AssocInfo.RequestIELength += sFrame.pRSNWPA->len + WLAN_IEHDR_LEN;
3e362598 3701 memcpy(pbyIEs, sFrame.pRSNWPA, sFrame.pRSNWPA->len + WLAN_IEHDR_LEN);
92b96797
FB
3702 pbyIEs += sFrame.pRSNWPA->len + WLAN_IEHDR_LEN;
3703
3704 } else if (((pMgmt->eAuthenMode == WMAC_AUTH_WPA2) ||
3705 (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK)) &&
3706 (pMgmt->pCurrBSS != NULL)) {
3707 UINT ii;
3708 PWORD pwPMKID;
3709
3710 // WPA IE
3711 sFrame.pRSN = (PWLAN_IE_RSN)(sFrame.pBuf + sFrame.len);
3712 sFrame.pRSN->byElementID = WLAN_EID_RSN;
3713 sFrame.pRSN->len = 6; //Version(2)+GK(4)
3714 sFrame.pRSN->wVersion = 1;
3715 //Group Key Cipher Suite
3716 sFrame.pRSN->abyRSN[0] = 0x00;
3717 sFrame.pRSN->abyRSN[1] = 0x0F;
3718 sFrame.pRSN->abyRSN[2] = 0xAC;
3719 if (pMgmt->byCSSGK == KEY_CTL_WEP) {
3720 sFrame.pRSN->abyRSN[3] = pMgmt->pCurrBSS->byCSSGK;
3721 } else if (pMgmt->byCSSGK == KEY_CTL_TKIP) {
3722 sFrame.pRSN->abyRSN[3] = WLAN_11i_CSS_TKIP;
3723 } else if (pMgmt->byCSSGK == KEY_CTL_CCMP) {
3724 sFrame.pRSN->abyRSN[3] = WLAN_11i_CSS_CCMP;
3725 } else {
3726 sFrame.pRSN->abyRSN[3] = WLAN_11i_CSS_UNKNOWN;
3727 }
3728
3729 // Pairwise Key Cipher Suite
3730 sFrame.pRSN->abyRSN[4] = 1;
3731 sFrame.pRSN->abyRSN[5] = 0;
3732 sFrame.pRSN->abyRSN[6] = 0x00;
3733 sFrame.pRSN->abyRSN[7] = 0x0F;
3734 sFrame.pRSN->abyRSN[8] = 0xAC;
3735 if (pMgmt->byCSSPK == KEY_CTL_TKIP) {
3736 sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_TKIP;
3737 } else if (pMgmt->byCSSPK == KEY_CTL_CCMP) {
3738 sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_CCMP;
3739 } else if (pMgmt->byCSSPK == KEY_CTL_NONE) {
3740 sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_USE_GROUP;
3741 } else {
3742 sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_UNKNOWN;
3743 }
3744 sFrame.pRSN->len += 6;
3745
3746 // Auth Key Management Suite
3747 sFrame.pRSN->abyRSN[10] = 1;
3748 sFrame.pRSN->abyRSN[11] = 0;
3749 sFrame.pRSN->abyRSN[12] = 0x00;
3750 sFrame.pRSN->abyRSN[13] = 0x0F;
3751 sFrame.pRSN->abyRSN[14] = 0xAC;
3752 if (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK) {
3753 sFrame.pRSN->abyRSN[15] = WLAN_11i_AKMSS_PSK;
3754 } else if (pMgmt->eAuthenMode == WMAC_AUTH_WPA2) {
3755 sFrame.pRSN->abyRSN[15] = WLAN_11i_AKMSS_802_1X;
3756 } else {
3757 sFrame.pRSN->abyRSN[15] = WLAN_11i_AKMSS_UNKNOWN;
3758 }
3759 sFrame.pRSN->len +=6;
3760
3761 // RSN Capabilites
3762 if (pMgmt->pCurrBSS->sRSNCapObj.bRSNCapExist == TRUE) {
3e362598 3763 memcpy(&sFrame.pRSN->abyRSN[16], &pMgmt->pCurrBSS->sRSNCapObj.wRSNCap, 2);
92b96797
FB
3764 } else {
3765 sFrame.pRSN->abyRSN[16] = 0;
3766 sFrame.pRSN->abyRSN[17] = 0;
3767 }
3768 sFrame.pRSN->len +=2;
3769
3770 if ((pDevice->gsPMKID.BSSIDInfoCount > 0) && (pDevice->bRoaming == TRUE) && (pMgmt->eAuthenMode == WMAC_AUTH_WPA2)) {
3771 // RSN PMKID
3772 pbyRSN = &sFrame.pRSN->abyRSN[18];
3773 pwPMKID = (PWORD)pbyRSN; // Point to PMKID count
3774 *pwPMKID = 0; // Initialize PMKID count
3775 pbyRSN += 2; // Point to PMKID list
3776 for (ii = 0; ii < pDevice->gsPMKID.BSSIDInfoCount; ii++) {
3e362598 3777 if ( !memcmp(&pDevice->gsPMKID.BSSIDInfo[ii].BSSID[0], pMgmt->abyCurrBSSID, U_ETHER_ADDR_LEN)) {
92b96797 3778 (*pwPMKID) ++;
3e362598 3779 memcpy(pbyRSN, pDevice->gsPMKID.BSSIDInfo[ii].PMKID, 16);
92b96797
FB
3780 pbyRSN += 16;
3781 }
3782 }
3783 if (*pwPMKID != 0) {
3784 sFrame.pRSN->len += (2 + (*pwPMKID)*16);
3785 }
3786 }
3787
3788 sFrame.len += sFrame.pRSN->len + WLAN_IEHDR_LEN;
3789 // copy to AssocInfo. for OID_802_11_ASSOCIATION_INFORMATION
3790 pMgmt->sAssocInfo.AssocInfo.RequestIELength += sFrame.pRSN->len + WLAN_IEHDR_LEN;
3e362598 3791 memcpy(pbyIEs, sFrame.pRSN, sFrame.pRSN->len + WLAN_IEHDR_LEN);
92b96797
FB
3792 pbyIEs += sFrame.pRSN->len + WLAN_IEHDR_LEN;
3793 }
3794
3795
3796 // Adjust the length fields
3797 pTxPacket->cbMPDULen = sFrame.len;
3798 pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
3799 return pTxPacket;
3800}
3801
3802
3803
3804
3805
3806
3807
3808
3809/*+
3810 *
3811 * Routine Description:
3812 * Constructs an re-association request frame
3813 *
3814 *
3815 * Return Value:
3816 * A ptr to frame or NULL on allocation failue
3817 *
3818-*/
3819
3820
3821PSTxMgmtPacket
3822s_MgrMakeReAssocRequest(
3823 IN PSDevice pDevice,
3824 IN PSMgmtObject pMgmt,
3825 IN PBYTE pDAddr,
3826 IN WORD wCurrCapInfo,
3827 IN WORD wListenInterval,
3828 IN PWLAN_IE_SSID pCurrSSID,
3829 IN PWLAN_IE_SUPP_RATES pCurrRates,
3830 IN PWLAN_IE_SUPP_RATES pCurrExtSuppRates
3831 )
3832{
3833 PSTxMgmtPacket pTxPacket = NULL;
3834 WLAN_FR_REASSOCREQ sFrame;
3835 PBYTE pbyIEs;
3836 PBYTE pbyRSN;
3837
3838
3839 pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
3840 memset( pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_REASSOCREQ_FR_MAXLEN);
3841 pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
3842 /* Setup the sFrame structure. */
3843 sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
3844 sFrame.len = WLAN_REASSOCREQ_FR_MAXLEN;
3845
3846 // format fixed field frame structure
3847 vMgrEncodeReassocRequest(&sFrame);
3848
3849 /* Setup the header */
3850 sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
3851 (
3852 WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
3853 WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_REASSOCREQ)
3854 ));
3855 memcpy( sFrame.pHdr->sA3.abyAddr1, pDAddr, WLAN_ADDR_LEN);
3856 memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
3857 memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
3858
3859 /* Set the capibility and listen interval */
3860 *(sFrame.pwCapInfo) = cpu_to_le16(wCurrCapInfo);
3861 *(sFrame.pwListenInterval) = cpu_to_le16(wListenInterval);
3862
3863 memcpy(sFrame.pAddrCurrAP, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
3864 /* Copy the SSID */
3865 /* sFrame.len point to end of fixed field */
3866 sFrame.pSSID = (PWLAN_IE_SSID)(sFrame.pBuf + sFrame.len);
3867 sFrame.len += pCurrSSID->len + WLAN_IEHDR_LEN;
3868 memcpy(sFrame.pSSID, pCurrSSID, pCurrSSID->len + WLAN_IEHDR_LEN);
3869
3870 pMgmt->sAssocInfo.AssocInfo.RequestIELength = pCurrSSID->len + WLAN_IEHDR_LEN;
3871 pMgmt->sAssocInfo.AssocInfo.OffsetRequestIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);
3872 pbyIEs = pMgmt->sAssocInfo.abyIEs;
3e362598 3873 memcpy(pbyIEs, pCurrSSID, pCurrSSID->len + WLAN_IEHDR_LEN);
92b96797
FB
3874 pbyIEs += pCurrSSID->len + WLAN_IEHDR_LEN;
3875
3876 /* Copy the rate set */
3877 /* sFrame.len point to end of SSID */
3878 sFrame.pSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
3879 sFrame.len += pCurrRates->len + WLAN_IEHDR_LEN;
3880 memcpy(sFrame.pSuppRates, pCurrRates, pCurrRates->len + WLAN_IEHDR_LEN);
3881
3882 // Copy the extension rate set
3883 if ((pMgmt->eCurrentPHYMode == PHY_TYPE_11G) && (pCurrExtSuppRates->len > 0)) {
3884 sFrame.pExtSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
3885 sFrame.len += pCurrExtSuppRates->len + WLAN_IEHDR_LEN;
3886 memcpy(sFrame.pExtSuppRates, pCurrExtSuppRates, pCurrExtSuppRates->len + WLAN_IEHDR_LEN);
3887 }
3888
3889 pMgmt->sAssocInfo.AssocInfo.RequestIELength += pCurrRates->len + WLAN_IEHDR_LEN;
3e362598 3890 memcpy(pbyIEs, pCurrRates, pCurrRates->len + WLAN_IEHDR_LEN);
92b96797
FB
3891 pbyIEs += pCurrRates->len + WLAN_IEHDR_LEN;
3892
3893 if (((pMgmt->eAuthenMode == WMAC_AUTH_WPA) ||
3894 (pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK) ||
3895 (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE)) &&
3896 (pMgmt->pCurrBSS != NULL)) {
3897 /* WPA IE */
3898 sFrame.pRSNWPA = (PWLAN_IE_RSN_EXT)(sFrame.pBuf + sFrame.len);
3899 sFrame.pRSNWPA->byElementID = WLAN_EID_RSN_WPA;
3900 sFrame.pRSNWPA->len = 16;
3901 sFrame.pRSNWPA->abyOUI[0] = 0x00;
3902 sFrame.pRSNWPA->abyOUI[1] = 0x50;
3903 sFrame.pRSNWPA->abyOUI[2] = 0xf2;
3904 sFrame.pRSNWPA->abyOUI[3] = 0x01;
3905 sFrame.pRSNWPA->wVersion = 1;
3906 //Group Key Cipher Suite
3907 sFrame.pRSNWPA->abyMulticast[0] = 0x00;
3908 sFrame.pRSNWPA->abyMulticast[1] = 0x50;
3909 sFrame.pRSNWPA->abyMulticast[2] = 0xf2;
3910 if (pMgmt->byCSSGK == KEY_CTL_WEP) {
3911 sFrame.pRSNWPA->abyMulticast[3] = pMgmt->pCurrBSS->byGKType;
3912 } else if (pMgmt->byCSSGK == KEY_CTL_TKIP) {
3913 sFrame.pRSNWPA->abyMulticast[3] = WPA_TKIP;
3914 } else if (pMgmt->byCSSGK == KEY_CTL_CCMP) {
3915 sFrame.pRSNWPA->abyMulticast[3] = WPA_AESCCMP;
3916 } else {
3917 sFrame.pRSNWPA->abyMulticast[3] = WPA_NONE;
3918 }
3919 // Pairwise Key Cipher Suite
3920 sFrame.pRSNWPA->wPKCount = 1;
3921 sFrame.pRSNWPA->PKSList[0].abyOUI[0] = 0x00;
3922 sFrame.pRSNWPA->PKSList[0].abyOUI[1] = 0x50;
3923 sFrame.pRSNWPA->PKSList[0].abyOUI[2] = 0xf2;
3924 if (pMgmt->byCSSPK == KEY_CTL_TKIP) {
3925 sFrame.pRSNWPA->PKSList[0].abyOUI[3] = WPA_TKIP;
3926 } else if (pMgmt->byCSSPK == KEY_CTL_CCMP) {
3927 sFrame.pRSNWPA->PKSList[0].abyOUI[3] = WPA_AESCCMP;
3928 } else {
3929 sFrame.pRSNWPA->PKSList[0].abyOUI[3] = WPA_NONE;
3930 }
3931 // Auth Key Management Suite
3932 pbyRSN = (PBYTE)(sFrame.pBuf + sFrame.len + 2 + sFrame.pRSNWPA->len);
3933 *pbyRSN++=0x01;
3934 *pbyRSN++=0x00;
3935 *pbyRSN++=0x00;
3936
3937 *pbyRSN++=0x50;
3938 *pbyRSN++=0xf2;
3939 if (pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK) {
3940 *pbyRSN++=WPA_AUTH_PSK;
3941 } else if (pMgmt->eAuthenMode == WMAC_AUTH_WPA) {
3942 *pbyRSN++=WPA_AUTH_IEEE802_1X;
3943 } else {
3944 *pbyRSN++=WPA_NONE;
3945 }
3946
3947 sFrame.pRSNWPA->len +=6;
3948
3949 // RSN Capabilites
3950 *pbyRSN++=0x00;
3951 *pbyRSN++=0x00;
3952 sFrame.pRSNWPA->len +=2;
3953
3954 sFrame.len += sFrame.pRSNWPA->len + WLAN_IEHDR_LEN;
3955 // copy to AssocInfo. for OID_802_11_ASSOCIATION_INFORMATION
3956 pMgmt->sAssocInfo.AssocInfo.RequestIELength += sFrame.pRSNWPA->len + WLAN_IEHDR_LEN;
3e362598 3957 memcpy(pbyIEs, sFrame.pRSNWPA, sFrame.pRSNWPA->len + WLAN_IEHDR_LEN);
92b96797
FB
3958 pbyIEs += sFrame.pRSNWPA->len + WLAN_IEHDR_LEN;
3959
3960 } else if (((pMgmt->eAuthenMode == WMAC_AUTH_WPA2) ||
3961 (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK)) &&
3962 (pMgmt->pCurrBSS != NULL)) {
3963 UINT ii;
3964 PWORD pwPMKID;
3965
3966 /* WPA IE */
3967 sFrame.pRSN = (PWLAN_IE_RSN)(sFrame.pBuf + sFrame.len);
3968 sFrame.pRSN->byElementID = WLAN_EID_RSN;
3969 sFrame.pRSN->len = 6; //Version(2)+GK(4)
3970 sFrame.pRSN->wVersion = 1;
3971 //Group Key Cipher Suite
3972 sFrame.pRSN->abyRSN[0] = 0x00;
3973 sFrame.pRSN->abyRSN[1] = 0x0F;
3974 sFrame.pRSN->abyRSN[2] = 0xAC;
3975 if (pMgmt->byCSSGK == KEY_CTL_WEP) {
3976 sFrame.pRSN->abyRSN[3] = pMgmt->pCurrBSS->byCSSGK;
3977 } else if (pMgmt->byCSSGK == KEY_CTL_TKIP) {
3978 sFrame.pRSN->abyRSN[3] = WLAN_11i_CSS_TKIP;
3979 } else if (pMgmt->byCSSGK == KEY_CTL_CCMP) {
3980 sFrame.pRSN->abyRSN[3] = WLAN_11i_CSS_CCMP;
3981 } else {
3982 sFrame.pRSN->abyRSN[3] = WLAN_11i_CSS_UNKNOWN;
3983 }
3984
3985 // Pairwise Key Cipher Suite
3986 sFrame.pRSN->abyRSN[4] = 1;
3987 sFrame.pRSN->abyRSN[5] = 0;
3988 sFrame.pRSN->abyRSN[6] = 0x00;
3989 sFrame.pRSN->abyRSN[7] = 0x0F;
3990 sFrame.pRSN->abyRSN[8] = 0xAC;
3991 if (pMgmt->byCSSPK == KEY_CTL_TKIP) {
3992 sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_TKIP;
3993 } else if (pMgmt->byCSSPK == KEY_CTL_CCMP) {
3994 sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_CCMP;
3995 } else if (pMgmt->byCSSPK == KEY_CTL_NONE) {
3996 sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_USE_GROUP;
3997 } else {
3998 sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_UNKNOWN;
3999 }
4000 sFrame.pRSN->len += 6;
4001
4002 // Auth Key Management Suite
4003 sFrame.pRSN->abyRSN[10] = 1;
4004 sFrame.pRSN->abyRSN[11] = 0;
4005 sFrame.pRSN->abyRSN[12] = 0x00;
4006 sFrame.pRSN->abyRSN[13] = 0x0F;
4007 sFrame.pRSN->abyRSN[14] = 0xAC;
4008 if (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK) {
4009 sFrame.pRSN->abyRSN[15] = WLAN_11i_AKMSS_PSK;
4010 } else if (pMgmt->eAuthenMode == WMAC_AUTH_WPA2) {
4011 sFrame.pRSN->abyRSN[15] = WLAN_11i_AKMSS_802_1X;
4012 } else {
4013 sFrame.pRSN->abyRSN[15] = WLAN_11i_AKMSS_UNKNOWN;
4014 }
4015 sFrame.pRSN->len +=6;
4016
4017 // RSN Capabilites
4018 if (pMgmt->pCurrBSS->sRSNCapObj.bRSNCapExist == TRUE) {
3e362598 4019 memcpy(&sFrame.pRSN->abyRSN[16], &pMgmt->pCurrBSS->sRSNCapObj.wRSNCap, 2);
92b96797
FB
4020 } else {
4021 sFrame.pRSN->abyRSN[16] = 0;
4022 sFrame.pRSN->abyRSN[17] = 0;
4023 }
4024 sFrame.pRSN->len +=2;
4025
4026 if ((pDevice->gsPMKID.BSSIDInfoCount > 0) && (pDevice->bRoaming == TRUE) && (pMgmt->eAuthenMode == WMAC_AUTH_WPA2)) {
4027 // RSN PMKID
4028 pbyRSN = &sFrame.pRSN->abyRSN[18];
4029 pwPMKID = (PWORD)pbyRSN; // Point to PMKID count
4030 *pwPMKID = 0; // Initialize PMKID count
4031 pbyRSN += 2; // Point to PMKID list
4032 for (ii = 0; ii < pDevice->gsPMKID.BSSIDInfoCount; ii++) {
3e362598 4033 if ( !memcmp(&pDevice->gsPMKID.BSSIDInfo[ii].BSSID[0], pMgmt->abyCurrBSSID, U_ETHER_ADDR_LEN)) {
92b96797 4034 (*pwPMKID) ++;
3e362598 4035 memcpy(pbyRSN, pDevice->gsPMKID.BSSIDInfo[ii].PMKID, 16);
92b96797
FB
4036 pbyRSN += 16;
4037 }
4038 }
4039 if (*pwPMKID != 0) {
4040 sFrame.pRSN->len += (2 + (*pwPMKID)*16);
4041 }
4042 }
4043
4044 sFrame.len += sFrame.pRSN->len + WLAN_IEHDR_LEN;
4045 // copy to AssocInfo. for OID_802_11_ASSOCIATION_INFORMATION
4046 pMgmt->sAssocInfo.AssocInfo.RequestIELength += sFrame.pRSN->len + WLAN_IEHDR_LEN;
3e362598 4047 memcpy(pbyIEs, sFrame.pRSN, sFrame.pRSN->len + WLAN_IEHDR_LEN);
92b96797
FB
4048 pbyIEs += sFrame.pRSN->len + WLAN_IEHDR_LEN;
4049 }
4050
4051
4052
4053 /* Adjust the length fields */
4054 pTxPacket->cbMPDULen = sFrame.len;
4055 pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
4056
4057 return pTxPacket;
4058}
4059
4060
4061
4062/*+
4063 *
4064 * Routine Description:
4065 * Constructs an assoc-response frame
4066 *
4067 *
4068 * Return Value:
4069 * PTR to frame; or NULL on allocation failue
4070 *
4071-*/
4072
4073
4074PSTxMgmtPacket
4075s_MgrMakeAssocResponse(
4076 IN PSDevice pDevice,
4077 IN PSMgmtObject pMgmt,
4078 IN WORD wCurrCapInfo,
4079 IN WORD wAssocStatus,
4080 IN WORD wAssocAID,
4081 IN PBYTE pDstAddr,
4082 IN PWLAN_IE_SUPP_RATES pCurrSuppRates,
4083 IN PWLAN_IE_SUPP_RATES pCurrExtSuppRates
4084 )
4085{
4086 PSTxMgmtPacket pTxPacket = NULL;
4087 WLAN_FR_ASSOCRESP sFrame;
4088
4089
4090 pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
4091 memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_ASSOCREQ_FR_MAXLEN);
4092 pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
4093 // Setup the sFrame structure
4094 sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
4095 sFrame.len = WLAN_REASSOCRESP_FR_MAXLEN;
4096 vMgrEncodeAssocResponse(&sFrame);
4097 // Setup the header
4098 sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
4099 (
4100 WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
4101 WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_ASSOCRESP)
4102 ));
4103 memcpy( sFrame.pHdr->sA3.abyAddr1, pDstAddr, WLAN_ADDR_LEN);
4104 memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
4105 memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
4106
4107 *sFrame.pwCapInfo = cpu_to_le16(wCurrCapInfo);
4108 *sFrame.pwStatus = cpu_to_le16(wAssocStatus);
4109 *sFrame.pwAid = cpu_to_le16((WORD)(wAssocAID | BIT14 | BIT15));
4110
4111 // Copy the rate set
4112 sFrame.pSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
4113 sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN;
4114 memcpy(sFrame.pSuppRates,
4115 pCurrSuppRates,
4116 ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN
4117 );
4118
4119 if (((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len != 0) {
4120 sFrame.pExtSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
4121 sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
3e362598 4122 memcpy(sFrame.pExtSuppRates,
92b96797
FB
4123 pCurrExtSuppRates,
4124 ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN
4125 );
4126 }
4127
4128 // Adjust the length fields
4129 pTxPacket->cbMPDULen = sFrame.len;
4130 pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
4131
4132 return pTxPacket;
4133}
4134
4135
4136/*+
4137 *
4138 * Routine Description:
4139 * Constructs an reassoc-response frame
4140 *
4141 *
4142 * Return Value:
4143 * PTR to frame; or NULL on allocation failue
4144 *
4145-*/
4146
4147
4148PSTxMgmtPacket
4149s_MgrMakeReAssocResponse(
4150 IN PSDevice pDevice,
4151 IN PSMgmtObject pMgmt,
4152 IN WORD wCurrCapInfo,
4153 IN WORD wAssocStatus,
4154 IN WORD wAssocAID,
4155 IN PBYTE pDstAddr,
4156 IN PWLAN_IE_SUPP_RATES pCurrSuppRates,
4157 IN PWLAN_IE_SUPP_RATES pCurrExtSuppRates
4158 )
4159{
4160 PSTxMgmtPacket pTxPacket = NULL;
4161 WLAN_FR_REASSOCRESP sFrame;
4162
4163
4164 pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
4165 memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_ASSOCREQ_FR_MAXLEN);
4166 pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
4167 // Setup the sFrame structure
4168 sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
4169 sFrame.len = WLAN_REASSOCRESP_FR_MAXLEN;
4170 vMgrEncodeReassocResponse(&sFrame);
4171 // Setup the header
4172 sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
4173 (
4174 WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
4175 WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_REASSOCRESP)
4176 ));
4177 memcpy( sFrame.pHdr->sA3.abyAddr1, pDstAddr, WLAN_ADDR_LEN);
4178 memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
4179 memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
4180
4181 *sFrame.pwCapInfo = cpu_to_le16(wCurrCapInfo);
4182 *sFrame.pwStatus = cpu_to_le16(wAssocStatus);
4183 *sFrame.pwAid = cpu_to_le16((WORD)(wAssocAID | BIT14 | BIT15));
4184
4185 // Copy the rate set
4186 sFrame.pSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
4187 sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN;
4188 memcpy(sFrame.pSuppRates,
4189 pCurrSuppRates,
4190 ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN
4191 );
4192
4193 if (((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len != 0) {
4194 sFrame.pExtSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
4195 sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
3e362598 4196 memcpy(sFrame.pExtSuppRates,
92b96797
FB
4197 pCurrExtSuppRates,
4198 ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN
4199 );
4200 }
4201
4202 // Adjust the length fields
4203 pTxPacket->cbMPDULen = sFrame.len;
4204 pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
4205
4206 return pTxPacket;
4207}
4208
4209
4210/*+
4211 *
4212 * Routine Description:
4213 * Handles probe response management frames.
4214 *
4215 *
4216 * Return Value:
4217 * none.
4218 *
4219-*/
4220
4221static
4222VOID
4223s_vMgrRxProbeResponse(
4224 IN PSDevice pDevice,
4225 IN PSMgmtObject pMgmt,
4226 IN PSRxMgmtPacket pRxPacket
4227 )
4228{
4229 PKnownBSS pBSSList = NULL;
4230 WLAN_FR_PROBERESP sFrame;
4231 BYTE byCurrChannel = pRxPacket->byRxChannel;
4232 ERPObject sERP;
4233 BOOL bChannelHit = TRUE;
4234
4235
4236 memset(&sFrame, 0, sizeof(WLAN_FR_PROBERESP));
4237 // decode the frame
4238 sFrame.len = pRxPacket->cbMPDULen;
4239 sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
4240 vMgrDecodeProbeResponse(&sFrame);
4241
4242 if ((sFrame.pqwTimestamp == 0) ||
4243 (sFrame.pwBeaconInterval == 0) ||
4244 (sFrame.pwCapInfo == 0) ||
4245 (sFrame.pSSID == 0) ||
4246 (sFrame.pSuppRates == 0)) {
4247 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Probe resp:Fail addr:[%p] \n", pRxPacket->p80211Header);
4248 DBG_PORT80(0xCC);
4249 return;
4250 };
4251
4252 if(sFrame.pSSID->len == 0)
4253 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Rx Probe resp: SSID len = 0 \n");
4254
4255
4256 //{{ RobertYu:20050201, 11a byCurrChannel != sFrame.pDSParms->byCurrChannel mapping
4257 if( byCurrChannel > CB_MAX_CHANNEL_24G )
4258 {
4259 if (sFrame.pDSParms != 0) {
4260 if (byCurrChannel == RFaby11aChannelIndex[sFrame.pDSParms->byCurrChannel-1])
4261 bChannelHit = TRUE;
4262 byCurrChannel = RFaby11aChannelIndex[sFrame.pDSParms->byCurrChannel-1];
4263 } else {
4264 bChannelHit = TRUE;
4265 }
4266
4267 } else {
4268 if (sFrame.pDSParms != 0) {
4269 if (byCurrChannel == sFrame.pDSParms->byCurrChannel)
4270 bChannelHit = TRUE;
4271 byCurrChannel = sFrame.pDSParms->byCurrChannel;
4272 } else {
4273 bChannelHit = TRUE;
4274 }
4275 }
4276 //RobertYu:20050201
4277
4278//2008-0730-01<Add>by MikeLiu
4279if(ChannelExceedZoneType(pDevice,byCurrChannel)==TRUE)
4280 return;
4281
4282 if (sFrame.pERP != NULL) {
4283 sERP.byERP = sFrame.pERP->byContext;
4284 sERP.bERPExist = TRUE;
4285 } else {
4286 sERP.bERPExist = FALSE;
4287 sERP.byERP = 0;
4288 }
4289
4290
4291 // update or insert the bss
4292 pBSSList = BSSpAddrIsInBSSList((HANDLE)pDevice, sFrame.pHdr->sA3.abyAddr3, sFrame.pSSID);
4293 if (pBSSList) {
4294 BSSbUpdateToBSSList((HANDLE)pDevice,
4295 *sFrame.pqwTimestamp,
4296 *sFrame.pwBeaconInterval,
4297 *sFrame.pwCapInfo,
4298 byCurrChannel,
4299 bChannelHit,
4300 sFrame.pSSID,
4301 sFrame.pSuppRates,
4302 sFrame.pExtSuppRates,
4303 &sERP,
4304 sFrame.pRSN,
4305 sFrame.pRSNWPA,
4306 sFrame.pIE_Country,
4307 sFrame.pIE_Quiet,
4308 pBSSList,
4309 sFrame.len - WLAN_HDR_ADDR3_LEN,
4310 sFrame.pHdr->sA4.abyAddr4, // payload of probresponse
4311 (HANDLE)pRxPacket
4312 );
4313 }
4314 else {
4315 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Probe resp/insert: RxChannel = : %d\n", byCurrChannel);
4316 BSSbInsertToBSSList((HANDLE)pDevice,
4317 sFrame.pHdr->sA3.abyAddr3,
4318 *sFrame.pqwTimestamp,
4319 *sFrame.pwBeaconInterval,
4320 *sFrame.pwCapInfo,
4321 byCurrChannel,
4322 sFrame.pSSID,
4323 sFrame.pSuppRates,
4324 sFrame.pExtSuppRates,
4325 &sERP,
4326 sFrame.pRSN,
4327 sFrame.pRSNWPA,
4328 sFrame.pIE_Country,
4329 sFrame.pIE_Quiet,
4330 sFrame.len - WLAN_HDR_ADDR3_LEN,
4331 sFrame.pHdr->sA4.abyAddr4, // payload of beacon
4332 (HANDLE)pRxPacket
4333 );
4334 }
4335 return;
4336
4337}
4338
4339/*+
4340 *
4341 * Routine Description:(AP)or(Ad-hoc STA)
4342 * Handles probe request management frames.
4343 *
4344 *
4345 * Return Value:
4346 * none.
4347 *
4348-*/
4349
4350
4351static
4352VOID
4353s_vMgrRxProbeRequest(
4354 IN PSDevice pDevice,
4355 IN PSMgmtObject pMgmt,
4356 IN PSRxMgmtPacket pRxPacket
4357 )
4358{
4359 WLAN_FR_PROBEREQ sFrame;
4360 CMD_STATUS Status;
4361 PSTxMgmtPacket pTxPacket;
4362 BYTE byPHYType = BB_TYPE_11B;
4363
4364 // STA in Ad-hoc mode: when latest TBTT beacon transmit success,
4365 // STA have to response this request.
4366 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
4367 ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) && pDevice->bBeaconSent)) {
4368
4369 memset(&sFrame, 0, sizeof(WLAN_FR_PROBEREQ));
4370 // decode the frame
4371 sFrame.len = pRxPacket->cbMPDULen;
4372 sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
4373 vMgrDecodeProbeRequest(&sFrame);
4374/*
4375 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Probe request rx:MAC addr:%02x-%02x-%02x=%02x-%02x-%02x \n",
4376 sFrame.pHdr->sA3.abyAddr2[0],
4377 sFrame.pHdr->sA3.abyAddr2[1],
4378 sFrame.pHdr->sA3.abyAddr2[2],
4379 sFrame.pHdr->sA3.abyAddr2[3],
4380 sFrame.pHdr->sA3.abyAddr2[4],
4381 sFrame.pHdr->sA3.abyAddr2[5]
4382 );
4383*/
4384 if (sFrame.pSSID->len != 0) {
4385 if (sFrame.pSSID->len != ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->len)
4386 return;
4387 if (memcmp(sFrame.pSSID->abySSID,
4388 ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->abySSID,
4389 ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->len) != 0) {
4390 return;
4391 }
4392 }
4393
4394 if ((sFrame.pSuppRates->len > 4) || (sFrame.pExtSuppRates != NULL)) {
4395 byPHYType = BB_TYPE_11G;
4396 }
4397
4398 // Probe response reply..
4399 pTxPacket = s_MgrMakeProbeResponse
4400 (
4401 pDevice,
4402 pMgmt,
4403 pMgmt->wCurrCapInfo,
4404 pMgmt->wCurrBeaconPeriod,
4405 pMgmt->uCurrChannel,
4406 0,
4407 sFrame.pHdr->sA3.abyAddr2,
4408 (PWLAN_IE_SSID)pMgmt->abyCurrSSID,
4409 (PBYTE)pMgmt->abyCurrBSSID,
4410 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
4411 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates,
4412 byPHYType
4413 );
4414 if (pTxPacket != NULL ){
4415 /* send the frame */
4416 Status = csMgmt_xmit(pDevice, pTxPacket);
4417 if (Status != CMD_STATUS_PENDING) {
4418 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Probe response tx failed\n");
4419 }
4420 else {
4421// DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Probe response tx sending..\n");
4422 }
4423 }
4424 }
4425
4426 return;
4427}
4428
4429
4430
4431
4432
4433/*+
4434 *
4435 * Routine Description:
4436 *
4437 * Entry point for the reception and handling of 802.11 management
4438 * frames. Makes a determination of the frame type and then calls
4439 * the appropriate function.
4440 *
4441 *
4442 * Return Value:
4443 * none.
4444 *
4445-*/
4446
4447
4448VOID
4449vMgrRxManagePacket(
4450 IN HANDLE hDeviceContext,
4451 IN PSMgmtObject pMgmt,
4452 IN PSRxMgmtPacket pRxPacket
4453 )
4454{
4455 PSDevice pDevice = (PSDevice)hDeviceContext;
4456 BOOL bInScan = FALSE;
4457 UINT uNodeIndex = 0;
4458 NODE_STATE eNodeState = 0;
4459 CMD_STATUS Status;
4460
4461
4462 if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
4463 if (BSSbIsSTAInNodeDB(pDevice, pRxPacket->p80211Header->sA3.abyAddr2, &uNodeIndex))
4464 eNodeState = pMgmt->sNodeDBTable[uNodeIndex].eNodeState;
4465 }
4466
4467 switch( WLAN_GET_FC_FSTYPE((pRxPacket->p80211Header->sA3.wFrameCtl)) ){
4468
4469 case WLAN_FSTYPE_ASSOCREQ:
4470 // Frame Clase = 2
4471 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx assocreq\n");
4472 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) &&
4473 (eNodeState < NODE_AUTH)) {
4474 // send deauth notification
4475 // reason = (6) class 2 received from nonauth sta
4476 vMgrDeAuthenBeginSta(pDevice,
4477 pMgmt,
4478 pRxPacket->p80211Header->sA3.abyAddr2,
4479 (6),
4480 &Status
4481 );
4482 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "wmgr: send vMgrDeAuthenBeginSta 1\n");
4483 }
4484 else {
4485 s_vMgrRxAssocRequest(pDevice, pMgmt, pRxPacket, uNodeIndex);
4486 }
4487 break;
4488
4489 case WLAN_FSTYPE_ASSOCRESP:
4490 // Frame Clase = 2
4491 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx assocresp1\n");
4492 s_vMgrRxAssocResponse(pDevice, pMgmt, pRxPacket, FALSE);
4493 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx assocresp2\n");
4494 break;
4495
4496 case WLAN_FSTYPE_REASSOCREQ:
4497 // Frame Clase = 2
4498 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx reassocreq\n");
4499 // Todo: reassoc
4500 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) &&
4501 (eNodeState < NODE_AUTH)) {
4502 // send deauth notification
4503 // reason = (6) class 2 received from nonauth sta
4504 vMgrDeAuthenBeginSta(pDevice,
4505 pMgmt,
4506 pRxPacket->p80211Header->sA3.abyAddr2,
4507 (6),
4508 &Status
4509 );
4510 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "wmgr: send vMgrDeAuthenBeginSta 2\n");
4511
4512 }
4513 s_vMgrRxReAssocRequest(pDevice, pMgmt, pRxPacket, uNodeIndex);
4514 break;
4515
4516 case WLAN_FSTYPE_REASSOCRESP:
4517 // Frame Clase = 2
4518 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx reassocresp\n");
4519 s_vMgrRxAssocResponse(pDevice, pMgmt, pRxPacket, TRUE);
4520 break;
4521
4522 case WLAN_FSTYPE_PROBEREQ:
4523 // Frame Clase = 0
4524 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx probereq\n");
4525 s_vMgrRxProbeRequest(pDevice, pMgmt, pRxPacket);
4526 break;
4527
4528 case WLAN_FSTYPE_PROBERESP:
4529 // Frame Clase = 0
4530 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx proberesp\n");
4531
4532 s_vMgrRxProbeResponse(pDevice, pMgmt, pRxPacket);
4533 break;
4534
4535 case WLAN_FSTYPE_BEACON:
4536 // Frame Clase = 0
4537 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx beacon\n");
4538 if (pMgmt->eScanState != WMAC_NO_SCANNING) {
4539 bInScan = TRUE;
4540 };
4541 s_vMgrRxBeacon(pDevice, pMgmt, pRxPacket, bInScan);
4542 break;
4543
4544 case WLAN_FSTYPE_ATIM:
4545 // Frame Clase = 1
4546 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx atim\n");
4547 break;
4548
4549 case WLAN_FSTYPE_DISASSOC:
4550 // Frame Clase = 2
4551 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx disassoc\n");
4552 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) &&
4553 (eNodeState < NODE_AUTH)) {
4554 // send deauth notification
4555 // reason = (6) class 2 received from nonauth sta
4556 vMgrDeAuthenBeginSta(pDevice,
4557 pMgmt,
4558 pRxPacket->p80211Header->sA3.abyAddr2,
4559 (6),
4560 &Status
4561 );
4562 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "wmgr: send vMgrDeAuthenBeginSta 3\n");
4563 }
4564 s_vMgrRxDisassociation(pDevice, pMgmt, pRxPacket);
4565 break;
4566
4567 case WLAN_FSTYPE_AUTHEN:
4568 // Frame Clase = 1
4569 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx authen\n");
4570 s_vMgrRxAuthentication(pDevice, pMgmt, pRxPacket);
4571 break;
4572
4573 case WLAN_FSTYPE_DEAUTHEN:
4574 // Frame Clase = 1
4575 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx deauthen\n");
4576 s_vMgrRxDeauthentication(pDevice, pMgmt, pRxPacket);
4577 break;
4578
4579 default:
4580 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx unknown mgmt\n");
4581 }
4582
4583 return;
4584}
4585
4586
4587
4588
4589/*+
4590 *
4591 * Routine Description:
4592 *
4593 *
4594 * Prepare beacon to send
4595 *
4596 * Return Value:
4597 * TRUE if success; FALSE if failed.
4598 *
4599-*/
4600BOOL
4601bMgrPrepareBeaconToSend(
4602 IN HANDLE hDeviceContext,
4603 IN PSMgmtObject pMgmt
4604 )
4605{
4606 PSDevice pDevice = (PSDevice)hDeviceContext;
4607 PSTxMgmtPacket pTxPacket;
4608
4609// pDevice->bBeaconBufReady = FALSE;
4610 if (pDevice->bEncryptionEnable || pDevice->bEnable8021x){
4611 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_PRIVACY(1);
4612 }
4613 else {
4614 pMgmt->wCurrCapInfo &= ~WLAN_SET_CAP_INFO_PRIVACY(1);
4615 }
4616 pTxPacket = s_MgrMakeBeacon
4617 (
4618 pDevice,
4619 pMgmt,
4620 pMgmt->wCurrCapInfo,
4621 pMgmt->wCurrBeaconPeriod,
4622 pMgmt->uCurrChannel,
4623 pMgmt->wCurrATIMWindow, //0,
4624 (PWLAN_IE_SSID)pMgmt->abyCurrSSID,
4625 (PBYTE)pMgmt->abyCurrBSSID,
4626 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
4627 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates
4628 );
4629
4630 if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) &&
4631 (pMgmt->abyCurrBSSID[0] == 0))
4632 return FALSE;
4633
4634 csBeacon_xmit(pDevice, pTxPacket);
4635 MACvRegBitsOn(pDevice, MAC_REG_TCR, TCR_AUTOBCNTX);
4636
4637 return TRUE;
4638}
4639
4640
4641
4642
4643/*+
4644 *
4645 * Routine Description:
4646 *
4647 * Log a warning message based on the contents of the Status
4648 * Code field of an 802.11 management frame. Defines are
4649 * derived from 802.11-1997 SPEC.
4650 *
4651 * Return Value:
4652 * none.
4653 *
4654-*/
4655static
4656VOID
4657s_vMgrLogStatus(
4658 IN PSMgmtObject pMgmt,
4659 IN WORD wStatus
4660 )
4661{
4662 switch( wStatus ){
4663 case WLAN_MGMT_STATUS_UNSPEC_FAILURE:
4664 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Unspecified error.\n");
4665 break;
4666 case WLAN_MGMT_STATUS_CAPS_UNSUPPORTED:
4667 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Can't support all requested capabilities.\n");
4668 break;
4669 case WLAN_MGMT_STATUS_REASSOC_NO_ASSOC:
4670 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Reassoc denied, can't confirm original Association.\n");
4671 break;
4672 case WLAN_MGMT_STATUS_ASSOC_DENIED_UNSPEC:
4673 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Assoc denied, undefine in spec\n");
4674 break;
4675 case WLAN_MGMT_STATUS_UNSUPPORTED_AUTHALG:
4676 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Peer doesn't support authen algorithm.\n");
4677 break;
4678 case WLAN_MGMT_STATUS_RX_AUTH_NOSEQ:
4679 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Authen frame received out of sequence.\n");
4680 break;
4681 case WLAN_MGMT_STATUS_CHALLENGE_FAIL:
4682 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Authen rejected, challenge failure.\n");
4683 break;
4684 case WLAN_MGMT_STATUS_AUTH_TIMEOUT:
4685 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Authen rejected, timeout waiting for next frame.\n");
4686 break;
4687 case WLAN_MGMT_STATUS_ASSOC_DENIED_BUSY:
4688 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Assoc denied, AP too busy.\n");
4689 break;
4690 case WLAN_MGMT_STATUS_ASSOC_DENIED_RATES:
4691 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Assoc denied, we haven't enough basic rates.\n");
4692 break;
4693 case WLAN_MGMT_STATUS_ASSOC_DENIED_SHORTPREAMBLE:
4694 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Assoc denied, we do not support short preamble.\n");
4695 break;
4696 case WLAN_MGMT_STATUS_ASSOC_DENIED_PBCC:
4697 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Assoc denied, we do not support PBCC.\n");
4698 break;
4699 case WLAN_MGMT_STATUS_ASSOC_DENIED_AGILITY:
4700 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Assoc denied, we do not support channel agility.\n");
4701 break;
4702 default:
4703 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Unknown status code %d.\n", wStatus);
4704 break;
4705 }
4706}
4707
4708
4709/*
4710 *
4711 * Description:
4712 * Add BSSID in PMKID Candidate list.
4713 *
4714 * Parameters:
4715 * In:
4716 * hDeviceContext - device structure point
4717 * pbyBSSID - BSSID address for adding
4718 * wRSNCap - BSS's RSN capability
4719 * Out:
4720 * none
4721 *
4722 * Return Value: none.
4723 *
4724-*/
4725BOOL
4726bAdd_PMKID_Candidate (
4727 IN HANDLE hDeviceContext,
4728 IN PBYTE pbyBSSID,
4729 IN PSRSNCapObject psRSNCapObj
4730 )
4731{
4732 PSDevice pDevice = (PSDevice)hDeviceContext;
4733 PPMKID_CANDIDATE pCandidateList;
4734 UINT ii = 0;
4735
4736 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"bAdd_PMKID_Candidate START: (%d)\n", (int)pDevice->gsPMKIDCandidate.NumCandidates);
4737
4738 if ((pDevice == NULL) || (pbyBSSID == NULL) || (psRSNCapObj == NULL))
4739 return FALSE;
4740
4741 if (pDevice->gsPMKIDCandidate.NumCandidates >= MAX_PMKIDLIST)
4742 return FALSE;
4743
4744
4745
4746 // Update Old Candidate
4747 for (ii = 0; ii < pDevice->gsPMKIDCandidate.NumCandidates; ii++) {
4748 pCandidateList = &pDevice->gsPMKIDCandidate.CandidateList[ii];
3e362598 4749 if ( !memcmp(pCandidateList->BSSID, pbyBSSID, U_ETHER_ADDR_LEN)) {
92b96797
FB
4750 if ((psRSNCapObj->bRSNCapExist == TRUE) && (psRSNCapObj->wRSNCap & BIT0)) {
4751 pCandidateList->Flags |= NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED;
4752 } else {
4753 pCandidateList->Flags &= ~(NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED);
4754 }
4755 return TRUE;
4756 }
4757 }
4758
4759 // New Candidate
4760 pCandidateList = &pDevice->gsPMKIDCandidate.CandidateList[pDevice->gsPMKIDCandidate.NumCandidates];
4761 if ((psRSNCapObj->bRSNCapExist == TRUE) && (psRSNCapObj->wRSNCap & BIT0)) {
4762 pCandidateList->Flags |= NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED;
4763 } else {
4764 pCandidateList->Flags &= ~(NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED);
4765 }
3e362598 4766 memcpy(pCandidateList->BSSID, pbyBSSID, U_ETHER_ADDR_LEN);
92b96797
FB
4767 pDevice->gsPMKIDCandidate.NumCandidates++;
4768 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"NumCandidates:%d\n", (int)pDevice->gsPMKIDCandidate.NumCandidates);
4769 return TRUE;
4770}
4771
4772/*
4773 *
4774 * Description:
4775 * Flush PMKID Candidate list.
4776 *
4777 * Parameters:
4778 * In:
4779 * hDeviceContext - device structure point
4780 * Out:
4781 * none
4782 *
4783 * Return Value: none.
4784 *
4785-*/
4786VOID
4787vFlush_PMKID_Candidate (
4788 IN HANDLE hDeviceContext
4789 )
4790{
4791 PSDevice pDevice = (PSDevice)hDeviceContext;
4792
4793 if (pDevice == NULL)
4794 return;
4795
3e362598 4796 memset(&pDevice->gsPMKIDCandidate, 0, sizeof(SPMKIDCandidateEvent));
92b96797
FB
4797}
4798
4799static BOOL
4800s_bCipherMatch (
4801 IN PKnownBSS pBSSNode,
4802 IN NDIS_802_11_ENCRYPTION_STATUS EncStatus,
4803 OUT PBYTE pbyCCSPK,
4804 OUT PBYTE pbyCCSGK
4805 )
4806{
4807 BYTE byMulticastCipher = KEY_CTL_INVALID;
4808 BYTE byCipherMask = 0x00;
4809 int i;
4810
4811 if (pBSSNode == NULL)
4812 return FALSE;
4813
4814 // check cap. of BSS
4815 if ((WLAN_GET_CAP_INFO_PRIVACY(pBSSNode->wCapInfo) != 0) &&
4816 (EncStatus == Ndis802_11Encryption1Enabled)) {
4817 // default is WEP only
4818 byMulticastCipher = KEY_CTL_WEP;
4819 }
4820
4821 if ((WLAN_GET_CAP_INFO_PRIVACY(pBSSNode->wCapInfo) != 0) &&
4822 (pBSSNode->bWPA2Valid == TRUE) &&
4823 //20080123-01,<Add> by Einsn Liu
4824 ((EncStatus == Ndis802_11Encryption3Enabled)||(EncStatus == Ndis802_11Encryption2Enabled))) {
4825 //WPA2
4826 // check Group Key Cipher
4827 if ((pBSSNode->byCSSGK == WLAN_11i_CSS_WEP40) ||
4828 (pBSSNode->byCSSGK == WLAN_11i_CSS_WEP104)) {
4829 byMulticastCipher = KEY_CTL_WEP;
4830 } else if (pBSSNode->byCSSGK == WLAN_11i_CSS_TKIP) {
4831 byMulticastCipher = KEY_CTL_TKIP;
4832 } else if (pBSSNode->byCSSGK == WLAN_11i_CSS_CCMP) {
4833 byMulticastCipher = KEY_CTL_CCMP;
4834 } else {
4835 byMulticastCipher = KEY_CTL_INVALID;
4836 }
4837
4838 // check Pairwise Key Cipher
4839 for(i=0;i<pBSSNode->wCSSPKCount;i++) {
4840 if ((pBSSNode->abyCSSPK[i] == WLAN_11i_CSS_WEP40) ||
4841 (pBSSNode->abyCSSPK[i] == WLAN_11i_CSS_WEP104)) {
4842 // this should not happen as defined 802.11i
4843 byCipherMask |= 0x01;
4844 } else if (pBSSNode->abyCSSPK[i] == WLAN_11i_CSS_TKIP) {
4845 byCipherMask |= 0x02;
4846 } else if (pBSSNode->abyCSSPK[i] == WLAN_11i_CSS_CCMP) {
4847 byCipherMask |= 0x04;
4848 } else if (pBSSNode->abyCSSPK[i] == WLAN_11i_CSS_USE_GROUP) {
4849 // use group key only ignore all others
4850 byCipherMask = 0;
4851 i = pBSSNode->wCSSPKCount;
4852 }
4853 }
4854
4855 } else if ((WLAN_GET_CAP_INFO_PRIVACY(pBSSNode->wCapInfo) != 0) &&
4856 (pBSSNode->bWPAValid == TRUE) &&
4857 ((EncStatus == Ndis802_11Encryption2Enabled) || (EncStatus == Ndis802_11Encryption3Enabled))) {
4858 //WPA
4859 // check Group Key Cipher
4860 if ((pBSSNode->byGKType == WPA_WEP40) ||
4861 (pBSSNode->byGKType == WPA_WEP104)) {
4862 byMulticastCipher = KEY_CTL_WEP;
4863 } else if (pBSSNode->byGKType == WPA_TKIP) {
4864 byMulticastCipher = KEY_CTL_TKIP;
4865 } else if (pBSSNode->byGKType == WPA_AESCCMP) {
4866 byMulticastCipher = KEY_CTL_CCMP;
4867 } else {
4868 byMulticastCipher = KEY_CTL_INVALID;
4869 }
4870
4871 // check Pairwise Key Cipher
4872 for(i=0;i<pBSSNode->wPKCount;i++) {
4873 if (pBSSNode->abyPKType[i] == WPA_TKIP) {
4874 byCipherMask |= 0x02;
4875 } else if (pBSSNode->abyPKType[i] == WPA_AESCCMP) {
4876 byCipherMask |= 0x04;
4877 } else if (pBSSNode->abyPKType[i] == WPA_NONE) {
4878 // use group key only ignore all others
4879 byCipherMask = 0;
4880 i = pBSSNode->wPKCount;
4881 }
4882 }
4883 }
4884
4885 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%d, %d, %d, %d, EncStatus:%d\n",
4886 byMulticastCipher, byCipherMask, pBSSNode->bWPAValid, pBSSNode->bWPA2Valid, EncStatus);
4887
4888 // mask our cap. with BSS
4889 if (EncStatus == Ndis802_11Encryption1Enabled) {
4890
4891 // For supporting Cisco migration mode, don't care pairwise key cipher
4892 //if ((byMulticastCipher == KEY_CTL_WEP) &&
4893 // (byCipherMask == 0)) {
4894 if ((byMulticastCipher == KEY_CTL_WEP) &&
4895 (byCipherMask == 0)) {
4896 *pbyCCSGK = KEY_CTL_WEP;
4897 *pbyCCSPK = KEY_CTL_NONE;
4898 return TRUE;
4899 } else {
4900 return FALSE;
4901 }
4902
4903 } else if (EncStatus == Ndis802_11Encryption2Enabled) {
4904 if ((byMulticastCipher == KEY_CTL_TKIP) &&
4905 (byCipherMask == 0)) {
4906 *pbyCCSGK = KEY_CTL_TKIP;
4907 *pbyCCSPK = KEY_CTL_NONE;
4908 return TRUE;
4909 } else if ((byMulticastCipher == KEY_CTL_WEP) &&
4910 ((byCipherMask & 0x02) != 0)) {
4911 *pbyCCSGK = KEY_CTL_WEP;
4912 *pbyCCSPK = KEY_CTL_TKIP;
4913 return TRUE;
4914 } else if ((byMulticastCipher == KEY_CTL_TKIP) &&
4915 ((byCipherMask & 0x02) != 0)) {
4916 *pbyCCSGK = KEY_CTL_TKIP;
4917 *pbyCCSPK = KEY_CTL_TKIP;
4918 return TRUE;
4919 } else {
4920 return FALSE;
4921 }
4922 } else if (EncStatus == Ndis802_11Encryption3Enabled) {
4923 if ((byMulticastCipher == KEY_CTL_CCMP) &&
4924 (byCipherMask == 0)) {
4925 // When CCMP is enable, "Use group cipher suite" shall not be a valid option.
4926 return FALSE;
4927 } else if ((byMulticastCipher == KEY_CTL_WEP) &&
4928 ((byCipherMask & 0x04) != 0)) {
4929 *pbyCCSGK = KEY_CTL_WEP;
4930 *pbyCCSPK = KEY_CTL_CCMP;
4931 return TRUE;
4932 } else if ((byMulticastCipher == KEY_CTL_TKIP) &&
4933 ((byCipherMask & 0x04) != 0)) {
4934 *pbyCCSGK = KEY_CTL_TKIP;
4935 *pbyCCSPK = KEY_CTL_CCMP;
4936 return TRUE;
4937 } else if ((byMulticastCipher == KEY_CTL_CCMP) &&
4938 ((byCipherMask & 0x04) != 0)) {
4939 *pbyCCSGK = KEY_CTL_CCMP;
4940 *pbyCCSPK = KEY_CTL_CCMP;
4941 return TRUE;
4942 } else {
4943 return FALSE;
4944 }
4945 }
4946 return TRUE;
4947}
4948
4949