Staging: Add pristine upstream vt6656 driver sources to drivers/staging/vt6656.
[firewire-audio.git] / drivers / staging / vt6656 / wmgr.c
blob89eb965744cd6b0ac300d6da96a90545913ed463
1 /*
2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
3 * All rights reserved.
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.
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.
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.
20 * File: wmgr.c
22 * Purpose: Handles the 802.11 management functions
24 * Author: Lyndon Chen
26 * Date: May 8, 2002
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
60 * Revision History:
65 #if !defined(__TMACRO_H__)
66 #include "tmacro.h"
67 #endif
68 #if !defined(__TBIT_H__)
69 #include "tbit.h"
70 #endif
71 #if !defined(__DESC_H__)
72 #include "desc.h"
73 #endif
74 #if !defined(__DEVICE_H__)
75 #include "device.h"
76 #endif
77 #if !defined(__CARD_H__)
78 #include "card.h"
79 #endif
80 #if !defined(__80211HDR_H__)
81 #include "80211hdr.h"
82 #endif
83 #if !defined(__80211MGR_H__)
84 #include "80211mgr.h"
85 #endif
86 #if !defined(__WMGR_H__)
87 #include "wmgr.h"
88 #endif
89 #if !defined(__WCMD_H__)
90 #include "wcmd.h"
91 #endif
92 #if !defined(__MAC_H__)
93 #include "mac.h"
94 #endif
95 #if !defined(__BSSDB_H__)
96 #include "bssdb.h"
97 #endif
98 #if !defined(__POWER_H__)
99 #include "power.h"
100 #endif
101 #if !defined(__DATARATE_H__)
102 #include "datarate.h"
103 #endif
104 #if !defined(__BASEBAND_H__)
105 #include "baseband.h"
106 #endif
107 #if !defined(__RXTX_H__)
108 #include "rxtx.h"
109 #endif
110 #if !defined(__WPA_H__)
111 #include "wpa.h"
112 #endif
113 #if !defined(__RF_H__)
114 #include "rf.h"
115 #endif
116 #if !defined(__UMEM_H__)
117 #include "umem.h"
118 #endif
119 #if !defined(__IOWPA_H__)
120 #include "iowpa.h"
121 #endif
122 #if !defined(__CONTROL_H__)
123 #include "control.h"
124 #endif
125 #if !defined(__RNDIS_H__)
126 #include "rndis.h"
127 #endif
128 /*--------------------- Static Definitions -------------------------*/
132 /*--------------------- Static Classes ----------------------------*/
134 /*--------------------- Static Variables --------------------------*/
135 static int msglevel =MSG_LEVEL_INFO;
136 //static int msglevel =MSG_LEVEL_DEBUG;
138 /*--------------------- Static Functions --------------------------*/
139 //2008-0730-01<Add>by MikeLiu
140 static BOOL ChannelExceedZoneType(
141 IN PSDevice pDevice,
142 IN BYTE byCurrChannel
145 // Association/diassociation functions
146 static
147 PSTxMgmtPacket
148 s_MgrMakeAssocRequest(
149 IN PSDevice pDevice,
150 IN PSMgmtObject pMgmt,
151 IN PBYTE pDAddr,
152 IN WORD wCurrCapInfo,
153 IN WORD wListenInterval,
154 IN PWLAN_IE_SSID pCurrSSID,
155 IN PWLAN_IE_SUPP_RATES pCurrRates,
156 IN PWLAN_IE_SUPP_RATES pCurrExtSuppRates
159 static
160 VOID
161 s_vMgrRxAssocRequest(
162 IN PSDevice pDevice,
163 IN PSMgmtObject pMgmt,
164 IN PSRxMgmtPacket pRxPacket,
165 IN UINT uNodeIndex
168 static
169 PSTxMgmtPacket
170 s_MgrMakeReAssocRequest(
171 IN PSDevice pDevice,
172 IN PSMgmtObject pMgmt,
173 IN PBYTE pDAddr,
174 IN WORD wCurrCapInfo,
175 IN WORD wListenInterval,
176 IN PWLAN_IE_SSID pCurrSSID,
177 IN PWLAN_IE_SUPP_RATES pCurrRates,
178 IN PWLAN_IE_SUPP_RATES pCurrExtSuppRates
181 static
182 VOID
183 s_vMgrRxAssocResponse(
184 IN PSDevice pDevice,
185 IN PSMgmtObject pMgmt,
186 IN PSRxMgmtPacket pRxPacket,
187 IN BOOL bReAssocType
190 static
191 VOID
192 s_vMgrRxDisassociation(
193 IN PSDevice pDevice,
194 IN PSMgmtObject pMgmt,
195 IN PSRxMgmtPacket pRxPacket
198 // Authentication/deauthen functions
199 static
200 VOID
201 s_vMgrRxAuthenSequence_1(
202 IN PSDevice pDevice,
203 IN PSMgmtObject pMgmt,
204 IN PWLAN_FR_AUTHEN pFrame
207 static
208 VOID
209 s_vMgrRxAuthenSequence_2(
210 IN PSDevice pDevice,
211 IN PSMgmtObject pMgmt,
212 IN PWLAN_FR_AUTHEN pFrame
215 static
216 VOID
217 s_vMgrRxAuthenSequence_3(
218 IN PSDevice pDevice,
219 IN PSMgmtObject pMgmt,
220 IN PWLAN_FR_AUTHEN pFrame
223 static
224 VOID
225 s_vMgrRxAuthenSequence_4(
226 IN PSDevice pDevice,
227 IN PSMgmtObject pMgmt,
228 IN PWLAN_FR_AUTHEN pFrame
231 static
232 VOID
233 s_vMgrRxAuthentication(
234 IN PSDevice pDevice,
235 IN PSMgmtObject pMgmt,
236 IN PSRxMgmtPacket pRxPacket
239 static
240 VOID
241 s_vMgrRxDeauthentication(
242 IN PSDevice pDevice,
243 IN PSMgmtObject pMgmt,
244 IN PSRxMgmtPacket pRxPacket
247 // Scan functions
248 // probe request/response functions
249 static
250 VOID
251 s_vMgrRxProbeRequest(
252 IN PSDevice pDevice,
253 IN PSMgmtObject pMgmt,
254 IN PSRxMgmtPacket pRxPacket
257 static
258 VOID
259 s_vMgrRxProbeResponse(
260 IN PSDevice pDevice,
261 IN PSMgmtObject pMgmt,
262 IN PSRxMgmtPacket pRxPacket
265 // beacon functions
266 static
267 VOID
268 s_vMgrRxBeacon(
269 IN PSDevice pDevice,
270 IN PSMgmtObject pMgmt,
271 IN PSRxMgmtPacket pRxPacket,
272 IN BOOL bInScan
275 static
276 VOID
277 s_vMgrFormatTIM(
278 IN PSMgmtObject pMgmt,
279 IN PWLAN_IE_TIM pTIM
282 static
283 PSTxMgmtPacket
284 s_MgrMakeBeacon(
285 IN PSDevice pDevice,
286 IN PSMgmtObject pMgmt,
287 IN WORD wCurrCapInfo,
288 IN WORD wCurrBeaconPeriod,
289 IN UINT uCurrChannel,
290 IN WORD wCurrATIMWinodw,
291 IN PWLAN_IE_SSID pCurrSSID,
292 IN PBYTE pCurrBSSID,
293 IN PWLAN_IE_SUPP_RATES pCurrSuppRates,
294 IN PWLAN_IE_SUPP_RATES pCurrExtSuppRates
298 // Association response
299 static
300 PSTxMgmtPacket
301 s_MgrMakeAssocResponse(
302 IN PSDevice pDevice,
303 IN PSMgmtObject pMgmt,
304 IN WORD wCurrCapInfo,
305 IN WORD wAssocStatus,
306 IN WORD wAssocAID,
307 IN PBYTE pDstAddr,
308 IN PWLAN_IE_SUPP_RATES pCurrSuppRates,
309 IN PWLAN_IE_SUPP_RATES pCurrExtSuppRates
312 // ReAssociation response
313 static
314 PSTxMgmtPacket
315 s_MgrMakeReAssocResponse(
316 IN PSDevice pDevice,
317 IN PSMgmtObject pMgmt,
318 IN WORD wCurrCapInfo,
319 IN WORD wAssocStatus,
320 IN WORD wAssocAID,
321 IN PBYTE pDstAddr,
322 IN PWLAN_IE_SUPP_RATES pCurrSuppRates,
323 IN PWLAN_IE_SUPP_RATES pCurrExtSuppRates
326 // Probe response
327 static
328 PSTxMgmtPacket
329 s_MgrMakeProbeResponse(
330 IN PSDevice pDevice,
331 IN PSMgmtObject pMgmt,
332 IN WORD wCurrCapInfo,
333 IN WORD wCurrBeaconPeriod,
334 IN UINT uCurrChannel,
335 IN WORD wCurrATIMWinodw,
336 IN PBYTE pDstAddr,
337 IN PWLAN_IE_SSID pCurrSSID,
338 IN PBYTE pCurrBSSID,
339 IN PWLAN_IE_SUPP_RATES pCurrSuppRates,
340 IN PWLAN_IE_SUPP_RATES pCurrExtSuppRates,
341 IN BYTE byPHYType
344 // received status
345 static
346 VOID
347 s_vMgrLogStatus(
348 IN PSMgmtObject pMgmt,
349 IN WORD wStatus
353 static
354 VOID
355 s_vMgrSynchBSS (
356 IN PSDevice pDevice,
357 IN UINT uBSSMode,
358 IN PKnownBSS pCurr,
359 OUT PCMD_STATUS pStatus
363 static BOOL
364 s_bCipherMatch (
365 IN PKnownBSS pBSSNode,
366 IN NDIS_802_11_ENCRYPTION_STATUS EncStatus,
367 OUT PBYTE pbyCCSPK,
368 OUT PBYTE pbyCCSGK
371 static VOID Encyption_Rebuild(
372 IN PSDevice pDevice,
373 IN PKnownBSS pCurr
378 /*--------------------- Export Variables --------------------------*/
381 /*--------------------- Export Functions --------------------------*/
386 * Routine Description:
387 * Allocates and initializes the Management object.
389 * Return Value:
390 * Ndis_staus.
394 VOID
395 vMgrObjectInit(
396 IN HANDLE hDeviceContext
399 PSDevice pDevice = (PSDevice)hDeviceContext;
400 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
401 int ii;
404 pMgmt->pbyPSPacketPool = &pMgmt->byPSPacketPool[0];
405 pMgmt->pbyMgmtPacketPool = &pMgmt->byMgmtPacketPool[0];
406 pMgmt->uCurrChannel = pDevice->uChannel;
407 for(ii=0;ii<WLAN_BSSID_LEN;ii++) {
408 pMgmt->abyDesireBSSID[ii] = 0xFF;
410 pMgmt->sAssocInfo.AssocInfo.Length = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);
411 //memset(pMgmt->abyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN +1);
412 pMgmt->byCSSPK = KEY_CTL_NONE;
413 pMgmt->byCSSGK = KEY_CTL_NONE;
414 pMgmt->wIBSSBeaconPeriod = DEFAULT_IBSS_BI;
415 BSSvClearBSSList((HANDLE)pDevice, FALSE);
417 init_timer(&pMgmt->sTimerSecondCallback);
418 pMgmt->sTimerSecondCallback.data = (ULONG)pDevice;
419 pMgmt->sTimerSecondCallback.function = (TimerFunction)BSSvSecondCallBack;
420 pMgmt->sTimerSecondCallback.expires = RUN_AT(HZ);
422 init_timer(&pDevice->sTimerCommand);
423 pDevice->sTimerCommand.data = (ULONG)pDevice;
424 pDevice->sTimerCommand.function = (TimerFunction)vRunCommand;
425 pDevice->sTimerCommand.expires = RUN_AT(HZ);
427 //2007-0115-10<Add>by MikeLiu
428 #ifdef TxInSleep
429 init_timer(&pDevice->sTimerTxData);
430 pDevice->sTimerTxData.data = (ULONG)pDevice;
431 pDevice->sTimerTxData.function = (TimerFunction)BSSvSecondTxData;
432 pDevice->sTimerTxData.expires = RUN_AT(10*HZ); //10s callback
433 pDevice->fTxDataInSleep = FALSE;
434 pDevice->IsTxDataTrigger = FALSE;
435 pDevice->nTxDataTimeCout = 0;
436 #endif
438 pDevice->cbFreeCmdQueue = CMD_Q_SIZE;
439 pDevice->uCmdDequeueIdx = 0;
440 pDevice->uCmdEnqueueIdx = 0;
441 pDevice->eCommandState = WLAN_CMD_IDLE;
442 pDevice->bCmdRunning = FALSE;
443 pDevice->bCmdClear = FALSE;
445 return;
452 * Routine Description:
453 * Start the station association procedure. Namely, send an
454 * association request frame to the AP.
456 * Return Value:
457 * None.
462 VOID
463 vMgrAssocBeginSta(
464 IN HANDLE hDeviceContext,
465 IN PSMgmtObject pMgmt,
466 OUT PCMD_STATUS pStatus
469 PSDevice pDevice = (PSDevice)hDeviceContext;
470 PSTxMgmtPacket pTxPacket;
473 pMgmt->wCurrCapInfo = 0;
474 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_ESS(1);
475 if (pDevice->bEncryptionEnable) {
476 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_PRIVACY(1);
478 // always allow receive short preamble
479 //if (pDevice->byPreambleType == 1) {
480 // pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1);
482 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1);
483 if (pMgmt->wListenInterval == 0)
484 pMgmt->wListenInterval = 1; // at least one.
486 // ERP Phy (802.11g) should support short preamble.
487 if (pMgmt->eCurrentPHYMode == PHY_TYPE_11G) {
488 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1);
489 if (pDevice->bShortSlotTime == TRUE)
490 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTSLOTTIME(1);
492 } else if (pMgmt->eCurrentPHYMode == PHY_TYPE_11B) {
493 if (pDevice->byPreambleType == 1) {
494 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1);
497 if (pMgmt->b11hEnable == TRUE)
498 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SPECTRUMMNG(1);
500 // build an assocreq frame and send it
501 pTxPacket = s_MgrMakeAssocRequest
503 pDevice,
504 pMgmt,
505 pMgmt->abyCurrBSSID,
506 pMgmt->wCurrCapInfo,
507 pMgmt->wListenInterval,
508 (PWLAN_IE_SSID)pMgmt->abyCurrSSID,
509 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
510 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates
513 if (pTxPacket != NULL ){
514 // send the frame
515 *pStatus = csMgmt_xmit(pDevice, pTxPacket);
516 if (*pStatus == CMD_STATUS_PENDING) {
517 pMgmt->eCurrState = WMAC_STATE_ASSOCPENDING;
518 *pStatus = CMD_STATUS_SUCCESS;
521 else
522 *pStatus = CMD_STATUS_RESOURCES;
524 return ;
530 * Routine Description:
531 * Start the station re-association procedure.
533 * Return Value:
534 * None.
538 VOID
539 vMgrReAssocBeginSta(
540 IN HANDLE hDeviceContext,
541 IN PSMgmtObject pMgmt,
542 OUT PCMD_STATUS pStatus
545 PSDevice pDevice = (PSDevice)hDeviceContext;
546 PSTxMgmtPacket pTxPacket;
550 pMgmt->wCurrCapInfo = 0;
551 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_ESS(1);
552 if (pDevice->bEncryptionEnable) {
553 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_PRIVACY(1);
556 //if (pDevice->byPreambleType == 1) {
557 // pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1);
559 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1);
561 if (pMgmt->wListenInterval == 0)
562 pMgmt->wListenInterval = 1; // at least one.
565 // ERP Phy (802.11g) should support short preamble.
566 if (pMgmt->eCurrentPHYMode == PHY_TYPE_11G) {
567 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1);
568 if (pDevice->bShortSlotTime == TRUE)
569 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTSLOTTIME(1);
571 } else if (pMgmt->eCurrentPHYMode == PHY_TYPE_11B) {
572 if (pDevice->byPreambleType == 1) {
573 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1);
576 if (pMgmt->b11hEnable == TRUE)
577 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SPECTRUMMNG(1);
580 pTxPacket = s_MgrMakeReAssocRequest
582 pDevice,
583 pMgmt,
584 pMgmt->abyCurrBSSID,
585 pMgmt->wCurrCapInfo,
586 pMgmt->wListenInterval,
587 (PWLAN_IE_SSID)pMgmt->abyCurrSSID,
588 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
589 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates
592 if (pTxPacket != NULL ){
593 // send the frame
594 *pStatus = csMgmt_xmit(pDevice, pTxPacket);
595 if (*pStatus != CMD_STATUS_PENDING) {
596 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Reassociation tx failed.\n");
598 else {
599 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Reassociation tx sending.\n");
604 return ;
609 * Routine Description:
610 * Send an dis-association request frame to the AP.
612 * Return Value:
613 * None.
617 VOID
618 vMgrDisassocBeginSta(
619 IN HANDLE hDeviceContext,
620 IN PSMgmtObject pMgmt,
621 IN PBYTE abyDestAddress,
622 IN WORD wReason,
623 OUT PCMD_STATUS pStatus
626 PSDevice pDevice = (PSDevice)hDeviceContext;
627 PSTxMgmtPacket pTxPacket = NULL;
628 WLAN_FR_DISASSOC sFrame;
630 pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
631 memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_DISASSOC_FR_MAXLEN);
632 pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
634 // Setup the sFrame structure
635 sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
636 sFrame.len = WLAN_DISASSOC_FR_MAXLEN;
638 // format fixed field frame structure
639 vMgrEncodeDisassociation(&sFrame);
641 // Setup the header
642 sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
644 WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
645 WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_DISASSOC)
648 memcpy( sFrame.pHdr->sA3.abyAddr1, abyDestAddress, WLAN_ADDR_LEN);
649 memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
650 memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
652 // Set reason code
653 *(sFrame.pwReason) = cpu_to_le16(wReason);
654 pTxPacket->cbMPDULen = sFrame.len;
655 pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
657 // send the frame
658 *pStatus = csMgmt_xmit(pDevice, pTxPacket);
659 if (*pStatus == CMD_STATUS_PENDING) {
660 pMgmt->eCurrState = WMAC_STATE_IDLE;
661 *pStatus = CMD_STATUS_SUCCESS;
664 return;
671 * Routine Description:(AP function)
672 * Handle incoming station association request frames.
674 * Return Value:
675 * None.
679 static
680 VOID
681 s_vMgrRxAssocRequest(
682 IN PSDevice pDevice,
683 IN PSMgmtObject pMgmt,
684 IN PSRxMgmtPacket pRxPacket,
685 IN UINT uNodeIndex
688 WLAN_FR_ASSOCREQ sFrame;
689 CMD_STATUS Status;
690 PSTxMgmtPacket pTxPacket;
691 WORD wAssocStatus = 0;
692 WORD wAssocAID = 0;
693 UINT uRateLen = WLAN_RATES_MAXLEN;
694 BYTE abyCurrSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
695 BYTE abyCurrExtSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
698 if (pMgmt->eCurrMode != WMAC_MODE_ESS_AP)
699 return;
700 // node index not found
701 if (!uNodeIndex)
702 return;
704 //check if node is authenticated
705 //decode the frame
706 memset(&sFrame, 0, sizeof(WLAN_FR_ASSOCREQ));
707 memset(abyCurrSuppRates, 0, WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1);
708 memset(abyCurrExtSuppRates, 0, WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1);
709 sFrame.len = pRxPacket->cbMPDULen;
710 sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
712 vMgrDecodeAssocRequest(&sFrame);
714 if (pMgmt->sNodeDBTable[uNodeIndex].eNodeState >= NODE_AUTH) {
715 pMgmt->sNodeDBTable[uNodeIndex].eNodeState = NODE_ASSOC;
716 pMgmt->sNodeDBTable[uNodeIndex].wCapInfo = cpu_to_le16(*sFrame.pwCapInfo);
717 pMgmt->sNodeDBTable[uNodeIndex].wListenInterval = cpu_to_le16(*sFrame.pwListenInterval);
718 pMgmt->sNodeDBTable[uNodeIndex].bPSEnable =
719 WLAN_GET_FC_PWRMGT(sFrame.pHdr->sA3.wFrameCtl) ? TRUE : FALSE;
720 // Todo: check sta basic rate, if ap can't support, set status code
721 if (pDevice->byBBType == BB_TYPE_11B) {
722 uRateLen = WLAN_RATES_MAXLEN_11B;
724 abyCurrSuppRates[0] = WLAN_EID_SUPP_RATES;
725 abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pSuppRates,
726 (PWLAN_IE_SUPP_RATES)abyCurrSuppRates,
727 uRateLen);
728 abyCurrExtSuppRates[0] = WLAN_EID_EXTSUPP_RATES;
729 if (pDevice->byBBType == BB_TYPE_11G) {
730 abyCurrExtSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pExtSuppRates,
731 (PWLAN_IE_SUPP_RATES)abyCurrExtSuppRates,
732 uRateLen);
733 } else {
734 abyCurrExtSuppRates[1] = 0;
738 RATEvParseMaxRate((PVOID)pDevice,
739 (PWLAN_IE_SUPP_RATES)abyCurrSuppRates,
740 (PWLAN_IE_SUPP_RATES)abyCurrExtSuppRates,
741 FALSE, // do not change our basic rate
742 &(pMgmt->sNodeDBTable[uNodeIndex].wMaxBasicRate),
743 &(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate),
744 &(pMgmt->sNodeDBTable[uNodeIndex].wSuppRate),
745 &(pMgmt->sNodeDBTable[uNodeIndex].byTopCCKBasicRate),
746 &(pMgmt->sNodeDBTable[uNodeIndex].byTopOFDMBasicRate)
749 // set max tx rate
750 pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate =
751 pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate;
752 // Todo: check sta preamble, if ap can't support, set status code
753 pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble =
754 WLAN_GET_CAP_INFO_SHORTPREAMBLE(*sFrame.pwCapInfo);
755 pMgmt->sNodeDBTable[uNodeIndex].bShortSlotTime =
756 WLAN_GET_CAP_INFO_SHORTSLOTTIME(*sFrame.pwCapInfo);
757 pMgmt->sNodeDBTable[uNodeIndex].wAID = (WORD)uNodeIndex;
758 wAssocStatus = WLAN_MGMT_STATUS_SUCCESS;
759 wAssocAID = (WORD)uNodeIndex;
760 // check if ERP support
761 if(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate > RATE_11M)
762 pMgmt->sNodeDBTable[uNodeIndex].bERPExist = TRUE;
764 if (pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate <= RATE_11M) {
765 // B only STA join
766 pDevice->bProtectMode = TRUE;
767 pDevice->bNonERPPresent = TRUE;
769 if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble == FALSE) {
770 pDevice->bBarkerPreambleMd = TRUE;
773 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Associate AID= %d \n", wAssocAID);
774 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "MAC=%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X \n",
775 sFrame.pHdr->sA3.abyAddr2[0],
776 sFrame.pHdr->sA3.abyAddr2[1],
777 sFrame.pHdr->sA3.abyAddr2[2],
778 sFrame.pHdr->sA3.abyAddr2[3],
779 sFrame.pHdr->sA3.abyAddr2[4],
780 sFrame.pHdr->sA3.abyAddr2[5]
782 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Max Support rate = %d \n",
783 pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate);
787 // assoc response reply..
788 pTxPacket = s_MgrMakeAssocResponse
790 pDevice,
791 pMgmt,
792 pMgmt->wCurrCapInfo,
793 wAssocStatus,
794 wAssocAID,
795 sFrame.pHdr->sA3.abyAddr2,
796 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
797 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates
799 if (pTxPacket != NULL ){
801 if (pDevice->bEnableHostapd) {
802 return;
804 /* send the frame */
805 Status = csMgmt_xmit(pDevice, pTxPacket);
806 if (Status != CMD_STATUS_PENDING) {
807 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Assoc response tx failed\n");
809 else {
810 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Assoc response tx sending..\n");
815 return;
821 * Description:(AP function)
822 * Handle incoming station re-association request frames.
824 * Parameters:
825 * In:
826 * pMgmt - Management Object structure
827 * pRxPacket - Received Packet
828 * Out:
829 * none
831 * Return Value: None.
835 static
836 VOID
837 s_vMgrRxReAssocRequest(
838 IN PSDevice pDevice,
839 IN PSMgmtObject pMgmt,
840 IN PSRxMgmtPacket pRxPacket,
841 IN UINT uNodeIndex
844 WLAN_FR_REASSOCREQ sFrame;
845 CMD_STATUS Status;
846 PSTxMgmtPacket pTxPacket;
847 WORD wAssocStatus = 0;
848 WORD wAssocAID = 0;
849 UINT uRateLen = WLAN_RATES_MAXLEN;
850 BYTE abyCurrSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
851 BYTE abyCurrExtSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
853 if (pMgmt->eCurrMode != WMAC_MODE_ESS_AP)
854 return;
855 // node index not found
856 if (!uNodeIndex)
857 return;
858 //check if node is authenticated
859 //decode the frame
860 memset(&sFrame, 0, sizeof(WLAN_FR_REASSOCREQ));
861 sFrame.len = pRxPacket->cbMPDULen;
862 sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
863 vMgrDecodeReassocRequest(&sFrame);
865 if (pMgmt->sNodeDBTable[uNodeIndex].eNodeState >= NODE_AUTH) {
866 pMgmt->sNodeDBTable[uNodeIndex].eNodeState = NODE_ASSOC;
867 pMgmt->sNodeDBTable[uNodeIndex].wCapInfo = cpu_to_le16(*sFrame.pwCapInfo);
868 pMgmt->sNodeDBTable[uNodeIndex].wListenInterval = cpu_to_le16(*sFrame.pwListenInterval);
869 pMgmt->sNodeDBTable[uNodeIndex].bPSEnable =
870 WLAN_GET_FC_PWRMGT(sFrame.pHdr->sA3.wFrameCtl) ? TRUE : FALSE;
871 // Todo: check sta basic rate, if ap can't support, set status code
873 if (pDevice->byBBType == BB_TYPE_11B) {
874 uRateLen = WLAN_RATES_MAXLEN_11B;
877 abyCurrSuppRates[0] = WLAN_EID_SUPP_RATES;
878 abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pSuppRates,
879 (PWLAN_IE_SUPP_RATES)abyCurrSuppRates,
880 uRateLen);
881 abyCurrExtSuppRates[0] = WLAN_EID_EXTSUPP_RATES;
882 if (pDevice->byBBType == BB_TYPE_11G) {
883 abyCurrExtSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pExtSuppRates,
884 (PWLAN_IE_SUPP_RATES)abyCurrExtSuppRates,
885 uRateLen);
886 } else {
887 abyCurrExtSuppRates[1] = 0;
891 RATEvParseMaxRate((PVOID)pDevice,
892 (PWLAN_IE_SUPP_RATES)abyCurrSuppRates,
893 (PWLAN_IE_SUPP_RATES)abyCurrExtSuppRates,
894 FALSE, // do not change our basic rate
895 &(pMgmt->sNodeDBTable[uNodeIndex].wMaxBasicRate),
896 &(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate),
897 &(pMgmt->sNodeDBTable[uNodeIndex].wSuppRate),
898 &(pMgmt->sNodeDBTable[uNodeIndex].byTopCCKBasicRate),
899 &(pMgmt->sNodeDBTable[uNodeIndex].byTopOFDMBasicRate)
902 // set max tx rate
903 pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate =
904 pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate;
905 // Todo: check sta preamble, if ap can't support, set status code
906 pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble =
907 WLAN_GET_CAP_INFO_SHORTPREAMBLE(*sFrame.pwCapInfo);
908 pMgmt->sNodeDBTable[uNodeIndex].bShortSlotTime =
909 WLAN_GET_CAP_INFO_SHORTSLOTTIME(*sFrame.pwCapInfo);
910 pMgmt->sNodeDBTable[uNodeIndex].wAID = (WORD)uNodeIndex;
911 wAssocStatus = WLAN_MGMT_STATUS_SUCCESS;
912 wAssocAID = (WORD)uNodeIndex;
914 // if suppurt ERP
915 if(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate > RATE_11M)
916 pMgmt->sNodeDBTable[uNodeIndex].bERPExist = TRUE;
918 if (pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate <= RATE_11M) {
919 // B only STA join
920 pDevice->bProtectMode = TRUE;
921 pDevice->bNonERPPresent = TRUE;
923 if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble == FALSE) {
924 pDevice->bBarkerPreambleMd = TRUE;
927 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Rx ReAssociate AID= %d \n", wAssocAID);
928 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "MAC=%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X \n",
929 sFrame.pHdr->sA3.abyAddr2[0],
930 sFrame.pHdr->sA3.abyAddr2[1],
931 sFrame.pHdr->sA3.abyAddr2[2],
932 sFrame.pHdr->sA3.abyAddr2[3],
933 sFrame.pHdr->sA3.abyAddr2[4],
934 sFrame.pHdr->sA3.abyAddr2[5]
936 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Max Support rate = %d \n",
937 pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate);
942 // assoc response reply..
943 pTxPacket = s_MgrMakeReAssocResponse
945 pDevice,
946 pMgmt,
947 pMgmt->wCurrCapInfo,
948 wAssocStatus,
949 wAssocAID,
950 sFrame.pHdr->sA3.abyAddr2,
951 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
952 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates
955 if (pTxPacket != NULL ){
956 /* send the frame */
957 if (pDevice->bEnableHostapd) {
958 return;
960 Status = csMgmt_xmit(pDevice, pTxPacket);
961 if (Status != CMD_STATUS_PENDING) {
962 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:ReAssoc response tx failed\n");
964 else {
965 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:ReAssoc response tx sending..\n");
968 return;
974 * Routine Description:
975 * Handle incoming association response frames.
977 * Return Value:
978 * None.
982 static
983 VOID
984 s_vMgrRxAssocResponse(
985 IN PSDevice pDevice,
986 IN PSMgmtObject pMgmt,
987 IN PSRxMgmtPacket pRxPacket,
988 IN BOOL bReAssocType
991 WLAN_FR_ASSOCRESP sFrame;
992 PWLAN_IE_SSID pItemSSID;
993 PBYTE pbyIEs;
994 viawget_wpa_header *wpahdr;
998 if (pMgmt->eCurrState == WMAC_STATE_ASSOCPENDING ||
999 pMgmt->eCurrState == WMAC_STATE_ASSOC) {
1001 sFrame.len = pRxPacket->cbMPDULen;
1002 sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
1003 // decode the frame
1004 vMgrDecodeAssocResponse(&sFrame);
1005 if ((sFrame.pwCapInfo == 0) ||
1006 (sFrame.pwStatus == 0) ||
1007 (sFrame.pwAid == 0) ||
1008 (sFrame.pSuppRates == 0)){
1009 DBG_PORT80(0xCC);
1010 return;
1013 pMgmt->sAssocInfo.AssocInfo.ResponseFixedIEs.Capabilities = *(sFrame.pwCapInfo);
1014 pMgmt->sAssocInfo.AssocInfo.ResponseFixedIEs.StatusCode = *(sFrame.pwStatus);
1015 pMgmt->sAssocInfo.AssocInfo.ResponseFixedIEs.AssociationId = *(sFrame.pwAid);
1016 pMgmt->sAssocInfo.AssocInfo.AvailableResponseFixedIEs |= 0x07;
1018 pMgmt->sAssocInfo.AssocInfo.ResponseIELength = sFrame.len - 24 - 6;
1019 pMgmt->sAssocInfo.AssocInfo.OffsetResponseIEs = pMgmt->sAssocInfo.AssocInfo.OffsetRequestIEs + pMgmt->sAssocInfo.AssocInfo.RequestIELength;
1020 pbyIEs = pMgmt->sAssocInfo.abyIEs;
1021 pbyIEs += pMgmt->sAssocInfo.AssocInfo.RequestIELength;
1022 memcpy(pbyIEs, (sFrame.pBuf + 24 +6), pMgmt->sAssocInfo.AssocInfo.ResponseIELength);
1024 // save values and set current BSS state
1025 if (cpu_to_le16((*(sFrame.pwStatus))) == WLAN_MGMT_STATUS_SUCCESS ){
1026 // set AID
1027 pMgmt->wCurrAID = cpu_to_le16((*(sFrame.pwAid)));
1028 if ( (pMgmt->wCurrAID >> 14) != (BIT0 | BIT1) )
1030 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "AID from AP, has two msb clear.\n");
1032 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Association Successful, AID=%d.\n", pMgmt->wCurrAID & ~(BIT14|BIT15));
1033 pMgmt->eCurrState = WMAC_STATE_ASSOC;
1034 BSSvUpdateAPNode((HANDLE)pDevice, sFrame.pwCapInfo, sFrame.pSuppRates, sFrame.pExtSuppRates);
1035 pItemSSID = (PWLAN_IE_SSID)pMgmt->abyCurrSSID;
1036 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Link with AP(SSID): %s\n", pItemSSID->abySSID);
1037 pDevice->bLinkPass = TRUE;
1038 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_INTER);
1039 if ((pDevice->bWPADEVUp) && (pDevice->skb != NULL)) {
1040 if(skb_tailroom(pDevice->skb) <(sizeof(viawget_wpa_header)+pMgmt->sAssocInfo.AssocInfo.ResponseIELength+
1041 pMgmt->sAssocInfo.AssocInfo.RequestIELength)) { //data room not enough
1042 dev_kfree_skb(pDevice->skb);
1043 pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1045 wpahdr = (viawget_wpa_header *)pDevice->skb->data;
1046 wpahdr->type = VIAWGET_ASSOC_MSG;
1047 wpahdr->resp_ie_len = pMgmt->sAssocInfo.AssocInfo.ResponseIELength;
1048 wpahdr->req_ie_len = pMgmt->sAssocInfo.AssocInfo.RequestIELength;
1049 memcpy(pDevice->skb->data + sizeof(viawget_wpa_header), pMgmt->sAssocInfo.abyIEs, wpahdr->req_ie_len);
1050 memcpy(pDevice->skb->data + sizeof(viawget_wpa_header) + wpahdr->req_ie_len,
1051 pbyIEs,
1052 wpahdr->resp_ie_len
1054 skb_put(pDevice->skb, sizeof(viawget_wpa_header) + wpahdr->resp_ie_len + wpahdr->req_ie_len);
1055 pDevice->skb->dev = pDevice->wpadev;
1056 //2008-4-3 modify by Chester for wpa
1057 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
1058 pDevice->skb->mac_header = pDevice->skb->data;
1059 #else
1060 pDevice->skb->mac.raw = pDevice->skb->data;
1061 #endif
1062 pDevice->skb->pkt_type = PACKET_HOST;
1063 pDevice->skb->protocol = htons(ETH_P_802_2);
1064 memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
1065 netif_rx(pDevice->skb);
1066 pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1068 //2008-0409-07, <Add> by Einsn Liu
1069 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1070 //if(pDevice->bWPASuppWextEnabled == TRUE)
1072 BYTE buf[512];
1073 size_t len;
1074 union iwreq_data wrqu;
1075 int we_event;
1077 memset(buf, 0, 512);
1079 len = pMgmt->sAssocInfo.AssocInfo.RequestIELength;
1080 if(len) {
1081 memcpy(buf, pMgmt->sAssocInfo.abyIEs, len);
1082 memset(&wrqu, 0, sizeof (wrqu));
1083 wrqu.data.length = len;
1084 we_event = IWEVASSOCREQIE;
1085 PRINT_K("wireless_send_event--->IWEVASSOCREQIE\n");
1086 wireless_send_event(pDevice->dev, we_event, &wrqu, buf);
1089 memset(buf, 0, 512);
1090 len = pMgmt->sAssocInfo.AssocInfo.ResponseIELength;
1092 if(len) {
1093 memcpy(buf, pbyIEs, len);
1094 memset(&wrqu, 0, sizeof (wrqu));
1095 wrqu.data.length = len;
1096 we_event = IWEVASSOCRESPIE;
1097 PRINT_K("wireless_send_event--->IWEVASSOCRESPIE\n");
1098 wireless_send_event(pDevice->dev, we_event, &wrqu, buf);
1101 memset(&wrqu, 0, sizeof (wrqu));
1102 memcpy(wrqu.ap_addr.sa_data, &pMgmt->abyCurrBSSID[0], ETH_ALEN);
1103 wrqu.ap_addr.sa_family = ARPHRD_ETHER;
1104 PRINT_K("wireless_send_event--->SIOCGIWAP(associated)\n");
1105 wireless_send_event(pDevice->dev, SIOCGIWAP, &wrqu, NULL);
1108 #endif //#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1109 //End Add -- //2008-0409-07, <Add> by Einsn Liu
1111 else {
1112 if (bReAssocType) {
1113 pMgmt->eCurrState = WMAC_STATE_IDLE;
1115 else {
1116 // jump back to the auth state and indicate the error
1117 pMgmt->eCurrState = WMAC_STATE_AUTH;
1119 s_vMgrLogStatus(pMgmt,cpu_to_le16((*(sFrame.pwStatus))));
1124 #if 1
1125 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1126 //need clear flags related to Networkmanager
1127 pDevice->bwextstep0 = FALSE;
1128 pDevice->bwextstep1 = FALSE;
1129 pDevice->bwextstep2 = FALSE;
1130 pDevice->bwextstep3 = FALSE;
1131 pDevice->bWPASuppWextEnabled = FALSE;
1132 #endif
1133 #endif
1135 if(pMgmt->eCurrState == WMAC_STATE_ASSOC)
1136 timer_expire(pDevice->sTimerCommand, 0);
1138 return;
1145 * Routine Description:
1146 * Start the station authentication procedure. Namely, send an
1147 * authentication frame to the AP.
1149 * Return Value:
1150 * None.
1154 VOID
1155 vMgrAuthenBeginSta(
1156 IN HANDLE hDeviceContext,
1157 IN PSMgmtObject pMgmt,
1158 OUT PCMD_STATUS pStatus
1161 PSDevice pDevice = (PSDevice)hDeviceContext;
1162 WLAN_FR_AUTHEN sFrame;
1163 PSTxMgmtPacket pTxPacket = NULL;
1165 pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
1166 memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_AUTHEN_FR_MAXLEN);
1167 pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
1168 sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
1169 sFrame.len = WLAN_AUTHEN_FR_MAXLEN;
1170 vMgrEncodeAuthen(&sFrame);
1171 /* insert values */
1172 sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
1174 WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
1175 WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_AUTHEN)
1177 memcpy( sFrame.pHdr->sA3.abyAddr1, pMgmt->abyCurrBSSID, WLAN_ADDR_LEN);
1178 memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
1179 memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
1180 if (pMgmt->bShareKeyAlgorithm)
1181 *(sFrame.pwAuthAlgorithm) = cpu_to_le16(WLAN_AUTH_ALG_SHAREDKEY);
1182 else
1183 *(sFrame.pwAuthAlgorithm) = cpu_to_le16(WLAN_AUTH_ALG_OPENSYSTEM);
1185 *(sFrame.pwAuthSequence) = cpu_to_le16(1);
1186 /* Adjust the length fields */
1187 pTxPacket->cbMPDULen = sFrame.len;
1188 pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
1190 *pStatus = csMgmt_xmit(pDevice, pTxPacket);
1191 if (*pStatus == CMD_STATUS_PENDING){
1192 pMgmt->eCurrState = WMAC_STATE_AUTHPENDING;
1193 *pStatus = CMD_STATUS_SUCCESS;
1196 return ;
1203 * Routine Description:
1204 * Start the station(AP) deauthentication procedure. Namely, send an
1205 * deauthentication frame to the AP or Sta.
1207 * Return Value:
1208 * None.
1212 VOID
1213 vMgrDeAuthenBeginSta(
1214 IN HANDLE hDeviceContext,
1215 IN PSMgmtObject pMgmt,
1216 IN PBYTE abyDestAddress,
1217 IN WORD wReason,
1218 OUT PCMD_STATUS pStatus
1221 PSDevice pDevice = (PSDevice)hDeviceContext;
1222 WLAN_FR_DEAUTHEN sFrame;
1223 PSTxMgmtPacket pTxPacket = NULL;
1226 pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
1227 memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_DEAUTHEN_FR_MAXLEN);
1228 pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
1229 sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
1230 sFrame.len = WLAN_DEAUTHEN_FR_MAXLEN;
1231 vMgrEncodeDeauthen(&sFrame);
1232 /* insert values */
1233 sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
1235 WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
1236 WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_DEAUTHEN)
1239 memcpy( sFrame.pHdr->sA3.abyAddr1, abyDestAddress, WLAN_ADDR_LEN);
1240 memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
1241 memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
1243 *(sFrame.pwReason) = cpu_to_le16(wReason); // deauthen. bcs left BSS
1244 /* Adjust the length fields */
1245 pTxPacket->cbMPDULen = sFrame.len;
1246 pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
1248 *pStatus = csMgmt_xmit(pDevice, pTxPacket);
1249 if (*pStatus == CMD_STATUS_PENDING){
1250 *pStatus = CMD_STATUS_SUCCESS;
1254 return ;
1260 * Routine Description:
1261 * Handle incoming authentication frames.
1263 * Return Value:
1264 * None.
1268 static
1269 VOID
1270 s_vMgrRxAuthentication(
1271 IN PSDevice pDevice,
1272 IN PSMgmtObject pMgmt,
1273 IN PSRxMgmtPacket pRxPacket
1276 WLAN_FR_AUTHEN sFrame;
1278 // we better be an AP or a STA in AUTHPENDING otherwise ignore
1279 if (!(pMgmt->eCurrMode == WMAC_MODE_ESS_AP ||
1280 pMgmt->eCurrState == WMAC_STATE_AUTHPENDING)) {
1281 return;
1284 // decode the frame
1285 sFrame.len = pRxPacket->cbMPDULen;
1286 sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
1287 vMgrDecodeAuthen(&sFrame);
1288 switch (cpu_to_le16((*(sFrame.pwAuthSequence )))){
1289 case 1:
1290 //AP funciton
1291 s_vMgrRxAuthenSequence_1(pDevice,pMgmt, &sFrame);
1292 break;
1293 case 2:
1294 s_vMgrRxAuthenSequence_2(pDevice, pMgmt, &sFrame);
1295 break;
1296 case 3:
1297 //AP funciton
1298 s_vMgrRxAuthenSequence_3(pDevice, pMgmt, &sFrame);
1299 break;
1300 case 4:
1301 s_vMgrRxAuthenSequence_4(pDevice, pMgmt, &sFrame);
1302 break;
1303 default:
1304 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Auth Sequence error, seq = %d\n",
1305 cpu_to_le16((*(sFrame.pwAuthSequence))));
1306 break;
1308 return;
1315 * Routine Description:
1316 * Handles incoming authen frames with sequence 1. Currently
1317 * assumes we're an AP. So far, no one appears to use authentication
1318 * in Ad-Hoc mode.
1320 * Return Value:
1321 * None.
1326 static
1327 VOID
1328 s_vMgrRxAuthenSequence_1(
1329 IN PSDevice pDevice,
1330 IN PSMgmtObject pMgmt,
1331 IN PWLAN_FR_AUTHEN pFrame
1334 PSTxMgmtPacket pTxPacket = NULL;
1335 UINT uNodeIndex;
1336 WLAN_FR_AUTHEN sFrame;
1337 PSKeyItem pTransmitKey;
1339 // Insert a Node entry
1340 if (!BSSbIsSTAInNodeDB(pDevice, pFrame->pHdr->sA3.abyAddr2, &uNodeIndex)) {
1341 BSSvCreateOneNode((PSDevice)pDevice, &uNodeIndex);
1342 memcpy(pMgmt->sNodeDBTable[uNodeIndex].abyMACAddr, pFrame->pHdr->sA3.abyAddr2,
1343 WLAN_ADDR_LEN);
1346 if (pMgmt->bShareKeyAlgorithm) {
1347 pMgmt->sNodeDBTable[uNodeIndex].eNodeState = NODE_KNOWN;
1348 pMgmt->sNodeDBTable[uNodeIndex].byAuthSequence = 1;
1350 else {
1351 pMgmt->sNodeDBTable[uNodeIndex].eNodeState = NODE_AUTH;
1354 // send auth reply
1355 pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
1356 memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_AUTHEN_FR_MAXLEN);
1357 pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
1358 sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
1359 sFrame.len = WLAN_AUTHEN_FR_MAXLEN;
1360 // format buffer structure
1361 vMgrEncodeAuthen(&sFrame);
1362 // insert values
1363 sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
1365 WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
1366 WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_AUTHEN)|
1367 WLAN_SET_FC_ISWEP(0)
1369 memcpy( sFrame.pHdr->sA3.abyAddr1, pFrame->pHdr->sA3.abyAddr2, WLAN_ADDR_LEN);
1370 memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
1371 memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
1372 *(sFrame.pwAuthAlgorithm) = *(pFrame->pwAuthAlgorithm);
1373 *(sFrame.pwAuthSequence) = cpu_to_le16(2);
1375 if (cpu_to_le16(*(pFrame->pwAuthAlgorithm)) == WLAN_AUTH_ALG_SHAREDKEY) {
1376 if (pMgmt->bShareKeyAlgorithm)
1377 *(sFrame.pwStatus) = cpu_to_le16(WLAN_MGMT_STATUS_SUCCESS);
1378 else
1379 *(sFrame.pwStatus) = cpu_to_le16(WLAN_MGMT_STATUS_UNSUPPORTED_AUTHALG);
1381 else {
1382 if (pMgmt->bShareKeyAlgorithm)
1383 *(sFrame.pwStatus) = cpu_to_le16(WLAN_MGMT_STATUS_UNSUPPORTED_AUTHALG);
1384 else
1385 *(sFrame.pwStatus) = cpu_to_le16(WLAN_MGMT_STATUS_SUCCESS);
1388 if (pMgmt->bShareKeyAlgorithm &&
1389 (cpu_to_le16(*(sFrame.pwStatus)) == WLAN_MGMT_STATUS_SUCCESS)) {
1391 sFrame.pChallenge = (PWLAN_IE_CHALLENGE)(sFrame.pBuf + sFrame.len);
1392 sFrame.len += WLAN_CHALLENGE_IE_LEN;
1393 sFrame.pChallenge->byElementID = WLAN_EID_CHALLENGE;
1394 sFrame.pChallenge->len = WLAN_CHALLENGE_LEN;
1395 memset(pMgmt->abyChallenge, 0, WLAN_CHALLENGE_LEN);
1396 // get group key
1397 if(KeybGetTransmitKey(&(pDevice->sKey), pDevice->abyBroadcastAddr, GROUP_KEY, &pTransmitKey) == TRUE) {
1398 rc4_init(&pDevice->SBox, pDevice->abyPRNG, pTransmitKey->uKeyLength+3);
1399 rc4_encrypt(&pDevice->SBox, pMgmt->abyChallenge, pMgmt->abyChallenge, WLAN_CHALLENGE_LEN);
1401 memcpy(sFrame.pChallenge->abyChallenge, pMgmt->abyChallenge , WLAN_CHALLENGE_LEN);
1404 /* Adjust the length fields */
1405 pTxPacket->cbMPDULen = sFrame.len;
1406 pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
1407 // send the frame
1408 if (pDevice->bEnableHostapd) {
1409 return;
1411 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Authreq_reply sequence_1 tx.. \n");
1412 if (csMgmt_xmit(pDevice, pTxPacket) != CMD_STATUS_PENDING) {
1413 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Authreq_reply sequence_1 tx failed.\n");
1415 return;
1422 * Routine Description:
1423 * Handles incoming auth frames with sequence number 2. Currently
1424 * assumes we're a station.
1427 * Return Value:
1428 * None.
1432 static
1433 VOID
1434 s_vMgrRxAuthenSequence_2(
1435 IN PSDevice pDevice,
1436 IN PSMgmtObject pMgmt,
1437 IN PWLAN_FR_AUTHEN pFrame
1440 WLAN_FR_AUTHEN sFrame;
1441 PSTxMgmtPacket pTxPacket = NULL;
1444 switch (cpu_to_le16((*(pFrame->pwAuthAlgorithm))))
1446 case WLAN_AUTH_ALG_OPENSYSTEM:
1447 if ( cpu_to_le16((*(pFrame->pwStatus))) == WLAN_MGMT_STATUS_SUCCESS ){
1448 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "802.11 Authen (OPEN) Successful.\n");
1449 pMgmt->eCurrState = WMAC_STATE_AUTH;
1450 timer_expire(pDevice->sTimerCommand, 0);
1452 else {
1453 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "802.11 Authen (OPEN) Failed.\n");
1454 s_vMgrLogStatus(pMgmt, cpu_to_le16((*(pFrame->pwStatus))));
1455 pMgmt->eCurrState = WMAC_STATE_IDLE;
1457 if (pDevice->eCommandState == WLAN_AUTHENTICATE_WAIT ) {
1458 // spin_unlock_irq(&pDevice->lock);
1459 // vCommandTimerWait((HANDLE)pDevice, 0);
1460 // spin_lock_irq(&pDevice->lock);
1463 break;
1465 case WLAN_AUTH_ALG_SHAREDKEY:
1467 if (cpu_to_le16((*(pFrame->pwStatus))) == WLAN_MGMT_STATUS_SUCCESS) {
1468 pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
1469 memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_AUTHEN_FR_MAXLEN);
1470 pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
1471 sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
1472 sFrame.len = WLAN_AUTHEN_FR_MAXLEN;
1473 // format buffer structure
1474 vMgrEncodeAuthen(&sFrame);
1475 // insert values
1476 sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
1478 WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
1479 WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_AUTHEN)|
1480 WLAN_SET_FC_ISWEP(1)
1482 memcpy( sFrame.pHdr->sA3.abyAddr1, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
1483 memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
1484 memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
1485 *(sFrame.pwAuthAlgorithm) = *(pFrame->pwAuthAlgorithm);
1486 *(sFrame.pwAuthSequence) = cpu_to_le16(3);
1487 *(sFrame.pwStatus) = cpu_to_le16(WLAN_MGMT_STATUS_SUCCESS);
1488 sFrame.pChallenge = (PWLAN_IE_CHALLENGE)(sFrame.pBuf + sFrame.len);
1489 sFrame.len += WLAN_CHALLENGE_IE_LEN;
1490 sFrame.pChallenge->byElementID = WLAN_EID_CHALLENGE;
1491 sFrame.pChallenge->len = WLAN_CHALLENGE_LEN;
1492 memcpy( sFrame.pChallenge->abyChallenge, pFrame->pChallenge->abyChallenge, WLAN_CHALLENGE_LEN);
1493 // Adjust the length fields
1494 pTxPacket->cbMPDULen = sFrame.len;
1495 pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
1496 // send the frame
1497 if (csMgmt_xmit(pDevice, pTxPacket) != CMD_STATUS_PENDING) {
1498 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Auth_reply sequence_2 tx failed.\n");
1500 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Auth_reply sequence_2 tx ...\n");
1502 else {
1503 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:rx Auth_reply sequence_2 status error ...\n");
1504 if ( pDevice->eCommandState == WLAN_AUTHENTICATE_WAIT ) {
1505 // spin_unlock_irq(&pDevice->lock);
1506 // vCommandTimerWait((HANDLE)pDevice, 0);
1507 // spin_lock_irq(&pDevice->lock);
1509 s_vMgrLogStatus(pMgmt, cpu_to_le16((*(pFrame->pwStatus))));
1511 break;
1512 default:
1513 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt: rx auth.seq = 2 unknown AuthAlgorithm=%d\n", cpu_to_le16((*(pFrame->pwAuthAlgorithm))));
1514 break;
1516 return;
1523 * Routine Description:
1524 * Handles incoming authen frames with sequence 3. Currently
1525 * assumes we're an AP. This function assumes the frame has
1526 * already been successfully decrypted.
1529 * Return Value:
1530 * None.
1534 static
1535 VOID
1536 s_vMgrRxAuthenSequence_3(
1537 IN PSDevice pDevice,
1538 IN PSMgmtObject pMgmt,
1539 IN PWLAN_FR_AUTHEN pFrame
1542 PSTxMgmtPacket pTxPacket = NULL;
1543 UINT uStatusCode = 0 ;
1544 UINT uNodeIndex = 0;
1545 WLAN_FR_AUTHEN sFrame;
1547 if (!WLAN_GET_FC_ISWEP(pFrame->pHdr->sA3.wFrameCtl)) {
1548 uStatusCode = WLAN_MGMT_STATUS_CHALLENGE_FAIL;
1549 goto reply;
1551 if (BSSbIsSTAInNodeDB(pDevice, pFrame->pHdr->sA3.abyAddr2, &uNodeIndex)) {
1552 if (pMgmt->sNodeDBTable[uNodeIndex].byAuthSequence != 1) {
1553 uStatusCode = WLAN_MGMT_STATUS_RX_AUTH_NOSEQ;
1554 goto reply;
1556 if (memcmp(pMgmt->abyChallenge, pFrame->pChallenge->abyChallenge, WLAN_CHALLENGE_LEN) != 0) {
1557 uStatusCode = WLAN_MGMT_STATUS_CHALLENGE_FAIL;
1558 goto reply;
1561 else {
1562 uStatusCode = WLAN_MGMT_STATUS_UNSPEC_FAILURE;
1563 goto reply;
1566 if (uNodeIndex) {
1567 pMgmt->sNodeDBTable[uNodeIndex].eNodeState = NODE_AUTH;
1568 pMgmt->sNodeDBTable[uNodeIndex].byAuthSequence = 0;
1570 uStatusCode = WLAN_MGMT_STATUS_SUCCESS;
1571 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Challenge text check ok..\n");
1573 reply:
1574 // send auth reply
1575 pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
1576 memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_AUTHEN_FR_MAXLEN);
1577 pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
1578 sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
1579 sFrame.len = WLAN_AUTHEN_FR_MAXLEN;
1580 // format buffer structure
1581 vMgrEncodeAuthen(&sFrame);
1582 /* insert values */
1583 sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
1585 WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
1586 WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_AUTHEN)|
1587 WLAN_SET_FC_ISWEP(0)
1589 memcpy( sFrame.pHdr->sA3.abyAddr1, pFrame->pHdr->sA3.abyAddr2, WLAN_ADDR_LEN);
1590 memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
1591 memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
1592 *(sFrame.pwAuthAlgorithm) = *(pFrame->pwAuthAlgorithm);
1593 *(sFrame.pwAuthSequence) = cpu_to_le16(4);
1594 *(sFrame.pwStatus) = cpu_to_le16(uStatusCode);
1596 /* Adjust the length fields */
1597 pTxPacket->cbMPDULen = sFrame.len;
1598 pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
1599 // send the frame
1600 if (pDevice->bEnableHostapd) {
1601 return;
1603 if (csMgmt_xmit(pDevice, pTxPacket) != CMD_STATUS_PENDING) {
1604 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Authreq_reply sequence_4 tx failed.\n");
1606 return;
1614 * Routine Description:
1615 * Handles incoming authen frames with sequence 4
1618 * Return Value:
1619 * None.
1622 static
1623 VOID
1624 s_vMgrRxAuthenSequence_4(
1625 IN PSDevice pDevice,
1626 IN PSMgmtObject pMgmt,
1627 IN PWLAN_FR_AUTHEN pFrame
1631 if ( cpu_to_le16((*(pFrame->pwStatus))) == WLAN_MGMT_STATUS_SUCCESS ){
1632 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "802.11 Authen (SHAREDKEY) Successful.\n");
1633 pMgmt->eCurrState = WMAC_STATE_AUTH;
1634 timer_expire(pDevice->sTimerCommand, 0);
1636 else{
1637 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "802.11 Authen (SHAREDKEY) Failed.\n");
1638 s_vMgrLogStatus(pMgmt, cpu_to_le16((*(pFrame->pwStatus))) );
1639 pMgmt->eCurrState = WMAC_STATE_IDLE;
1642 if ( pDevice->eCommandState == WLAN_AUTHENTICATE_WAIT ) {
1643 // spin_unlock_irq(&pDevice->lock);
1644 // vCommandTimerWait((HANDLE)pDevice, 0);
1645 // spin_lock_irq(&pDevice->lock);
1652 * Routine Description:
1653 * Handles incoming disassociation frames
1656 * Return Value:
1657 * None.
1661 static
1662 VOID
1663 s_vMgrRxDisassociation(
1664 IN PSDevice pDevice,
1665 IN PSMgmtObject pMgmt,
1666 IN PSRxMgmtPacket pRxPacket
1669 WLAN_FR_DISASSOC sFrame;
1670 UINT uNodeIndex = 0;
1671 CMD_STATUS CmdStatus;
1672 viawget_wpa_header *wpahdr;
1674 if ( pMgmt->eCurrMode == WMAC_MODE_ESS_AP ){
1675 // if is acting an AP..
1676 // a STA is leaving this BSS..
1677 sFrame.len = pRxPacket->cbMPDULen;
1678 sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
1679 if (BSSbIsSTAInNodeDB(pDevice, pRxPacket->p80211Header->sA3.abyAddr2, &uNodeIndex)) {
1680 BSSvRemoveOneNode(pDevice, uNodeIndex);
1682 else {
1683 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Rx disassoc, sta not found\n");
1686 else if (pMgmt->eCurrMode == WMAC_MODE_ESS_STA ){
1687 sFrame.len = pRxPacket->cbMPDULen;
1688 sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
1689 vMgrDecodeDisassociation(&sFrame);
1690 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "AP disassociated me, reason=%d.\n", cpu_to_le16(*(sFrame.pwReason)));
1692 pDevice->fWPA_Authened = FALSE;
1693 if ((pDevice->bWPADEVUp) && (pDevice->skb != NULL)) {
1694 wpahdr = (viawget_wpa_header *)pDevice->skb->data;
1695 wpahdr->type = VIAWGET_DISASSOC_MSG;
1696 wpahdr->resp_ie_len = 0;
1697 wpahdr->req_ie_len = 0;
1698 skb_put(pDevice->skb, sizeof(viawget_wpa_header));
1699 pDevice->skb->dev = pDevice->wpadev;
1700 //2008-4-3 modify by Chester for wpa
1701 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
1702 pDevice->skb->mac_header = pDevice->skb->data;
1703 #else
1704 pDevice->skb->mac.raw = pDevice->skb->data;
1705 #endif
1706 pDevice->skb->pkt_type = PACKET_HOST;
1707 pDevice->skb->protocol = htons(ETH_P_802_2);
1708 memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
1709 netif_rx(pDevice->skb);
1710 pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1713 //TODO: do something let upper layer know or
1714 //try to send associate packet again because of inactivity timeout
1715 if (pMgmt->eCurrState == WMAC_STATE_ASSOC) {
1716 pDevice->bLinkPass = FALSE;
1717 pMgmt->sNodeDBTable[0].bActive = FALSE;
1718 pDevice->byReAssocCount = 0;
1719 pMgmt->eCurrState = WMAC_STATE_AUTH; // jump back to the auth state!
1720 pDevice->eCommandState = WLAN_ASSOCIATE_WAIT;
1721 vMgrReAssocBeginSta((PSDevice)pDevice, pMgmt, &CmdStatus);
1722 if(CmdStatus == CMD_STATUS_PENDING) {
1723 pDevice->byReAssocCount ++;
1724 return; //mike add: you'll retry for many times, so it cann't be regarded as disconnected!
1728 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1729 // if(pDevice->bWPASuppWextEnabled == TRUE)
1731 union iwreq_data wrqu;
1732 memset(&wrqu, 0, sizeof (wrqu));
1733 wrqu.ap_addr.sa_family = ARPHRD_ETHER;
1734 PRINT_K("wireless_send_event--->SIOCGIWAP(disassociated)\n");
1735 wireless_send_event(pDevice->dev, SIOCGIWAP, &wrqu, NULL);
1737 #endif
1739 /* else, ignore it */
1741 return;
1747 * Routine Description:
1748 * Handles incoming deauthentication frames
1751 * Return Value:
1752 * None.
1756 static
1757 VOID
1758 s_vMgrRxDeauthentication(
1759 IN PSDevice pDevice,
1760 IN PSMgmtObject pMgmt,
1761 IN PSRxMgmtPacket pRxPacket
1764 WLAN_FR_DEAUTHEN sFrame;
1765 UINT uNodeIndex = 0;
1766 viawget_wpa_header *wpahdr;
1769 if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP ){
1770 //Todo:
1771 // if is acting an AP..
1772 // a STA is leaving this BSS..
1773 sFrame.len = pRxPacket->cbMPDULen;
1774 sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
1775 if (BSSbIsSTAInNodeDB(pDevice, pRxPacket->p80211Header->sA3.abyAddr2, &uNodeIndex)) {
1776 BSSvRemoveOneNode(pDevice, uNodeIndex);
1778 else {
1779 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Rx deauth, sta not found\n");
1782 else {
1783 if (pMgmt->eCurrMode == WMAC_MODE_ESS_STA ) {
1784 sFrame.len = pRxPacket->cbMPDULen;
1785 sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
1786 vMgrDecodeDeauthen(&sFrame);
1787 pDevice->fWPA_Authened = FALSE;
1788 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "AP deauthed me, reason=%d.\n", cpu_to_le16((*(sFrame.pwReason))));
1789 // TODO: update BSS list for specific BSSID if pre-authentication case
1790 if (IS_ETH_ADDRESS_EQUAL(sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID)) {
1791 if (pMgmt->eCurrState >= WMAC_STATE_AUTHPENDING) {
1792 pMgmt->sNodeDBTable[0].bActive = FALSE;
1793 pMgmt->eCurrMode = WMAC_MODE_STANDBY;
1794 pMgmt->eCurrState = WMAC_STATE_IDLE;
1795 netif_stop_queue(pDevice->dev);
1796 pDevice->bLinkPass = FALSE;
1797 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_SLOW);
1801 if ((pDevice->bWPADEVUp) && (pDevice->skb != NULL)) {
1802 wpahdr = (viawget_wpa_header *)pDevice->skb->data;
1803 wpahdr->type = VIAWGET_DISASSOC_MSG;
1804 wpahdr->resp_ie_len = 0;
1805 wpahdr->req_ie_len = 0;
1806 skb_put(pDevice->skb, sizeof(viawget_wpa_header));
1807 pDevice->skb->dev = pDevice->wpadev;
1808 //2008-4-3 modify by Chester for wpa
1809 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
1810 pDevice->skb->mac_header = pDevice->skb->data;
1811 #else
1812 pDevice->skb->mac.raw = pDevice->skb->data;
1813 #endif
1814 pDevice->skb->pkt_type = PACKET_HOST;
1815 pDevice->skb->protocol = htons(ETH_P_802_2);
1816 memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
1817 netif_rx(pDevice->skb);
1818 pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1821 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1822 // if(pDevice->bWPASuppWextEnabled == TRUE)
1824 union iwreq_data wrqu;
1825 memset(&wrqu, 0, sizeof (wrqu));
1826 wrqu.ap_addr.sa_family = ARPHRD_ETHER;
1827 PRINT_K("wireless_send_event--->SIOCGIWAP(disauthen)\n");
1828 wireless_send_event(pDevice->dev, SIOCGIWAP, &wrqu, NULL);
1830 #endif
1833 /* else, ignore it. TODO: IBSS authentication service
1834 would be implemented here */
1836 return;
1839 //2008-0730-01<Add>by MikeLiu
1842 * Routine Description:
1843 * check if current channel is match ZoneType.
1844 *for USA:1~11;
1845 * Japan:1~13;
1846 * Europe:1~13
1847 * Return Value:
1848 * True:exceed;
1849 * False:normal case
1851 static BOOL
1852 ChannelExceedZoneType(
1853 IN PSDevice pDevice,
1854 IN BYTE byCurrChannel
1857 BOOL exceed=FALSE;
1859 switch(pDevice->byZoneType) {
1860 case 0x00: //USA:1~11
1861 if((byCurrChannel<1) ||(byCurrChannel>11))
1862 exceed = TRUE;
1863 break;
1864 case 0x01: //Japan:1~13
1865 case 0x02: //Europe:1~13
1866 if((byCurrChannel<1) ||(byCurrChannel>13))
1867 exceed = TRUE;
1868 break;
1869 default: //reserve for other zonetype
1870 break;
1873 return exceed;
1878 * Routine Description:
1879 * Handles and analysis incoming beacon frames.
1882 * Return Value:
1883 * None.
1887 static
1888 VOID
1889 s_vMgrRxBeacon(
1890 IN PSDevice pDevice,
1891 IN PSMgmtObject pMgmt,
1892 IN PSRxMgmtPacket pRxPacket,
1893 IN BOOL bInScan
1897 PKnownBSS pBSSList;
1898 WLAN_FR_BEACON sFrame;
1899 QWORD qwTSFOffset;
1900 BOOL bIsBSSIDEqual = FALSE;
1901 BOOL bIsSSIDEqual = FALSE;
1902 BOOL bTSFLargeDiff = FALSE;
1903 BOOL bTSFOffsetPostive = FALSE;
1904 BOOL bUpdateTSF = FALSE;
1905 BOOL bIsAPBeacon = FALSE;
1906 BOOL bIsChannelEqual = FALSE;
1907 UINT uLocateByteIndex;
1908 BYTE byTIMBitOn = 0;
1909 WORD wAIDNumber = 0;
1910 UINT uNodeIndex;
1911 QWORD qwTimestamp, qwLocalTSF;
1912 QWORD qwCurrTSF;
1913 WORD wStartIndex = 0;
1914 WORD wAIDIndex = 0;
1915 BYTE byCurrChannel = pRxPacket->byRxChannel;
1916 ERPObject sERP;
1917 UINT uRateLen = WLAN_RATES_MAXLEN;
1918 BOOL bChannelHit = FALSE;
1919 BYTE byOldPreambleType;
1923 if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP)
1924 return;
1926 memset(&sFrame, 0, sizeof(WLAN_FR_BEACON));
1927 sFrame.len = pRxPacket->cbMPDULen;
1928 sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
1930 // decode the beacon frame
1931 vMgrDecodeBeacon(&sFrame);
1933 if ((sFrame.pwBeaconInterval == 0) ||
1934 (sFrame.pwCapInfo == 0) ||
1935 (sFrame.pSSID == 0) ||
1936 (sFrame.pSuppRates == 0) ) {
1937 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Rx beacon frame error\n");
1938 return;
1942 if( byCurrChannel > CB_MAX_CHANNEL_24G )
1944 if (sFrame.pDSParms != NULL) {
1945 if (byCurrChannel == RFaby11aChannelIndex[sFrame.pDSParms->byCurrChannel-1])
1946 bChannelHit = TRUE;
1947 byCurrChannel = RFaby11aChannelIndex[sFrame.pDSParms->byCurrChannel-1];
1948 } else {
1949 bChannelHit = TRUE;
1952 } else {
1953 if (sFrame.pDSParms != NULL) {
1954 if (byCurrChannel == sFrame.pDSParms->byCurrChannel)
1955 bChannelHit = TRUE;
1956 byCurrChannel = sFrame.pDSParms->byCurrChannel;
1957 } else {
1958 bChannelHit = TRUE;
1962 //2008-0730-01<Add>by MikeLiu
1963 if(ChannelExceedZoneType(pDevice,byCurrChannel)==TRUE)
1964 return;
1966 if (sFrame.pERP != NULL) {
1967 sERP.byERP = sFrame.pERP->byContext;
1968 sERP.bERPExist = TRUE;
1970 } else {
1971 sERP.bERPExist = FALSE;
1972 sERP.byERP = 0;
1975 pBSSList = BSSpAddrIsInBSSList((HANDLE)pDevice, sFrame.pHdr->sA3.abyAddr3, sFrame.pSSID);
1976 if (pBSSList == NULL) {
1977 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Beacon/insert: RxChannel = : %d\n", byCurrChannel);
1978 BSSbInsertToBSSList((HANDLE)pDevice,
1979 sFrame.pHdr->sA3.abyAddr3,
1980 *sFrame.pqwTimestamp,
1981 *sFrame.pwBeaconInterval,
1982 *sFrame.pwCapInfo,
1983 byCurrChannel,
1984 sFrame.pSSID,
1985 sFrame.pSuppRates,
1986 sFrame.pExtSuppRates,
1987 &sERP,
1988 sFrame.pRSN,
1989 sFrame.pRSNWPA,
1990 sFrame.pIE_Country,
1991 sFrame.pIE_Quiet,
1992 sFrame.len - WLAN_HDR_ADDR3_LEN,
1993 sFrame.pHdr->sA4.abyAddr4, // payload of beacon
1994 (HANDLE)pRxPacket
1997 else {
1998 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"update bcn: RxChannel = : %d\n", byCurrChannel);
1999 BSSbUpdateToBSSList((HANDLE)pDevice,
2000 *sFrame.pqwTimestamp,
2001 *sFrame.pwBeaconInterval,
2002 *sFrame.pwCapInfo,
2003 byCurrChannel,
2004 bChannelHit,
2005 sFrame.pSSID,
2006 sFrame.pSuppRates,
2007 sFrame.pExtSuppRates,
2008 &sERP,
2009 sFrame.pRSN,
2010 sFrame.pRSNWPA,
2011 sFrame.pIE_Country,
2012 sFrame.pIE_Quiet,
2013 pBSSList,
2014 sFrame.len - WLAN_HDR_ADDR3_LEN,
2015 sFrame.pHdr->sA4.abyAddr4, // payload of probresponse
2016 (HANDLE)pRxPacket
2021 if (bInScan) {
2022 return;
2025 if(byCurrChannel == (BYTE)pMgmt->uCurrChannel)
2026 bIsChannelEqual = TRUE;
2028 if (bIsChannelEqual && (pMgmt->eCurrMode == WMAC_MODE_ESS_AP)) {
2030 // if rx beacon without ERP field
2031 if (sERP.bERPExist) {
2032 if (WLAN_GET_ERP_USE_PROTECTION(sERP.byERP)){
2033 pDevice->byERPFlag |= WLAN_SET_ERP_USE_PROTECTION(1);
2034 pDevice->wUseProtectCntDown = USE_PROTECT_PERIOD;
2037 else {
2038 pDevice->byERPFlag |= WLAN_SET_ERP_USE_PROTECTION(1);
2039 pDevice->wUseProtectCntDown = USE_PROTECT_PERIOD;
2042 if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
2043 if(!WLAN_GET_CAP_INFO_SHORTPREAMBLE(*sFrame.pwCapInfo))
2044 pDevice->byERPFlag |= WLAN_SET_ERP_BARKER_MODE(1);
2045 if(!sERP.bERPExist)
2046 pDevice->byERPFlag |= WLAN_SET_ERP_NONERP_PRESENT(1);
2050 // check if BSSID the same
2051 if (memcmp(sFrame.pHdr->sA3.abyAddr3,
2052 pMgmt->abyCurrBSSID,
2053 WLAN_BSSID_LEN) == 0) {
2055 bIsBSSIDEqual = TRUE;
2056 pDevice->uCurrRSSI = pRxPacket->uRSSI;
2057 pDevice->byCurrSQ = pRxPacket->bySQ;
2058 if (pMgmt->sNodeDBTable[0].uInActiveCount != 0) {
2059 pMgmt->sNodeDBTable[0].uInActiveCount = 0;
2060 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BCN:Wake Count= [%d]\n", pMgmt->wCountToWakeUp);
2063 // check if SSID the same
2064 if (sFrame.pSSID->len == ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->len) {
2065 if (memcmp(sFrame.pSSID->abySSID,
2066 ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->abySSID,
2067 sFrame.pSSID->len
2068 ) == 0) {
2069 bIsSSIDEqual = TRUE;
2073 if ((WLAN_GET_CAP_INFO_ESS(*sFrame.pwCapInfo)== TRUE) &&
2074 (bIsBSSIDEqual == TRUE) &&
2075 (bIsSSIDEqual == TRUE) &&
2076 (pMgmt->eCurrMode == WMAC_MODE_ESS_STA) &&
2077 (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
2078 // add state check to prevent reconnect fail since we'll receive Beacon
2080 bIsAPBeacon = TRUE;
2081 if (pBSSList != NULL) {
2083 // Sync ERP field
2084 if ((pBSSList->sERP.bERPExist == TRUE) && (pDevice->byBBType == BB_TYPE_11G)) {
2085 if ((pBSSList->sERP.byERP & WLAN_EID_ERP_USE_PROTECTION) != pDevice->bProtectMode) {//0000 0010
2086 pDevice->bProtectMode = (pBSSList->sERP.byERP & WLAN_EID_ERP_USE_PROTECTION);
2087 if (pDevice->bProtectMode) {
2088 MACvEnableProtectMD(pDevice);
2089 } else {
2090 MACvDisableProtectMD(pDevice);
2092 vUpdateIFS(pDevice);
2094 if ((pBSSList->sERP.byERP & WLAN_EID_ERP_NONERP_PRESENT) != pDevice->bNonERPPresent) {//0000 0001
2095 pDevice->bNonERPPresent = (pBSSList->sERP.byERP & WLAN_EID_ERP_USE_PROTECTION);
2097 if ((pBSSList->sERP.byERP & WLAN_EID_ERP_BARKER_MODE) != pDevice->bBarkerPreambleMd) {//0000 0100
2098 pDevice->bBarkerPreambleMd = (pBSSList->sERP.byERP & WLAN_EID_ERP_BARKER_MODE);
2099 //BarkerPreambleMd has higher priority than shortPreamble bit in Cap
2100 if (pDevice->bBarkerPreambleMd) {
2101 MACvEnableBarkerPreambleMd(pDevice);
2102 } else {
2103 MACvDisableBarkerPreambleMd(pDevice);
2107 // Sync Short Slot Time
2108 if (WLAN_GET_CAP_INFO_SHORTSLOTTIME(pBSSList->wCapInfo) != pDevice->bShortSlotTime) {
2109 BOOL bShortSlotTime;
2111 bShortSlotTime = WLAN_GET_CAP_INFO_SHORTSLOTTIME(pBSSList->wCapInfo);
2112 //DBG_PRN_WLAN05(("Set Short Slot Time: %d\n", pDevice->bShortSlotTime));
2113 //Kyle check if it is OK to set G.
2114 if (pDevice->byBBType == BB_TYPE_11A) {
2115 bShortSlotTime = TRUE;
2117 else if (pDevice->byBBType == BB_TYPE_11B) {
2118 bShortSlotTime = FALSE;
2120 if (bShortSlotTime != pDevice->bShortSlotTime) {
2121 pDevice->bShortSlotTime = bShortSlotTime;
2122 BBvSetShortSlotTime(pDevice);
2123 vUpdateIFS(pDevice);
2128 // Preamble may change dynamiclly
2130 byOldPreambleType = pDevice->byPreambleType;
2131 if (WLAN_GET_CAP_INFO_SHORTPREAMBLE(pBSSList->wCapInfo)) {
2132 pDevice->byPreambleType = pDevice->byShortPreamble;
2134 else {
2135 pDevice->byPreambleType = 0;
2137 if (pDevice->byPreambleType != byOldPreambleType)
2138 CARDvSetRSPINF(pDevice, (BYTE)pDevice->byBBType);
2140 // Basic Rate Set may change dynamiclly
2142 if (pBSSList->eNetworkTypeInUse == PHY_TYPE_11B) {
2143 uRateLen = WLAN_RATES_MAXLEN_11B;
2145 pMgmt->abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)pBSSList->abySuppRates,
2146 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
2147 uRateLen);
2148 pMgmt->abyCurrExtSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)pBSSList->abyExtSuppRates,
2149 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates,
2150 uRateLen);
2151 RATEvParseMaxRate( (PVOID)pDevice,
2152 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
2153 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates,
2154 TRUE,
2155 &(pMgmt->sNodeDBTable[0].wMaxBasicRate),
2156 &(pMgmt->sNodeDBTable[0].wMaxSuppRate),
2157 &(pMgmt->sNodeDBTable[0].wSuppRate),
2158 &(pMgmt->sNodeDBTable[0].byTopCCKBasicRate),
2159 &(pMgmt->sNodeDBTable[0].byTopOFDMBasicRate)
2165 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Beacon 2 \n");
2166 // check if CF field exisit
2167 if (WLAN_GET_CAP_INFO_ESS(*sFrame.pwCapInfo)) {
2168 if (sFrame.pCFParms->wCFPDurRemaining > 0) {
2169 // TODO: deal with CFP period to set NAV
2173 HIDWORD(qwTimestamp) = cpu_to_le32(HIDWORD(*sFrame.pqwTimestamp));
2174 LODWORD(qwTimestamp) = cpu_to_le32(LODWORD(*sFrame.pqwTimestamp));
2175 HIDWORD(qwLocalTSF) = HIDWORD(pRxPacket->qwLocalTSF);
2176 LODWORD(qwLocalTSF) = LODWORD(pRxPacket->qwLocalTSF);
2178 // check if beacon TSF larger or small than our local TSF
2179 if (HIDWORD(qwTimestamp) == HIDWORD(qwLocalTSF)) {
2180 if (LODWORD(qwTimestamp) >= LODWORD(qwLocalTSF)) {
2181 bTSFOffsetPostive = TRUE;
2183 else {
2184 bTSFOffsetPostive = FALSE;
2187 else if (HIDWORD(qwTimestamp) > HIDWORD(qwLocalTSF)) {
2188 bTSFOffsetPostive = TRUE;
2190 else if (HIDWORD(qwTimestamp) < HIDWORD(qwLocalTSF)) {
2191 bTSFOffsetPostive = FALSE;
2194 if (bTSFOffsetPostive) {
2195 qwTSFOffset = CARDqGetTSFOffset(pRxPacket->byRxRate, (qwTimestamp), (qwLocalTSF));
2197 else {
2198 qwTSFOffset = CARDqGetTSFOffset(pRxPacket->byRxRate, (qwLocalTSF), (qwTimestamp));
2201 if (HIDWORD(qwTSFOffset) != 0 ||
2202 (LODWORD(qwTSFOffset) > TRIVIAL_SYNC_DIFFERENCE )) {
2203 bTSFLargeDiff = TRUE;
2207 // if infra mode
2208 if (bIsAPBeacon == TRUE) {
2210 // Infra mode: Local TSF always follow AP's TSF if Difference huge.
2211 if (bTSFLargeDiff)
2212 bUpdateTSF = TRUE;
2214 if ((pDevice->bEnablePSMode == TRUE) &&(sFrame.pTIM != 0)) {
2216 // deal with DTIM, analysis TIM
2217 pMgmt->bMulticastTIM = WLAN_MGMT_IS_MULTICAST_TIM(sFrame.pTIM->byBitMapCtl) ? TRUE : FALSE ;
2218 pMgmt->byDTIMCount = sFrame.pTIM->byDTIMCount;
2219 pMgmt->byDTIMPeriod = sFrame.pTIM->byDTIMPeriod;
2220 wAIDNumber = pMgmt->wCurrAID & ~(BIT14|BIT15);
2222 // check if AID in TIM field bit on
2223 // wStartIndex = N1
2224 wStartIndex = WLAN_MGMT_GET_TIM_OFFSET(sFrame.pTIM->byBitMapCtl) << 1;
2225 // AIDIndex = N2
2226 wAIDIndex = (wAIDNumber >> 3);
2227 if ((wAIDNumber > 0) && (wAIDIndex >= wStartIndex)) {
2228 uLocateByteIndex = wAIDIndex - wStartIndex;
2229 // len = byDTIMCount + byDTIMPeriod + byDTIMPeriod + byVirtBitMap[0~250]
2230 if (sFrame.pTIM->len >= (uLocateByteIndex + 4)) {
2231 byTIMBitOn = (0x01) << ((wAIDNumber) % 8);
2232 pMgmt->bInTIM = sFrame.pTIM->byVirtBitMap[uLocateByteIndex] & byTIMBitOn ? TRUE : FALSE;
2234 else {
2235 pMgmt->bInTIM = FALSE;
2238 else {
2239 pMgmt->bInTIM = FALSE;
2242 if (pMgmt->bInTIM ||
2243 (pMgmt->bMulticastTIM && (pMgmt->byDTIMCount == 0))) {
2244 pMgmt->bInTIMWake = TRUE;
2245 // send out ps-poll packet
2246 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "BCN:In TIM\n");
2247 if (pMgmt->bInTIM) {
2248 PSvSendPSPOLL((PSDevice)pDevice);
2249 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "BCN:PS-POLL sent..\n");
2253 else {
2254 pMgmt->bInTIMWake = FALSE;
2255 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "BCN: Not In TIM..\n");
2256 if (pDevice->bPWBitOn == FALSE) {
2257 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "BCN: Send Null Packet\n");
2258 if (PSbSendNullPacket(pDevice))
2259 pDevice->bPWBitOn = TRUE;
2261 if(PSbConsiderPowerDown(pDevice, FALSE, FALSE)) {
2262 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "BCN: Power down now...\n");
2269 // if adhoc mode
2270 if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) && !bIsAPBeacon && bIsChannelEqual) {
2271 if (bIsBSSIDEqual) {
2272 // Use sNodeDBTable[0].uInActiveCount as IBSS beacons received count.
2273 if (pMgmt->sNodeDBTable[0].uInActiveCount != 0)
2274 pMgmt->sNodeDBTable[0].uInActiveCount = 0;
2276 // adhoc mode:TSF updated only when beacon larger then local TSF
2277 if (bTSFLargeDiff && bTSFOffsetPostive &&
2278 (pMgmt->eCurrState == WMAC_STATE_JOINTED))
2279 bUpdateTSF = TRUE;
2281 // During dpc, already in spinlocked.
2282 if (BSSbIsSTAInNodeDB(pDevice, sFrame.pHdr->sA3.abyAddr2, &uNodeIndex)) {
2284 // Update the STA, (Techically the Beacons of all the IBSS nodes
2285 // should be identical, but that's not happening in practice.
2286 pMgmt->abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pSuppRates,
2287 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
2288 WLAN_RATES_MAXLEN_11B);
2289 RATEvParseMaxRate( (PVOID)pDevice,
2290 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
2291 NULL,
2292 TRUE,
2293 &(pMgmt->sNodeDBTable[uNodeIndex].wMaxBasicRate),
2294 &(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate),
2295 &(pMgmt->sNodeDBTable[uNodeIndex].wSuppRate),
2296 &(pMgmt->sNodeDBTable[uNodeIndex].byTopCCKBasicRate),
2297 &(pMgmt->sNodeDBTable[uNodeIndex].byTopOFDMBasicRate)
2299 pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble = WLAN_GET_CAP_INFO_SHORTPREAMBLE(*sFrame.pwCapInfo);
2300 pMgmt->sNodeDBTable[uNodeIndex].bShortSlotTime = WLAN_GET_CAP_INFO_SHORTSLOTTIME(*sFrame.pwCapInfo);
2301 pMgmt->sNodeDBTable[uNodeIndex].uInActiveCount = 0;
2303 else {
2304 // Todo, initial Node content
2305 BSSvCreateOneNode((PSDevice)pDevice, &uNodeIndex);
2307 pMgmt->abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pSuppRates,
2308 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
2309 WLAN_RATES_MAXLEN_11B);
2310 RATEvParseMaxRate( (PVOID)pDevice,
2311 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
2312 NULL,
2313 TRUE,
2314 &(pMgmt->sNodeDBTable[uNodeIndex].wMaxBasicRate),
2315 &(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate),
2316 &(pMgmt->sNodeDBTable[uNodeIndex].wSuppRate),
2317 &(pMgmt->sNodeDBTable[uNodeIndex].byTopCCKBasicRate),
2318 &(pMgmt->sNodeDBTable[uNodeIndex].byTopOFDMBasicRate)
2321 memcpy(pMgmt->sNodeDBTable[uNodeIndex].abyMACAddr, sFrame.pHdr->sA3.abyAddr2, WLAN_ADDR_LEN);
2322 pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble = WLAN_GET_CAP_INFO_SHORTPREAMBLE(*sFrame.pwCapInfo);
2323 pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate = pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate;
2325 pMgmt->sNodeDBTable[uNodeIndex].bShortSlotTime = WLAN_GET_CAP_INFO_SHORTSLOTTIME(*sFrame.pwCapInfo);
2326 if(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate > RATE_11M)
2327 pMgmt->sNodeDBTable[uNodeIndex].bERPExist = TRUE;
2331 // if other stations jointed, indicate connect to upper layer..
2332 if (pMgmt->eCurrState == WMAC_STATE_STARTED) {
2333 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Current IBSS State: [Started]........to: [Jointed] \n");
2334 pMgmt->eCurrState = WMAC_STATE_JOINTED;
2335 pDevice->bLinkPass = TRUE;
2336 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_INTER);
2337 if (netif_queue_stopped(pDevice->dev)){
2338 netif_wake_queue(pDevice->dev);
2340 pMgmt->sNodeDBTable[0].bActive = TRUE;
2341 pMgmt->sNodeDBTable[0].uInActiveCount = 0;
2345 else if (bIsSSIDEqual) {
2347 // See other adhoc sta with the same SSID but BSSID is different.
2348 // adpot this vars only when TSF larger then us.
2349 if (bTSFLargeDiff && bTSFOffsetPostive) {
2350 // we don't support ATIM under adhoc mode
2351 // if ( sFrame.pIBSSParms->wATIMWindow == 0) {
2352 // adpot this vars
2353 // TODO: check sFrame cap if privacy on, and support rate syn
2354 memcpy(pMgmt->abyCurrBSSID, sFrame.pHdr->sA3.abyAddr3, WLAN_BSSID_LEN);
2355 memcpy(pDevice->abyBSSID, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
2356 pMgmt->wCurrATIMWindow = cpu_to_le16(sFrame.pIBSSParms->wATIMWindow);
2357 pMgmt->wCurrBeaconPeriod = cpu_to_le16(*sFrame.pwBeaconInterval);
2358 pMgmt->abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pSuppRates,
2359 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
2360 WLAN_RATES_MAXLEN_11B);
2361 // set HW beacon interval and re-synchronizing....
2362 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Rejoining to Other Adhoc group with same SSID........\n");
2364 MACvWriteBeaconInterval(pDevice, pMgmt->wCurrBeaconPeriod);
2365 CARDvAdjustTSF(pDevice, pRxPacket->byRxRate, qwTimestamp, pRxPacket->qwLocalTSF);
2366 CARDvUpdateNextTBTT(pDevice, qwTimestamp, pMgmt->wCurrBeaconPeriod);
2368 // Turn off bssid filter to avoid filter others adhoc station which bssid is different.
2369 MACvWriteBSSIDAddress(pDevice, pMgmt->abyCurrBSSID);
2371 byOldPreambleType = pDevice->byPreambleType;
2372 if (WLAN_GET_CAP_INFO_SHORTPREAMBLE(*sFrame.pwCapInfo)) {
2373 pDevice->byPreambleType = pDevice->byShortPreamble;
2375 else {
2376 pDevice->byPreambleType = 0;
2378 if (pDevice->byPreambleType != byOldPreambleType)
2379 CARDvSetRSPINF(pDevice, (BYTE)pDevice->byBBType);
2382 // MACvRegBitsOff(pDevice->PortOffset, MAC_REG_RCR, RCR_BSSID);
2383 // set highest basic rate
2384 // s_vSetHighestBasicRate(pDevice, (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates);
2385 // Prepare beacon frame
2386 bMgrPrepareBeaconToSend((HANDLE)pDevice, pMgmt);
2387 // }
2391 // endian issue ???
2392 // Update TSF
2393 if (bUpdateTSF) {
2394 CARDbGetCurrentTSF(pDevice, &qwCurrTSF);
2395 CARDvAdjustTSF(pDevice, pRxPacket->byRxRate, qwTimestamp , pRxPacket->qwLocalTSF);
2396 CARDbGetCurrentTSF(pDevice, &qwCurrTSF);
2397 CARDvUpdateNextTBTT(pDevice, qwTimestamp, pMgmt->wCurrBeaconPeriod);
2400 return;
2407 * Routine Description:
2408 * Instructs the hw to create a bss using the supplied
2409 * attributes. Note that this implementation only supports Ad-Hoc
2410 * BSS creation.
2413 * Return Value:
2414 * CMD_STATUS
2417 VOID
2418 vMgrCreateOwnIBSS(
2419 IN HANDLE hDeviceContext,
2420 OUT PCMD_STATUS pStatus
2423 PSDevice pDevice = (PSDevice)hDeviceContext;
2424 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
2425 WORD wMaxBasicRate;
2426 WORD wMaxSuppRate;
2427 BYTE byTopCCKBasicRate;
2428 BYTE byTopOFDMBasicRate;
2429 QWORD qwCurrTSF;
2430 UINT ii;
2431 BYTE abyRATE[] = {0x82, 0x84, 0x8B, 0x96, 0x24, 0x30, 0x48, 0x6C, 0x0C, 0x12, 0x18, 0x60};
2432 BYTE abyCCK_RATE[] = {0x82, 0x84, 0x8B, 0x96};
2433 BYTE abyOFDM_RATE[] = {0x0C, 0x12, 0x18, 0x24, 0x30, 0x48, 0x60, 0x6C};
2434 WORD wSuppRate;
2438 HIDWORD(qwCurrTSF) = 0;
2439 LODWORD(qwCurrTSF) = 0;
2441 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Create Basic Service Set .......\n");
2443 if (pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA) {
2444 if ((pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) &&
2445 (pDevice->eEncryptionStatus != Ndis802_11Encryption2Enabled) &&
2446 (pDevice->eEncryptionStatus != Ndis802_11Encryption3Enabled)) {
2447 // encryption mode error
2448 *pStatus = CMD_STATUS_FAILURE;
2449 return;
2453 pMgmt->abyCurrSuppRates[0] = WLAN_EID_SUPP_RATES;
2454 pMgmt->abyCurrExtSuppRates[0] = WLAN_EID_EXTSUPP_RATES;
2456 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
2457 pMgmt->eCurrentPHYMode = pMgmt->byAPBBType;
2458 } else {
2459 if (pDevice->byBBType == BB_TYPE_11G)
2460 pMgmt->eCurrentPHYMode = PHY_TYPE_11G;
2461 if (pDevice->byBBType == BB_TYPE_11B)
2462 pMgmt->eCurrentPHYMode = PHY_TYPE_11B;
2463 if (pDevice->byBBType == BB_TYPE_11A)
2464 pMgmt->eCurrentPHYMode = PHY_TYPE_11A;
2467 if (pMgmt->eCurrentPHYMode != PHY_TYPE_11A) {
2468 pMgmt->abyCurrSuppRates[1] = WLAN_RATES_MAXLEN_11B;
2469 pMgmt->abyCurrExtSuppRates[1] = 0;
2470 for (ii = 0; ii < 4; ii++)
2471 pMgmt->abyCurrSuppRates[2+ii] = abyRATE[ii];
2472 } else {
2473 pMgmt->abyCurrSuppRates[1] = 8;
2474 pMgmt->abyCurrExtSuppRates[1] = 0;
2475 for (ii = 0; ii < 8; ii++)
2476 pMgmt->abyCurrSuppRates[2+ii] = abyRATE[ii];
2480 if (pMgmt->eCurrentPHYMode == PHY_TYPE_11G) {
2481 pMgmt->abyCurrSuppRates[1] = 8;
2482 pMgmt->abyCurrExtSuppRates[1] = 4;
2483 for (ii = 0; ii < 4; ii++)
2484 pMgmt->abyCurrSuppRates[2+ii] = abyCCK_RATE[ii];
2485 for (ii = 4; ii < 8; ii++)
2486 pMgmt->abyCurrSuppRates[2+ii] = abyOFDM_RATE[ii-4];
2487 for (ii = 0; ii < 4; ii++)
2488 pMgmt->abyCurrExtSuppRates[2+ii] = abyOFDM_RATE[ii+4];
2492 // Disable Protect Mode
2493 pDevice->bProtectMode = 0;
2494 MACvDisableProtectMD(pDevice);
2496 pDevice->bBarkerPreambleMd = 0;
2497 MACvDisableBarkerPreambleMd(pDevice);
2499 // Kyle Test 2003.11.04
2501 // set HW beacon interval
2502 if (pMgmt->wIBSSBeaconPeriod == 0)
2503 pMgmt->wIBSSBeaconPeriod = DEFAULT_IBSS_BI;
2504 MACvWriteBeaconInterval(pDevice, pMgmt->wIBSSBeaconPeriod);
2506 CARDbGetCurrentTSF(pDevice, &qwCurrTSF);
2507 // clear TSF counter
2508 CARDbClearCurrentTSF(pDevice);
2510 // enable TSF counter
2511 MACvRegBitsOn(pDevice,MAC_REG_TFTCTL,TFTCTL_TSFCNTREN);
2512 // set Next TBTT
2513 CARDvSetFirstNextTBTT(pDevice, pMgmt->wIBSSBeaconPeriod);
2515 pMgmt->uIBSSChannel = pDevice->uChannel;
2517 if (pMgmt->uIBSSChannel == 0)
2518 pMgmt->uIBSSChannel = DEFAULT_IBSS_CHANNEL;
2520 // set channel and clear NAV
2521 CARDbSetMediaChannel(pDevice, pMgmt->uIBSSChannel);
2522 pMgmt->uCurrChannel = pMgmt->uIBSSChannel;
2524 pDevice->byPreambleType = pDevice->byShortPreamble;
2526 // set basic rate
2528 RATEvParseMaxRate((PVOID)pDevice, (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
2529 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates, TRUE,
2530 &wMaxBasicRate, &wMaxSuppRate, &wSuppRate,
2531 &byTopCCKBasicRate, &byTopOFDMBasicRate);
2535 if (pDevice->byBBType == BB_TYPE_11A) {
2536 pDevice->bShortSlotTime = TRUE;
2537 } else {
2538 pDevice->bShortSlotTime = FALSE;
2540 BBvSetShortSlotTime(pDevice);
2541 // vUpdateIFS() use pDevice->bShortSlotTime as parameter so it must be called
2542 // after setting ShortSlotTime.
2543 // CARDvSetBSSMode call vUpdateIFS()
2544 CARDvSetBSSMode(pDevice);
2546 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
2547 MACvRegBitsOn(pDevice, MAC_REG_HOSTCR, HOSTCR_AP);
2548 pMgmt->eCurrMode = WMAC_MODE_ESS_AP;
2551 if (pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA) {
2552 MACvRegBitsOn(pDevice, MAC_REG_HOSTCR, HOSTCR_ADHOC);
2553 pMgmt->eCurrMode = WMAC_MODE_IBSS_STA;
2556 // Adopt pre-configured IBSS vars to current vars
2557 pMgmt->eCurrState = WMAC_STATE_STARTED;
2558 pMgmt->wCurrBeaconPeriod = pMgmt->wIBSSBeaconPeriod;
2559 pMgmt->uCurrChannel = pMgmt->uIBSSChannel;
2560 pMgmt->wCurrATIMWindow = pMgmt->wIBSSATIMWindow;
2561 pDevice->uCurrRSSI = 0;
2562 pDevice->byCurrSQ = 0;
2564 //20080131-04,<Add> by Mike Liu
2565 #ifdef Adhoc_STA
2566 memcpy(pMgmt->abyDesireSSID,pMgmt->abyAdHocSSID,
2567 ((PWLAN_IE_SSID)pMgmt->abyAdHocSSID)->len + WLAN_IEHDR_LEN);
2568 #endif
2570 memset(pMgmt->abyCurrSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
2571 memcpy(pMgmt->abyCurrSSID,
2572 pMgmt->abyDesireSSID,
2573 ((PWLAN_IE_SSID)pMgmt->abyDesireSSID)->len + WLAN_IEHDR_LEN
2576 if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
2577 // AP mode BSSID = MAC addr
2578 memcpy(pMgmt->abyCurrBSSID, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
2579 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO"AP beacon created BSSID:%02x-%02x-%02x-%02x-%02x-%02x \n",
2580 pMgmt->abyCurrBSSID[0],
2581 pMgmt->abyCurrBSSID[1],
2582 pMgmt->abyCurrBSSID[2],
2583 pMgmt->abyCurrBSSID[3],
2584 pMgmt->abyCurrBSSID[4],
2585 pMgmt->abyCurrBSSID[5]
2589 if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
2591 // BSSID selected must be randomized as spec 11.1.3
2592 pMgmt->abyCurrBSSID[5] = (BYTE) (LODWORD(qwCurrTSF)& 0x000000ff);
2593 pMgmt->abyCurrBSSID[4] = (BYTE)((LODWORD(qwCurrTSF)& 0x0000ff00) >> 8);
2594 pMgmt->abyCurrBSSID[3] = (BYTE)((LODWORD(qwCurrTSF)& 0x00ff0000) >> 16);
2595 pMgmt->abyCurrBSSID[2] = (BYTE)((LODWORD(qwCurrTSF)& 0x00000ff0) >> 4);
2596 pMgmt->abyCurrBSSID[1] = (BYTE)((LODWORD(qwCurrTSF)& 0x000ff000) >> 12);
2597 pMgmt->abyCurrBSSID[0] = (BYTE)((LODWORD(qwCurrTSF)& 0x0ff00000) >> 20);
2598 pMgmt->abyCurrBSSID[5] ^= pMgmt->abyMACAddr[0];
2599 pMgmt->abyCurrBSSID[4] ^= pMgmt->abyMACAddr[1];
2600 pMgmt->abyCurrBSSID[3] ^= pMgmt->abyMACAddr[2];
2601 pMgmt->abyCurrBSSID[2] ^= pMgmt->abyMACAddr[3];
2602 pMgmt->abyCurrBSSID[1] ^= pMgmt->abyMACAddr[4];
2603 pMgmt->abyCurrBSSID[0] ^= pMgmt->abyMACAddr[5];
2604 pMgmt->abyCurrBSSID[0] &= ~IEEE_ADDR_GROUP;
2605 pMgmt->abyCurrBSSID[0] |= IEEE_ADDR_UNIVERSAL;
2608 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO"Adhoc beacon created bssid:%02x-%02x-%02x-%02x-%02x-%02x \n",
2609 pMgmt->abyCurrBSSID[0],
2610 pMgmt->abyCurrBSSID[1],
2611 pMgmt->abyCurrBSSID[2],
2612 pMgmt->abyCurrBSSID[3],
2613 pMgmt->abyCurrBSSID[4],
2614 pMgmt->abyCurrBSSID[5]
2618 // set BSSID filter
2619 MACvWriteBSSIDAddress(pDevice, pMgmt->abyCurrBSSID);
2620 memcpy(pDevice->abyBSSID, pMgmt->abyCurrBSSID, WLAN_ADDR_LEN);
2622 MACvRegBitsOn(pDevice, MAC_REG_RCR, RCR_BSSID);
2623 pDevice->byRxMode |= RCR_BSSID;
2624 pMgmt->bCurrBSSIDFilterOn = TRUE;
2626 // Set Capability Info
2627 pMgmt->wCurrCapInfo = 0;
2629 if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
2630 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_ESS(1);
2631 pMgmt->byDTIMPeriod = DEFAULT_DTIM_PERIOD;
2632 pMgmt->byDTIMCount = pMgmt->byDTIMPeriod - 1;
2633 pDevice->eOPMode = OP_MODE_AP;
2636 if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
2637 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_IBSS(1);
2638 pDevice->eOPMode = OP_MODE_ADHOC;
2641 if (pDevice->bEncryptionEnable) {
2642 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_PRIVACY(1);
2643 if (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) {
2644 if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2645 pMgmt->byCSSPK = KEY_CTL_CCMP;
2646 pMgmt->byCSSGK = KEY_CTL_CCMP;
2647 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2648 pMgmt->byCSSPK = KEY_CTL_TKIP;
2649 pMgmt->byCSSGK = KEY_CTL_TKIP;
2650 } else {
2651 pMgmt->byCSSPK = KEY_CTL_NONE;
2652 pMgmt->byCSSGK = KEY_CTL_WEP;
2654 } else {
2655 pMgmt->byCSSPK = KEY_CTL_WEP;
2656 pMgmt->byCSSGK = KEY_CTL_WEP;
2660 pMgmt->byERPContext = 0;
2662 if (pDevice->byPreambleType == 1) {
2663 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1);
2664 } else {
2665 pMgmt->wCurrCapInfo &= (~WLAN_SET_CAP_INFO_SHORTPREAMBLE(1));
2668 pMgmt->eCurrState = WMAC_STATE_STARTED;
2669 // Prepare beacon to send
2670 if (bMgrPrepareBeaconToSend((HANDLE)pDevice, pMgmt)) {
2671 *pStatus = CMD_STATUS_SUCCESS;
2673 return ;
2680 * Routine Description:
2681 * Instructs wmac to join a bss using the supplied attributes.
2682 * The arguments may the BSSID or SSID and the rest of the
2683 * attributes are obtained from the scan result of known bss list.
2686 * Return Value:
2687 * None.
2691 VOID
2692 vMgrJoinBSSBegin(
2693 IN HANDLE hDeviceContext,
2694 OUT PCMD_STATUS pStatus
2698 PSDevice pDevice = (PSDevice)hDeviceContext;
2699 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
2700 PKnownBSS pCurr = NULL;
2701 UINT ii, uu;
2702 PWLAN_IE_SUPP_RATES pItemRates = NULL;
2703 PWLAN_IE_SUPP_RATES pItemExtRates = NULL;
2704 PWLAN_IE_SSID pItemSSID;
2705 UINT uRateLen = WLAN_RATES_MAXLEN;
2706 WORD wMaxBasicRate = RATE_1M;
2707 WORD wMaxSuppRate = RATE_1M;
2708 WORD wSuppRate;
2709 BYTE byTopCCKBasicRate = RATE_1M;
2710 BYTE byTopOFDMBasicRate = RATE_1M;
2711 BOOL bShortSlotTime = FALSE;
2714 for (ii = 0; ii < MAX_BSS_NUM; ii++) {
2715 if (pMgmt->sBSSList[ii].bActive == TRUE)
2716 break;
2719 if (ii == MAX_BSS_NUM) {
2720 *pStatus = CMD_STATUS_RESOURCES;
2721 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "BSS finding:BSS list is empty.\n");
2722 return;
2725 // memset(pMgmt->abyDesireBSSID, 0, WLAN_BSSID_LEN);
2726 // Search known BSS list for prefer BSSID or SSID
2728 pCurr = BSSpSearchBSSList(pDevice,
2729 pMgmt->abyDesireBSSID,
2730 pMgmt->abyDesireSSID,
2731 pDevice->eConfigPHYMode
2734 if (pCurr == NULL){
2735 *pStatus = CMD_STATUS_RESOURCES;
2736 pItemSSID = (PWLAN_IE_SSID)pMgmt->abyDesireSSID;
2737 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Scanning [%s] not found, disconnected !\n", pItemSSID->abySSID);
2738 return;
2741 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "AP(BSS) finding:Found a AP(BSS)..\n");
2743 if (WLAN_GET_CAP_INFO_ESS(cpu_to_le16(pCurr->wCapInfo))){
2745 if ((pMgmt->eAuthenMode == WMAC_AUTH_WPA)||(pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK)) {
2747 if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2748 if (WPA_SearchRSN(0, WPA_TKIP, pCurr) == FALSE) {
2749 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"No match RSN info. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
2750 // encryption mode error
2751 pMgmt->eCurrState = WMAC_STATE_IDLE;
2752 return;
2754 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2755 if (WPA_SearchRSN(0, WPA_AESCCMP, pCurr) == FALSE) {
2756 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"No match RSN info. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
2757 // encryption mode error
2758 pMgmt->eCurrState = WMAC_STATE_IDLE;
2759 return;
2765 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
2766 //if(pDevice->bWPASuppWextEnabled == TRUE)
2767 Encyption_Rebuild(pDevice, pCurr);
2768 #endif
2770 // Infrastructure BSS
2771 s_vMgrSynchBSS(pDevice,
2772 WMAC_MODE_ESS_STA,
2773 pCurr,
2774 pStatus
2777 if (*pStatus == CMD_STATUS_SUCCESS){
2779 // Adopt this BSS state vars in Mgmt Object
2780 pMgmt->uCurrChannel = pCurr->uChannel;
2782 memset(pMgmt->abyCurrSuppRates, 0 , WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1);
2783 memset(pMgmt->abyCurrExtSuppRates, 0 , WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1);
2785 if (pCurr->eNetworkTypeInUse == PHY_TYPE_11B) {
2786 uRateLen = WLAN_RATES_MAXLEN_11B;
2789 pItemRates = (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates;
2790 pItemExtRates = (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates;
2792 // Parse Support Rate IE
2793 pItemRates->byElementID = WLAN_EID_SUPP_RATES;
2794 pItemRates->len = RATEuSetIE((PWLAN_IE_SUPP_RATES)pCurr->abySuppRates,
2795 pItemRates,
2796 uRateLen);
2798 // Parse Extension Support Rate IE
2799 pItemExtRates->byElementID = WLAN_EID_EXTSUPP_RATES;
2800 pItemExtRates->len = RATEuSetIE((PWLAN_IE_SUPP_RATES)pCurr->abyExtSuppRates,
2801 pItemExtRates,
2802 uRateLen);
2803 // Stuffing Rate IE
2804 if ((pItemExtRates->len > 0) && (pItemRates->len < 8)) {
2805 for (ii = 0; ii < (UINT)(8 - pItemRates->len); ) {
2806 pItemRates->abyRates[pItemRates->len + ii] = pItemExtRates->abyRates[ii];
2807 ii ++;
2808 if (pItemExtRates->len <= ii)
2809 break;
2811 pItemRates->len += (BYTE)ii;
2812 if (pItemExtRates->len - ii > 0) {
2813 pItemExtRates->len -= (BYTE)ii;
2814 for (uu = 0; uu < pItemExtRates->len; uu ++) {
2815 pItemExtRates->abyRates[uu] = pItemExtRates->abyRates[uu + ii];
2817 } else {
2818 pItemExtRates->len = 0;
2822 RATEvParseMaxRate((PVOID)pDevice, pItemRates, pItemExtRates, TRUE,
2823 &wMaxBasicRate, &wMaxSuppRate, &wSuppRate,
2824 &byTopCCKBasicRate, &byTopOFDMBasicRate);
2825 vUpdateIFS(pDevice);
2826 // TODO: deal with if wCapInfo the privacy is on, but station WEP is off
2827 // TODO: deal with if wCapInfo the PS-Pollable is on.
2828 pMgmt->wCurrBeaconPeriod = pCurr->wBeaconInterval;
2829 memset(pMgmt->abyCurrSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
2830 memcpy(pMgmt->abyCurrBSSID, pCurr->abyBSSID, WLAN_BSSID_LEN);
2831 memcpy(pMgmt->abyCurrSSID, pCurr->abySSID, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
2833 pMgmt->eCurrMode = WMAC_MODE_ESS_STA;
2835 pMgmt->eCurrState = WMAC_STATE_JOINTED;
2836 // Adopt BSS state in Adapter Device Object
2837 pDevice->eOPMode = OP_MODE_INFRASTRUCTURE;
2838 memcpy(pDevice->abyBSSID, pCurr->abyBSSID, WLAN_BSSID_LEN);
2840 // Add current BSS to Candidate list
2841 // This should only works for WPA2 BSS, and WPA2 BSS check must be done before.
2842 if (pMgmt->eAuthenMode == WMAC_AUTH_WPA2) {
2843 BOOL bResult = bAdd_PMKID_Candidate((HANDLE)pDevice, pMgmt->abyCurrBSSID, &pCurr->sRSNCapObj);
2844 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"bAdd_PMKID_Candidate: 1(%d)\n", bResult);
2845 if (bResult == FALSE) {
2846 vFlush_PMKID_Candidate((HANDLE)pDevice);
2847 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"vFlush_PMKID_Candidate: 4\n");
2848 bAdd_PMKID_Candidate((HANDLE)pDevice, pMgmt->abyCurrBSSID, &pCurr->sRSNCapObj);
2852 // Preamble type auto-switch: if AP can receive short-preamble cap,
2853 // we can turn on too.
2854 if (WLAN_GET_CAP_INFO_SHORTPREAMBLE(pCurr->wCapInfo)) {
2855 pDevice->byPreambleType = pDevice->byShortPreamble;
2857 else {
2858 pDevice->byPreambleType = 0;
2860 // Change PreambleType must set RSPINF again
2861 CARDvSetRSPINF(pDevice, (BYTE)pDevice->byBBType);
2863 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Join ESS\n");
2865 if (pCurr->eNetworkTypeInUse == PHY_TYPE_11G) {
2867 if ((pCurr->sERP.byERP & WLAN_EID_ERP_USE_PROTECTION) != pDevice->bProtectMode) {//0000 0010
2868 pDevice->bProtectMode = (pCurr->sERP.byERP & WLAN_EID_ERP_USE_PROTECTION);
2869 if (pDevice->bProtectMode) {
2870 MACvEnableProtectMD(pDevice);
2871 } else {
2872 MACvDisableProtectMD(pDevice);
2874 vUpdateIFS(pDevice);
2876 if ((pCurr->sERP.byERP & WLAN_EID_ERP_NONERP_PRESENT) != pDevice->bNonERPPresent) {//0000 0001
2877 pDevice->bNonERPPresent = (pCurr->sERP.byERP & WLAN_EID_ERP_USE_PROTECTION);
2879 if ((pCurr->sERP.byERP & WLAN_EID_ERP_BARKER_MODE) != pDevice->bBarkerPreambleMd) {//0000 0100
2880 pDevice->bBarkerPreambleMd = (pCurr->sERP.byERP & WLAN_EID_ERP_BARKER_MODE);
2881 //BarkerPreambleMd has higher priority than shortPreamble bit in Cap
2882 if (pDevice->bBarkerPreambleMd) {
2883 MACvEnableBarkerPreambleMd(pDevice);
2884 } else {
2885 MACvDisableBarkerPreambleMd(pDevice);
2889 //DBG_PRN_WLAN05(("wCapInfo: %X\n", pCurr->wCapInfo));
2890 if (WLAN_GET_CAP_INFO_SHORTSLOTTIME(pCurr->wCapInfo) != pDevice->bShortSlotTime) {
2891 if (pDevice->byBBType == BB_TYPE_11A) {
2892 bShortSlotTime = TRUE;
2894 else if (pDevice->byBBType == BB_TYPE_11B) {
2895 bShortSlotTime = FALSE;
2897 else {
2898 bShortSlotTime = WLAN_GET_CAP_INFO_SHORTSLOTTIME(pCurr->wCapInfo);
2900 //DBG_PRN_WLAN05(("Set Short Slot Time: %d\n", pDevice->bShortSlotTime));
2901 if (bShortSlotTime != pDevice->bShortSlotTime) {
2902 pDevice->bShortSlotTime = bShortSlotTime;
2903 BBvSetShortSlotTime(pDevice);
2904 vUpdateIFS(pDevice);
2908 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"End of Join AP -- A/B/G Action\n");
2910 else {
2911 pMgmt->eCurrState = WMAC_STATE_IDLE;
2916 else {
2917 // ad-hoc mode BSS
2918 if (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) {
2920 if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2922 if (WPA_SearchRSN(0, WPA_TKIP, pCurr) == FALSE) {
2923 // encryption mode error
2924 pMgmt->eCurrState = WMAC_STATE_IDLE;
2925 return;
2928 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2930 if (WPA_SearchRSN(0, WPA_AESCCMP, pCurr) == FALSE) {
2931 // encryption mode error
2932 pMgmt->eCurrState = WMAC_STATE_IDLE;
2933 return;
2936 } else {
2937 // encryption mode error
2938 pMgmt->eCurrState = WMAC_STATE_IDLE;
2939 return;
2943 s_vMgrSynchBSS(pDevice,
2944 WMAC_MODE_IBSS_STA,
2945 pCurr,
2946 pStatus
2949 if (*pStatus == CMD_STATUS_SUCCESS){
2950 // Adopt this BSS state vars in Mgmt Object
2951 // TODO: check if CapInfo privacy on, but we don't..
2952 pMgmt->uCurrChannel = pCurr->uChannel;
2955 // Parse Support Rate IE
2956 pMgmt->abyCurrSuppRates[0] = WLAN_EID_SUPP_RATES;
2957 pMgmt->abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)pCurr->abySuppRates,
2958 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
2959 WLAN_RATES_MAXLEN_11B);
2960 // set basic rate
2961 RATEvParseMaxRate((PVOID)pDevice, (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
2962 NULL, TRUE, &wMaxBasicRate, &wMaxSuppRate, &wSuppRate,
2963 &byTopCCKBasicRate, &byTopOFDMBasicRate);
2964 vUpdateIFS(pDevice);
2965 pMgmt->wCurrCapInfo = pCurr->wCapInfo;
2966 pMgmt->wCurrBeaconPeriod = pCurr->wBeaconInterval;
2967 memset(pMgmt->abyCurrSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN);
2968 memcpy(pMgmt->abyCurrBSSID, pCurr->abyBSSID, WLAN_BSSID_LEN);
2969 memcpy(pMgmt->abyCurrSSID, pCurr->abySSID, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN);
2970 // pMgmt->wCurrATIMWindow = pCurr->wATIMWindow;
2971 pMgmt->eCurrMode = WMAC_MODE_IBSS_STA;
2972 pMgmt->eCurrState = WMAC_STATE_STARTED;
2973 // Adopt BSS state in Adapter Device Object
2974 pDevice->eOPMode = OP_MODE_ADHOC;
2975 pDevice->bLinkPass = TRUE;
2976 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_INTER);
2977 memcpy(pDevice->abyBSSID, pCurr->abyBSSID, WLAN_BSSID_LEN);
2979 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Join IBSS ok:%02x-%02x-%02x-%02x-%02x-%02x \n",
2980 pMgmt->abyCurrBSSID[0],
2981 pMgmt->abyCurrBSSID[1],
2982 pMgmt->abyCurrBSSID[2],
2983 pMgmt->abyCurrBSSID[3],
2984 pMgmt->abyCurrBSSID[4],
2985 pMgmt->abyCurrBSSID[5]
2987 // Preamble type auto-switch: if AP can receive short-preamble cap,
2988 // and if registry setting is short preamble we can turn on too.
2990 if (WLAN_GET_CAP_INFO_SHORTPREAMBLE(pCurr->wCapInfo)) {
2991 pDevice->byPreambleType = pDevice->byShortPreamble;
2993 else {
2994 pDevice->byPreambleType = 0;
2996 // Change PreambleType must set RSPINF again
2997 CARDvSetRSPINF(pDevice, (BYTE)pDevice->byBBType);
2999 // Prepare beacon
3000 bMgrPrepareBeaconToSend((HANDLE)pDevice, pMgmt);
3002 else {
3003 pMgmt->eCurrState = WMAC_STATE_IDLE;
3006 return;
3013 * Routine Description:
3014 * Set HW to synchronize a specific BSS from known BSS list.
3017 * Return Value:
3018 * PCM_STATUS
3021 static
3022 VOID
3023 s_vMgrSynchBSS (
3024 IN PSDevice pDevice,
3025 IN UINT uBSSMode,
3026 IN PKnownBSS pCurr,
3027 OUT PCMD_STATUS pStatus
3030 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
3031 //1M, 2M, 5M, 11M, 18M, 24M, 36M, 54M
3032 BYTE abyCurrSuppRatesG[] = {WLAN_EID_SUPP_RATES, 8, 0x02, 0x04, 0x0B, 0x16, 0x24, 0x30, 0x48, 0x6C};
3033 BYTE abyCurrExtSuppRatesG[] = {WLAN_EID_EXTSUPP_RATES, 4, 0x0C, 0x12, 0x18, 0x60};
3034 //6M, 9M, 12M, 48M
3035 BYTE abyCurrSuppRatesA[] = {WLAN_EID_SUPP_RATES, 8, 0x0C, 0x12, 0x18, 0x24, 0x30, 0x48, 0x60, 0x6C};
3036 BYTE abyCurrSuppRatesB[] = {WLAN_EID_SUPP_RATES, 4, 0x02, 0x04, 0x0B, 0x16};
3039 *pStatus = CMD_STATUS_FAILURE;
3041 if (s_bCipherMatch(pCurr,
3042 pDevice->eEncryptionStatus,
3043 &(pMgmt->byCSSPK),
3044 &(pMgmt->byCSSGK)) == FALSE) {
3045 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "s_bCipherMatch Fail .......\n");
3046 return;
3049 pMgmt->pCurrBSS = pCurr;
3051 // if previous mode is IBSS.
3052 if(pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
3053 MACvRegBitsOff(pDevice, MAC_REG_TCR, TCR_AUTOBCNTX);
3056 // Init the BSS informations
3057 pDevice->bCCK = TRUE;
3058 pDevice->bProtectMode = FALSE;
3059 MACvDisableProtectMD(pDevice);
3060 pDevice->bBarkerPreambleMd = FALSE;
3061 MACvDisableBarkerPreambleMd(pDevice);
3062 pDevice->bNonERPPresent = FALSE;
3063 pDevice->byPreambleType = 0;
3064 pDevice->wBasicRate = 0;
3065 // Set Basic Rate
3066 CARDbAddBasicRate((PVOID)pDevice, RATE_1M);
3068 // calculate TSF offset
3069 // TSF Offset = Received Timestamp TSF - Marked Local's TSF
3070 CARDvAdjustTSF(pDevice, pCurr->byRxRate, pCurr->qwBSSTimestamp, pCurr->qwLocalTSF);
3072 // set HW beacon interval
3073 MACvWriteBeaconInterval(pDevice, pCurr->wBeaconInterval);
3075 // set Next TBTT
3076 // Next TBTT = ((local_current_TSF / beacon_interval) + 1 ) * beacon_interval
3077 CARDvSetFirstNextTBTT(pDevice, pCurr->wBeaconInterval);
3079 // set BSSID
3080 MACvWriteBSSIDAddress(pDevice, pCurr->abyBSSID);
3082 MEMvCopy(pMgmt->abyCurrBSSID, pCurr->abyBSSID, 6);
3084 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Sync:set CurrBSSID address = %02x-%02x-%02x=%02x-%02x-%02x\n",
3085 pMgmt->abyCurrBSSID[0],
3086 pMgmt->abyCurrBSSID[1],
3087 pMgmt->abyCurrBSSID[2],
3088 pMgmt->abyCurrBSSID[3],
3089 pMgmt->abyCurrBSSID[4],
3090 pMgmt->abyCurrBSSID[5]);
3092 if (pCurr->eNetworkTypeInUse == PHY_TYPE_11A) {
3093 if ((pDevice->eConfigPHYMode == PHY_TYPE_11A) ||
3094 (pDevice->eConfigPHYMode == PHY_TYPE_AUTO)) {
3095 pDevice->byBBType = BB_TYPE_11A;
3096 pMgmt->eCurrentPHYMode = PHY_TYPE_11A;
3097 pDevice->bShortSlotTime = TRUE;
3098 BBvSetShortSlotTime(pDevice);
3099 CARDvSetBSSMode(pDevice);
3100 } else {
3101 return;
3103 } else if (pCurr->eNetworkTypeInUse == PHY_TYPE_11B) {
3104 if ((pDevice->eConfigPHYMode == PHY_TYPE_11B) ||
3105 (pDevice->eConfigPHYMode == PHY_TYPE_11G) ||
3106 (pDevice->eConfigPHYMode == PHY_TYPE_AUTO)) {
3107 pDevice->byBBType = BB_TYPE_11B;
3108 pMgmt->eCurrentPHYMode = PHY_TYPE_11B;
3109 pDevice->bShortSlotTime = FALSE;
3110 BBvSetShortSlotTime(pDevice);
3111 CARDvSetBSSMode(pDevice);
3112 } else {
3113 return;
3115 } else {
3116 if ((pDevice->eConfigPHYMode == PHY_TYPE_11G) ||
3117 (pDevice->eConfigPHYMode == PHY_TYPE_AUTO)) {
3118 pDevice->byBBType = BB_TYPE_11G;
3119 pMgmt->eCurrentPHYMode = PHY_TYPE_11G;
3120 pDevice->bShortSlotTime = TRUE;
3121 BBvSetShortSlotTime(pDevice);
3122 CARDvSetBSSMode(pDevice);
3123 } else if (pDevice->eConfigPHYMode == PHY_TYPE_11B) {
3124 pDevice->byBBType = BB_TYPE_11B;
3125 pDevice->bShortSlotTime = FALSE;
3126 BBvSetShortSlotTime(pDevice);
3127 CARDvSetBSSMode(pDevice);
3128 } else {
3129 return;
3133 if (uBSSMode == WMAC_MODE_ESS_STA) {
3134 MACvRegBitsOff(pDevice, MAC_REG_HOSTCR, HOSTCR_ADHOC);
3135 MACvRegBitsOn(pDevice, MAC_REG_RCR, RCR_BSSID);
3136 pDevice->byRxMode |= RCR_BSSID;
3137 pMgmt->bCurrBSSIDFilterOn = TRUE;
3140 // set channel and clear NAV
3141 CARDbSetMediaChannel(pDevice, pCurr->uChannel);
3142 pMgmt->uCurrChannel = pCurr->uChannel;
3143 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "<----s_bSynchBSS Set Channel [%d]\n", pCurr->uChannel);
3145 if ((pDevice->bUpdateBBVGA) &&
3146 (pDevice->byBBVGACurrent != pDevice->abyBBVGA[0])) {
3147 pDevice->byBBVGACurrent = pDevice->abyBBVGA[0];
3148 BBvSetVGAGainOffset(pDevice, pDevice->byBBVGACurrent);
3149 BBvSetShortSlotTime(pDevice);
3152 // Notes:
3153 // 1. In Ad-hoc mode : check if received others beacon as jointed indication,
3154 // otherwise we will start own IBSS.
3155 // 2. In Infra mode : Supposed we already synchronized with AP right now.
3157 if (uBSSMode == WMAC_MODE_IBSS_STA) {
3158 MACvRegBitsOn(pDevice, MAC_REG_HOSTCR, HOSTCR_ADHOC);
3159 MACvRegBitsOn(pDevice, MAC_REG_RCR, RCR_BSSID);
3160 pDevice->byRxMode |= RCR_BSSID;
3161 pMgmt->bCurrBSSIDFilterOn = TRUE;
3164 if (pDevice->byBBType == BB_TYPE_11A) {
3165 MEMvCopy(pMgmt->abyCurrSuppRates, &abyCurrSuppRatesA[0], sizeof(abyCurrSuppRatesA));
3166 pMgmt->abyCurrExtSuppRates[1] = 0;
3167 } else if (pDevice->byBBType == BB_TYPE_11B) {
3168 MEMvCopy(pMgmt->abyCurrSuppRates, &abyCurrSuppRatesB[0], sizeof(abyCurrSuppRatesB));
3169 pMgmt->abyCurrExtSuppRates[1] = 0;
3170 } else {
3171 MEMvCopy(pMgmt->abyCurrSuppRates, &abyCurrSuppRatesG[0], sizeof(abyCurrSuppRatesG));
3172 MEMvCopy(pMgmt->abyCurrExtSuppRates, &abyCurrExtSuppRatesG[0], sizeof(abyCurrExtSuppRatesG));
3174 pMgmt->byERPContext = pCurr->sERP.byERP;
3176 *pStatus = CMD_STATUS_SUCCESS;
3178 return;
3182 //mike add: fix NetworkManager 0.7.0 hidden ssid mode in WPA encryption
3183 // ,need reset eAuthenMode and eEncryptionStatus
3184 static VOID Encyption_Rebuild(
3185 IN PSDevice pDevice,
3186 IN PKnownBSS pCurr
3189 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
3190 // UINT ii , uSameBssidNum=0;
3192 // for (ii = 0; ii < MAX_BSS_NUM; ii++) {
3193 // if (pMgmt->sBSSList[ii].bActive &&
3194 // IS_ETH_ADDRESS_EQUAL(pMgmt->sBSSList[ii].abyBSSID, pCurr->abyBSSID)) {
3195 // uSameBssidNum++;
3196 // }
3197 // }
3198 // if( uSameBssidNum>=2) { //we only check AP in hidden sssid mode
3199 if ((pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK) || //networkmanager 0.7.0 does not give the pairwise-key selsection,
3200 (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK)) { // so we need re-selsect it according to real pairwise-key info.
3201 if(pCurr->bWPAValid == TRUE) { //WPA-PSK
3202 pMgmt->eAuthenMode = WMAC_AUTH_WPAPSK;
3203 if(pCurr->abyPKType[0] == WPA_TKIP) {
3204 pDevice->eEncryptionStatus = Ndis802_11Encryption2Enabled; //TKIP
3205 PRINT_K("Encyption_Rebuild--->ssid reset config to [WPAPSK-TKIP]\n");
3207 else if(pCurr->abyPKType[0] == WPA_AESCCMP) {
3208 pDevice->eEncryptionStatus = Ndis802_11Encryption3Enabled; //AES
3209 PRINT_K("Encyption_Rebuild--->ssid reset config to [WPAPSK-AES]\n");
3212 else if(pCurr->bWPA2Valid == TRUE) { //WPA2-PSK
3213 pMgmt->eAuthenMode = WMAC_AUTH_WPA2PSK;
3214 if(pCurr->abyCSSPK[0] == WLAN_11i_CSS_TKIP) {
3215 pDevice->eEncryptionStatus = Ndis802_11Encryption2Enabled; //TKIP
3216 PRINT_K("Encyption_Rebuild--->ssid reset config to [WPA2PSK-TKIP]\n");
3218 else if(pCurr->abyCSSPK[0] == WLAN_11i_CSS_CCMP) {
3219 pDevice->eEncryptionStatus = Ndis802_11Encryption3Enabled; //AES
3220 PRINT_K("Encyption_Rebuild--->ssid reset config to [WPA2PSK-AES]\n");
3224 // }
3225 return;
3231 * Routine Description:
3232 * Format TIM field
3235 * Return Value:
3236 * VOID
3240 static
3241 VOID
3242 s_vMgrFormatTIM(
3243 IN PSMgmtObject pMgmt,
3244 IN PWLAN_IE_TIM pTIM
3247 BYTE byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
3248 BYTE byMap;
3249 UINT ii, jj;
3250 BOOL bStartFound = FALSE;
3251 BOOL bMulticast = FALSE;
3252 WORD wStartIndex = 0;
3253 WORD wEndIndex = 0;
3256 // Find size of partial virtual bitmap
3257 for (ii = 0; ii < (MAX_NODE_NUM + 1); ii++) {
3258 byMap = pMgmt->abyPSTxMap[ii];
3259 if (!ii) {
3260 // Mask out the broadcast bit which is indicated separately.
3261 bMulticast = (byMap & byMask[0]) != 0;
3262 if(bMulticast) {
3263 pMgmt->sNodeDBTable[0].bRxPSPoll = TRUE;
3265 byMap = 0;
3267 if (byMap) {
3268 if (!bStartFound) {
3269 bStartFound = TRUE;
3270 wStartIndex = (WORD)ii;
3272 wEndIndex = (WORD)ii;
3277 // Round start index down to nearest even number
3278 wStartIndex &= ~BIT0;
3280 // Round end index up to nearest even number
3281 wEndIndex = ((wEndIndex + 1) & ~BIT0);
3283 // Size of element payload
3285 pTIM->len = 3 + (wEndIndex - wStartIndex) + 1;
3287 // Fill in the Fixed parts of the TIM
3288 pTIM->byDTIMCount = pMgmt->byDTIMCount;
3289 pTIM->byDTIMPeriod = pMgmt->byDTIMPeriod;
3290 pTIM->byBitMapCtl = (bMulticast ? TIM_MULTICAST_MASK : 0) |
3291 (((wStartIndex >> 1) << 1) & TIM_BITMAPOFFSET_MASK);
3293 // Append variable part of TIM
3295 for (ii = wStartIndex, jj =0 ; ii <= wEndIndex; ii++, jj++) {
3296 pTIM->byVirtBitMap[jj] = pMgmt->abyPSTxMap[ii];
3299 // Aid = 0 don't used.
3300 pTIM->byVirtBitMap[0] &= ~BIT0;
3306 * Routine Description:
3307 * Constructs an Beacon frame( Ad-hoc mode)
3310 * Return Value:
3311 * PTR to frame; or NULL on allocation failue
3315 static
3316 PSTxMgmtPacket
3317 s_MgrMakeBeacon(
3318 IN PSDevice pDevice,
3319 IN PSMgmtObject pMgmt,
3320 IN WORD wCurrCapInfo,
3321 IN WORD wCurrBeaconPeriod,
3322 IN UINT uCurrChannel,
3323 IN WORD wCurrATIMWinodw,
3324 IN PWLAN_IE_SSID pCurrSSID,
3325 IN PBYTE pCurrBSSID,
3326 IN PWLAN_IE_SUPP_RATES pCurrSuppRates,
3327 IN PWLAN_IE_SUPP_RATES pCurrExtSuppRates
3330 PSTxMgmtPacket pTxPacket = NULL;
3331 WLAN_FR_BEACON sFrame;
3332 BYTE abyBroadcastAddr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
3335 // prepare beacon frame
3336 pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
3337 memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_BEACON_FR_MAXLEN);
3338 pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
3339 // Setup the sFrame structure.
3340 sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
3341 sFrame.len = WLAN_BEACON_FR_MAXLEN;
3342 vMgrEncodeBeacon(&sFrame);
3343 // Setup the header
3344 sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
3346 WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
3347 WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_BEACON)
3350 if (pDevice->bEnablePSMode) {
3351 sFrame.pHdr->sA3.wFrameCtl |= cpu_to_le16((WORD)WLAN_SET_FC_PWRMGT(1));
3354 memcpy( sFrame.pHdr->sA3.abyAddr1, abyBroadcastAddr, WLAN_ADDR_LEN);
3355 memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
3356 memcpy( sFrame.pHdr->sA3.abyAddr3, pCurrBSSID, WLAN_BSSID_LEN);
3357 *sFrame.pwBeaconInterval = cpu_to_le16(wCurrBeaconPeriod);
3358 *sFrame.pwCapInfo = cpu_to_le16(wCurrCapInfo);
3359 // Copy SSID
3360 sFrame.pSSID = (PWLAN_IE_SSID)(sFrame.pBuf + sFrame.len);
3361 sFrame.len += ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->len + WLAN_IEHDR_LEN;
3362 memcpy(sFrame.pSSID,
3363 pCurrSSID,
3364 ((PWLAN_IE_SSID)pCurrSSID)->len + WLAN_IEHDR_LEN
3366 // Copy the rate set
3367 sFrame.pSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
3368 sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN;
3369 memcpy(sFrame.pSuppRates,
3370 pCurrSuppRates,
3371 ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN
3373 // DS parameter
3374 if (pDevice->byBBType != BB_TYPE_11A) {
3375 sFrame.pDSParms = (PWLAN_IE_DS_PARMS)(sFrame.pBuf + sFrame.len);
3376 sFrame.len += (1) + WLAN_IEHDR_LEN;
3377 sFrame.pDSParms->byElementID = WLAN_EID_DS_PARMS;
3378 sFrame.pDSParms->len = 1;
3379 sFrame.pDSParms->byCurrChannel = (BYTE)uCurrChannel;
3381 // TIM field
3382 if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
3383 sFrame.pTIM = (PWLAN_IE_TIM)(sFrame.pBuf + sFrame.len);
3384 sFrame.pTIM->byElementID = WLAN_EID_TIM;
3385 s_vMgrFormatTIM(pMgmt, sFrame.pTIM);
3386 sFrame.len += (WLAN_IEHDR_LEN + sFrame.pTIM->len);
3389 if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
3391 // IBSS parameter
3392 sFrame.pIBSSParms = (PWLAN_IE_IBSS_PARMS)(sFrame.pBuf + sFrame.len);
3393 sFrame.len += (2) + WLAN_IEHDR_LEN;
3394 sFrame.pIBSSParms->byElementID = WLAN_EID_IBSS_PARMS;
3395 sFrame.pIBSSParms->len = 2;
3396 sFrame.pIBSSParms->wATIMWindow = wCurrATIMWinodw;
3397 if (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) {
3398 /* RSN parameter */
3399 sFrame.pRSNWPA = (PWLAN_IE_RSN_EXT)(sFrame.pBuf + sFrame.len);
3400 sFrame.pRSNWPA->byElementID = WLAN_EID_RSN_WPA;
3401 sFrame.pRSNWPA->len = 12;
3402 sFrame.pRSNWPA->abyOUI[0] = 0x00;
3403 sFrame.pRSNWPA->abyOUI[1] = 0x50;
3404 sFrame.pRSNWPA->abyOUI[2] = 0xf2;
3405 sFrame.pRSNWPA->abyOUI[3] = 0x01;
3406 sFrame.pRSNWPA->wVersion = 1;
3407 sFrame.pRSNWPA->abyMulticast[0] = 0x00;
3408 sFrame.pRSNWPA->abyMulticast[1] = 0x50;
3409 sFrame.pRSNWPA->abyMulticast[2] = 0xf2;
3410 if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled)
3411 sFrame.pRSNWPA->abyMulticast[3] = 0x04;//AES
3412 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled)
3413 sFrame.pRSNWPA->abyMulticast[3] = 0x02;//TKIP
3414 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled)
3415 sFrame.pRSNWPA->abyMulticast[3] = 0x01;//WEP40
3416 else
3417 sFrame.pRSNWPA->abyMulticast[3] = 0x00;//NONE
3419 // Pairwise Key Cipher Suite
3420 sFrame.pRSNWPA->wPKCount = 0;
3421 // Auth Key Management Suite
3422 *((PWORD)(sFrame.pBuf + sFrame.len + sFrame.pRSNWPA->len))=0;
3423 sFrame.pRSNWPA->len +=2;
3425 // RSN Capabilites
3426 *((PWORD)(sFrame.pBuf + sFrame.len + sFrame.pRSNWPA->len))=0;
3427 sFrame.pRSNWPA->len +=2;
3428 sFrame.len += sFrame.pRSNWPA->len + WLAN_IEHDR_LEN;
3433 if (pMgmt->eCurrentPHYMode == PHY_TYPE_11G) {
3434 sFrame.pERP = (PWLAN_IE_ERP)(sFrame.pBuf + sFrame.len);
3435 sFrame.len += 1 + WLAN_IEHDR_LEN;
3436 sFrame.pERP->byElementID = WLAN_EID_ERP;
3437 sFrame.pERP->len = 1;
3438 sFrame.pERP->byContext = 0;
3439 if (pDevice->bProtectMode == TRUE)
3440 sFrame.pERP->byContext |= WLAN_EID_ERP_USE_PROTECTION;
3441 if (pDevice->bNonERPPresent == TRUE)
3442 sFrame.pERP->byContext |= WLAN_EID_ERP_NONERP_PRESENT;
3443 if (pDevice->bBarkerPreambleMd == TRUE)
3444 sFrame.pERP->byContext |= WLAN_EID_ERP_BARKER_MODE;
3446 if (((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len != 0) {
3447 sFrame.pExtSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
3448 sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
3449 MEMvCopy(sFrame.pExtSuppRates,
3450 pCurrExtSuppRates,
3451 ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN
3454 // hostapd wpa/wpa2 IE
3455 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) && (pDevice->bEnableHostapd == TRUE)) {
3456 if (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) {
3457 if (pMgmt->wWPAIELen != 0) {
3458 sFrame.pRSN = (PWLAN_IE_RSN)(sFrame.pBuf + sFrame.len);
3459 memcpy(sFrame.pRSN, pMgmt->abyWPAIE, pMgmt->wWPAIELen);
3460 sFrame.len += pMgmt->wWPAIELen;
3465 /* Adjust the length fields */
3466 pTxPacket->cbMPDULen = sFrame.len;
3467 pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
3469 return pTxPacket;
3478 * Routine Description:
3479 * Constructs an Prob-response frame
3482 * Return Value:
3483 * PTR to frame; or NULL on allocation failue
3490 PSTxMgmtPacket
3491 s_MgrMakeProbeResponse(
3492 IN PSDevice pDevice,
3493 IN PSMgmtObject pMgmt,
3494 IN WORD wCurrCapInfo,
3495 IN WORD wCurrBeaconPeriod,
3496 IN UINT uCurrChannel,
3497 IN WORD wCurrATIMWinodw,
3498 IN PBYTE pDstAddr,
3499 IN PWLAN_IE_SSID pCurrSSID,
3500 IN PBYTE pCurrBSSID,
3501 IN PWLAN_IE_SUPP_RATES pCurrSuppRates,
3502 IN PWLAN_IE_SUPP_RATES pCurrExtSuppRates,
3503 IN BYTE byPHYType
3506 PSTxMgmtPacket pTxPacket = NULL;
3507 WLAN_FR_PROBERESP sFrame;
3511 pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
3512 memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_PROBERESP_FR_MAXLEN);
3513 pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
3514 // Setup the sFrame structure.
3515 sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
3516 sFrame.len = WLAN_PROBERESP_FR_MAXLEN;
3517 vMgrEncodeProbeResponse(&sFrame);
3518 // Setup the header
3519 sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
3521 WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
3522 WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_PROBERESP)
3524 memcpy( sFrame.pHdr->sA3.abyAddr1, pDstAddr, WLAN_ADDR_LEN);
3525 memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
3526 memcpy( sFrame.pHdr->sA3.abyAddr3, pCurrBSSID, WLAN_BSSID_LEN);
3527 *sFrame.pwBeaconInterval = cpu_to_le16(wCurrBeaconPeriod);
3528 *sFrame.pwCapInfo = cpu_to_le16(wCurrCapInfo);
3530 if (byPHYType == BB_TYPE_11B) {
3531 *sFrame.pwCapInfo &= cpu_to_le16((WORD)~(WLAN_SET_CAP_INFO_SHORTSLOTTIME(1)));
3534 // Copy SSID
3535 sFrame.pSSID = (PWLAN_IE_SSID)(sFrame.pBuf + sFrame.len);
3536 sFrame.len += ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->len + WLAN_IEHDR_LEN;
3537 memcpy(sFrame.pSSID,
3538 pCurrSSID,
3539 ((PWLAN_IE_SSID)pCurrSSID)->len + WLAN_IEHDR_LEN
3541 // Copy the rate set
3542 sFrame.pSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
3544 sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN;
3545 memcpy(sFrame.pSuppRates,
3546 pCurrSuppRates,
3547 ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN
3550 // DS parameter
3551 if (pDevice->byBBType != BB_TYPE_11A) {
3552 sFrame.pDSParms = (PWLAN_IE_DS_PARMS)(sFrame.pBuf + sFrame.len);
3553 sFrame.len += (1) + WLAN_IEHDR_LEN;
3554 sFrame.pDSParms->byElementID = WLAN_EID_DS_PARMS;
3555 sFrame.pDSParms->len = 1;
3556 sFrame.pDSParms->byCurrChannel = (BYTE)uCurrChannel;
3559 if (pMgmt->eCurrMode != WMAC_MODE_ESS_AP) {
3560 // IBSS parameter
3561 sFrame.pIBSSParms = (PWLAN_IE_IBSS_PARMS)(sFrame.pBuf + sFrame.len);
3562 sFrame.len += (2) + WLAN_IEHDR_LEN;
3563 sFrame.pIBSSParms->byElementID = WLAN_EID_IBSS_PARMS;
3564 sFrame.pIBSSParms->len = 2;
3565 sFrame.pIBSSParms->wATIMWindow = 0;
3567 if (pDevice->byBBType == BB_TYPE_11G) {
3568 sFrame.pERP = (PWLAN_IE_ERP)(sFrame.pBuf + sFrame.len);
3569 sFrame.len += 1 + WLAN_IEHDR_LEN;
3570 sFrame.pERP->byElementID = WLAN_EID_ERP;
3571 sFrame.pERP->len = 1;
3572 sFrame.pERP->byContext = 0;
3573 if (pDevice->bProtectMode == TRUE)
3574 sFrame.pERP->byContext |= WLAN_EID_ERP_USE_PROTECTION;
3575 if (pDevice->bNonERPPresent == TRUE)
3576 sFrame.pERP->byContext |= WLAN_EID_ERP_NONERP_PRESENT;
3577 if (pDevice->bBarkerPreambleMd == TRUE)
3578 sFrame.pERP->byContext |= WLAN_EID_ERP_BARKER_MODE;
3581 if (((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len != 0) {
3582 sFrame.pExtSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
3583 sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
3584 MEMvCopy(sFrame.pExtSuppRates,
3585 pCurrExtSuppRates,
3586 ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN
3590 // hostapd wpa/wpa2 IE
3591 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) && (pDevice->bEnableHostapd == TRUE)) {
3592 if (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) {
3593 if (pMgmt->wWPAIELen != 0) {
3594 sFrame.pRSN = (PWLAN_IE_RSN)(sFrame.pBuf + sFrame.len);
3595 memcpy(sFrame.pRSN, pMgmt->abyWPAIE, pMgmt->wWPAIELen);
3596 sFrame.len += pMgmt->wWPAIELen;
3601 // Adjust the length fields
3602 pTxPacket->cbMPDULen = sFrame.len;
3603 pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
3605 return pTxPacket;
3612 * Routine Description:
3613 * Constructs an association request frame
3616 * Return Value:
3617 * A ptr to frame or NULL on allocation failue
3622 PSTxMgmtPacket
3623 s_MgrMakeAssocRequest(
3624 IN PSDevice pDevice,
3625 IN PSMgmtObject pMgmt,
3626 IN PBYTE pDAddr,
3627 IN WORD wCurrCapInfo,
3628 IN WORD wListenInterval,
3629 IN PWLAN_IE_SSID pCurrSSID,
3630 IN PWLAN_IE_SUPP_RATES pCurrRates,
3631 IN PWLAN_IE_SUPP_RATES pCurrExtSuppRates
3634 PSTxMgmtPacket pTxPacket = NULL;
3635 WLAN_FR_ASSOCREQ sFrame;
3636 PBYTE pbyIEs;
3637 PBYTE pbyRSN;
3640 pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
3641 memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_ASSOCREQ_FR_MAXLEN);
3642 pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
3643 // Setup the sFrame structure.
3644 sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
3645 sFrame.len = WLAN_ASSOCREQ_FR_MAXLEN;
3646 // format fixed field frame structure
3647 vMgrEncodeAssocRequest(&sFrame);
3648 // Setup the header
3649 sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
3651 WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
3652 WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_ASSOCREQ)
3654 memcpy( sFrame.pHdr->sA3.abyAddr1, pDAddr, WLAN_ADDR_LEN);
3655 memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
3656 memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
3658 // Set the capibility and listen interval
3659 *(sFrame.pwCapInfo) = cpu_to_le16(wCurrCapInfo);
3660 *(sFrame.pwListenInterval) = cpu_to_le16(wListenInterval);
3662 // sFrame.len point to end of fixed field
3663 sFrame.pSSID = (PWLAN_IE_SSID)(sFrame.pBuf + sFrame.len);
3664 sFrame.len += pCurrSSID->len + WLAN_IEHDR_LEN;
3665 memcpy(sFrame.pSSID, pCurrSSID, pCurrSSID->len + WLAN_IEHDR_LEN);
3667 pMgmt->sAssocInfo.AssocInfo.RequestIELength = pCurrSSID->len + WLAN_IEHDR_LEN;
3668 pMgmt->sAssocInfo.AssocInfo.OffsetRequestIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);
3669 pbyIEs = pMgmt->sAssocInfo.abyIEs;
3670 MEMvCopy(pbyIEs, pCurrSSID, pCurrSSID->len + WLAN_IEHDR_LEN);
3671 pbyIEs += pCurrSSID->len + WLAN_IEHDR_LEN;
3673 // Copy the rate set
3674 sFrame.pSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
3675 if ((pDevice->byBBType == BB_TYPE_11B) && (pCurrRates->len > 4))
3676 sFrame.len += 4 + WLAN_IEHDR_LEN;
3677 else
3678 sFrame.len += pCurrRates->len + WLAN_IEHDR_LEN;
3679 memcpy(sFrame.pSuppRates, pCurrRates, pCurrRates->len + WLAN_IEHDR_LEN);
3681 // Copy the extension rate set
3682 if ((pDevice->byBBType == BB_TYPE_11G) && (pCurrExtSuppRates->len > 0)) {
3683 sFrame.pExtSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
3684 sFrame.len += pCurrExtSuppRates->len + WLAN_IEHDR_LEN;
3685 memcpy(sFrame.pExtSuppRates, pCurrExtSuppRates, pCurrExtSuppRates->len + WLAN_IEHDR_LEN);
3688 pMgmt->sAssocInfo.AssocInfo.RequestIELength += pCurrRates->len + WLAN_IEHDR_LEN;
3689 MEMvCopy(pbyIEs, pCurrRates, pCurrRates->len + WLAN_IEHDR_LEN);
3690 pbyIEs += pCurrRates->len + WLAN_IEHDR_LEN;
3693 if (((pMgmt->eAuthenMode == WMAC_AUTH_WPA) ||
3694 (pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK) ||
3695 (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE)) &&
3696 (pMgmt->pCurrBSS != NULL)) {
3697 /* WPA IE */
3698 sFrame.pRSNWPA = (PWLAN_IE_RSN_EXT)(sFrame.pBuf + sFrame.len);
3699 sFrame.pRSNWPA->byElementID = WLAN_EID_RSN_WPA;
3700 sFrame.pRSNWPA->len = 16;
3701 sFrame.pRSNWPA->abyOUI[0] = 0x00;
3702 sFrame.pRSNWPA->abyOUI[1] = 0x50;
3703 sFrame.pRSNWPA->abyOUI[2] = 0xf2;
3704 sFrame.pRSNWPA->abyOUI[3] = 0x01;
3705 sFrame.pRSNWPA->wVersion = 1;
3706 //Group Key Cipher Suite
3707 sFrame.pRSNWPA->abyMulticast[0] = 0x00;
3708 sFrame.pRSNWPA->abyMulticast[1] = 0x50;
3709 sFrame.pRSNWPA->abyMulticast[2] = 0xf2;
3710 if (pMgmt->byCSSGK == KEY_CTL_WEP) {
3711 sFrame.pRSNWPA->abyMulticast[3] = pMgmt->pCurrBSS->byGKType;
3712 } else if (pMgmt->byCSSGK == KEY_CTL_TKIP) {
3713 sFrame.pRSNWPA->abyMulticast[3] = WPA_TKIP;
3714 } else if (pMgmt->byCSSGK == KEY_CTL_CCMP) {
3715 sFrame.pRSNWPA->abyMulticast[3] = WPA_AESCCMP;
3716 } else {
3717 sFrame.pRSNWPA->abyMulticast[3] = WPA_NONE;
3719 // Pairwise Key Cipher Suite
3720 sFrame.pRSNWPA->wPKCount = 1;
3721 sFrame.pRSNWPA->PKSList[0].abyOUI[0] = 0x00;
3722 sFrame.pRSNWPA->PKSList[0].abyOUI[1] = 0x50;
3723 sFrame.pRSNWPA->PKSList[0].abyOUI[2] = 0xf2;
3724 if (pMgmt->byCSSPK == KEY_CTL_TKIP) {
3725 sFrame.pRSNWPA->PKSList[0].abyOUI[3] = WPA_TKIP;
3726 } else if (pMgmt->byCSSPK == KEY_CTL_CCMP) {
3727 sFrame.pRSNWPA->PKSList[0].abyOUI[3] = WPA_AESCCMP;
3728 } else {
3729 sFrame.pRSNWPA->PKSList[0].abyOUI[3] = WPA_NONE;
3731 // Auth Key Management Suite
3732 pbyRSN = (PBYTE)(sFrame.pBuf + sFrame.len + 2 + sFrame.pRSNWPA->len);
3733 *pbyRSN++=0x01;
3734 *pbyRSN++=0x00;
3735 *pbyRSN++=0x00;
3737 *pbyRSN++=0x50;
3738 *pbyRSN++=0xf2;
3739 if (pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK) {
3740 *pbyRSN++=WPA_AUTH_PSK;
3742 else if (pMgmt->eAuthenMode == WMAC_AUTH_WPA) {
3743 *pbyRSN++=WPA_AUTH_IEEE802_1X;
3745 else {
3746 *pbyRSN++=WPA_NONE;
3749 sFrame.pRSNWPA->len +=6;
3751 // RSN Capabilites
3753 *pbyRSN++=0x00;
3754 *pbyRSN++=0x00;
3755 sFrame.pRSNWPA->len +=2;
3757 sFrame.len += sFrame.pRSNWPA->len + WLAN_IEHDR_LEN;
3758 // copy to AssocInfo. for OID_802_11_ASSOCIATION_INFORMATION
3759 pMgmt->sAssocInfo.AssocInfo.RequestIELength += sFrame.pRSNWPA->len + WLAN_IEHDR_LEN;
3760 MEMvCopy(pbyIEs, sFrame.pRSNWPA, sFrame.pRSNWPA->len + WLAN_IEHDR_LEN);
3761 pbyIEs += sFrame.pRSNWPA->len + WLAN_IEHDR_LEN;
3763 } else if (((pMgmt->eAuthenMode == WMAC_AUTH_WPA2) ||
3764 (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK)) &&
3765 (pMgmt->pCurrBSS != NULL)) {
3766 UINT ii;
3767 PWORD pwPMKID;
3769 // WPA IE
3770 sFrame.pRSN = (PWLAN_IE_RSN)(sFrame.pBuf + sFrame.len);
3771 sFrame.pRSN->byElementID = WLAN_EID_RSN;
3772 sFrame.pRSN->len = 6; //Version(2)+GK(4)
3773 sFrame.pRSN->wVersion = 1;
3774 //Group Key Cipher Suite
3775 sFrame.pRSN->abyRSN[0] = 0x00;
3776 sFrame.pRSN->abyRSN[1] = 0x0F;
3777 sFrame.pRSN->abyRSN[2] = 0xAC;
3778 if (pMgmt->byCSSGK == KEY_CTL_WEP) {
3779 sFrame.pRSN->abyRSN[3] = pMgmt->pCurrBSS->byCSSGK;
3780 } else if (pMgmt->byCSSGK == KEY_CTL_TKIP) {
3781 sFrame.pRSN->abyRSN[3] = WLAN_11i_CSS_TKIP;
3782 } else if (pMgmt->byCSSGK == KEY_CTL_CCMP) {
3783 sFrame.pRSN->abyRSN[3] = WLAN_11i_CSS_CCMP;
3784 } else {
3785 sFrame.pRSN->abyRSN[3] = WLAN_11i_CSS_UNKNOWN;
3788 // Pairwise Key Cipher Suite
3789 sFrame.pRSN->abyRSN[4] = 1;
3790 sFrame.pRSN->abyRSN[5] = 0;
3791 sFrame.pRSN->abyRSN[6] = 0x00;
3792 sFrame.pRSN->abyRSN[7] = 0x0F;
3793 sFrame.pRSN->abyRSN[8] = 0xAC;
3794 if (pMgmt->byCSSPK == KEY_CTL_TKIP) {
3795 sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_TKIP;
3796 } else if (pMgmt->byCSSPK == KEY_CTL_CCMP) {
3797 sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_CCMP;
3798 } else if (pMgmt->byCSSPK == KEY_CTL_NONE) {
3799 sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_USE_GROUP;
3800 } else {
3801 sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_UNKNOWN;
3803 sFrame.pRSN->len += 6;
3805 // Auth Key Management Suite
3806 sFrame.pRSN->abyRSN[10] = 1;
3807 sFrame.pRSN->abyRSN[11] = 0;
3808 sFrame.pRSN->abyRSN[12] = 0x00;
3809 sFrame.pRSN->abyRSN[13] = 0x0F;
3810 sFrame.pRSN->abyRSN[14] = 0xAC;
3811 if (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK) {
3812 sFrame.pRSN->abyRSN[15] = WLAN_11i_AKMSS_PSK;
3813 } else if (pMgmt->eAuthenMode == WMAC_AUTH_WPA2) {
3814 sFrame.pRSN->abyRSN[15] = WLAN_11i_AKMSS_802_1X;
3815 } else {
3816 sFrame.pRSN->abyRSN[15] = WLAN_11i_AKMSS_UNKNOWN;
3818 sFrame.pRSN->len +=6;
3820 // RSN Capabilites
3821 if (pMgmt->pCurrBSS->sRSNCapObj.bRSNCapExist == TRUE) {
3822 MEMvCopy(&sFrame.pRSN->abyRSN[16], &pMgmt->pCurrBSS->sRSNCapObj.wRSNCap, 2);
3823 } else {
3824 sFrame.pRSN->abyRSN[16] = 0;
3825 sFrame.pRSN->abyRSN[17] = 0;
3827 sFrame.pRSN->len +=2;
3829 if ((pDevice->gsPMKID.BSSIDInfoCount > 0) && (pDevice->bRoaming == TRUE) && (pMgmt->eAuthenMode == WMAC_AUTH_WPA2)) {
3830 // RSN PMKID
3831 pbyRSN = &sFrame.pRSN->abyRSN[18];
3832 pwPMKID = (PWORD)pbyRSN; // Point to PMKID count
3833 *pwPMKID = 0; // Initialize PMKID count
3834 pbyRSN += 2; // Point to PMKID list
3835 for (ii = 0; ii < pDevice->gsPMKID.BSSIDInfoCount; ii++) {
3836 if (MEMEqualMemory(&pDevice->gsPMKID.BSSIDInfo[ii].BSSID[0], pMgmt->abyCurrBSSID, U_ETHER_ADDR_LEN)) {
3837 (*pwPMKID) ++;
3838 MEMvCopy(pbyRSN, pDevice->gsPMKID.BSSIDInfo[ii].PMKID, 16);
3839 pbyRSN += 16;
3842 if (*pwPMKID != 0) {
3843 sFrame.pRSN->len += (2 + (*pwPMKID)*16);
3847 sFrame.len += sFrame.pRSN->len + WLAN_IEHDR_LEN;
3848 // copy to AssocInfo. for OID_802_11_ASSOCIATION_INFORMATION
3849 pMgmt->sAssocInfo.AssocInfo.RequestIELength += sFrame.pRSN->len + WLAN_IEHDR_LEN;
3850 MEMvCopy(pbyIEs, sFrame.pRSN, sFrame.pRSN->len + WLAN_IEHDR_LEN);
3851 pbyIEs += sFrame.pRSN->len + WLAN_IEHDR_LEN;
3855 // Adjust the length fields
3856 pTxPacket->cbMPDULen = sFrame.len;
3857 pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
3858 return pTxPacket;
3870 * Routine Description:
3871 * Constructs an re-association request frame
3874 * Return Value:
3875 * A ptr to frame or NULL on allocation failue
3880 PSTxMgmtPacket
3881 s_MgrMakeReAssocRequest(
3882 IN PSDevice pDevice,
3883 IN PSMgmtObject pMgmt,
3884 IN PBYTE pDAddr,
3885 IN WORD wCurrCapInfo,
3886 IN WORD wListenInterval,
3887 IN PWLAN_IE_SSID pCurrSSID,
3888 IN PWLAN_IE_SUPP_RATES pCurrRates,
3889 IN PWLAN_IE_SUPP_RATES pCurrExtSuppRates
3892 PSTxMgmtPacket pTxPacket = NULL;
3893 WLAN_FR_REASSOCREQ sFrame;
3894 PBYTE pbyIEs;
3895 PBYTE pbyRSN;
3898 pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
3899 memset( pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_REASSOCREQ_FR_MAXLEN);
3900 pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
3901 /* Setup the sFrame structure. */
3902 sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
3903 sFrame.len = WLAN_REASSOCREQ_FR_MAXLEN;
3905 // format fixed field frame structure
3906 vMgrEncodeReassocRequest(&sFrame);
3908 /* Setup the header */
3909 sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
3911 WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
3912 WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_REASSOCREQ)
3914 memcpy( sFrame.pHdr->sA3.abyAddr1, pDAddr, WLAN_ADDR_LEN);
3915 memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
3916 memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
3918 /* Set the capibility and listen interval */
3919 *(sFrame.pwCapInfo) = cpu_to_le16(wCurrCapInfo);
3920 *(sFrame.pwListenInterval) = cpu_to_le16(wListenInterval);
3922 memcpy(sFrame.pAddrCurrAP, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
3923 /* Copy the SSID */
3924 /* sFrame.len point to end of fixed field */
3925 sFrame.pSSID = (PWLAN_IE_SSID)(sFrame.pBuf + sFrame.len);
3926 sFrame.len += pCurrSSID->len + WLAN_IEHDR_LEN;
3927 memcpy(sFrame.pSSID, pCurrSSID, pCurrSSID->len + WLAN_IEHDR_LEN);
3929 pMgmt->sAssocInfo.AssocInfo.RequestIELength = pCurrSSID->len + WLAN_IEHDR_LEN;
3930 pMgmt->sAssocInfo.AssocInfo.OffsetRequestIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);
3931 pbyIEs = pMgmt->sAssocInfo.abyIEs;
3932 MEMvCopy(pbyIEs, pCurrSSID, pCurrSSID->len + WLAN_IEHDR_LEN);
3933 pbyIEs += pCurrSSID->len + WLAN_IEHDR_LEN;
3935 /* Copy the rate set */
3936 /* sFrame.len point to end of SSID */
3937 sFrame.pSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
3938 sFrame.len += pCurrRates->len + WLAN_IEHDR_LEN;
3939 memcpy(sFrame.pSuppRates, pCurrRates, pCurrRates->len + WLAN_IEHDR_LEN);
3941 // Copy the extension rate set
3942 if ((pMgmt->eCurrentPHYMode == PHY_TYPE_11G) && (pCurrExtSuppRates->len > 0)) {
3943 sFrame.pExtSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
3944 sFrame.len += pCurrExtSuppRates->len + WLAN_IEHDR_LEN;
3945 memcpy(sFrame.pExtSuppRates, pCurrExtSuppRates, pCurrExtSuppRates->len + WLAN_IEHDR_LEN);
3948 pMgmt->sAssocInfo.AssocInfo.RequestIELength += pCurrRates->len + WLAN_IEHDR_LEN;
3949 MEMvCopy(pbyIEs, pCurrRates, pCurrRates->len + WLAN_IEHDR_LEN);
3950 pbyIEs += pCurrRates->len + WLAN_IEHDR_LEN;
3952 if (((pMgmt->eAuthenMode == WMAC_AUTH_WPA) ||
3953 (pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK) ||
3954 (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE)) &&
3955 (pMgmt->pCurrBSS != NULL)) {
3956 /* WPA IE */
3957 sFrame.pRSNWPA = (PWLAN_IE_RSN_EXT)(sFrame.pBuf + sFrame.len);
3958 sFrame.pRSNWPA->byElementID = WLAN_EID_RSN_WPA;
3959 sFrame.pRSNWPA->len = 16;
3960 sFrame.pRSNWPA->abyOUI[0] = 0x00;
3961 sFrame.pRSNWPA->abyOUI[1] = 0x50;
3962 sFrame.pRSNWPA->abyOUI[2] = 0xf2;
3963 sFrame.pRSNWPA->abyOUI[3] = 0x01;
3964 sFrame.pRSNWPA->wVersion = 1;
3965 //Group Key Cipher Suite
3966 sFrame.pRSNWPA->abyMulticast[0] = 0x00;
3967 sFrame.pRSNWPA->abyMulticast[1] = 0x50;
3968 sFrame.pRSNWPA->abyMulticast[2] = 0xf2;
3969 if (pMgmt->byCSSGK == KEY_CTL_WEP) {
3970 sFrame.pRSNWPA->abyMulticast[3] = pMgmt->pCurrBSS->byGKType;
3971 } else if (pMgmt->byCSSGK == KEY_CTL_TKIP) {
3972 sFrame.pRSNWPA->abyMulticast[3] = WPA_TKIP;
3973 } else if (pMgmt->byCSSGK == KEY_CTL_CCMP) {
3974 sFrame.pRSNWPA->abyMulticast[3] = WPA_AESCCMP;
3975 } else {
3976 sFrame.pRSNWPA->abyMulticast[3] = WPA_NONE;
3978 // Pairwise Key Cipher Suite
3979 sFrame.pRSNWPA->wPKCount = 1;
3980 sFrame.pRSNWPA->PKSList[0].abyOUI[0] = 0x00;
3981 sFrame.pRSNWPA->PKSList[0].abyOUI[1] = 0x50;
3982 sFrame.pRSNWPA->PKSList[0].abyOUI[2] = 0xf2;
3983 if (pMgmt->byCSSPK == KEY_CTL_TKIP) {
3984 sFrame.pRSNWPA->PKSList[0].abyOUI[3] = WPA_TKIP;
3985 } else if (pMgmt->byCSSPK == KEY_CTL_CCMP) {
3986 sFrame.pRSNWPA->PKSList[0].abyOUI[3] = WPA_AESCCMP;
3987 } else {
3988 sFrame.pRSNWPA->PKSList[0].abyOUI[3] = WPA_NONE;
3990 // Auth Key Management Suite
3991 pbyRSN = (PBYTE)(sFrame.pBuf + sFrame.len + 2 + sFrame.pRSNWPA->len);
3992 *pbyRSN++=0x01;
3993 *pbyRSN++=0x00;
3994 *pbyRSN++=0x00;
3996 *pbyRSN++=0x50;
3997 *pbyRSN++=0xf2;
3998 if (pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK) {
3999 *pbyRSN++=WPA_AUTH_PSK;
4000 } else if (pMgmt->eAuthenMode == WMAC_AUTH_WPA) {
4001 *pbyRSN++=WPA_AUTH_IEEE802_1X;
4002 } else {
4003 *pbyRSN++=WPA_NONE;
4006 sFrame.pRSNWPA->len +=6;
4008 // RSN Capabilites
4009 *pbyRSN++=0x00;
4010 *pbyRSN++=0x00;
4011 sFrame.pRSNWPA->len +=2;
4013 sFrame.len += sFrame.pRSNWPA->len + WLAN_IEHDR_LEN;
4014 // copy to AssocInfo. for OID_802_11_ASSOCIATION_INFORMATION
4015 pMgmt->sAssocInfo.AssocInfo.RequestIELength += sFrame.pRSNWPA->len + WLAN_IEHDR_LEN;
4016 MEMvCopy(pbyIEs, sFrame.pRSNWPA, sFrame.pRSNWPA->len + WLAN_IEHDR_LEN);
4017 pbyIEs += sFrame.pRSNWPA->len + WLAN_IEHDR_LEN;
4019 } else if (((pMgmt->eAuthenMode == WMAC_AUTH_WPA2) ||
4020 (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK)) &&
4021 (pMgmt->pCurrBSS != NULL)) {
4022 UINT ii;
4023 PWORD pwPMKID;
4025 /* WPA IE */
4026 sFrame.pRSN = (PWLAN_IE_RSN)(sFrame.pBuf + sFrame.len);
4027 sFrame.pRSN->byElementID = WLAN_EID_RSN;
4028 sFrame.pRSN->len = 6; //Version(2)+GK(4)
4029 sFrame.pRSN->wVersion = 1;
4030 //Group Key Cipher Suite
4031 sFrame.pRSN->abyRSN[0] = 0x00;
4032 sFrame.pRSN->abyRSN[1] = 0x0F;
4033 sFrame.pRSN->abyRSN[2] = 0xAC;
4034 if (pMgmt->byCSSGK == KEY_CTL_WEP) {
4035 sFrame.pRSN->abyRSN[3] = pMgmt->pCurrBSS->byCSSGK;
4036 } else if (pMgmt->byCSSGK == KEY_CTL_TKIP) {
4037 sFrame.pRSN->abyRSN[3] = WLAN_11i_CSS_TKIP;
4038 } else if (pMgmt->byCSSGK == KEY_CTL_CCMP) {
4039 sFrame.pRSN->abyRSN[3] = WLAN_11i_CSS_CCMP;
4040 } else {
4041 sFrame.pRSN->abyRSN[3] = WLAN_11i_CSS_UNKNOWN;
4044 // Pairwise Key Cipher Suite
4045 sFrame.pRSN->abyRSN[4] = 1;
4046 sFrame.pRSN->abyRSN[5] = 0;
4047 sFrame.pRSN->abyRSN[6] = 0x00;
4048 sFrame.pRSN->abyRSN[7] = 0x0F;
4049 sFrame.pRSN->abyRSN[8] = 0xAC;
4050 if (pMgmt->byCSSPK == KEY_CTL_TKIP) {
4051 sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_TKIP;
4052 } else if (pMgmt->byCSSPK == KEY_CTL_CCMP) {
4053 sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_CCMP;
4054 } else if (pMgmt->byCSSPK == KEY_CTL_NONE) {
4055 sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_USE_GROUP;
4056 } else {
4057 sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_UNKNOWN;
4059 sFrame.pRSN->len += 6;
4061 // Auth Key Management Suite
4062 sFrame.pRSN->abyRSN[10] = 1;
4063 sFrame.pRSN->abyRSN[11] = 0;
4064 sFrame.pRSN->abyRSN[12] = 0x00;
4065 sFrame.pRSN->abyRSN[13] = 0x0F;
4066 sFrame.pRSN->abyRSN[14] = 0xAC;
4067 if (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK) {
4068 sFrame.pRSN->abyRSN[15] = WLAN_11i_AKMSS_PSK;
4069 } else if (pMgmt->eAuthenMode == WMAC_AUTH_WPA2) {
4070 sFrame.pRSN->abyRSN[15] = WLAN_11i_AKMSS_802_1X;
4071 } else {
4072 sFrame.pRSN->abyRSN[15] = WLAN_11i_AKMSS_UNKNOWN;
4074 sFrame.pRSN->len +=6;
4076 // RSN Capabilites
4077 if (pMgmt->pCurrBSS->sRSNCapObj.bRSNCapExist == TRUE) {
4078 MEMvCopy(&sFrame.pRSN->abyRSN[16], &pMgmt->pCurrBSS->sRSNCapObj.wRSNCap, 2);
4079 } else {
4080 sFrame.pRSN->abyRSN[16] = 0;
4081 sFrame.pRSN->abyRSN[17] = 0;
4083 sFrame.pRSN->len +=2;
4085 if ((pDevice->gsPMKID.BSSIDInfoCount > 0) && (pDevice->bRoaming == TRUE) && (pMgmt->eAuthenMode == WMAC_AUTH_WPA2)) {
4086 // RSN PMKID
4087 pbyRSN = &sFrame.pRSN->abyRSN[18];
4088 pwPMKID = (PWORD)pbyRSN; // Point to PMKID count
4089 *pwPMKID = 0; // Initialize PMKID count
4090 pbyRSN += 2; // Point to PMKID list
4091 for (ii = 0; ii < pDevice->gsPMKID.BSSIDInfoCount; ii++) {
4092 if (MEMEqualMemory(&pDevice->gsPMKID.BSSIDInfo[ii].BSSID[0], pMgmt->abyCurrBSSID, U_ETHER_ADDR_LEN)) {
4093 (*pwPMKID) ++;
4094 MEMvCopy(pbyRSN, pDevice->gsPMKID.BSSIDInfo[ii].PMKID, 16);
4095 pbyRSN += 16;
4098 if (*pwPMKID != 0) {
4099 sFrame.pRSN->len += (2 + (*pwPMKID)*16);
4103 sFrame.len += sFrame.pRSN->len + WLAN_IEHDR_LEN;
4104 // copy to AssocInfo. for OID_802_11_ASSOCIATION_INFORMATION
4105 pMgmt->sAssocInfo.AssocInfo.RequestIELength += sFrame.pRSN->len + WLAN_IEHDR_LEN;
4106 MEMvCopy(pbyIEs, sFrame.pRSN, sFrame.pRSN->len + WLAN_IEHDR_LEN);
4107 pbyIEs += sFrame.pRSN->len + WLAN_IEHDR_LEN;
4112 /* Adjust the length fields */
4113 pTxPacket->cbMPDULen = sFrame.len;
4114 pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
4116 return pTxPacket;
4123 * Routine Description:
4124 * Constructs an assoc-response frame
4127 * Return Value:
4128 * PTR to frame; or NULL on allocation failue
4133 PSTxMgmtPacket
4134 s_MgrMakeAssocResponse(
4135 IN PSDevice pDevice,
4136 IN PSMgmtObject pMgmt,
4137 IN WORD wCurrCapInfo,
4138 IN WORD wAssocStatus,
4139 IN WORD wAssocAID,
4140 IN PBYTE pDstAddr,
4141 IN PWLAN_IE_SUPP_RATES pCurrSuppRates,
4142 IN PWLAN_IE_SUPP_RATES pCurrExtSuppRates
4145 PSTxMgmtPacket pTxPacket = NULL;
4146 WLAN_FR_ASSOCRESP sFrame;
4149 pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
4150 memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_ASSOCREQ_FR_MAXLEN);
4151 pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
4152 // Setup the sFrame structure
4153 sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
4154 sFrame.len = WLAN_REASSOCRESP_FR_MAXLEN;
4155 vMgrEncodeAssocResponse(&sFrame);
4156 // Setup the header
4157 sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
4159 WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
4160 WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_ASSOCRESP)
4162 memcpy( sFrame.pHdr->sA3.abyAddr1, pDstAddr, WLAN_ADDR_LEN);
4163 memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
4164 memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
4166 *sFrame.pwCapInfo = cpu_to_le16(wCurrCapInfo);
4167 *sFrame.pwStatus = cpu_to_le16(wAssocStatus);
4168 *sFrame.pwAid = cpu_to_le16((WORD)(wAssocAID | BIT14 | BIT15));
4170 // Copy the rate set
4171 sFrame.pSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
4172 sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN;
4173 memcpy(sFrame.pSuppRates,
4174 pCurrSuppRates,
4175 ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN
4178 if (((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len != 0) {
4179 sFrame.pExtSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
4180 sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
4181 MEMvCopy(sFrame.pExtSuppRates,
4182 pCurrExtSuppRates,
4183 ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN
4187 // Adjust the length fields
4188 pTxPacket->cbMPDULen = sFrame.len;
4189 pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
4191 return pTxPacket;
4197 * Routine Description:
4198 * Constructs an reassoc-response frame
4201 * Return Value:
4202 * PTR to frame; or NULL on allocation failue
4207 PSTxMgmtPacket
4208 s_MgrMakeReAssocResponse(
4209 IN PSDevice pDevice,
4210 IN PSMgmtObject pMgmt,
4211 IN WORD wCurrCapInfo,
4212 IN WORD wAssocStatus,
4213 IN WORD wAssocAID,
4214 IN PBYTE pDstAddr,
4215 IN PWLAN_IE_SUPP_RATES pCurrSuppRates,
4216 IN PWLAN_IE_SUPP_RATES pCurrExtSuppRates
4219 PSTxMgmtPacket pTxPacket = NULL;
4220 WLAN_FR_REASSOCRESP sFrame;
4223 pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
4224 memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_ASSOCREQ_FR_MAXLEN);
4225 pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
4226 // Setup the sFrame structure
4227 sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
4228 sFrame.len = WLAN_REASSOCRESP_FR_MAXLEN;
4229 vMgrEncodeReassocResponse(&sFrame);
4230 // Setup the header
4231 sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
4233 WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
4234 WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_REASSOCRESP)
4236 memcpy( sFrame.pHdr->sA3.abyAddr1, pDstAddr, WLAN_ADDR_LEN);
4237 memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
4238 memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
4240 *sFrame.pwCapInfo = cpu_to_le16(wCurrCapInfo);
4241 *sFrame.pwStatus = cpu_to_le16(wAssocStatus);
4242 *sFrame.pwAid = cpu_to_le16((WORD)(wAssocAID | BIT14 | BIT15));
4244 // Copy the rate set
4245 sFrame.pSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
4246 sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN;
4247 memcpy(sFrame.pSuppRates,
4248 pCurrSuppRates,
4249 ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN
4252 if (((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len != 0) {
4253 sFrame.pExtSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
4254 sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
4255 MEMvCopy(sFrame.pExtSuppRates,
4256 pCurrExtSuppRates,
4257 ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN
4261 // Adjust the length fields
4262 pTxPacket->cbMPDULen = sFrame.len;
4263 pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
4265 return pTxPacket;
4271 * Routine Description:
4272 * Handles probe response management frames.
4275 * Return Value:
4276 * none.
4280 static
4281 VOID
4282 s_vMgrRxProbeResponse(
4283 IN PSDevice pDevice,
4284 IN PSMgmtObject pMgmt,
4285 IN PSRxMgmtPacket pRxPacket
4288 PKnownBSS pBSSList = NULL;
4289 WLAN_FR_PROBERESP sFrame;
4290 BYTE byCurrChannel = pRxPacket->byRxChannel;
4291 ERPObject sERP;
4292 BOOL bChannelHit = TRUE;
4295 memset(&sFrame, 0, sizeof(WLAN_FR_PROBERESP));
4296 // decode the frame
4297 sFrame.len = pRxPacket->cbMPDULen;
4298 sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
4299 vMgrDecodeProbeResponse(&sFrame);
4301 if ((sFrame.pqwTimestamp == 0) ||
4302 (sFrame.pwBeaconInterval == 0) ||
4303 (sFrame.pwCapInfo == 0) ||
4304 (sFrame.pSSID == 0) ||
4305 (sFrame.pSuppRates == 0)) {
4306 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Probe resp:Fail addr:[%p] \n", pRxPacket->p80211Header);
4307 DBG_PORT80(0xCC);
4308 return;
4311 if(sFrame.pSSID->len == 0)
4312 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Rx Probe resp: SSID len = 0 \n");
4315 //{{ RobertYu:20050201, 11a byCurrChannel != sFrame.pDSParms->byCurrChannel mapping
4316 if( byCurrChannel > CB_MAX_CHANNEL_24G )
4318 if (sFrame.pDSParms != 0) {
4319 if (byCurrChannel == RFaby11aChannelIndex[sFrame.pDSParms->byCurrChannel-1])
4320 bChannelHit = TRUE;
4321 byCurrChannel = RFaby11aChannelIndex[sFrame.pDSParms->byCurrChannel-1];
4322 } else {
4323 bChannelHit = TRUE;
4326 } else {
4327 if (sFrame.pDSParms != 0) {
4328 if (byCurrChannel == sFrame.pDSParms->byCurrChannel)
4329 bChannelHit = TRUE;
4330 byCurrChannel = sFrame.pDSParms->byCurrChannel;
4331 } else {
4332 bChannelHit = TRUE;
4335 //RobertYu:20050201
4337 //2008-0730-01<Add>by MikeLiu
4338 if(ChannelExceedZoneType(pDevice,byCurrChannel)==TRUE)
4339 return;
4341 if (sFrame.pERP != NULL) {
4342 sERP.byERP = sFrame.pERP->byContext;
4343 sERP.bERPExist = TRUE;
4344 } else {
4345 sERP.bERPExist = FALSE;
4346 sERP.byERP = 0;
4350 // update or insert the bss
4351 pBSSList = BSSpAddrIsInBSSList((HANDLE)pDevice, sFrame.pHdr->sA3.abyAddr3, sFrame.pSSID);
4352 if (pBSSList) {
4353 BSSbUpdateToBSSList((HANDLE)pDevice,
4354 *sFrame.pqwTimestamp,
4355 *sFrame.pwBeaconInterval,
4356 *sFrame.pwCapInfo,
4357 byCurrChannel,
4358 bChannelHit,
4359 sFrame.pSSID,
4360 sFrame.pSuppRates,
4361 sFrame.pExtSuppRates,
4362 &sERP,
4363 sFrame.pRSN,
4364 sFrame.pRSNWPA,
4365 sFrame.pIE_Country,
4366 sFrame.pIE_Quiet,
4367 pBSSList,
4368 sFrame.len - WLAN_HDR_ADDR3_LEN,
4369 sFrame.pHdr->sA4.abyAddr4, // payload of probresponse
4370 (HANDLE)pRxPacket
4373 else {
4374 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Probe resp/insert: RxChannel = : %d\n", byCurrChannel);
4375 BSSbInsertToBSSList((HANDLE)pDevice,
4376 sFrame.pHdr->sA3.abyAddr3,
4377 *sFrame.pqwTimestamp,
4378 *sFrame.pwBeaconInterval,
4379 *sFrame.pwCapInfo,
4380 byCurrChannel,
4381 sFrame.pSSID,
4382 sFrame.pSuppRates,
4383 sFrame.pExtSuppRates,
4384 &sERP,
4385 sFrame.pRSN,
4386 sFrame.pRSNWPA,
4387 sFrame.pIE_Country,
4388 sFrame.pIE_Quiet,
4389 sFrame.len - WLAN_HDR_ADDR3_LEN,
4390 sFrame.pHdr->sA4.abyAddr4, // payload of beacon
4391 (HANDLE)pRxPacket
4394 return;
4400 * Routine Description:(AP)or(Ad-hoc STA)
4401 * Handles probe request management frames.
4404 * Return Value:
4405 * none.
4410 static
4411 VOID
4412 s_vMgrRxProbeRequest(
4413 IN PSDevice pDevice,
4414 IN PSMgmtObject pMgmt,
4415 IN PSRxMgmtPacket pRxPacket
4418 WLAN_FR_PROBEREQ sFrame;
4419 CMD_STATUS Status;
4420 PSTxMgmtPacket pTxPacket;
4421 BYTE byPHYType = BB_TYPE_11B;
4423 // STA in Ad-hoc mode: when latest TBTT beacon transmit success,
4424 // STA have to response this request.
4425 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
4426 ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) && pDevice->bBeaconSent)) {
4428 memset(&sFrame, 0, sizeof(WLAN_FR_PROBEREQ));
4429 // decode the frame
4430 sFrame.len = pRxPacket->cbMPDULen;
4431 sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
4432 vMgrDecodeProbeRequest(&sFrame);
4434 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Probe request rx:MAC addr:%02x-%02x-%02x=%02x-%02x-%02x \n",
4435 sFrame.pHdr->sA3.abyAddr2[0],
4436 sFrame.pHdr->sA3.abyAddr2[1],
4437 sFrame.pHdr->sA3.abyAddr2[2],
4438 sFrame.pHdr->sA3.abyAddr2[3],
4439 sFrame.pHdr->sA3.abyAddr2[4],
4440 sFrame.pHdr->sA3.abyAddr2[5]
4443 if (sFrame.pSSID->len != 0) {
4444 if (sFrame.pSSID->len != ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->len)
4445 return;
4446 if (memcmp(sFrame.pSSID->abySSID,
4447 ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->abySSID,
4448 ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->len) != 0) {
4449 return;
4453 if ((sFrame.pSuppRates->len > 4) || (sFrame.pExtSuppRates != NULL)) {
4454 byPHYType = BB_TYPE_11G;
4457 // Probe response reply..
4458 pTxPacket = s_MgrMakeProbeResponse
4460 pDevice,
4461 pMgmt,
4462 pMgmt->wCurrCapInfo,
4463 pMgmt->wCurrBeaconPeriod,
4464 pMgmt->uCurrChannel,
4466 sFrame.pHdr->sA3.abyAddr2,
4467 (PWLAN_IE_SSID)pMgmt->abyCurrSSID,
4468 (PBYTE)pMgmt->abyCurrBSSID,
4469 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
4470 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates,
4471 byPHYType
4473 if (pTxPacket != NULL ){
4474 /* send the frame */
4475 Status = csMgmt_xmit(pDevice, pTxPacket);
4476 if (Status != CMD_STATUS_PENDING) {
4477 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Probe response tx failed\n");
4479 else {
4480 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Probe response tx sending..\n");
4485 return;
4494 * Routine Description:
4496 * Entry point for the reception and handling of 802.11 management
4497 * frames. Makes a determination of the frame type and then calls
4498 * the appropriate function.
4501 * Return Value:
4502 * none.
4507 VOID
4508 vMgrRxManagePacket(
4509 IN HANDLE hDeviceContext,
4510 IN PSMgmtObject pMgmt,
4511 IN PSRxMgmtPacket pRxPacket
4514 PSDevice pDevice = (PSDevice)hDeviceContext;
4515 BOOL bInScan = FALSE;
4516 UINT uNodeIndex = 0;
4517 NODE_STATE eNodeState = 0;
4518 CMD_STATUS Status;
4521 if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
4522 if (BSSbIsSTAInNodeDB(pDevice, pRxPacket->p80211Header->sA3.abyAddr2, &uNodeIndex))
4523 eNodeState = pMgmt->sNodeDBTable[uNodeIndex].eNodeState;
4526 switch( WLAN_GET_FC_FSTYPE((pRxPacket->p80211Header->sA3.wFrameCtl)) ){
4528 case WLAN_FSTYPE_ASSOCREQ:
4529 // Frame Clase = 2
4530 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx assocreq\n");
4531 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) &&
4532 (eNodeState < NODE_AUTH)) {
4533 // send deauth notification
4534 // reason = (6) class 2 received from nonauth sta
4535 vMgrDeAuthenBeginSta(pDevice,
4536 pMgmt,
4537 pRxPacket->p80211Header->sA3.abyAddr2,
4538 (6),
4539 &Status
4541 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "wmgr: send vMgrDeAuthenBeginSta 1\n");
4543 else {
4544 s_vMgrRxAssocRequest(pDevice, pMgmt, pRxPacket, uNodeIndex);
4546 break;
4548 case WLAN_FSTYPE_ASSOCRESP:
4549 // Frame Clase = 2
4550 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx assocresp1\n");
4551 s_vMgrRxAssocResponse(pDevice, pMgmt, pRxPacket, FALSE);
4552 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx assocresp2\n");
4553 break;
4555 case WLAN_FSTYPE_REASSOCREQ:
4556 // Frame Clase = 2
4557 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx reassocreq\n");
4558 // Todo: reassoc
4559 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) &&
4560 (eNodeState < NODE_AUTH)) {
4561 // send deauth notification
4562 // reason = (6) class 2 received from nonauth sta
4563 vMgrDeAuthenBeginSta(pDevice,
4564 pMgmt,
4565 pRxPacket->p80211Header->sA3.abyAddr2,
4566 (6),
4567 &Status
4569 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "wmgr: send vMgrDeAuthenBeginSta 2\n");
4572 s_vMgrRxReAssocRequest(pDevice, pMgmt, pRxPacket, uNodeIndex);
4573 break;
4575 case WLAN_FSTYPE_REASSOCRESP:
4576 // Frame Clase = 2
4577 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx reassocresp\n");
4578 s_vMgrRxAssocResponse(pDevice, pMgmt, pRxPacket, TRUE);
4579 break;
4581 case WLAN_FSTYPE_PROBEREQ:
4582 // Frame Clase = 0
4583 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx probereq\n");
4584 s_vMgrRxProbeRequest(pDevice, pMgmt, pRxPacket);
4585 break;
4587 case WLAN_FSTYPE_PROBERESP:
4588 // Frame Clase = 0
4589 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx proberesp\n");
4591 s_vMgrRxProbeResponse(pDevice, pMgmt, pRxPacket);
4592 break;
4594 case WLAN_FSTYPE_BEACON:
4595 // Frame Clase = 0
4596 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx beacon\n");
4597 if (pMgmt->eScanState != WMAC_NO_SCANNING) {
4598 bInScan = TRUE;
4600 s_vMgrRxBeacon(pDevice, pMgmt, pRxPacket, bInScan);
4601 break;
4603 case WLAN_FSTYPE_ATIM:
4604 // Frame Clase = 1
4605 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx atim\n");
4606 break;
4608 case WLAN_FSTYPE_DISASSOC:
4609 // Frame Clase = 2
4610 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx disassoc\n");
4611 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) &&
4612 (eNodeState < NODE_AUTH)) {
4613 // send deauth notification
4614 // reason = (6) class 2 received from nonauth sta
4615 vMgrDeAuthenBeginSta(pDevice,
4616 pMgmt,
4617 pRxPacket->p80211Header->sA3.abyAddr2,
4618 (6),
4619 &Status
4621 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "wmgr: send vMgrDeAuthenBeginSta 3\n");
4623 s_vMgrRxDisassociation(pDevice, pMgmt, pRxPacket);
4624 break;
4626 case WLAN_FSTYPE_AUTHEN:
4627 // Frame Clase = 1
4628 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx authen\n");
4629 s_vMgrRxAuthentication(pDevice, pMgmt, pRxPacket);
4630 break;
4632 case WLAN_FSTYPE_DEAUTHEN:
4633 // Frame Clase = 1
4634 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx deauthen\n");
4635 s_vMgrRxDeauthentication(pDevice, pMgmt, pRxPacket);
4636 break;
4638 default:
4639 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx unknown mgmt\n");
4642 return;
4650 * Routine Description:
4653 * Prepare beacon to send
4655 * Return Value:
4656 * TRUE if success; FALSE if failed.
4659 BOOL
4660 bMgrPrepareBeaconToSend(
4661 IN HANDLE hDeviceContext,
4662 IN PSMgmtObject pMgmt
4665 PSDevice pDevice = (PSDevice)hDeviceContext;
4666 PSTxMgmtPacket pTxPacket;
4668 // pDevice->bBeaconBufReady = FALSE;
4669 if (pDevice->bEncryptionEnable || pDevice->bEnable8021x){
4670 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_PRIVACY(1);
4672 else {
4673 pMgmt->wCurrCapInfo &= ~WLAN_SET_CAP_INFO_PRIVACY(1);
4675 pTxPacket = s_MgrMakeBeacon
4677 pDevice,
4678 pMgmt,
4679 pMgmt->wCurrCapInfo,
4680 pMgmt->wCurrBeaconPeriod,
4681 pMgmt->uCurrChannel,
4682 pMgmt->wCurrATIMWindow, //0,
4683 (PWLAN_IE_SSID)pMgmt->abyCurrSSID,
4684 (PBYTE)pMgmt->abyCurrBSSID,
4685 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
4686 (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates
4689 if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) &&
4690 (pMgmt->abyCurrBSSID[0] == 0))
4691 return FALSE;
4693 csBeacon_xmit(pDevice, pTxPacket);
4694 MACvRegBitsOn(pDevice, MAC_REG_TCR, TCR_AUTOBCNTX);
4696 return TRUE;
4704 * Routine Description:
4706 * Log a warning message based on the contents of the Status
4707 * Code field of an 802.11 management frame. Defines are
4708 * derived from 802.11-1997 SPEC.
4710 * Return Value:
4711 * none.
4714 static
4715 VOID
4716 s_vMgrLogStatus(
4717 IN PSMgmtObject pMgmt,
4718 IN WORD wStatus
4721 switch( wStatus ){
4722 case WLAN_MGMT_STATUS_UNSPEC_FAILURE:
4723 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Unspecified error.\n");
4724 break;
4725 case WLAN_MGMT_STATUS_CAPS_UNSUPPORTED:
4726 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Can't support all requested capabilities.\n");
4727 break;
4728 case WLAN_MGMT_STATUS_REASSOC_NO_ASSOC:
4729 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Reassoc denied, can't confirm original Association.\n");
4730 break;
4731 case WLAN_MGMT_STATUS_ASSOC_DENIED_UNSPEC:
4732 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Assoc denied, undefine in spec\n");
4733 break;
4734 case WLAN_MGMT_STATUS_UNSUPPORTED_AUTHALG:
4735 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Peer doesn't support authen algorithm.\n");
4736 break;
4737 case WLAN_MGMT_STATUS_RX_AUTH_NOSEQ:
4738 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Authen frame received out of sequence.\n");
4739 break;
4740 case WLAN_MGMT_STATUS_CHALLENGE_FAIL:
4741 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Authen rejected, challenge failure.\n");
4742 break;
4743 case WLAN_MGMT_STATUS_AUTH_TIMEOUT:
4744 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Authen rejected, timeout waiting for next frame.\n");
4745 break;
4746 case WLAN_MGMT_STATUS_ASSOC_DENIED_BUSY:
4747 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Assoc denied, AP too busy.\n");
4748 break;
4749 case WLAN_MGMT_STATUS_ASSOC_DENIED_RATES:
4750 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Assoc denied, we haven't enough basic rates.\n");
4751 break;
4752 case WLAN_MGMT_STATUS_ASSOC_DENIED_SHORTPREAMBLE:
4753 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Assoc denied, we do not support short preamble.\n");
4754 break;
4755 case WLAN_MGMT_STATUS_ASSOC_DENIED_PBCC:
4756 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Assoc denied, we do not support PBCC.\n");
4757 break;
4758 case WLAN_MGMT_STATUS_ASSOC_DENIED_AGILITY:
4759 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Assoc denied, we do not support channel agility.\n");
4760 break;
4761 default:
4762 DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Unknown status code %d.\n", wStatus);
4763 break;
4770 * Description:
4771 * Add BSSID in PMKID Candidate list.
4773 * Parameters:
4774 * In:
4775 * hDeviceContext - device structure point
4776 * pbyBSSID - BSSID address for adding
4777 * wRSNCap - BSS's RSN capability
4778 * Out:
4779 * none
4781 * Return Value: none.
4784 BOOL
4785 bAdd_PMKID_Candidate (
4786 IN HANDLE hDeviceContext,
4787 IN PBYTE pbyBSSID,
4788 IN PSRSNCapObject psRSNCapObj
4791 PSDevice pDevice = (PSDevice)hDeviceContext;
4792 PPMKID_CANDIDATE pCandidateList;
4793 UINT ii = 0;
4795 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"bAdd_PMKID_Candidate START: (%d)\n", (int)pDevice->gsPMKIDCandidate.NumCandidates);
4797 if ((pDevice == NULL) || (pbyBSSID == NULL) || (psRSNCapObj == NULL))
4798 return FALSE;
4800 if (pDevice->gsPMKIDCandidate.NumCandidates >= MAX_PMKIDLIST)
4801 return FALSE;
4805 // Update Old Candidate
4806 for (ii = 0; ii < pDevice->gsPMKIDCandidate.NumCandidates; ii++) {
4807 pCandidateList = &pDevice->gsPMKIDCandidate.CandidateList[ii];
4808 if (MEMEqualMemory(pCandidateList->BSSID, pbyBSSID, U_ETHER_ADDR_LEN)) {
4809 if ((psRSNCapObj->bRSNCapExist == TRUE) && (psRSNCapObj->wRSNCap & BIT0)) {
4810 pCandidateList->Flags |= NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED;
4811 } else {
4812 pCandidateList->Flags &= ~(NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED);
4814 return TRUE;
4818 // New Candidate
4819 pCandidateList = &pDevice->gsPMKIDCandidate.CandidateList[pDevice->gsPMKIDCandidate.NumCandidates];
4820 if ((psRSNCapObj->bRSNCapExist == TRUE) && (psRSNCapObj->wRSNCap & BIT0)) {
4821 pCandidateList->Flags |= NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED;
4822 } else {
4823 pCandidateList->Flags &= ~(NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED);
4825 MEMvCopy(pCandidateList->BSSID, pbyBSSID, U_ETHER_ADDR_LEN);
4826 pDevice->gsPMKIDCandidate.NumCandidates++;
4827 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"NumCandidates:%d\n", (int)pDevice->gsPMKIDCandidate.NumCandidates);
4828 return TRUE;
4833 * Description:
4834 * Flush PMKID Candidate list.
4836 * Parameters:
4837 * In:
4838 * hDeviceContext - device structure point
4839 * Out:
4840 * none
4842 * Return Value: none.
4845 VOID
4846 vFlush_PMKID_Candidate (
4847 IN HANDLE hDeviceContext
4850 PSDevice pDevice = (PSDevice)hDeviceContext;
4852 if (pDevice == NULL)
4853 return;
4855 ZERO_MEMORY(&pDevice->gsPMKIDCandidate, sizeof(SPMKIDCandidateEvent));
4858 static BOOL
4859 s_bCipherMatch (
4860 IN PKnownBSS pBSSNode,
4861 IN NDIS_802_11_ENCRYPTION_STATUS EncStatus,
4862 OUT PBYTE pbyCCSPK,
4863 OUT PBYTE pbyCCSGK
4866 BYTE byMulticastCipher = KEY_CTL_INVALID;
4867 BYTE byCipherMask = 0x00;
4868 int i;
4870 if (pBSSNode == NULL)
4871 return FALSE;
4873 // check cap. of BSS
4874 if ((WLAN_GET_CAP_INFO_PRIVACY(pBSSNode->wCapInfo) != 0) &&
4875 (EncStatus == Ndis802_11Encryption1Enabled)) {
4876 // default is WEP only
4877 byMulticastCipher = KEY_CTL_WEP;
4880 if ((WLAN_GET_CAP_INFO_PRIVACY(pBSSNode->wCapInfo) != 0) &&
4881 (pBSSNode->bWPA2Valid == TRUE) &&
4882 //20080123-01,<Add> by Einsn Liu
4883 ((EncStatus == Ndis802_11Encryption3Enabled)||(EncStatus == Ndis802_11Encryption2Enabled))) {
4884 //WPA2
4885 // check Group Key Cipher
4886 if ((pBSSNode->byCSSGK == WLAN_11i_CSS_WEP40) ||
4887 (pBSSNode->byCSSGK == WLAN_11i_CSS_WEP104)) {
4888 byMulticastCipher = KEY_CTL_WEP;
4889 } else if (pBSSNode->byCSSGK == WLAN_11i_CSS_TKIP) {
4890 byMulticastCipher = KEY_CTL_TKIP;
4891 } else if (pBSSNode->byCSSGK == WLAN_11i_CSS_CCMP) {
4892 byMulticastCipher = KEY_CTL_CCMP;
4893 } else {
4894 byMulticastCipher = KEY_CTL_INVALID;
4897 // check Pairwise Key Cipher
4898 for(i=0;i<pBSSNode->wCSSPKCount;i++) {
4899 if ((pBSSNode->abyCSSPK[i] == WLAN_11i_CSS_WEP40) ||
4900 (pBSSNode->abyCSSPK[i] == WLAN_11i_CSS_WEP104)) {
4901 // this should not happen as defined 802.11i
4902 byCipherMask |= 0x01;
4903 } else if (pBSSNode->abyCSSPK[i] == WLAN_11i_CSS_TKIP) {
4904 byCipherMask |= 0x02;
4905 } else if (pBSSNode->abyCSSPK[i] == WLAN_11i_CSS_CCMP) {
4906 byCipherMask |= 0x04;
4907 } else if (pBSSNode->abyCSSPK[i] == WLAN_11i_CSS_USE_GROUP) {
4908 // use group key only ignore all others
4909 byCipherMask = 0;
4910 i = pBSSNode->wCSSPKCount;
4914 } else if ((WLAN_GET_CAP_INFO_PRIVACY(pBSSNode->wCapInfo) != 0) &&
4915 (pBSSNode->bWPAValid == TRUE) &&
4916 ((EncStatus == Ndis802_11Encryption2Enabled) || (EncStatus == Ndis802_11Encryption3Enabled))) {
4917 //WPA
4918 // check Group Key Cipher
4919 if ((pBSSNode->byGKType == WPA_WEP40) ||
4920 (pBSSNode->byGKType == WPA_WEP104)) {
4921 byMulticastCipher = KEY_CTL_WEP;
4922 } else if (pBSSNode->byGKType == WPA_TKIP) {
4923 byMulticastCipher = KEY_CTL_TKIP;
4924 } else if (pBSSNode->byGKType == WPA_AESCCMP) {
4925 byMulticastCipher = KEY_CTL_CCMP;
4926 } else {
4927 byMulticastCipher = KEY_CTL_INVALID;
4930 // check Pairwise Key Cipher
4931 for(i=0;i<pBSSNode->wPKCount;i++) {
4932 if (pBSSNode->abyPKType[i] == WPA_TKIP) {
4933 byCipherMask |= 0x02;
4934 } else if (pBSSNode->abyPKType[i] == WPA_AESCCMP) {
4935 byCipherMask |= 0x04;
4936 } else if (pBSSNode->abyPKType[i] == WPA_NONE) {
4937 // use group key only ignore all others
4938 byCipherMask = 0;
4939 i = pBSSNode->wPKCount;
4944 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%d, %d, %d, %d, EncStatus:%d\n",
4945 byMulticastCipher, byCipherMask, pBSSNode->bWPAValid, pBSSNode->bWPA2Valid, EncStatus);
4947 // mask our cap. with BSS
4948 if (EncStatus == Ndis802_11Encryption1Enabled) {
4950 // For supporting Cisco migration mode, don't care pairwise key cipher
4951 //if ((byMulticastCipher == KEY_CTL_WEP) &&
4952 // (byCipherMask == 0)) {
4953 if ((byMulticastCipher == KEY_CTL_WEP) &&
4954 (byCipherMask == 0)) {
4955 *pbyCCSGK = KEY_CTL_WEP;
4956 *pbyCCSPK = KEY_CTL_NONE;
4957 return TRUE;
4958 } else {
4959 return FALSE;
4962 } else if (EncStatus == Ndis802_11Encryption2Enabled) {
4963 if ((byMulticastCipher == KEY_CTL_TKIP) &&
4964 (byCipherMask == 0)) {
4965 *pbyCCSGK = KEY_CTL_TKIP;
4966 *pbyCCSPK = KEY_CTL_NONE;
4967 return TRUE;
4968 } else if ((byMulticastCipher == KEY_CTL_WEP) &&
4969 ((byCipherMask & 0x02) != 0)) {
4970 *pbyCCSGK = KEY_CTL_WEP;
4971 *pbyCCSPK = KEY_CTL_TKIP;
4972 return TRUE;
4973 } else if ((byMulticastCipher == KEY_CTL_TKIP) &&
4974 ((byCipherMask & 0x02) != 0)) {
4975 *pbyCCSGK = KEY_CTL_TKIP;
4976 *pbyCCSPK = KEY_CTL_TKIP;
4977 return TRUE;
4978 } else {
4979 return FALSE;
4981 } else if (EncStatus == Ndis802_11Encryption3Enabled) {
4982 if ((byMulticastCipher == KEY_CTL_CCMP) &&
4983 (byCipherMask == 0)) {
4984 // When CCMP is enable, "Use group cipher suite" shall not be a valid option.
4985 return FALSE;
4986 } else if ((byMulticastCipher == KEY_CTL_WEP) &&
4987 ((byCipherMask & 0x04) != 0)) {
4988 *pbyCCSGK = KEY_CTL_WEP;
4989 *pbyCCSPK = KEY_CTL_CCMP;
4990 return TRUE;
4991 } else if ((byMulticastCipher == KEY_CTL_TKIP) &&
4992 ((byCipherMask & 0x04) != 0)) {
4993 *pbyCCSGK = KEY_CTL_TKIP;
4994 *pbyCCSPK = KEY_CTL_CCMP;
4995 return TRUE;
4996 } else if ((byMulticastCipher == KEY_CTL_CCMP) &&
4997 ((byCipherMask & 0x04) != 0)) {
4998 *pbyCCSGK = KEY_CTL_CCMP;
4999 *pbyCCSPK = KEY_CTL_CCMP;
5000 return TRUE;
5001 } else {
5002 return FALSE;
5005 return TRUE;