📄 connect.c
字号:
} pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_JOIN_IN_PROGRESS);//steven:for test } }// for re-association onlyVOID IterateOnBssTab2( IN PRT2570ADAPTER pAd) { MLME_REASSOC_REQ_STRUCT ReassocReq; ULONG BssIdx; BSS_ENTRY *pBss; BssIdx = pAd->Mlme.CntlAux.RoamIdx; pBss = &pAd->Mlme.CntlAux.RoamTab.BssEntry[BssIdx]; if (BssIdx < pAd->Mlme.CntlAux.RoamTab.BssNr) { if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_REASSOC_IN_PROGRESS)) RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_REASSOC_IN_PROGRESS);//steven:for test DBGPRINT(RT_DEBUG_TRACE, "CNTL - try BSS #%d %02x:%02x:%02x:%02x:%02x:%02x ...\n", BssIdx, pBss->Bssid.Octet[0],pBss->Bssid.Octet[1],pBss->Bssid.Octet[2], pBss->Bssid.Octet[3],pBss->Bssid.Octet[4],pBss->Bssid.Octet[5]); AsicSwitchChannel(pAd, pBss->Channel); AsicLockChannel(pAd, pBss->Channel); // reassociate message has the same structure as associate message AssocParmFill(pAd, &ReassocReq, &pBss->Bssid, pBss->CapabilityInfo, ASSOC_TIMEOUT, pAd->PortCfg.DefaultListenCount); MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_REASSOC_REQ, sizeof(MLME_REASSOC_REQ_STRUCT), &ReassocReq); pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_REASSOC; } else // no more BSS { DBGPRINT(RT_DEBUG_TRACE, "CNTL - All roaming failed, stay with original AP\n"); AsicSwitchChannel(pAd, pAd->PortCfg.Channel); AsicLockChannel(pAd, pAd->PortCfg.Channel); pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_REASSOC_IN_PROGRESS);//steven:for test } }/* ========================================================================== Description: ==========================================================================*/VOID JoinParmFill( IN PRT2570ADAPTER pAd, IN OUT MLME_JOIN_REQ_STRUCT *JoinReq, IN ULONG BssIdx) { JoinReq->BssIdx = BssIdx;}/* ========================================================================== Description: ==========================================================================*/VOID AssocParmFill( IN PRT2570ADAPTER pAd, IN OUT MLME_ASSOC_REQ_STRUCT *AssocReq, IN MACADDR *Addr, IN USHORT CapabilityInfo, IN ULONG Timeout, IN USHORT ListenIntv) { COPY_MAC_ADDR(&AssocReq->Addr, Addr); // Add mask to support 802.11b mode only AssocReq->CapabilityInfo = CapabilityInfo & 0xfff3; // not cf-pollable, not cf-poll-request AssocReq->Timeout = Timeout; AssocReq->ListenIntv = ListenIntv;}/* ========================================================================== Description: ==========================================================================*/VOID ScanParmFill( IN PRT2570ADAPTER pAd, IN OUT MLME_SCAN_REQ_STRUCT *ScanReq, IN CHAR Ssid[], IN UCHAR SsidLen, IN UCHAR BssType, IN UCHAR ScanType) { ScanReq->SsidLen = SsidLen; memcpy(ScanReq->Ssid, Ssid, SsidLen); ScanReq->BssType = BssType; ScanReq->ScanType = ScanType;}/* ========================================================================== Description: ==========================================================================*/VOID DisassocParmFill( IN PRT2570ADAPTER pAd, IN OUT MLME_DISASSOC_REQ_STRUCT *DisassocReq, IN MACADDR *Addr, IN USHORT Reason) { COPY_MAC_ADDR(&DisassocReq->Addr, Addr); DisassocReq->Reason = Reason;}/* ========================================================================== Description: ==========================================================================*/VOID StartParmFill( IN PRT2570ADAPTER pAd, IN OUT MLME_START_REQ_STRUCT *StartReq, IN CHAR Ssid[], IN UCHAR SsidLen) { memcpy(StartReq->Ssid, Ssid, SsidLen); StartReq->SsidLen = SsidLen;}/* ========================================================================== Description: ==========================================================================*/VOID AuthParmFill( IN PRT2570ADAPTER pAd, IN OUT MLME_AUTH_REQ_STRUCT *AuthReq, IN MACADDR *Addr, IN USHORT Alg) { COPY_MAC_ADDR(&AuthReq->Addr, Addr); AuthReq->Alg = Alg; AuthReq->Timeout = AUTH_TIMEOUT;}/* ========================================================================== Description: ========================================================================== */VOID ComposePsPoll( IN PRT2570ADAPTER pAd){ PSPOLL_FRAME *pPsPoll = (PSPOLL_FRAME *)&(pAd->PsPollContext.TransferBuffer->WirelessPacket); memset(pPsPoll, 0, sizeof(PSPOLL_FRAME)); pPsPoll->Type = BTYPE_CNTL; pPsPoll->SubType = SUBTYPE_PS_POLL; pPsPoll->Aid = pAd->PortCfg.Aid | 0xC000; COPY_MAC_ADDR(&(pPsPoll->Bssid), &pAd->PortCfg.Bssid); COPY_MAC_ADDR(&(pPsPoll->Ta), &(pAd->CurrentAddress));}VOID ComposeNullFrame( IN PRT2570ADAPTER pAd){ PHEADER_802_11 pNullFrame = (PHEADER_802_11)&(pAd->NullContext.TransferBuffer->WirelessPacket); MgtMacHeaderInit(pAd, (PMACHDR)pNullFrame, SUBTYPE_NULL_FUNC, 1, &pAd->PortCfg.Bssid, &pAd->PortCfg.Bssid); pNullFrame->Controlhead.Duration = 0; pNullFrame->Controlhead.Frame.Type = BTYPE_DATA;}/* ========================================================================== Description: Pre-build a BEACON frame in the shared memory ==========================================================================*/VOID MakeIbssBeacon( IN PRT2570ADAPTER pAd) { UCHAR SsidIe = IE_SSID, DsIe = IE_DS_PARM, IbssIe = IE_IBSS_PARM, SuppIe = IE_SUPP_RATES, DsLen = 1, IbssLen = 2; UCHAR i, ExtRateIe = IE_EXT_SUPP_RATES, ExtRatesLen; UCHAR ErpIe[3] = {IE_ERP, 1, 0x04}; MACHDR BcnHdr; USHORT CapabilityInfo; LARGE_INTEGER FakeTimestamp; ULONG FrameLen; UCHAR SupportedRatesLen = 0; UCHAR SupportedRates[MAX_LEN_OF_SUPPORTED_RATES]; BOOLEAN Privacy; PUCHAR pBeaconFrame; PTXD_STRUC pTxD; ULONG BulkOutLength; PTX_CONTEXT pBeaconContext = &(pAd->BeaconContext[0]);#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 0) if (pAd->MLMEThr_pid <= 0) return;#else if (!pAd->MLMEThr_active) return;#endif // 2003-12-10 802.11g WIFI spec disallow OFDM rates in 802.11g ADHOC mode // make sure 1,2,5.5,11 are the firt 4 rates in PortCfg.SupportedRates[] array if ((pAd->PortCfg.PhyMode == PHY_11BG_MIXED) && (pAd->PortCfg.AdhocMode == 0)) { for (i = 0; i < pAd->PortCfg.SupportedRatesLen; i++) { switch (pAd->PortCfg.SupportedRates[i] & 0x7f) { case 2: case 4: case 11: case 22: SupportedRates[SupportedRatesLen] = pAd->PortCfg.SupportedRates[i]; SupportedRatesLen ++; break; default: break; } } // error handling - should never happen if (SupportedRatesLen != 4) { SupportedRatesLen = 4; SupportedRates[0] = 0x82; SupportedRates[1] = 0x84; SupportedRates[2] = 0x8b; SupportedRates[3] = 0x96; } } else { SupportedRatesLen = pAd->PortCfg.SupportedRatesLen; memcpy(SupportedRates, pAd->PortCfg.SupportedRates, SupportedRatesLen); } if (pBeaconContext->InUse == TRUE) return; else pBeaconContext->InUse = TRUE; pAd->PortCfg.AtimWin = 0; // ?????? // compose IBSS beacon frame MgtMacHeaderInit(pAd, &BcnHdr, SUBTYPE_BEACON, 0, &pAd->PortCfg.Broadcast, &pAd->PortCfg.Bssid); Privacy = (pAd->PortCfg.WepStatus == Ndis802_11Encryption1Enabled) || (pAd->PortCfg.WepStatus == Ndis802_11Encryption2Enabled) || (pAd->PortCfg.WepStatus == Ndis802_11Encryption3Enabled); CapabilityInfo = CAP_GENERATE(0, 1, 0, 0, Privacy, (pAd->PortCfg.WindowsTxPreamble == Rt802_11PreambleShort)); // Prepare beacon frame, this should go to beacon_ring[1] which contains the real body. pBeaconFrame = (PUCHAR) pAd->BeaconContext[1].TransferBuffer->WirelessPacket; if (SupportedRatesLen <= 8) { MakeOutgoingFrame(pBeaconFrame, &FrameLen, MAC_HDR_LEN, &BcnHdr, TIMESTAMP_LEN, &FakeTimestamp, 2, &pAd->PortCfg.BeaconPeriod, 2, &CapabilityInfo, 1, &SsidIe, 1, &pAd->PortCfg.SsidLen, pAd->PortCfg.SsidLen, pAd->PortCfg.Ssid, 1, &SuppIe, 1, &SupportedRatesLen, SupportedRatesLen, SupportedRates, 1, &DsIe, 1, &DsLen, 1, &pAd->PortCfg.Channel, 1, &IbssIe, 1, &IbssLen, 2, &pAd->PortCfg.AtimWin, END_OF_ARGS); } else { ExtRatesLen = SupportedRatesLen - 8; SupportedRatesLen = 8; MakeOutgoingFrame(pBeaconFrame, &FrameLen, MAC_HDR_LEN, &BcnHdr, TIMESTAMP_LEN, &FakeTimestamp, 2, &pAd->PortCfg.BeaconPeriod, 2, &CapabilityInfo, 1, &SsidIe, 1, &pAd->PortCfg.SsidLen, pAd->PortCfg.SsidLen, pAd->PortCfg.Ssid, 1, &SuppIe, 1, &SupportedRatesLen, SupportedRatesLen, SupportedRates, 1, &DsIe, 1, &DsLen, 1, &pAd->PortCfg.Channel, 1, &IbssIe, 1, &IbssLen, 2, &pAd->PortCfg.AtimWin, 3, ErpIe, 1, &ExtRateIe, 1, &ExtRatesLen, ExtRatesLen, &SupportedRates[SupportedRatesLen], END_OF_ARGS); } // If adhoc secruity is set for WPA-None, append the cipher suite IE if (pAd->PortCfg.AuthMode == Ndis802_11AuthModeWPANone) { ULONG tmp = 0; UCHAR WpaIe = IE_WPA; if (pAd->PortCfg.WepStatus == Ndis802_11Encryption2Enabled) // Tkip { MakeOutgoingFrame(pBeaconFrame + FrameLen, &tmp, 1, &WpaIe, 1, &CipherSuiteWpaNoneTkipLen, CipherSuiteWpaNoneTkipLen, &CipherSuiteWpaNoneTkip[0], END_OF_ARGS); FrameLen += tmp; } else if (pAd->PortCfg.WepStatus == Ndis802_11Encryption3Enabled) // Aes { MakeOutgoingFrame(pBeaconFrame + FrameLen, &tmp, 1, &WpaIe, 1, &CipherSuiteWpaNoneAesLen, CipherSuiteWpaNoneAesLen, &CipherSuiteWpaNoneAes[0], END_OF_ARGS); FrameLen += tmp; } } BulkOutLength = sizeof(TXD_STRUC) + FrameLen; if ((BulkOutLength % 2) == 1) BulkOutLength ++;// if (BulkOutLength % pAd->BulkOutMaxPacketSize == 0)// BulkOutLength += 2; for (i = 0; i < BEACON_RING_SIZE; i++) { pTxD = (PTXD_STRUC) &pAd->BeaconContext[i].TransferBuffer->TxDesc; memset(pTxD, 0, sizeof(TXD_STRUC)); pBeaconContext = &(pAd->BeaconContext[i]);; // Both TxD need to put in the right descriptor RTUSBWriteBeaconDescriptor(pTxD, FrameLen, FrameLen + 4, pAd->PortCfg.MlmeRate, 4, pAd->PortCfg.TxPreambleInUsed); if (i == 0) pBeaconContext->BulkOutSize = 1; else pBeaconContext->BulkOutSize = BulkOutLength; DBGPRINT(RT_DEBUG_TRACE, " (pBeaconContext->BulkOutSize=%d)\n", pBeaconContext->BulkOutSize); } // The flags will always start from beacon 0 RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_BEACON_0); // Kick bulk out RTUSBKickBulkOut(pAd);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -