📄 assoc.c
字号:
{
// go to procedure listed on page 376
// Mask out unnecessary capability information
CapabilityInfo &= SUPPORTED_CAPABILITY_INFO; // pAd->PortCfg.SupportedCapabilityInfo;
AssocPostProc(pAd, &Addr2, CapabilityInfo, Aid, Rates, RatesLen, ExtendedRateIeExist);
}
pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
MlmeCntlConfirm(pAd, MT2_ASSOC_CONF, Status);
}
}
else
{
DBGPRINT(RT_DEBUG_TRACE, "ASSOC - PeerAssocRspAction() sanity check fail\n");
}
}
/*
==========================================================================
Description:
peer sends reassoc rsp
Parametrs:
Elem - MLME message cntaining the received frame
IRQL = DISPATCH_LEVEL
==========================================================================
*/
VOID PeerReassocRspAction(
IN PRT2570ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem)
{
USHORT CapabilityInfo;
USHORT Status;
USHORT Aid;
UCHAR Rates[MAX_LEN_OF_SUPPORTED_RATES];
UCHAR RatesLen;
MACADDR Addr2;
BOOLEAN ExtendedRateIeExist;
if(PeerAssocRspSanity(pAd, Elem->Msg, Elem->MsgLen, &Addr2, &CapabilityInfo, &Status, &Aid, Rates, &RatesLen, &ExtendedRateIeExist))
{
if(MAC_ADDR_EQUAL(&Addr2, &pAd->Mlme.AssocAux.Addr)) // The frame is for me ?
{
DBGPRINT(RT_DEBUG_TRACE, "ASSOC - receive REASSOC_RSP to me (status=%d)\n", Status);
RTMPCancelTimer(&pAd->Mlme.AssocAux.ReassocTimer);
if(Status == MLME_SUCCESS)
{
// Mask out unnecessary capability information
CapabilityInfo &= SUPPORTED_CAPABILITY_INFO; // pAd->PortCfg.SupportedCapabilityInfo;
// go to procedure listed on page 376
AssocPostProc(pAd, &Addr2, CapabilityInfo, Aid, Rates, RatesLen, ExtendedRateIeExist);
}
pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
MlmeCntlConfirm(pAd, MT2_REASSOC_CONF, Status);
}
}
else
{
DBGPRINT(RT_DEBUG_TRACE, "ASSOC - PeerReassocRspAction() sanity check fail\n");
}
}
/*
==========================================================================
Description:
procedures on IEEE 802.11/1999 p.376
Parametrs:
IRQL = DISPATCH_LEVEL
==========================================================================
*/
VOID AssocPostProc(
IN PRT2570ADAPTER pAd,
IN PMACADDR Addr2,
IN USHORT CapabilityInfo,
IN USHORT Aid,
IN UCHAR Rates[],
IN UCHAR RatesLen,
IN BOOLEAN ExtendedRateIeExist)
{
ULONG Idx;
UCHAR RateIe = IE_SUPP_RATES;
UCHAR VarIesOffset;
// 2003/12/11 - skip the following because experiment show that we can not
// trust the "privacy" bit in AssocRsp. We can only trust "Privacy" bit specified in
// BEACON and ProbeRsp.
// pAd->PortCfg.PrivacyInvoked = CAP_IS_PRIVACY_ON(CapabilityInfo);
pAd->PortCfg.Aid = Aid;
NdisMoveMemory(pAd->PortCfg.SupportedRates, Rates, RatesLen);
pAd->PortCfg.SupportedRatesLen = RatesLen;
COPY_MAC_ADDR(&pAd->PortCfg.Bssid, Addr2);
AsicSetBssid(pAd, &pAd->PortCfg.Bssid);
// set listen interval
pAd->PortCfg.DefaultListenCount = pAd->Mlme.AssocAux.ListenIntv;
// pAd->PortCfg.CurrListenCount = pAd->Mlme.AssocAux.ListenIntv;
// Set New WPA information
Idx = BssTableSearch(&pAd->PortCfg.BssTab, Addr2);
if (Idx == BSS_NOT_FOUND)
{
DBGPRINT(RT_DEBUG_ERROR, "ASSOC - Can't find BSS after receiving Assoc response\n");
}
else
{
// Mod by James to fix OID_802_11_ASSOCIATION_INFORMATION
pAd->PortCfg.AssocInfo.Length = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); //+ sizeof(NDIS_802_11_FIXED_IEs); // Filled in assoc request
pAd->PortCfg.AssocInfo.AvailableResponseFixedIEs =
NDIS_802_11_AI_RESFI_CAPABILITIES | NDIS_802_11_AI_RESFI_STATUSCODE | NDIS_802_11_AI_RESFI_ASSOCIATIONID;
pAd->PortCfg.AssocInfo.ResponseFixedIEs.Capabilities = CapabilityInfo;
pAd->PortCfg.AssocInfo.ResponseFixedIEs.StatusCode = MLME_SUCCESS; // Should be success, add failed later
pAd->PortCfg.AssocInfo.ResponseFixedIEs.AssociationId = Aid;
// Copy BSS VarIEs to PortCfg associnfo structure.
// First add Supported rates
VarIesOffset = 0;
NdisMoveMemory(pAd->PortCfg.ResVarIEs + VarIesOffset, &RateIe, 1);
VarIesOffset += 1;
NdisMoveMemory(pAd->PortCfg.ResVarIEs + VarIesOffset, &RatesLen, 1);
VarIesOffset += 1;
NdisMoveMemory(pAd->PortCfg.ResVarIEs + VarIesOffset, Rates, RatesLen);
VarIesOffset += RatesLen;
// Second add RSN
NdisMoveMemory(pAd->PortCfg.ResVarIEs + VarIesOffset, pAd->PortCfg.BssTab.BssEntry[Idx].VarIEs, pAd->PortCfg.BssTab.BssEntry[Idx].VarIELen);
VarIesOffset += pAd->PortCfg.BssTab.BssEntry[Idx].VarIELen;
// Set Variable IEs Length
pAd->PortCfg.ResVarIELen = VarIesOffset;
pAd->PortCfg.AssocInfo.ResponseIELength = VarIesOffset;
}
}
/*
==========================================================================
Description:
left part of IEEE 802.11/1999 p.374
Parameters:
Elem - MLME message containing the received frame
IRQL = DISPATCH_LEVEL
==========================================================================
*/
VOID PeerDisassocAction(
IN PRT2570ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem)
{
MACADDR Addr2;
USHORT Reason;
if(PeerDisassocSanity(pAd, Elem->Msg, Elem->MsgLen, &Addr2, &Reason))
{
if (INFRA_ON(pAd) && MAC_ADDR_EQUAL(&pAd->PortCfg.Bssid, &Addr2))
{
DBGPRINT_RAW(RT_DEBUG_TRACE, "LinkDown(PeerDisassocAction(Reason = %d))\n", Reason);//steven:for debug
LinkDown(pAd);
pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
// 2002/11/21 -
// patch RT2430/RT2420 hangup issue. We suspect this AP DIS-ASSOCIATE frame
// is caused by PHY hangup, so we reset PHY, then auto recover the connection.
// if this attempt fails, then remains in LinkDown and leaves the problem
// to MlmePeriodicExec()
// NICPatchRT2430Bug(pAd);
pAd->RalinkCounters.BeenDisassociatedCount ++;
// Remove auto recover effort when disassociate by AP, re-enable for patch 2430 only
DBGPRINT(RT_DEBUG_TRACE, "ASSOC - Disassociated by AP, Auto Recovery attempt #%d\n", pAd->RalinkCounters.BeenDisassociatedCount);
MlmeAutoReconnectLastSSID(pAd);
}
}
else
{
DBGPRINT(RT_DEBUG_TRACE, "ASSOC - PeerDisassocAction() sanity check fail\n");
}
}
/*
==========================================================================
Description:
what the state machine will do after assoc timeout
Parameters:
Elme -
IRQL = DISPATCH_LEVEL
==========================================================================
*/
VOID AssocTimeoutAction(
IN PRT2570ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem)
{
DBGPRINT(RT_DEBUG_TRACE, "ASSOC - AssocTimeoutAction\n");
pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
MlmeCntlConfirm(pAd, MT2_ASSOC_CONF, MLME_REJ_TIMEOUT);
}
/*
==========================================================================
Description:
what the state machine will do after reassoc timeout
IRQL = DISPATCH_LEVEL
==========================================================================
*/
VOID ReassocTimeoutAction(
IN PRT2570ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem)
{
DBGPRINT(RT_DEBUG_TRACE, "ASSOC - ReassocTimeoutAction\n");
pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
MlmeCntlConfirm(pAd, MT2_REASSOC_CONF, MLME_REJ_TIMEOUT);
}
/*
==========================================================================
Description:
what the state machine will do after disassoc timeout
IRQL = DISPATCH_LEVEL
==========================================================================
*/
VOID DisassocTimeoutAction(
IN PRT2570ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem)
{
DBGPRINT(RT_DEBUG_TRACE, "ASSOC - DisassocTimeoutAction\n");
pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
MlmeCntlConfirm(pAd, MT2_DISASSOC_CONF, MLME_SUCCESS);
}
VOID InvalidStateWhenAssoc(
IN PRT2570ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem)
{
DBGPRINT(RT_DEBUG_TRACE, "ASSOC - InvalidStateWhenAssoc(state=%d), reset ASSOC state machine\n",
pAd->Mlme.AssocMachine.CurrState);
pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
MlmeCntlConfirm(pAd, MT2_ASSOC_CONF, MLME_STATE_MACHINE_REJECT);
}
VOID InvalidStateWhenReassoc(
IN PRT2570ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem)
{
DBGPRINT(RT_DEBUG_TRACE, "ASSOC - InvalidStateWhenReassoc(state=%d), reset ASSOC state machine\n",
pAd->Mlme.AssocMachine.CurrState);
pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
MlmeCntlConfirm(pAd, MT2_REASSOC_CONF, MLME_STATE_MACHINE_REJECT);
}
VOID InvalidStateWhenDisassociate(
IN PRT2570ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem)
{
DBGPRINT(RT_DEBUG_TRACE, "ASSOC - InvalidStateWhenDisassoc(state=%d), reset ASSOC state machine\n",
pAd->Mlme.AssocMachine.CurrState);
pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
MlmeCntlConfirm(pAd, MT2_DISASSOC_CONF, MLME_STATE_MACHINE_REJECT);
}
/*
==========================================================================
Description:
right part of IEEE 802.11/1999 page 374
Note:
This event should never cause ASSOC state machine perform state
transition, and has no relationship with CNTL machine. So we separate
this routine as a service outside of ASSOC state transition table.
IRQL = DISPATCH_LEVEL
==========================================================================
*/
VOID Cls3errAction(
IN PRT2570ADAPTER pAd,
IN PMACADDR pAddr)
{
MACHDR DisassocHdr;
CHAR *OutBuffer = NULL;
ULONG FrameLen = 0;
NDIS_STATUS NStatus;
USHORT Reason = REASON_CLS3ERR;
NStatus = MlmeAllocateMemory(pAd, (PVOID)&OutBuffer); //Get an unused nonpaged memory
if (NStatus != NDIS_STATUS_SUCCESS)
return;
DBGPRINT(RT_DEBUG_TRACE, "ASSOC - Class 3 Error, Send DISASSOC frame\n");
MgtMacHeaderInit(pAd, &DisassocHdr, SUBTYPE_DISASSOC, 0, pAddr, &pAd->PortCfg.Bssid);
MakeOutgoingFrame(OutBuffer, &FrameLen,
sizeof(MACHDR), &DisassocHdr,
2, &Reason,
END_OF_ARGS);
MiniportMMRequest(pAd, OutBuffer, FrameLen);
pAd->PortCfg.DisassocReason = REASON_CLS3ERR;
COPY_MAC_ADDR(&pAd->PortCfg.DisassocSta, pAddr);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -