📄 assoc.c
字号:
// 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; memcpy(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; memcpy(pAd->PortCfg.ResVarIEs + VarIesOffset, &RateIe, 1); VarIesOffset += 1; memcpy(pAd->PortCfg.ResVarIEs + VarIesOffset, &RatesLen, 1); VarIesOffset += 1; memcpy(pAd->PortCfg.ResVarIEs + VarIesOffset, Rates, RatesLen); VarIesOffset += RatesLen; // Second add RSN memcpy(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 + -