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