📄 connect.c
字号:
{
if (pAd->Mlme.CntlAux.CurrReqIsFromNdis)
{
DBGPRINT(RT_DEBUG_TRACE, "CNTL - All BSS fail; reply NDIS_STATUS_NOT_ACCEPTED\n");
NdisMSetInformationComplete(pAd->AdapterHandle, NDIS_STATUS_SUCCESS);
}
pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_JOIN_IN_PROGRESS);//steven:for test
}
}
// for re-association only
VOID 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;
NdisMoveMemory(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)
{
NdisMoveMemory(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);
NdisZeroMemory(pPsPoll, 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 (pAd->MLMEThr_pid <= 0)
return;
// 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;
NdisMoveMemory(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;
NdisZeroMemory(pTxD, 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 + -