📄 connect.c
字号:
NdisAcquireSpinLock(&pAd->MacTabLock); RTMPMoveMemory(pAd->MacTab.Content[BSSID_WCID].Addr, pAd->CommonCfg.Bssid, MAC_ADDR_LEN); pAd->MacTab.Content[BSSID_WCID].Aid = BSSID_WCID; pAd->MacTab.Content[BSSID_WCID].pAd = pAd; pAd->MacTab.Content[BSSID_WCID].ValidAsCLI = TRUE; //Although this is bssid..still set ValidAsCl pAd->MacTab.Size = 1; // infra mode always set MACtab size =1. pAd->MacTab.Content[BSSID_WCID].Sst = SST_ASSOC; pAd->MacTab.Content[BSSID_WCID].AuthState = SST_ASSOC; NdisReleaseSpinLock(&pAd->MacTabLock); DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK UP !!! ClientStatusFlags=%lx, Mmps=%d, AmsduSize=%d, )\n", pAd->MacTab.Content[BSSID_WCID].ClientStatusFlags, pAd->MacTab.Content[BSSID_WCID].MmpsMode, pAd->MacTab.Content[BSSID_WCID].AMsduSize)); DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK UP !! (StaActive.bHtEnable =%d, )\n", pAd->StaActive.SupportedHtPhy.bHtEnable)); // When STA assocates with WEP or TKIP enabled AP, STA cannot send BA request. // ex. If STA send BA request to WEP enabled Atheros AP, data connection will fail. if ((pAd->CommonCfg.BACapability.field.AutoBA == TRUE) && (pAd->StaActive.SupportedHtPhy.bHtEnable == TRUE)) { if (pAd->StaCfg.WepStatus == Ndis802_11WEPDisabled) BAOriSessionSetUp(pAd, &pAd->MacTab.Content[BSSID_WCID], 0, 0,3000, FALSE); else if ((pAd->MlmeAux.APRalinkIe != 0x0) && (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled)) {#ifdef WPA_SUPPLICANT_SUPPORT if (pAd->StaCfg.IEEE8021X == FALSE)#endif // WPA_SUPPLICANT_SUPPORT // // Static WEP BAOriSessionSetUp(pAd, &pAd->MacTab.Content[BSSID_WCID], 0, 0,3000, FALSE);#ifdef WPA_SUPPLICANT_SUPPORT else // Dynamic 1x WEP BAOriSessionSetUp(pAd, &pAd->MacTab.Content[BSSID_WCID], 0, 0, 9000, FALSE);#endif // WPA_SUPPLICANT_SUPPORT // } else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)) { if ((pAd->StaCfg.WepStatus != Ndis802_11Encryption2Enabled) || (pAd->MlmeAux.APRalinkIe != 0x0)) BAOriSessionSetUp(pAd, &pAd->MacTab.Content[BSSID_WCID], 0, 0,3000, FALSE); }#ifdef WPA_SUPPLICANT_SUPPORT else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2)) { if ((pAd->StaCfg.WepStatus != Ndis802_11Encryption2Enabled) || (pAd->MlmeAux.APRalinkIe != 0x0)) BAOriSessionSetUp(pAd, &pAd->MacTab.Content[BSSID_WCID], 0, 0,10000, FALSE); }#endif // WPA_SUPPLICANT_SUPPORT // } MlmeUpdateTxRates(pAd, TRUE); MlmeUpdateHtTxRates(pAd, BSSID_WCID); // // Report Adjacent AP report. //#ifdef LEAP_SUPPORT CCXAdjacentAPReport(pAd);#endif // LEAP_SUPPORT // if (pAd->CommonCfg.bAggregationCapable) { if ((pAd->CommonCfg.bPiggyBackCapable) && (pAd->MlmeAux.APRalinkIe & 0x00000003) == 3) { OPSTATUS_SET_FLAG(pAd, fOP_STATUS_PIGGYBACK_INUSED); OPSTATUS_SET_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED); RTMPSetPiggyBack(pAd, TRUE); DBGPRINT(RT_DEBUG_TRACE, ("Turn on Piggy-Back\n")); } else if (pAd->MlmeAux.APRalinkIe & 0x00000001) { OPSTATUS_SET_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED); } } if (pAd->MlmeAux.APRalinkIe != 0x0) { if (CLIENT_STATUS_TEST_FLAG(&pAd->MacTab.Content[BSSID_WCID], fCLIENT_STATUS_RDG_CAPABLE)) { AsicEnableRDG(pAd); } OPSTATUS_SET_FLAG(pAd, fCLIENT_STATUS_RALINK_CHIPSET); CLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[BSSID_WCID], fCLIENT_STATUS_RALINK_CHIPSET); } else { OPSTATUS_CLEAR_FLAG(pAd, fCLIENT_STATUS_RALINK_CHIPSET); CLIENT_STATUS_CLEAR_FLAG(&pAd->MacTab.Content[BSSID_WCID], fCLIENT_STATUS_RALINK_CHIPSET); } } 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)); DBGPRINT(RT_DEBUG_INFO, ("CCX: CWMax CWMin %d %d\n", pAd->StaCfg.CCXQosECWMax, pAd->StaCfg.CCXQosECWMin)); // Set LED RTMPSetLED(pAd, LED_LINK_UP); pAd->Mlme.PeriodicRound = 0; // re-schedule MlmePeriodicExec() pAd->Mlme.OneSecPeriodicRound = 0; pAd->bConfigChanged = FALSE; // Reset config flag pAd->ExtraInfo = GENERAL_LINK_UP; // Update extra information to link is up // Set asic auto fall back { PUCHAR pTable; UCHAR TableSize = 0; MlmeSelectTxRateTable(pAd, &pTable, &TableSize, &pAd->CommonCfg.TxRateIndex); AsicUpdateAutoFallBackTable(pAd, pTable); } if (pAd->CommonCfg.bAutoTxRateSwitch == FALSE) { pEntry = &pAd->MacTab.Content[BSSID_WCID]; pEntry->HTPhyMode.field.MODE = pAd->CommonCfg.HTPhyMode.field.MODE; pEntry->HTPhyMode.field.MCS = pAd->CommonCfg.HTPhyMode.field.MCS; pEntry->HTPhyMode.field.BW = pAd->CommonCfg.HTPhyMode.field.BW; pEntry->HTPhyMode.field.STBC = pAd->CommonCfg.HTPhyMode.field.STBC; pEntry->HTPhyMode.field.ShortGI = pAd->CommonCfg.HTPhyMode.field.ShortGI; if (pEntry->HTPhyMode.field.MCS == 32) pEntry->HTPhyMode.field.ShortGI = GI_800;// For Wifi Short GI test item, we need to use short GI at every rate, although our rate adaptation prefer only short GI at MCS=15.#ifdef WIFI_TEST#else if (pEntry->HTPhyMode.field.MCS < MCS_15) pEntry->HTPhyMode.field.ShortGI = GI_800;#endif if ((pEntry->HTPhyMode.field.MCS > MCS_7) || (pEntry->HTPhyMode.field.MCS == 32)) pEntry->HTPhyMode.field.STBC = STBC_NONE; } // Let Link Status Page display first initial rate. pAd->LastTxRate = (USHORT)(pAd->MacTab.Content[BSSID_WCID].HTPhyMode.word); // Select DAC according to HT or Legacy if (pAd->StaActive.SupportedHtPhy.MCSSet[0] != 0x00) { RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &Value); Value &= (~0x18); if (pAd->Antenna.field.TxPath == 2) { Value |= 0x10; } RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, Value); } else { RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &Value); Value &= (~0x18); RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, Value); } if (pAd->StaActive.SupportedHtPhy.bHtEnable == FALSE) { } else if (pAd->MacTab.Content[BSSID_WCID].MaxRAmpduFactor == 0) { RTMP_IO_WRITE32(pAd, MAX_LEN_CFG, 0x0fff); // Default set to 0x1fff. But if one peer can't support 0x1fff, we need to change to 0xfff } // Patch for Marvel AP to gain high throughput // Need to set as following, // 1. Set txop in register-EDCA_AC0_CFG as 0x60 // 2. Set EnTXWriteBackDDONE in register-WPDMA_GLO_CFG as zero // 3. PBF_MAX_PCNT as 0x1F3FBF9F // 4. kick per two packets when dequeue // // Txop can only be modified when RDG is off, WMM is disable and TxBurst is enable if (pAd->CommonCfg.bEnableTxBurst) { RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data); Data &= 0xFFFFFF00; Data |= 0x60; RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data); pAd->CommonCfg.IOTestParm.bNowAtherosBurstOn = TRUE; RTMP_IO_WRITE32(pAd, PBF_MAX_PCNT, 0x1F3FBF9F); } else { RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data); Data &= 0xFFFFFF00; RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data); RTMP_IO_WRITE32(pAd, PBF_MAX_PCNT, 0x1F3F7F9F); } // Re-check to turn on TX burst or not. if ((pAd->CommonCfg.IOTestParm.bLastAtheros == TRUE) && ((STA_WEP_ON(pAd))||(STA_TKIP_ON(pAd)))) { pAd->CommonCfg.IOTestParm.bNextDisableRxBA = TRUE; if (pAd->CommonCfg.bEnableTxBurst) { UINT MACValue = 0; // Force disable TXOP value in this case. The same action in MLMEUpdateProtect too. // I didn't change PBF_MAX_PCNT setting. RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &MACValue); MACValue &= 0xFFFFFF00; RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, MACValue); pAd->CommonCfg.IOTestParm.bNowAtherosBurstOn = FALSE; } } else { pAd->CommonCfg.IOTestParm.bNextDisableRxBA = FALSE; } pAd->CommonCfg.IOTestParm.bLastAtheros = FALSE; COPY_MAC_ADDR(pAd->CommonCfg.LastBssid, pAd->CommonCfg.Bssid); DBGPRINT(RT_DEBUG_TRACE, ("!!!pAd->bNextDisableRxBA= %d \n", pAd->CommonCfg.IOTestParm.bNextDisableRxBA)); // BSSID add in one MAC entry too. Because in Tx, ASIC need to check Cipher and IV/EIV, BAbitmap // Pther information in MACTab.Content[BSSID_WCID] is not necessary for driver. // Note: As STA, The MACTab.Content[BSSID_WCID]. PairwiseKey and Shared Key for BSS0 are the same.}/* ========================================================================== Routine Description: Disconnect current BSSID Arguments: pAd - Pointer to our adapter IsReqFromAP - Request from AP Return Value: None IRQL = DISPATCH_LEVEL Note: We need more information to know it's this requst from AP. If yes! we need to do extra handling, for example, remove the WPA key. Otherwise on 4-way handshaking will faied, since the WPA key didn't be remove while auto reconnect. Disconnect request from AP, it means we will start afresh 4-way handshaking on WPA mode. ==========================================================================*/VOID LinkDown( IN PRTMP_ADAPTER pAd, IN BOOLEAN IsReqFromAP){ UCHAR i, ByteValue = 0; TX_RTY_CFG_STRUC CurTxRryCfg; // Do nothing if monitor mode is on if (MONITOR_ON(pAd)) return;#ifdef RALINK_ATE // Nothing to do in ATE mode. if (pAd->ate.Mode != ATE_STOP) return;#endif // RALINK_ATE // DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK DOWN !!!\n")); OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED); if (ADHOC_ON(pAd)) // Adhoc mode link down { DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK DOWN 1!!!\n")); // Delete every BA session with BSSID BEFORE tear INFRA. //BATableTearRECEntry(pAd, pAd->CommonCfg.Bssid, 0, BSSID_WCID, TRUE); //BATableTearORIEntry(pAd, pAd->CommonCfg.Bssid, 0, TRUE); OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADHOC_ON);#ifdef SINGLE_ADHOC_LINKUP OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); pAd->IndicateMediaState = NdisMediaStateDisconnected; NdisMIndicateStatus(pAd->AdapterHandle, NDIS_STATUS_MEDIA_DISCONNECT, (PVOID)NULL, 0); NdisMIndicateStatusComplete(pAd->AdapterHandle); // clean up previous SCAN result, add current BSS back to table if any BssTableDeleteEntry(&pAd->ScanTab, pAd->CommonCfg.Bssid, pAd->CommonCfg.Channel);#else // Why need this ??? //if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)) { OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); pAd->IndicateMediaState = NdisMediaStateDisconnected; RTMP_IndicateMediaState(); BssTableDeleteEntry(&pAd->ScanTab, pAd->CommonCfg.Bssid, pAd->CommonCfg.Channel); }#endif DBGPRINT(RT_DEBUG_TRACE, ("!!! MacTab.Size=%d !!!\n", pAd->MacTab.Size)); // ad-hoc linkdown Reset MAC Table. Start from 1 or 0 ? NdisAcquireSpinLock(&pAd->MacTabLock); for (i=1; i<MAX_LEN_OF_MAC_TABLE; i++) { if (pAd->MacTab.Size == 0) break; if (pAd->MacTab.Content[i].ValidAsCLI == TRUE) { // free resources of BA BASessionTearDownALL(pAd, i); pAd->MacTab.Content[i].ValidAsCLI = FALSE; RTMPZeroMemory(pAd->MacTab.Content[i].Addr, MAC_ADDR_LEN); AsicRemovePairwiseKeyEntry(pAd, BSS0, i); pAd->MacTab.Size --; AsicDelWcidTab(pAd, i); } pAd->MacTab.Content[i].ValidAsWDS = FALSE; } NdisReleaseSpinLock(&pAd->MacTabLock); } else // Infra structure mode { DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK DOWN 2!!!\n")); // Delete every BA session with BSSID before tear down INFRA. // free resources of BA BASessionTearDownALL(pAd, BSSID_WCID); OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_INFRA_ON); OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); // Saved last SSID for linkup comparison pAd->CommonCfg.LastSsidLen = pAd->CommonCfg.SsidLen; NdisMoveMemory(pAd->CommonCfg.LastSsid, pAd->CommonCfg.Ssid, pAd->CommonCfg.LastSsidLen); COPY_MAC_ADDR(pAd->CommonCfg.LastBssid, pAd->CommonCfg.Bssid); if (pAd->MlmeAux.CurrReqIsFromNdis == TRUE) { pAd->IndicateMediaState = NdisMediaStateDisconnected; RTMP_IndicateMediaState(); DBGPRINT(RT_DEBUG_TRACE, ("NDIS_STATUS_MEDIA_DISCONNECT Event A!\n")); pAd->MlmeAux.CurrReqIsFromNdis = FALSE; } else { // Set linkdown timer RTMPSetTimer(&pAd->Mlme.LinkDownTimer, 10000); // // If disassociation request is from NDIS, then we don't need to delete BSSID from entry. // Otherwise lost beacon or receive De-Authentication from AP, // then we should delete BSSID from BssTable. // If we don't delete from entry, roaming will fail. // BssTableDeleteEntry(&pAd->ScanTab, pAd->CommonCfg.Bssid, pAd->CommonCfg.Channel); } // restore back to - // 1. long slot (20 us) or short slot (9 us) time // 2. turn on/off RTS/CTS and/or CTS-to-self protection // 3. short preamble OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED); if (pAd->StaCfg.CCXAdjacentAPReportFlag == TRUE) { // // Record current AP's information. // for later used reporting Adjacent AP report. // pAd->StaCfg.CCXAdjacentAPChannel = pAd->CommonCfg.Channel; pAd->StaCfg.CCXAdjacentAPSsidLen = pAd->CommonCfg.SsidLen; NdisMov
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -