2 *************************************************************************
4 * 5F., No.36, Taiyuan St., Jhubei City,
8 * (c) Copyright 2002-2007, Ralink Technology, Inc.
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
15 * This program is distributed in the hope that it will be useful, *
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
18 * GNU General Public License for more details. *
20 * You should have received a copy of the GNU General Public License *
21 * along with this program; if not, write to the *
22 * Free Software Foundation, Inc., *
23 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
25 *************************************************************************
34 -------- ---------- ----------------------------------------------
35 John 2004-08-08 Major modification from RT2560
37 #include "../rt_config.h"
39 UCHAR CipherSuiteWpaNoneTkip[] = {
40 0x00, 0x50, 0xf2, 0x01, // oui
41 0x01, 0x00, // Version
42 0x00, 0x50, 0xf2, 0x02, // Multicast
43 0x01, 0x00, // Number of unicast
44 0x00, 0x50, 0xf2, 0x02, // unicast
45 0x01, 0x00, // number of authentication method
46 0x00, 0x50, 0xf2, 0x00 // authentication
48 UCHAR CipherSuiteWpaNoneTkipLen = (sizeof(CipherSuiteWpaNoneTkip) / sizeof(UCHAR));
50 UCHAR CipherSuiteWpaNoneAes[] = {
51 0x00, 0x50, 0xf2, 0x01, // oui
52 0x01, 0x00, // Version
53 0x00, 0x50, 0xf2, 0x04, // Multicast
54 0x01, 0x00, // Number of unicast
55 0x00, 0x50, 0xf2, 0x04, // unicast
56 0x01, 0x00, // number of authentication method
57 0x00, 0x50, 0xf2, 0x00 // authentication
59 UCHAR CipherSuiteWpaNoneAesLen = (sizeof(CipherSuiteWpaNoneAes) / sizeof(UCHAR));
61 // The following MACRO is called after 1. starting an new IBSS, 2. succesfully JOIN an IBSS,
62 // or 3. succesfully ASSOCIATE to a BSS, 4. successfully RE_ASSOCIATE to a BSS
63 // All settings successfuly negotiated furing MLME state machines become final settings
64 // and are copied to pAd->StaActive
65 #define COPY_SETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(_pAd) \
67 (_pAd)->CommonCfg.SsidLen = (_pAd)->MlmeAux.SsidLen; \
68 NdisMoveMemory((_pAd)->CommonCfg.Ssid, (_pAd)->MlmeAux.Ssid, (_pAd)->MlmeAux.SsidLen); \
69 COPY_MAC_ADDR((_pAd)->CommonCfg.Bssid, (_pAd)->MlmeAux.Bssid); \
70 (_pAd)->CommonCfg.Channel = (_pAd)->MlmeAux.Channel; \
71 (_pAd)->CommonCfg.CentralChannel = (_pAd)->MlmeAux.CentralChannel; \
72 (_pAd)->StaActive.Aid = (_pAd)->MlmeAux.Aid; \
73 (_pAd)->StaActive.AtimWin = (_pAd)->MlmeAux.AtimWin; \
74 (_pAd)->StaActive.CapabilityInfo = (_pAd)->MlmeAux.CapabilityInfo; \
75 (_pAd)->CommonCfg.BeaconPeriod = (_pAd)->MlmeAux.BeaconPeriod; \
76 (_pAd)->StaActive.CfpMaxDuration = (_pAd)->MlmeAux.CfpMaxDuration; \
77 (_pAd)->StaActive.CfpPeriod = (_pAd)->MlmeAux.CfpPeriod; \
78 (_pAd)->StaActive.SupRateLen = (_pAd)->MlmeAux.SupRateLen; \
79 NdisMoveMemory((_pAd)->StaActive.SupRate, (_pAd)->MlmeAux.SupRate, (_pAd)->MlmeAux.SupRateLen);\
80 (_pAd)->StaActive.ExtRateLen = (_pAd)->MlmeAux.ExtRateLen; \
81 NdisMoveMemory((_pAd)->StaActive.ExtRate, (_pAd)->MlmeAux.ExtRate, (_pAd)->MlmeAux.ExtRateLen);\
82 NdisMoveMemory(&(_pAd)->CommonCfg.APEdcaParm, &(_pAd)->MlmeAux.APEdcaParm, sizeof(EDCA_PARM));\
83 NdisMoveMemory(&(_pAd)->CommonCfg.APQosCapability, &(_pAd)->MlmeAux.APQosCapability, sizeof(QOS_CAPABILITY_PARM));\
84 NdisMoveMemory(&(_pAd)->CommonCfg.APQbssLoad, &(_pAd)->MlmeAux.APQbssLoad, sizeof(QBSS_LOAD_PARM));\
85 COPY_MAC_ADDR((_pAd)->MacTab.Content[BSSID_WCID].Addr, (_pAd)->MlmeAux.Bssid); \
86 (_pAd)->MacTab.Content[BSSID_WCID].Aid = (_pAd)->MlmeAux.Aid; \
87 (_pAd)->MacTab.Content[BSSID_WCID].PairwiseKey.CipherAlg = (_pAd)->StaCfg.PairCipher;\
88 COPY_MAC_ADDR((_pAd)->MacTab.Content[BSSID_WCID].PairwiseKey.BssId, (_pAd)->MlmeAux.Bssid);\
89 (_pAd)->MacTab.Content[BSSID_WCID].RateLen = (_pAd)->StaActive.SupRateLen + (_pAd)->StaActive.ExtRateLen;\
93 ==========================================================================
98 ==========================================================================
101 IN PRTMP_ADAPTER pAd,
103 OUT STATE_MACHINE_FUNC Trans[])
105 // Control state machine differs from other state machines, the interface
106 // follows the standard interface
107 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
111 ==========================================================================
114 IRQL = DISPATCH_LEVEL
116 ==========================================================================
118 VOID MlmeCntlMachinePerformAction(
119 IN PRTMP_ADAPTER pAd,
121 IN MLME_QUEUE_ELEM *Elem)
123 switch(pAd->Mlme.CntlMachine.CurrState)
127 CntlIdleProc(pAd, Elem);
130 case CNTL_WAIT_DISASSOC:
131 CntlWaitDisassocProc(pAd, Elem);
134 CntlWaitJoinProc(pAd, Elem);
137 // CNTL_WAIT_REASSOC is the only state in CNTL machine that does
138 // not triggered directly or indirectly by "RTMPSetInformation(OID_xxx)".
139 // Therefore not protected by NDIS's "only one outstanding OID request"
140 // rule. Which means NDIS may SET OID in the middle of ROAMing attempts.
141 // Current approach is to block new SET request at RTMPSetInformation()
142 // when CntlMachine.CurrState is not CNTL_IDLE
143 case CNTL_WAIT_REASSOC:
144 CntlWaitReassocProc(pAd, Elem);
147 case CNTL_WAIT_START:
148 CntlWaitStartProc(pAd, Elem);
151 CntlWaitAuthProc(pAd, Elem);
153 case CNTL_WAIT_AUTH2:
154 CntlWaitAuthProc2(pAd, Elem);
156 case CNTL_WAIT_ASSOC:
157 CntlWaitAssocProc(pAd, Elem);
160 case CNTL_WAIT_OID_LIST_SCAN:
161 if(Elem->MsgType == MT2_SCAN_CONF)
163 // Resume TxRing after SCANING complete. We hope the out-of-service time
164 // won't be too long to let upper layer time-out the waiting frames
165 RTMPResumeMsduTransmission(pAd);
166 if (pAd->StaCfg.CCXReqType != MSRN_TYPE_UNUSED)
168 // Cisco scan request is finished, prepare beacon report
169 MlmeEnqueue(pAd, AIRONET_STATE_MACHINE, MT2_AIRONET_SCAN_DONE, 0, NULL);
171 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
174 // Set LED status to previous status.
176 if (pAd->bLedOnScanning)
178 pAd->bLedOnScanning = FALSE;
179 RTMPSetLED(pAd, pAd->LedStatus);
184 case CNTL_WAIT_OID_DISASSOC:
185 if (Elem->MsgType == MT2_DISASSOC_CONF)
187 LinkDown(pAd, FALSE);
188 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
193 // This state is for that we want to connect to an AP but
194 // it didn't find on BSS List table. So we need to scan the air first,
195 // after that we can try to connect to the desired AP if available.
197 case CNTL_WAIT_SCAN_FOR_CONNECT:
198 if(Elem->MsgType == MT2_SCAN_CONF)
200 // Resume TxRing after SCANING complete. We hope the out-of-service time
201 // won't be too long to let upper layer time-out the waiting frames
202 RTMPResumeMsduTransmission(pAd);
204 if (pAd->StaCfg.CCXReqType != MSRN_TYPE_UNUSED)
206 // Cisco scan request is finished, prepare beacon report
207 MlmeEnqueue(pAd, AIRONET_STATE_MACHINE, MT2_AIRONET_SCAN_DONE, 0, NULL);
209 #endif // CCX_SUPPORT //
210 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
213 // Check if we can connect to.
215 BssTableSsidSort(pAd, &pAd->MlmeAux.SsidBssTab, pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen);
216 if (pAd->MlmeAux.SsidBssTab.BssNr > 0)
218 MlmeAutoReconnectLastSSID(pAd);
224 DBGPRINT_ERR(("!ERROR! CNTL - Illegal message type(=%ld)", Elem->MsgType));
231 ==========================================================================
234 IRQL = DISPATCH_LEVEL
236 ==========================================================================
239 IN PRTMP_ADAPTER pAd,
240 IN MLME_QUEUE_ELEM *Elem)
242 MLME_DISASSOC_REQ_STRUCT DisassocReq;
244 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))
247 switch(Elem->MsgType)
249 case OID_802_11_SSID:
250 CntlOidSsidProc(pAd, Elem);
253 case OID_802_11_BSSID:
254 CntlOidRTBssidProc(pAd,Elem);
257 case OID_802_11_BSSID_LIST_SCAN:
258 CntlOidScanProc(pAd,Elem);
261 case OID_802_11_DISASSOCIATE:
262 DisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid, REASON_DISASSOC_STA_LEAVING);
263 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ, sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq);
264 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_DISASSOC;
265 #ifdef WPA_SUPPLICANT_SUPPORT
266 if (pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_ENABLE_WITH_WEB_UI)
267 #endif // WPA_SUPPLICANT_SUPPORT //
269 // Set the AutoReconnectSsid to prevent it reconnect to old SSID
270 // Since calling this indicate user don't want to connect to that SSID anymore.
271 pAd->MlmeAux.AutoReconnectSsidLen= 32;
272 NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen);
276 case MT2_MLME_ROAMING_REQ:
277 CntlMlmeRoamingProc(pAd, Elem);
280 case OID_802_11_MIC_FAILURE_REPORT_FRAME:
281 WpaMicFailureReportFrame(pAd, Elem);
285 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Illegal message in CntlIdleProc(MsgType=%ld)\n",Elem->MsgType));
290 VOID CntlOidScanProc(
291 IN PRTMP_ADAPTER pAd,
292 IN MLME_QUEUE_ELEM *Elem)
294 MLME_SCAN_REQ_STRUCT ScanReq;
295 ULONG BssIdx = BSS_NOT_FOUND;
298 // record current BSS if network is connected.
299 // 2003-2-13 do not include current IBSS if this is the only STA in this IBSS.
300 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))
302 BssIdx = BssSsidTableSearch(&pAd->ScanTab, pAd->CommonCfg.Bssid, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen, pAd->CommonCfg.Channel);
303 if (BssIdx != BSS_NOT_FOUND)
305 NdisMoveMemory(&CurrBss, &pAd->ScanTab.BssEntry[BssIdx], sizeof(BSS_ENTRY));
309 // clean up previous SCAN result, add current BSS back to table if any
310 BssTableInit(&pAd->ScanTab);
311 if (BssIdx != BSS_NOT_FOUND)
313 // DDK Note: If the NIC is associated with a particular BSSID and SSID
314 // that are not contained in the list of BSSIDs generated by this scan, the
315 // BSSID description of the currently associated BSSID and SSID should be
316 // appended to the list of BSSIDs in the NIC's database.
317 // To ensure this, we append this BSS as the first entry in SCAN result
318 NdisMoveMemory(&pAd->ScanTab.BssEntry[0], &CurrBss, sizeof(BSS_ENTRY));
319 pAd->ScanTab.BssNr = 1;
322 ScanParmFill(pAd, &ScanReq, "", 0, BSS_ANY, SCAN_ACTIVE);
323 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ,
324 sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq);
325 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN;
329 ==========================================================================
331 Before calling this routine, user desired SSID should already been
332 recorded in CommonCfg.Ssid[]
333 IRQL = DISPATCH_LEVEL
335 ==========================================================================
337 VOID CntlOidSsidProc(
338 IN PRTMP_ADAPTER pAd,
339 IN MLME_QUEUE_ELEM * Elem)
341 PNDIS_802_11_SSID pOidSsid = (NDIS_802_11_SSID *)Elem->Msg;
342 MLME_DISASSOC_REQ_STRUCT DisassocReq;
345 // Step 1. record the desired user settings to MlmeAux
346 NdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID);
347 NdisMoveMemory(pAd->MlmeAux.Ssid, pOidSsid->Ssid, pOidSsid->SsidLength);
348 pAd->MlmeAux.SsidLen = (UCHAR)pOidSsid->SsidLength;
349 NdisZeroMemory(pAd->MlmeAux.Bssid, MAC_ADDR_LEN);
350 pAd->MlmeAux.BssType = pAd->StaCfg.BssType;
354 // Update Reconnect Ssid, that user desired to connect.
356 NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, MAX_LEN_OF_SSID);
357 NdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen);
358 pAd->MlmeAux.AutoReconnectSsidLen = pAd->MlmeAux.SsidLen;
360 // step 2. find all matching BSS in the lastest SCAN result (inBssTab)
361 // & log them into MlmeAux.SsidBssTab for later-on iteration. Sort by RSSI order
362 BssTableSsidSort(pAd, &pAd->MlmeAux.SsidBssTab, pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen);
364 DBGPRINT(RT_DEBUG_TRACE, ("CntlOidSsidProc():CNTL - %d BSS of %d BSS match the desire (%d)SSID - %s\n",
365 pAd->MlmeAux.SsidBssTab.BssNr, pAd->ScanTab.BssNr, pAd->MlmeAux.SsidLen, pAd->MlmeAux.Ssid));
366 NdisGetSystemUpTime(&Now);
368 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) &&
369 (pAd->CommonCfg.SsidLen == pAd->MlmeAux.SsidBssTab.BssEntry[0].SsidLen) &&
370 NdisEqualMemory(pAd->CommonCfg.Ssid, pAd->MlmeAux.SsidBssTab.BssEntry[0].Ssid, pAd->CommonCfg.SsidLen) &&
371 MAC_ADDR_EQUAL(pAd->CommonCfg.Bssid, pAd->MlmeAux.SsidBssTab.BssEntry[0].Bssid))
373 // Case 1. already connected with an AP who has the desired SSID
376 // Add checking Mode "LEAP" for CCX 1.0
377 if (((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) ||
378 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
379 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) ||
380 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)
382 (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED))
384 // case 1.1 For WPA, WPA-PSK, if the 1x port is not secured, we have to redo
385 // connection process
386 DBGPRINT(RT_DEBUG_TRACE, ("CntlOidSsidProc():CNTL - disassociate with current AP...\n"));
387 DisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid, REASON_DISASSOC_STA_LEAVING);
388 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ,
389 sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq);
390 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC;
392 else if (pAd->bConfigChanged == TRUE)
394 // case 1.2 Important Config has changed, we have to reconnect to the same AP
395 DBGPRINT(RT_DEBUG_TRACE, ("CntlOidSsidProc():CNTL - disassociate with current AP Because config changed...\n"));
396 DisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid, REASON_DISASSOC_STA_LEAVING);
397 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ,
398 sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq);
399 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC;
403 // case 1.3. already connected to the SSID with highest RSSI.
404 DBGPRINT(RT_DEBUG_TRACE, ("CntlOidSsidProc():CNTL - already with this BSSID. ignore this SET_SSID request\n"));
406 // (HCT 12.1) 1c_wlan_mediaevents required
407 // media connect events are indicated when associating with the same AP
412 // Since MediaState already is NdisMediaStateConnected
413 // We just indicate the connect event again to meet the WHQL required.
415 pAd->IndicateMediaState = NdisMediaStateConnected;
416 RTMP_IndicateMediaState(pAd);
417 pAd->ExtraInfo = GENERAL_LINK_UP; // Update extra information to link is up
420 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
421 #ifdef NATIVE_WPA_SUPPLICANT_SUPPORT
423 union iwreq_data wrqu;
425 memset(wrqu.ap_addr.sa_data, 0, MAC_ADDR_LEN);
426 memcpy(wrqu.ap_addr.sa_data, pAd->MlmeAux.Bssid, MAC_ADDR_LEN);
427 wireless_send_event(pAd->net_dev, SIOCGIWAP, &wrqu, NULL);
430 #endif // NATIVE_WPA_SUPPLICANT_SUPPORT //
433 else if (INFRA_ON(pAd))
437 // [88888] OID_802_11_SSID should have returned NDTEST_WEP_AP2(Returned: )
438 // RT61 may lost SSID, and not connect to NDTEST_WEP_AP2 and will connect to NDTEST_WEP_AP2 by Autoreconnect
439 // But media status is connected, so the SSID not report correctly.
441 if (!SSID_EQUAL(pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen, pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen))
444 // Different SSID means not Roaming case, so we let LinkDown() to Indicate a disconnect event.
446 pAd->MlmeAux.CurrReqIsFromNdis = TRUE;
448 // case 2. active INFRA association existent
449 // roaming is done within miniport driver, nothing to do with configuration
450 // utility. so upon a new SET(OID_802_11_SSID) is received, we just
451 // disassociate with the current associated AP,
452 // then perform a new association with this new SSID, no matter the
453 // new/old SSID are the same or not.
454 DBGPRINT(RT_DEBUG_TRACE, ("CntlOidSsidProc():CNTL - disassociate with current AP...\n"));
455 DisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid, REASON_DISASSOC_STA_LEAVING);
456 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ,
457 sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq);
458 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC;
464 DBGPRINT(RT_DEBUG_TRACE, ("CntlOidSsidProc():CNTL - drop current ADHOC\n"));
465 LinkDown(pAd, FALSE);
466 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);
467 pAd->IndicateMediaState = NdisMediaStateDisconnected;
468 RTMP_IndicateMediaState(pAd);
469 pAd->ExtraInfo = GENERAL_LINK_DOWN;
470 DBGPRINT(RT_DEBUG_TRACE, ("CntlOidSsidProc():NDIS_STATUS_MEDIA_DISCONNECT Event C!\n"));
473 if ((pAd->MlmeAux.SsidBssTab.BssNr == 0) &&
474 (pAd->StaCfg.bAutoReconnect == TRUE) &&
475 (pAd->MlmeAux.BssType == BSS_INFRA) &&
476 (MlmeValidateSSID(pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen) == TRUE)
479 MLME_SCAN_REQ_STRUCT ScanReq;
481 DBGPRINT(RT_DEBUG_TRACE, ("CntlOidSsidProc():CNTL - No matching BSS, start a new scan\n"));
482 ScanParmFill(pAd, &ScanReq, pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen, BSS_ANY, SCAN_ACTIVE);
483 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ, sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq);
484 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN;
485 // Reset Missed scan number
486 pAd->StaCfg.LastScanTime = Now;
490 pAd->MlmeAux.BssIdx = 0;
491 IterateOnBssTab(pAd);
498 ==========================================================================
501 IRQL = DISPATCH_LEVEL
503 ==========================================================================
505 VOID CntlOidRTBssidProc(
506 IN PRTMP_ADAPTER pAd,
507 IN MLME_QUEUE_ELEM * Elem)
510 PUCHAR pOidBssid = (PUCHAR)Elem->Msg;
511 MLME_DISASSOC_REQ_STRUCT DisassocReq;
512 MLME_JOIN_REQ_STRUCT JoinReq;
514 // record user desired settings
515 COPY_MAC_ADDR(pAd->MlmeAux.Bssid, pOidBssid);
516 pAd->MlmeAux.BssType = pAd->StaCfg.BssType;
519 // Update Reconnect Ssid, that user desired to connect.
521 NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, MAX_LEN_OF_SSID);
522 pAd->MlmeAux.AutoReconnectSsidLen = pAd->MlmeAux.SsidLen;
523 NdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen);
525 // find the desired BSS in the latest SCAN result table
526 BssIdx = BssTableSearch(&pAd->ScanTab, pOidBssid, pAd->MlmeAux.Channel);
527 if (BssIdx == BSS_NOT_FOUND)
529 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - BSSID not found. reply NDIS_STATUS_NOT_ACCEPTED\n"));
530 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
534 // copy the matched BSS entry from ScanTab to MlmeAux.SsidBssTab. Why?
535 // Because we need this entry to become the JOIN target in later on SYNC state machine
536 pAd->MlmeAux.BssIdx = 0;
537 pAd->MlmeAux.SsidBssTab.BssNr = 1;
538 NdisMoveMemory(&pAd->MlmeAux.SsidBssTab.BssEntry[0], &pAd->ScanTab.BssEntry[BssIdx], sizeof(BSS_ENTRY));
540 //pAd->MlmeAux.AutoReconnectSsidLen = pAd->ScanTab.BssEntry[BssIdx].SsidLen;
541 //NdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->ScanTab.BssEntry[BssIdx].Ssid, pAd->ScanTab.BssEntry[BssIdx].SsidLen);
543 // Add SSID into MlmeAux for site surey joining hidden SSID
544 //pAd->MlmeAux.SsidLen = pAd->ScanTab.BssEntry[BssIdx].SsidLen;
545 //NdisMoveMemory(pAd->MlmeAux.Ssid, pAd->ScanTab.BssEntry[BssIdx].Ssid, pAd->MlmeAux.SsidLen);
547 // 2002-11-26 skip the following checking. i.e. if user wants to re-connect to same AP
548 // we just follow normal procedure. The reason of user doing this may because he/she changed
549 // AP to another channel, but we still received BEACON from it thus don't claim Link Down.
550 // Since user knows he's changed AP channel, he'll re-connect again. By skipping the following
551 // checking, we'll disassociate then re-do normal association with this AP at the new channel.
552 // 2003-1-6 Re-enable this feature based on microsoft requirement which prefer not to re-do
553 // connection when setting the same BSSID.
554 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) &&
555 MAC_ADDR_EQUAL(pAd->CommonCfg.Bssid, pOidBssid))
557 // already connected to the same BSSID, go back to idle state directly
558 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - already in this BSSID. ignore this SET_BSSID request\n"));
559 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
560 #ifdef NATIVE_WPA_SUPPLICANT_SUPPORT
562 union iwreq_data wrqu;
564 memset(wrqu.ap_addr.sa_data, 0, MAC_ADDR_LEN);
565 memcpy(wrqu.ap_addr.sa_data, pAd->MlmeAux.Bssid, MAC_ADDR_LEN);
566 wireless_send_event(pAd->net_dev, SIOCGIWAP, &wrqu, NULL);
569 #endif // NATIVE_WPA_SUPPLICANT_SUPPORT //
575 // disassoc from current AP first
576 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - disassociate with current AP ...\n"));
577 DisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid, REASON_DISASSOC_STA_LEAVING);
578 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ,
579 sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq);
581 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC;
587 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - drop current ADHOC\n"));
588 LinkDown(pAd, FALSE);
589 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);
590 pAd->IndicateMediaState = NdisMediaStateDisconnected;
591 RTMP_IndicateMediaState(pAd);
592 pAd->ExtraInfo = GENERAL_LINK_DOWN;
593 DBGPRINT(RT_DEBUG_TRACE, ("NDIS_STATUS_MEDIA_DISCONNECT Event C!\n"));
596 // Change the wepstatus to original wepstatus
597 pAd->StaCfg.WepStatus = pAd->StaCfg.OrigWepStatus;
598 pAd->StaCfg.PairCipher = pAd->StaCfg.OrigWepStatus;
599 pAd->StaCfg.GroupCipher = pAd->StaCfg.OrigWepStatus;
601 // Check cipher suite, AP must have more secured cipher than station setting
602 // Set the Pairwise and Group cipher to match the intended AP setting
603 // We can only connect to AP with less secured cipher setting
604 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK))
606 pAd->StaCfg.GroupCipher = pAd->ScanTab.BssEntry[BssIdx].WPA.GroupCipher;
608 if (pAd->StaCfg.WepStatus == pAd->ScanTab.BssEntry[BssIdx].WPA.PairCipher)
609 pAd->StaCfg.PairCipher = pAd->ScanTab.BssEntry[BssIdx].WPA.PairCipher;
610 else if (pAd->ScanTab.BssEntry[BssIdx].WPA.PairCipherAux != Ndis802_11WEPDisabled)
611 pAd->StaCfg.PairCipher = pAd->ScanTab.BssEntry[BssIdx].WPA.PairCipherAux;
612 else // There is no PairCipher Aux, downgrade our capability to TKIP
613 pAd->StaCfg.PairCipher = Ndis802_11Encryption2Enabled;
615 else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK))
617 pAd->StaCfg.GroupCipher = pAd->ScanTab.BssEntry[BssIdx].WPA2.GroupCipher;
619 if (pAd->StaCfg.WepStatus == pAd->ScanTab.BssEntry[BssIdx].WPA2.PairCipher)
620 pAd->StaCfg.PairCipher = pAd->ScanTab.BssEntry[BssIdx].WPA2.PairCipher;
621 else if (pAd->ScanTab.BssEntry[BssIdx].WPA2.PairCipherAux != Ndis802_11WEPDisabled)
622 pAd->StaCfg.PairCipher = pAd->ScanTab.BssEntry[BssIdx].WPA2.PairCipherAux;
623 else // There is no PairCipher Aux, downgrade our capability to TKIP
624 pAd->StaCfg.PairCipher = Ndis802_11Encryption2Enabled;
627 pAd->StaCfg.RsnCapability = pAd->ScanTab.BssEntry[BssIdx].WPA2.RsnCapability;
630 // Set Mix cipher flag
631 pAd->StaCfg.bMixCipher = (pAd->StaCfg.PairCipher == pAd->StaCfg.GroupCipher) ? FALSE : TRUE;
632 if (pAd->StaCfg.bMixCipher == TRUE)
634 // If mix cipher, re-build RSNIE
635 RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, 0);
637 // No active association, join the BSS immediately
638 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - joining %02x:%02x:%02x:%02x:%02x:%02x ...\n",
639 pOidBssid[0],pOidBssid[1],pOidBssid[2],pOidBssid[3],pOidBssid[4],pOidBssid[5]));
641 JoinParmFill(pAd, &JoinReq, pAd->MlmeAux.BssIdx);
642 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_JOIN_REQ, sizeof(MLME_JOIN_REQ_STRUCT), &JoinReq);
644 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_JOIN;
649 // Roaming is the only external request triggering CNTL state machine
650 // despite of other "SET OID" operation. All "SET OID" related oerations
651 // happen in sequence, because no other SET OID will be sent to this device
652 // until the the previous SET operation is complete (successful o failed).
653 // So, how do we quarantee this ROAMING request won't corrupt other "SET OID"?
654 // or been corrupted by other "SET OID"?
656 // IRQL = DISPATCH_LEVEL
657 VOID CntlMlmeRoamingProc(
658 IN PRTMP_ADAPTER pAd,
659 IN MLME_QUEUE_ELEM *Elem)
662 // AP in different channel may show lower RSSI than actual value??
663 // should we add a weighting factor to compensate it?
664 DBGPRINT(RT_DEBUG_TRACE,("CNTL - Roaming in MlmeAux.RoamTab...\n"));
666 NdisMoveMemory(&pAd->MlmeAux.SsidBssTab, &pAd->MlmeAux.RoamTab, sizeof(pAd->MlmeAux.RoamTab));
667 pAd->MlmeAux.SsidBssTab.BssNr = pAd->MlmeAux.RoamTab.BssNr;
669 BssTableSortByRssi(&pAd->MlmeAux.SsidBssTab);
670 pAd->MlmeAux.BssIdx = 0;
671 IterateOnBssTab(pAd);
675 ==========================================================================
678 IRQL = DISPATCH_LEVEL
680 ==========================================================================
682 VOID CntlWaitDisassocProc(
683 IN PRTMP_ADAPTER pAd,
684 IN MLME_QUEUE_ELEM *Elem)
686 MLME_START_REQ_STRUCT StartReq;
688 if (Elem->MsgType == MT2_DISASSOC_CONF)
690 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Dis-associate successful\n"));
692 if (pAd->CommonCfg.bWirelessEvent)
694 RTMPSendWirelessEvent(pAd, IW_DISASSOC_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);
697 LinkDown(pAd, FALSE);
699 // case 1. no matching BSS, and user wants ADHOC, so we just start a new one
700 if ((pAd->MlmeAux.SsidBssTab.BssNr==0) && (pAd->StaCfg.BssType == BSS_ADHOC))
702 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - No matching BSS, start a new ADHOC (Ssid=%s)...\n",pAd->MlmeAux.Ssid));
703 StartParmFill(pAd, &StartReq, pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen);
704 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_START_REQ, sizeof(MLME_START_REQ_STRUCT), &StartReq);
705 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_START;
707 // case 2. try each matched BSS
710 pAd->MlmeAux.BssIdx = 0;
712 IterateOnBssTab(pAd);
718 ==========================================================================
721 IRQL = DISPATCH_LEVEL
723 ==========================================================================
725 VOID CntlWaitJoinProc(
726 IN PRTMP_ADAPTER pAd,
727 IN MLME_QUEUE_ELEM *Elem)
730 MLME_AUTH_REQ_STRUCT AuthReq;
732 if (Elem->MsgType == MT2_JOIN_CONF)
734 NdisMoveMemory(&Reason, Elem->Msg, sizeof(USHORT));
735 if (Reason == MLME_SUCCESS)
737 // 1. joined an IBSS, we are pretty much done here
738 if (pAd->MlmeAux.BssType == BSS_ADHOC)
741 // 5G bands rules of Japan:
742 // Ad hoc must be disabled in W53(ch52,56,60,64) channels.
744 if ( (pAd->CommonCfg.bIEEE80211H == 1) &&
745 RadarChannelCheck(pAd, pAd->CommonCfg.Channel)
748 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
749 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Channel=%d, Join adhoc on W53(52,56,60,64) Channels are not accepted\n", pAd->CommonCfg.Channel));
753 LinkUp(pAd, BSS_ADHOC);
754 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
755 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - join the IBSS = %02x:%02x:%02x:%02x:%02x:%02x ...\n",
756 pAd->CommonCfg.Bssid[0],pAd->CommonCfg.Bssid[1],pAd->CommonCfg.Bssid[2],
757 pAd->CommonCfg.Bssid[3],pAd->CommonCfg.Bssid[4],pAd->CommonCfg.Bssid[5]));
759 pAd->IndicateMediaState = NdisMediaStateConnected;
760 pAd->ExtraInfo = GENERAL_LINK_UP;
762 // 2. joined a new INFRA network, start from authentication
766 // either Ndis802_11AuthModeShared or Ndis802_11AuthModeAutoSwitch, try shared key first
767 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeShared) ||
768 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeAutoSwitch))
770 AuthParmFill(pAd, &AuthReq, pAd->MlmeAux.Bssid, Ndis802_11AuthModeShared);
774 AuthParmFill(pAd, &AuthReq, pAd->MlmeAux.Bssid, Ndis802_11AuthModeOpen);
777 MlmeEnqueue(pAd, AUTH_STATE_MACHINE, MT2_MLME_AUTH_REQ,
778 sizeof(MLME_AUTH_REQ_STRUCT), &AuthReq);
780 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_AUTH;
785 // 3. failed, try next BSS
786 pAd->MlmeAux.BssIdx++;
787 IterateOnBssTab(pAd);
794 ==========================================================================
797 IRQL = DISPATCH_LEVEL
799 ==========================================================================
801 VOID CntlWaitStartProc(
802 IN PRTMP_ADAPTER pAd,
803 IN MLME_QUEUE_ELEM *Elem)
807 if (Elem->MsgType == MT2_START_CONF)
809 NdisMoveMemory(&Result, Elem->Msg, sizeof(USHORT));
810 if (Result == MLME_SUCCESS)
813 // 5G bands rules of Japan:
814 // Ad hoc must be disabled in W53(ch52,56,60,64) channels.
816 if ( (pAd->CommonCfg.bIEEE80211H == 1) &&
817 RadarChannelCheck(pAd, pAd->CommonCfg.Channel)
820 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
821 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Channel=%d, Start adhoc on W53(52,56,60,64) Channels are not accepted\n", pAd->CommonCfg.Channel));
824 #ifdef DOT11_N_SUPPORT
825 if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)
829 NdisMoveMemory(&pAd->MlmeAux.AddHtInfo, &pAd->CommonCfg.AddHTInfo, sizeof(ADD_HT_INFO_IE));
830 RTMPCheckHt(pAd, BSSID_WCID, &pAd->CommonCfg.HtCapability, &pAd->CommonCfg.AddHTInfo);
831 pAd->StaActive.SupportedPhyInfo.bHtEnable = TRUE;
832 NdisZeroMemory(&pAd->StaActive.SupportedPhyInfo.MCSSet[0], 16);
833 NdisMoveMemory(&pAd->StaActive.SupportedPhyInfo.MCSSet[0], &pAd->CommonCfg.HtCapability.MCSSet[0], 16);
834 COPY_HTSETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(pAd);
836 if ((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40) &&
837 (pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset == EXTCHA_ABOVE))
839 pAd->MlmeAux.CentralChannel = pAd->CommonCfg.Channel + 2;
841 else if ((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40) &&
842 (pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset == EXTCHA_BELOW))
844 pAd->MlmeAux.CentralChannel = pAd->CommonCfg.Channel - 2;
848 #endif // DOT11_N_SUPPORT //
850 pAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE;
852 LinkUp(pAd, BSS_ADHOC);
853 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
854 // Before send beacon, driver need do radar detection
855 if ((pAd->CommonCfg.Channel > 14 )
856 && (pAd->CommonCfg.bIEEE80211H == 1)
857 && RadarChannelCheck(pAd, pAd->CommonCfg.Channel))
859 pAd->CommonCfg.RadarDetect.RDMode = RD_SILENCE_MODE;
860 pAd->CommonCfg.RadarDetect.RDCount = 0;
863 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - start a new IBSS = %02x:%02x:%02x:%02x:%02x:%02x ...\n",
864 pAd->CommonCfg.Bssid[0],pAd->CommonCfg.Bssid[1],pAd->CommonCfg.Bssid[2],
865 pAd->CommonCfg.Bssid[3],pAd->CommonCfg.Bssid[4],pAd->CommonCfg.Bssid[5]));
869 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Start IBSS fail. BUG!!!!!\n"));
870 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
876 ==========================================================================
879 IRQL = DISPATCH_LEVEL
881 ==========================================================================
883 VOID CntlWaitAuthProc(
884 IN PRTMP_ADAPTER pAd,
885 IN MLME_QUEUE_ELEM *Elem)
888 MLME_ASSOC_REQ_STRUCT AssocReq;
889 MLME_AUTH_REQ_STRUCT AuthReq;
891 if (Elem->MsgType == MT2_AUTH_CONF)
893 NdisMoveMemory(&Reason, Elem->Msg, sizeof(USHORT));
894 if (Reason == MLME_SUCCESS)
896 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - AUTH OK\n"));
897 AssocParmFill(pAd, &AssocReq, pAd->MlmeAux.Bssid, pAd->MlmeAux.CapabilityInfo,
898 ASSOC_TIMEOUT, pAd->StaCfg.DefaultListenCount);
901 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_ASSOC_REQ,
902 sizeof(MLME_ASSOC_REQ_STRUCT), &AssocReq);
904 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_ASSOC;
909 // This fail may because of the AP already keep us in its MAC table without
910 // ageing-out. The previous authentication attempt must have let it remove us.
911 // so try Authentication again may help. For D-Link DWL-900AP+ compatibility.
912 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - AUTH FAIL, try again...\n"));
915 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeShared) ||
916 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeAutoSwitch))
918 // either Ndis802_11AuthModeShared or Ndis802_11AuthModeAutoSwitch, try shared key first
919 AuthParmFill(pAd, &AuthReq, pAd->MlmeAux.Bssid, Ndis802_11AuthModeShared);
923 AuthParmFill(pAd, &AuthReq, pAd->MlmeAux.Bssid, Ndis802_11AuthModeOpen);
926 MlmeEnqueue(pAd, AUTH_STATE_MACHINE, MT2_MLME_AUTH_REQ,
927 sizeof(MLME_AUTH_REQ_STRUCT), &AuthReq);
929 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_AUTH2;
935 ==========================================================================
938 IRQL = DISPATCH_LEVEL
940 ==========================================================================
942 VOID CntlWaitAuthProc2(
943 IN PRTMP_ADAPTER pAd,
944 IN MLME_QUEUE_ELEM *Elem)
947 MLME_ASSOC_REQ_STRUCT AssocReq;
948 MLME_AUTH_REQ_STRUCT AuthReq;
950 if (Elem->MsgType == MT2_AUTH_CONF)
952 NdisMoveMemory(&Reason, Elem->Msg, sizeof(USHORT));
953 if (Reason == MLME_SUCCESS)
955 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - AUTH OK\n"));
956 AssocParmFill(pAd, &AssocReq, pAd->MlmeAux.Bssid, pAd->MlmeAux.CapabilityInfo,
957 ASSOC_TIMEOUT, pAd->StaCfg.DefaultListenCount);
958 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_ASSOC_REQ,
959 sizeof(MLME_ASSOC_REQ_STRUCT), &AssocReq);
961 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_ASSOC;
965 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeAutoSwitch) &&
966 (pAd->MlmeAux.Alg == Ndis802_11AuthModeShared))
968 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - AUTH FAIL, try OPEN system...\n"));
969 AuthParmFill(pAd, &AuthReq, pAd->MlmeAux.Bssid, Ndis802_11AuthModeOpen);
970 MlmeEnqueue(pAd, AUTH_STATE_MACHINE, MT2_MLME_AUTH_REQ,
971 sizeof(MLME_AUTH_REQ_STRUCT), &AuthReq);
973 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_AUTH2;
977 // not success, try next BSS
978 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - AUTH FAIL, give up; try next BSS\n"));
979 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; //???????
980 pAd->MlmeAux.BssIdx++;
981 IterateOnBssTab(pAd);
988 ==========================================================================
991 IRQL = DISPATCH_LEVEL
993 ==========================================================================
995 VOID CntlWaitAssocProc(
996 IN PRTMP_ADAPTER pAd,
997 IN MLME_QUEUE_ELEM *Elem)
1001 if (Elem->MsgType == MT2_ASSOC_CONF)
1003 NdisMoveMemory(&Reason, Elem->Msg, sizeof(USHORT));
1004 if (Reason == MLME_SUCCESS)
1006 LinkUp(pAd, BSS_INFRA);
1007 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
1008 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Association successful on BSS #%ld\n",pAd->MlmeAux.BssIdx));
1010 if (pAd->CommonCfg.bWirelessEvent)
1012 RTMPSendWirelessEvent(pAd, IW_ASSOC_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);
1017 // not success, try next BSS
1018 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Association fails on BSS #%ld\n",pAd->MlmeAux.BssIdx));
1019 pAd->MlmeAux.BssIdx++;
1020 IterateOnBssTab(pAd);
1026 ==========================================================================
1029 IRQL = DISPATCH_LEVEL
1031 ==========================================================================
1033 VOID CntlWaitReassocProc(
1034 IN PRTMP_ADAPTER pAd,
1035 IN MLME_QUEUE_ELEM *Elem)
1039 if (Elem->MsgType == MT2_REASSOC_CONF)
1041 NdisMoveMemory(&Result, Elem->Msg, sizeof(USHORT));
1042 if (Result == MLME_SUCCESS)
1045 // NDIS requires a new Link UP indication but no Link Down for RE-ASSOC
1047 LinkUp(pAd, BSS_INFRA);
1049 // send wireless event - for association
1050 if (pAd->CommonCfg.bWirelessEvent)
1051 RTMPSendWirelessEvent(pAd, IW_ASSOC_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);
1053 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
1054 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Re-assocition successful on BSS #%ld\n", pAd->MlmeAux.RoamIdx));
1058 // reassoc failed, try to pick next BSS in the BSS Table
1059 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Re-assocition fails on BSS #%ld\n", pAd->MlmeAux.RoamIdx));
1060 pAd->MlmeAux.RoamIdx++;
1061 IterateOnBssTab2(pAd);
1067 VOID AdhocTurnOnQos(
1068 IN PRTMP_ADAPTER pAd)
1070 #define AC0_DEF_TXOP 0
1071 #define AC1_DEF_TXOP 0
1072 #define AC2_DEF_TXOP 94
1073 #define AC3_DEF_TXOP 47
1075 // Turn on QOs if use HT rate.
1076 if (pAd->CommonCfg.APEdcaParm.bValid == FALSE)
1078 pAd->CommonCfg.APEdcaParm.bValid = TRUE;
1079 pAd->CommonCfg.APEdcaParm.Aifsn[0] = 3;
1080 pAd->CommonCfg.APEdcaParm.Aifsn[1] = 7;
1081 pAd->CommonCfg.APEdcaParm.Aifsn[2] = 1;
1082 pAd->CommonCfg.APEdcaParm.Aifsn[3] = 1;
1084 pAd->CommonCfg.APEdcaParm.Cwmin[0] = 4;
1085 pAd->CommonCfg.APEdcaParm.Cwmin[1] = 4;
1086 pAd->CommonCfg.APEdcaParm.Cwmin[2] = 3;
1087 pAd->CommonCfg.APEdcaParm.Cwmin[3] = 2;
1089 pAd->CommonCfg.APEdcaParm.Cwmax[0] = 10;
1090 pAd->CommonCfg.APEdcaParm.Cwmax[1] = 6;
1091 pAd->CommonCfg.APEdcaParm.Cwmax[2] = 4;
1092 pAd->CommonCfg.APEdcaParm.Cwmax[3] = 3;
1094 pAd->CommonCfg.APEdcaParm.Txop[0] = 0;
1095 pAd->CommonCfg.APEdcaParm.Txop[1] = 0;
1096 pAd->CommonCfg.APEdcaParm.Txop[2] = AC2_DEF_TXOP;
1097 pAd->CommonCfg.APEdcaParm.Txop[3] = AC3_DEF_TXOP;
1099 AsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm);
1103 ==========================================================================
1106 IRQL = DISPATCH_LEVEL
1108 ==========================================================================
1111 IN PRTMP_ADAPTER pAd,
1117 UCHAR Value = 0, idx;
1118 MAC_TABLE_ENTRY *pEntry = NULL, *pCurrEntry;
1120 pEntry = &pAd->MacTab.Content[BSSID_WCID];
1123 // ASSOC - DisassocTimeoutAction
1124 // CNTL - Dis-associate successful
1125 // !!! LINK DOWN !!!
1126 // [88888] OID_802_11_SSID should have returned NDTEST_WEP_AP2(Returned: )
1128 // To prevent DisassocTimeoutAction to call Link down after we link up,
1129 // cancel the DisassocTimer no matter what it start or not.
1131 RTMPCancelTimer(&pAd->MlmeAux.DisassocTimer, &Cancelled);
1133 COPY_SETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(pAd);
1135 #ifdef DOT11_N_SUPPORT
1136 COPY_HTSETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(pAd);
1137 #endif // DOT11_N_SUPPORT //
1138 // It's quite difficult to tell if a newly added KEY is WEP or CKIP until a new BSS
1139 // is formed (either ASSOC/RE-ASSOC done or IBSS started. LinkUP should be a safe place
1140 // to examine if cipher algorithm switching is required.
1141 //rt2860b. Don't know why need this
1142 SwitchBetweenWepAndCkip(pAd);
1145 if (BssType == BSS_ADHOC)
1147 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_ADHOC_ON);
1148 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_INFRA_ON);
1150 #ifdef DOT11_N_SUPPORT
1151 if ((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40) &&
1152 (pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset == EXTCHA_ABOVE))
1154 pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel + 2;
1156 else if ((pAd->CommonCfg.Channel > 2) &&
1157 (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40) &&
1158 (pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset == EXTCHA_BELOW))
1160 pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel - 2;
1162 #endif // DOT11_N_SUPPORT //
1164 #ifdef DOT11_N_SUPPORT
1165 if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)
1166 AdhocTurnOnQos(pAd);
1167 #endif // DOT11_N_SUPPORT //
1169 DBGPRINT(RT_DEBUG_TRACE, ("!!!Adhoc LINK UP !!! \n" ));
1173 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_INFRA_ON);
1174 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADHOC_ON);
1176 DBGPRINT(RT_DEBUG_TRACE, ("!!!Infra LINK UP !!! \n" ));
1180 // reset Tx beamforming bit
1181 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value);
1183 Value |= pAd->CommonCfg.RegTransmitSetting.field.TxBF;
1184 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value);
1186 #ifdef DOT11_N_SUPPORT
1187 // Change to AP channel
1188 if ((pAd->CommonCfg.CentralChannel > pAd->CommonCfg.Channel) && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40))
1190 // Must using 40MHz.
1191 pAd->CommonCfg.BBPCurrentBW = BW_40;
1192 AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
1193 AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
1195 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value);
1198 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value);
1200 // RX : control channel at lower
1201 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value);
1203 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
1205 RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data);
1207 RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data);
1209 if (pAd->MACVersion == 0x28600100)
1211 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1A);
1212 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A);
1213 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x16);
1214 DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" ));
1217 DBGPRINT(RT_DEBUG_TRACE, ("!!!40MHz Lower LINK UP !!! Control Channel at Below. Central = %d \n", pAd->CommonCfg.CentralChannel ));
1219 else if ((pAd->CommonCfg.CentralChannel < pAd->CommonCfg.Channel) && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40))
1221 // Must using 40MHz.
1222 pAd->CommonCfg.BBPCurrentBW = BW_40;
1223 AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
1224 AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
1226 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value);
1229 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value);
1231 RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data);
1233 RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data);
1235 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value);
1237 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
1239 if (pAd->MACVersion == 0x28600100)
1241 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1A);
1242 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A);
1243 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x16);
1244 DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" ));
1247 DBGPRINT(RT_DEBUG_TRACE, ("!!! 40MHz Upper LINK UP !!! Control Channel at UpperCentral = %d \n", pAd->CommonCfg.CentralChannel ));
1250 #endif // DOT11_N_SUPPORT //
1252 pAd->CommonCfg.BBPCurrentBW = BW_20;
1253 pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;
1254 AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
1255 AsicLockChannel(pAd, pAd->CommonCfg.Channel);
1257 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value);
1259 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value);
1261 RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data);
1263 RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data);
1265 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value);
1267 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
1269 if (pAd->MACVersion == 0x28600100)
1271 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16);
1272 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x08);
1273 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x11);
1274 DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" ));
1277 DBGPRINT(RT_DEBUG_TRACE, ("!!! 20MHz LINK UP !!! \n" ));
1280 RTMPSetAGCInitValue(pAd, pAd->CommonCfg.BBPCurrentBW);
1282 // Save BBP_R66 value, it will be used in RTUSBResumeMsduTransmission
1284 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R66, &pAd->BbpTuning.R66CurrentValue);
1286 DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK UP !!! (BssType=%d, AID=%d, ssid=%s, Channel=%d, CentralChannel = %d)\n",
1287 BssType, pAd->StaActive.Aid, pAd->CommonCfg.Ssid, pAd->CommonCfg.Channel, pAd->CommonCfg.CentralChannel));
1289 #ifdef DOT11_N_SUPPORT
1290 DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK UP !!! (Density =%d, )\n", pAd->MacTab.Content[BSSID_WCID].MpduDensity));
1291 #endif // DOT11_N_SUPPORT //
1293 AsicSetBssid(pAd, pAd->CommonCfg.Bssid);
1295 AsicSetSlotTime(pAd, TRUE);
1296 AsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm);
1298 // Call this for RTS protectionfor legacy rate, we will always enable RTS threshold, but normally it will not hit
1299 AsicUpdateProtect(pAd, 0, (OFDMSETPROTECT | CCKSETPROTECT), TRUE, FALSE);
1301 #ifdef DOT11_N_SUPPORT
1302 if ((pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE))
1304 // Update HT protectionfor based on AP's operating mode.
1305 if (pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent == 1)
1307 AsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode, ALLN_SETPROTECT, FALSE, TRUE);
1310 AsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode, ALLN_SETPROTECT, FALSE, FALSE);
1312 #endif // DOT11_N_SUPPORT //
1314 NdisZeroMemory(&pAd->DrsCounters, sizeof(COUNTER_DRS));
1316 NdisGetSystemUpTime(&Now);
1317 pAd->StaCfg.LastBeaconRxTime = Now; // last RX timestamp
1319 if ((pAd->CommonCfg.TxPreamble != Rt802_11PreambleLong) &&
1320 CAP_IS_SHORT_PREAMBLE_ON(pAd->StaActive.CapabilityInfo))
1322 MlmeSetTxPreamble(pAd, Rt802_11PreambleShort);
1325 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED);
1327 if (pAd->CommonCfg.RadarDetect.RDMode == RD_SILENCE_MODE)
1330 pAd->CommonCfg.RadarDetect.RDMode = RD_NORMAL_MODE;
1332 if (BssType == BSS_ADHOC)
1334 MakeIbssBeacon(pAd);
1335 if ((pAd->CommonCfg.Channel > 14)
1336 && (pAd->CommonCfg.bIEEE80211H == 1)
1337 && RadarChannelCheck(pAd, pAd->CommonCfg.Channel))
1343 AsicEnableIbssSync(pAd);
1346 // In ad hoc mode, use MAC table from index 1.
1347 // p.s ASIC use all 0xff as termination of WCID table search.To prevent it's 0xff-ff-ff-ff-ff-ff, Write 0 here.
1348 RTMP_IO_WRITE32(pAd, MAC_WCID_BASE, 0x00);
1349 RTMP_IO_WRITE32(pAd, 0x1808, 0x00);
1351 // If WEP is enabled, add key material and cipherAlg into Asic
1352 // Fill in Shared Key Table(offset: 0x6c00) and Shared Key Mode(offset: 0x7000)
1354 if (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled)
1359 for (idx=0; idx < SHARE_KEY_NUM; idx++)
1361 CipherAlg = pAd->SharedKey[BSS0][idx].CipherAlg;
1362 Key = pAd->SharedKey[BSS0][idx].Key;
1364 if (pAd->SharedKey[BSS0][idx].KeyLen > 0)
1366 // Set key material and cipherAlg to Asic
1367 AsicAddSharedKeyEntry(pAd, BSS0, idx, CipherAlg, Key, NULL, NULL);
1369 if (idx == pAd->StaCfg.DefaultKeyId)
1371 // Update WCID attribute table and IVEIV table for this group key table
1372 RTMPAddWcidAttributeEntry(pAd, BSS0, idx, CipherAlg, NULL);
1379 // If WPANone is enabled, add key material and cipherAlg into Asic
1380 // Fill in Shared Key Table(offset: 0x6c00) and Shared Key Mode(offset: 0x7000)
1381 else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)
1383 pAd->StaCfg.DefaultKeyId = 0; // always be zero
1385 NdisZeroMemory(&pAd->SharedKey[BSS0][0], sizeof(CIPHER_KEY));
1386 pAd->SharedKey[BSS0][0].KeyLen = LEN_TKIP_EK;
1387 NdisMoveMemory(pAd->SharedKey[BSS0][0].Key, pAd->StaCfg.PMK, LEN_TKIP_EK);
1389 if (pAd->StaCfg.PairCipher == Ndis802_11Encryption2Enabled)
1391 NdisMoveMemory(pAd->SharedKey[BSS0][0].RxMic, &pAd->StaCfg.PMK[16], LEN_TKIP_RXMICK);
1392 NdisMoveMemory(pAd->SharedKey[BSS0][0].TxMic, &pAd->StaCfg.PMK[16], LEN_TKIP_TXMICK);
1395 // Decide its ChiperAlg
1396 if (pAd->StaCfg.PairCipher == Ndis802_11Encryption2Enabled)
1397 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_TKIP;
1398 else if (pAd->StaCfg.PairCipher == Ndis802_11Encryption3Enabled)
1399 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_AES;
1402 DBGPRINT(RT_DEBUG_TRACE, ("Unknow Cipher (=%d), set Cipher to AES\n", pAd->StaCfg.PairCipher));
1403 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_AES;
1406 // Set key material and cipherAlg to Asic
1407 AsicAddSharedKeyEntry(pAd,
1410 pAd->SharedKey[BSS0][0].CipherAlg,
1411 pAd->SharedKey[BSS0][0].Key,
1412 pAd->SharedKey[BSS0][0].TxMic,
1413 pAd->SharedKey[BSS0][0].RxMic);
1415 // Update WCID attribute table and IVEIV table for this group key table
1416 RTMPAddWcidAttributeEntry(pAd, BSS0, 0, pAd->SharedKey[BSS0][0].CipherAlg, NULL);
1423 // Check the new SSID with last SSID
1424 while (Cancelled == TRUE)
1426 if (pAd->CommonCfg.LastSsidLen == pAd->CommonCfg.SsidLen)
1428 if (RTMPCompareMemory(pAd->CommonCfg.LastSsid, pAd->CommonCfg.Ssid, pAd->CommonCfg.LastSsidLen) == 0)
1430 // Link to the old one no linkdown is required.
1434 // Send link down event before set to link up
1435 pAd->IndicateMediaState = NdisMediaStateDisconnected;
1436 RTMP_IndicateMediaState(pAd);
1437 pAd->ExtraInfo = GENERAL_LINK_DOWN;
1438 DBGPRINT(RT_DEBUG_TRACE, ("NDIS_STATUS_MEDIA_DISCONNECT Event AA!\n"));
1443 // On WPA mode, Remove All Keys if not connect to the last BSSID
1444 // Key will be set after 4-way handshake.
1446 if ((pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA))
1450 // Remove all WPA keys
1451 RTMPWPARemoveAllKeys(pAd);
1452 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
1453 pAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilter8021xWEP;
1455 // Fixed connection failed with Range Maximizer - 515 AP (Marvell Chip) when security is WPAPSK/TKIP
1456 // If IV related values are too large in GroupMsg2, AP would ignore this message.
1458 IV |= (pAd->StaCfg.DefaultKeyId << 30);
1459 AsicUpdateWCIDIVEIV(pAd, BSSID_WCID, IV, 0);
1462 // the decision of using "short slot time" or not may change dynamically due to
1463 // new STA association to the AP. so we have to decide that upon parsing BEACON, not here
1466 // the decision to use "RTC/CTS" or "CTS-to-self" protection or not may change dynamically
1467 // due to new STA association to the AP. so we have to decide that upon parsing BEACON, not here
1470 ComposeNullFrame(pAd);
1472 AsicEnableBssSync(pAd);
1474 // Add BSSID to WCID search table
1475 AsicUpdateRxWCIDTable(pAd, BSSID_WCID, pAd->CommonCfg.Bssid);
1477 NdisAcquireSpinLock(&pAd->MacTabLock);
1478 // add this BSSID entry into HASH table
1482 //pEntry = &pAd->MacTab.Content[BSSID_WCID];
1483 HashIdx = MAC_ADDR_HASH_INDEX(pAd->CommonCfg.Bssid);
1484 if (pAd->MacTab.Hash[HashIdx] == NULL)
1486 pAd->MacTab.Hash[HashIdx] = pEntry;
1490 pCurrEntry = pAd->MacTab.Hash[HashIdx];
1491 while (pCurrEntry->pNext != NULL)
1492 pCurrEntry = pCurrEntry->pNext;
1493 pCurrEntry->pNext = pEntry;
1496 NdisReleaseSpinLock(&pAd->MacTabLock);
1499 // If WEP is enabled, add paiewise and shared key
1500 #ifdef WPA_SUPPLICANT_SUPPORT
1501 if (((pAd->StaCfg.WpaSupplicantUP)&&
1502 (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled)&&
1503 (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_SECURED)) ||
1504 ((pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_DISABLE)&&
1505 (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled)))
1507 if (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled)
1508 #endif // WPA_SUPPLICANT_SUPPORT //
1513 for (idx=0; idx < SHARE_KEY_NUM; idx++)
1515 CipherAlg = pAd->SharedKey[BSS0][idx].CipherAlg;
1516 Key = pAd->SharedKey[BSS0][idx].Key;
1518 if (pAd->SharedKey[BSS0][idx].KeyLen > 0)
1520 // Set key material and cipherAlg to Asic
1521 AsicAddSharedKeyEntry(pAd, BSS0, idx, CipherAlg, Key, NULL, NULL);
1523 if (idx == pAd->StaCfg.DefaultKeyId)
1525 // Assign group key info
1526 RTMPAddWcidAttributeEntry(pAd, BSS0, idx, CipherAlg, NULL);
1528 // Assign pairwise key info
1529 RTMPAddWcidAttributeEntry(pAd, BSS0, idx, CipherAlg, pEntry);
1535 // only INFRASTRUCTURE mode need to indicate connectivity immediately; ADHOC mode
1536 // should wait until at least 2 active nodes in this BSSID.
1537 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);
1540 if (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA)
1542 pAd->IndicateMediaState = NdisMediaStateConnected;
1543 pAd->ExtraInfo = GENERAL_LINK_UP;
1544 RTMP_IndicateMediaState(pAd);
1548 // Add BSSID in my MAC Table.
1549 NdisAcquireSpinLock(&pAd->MacTabLock);
1550 RTMPMoveMemory(pAd->MacTab.Content[BSSID_WCID].Addr, pAd->CommonCfg.Bssid, MAC_ADDR_LEN);
1551 pAd->MacTab.Content[BSSID_WCID].Aid = BSSID_WCID;
1552 pAd->MacTab.Content[BSSID_WCID].pAd = pAd;
1553 pAd->MacTab.Content[BSSID_WCID].ValidAsCLI = TRUE; //Although this is bssid..still set ValidAsCl
1554 pAd->MacTab.Size = 1; // infra mode always set MACtab size =1.
1555 pAd->MacTab.Content[BSSID_WCID].Sst = SST_ASSOC;
1556 pAd->MacTab.Content[BSSID_WCID].AuthState = SST_ASSOC;
1557 pAd->MacTab.Content[BSSID_WCID].AuthMode = pAd->StaCfg.AuthMode;
1558 pAd->MacTab.Content[BSSID_WCID].WepStatus = pAd->StaCfg.WepStatus;
1559 NdisReleaseSpinLock(&pAd->MacTabLock);
1561 DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK UP !!! ClientStatusFlags=%lx)\n",
1562 pAd->MacTab.Content[BSSID_WCID].ClientStatusFlags));
1564 MlmeUpdateTxRates(pAd, TRUE, BSS0);
1565 #ifdef DOT11_N_SUPPORT
1566 MlmeUpdateHtTxRates(pAd, BSS0);
1567 DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK UP !! (StaActive.bHtEnable =%d, )\n", pAd->StaActive.SupportedPhyInfo.bHtEnable));
1568 #endif // DOT11_N_SUPPORT //
1570 if (pAd->CommonCfg.bAggregationCapable)
1572 if ((pAd->CommonCfg.bPiggyBackCapable) && (pAd->MlmeAux.APRalinkIe & 0x00000003) == 3)
1575 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_PIGGYBACK_INUSED);
1576 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED);
1577 RTMPSetPiggyBack(pAd, TRUE);
1578 DBGPRINT(RT_DEBUG_TRACE, ("Turn on Piggy-Back\n"));
1580 else if (pAd->MlmeAux.APRalinkIe & 0x00000001)
1582 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED);
1586 if (pAd->MlmeAux.APRalinkIe != 0x0)
1588 #ifdef DOT11_N_SUPPORT
1589 if (CLIENT_STATUS_TEST_FLAG(&pAd->MacTab.Content[BSSID_WCID], fCLIENT_STATUS_RDG_CAPABLE))
1593 #endif // DOT11_N_SUPPORT //
1594 OPSTATUS_SET_FLAG(pAd, fCLIENT_STATUS_RALINK_CHIPSET);
1595 CLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[BSSID_WCID], fCLIENT_STATUS_RALINK_CHIPSET);
1599 OPSTATUS_CLEAR_FLAG(pAd, fCLIENT_STATUS_RALINK_CHIPSET);
1600 CLIENT_STATUS_CLEAR_FLAG(&pAd->MacTab.Content[BSSID_WCID], fCLIENT_STATUS_RALINK_CHIPSET);
1604 #ifdef DOT11_N_SUPPORT
1605 DBGPRINT(RT_DEBUG_TRACE, ("NDIS_STATUS_MEDIA_CONNECT Event B!.BACapability = %x. ClientStatusFlags = %lx\n", pAd->CommonCfg.BACapability.word, pAd->MacTab.Content[BSSID_WCID].ClientStatusFlags));
1606 #endif // DOT11_N_SUPPORT //
1609 RTMPSetLED(pAd, LED_LINK_UP);
1611 pAd->Mlme.PeriodicRound = 0;
1612 pAd->Mlme.OneSecPeriodicRound = 0;
1613 pAd->bConfigChanged = FALSE; // Reset config flag
1614 pAd->ExtraInfo = GENERAL_LINK_UP; // Update extra information to link is up
1616 // Set asic auto fall back
1619 UCHAR TableSize = 0;
1621 MlmeSelectTxRateTable(pAd, &pAd->MacTab.Content[BSSID_WCID], &pTable, &TableSize, &pAd->CommonCfg.TxRateIndex);
1622 AsicUpdateAutoFallBackTable(pAd, pTable);
1625 NdisAcquireSpinLock(&pAd->MacTabLock);
1626 pEntry->HTPhyMode.word = pAd->StaCfg.HTPhyMode.word;
1627 pEntry->MaxHTPhyMode.word = pAd->StaCfg.HTPhyMode.word;
1628 if (pAd->StaCfg.bAutoTxRateSwitch == FALSE)
1630 pEntry->bAutoTxRateSwitch = FALSE;
1631 #ifdef DOT11_N_SUPPORT
1632 if (pEntry->HTPhyMode.field.MCS == 32)
1633 pEntry->HTPhyMode.field.ShortGI = GI_800;
1635 if ((pEntry->HTPhyMode.field.MCS > MCS_7) || (pEntry->HTPhyMode.field.MCS == 32))
1636 pEntry->HTPhyMode.field.STBC = STBC_NONE;
1637 #endif // DOT11_N_SUPPORT //
1638 // If the legacy mode is set, overwrite the transmit setting of this entry.
1639 if (pEntry->HTPhyMode.field.MODE <= MODE_OFDM)
1640 RTMPUpdateLegacyTxSetting((UCHAR)pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode, pEntry);
1643 pEntry->bAutoTxRateSwitch = TRUE;
1644 NdisReleaseSpinLock(&pAd->MacTabLock);
1646 // Let Link Status Page display first initial rate.
1647 pAd->LastTxRate = (USHORT)(pEntry->HTPhyMode.word);
1648 // Select DAC according to HT or Legacy
1649 if (pAd->StaActive.SupportedPhyInfo.MCSSet[0] != 0x00)
1651 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &Value);
1653 if (pAd->Antenna.field.TxPath == 2)
1657 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, Value);
1661 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &Value);
1663 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, Value);
1666 #ifdef DOT11_N_SUPPORT
1667 if (pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE)
1670 else if (pEntry->MaxRAmpduFactor == 0)
1672 // If HT AP doesn't support MaxRAmpduFactor = 1, we need to set max PSDU to 0.
1673 // Because our Init value is 1 at MACRegTable.
1674 RTMP_IO_WRITE32(pAd, MAX_LEN_CFG, 0x0fff);
1676 #endif // DOT11_N_SUPPORT //
1678 // Patch for Marvel AP to gain high throughput
1679 // Need to set as following,
1680 // 1. Set txop in register-EDCA_AC0_CFG as 0x60
1681 // 2. Set EnTXWriteBackDDONE in register-WPDMA_GLO_CFG as zero
1682 // 3. PBF_MAX_PCNT as 0x1F3FBF9F
1683 // 4. kick per two packets when dequeue
1685 // Txop can only be modified when RDG is off, WMM is disable and TxBurst is enable
1687 // if 1. Legacy AP WMM on, or 2. 11n AP, AMPDU disable. Force turn off burst no matter what bEnableTxBurst is.
1688 #ifdef DOT11_N_SUPPORT
1689 // if ((!IS_RT30xx(pAd)) &&
1690 if (!((pAd->CommonCfg.RxStream == 1)&&(pAd->CommonCfg.TxStream == 1)) &&
1691 (((pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED))
1692 || ((pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE) && (pAd->CommonCfg.BACapability.field.Policy == BA_NOTUSE))))
1694 RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data);
1696 RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data);
1698 RTMP_IO_WRITE32(pAd, PBF_MAX_PCNT, 0x1F3F7F9F);
1699 DBGPRINT(RT_DEBUG_TRACE, ("Txburst 1\n"));
1702 #endif // DOT11_N_SUPPORT //
1703 if (pAd->CommonCfg.bEnableTxBurst)
1705 RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data);
1708 RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data);
1709 pAd->CommonCfg.IOTestParm.bNowAtherosBurstOn = TRUE;
1711 RTMP_IO_WRITE32(pAd, PBF_MAX_PCNT, 0x1F3FBF9F);
1712 DBGPRINT(RT_DEBUG_TRACE, ("Txburst 2\n"));
1716 RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data);
1718 RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data);
1720 RTMP_IO_WRITE32(pAd, PBF_MAX_PCNT, 0x1F3F7F9F);
1721 DBGPRINT(RT_DEBUG_TRACE, ("Txburst 3\n"));
1724 #ifdef DOT11_N_SUPPORT
1725 // Re-check to turn on TX burst or not.
1726 if ((pAd->CommonCfg.IOTestParm.bLastAtheros == TRUE) && ((STA_WEP_ON(pAd))||(STA_TKIP_ON(pAd))))
1728 pAd->CommonCfg.IOTestParm.bNextDisableRxBA = TRUE;
1729 if (pAd->CommonCfg.bEnableTxBurst)
1731 UINT32 MACValue = 0;
1732 // Force disable TXOP value in this case. The same action in MLMEUpdateProtect too.
1733 // I didn't change PBF_MAX_PCNT setting.
1734 RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &MACValue);
1735 MACValue &= 0xFFFFFF00;
1736 RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, MACValue);
1737 pAd->CommonCfg.IOTestParm.bNowAtherosBurstOn = FALSE;
1742 pAd->CommonCfg.IOTestParm.bNextDisableRxBA = FALSE;
1744 #endif // DOT11_N_SUPPORT //
1746 pAd->CommonCfg.IOTestParm.bLastAtheros = FALSE;
1747 COPY_MAC_ADDR(pAd->CommonCfg.LastBssid, pAd->CommonCfg.Bssid);
1748 DBGPRINT(RT_DEBUG_TRACE, ("!!!pAd->bNextDisableRxBA= %d \n", pAd->CommonCfg.IOTestParm.bNextDisableRxBA));
1749 // BSSID add in one MAC entry too. Because in Tx, ASIC need to check Cipher and IV/EIV, BAbitmap
1750 // Pther information in MACTab.Content[BSSID_WCID] is not necessary for driver.
1751 // Note: As STA, The MACTab.Content[BSSID_WCID]. PairwiseKey and Shared Key for BSS0 are the same.
1753 if (pAd->StaCfg.WepStatus <= Ndis802_11WEPDisabled)
1755 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;
1756 pAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilterAcceptAll;
1759 NdisAcquireSpinLock(&pAd->MacTabLock);
1760 pEntry->PortSecured = pAd->StaCfg.PortSecured;
1761 NdisReleaseSpinLock(&pAd->MacTabLock);
1764 // Patch Atheros AP TX will breakdown issue.
1765 // AP Model: DLink DWL-8200AP
1767 if (INFRA_ON(pAd) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) && STA_TKIP_ON(pAd))
1769 RTMP_IO_WRITE32(pAd, RX_PARSER_CFG, 0x01);
1773 RTMP_IO_WRITE32(pAd, RX_PARSER_CFG, 0x00);
1776 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);
1780 ==========================================================================
1782 Routine Description:
1783 Disconnect current BSSID
1786 pAd - Pointer to our adapter
1787 IsReqFromAP - Request from AP
1792 IRQL = DISPATCH_LEVEL
1795 We need more information to know it's this requst from AP.
1796 If yes! we need to do extra handling, for example, remove the WPA key.
1797 Otherwise on 4-way handshaking will faied, since the WPA key didn't be
1798 remove while auto reconnect.
1799 Disconnect request from AP, it means we will start afresh 4-way handshaking
1802 ==========================================================================
1805 IN PRTMP_ADAPTER pAd,
1806 IN BOOLEAN IsReqFromAP)
1808 UCHAR i, ByteValue = 0;
1810 // Do nothing if monitor mode is on
1811 if (MONITOR_ON(pAd))
1814 if (pAd->CommonCfg.bWirelessEvent)
1816 RTMPSendWirelessEvent(pAd, IW_STA_LINKDOWN_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);
1819 DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK DOWN !!!\n"));
1820 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED);
1822 if (ADHOC_ON(pAd)) // Adhoc mode link down
1824 DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK DOWN 1!!!\n"));
1826 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADHOC_ON);
1827 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);
1828 pAd->IndicateMediaState = NdisMediaStateDisconnected;
1829 RTMP_IndicateMediaState(pAd);
1830 pAd->ExtraInfo = GENERAL_LINK_DOWN;
1831 BssTableDeleteEntry(&pAd->ScanTab, pAd->CommonCfg.Bssid, pAd->CommonCfg.Channel);
1832 DBGPRINT(RT_DEBUG_TRACE, ("!!! MacTab.Size=%d !!!\n", pAd->MacTab.Size));
1834 else // Infra structure mode
1836 DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK DOWN 2!!!\n"));
1838 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_INFRA_ON);
1839 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);
1841 // Saved last SSID for linkup comparison
1842 pAd->CommonCfg.LastSsidLen = pAd->CommonCfg.SsidLen;
1843 NdisMoveMemory(pAd->CommonCfg.LastSsid, pAd->CommonCfg.Ssid, pAd->CommonCfg.LastSsidLen);
1844 COPY_MAC_ADDR(pAd->CommonCfg.LastBssid, pAd->CommonCfg.Bssid);
1845 if (pAd->MlmeAux.CurrReqIsFromNdis == TRUE)
1847 pAd->IndicateMediaState = NdisMediaStateDisconnected;
1848 RTMP_IndicateMediaState(pAd);
1849 pAd->ExtraInfo = GENERAL_LINK_DOWN;
1850 DBGPRINT(RT_DEBUG_TRACE, ("NDIS_STATUS_MEDIA_DISCONNECT Event A!\n"));
1851 pAd->MlmeAux.CurrReqIsFromNdis = FALSE;
1856 // If disassociation request is from NDIS, then we don't need to delete BSSID from entry.
1857 // Otherwise lost beacon or receive De-Authentication from AP,
1858 // then we should delete BSSID from BssTable.
1859 // If we don't delete from entry, roaming will fail.
1861 BssTableDeleteEntry(&pAd->ScanTab, pAd->CommonCfg.Bssid, pAd->CommonCfg.Channel);
1864 // restore back to -
1865 // 1. long slot (20 us) or short slot (9 us) time
1866 // 2. turn on/off RTS/CTS and/or CTS-to-self protection
1867 // 3. short preamble
1868 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED);
1870 if (pAd->StaCfg.CCXAdjacentAPReportFlag == TRUE)
1873 // Record current AP's information.
1874 // for later used reporting Adjacent AP report.
1876 pAd->StaCfg.CCXAdjacentAPChannel = pAd->CommonCfg.Channel;
1877 pAd->StaCfg.CCXAdjacentAPSsidLen = pAd->CommonCfg.SsidLen;
1878 NdisMoveMemory(pAd->StaCfg.CCXAdjacentAPSsid, pAd->CommonCfg.Ssid, pAd->StaCfg.CCXAdjacentAPSsidLen);
1879 COPY_MAC_ADDR(pAd->StaCfg.CCXAdjacentAPBssid, pAd->CommonCfg.Bssid);
1883 for (i=1; i<MAX_LEN_OF_MAC_TABLE; i++)
1885 if (pAd->MacTab.Content[i].ValidAsCLI == TRUE)
1886 MacTableDeleteEntry(pAd, pAd->MacTab.Content[i].Aid, pAd->MacTab.Content[i].Addr);
1889 pAd->StaCfg.CCXQosECWMin = 4;
1890 pAd->StaCfg.CCXQosECWMax = 10;
1892 AsicSetSlotTime(pAd, TRUE); //FALSE);
1893 AsicSetEdcaParm(pAd, NULL);
1896 RTMPSetLED(pAd, LED_LINK_DOWN);
1897 pAd->LedIndicatorStregth = 0xF0;
1898 RTMPSetSignalLED(pAd, -100); // Force signal strength Led to be turned off, firmware is not done it.
1900 AsicDisableSync(pAd);
1902 pAd->Mlme.PeriodicRound = 0;
1903 pAd->Mlme.OneSecPeriodicRound = 0;
1905 if (pAd->StaCfg.BssType == BSS_INFRA)
1907 // Remove StaCfg Information after link down
1908 NdisZeroMemory(pAd->CommonCfg.Bssid, MAC_ADDR_LEN);
1909 NdisZeroMemory(pAd->CommonCfg.Ssid, MAX_LEN_OF_SSID);
1910 pAd->CommonCfg.SsidLen = 0;
1912 #ifdef DOT11_N_SUPPORT
1913 NdisZeroMemory(&pAd->MlmeAux.HtCapability, sizeof(HT_CAPABILITY_IE));
1914 NdisZeroMemory(&pAd->MlmeAux.AddHtInfo, sizeof(ADD_HT_INFO_IE));
1915 pAd->MlmeAux.HtCapabilityLen = 0;
1916 pAd->MlmeAux.NewExtChannelOffset = 0xff;
1917 #endif // DOT11_N_SUPPORT //
1919 // Reset WPA-PSK state. Only reset when supplicant enabled
1920 if (pAd->StaCfg.WpaState != SS_NOTUSE)
1922 pAd->StaCfg.WpaState = SS_START;
1923 // Clear Replay counter
1924 NdisZeroMemory(pAd->StaCfg.ReplayCounter, 8);
1929 // if link down come from AP, we need to remove all WPA keys on WPA mode.
1930 // otherwise will cause 4-way handshaking failed, since the WPA key not empty.
1932 if ((IsReqFromAP) && (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA))
1934 // Remove all WPA keys
1935 RTMPWPARemoveAllKeys(pAd);
1938 // 802.1x port control
1939 #ifdef WPA_SUPPLICANT_SUPPORT
1940 // Prevent clear PortSecured here with static WEP
1941 // NetworkManger set security policy first then set SSID to connect AP.
1942 if (pAd->StaCfg.WpaSupplicantUP &&
1943 (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled) &&
1944 (pAd->StaCfg.IEEE8021X == FALSE))
1946 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;
1949 #endif // WPA_SUPPLICANT_SUPPORT //
1951 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
1952 pAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilter8021xWEP;
1955 NdisAcquireSpinLock(&pAd->MacTabLock);
1956 pAd->MacTab.Content[BSSID_WCID].PortSecured = pAd->StaCfg.PortSecured;
1957 NdisReleaseSpinLock(&pAd->MacTabLock);
1959 pAd->StaCfg.MicErrCnt = 0;
1961 // Turn off Ckip control flag
1962 pAd->StaCfg.bCkipOn = FALSE;
1963 pAd->StaCfg.CCXEnable = FALSE;
1965 pAd->IndicateMediaState = NdisMediaStateDisconnected;
1966 // Update extra information to link is up
1967 pAd->ExtraInfo = GENERAL_LINK_DOWN;
1969 //pAd->StaCfg.AdhocBOnlyJoined = FALSE;
1970 //pAd->StaCfg.AdhocBGJoined = FALSE;
1971 //pAd->StaCfg.Adhoc20NJoined = FALSE;
1972 pAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE;
1974 // Reset the Current AP's IP address
1975 NdisZeroMemory(pAd->StaCfg.AironetIPAddress, 4);
1977 pAd->bUsbTxBulkAggre = FALSE;
1980 // Clean association information
1981 NdisZeroMemory(&pAd->StaCfg.AssocInfo, sizeof(NDIS_802_11_ASSOCIATION_INFORMATION));
1982 pAd->StaCfg.AssocInfo.Length = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);
1983 pAd->StaCfg.ReqVarIELen = 0;
1984 pAd->StaCfg.ResVarIELen = 0;
1987 // Reset RSSI value after link down
1989 pAd->StaCfg.RssiSample.AvgRssi0 = 0;
1990 pAd->StaCfg.RssiSample.AvgRssi0X8 = 0;
1991 pAd->StaCfg.RssiSample.AvgRssi1 = 0;
1992 pAd->StaCfg.RssiSample.AvgRssi1X8 = 0;
1993 pAd->StaCfg.RssiSample.AvgRssi2 = 0;
1994 pAd->StaCfg.RssiSample.AvgRssi2X8 = 0;
1997 pAd->CommonCfg.MlmeRate = pAd->CommonCfg.BasicMlmeRate;
1998 pAd->CommonCfg.RtsRate = pAd->CommonCfg.BasicMlmeRate;
2000 #ifdef DOT11_N_SUPPORT
2002 // After Link down, reset piggy-back setting in ASIC. Disable RDG.
2004 if (pAd->CommonCfg.BBPCurrentBW == BW_40)
2006 pAd->CommonCfg.BBPCurrentBW = BW_20;
2007 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &ByteValue);
2008 ByteValue &= (~0x18);
2009 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, ByteValue);
2011 #endif // DOT11_N_SUPPORT //
2013 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &ByteValue);
2014 ByteValue &= (~0x18);
2015 if (pAd->Antenna.field.TxPath == 2)
2019 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, ByteValue);
2021 RTMPSetPiggyBack(pAd,FALSE);
2022 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_PIGGYBACK_INUSED);
2024 #ifdef DOT11_N_SUPPORT
2025 pAd->CommonCfg.BACapability.word = pAd->CommonCfg.REGBACapability.word;
2026 #endif // DOT11_N_SUPPORT //
2028 // Restore all settings in the following.
2029 AsicUpdateProtect(pAd, 0, (ALLN_SETPROTECT|CCKSETPROTECT|OFDMSETPROTECT), TRUE, FALSE);
2030 AsicDisableRDG(pAd);
2031 pAd->CommonCfg.IOTestParm.bCurrentAtheros = FALSE;
2032 pAd->CommonCfg.IOTestParm.bNowAtherosBurstOn = FALSE;
2034 RTMP_IO_WRITE32(pAd, MAX_LEN_CFG, 0x1fff);
2035 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);
2037 #ifdef WPA_SUPPLICANT_SUPPORT
2038 #ifndef NATIVE_WPA_SUPPLICANT_SUPPORT
2039 if (pAd->StaCfg.WpaSupplicantUP) {
2040 union iwreq_data wrqu;
2041 //send disassociate event to wpa_supplicant
2042 memset(&wrqu, 0, sizeof(wrqu));
2043 wrqu.data.flags = RT_DISASSOC_EVENT_FLAG;
2044 wireless_send_event(pAd->net_dev, IWEVCUSTOM, &wrqu, NULL);
2046 #endif // NATIVE_WPA_SUPPLICANT_SUPPORT //
2047 #endif // WPA_SUPPLICANT_SUPPORT //
2049 #ifdef NATIVE_WPA_SUPPLICANT_SUPPORT
2051 union iwreq_data wrqu;
2052 memset(wrqu.ap_addr.sa_data, 0, MAC_ADDR_LEN);
2053 wireless_send_event(pAd->net_dev, SIOCGIWAP, &wrqu, NULL);
2055 #endif // NATIVE_WPA_SUPPLICANT_SUPPORT //
2061 // disable MMPS BBP control register
2062 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &ByteValue);
2063 ByteValue &= ~(0x04); //bit 2
2064 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, ByteValue);
2066 // disable MMPS MAC control register
2067 RTMP_IO_READ32(pAd, 0x1210, &macdata);
2068 macdata &= ~(0x09); //bit 0, 3
2069 RTMP_IO_WRITE32(pAd, 0x1210, macdata);
2076 ==========================================================================
2079 IRQL = DISPATCH_LEVEL
2081 ==========================================================================
2083 VOID IterateOnBssTab(
2084 IN PRTMP_ADAPTER pAd)
2086 MLME_START_REQ_STRUCT StartReq;
2087 MLME_JOIN_REQ_STRUCT JoinReq;
2090 // Change the wepstatus to original wepstatus
2091 pAd->StaCfg.WepStatus = pAd->StaCfg.OrigWepStatus;
2092 pAd->StaCfg.PairCipher = pAd->StaCfg.OrigWepStatus;
2093 pAd->StaCfg.GroupCipher = pAd->StaCfg.OrigWepStatus;
2095 BssIdx = pAd->MlmeAux.BssIdx;
2096 if (BssIdx < pAd->MlmeAux.SsidBssTab.BssNr)
2098 // Check cipher suite, AP must have more secured cipher than station setting
2099 // Set the Pairwise and Group cipher to match the intended AP setting
2100 // We can only connect to AP with less secured cipher setting
2101 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK))
2103 pAd->StaCfg.GroupCipher = pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA.GroupCipher;
2105 if (pAd->StaCfg.WepStatus == pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA.PairCipher)
2106 pAd->StaCfg.PairCipher = pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA.PairCipher;
2107 else if (pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA.PairCipherAux != Ndis802_11WEPDisabled)
2108 pAd->StaCfg.PairCipher = pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA.PairCipherAux;
2109 else // There is no PairCipher Aux, downgrade our capability to TKIP
2110 pAd->StaCfg.PairCipher = Ndis802_11Encryption2Enabled;
2112 else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK))
2114 pAd->StaCfg.GroupCipher = pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA2.GroupCipher;
2116 if (pAd->StaCfg.WepStatus == pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA2.PairCipher)
2117 pAd->StaCfg.PairCipher = pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA2.PairCipher;
2118 else if (pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA2.PairCipherAux != Ndis802_11WEPDisabled)
2119 pAd->StaCfg.PairCipher = pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA2.PairCipherAux;
2120 else // There is no PairCipher Aux, downgrade our capability to TKIP
2121 pAd->StaCfg.PairCipher = Ndis802_11Encryption2Enabled;
2124 pAd->StaCfg.RsnCapability = pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA2.RsnCapability;
2127 // Set Mix cipher flag
2128 pAd->StaCfg.bMixCipher = (pAd->StaCfg.PairCipher == pAd->StaCfg.GroupCipher) ? FALSE : TRUE;
2129 if (pAd->StaCfg.bMixCipher == TRUE)
2131 // If mix cipher, re-build RSNIE
2132 RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, 0);
2135 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - iterate BSS %ld of %d\n", BssIdx, pAd->MlmeAux.SsidBssTab.BssNr));
2136 JoinParmFill(pAd, &JoinReq, BssIdx);
2137 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_JOIN_REQ, sizeof(MLME_JOIN_REQ_STRUCT),
2139 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_JOIN;
2141 else if (pAd->StaCfg.BssType == BSS_ADHOC)
2143 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - All BSS fail; start a new ADHOC (Ssid=%s)...\n",pAd->MlmeAux.Ssid));
2144 StartParmFill(pAd, &StartReq, pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen);
2145 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_START_REQ, sizeof(MLME_START_REQ_STRUCT), &StartReq);
2146 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_START;
2150 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - All roaming failed, stay @ ch #%d\n", pAd->CommonCfg.Channel));
2151 AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
2152 AsicLockChannel(pAd, pAd->CommonCfg.Channel);
2153 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
2157 // for re-association only
2158 // IRQL = DISPATCH_LEVEL
2159 VOID IterateOnBssTab2(
2160 IN PRTMP_ADAPTER pAd)
2162 MLME_REASSOC_REQ_STRUCT ReassocReq;
2166 BssIdx = pAd->MlmeAux.RoamIdx;
2167 pBss = &pAd->MlmeAux.RoamTab.BssEntry[BssIdx];
2169 if (BssIdx < pAd->MlmeAux.RoamTab.BssNr)
2171 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - iterate BSS %ld of %d\n", BssIdx, pAd->MlmeAux.RoamTab.BssNr));
2173 AsicSwitchChannel(pAd, pBss->Channel, FALSE);
2174 AsicLockChannel(pAd, pBss->Channel);
2176 // reassociate message has the same structure as associate message
2177 AssocParmFill(pAd, &ReassocReq, pBss->Bssid, pBss->CapabilityInfo,
2178 ASSOC_TIMEOUT, pAd->StaCfg.DefaultListenCount);
2179 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_REASSOC_REQ,
2180 sizeof(MLME_REASSOC_REQ_STRUCT), &ReassocReq);
2182 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_REASSOC;
2186 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - All fast roaming failed, back to ch #%d\n",pAd->CommonCfg.Channel));
2187 AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
2188 AsicLockChannel(pAd, pAd->CommonCfg.Channel);
2189 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
2194 ==========================================================================
2197 IRQL = DISPATCH_LEVEL
2199 ==========================================================================
2202 IN PRTMP_ADAPTER pAd,
2203 IN OUT MLME_JOIN_REQ_STRUCT *JoinReq,
2206 JoinReq->BssIdx = BssIdx;
2210 ==========================================================================
2213 IRQL = DISPATCH_LEVEL
2215 ==========================================================================
2218 IN PRTMP_ADAPTER pAd,
2219 IN OUT MLME_SCAN_REQ_STRUCT *ScanReq,
2225 NdisZeroMemory(ScanReq->Ssid, MAX_LEN_OF_SSID);
2226 ScanReq->SsidLen = SsidLen;
2227 NdisMoveMemory(ScanReq->Ssid, Ssid, SsidLen);
2228 ScanReq->BssType = BssType;
2229 ScanReq->ScanType = ScanType;
2233 ==========================================================================
2236 IRQL = DISPATCH_LEVEL
2238 ==========================================================================
2241 IN PRTMP_ADAPTER pAd,
2242 IN OUT MLME_START_REQ_STRUCT *StartReq,
2246 ASSERT(SsidLen <= MAX_LEN_OF_SSID);
2247 NdisMoveMemory(StartReq->Ssid, Ssid, SsidLen);
2248 StartReq->SsidLen = SsidLen;
2252 ==========================================================================
2255 IRQL = DISPATCH_LEVEL
2257 ==========================================================================
2260 IN PRTMP_ADAPTER pAd,
2261 IN OUT MLME_AUTH_REQ_STRUCT *AuthReq,
2265 COPY_MAC_ADDR(AuthReq->Addr, pAddr);
2267 AuthReq->Timeout = AUTH_TIMEOUT;
2271 ==========================================================================
2274 IRQL = DISPATCH_LEVEL
2276 ==========================================================================
2282 VOID MlmeCntlConfirm(
2283 IN PRTMP_ADAPTER pAd,
2287 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MsgType, sizeof(USHORT), &Msg);
2291 IN PRTMP_ADAPTER pAd)
2293 PTXINFO_STRUC pTxInfo;
2296 DBGPRINT(RT_DEBUG_TRACE, ("ComposePsPoll\n"));
2297 NdisZeroMemory(&pAd->PsPollFrame, sizeof(PSPOLL_FRAME));
2299 pAd->PsPollFrame.FC.PwrMgmt = 0;
2300 pAd->PsPollFrame.FC.Type = BTYPE_CNTL;
2301 pAd->PsPollFrame.FC.SubType = SUBTYPE_PS_POLL;
2302 pAd->PsPollFrame.Aid = pAd->StaActive.Aid | 0xC000;
2303 COPY_MAC_ADDR(pAd->PsPollFrame.Bssid, pAd->CommonCfg.Bssid);
2304 COPY_MAC_ADDR(pAd->PsPollFrame.Ta, pAd->CurrentAddress);
2306 RTMPZeroMemory(&pAd->PsPollContext.TransferBuffer->field.WirelessPacket[0], 100);
2307 pTxInfo = (PTXINFO_STRUC)&pAd->PsPollContext.TransferBuffer->field.WirelessPacket[0];
2308 RTMPWriteTxInfo(pAd, pTxInfo, (USHORT)(sizeof(PSPOLL_FRAME)+TXWI_SIZE), TRUE, EpToQueue[MGMTPIPEIDX], FALSE, FALSE);
2309 pTxWI = (PTXWI_STRUC)&pAd->PsPollContext.TransferBuffer->field.WirelessPacket[TXINFO_SIZE];
2310 RTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, 0, BSSID_WCID, (sizeof(PSPOLL_FRAME)),
2311 0, 0, (UCHAR)pAd->CommonCfg.MlmeTransmit.field.MCS, IFS_BACKOFF, FALSE, &pAd->CommonCfg.MlmeTransmit);
2312 RTMPMoveMemory(&pAd->PsPollContext.TransferBuffer->field.WirelessPacket[TXWI_SIZE+TXINFO_SIZE], &pAd->PsPollFrame, sizeof(PSPOLL_FRAME));
2313 // Append 4 extra zero bytes.
2314 pAd->PsPollContext.BulkOutSize = TXINFO_SIZE + TXWI_SIZE + sizeof(PSPOLL_FRAME) + 4;
2317 // IRQL = DISPATCH_LEVEL
2318 VOID ComposeNullFrame(
2319 IN PRTMP_ADAPTER pAd)
2321 PTXINFO_STRUC pTxInfo;
2324 NdisZeroMemory(&pAd->NullFrame, sizeof(HEADER_802_11));
2325 pAd->NullFrame.FC.Type = BTYPE_DATA;
2326 pAd->NullFrame.FC.SubType = SUBTYPE_NULL_FUNC;
2327 pAd->NullFrame.FC.ToDs = 1;
2328 COPY_MAC_ADDR(pAd->NullFrame.Addr1, pAd->CommonCfg.Bssid);
2329 COPY_MAC_ADDR(pAd->NullFrame.Addr2, pAd->CurrentAddress);
2330 COPY_MAC_ADDR(pAd->NullFrame.Addr3, pAd->CommonCfg.Bssid);
2331 RTMPZeroMemory(&pAd->NullContext.TransferBuffer->field.WirelessPacket[0], 100);
2332 pTxInfo = (PTXINFO_STRUC)&pAd->NullContext.TransferBuffer->field.WirelessPacket[0];
2333 RTMPWriteTxInfo(pAd, pTxInfo, (USHORT)(sizeof(HEADER_802_11)+TXWI_SIZE), TRUE, EpToQueue[MGMTPIPEIDX], FALSE, FALSE);
2334 pTxWI = (PTXWI_STRUC)&pAd->NullContext.TransferBuffer->field.WirelessPacket[TXINFO_SIZE];
2335 RTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, 0, BSSID_WCID, (sizeof(HEADER_802_11)),
2336 0, 0, (UCHAR)pAd->CommonCfg.MlmeTransmit.field.MCS, IFS_BACKOFF, FALSE, &pAd->CommonCfg.MlmeTransmit);
2337 RTMPMoveMemory(&pAd->NullContext.TransferBuffer->field.WirelessPacket[TXWI_SIZE+TXINFO_SIZE], &pAd->NullFrame, sizeof(HEADER_802_11));
2338 pAd->NullContext.BulkOutSize = TXINFO_SIZE + TXWI_SIZE + sizeof(pAd->NullFrame) + 4;
2344 ==========================================================================
2346 Pre-build a BEACON frame in the shared memory
2348 IRQL = PASSIVE_LEVEL
2349 IRQL = DISPATCH_LEVEL
2351 ==========================================================================
2353 ULONG MakeIbssBeacon(
2354 IN PRTMP_ADAPTER pAd)
2356 UCHAR DsLen = 1, IbssLen = 2;
2357 UCHAR LocalErpIe[3] = {IE_ERP, 1, 0x04};
2358 HEADER_802_11 BcnHdr;
2359 USHORT CapabilityInfo;
2360 LARGE_INTEGER FakeTimestamp;
2362 PTXWI_STRUC pTxWI = &pAd->BeaconTxWI;
2363 CHAR *pBeaconFrame = pAd->BeaconBuf;
2365 UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES];
2366 UCHAR SupRateLen = 0;
2367 UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES];
2368 UCHAR ExtRateLen = 0;
2369 UCHAR RSNIe = IE_WPA;
2371 if ((pAd->CommonCfg.PhyMode == PHY_11B) && (pAd->CommonCfg.Channel <= 14))
2373 SupRate[0] = 0x82; // 1 mbps
2374 SupRate[1] = 0x84; // 2 mbps
2375 SupRate[2] = 0x8b; // 5.5 mbps
2376 SupRate[3] = 0x96; // 11 mbps
2380 else if (pAd->CommonCfg.Channel > 14)
2382 SupRate[0] = 0x8C; // 6 mbps, in units of 0.5 Mbps, basic rate
2383 SupRate[1] = 0x12; // 9 mbps, in units of 0.5 Mbps
2384 SupRate[2] = 0x98; // 12 mbps, in units of 0.5 Mbps, basic rate
2385 SupRate[3] = 0x24; // 18 mbps, in units of 0.5 Mbps
2386 SupRate[4] = 0xb0; // 24 mbps, in units of 0.5 Mbps, basic rate
2387 SupRate[5] = 0x48; // 36 mbps, in units of 0.5 Mbps
2388 SupRate[6] = 0x60; // 48 mbps, in units of 0.5 Mbps
2389 SupRate[7] = 0x6c; // 54 mbps, in units of 0.5 Mbps
2394 // Also Update MlmeRate & RtsRate for G only & A only
2396 pAd->CommonCfg.MlmeRate = RATE_6;
2397 pAd->CommonCfg.RtsRate = RATE_6;
2398 pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM;
2399 pAd->CommonCfg.MlmeTransmit.field.MCS = OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate];
2400 pAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MODE = MODE_OFDM;
2401 pAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MCS = OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate];
2405 SupRate[0] = 0x82; // 1 mbps
2406 SupRate[1] = 0x84; // 2 mbps
2407 SupRate[2] = 0x8b; // 5.5 mbps
2408 SupRate[3] = 0x96; // 11 mbps
2411 ExtRate[0] = 0x0C; // 6 mbps, in units of 0.5 Mbps,
2412 ExtRate[1] = 0x12; // 9 mbps, in units of 0.5 Mbps
2413 ExtRate[2] = 0x18; // 12 mbps, in units of 0.5 Mbps,
2414 ExtRate[3] = 0x24; // 18 mbps, in units of 0.5 Mbps
2415 ExtRate[4] = 0x30; // 24 mbps, in units of 0.5 Mbps,
2416 ExtRate[5] = 0x48; // 36 mbps, in units of 0.5 Mbps
2417 ExtRate[6] = 0x60; // 48 mbps, in units of 0.5 Mbps
2418 ExtRate[7] = 0x6c; // 54 mbps, in units of 0.5 Mbps
2422 pAd->StaActive.SupRateLen = SupRateLen;
2423 NdisMoveMemory(pAd->StaActive.SupRate, SupRate, SupRateLen);
2424 pAd->StaActive.ExtRateLen = ExtRateLen;
2425 NdisMoveMemory(pAd->StaActive.ExtRate, ExtRate, ExtRateLen);
2427 // compose IBSS beacon frame
2428 MgtMacHeaderInit(pAd, &BcnHdr, SUBTYPE_BEACON, 0, BROADCAST_ADDR, pAd->CommonCfg.Bssid);
2429 Privacy = (pAd->StaCfg.WepStatus == Ndis802_11Encryption1Enabled) ||
2430 (pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled) ||
2431 (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled);
2432 CapabilityInfo = CAP_GENERATE(0, 1, Privacy, (pAd->CommonCfg.TxPreamble == Rt802_11PreambleShort), 0, 0);
2434 MakeOutgoingFrame(pBeaconFrame, &FrameLen,
2435 sizeof(HEADER_802_11), &BcnHdr,
2436 TIMESTAMP_LEN, &FakeTimestamp,
2437 2, &pAd->CommonCfg.BeaconPeriod,
2440 1, &pAd->CommonCfg.SsidLen,
2441 pAd->CommonCfg.SsidLen, pAd->CommonCfg.Ssid,
2444 SupRateLen, SupRate,
2447 1, &pAd->CommonCfg.Channel,
2450 2, &pAd->StaActive.AtimWin,
2453 // add ERP_IE and EXT_RAE IE of in 802.11g
2458 MakeOutgoingFrame(pBeaconFrame + FrameLen, &tmp,
2462 ExtRateLen, ExtRate,
2467 // If adhoc secruity is set for WPA-None, append the cipher suite IE
2468 if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)
2471 RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, BSS0);
2473 MakeOutgoingFrame(pBeaconFrame + FrameLen, &tmp,
2475 1, &pAd->StaCfg.RSNIE_Len,
2476 pAd->StaCfg.RSNIE_Len, pAd->StaCfg.RSN_IE,
2481 #ifdef DOT11_N_SUPPORT
2482 if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED))
2485 UCHAR HtLen, HtLen1;
2487 #ifdef RT_BIG_ENDIAN
2488 HT_CAPABILITY_IE HtCapabilityTmp;
2489 ADD_HT_INFO_IE addHTInfoTmp;
2490 USHORT b2lTmp, b2lTmp2;
2493 // add HT Capability IE
2494 HtLen = sizeof(pAd->CommonCfg.HtCapability);
2495 HtLen1 = sizeof(pAd->CommonCfg.AddHTInfo);
2496 #ifndef RT_BIG_ENDIAN
2497 MakeOutgoingFrame(pBeaconFrame+FrameLen, &TmpLen,
2500 HtLen, &pAd->CommonCfg.HtCapability,
2503 HtLen1, &pAd->CommonCfg.AddHTInfo,
2506 NdisMoveMemory(&HtCapabilityTmp, &pAd->CommonCfg.HtCapability, HtLen);
2507 *(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo));
2508 *(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo));
2510 NdisMoveMemory(&addHTInfoTmp, &pAd->CommonCfg.AddHTInfo, HtLen1);
2511 *(USHORT *)(&addHTInfoTmp.AddHtInfo2) = SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo2));
2512 *(USHORT *)(&addHTInfoTmp.AddHtInfo3) = SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo3));
2514 MakeOutgoingFrame(pBeaconFrame+FrameLen, &TmpLen,
2517 HtLen, &HtCapabilityTmp,
2520 HtLen1, &addHTInfoTmp,
2525 #endif // DOT11_N_SUPPORT //
2527 //beacon use reserved WCID 0xff
2528 if (pAd->CommonCfg.Channel > 14)
2530 RTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, 0, 0xff, FrameLen,
2531 PID_MGMT, PID_BEACON, RATE_1, IFS_HTTXOP, FALSE, &pAd->CommonCfg.MlmeTransmit);
2535 // Set to use 1Mbps for Adhoc beacon.
2536 HTTRANSMIT_SETTING Transmit;
2538 RTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, 0, 0xff, FrameLen,
2539 PID_MGMT, PID_BEACON, RATE_1, IFS_HTTXOP, FALSE, &Transmit);
2542 #ifdef RT_BIG_ENDIAN
2543 RTMPFrameEndianChange(pAd, pBeaconFrame, DIR_WRITE, FALSE);
2544 RTMPWIEndianChange((PUCHAR)pTxWI, TYPE_TXWI);
2547 DBGPRINT(RT_DEBUG_TRACE, ("MakeIbssBeacon (len=%ld), SupRateLen=%d, ExtRateLen=%d, Channel=%d, PhyMode=%d\n",
2548 FrameLen, SupRateLen, ExtRateLen, pAd->CommonCfg.Channel, pAd->CommonCfg.PhyMode));