/* ========================================================================== Description: left part of IEEE 802.11/1999 p.374 Parameters: Elem - MLME message containing the received frame ========================================================================== */ static VOID ApCliPeerDisassocAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { UCHAR Addr2[MAC_ADDR_LEN]; USHORT Reason; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AssocCurrState; if(PeerDisassocSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Reason)) { if (MAC_ADDR_EQUAL(pAd->ApCliMlmeAux.Bssid, Addr2)) { *pCurrState = APCLI_ASSOC_IDLE; MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_PEER_DISCONNECT_REQ, 0, NULL, ifIndex); } } else { DBGPRINT(RT_DEBUG_TRACE, ("APCLI_ASSOC - ApCliPeerDisassocAction() sanity check fail\n")); } return; }
INT RTMPSearchPMKIDCache( IN PRTMP_ADAPTER pAd, IN INT apidx, IN PUCHAR pAddr) { INT i = 0; for (i = 0; i < MAX_PMKID_COUNT; i++) { if ((pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[i].Valid) && MAC_ADDR_EQUAL(&pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[i].MAC, pAddr)) { DBGPRINT(RT_DEBUG_TRACE, ("RTMPSearchPMKIDCache %02x:%02x:%02x:%02x:%02x:%02x cache(%d) from IF(ra%d)\n", PRINT_MAC(pAddr), i, apidx)); break; } } if (i == MAX_PMKID_COUNT) { DBGPRINT(RT_DEBUG_TRACE, ("RTMPSearchPMKIDCache - IF(%d) not found\n", apidx)); return -1; } return i; }
/* ========================================================================== Description: APCLI MLME JOIN req timeout state machine procedure ========================================================================== */ static VOID ApCliCtrlJoinReqTimeoutAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { APCLI_MLME_JOIN_REQ_STRUCT JoinReq; PAPCLI_STRUCT pApCliEntry; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState; DBGPRINT(RT_DEBUG_TRACE, ("(%s) Probe Req Timeout.\n", __FUNCTION__)); if (ifIndex >= MAX_APCLI_NUM) return; if (ApScanRunning(pAd) == TRUE) { *pCurrState = APCLI_CTRL_DISCONNECTED; return; } /* stay in same state. */ *pCurrState = APCLI_CTRL_PROBE; /* retry Probe Req. */ DBGPRINT(RT_DEBUG_TRACE, ("(%s) Retry Probe Req.\n", __FUNCTION__)); pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; NdisZeroMemory(&JoinReq, sizeof(APCLI_MLME_JOIN_REQ_STRUCT)); if (!MAC_ADDR_EQUAL(pApCliEntry->CfgApCliBssid, ZERO_MAC_ADDR)) { COPY_MAC_ADDR(JoinReq.Bssid, pApCliEntry->CfgApCliBssid); } #ifdef WSC_AP_SUPPORT if ((pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscConfMode != WSC_DISABLE) && (pAd->ApCfg.ApCliTab[ifIndex].WscControl.bWscTrigger == TRUE)) { NdisZeroMemory(JoinReq.Ssid, MAX_LEN_OF_SSID); JoinReq.SsidLen = pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscSsid.SsidLength; NdisMoveMemory(JoinReq.Ssid, pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscSsid.Ssid, JoinReq.SsidLen); } else #endif /* WSC_AP_SUPPORT */ if (pApCliEntry->CfgSsidLen != 0) { JoinReq.SsidLen = pApCliEntry->CfgSsidLen; NdisMoveMemory(&(JoinReq.Ssid), pApCliEntry->CfgSsid, JoinReq.SsidLen); } DBGPRINT(RT_DEBUG_TRACE, ("(%s) Probe Ssid=%s, Bssid=%02x:%02x:%02x:%02x:%02x:%02x\n", __FUNCTION__, JoinReq.Ssid, JoinReq.Bssid[0], JoinReq.Bssid[1], JoinReq.Bssid[2], JoinReq.Bssid[3], JoinReq.Bssid[4], JoinReq.Bssid[5])); MlmeEnqueue(pAd, APCLI_SYNC_STATE_MACHINE, APCLI_MT2_MLME_PROBE_REQ, sizeof(APCLI_MLME_JOIN_REQ_STRUCT), &JoinReq, ifIndex); return; }
PUCHAR CliWds_ProxyLookup( IN PRTMP_ADAPTER pAd, IN PUCHAR pMac) { UINT8 HashId = (*(pMac + 5) & (CLIWDS_HASH_TAB_SIZE - 1)); PCLIWDS_PROXY_ENTRY pCliWdsEntry; pCliWdsEntry = (PCLIWDS_PROXY_ENTRY)pAd->ApCfg.CliWdsProxyTab[HashId].pHead; while (pCliWdsEntry) { if (MAC_ADDR_EQUAL(pMac, pCliWdsEntry->Addr)) { ULONG Now; NdisGetSystemUpTime(&Now); pCliWdsEntry->LastRefTime = Now; if (VALID_WCID(pCliWdsEntry->Aid)) return pAd->MacTab.Content[pCliWdsEntry->Aid].Addr; else return NULL; } pCliWdsEntry = pCliWdsEntry->pNext; } return NULL; }
/* ========================================================================== Description: IRQL = DISPATCH_LEVEL ========================================================================== */ VOID PeerAuthRspAtSeq4Action( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { UCHAR Addr2[MAC_ADDR_LEN]; USHORT Alg, Seq, Status; CHAR ChlgText[CIPHER_TEXT_LEN]; BOOLEAN TimerCancelled; if(PeerAuthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Alg, &Seq, &Status, ChlgText)) { if(MAC_ADDR_EQUAL(pAd->MlmeAux.Bssid, Addr2) && Seq == 4) { DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Receive AUTH_RSP seq#4 to me\n")); RTMPCancelTimer(&pAd->MlmeAux.AuthTimer, &TimerCancelled); if (Status != MLME_SUCCESS) { pAd->StaCfg.AuthFailReason = Status; COPY_MAC_ADDR(pAd->StaCfg.AuthFailSta, Addr2); } pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status); } } else { DBGPRINT(RT_DEBUG_TRACE, ("AUTH - PeerAuthRspAtSeq4Action() sanity check fail\n")); } }
static VOID ApCliProbeTimeoutAtJoinAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { APCLI_CTRL_MSG_STRUCT ApCliCtrlMsg; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].SyncCurrState; DBGPRINT(RT_DEBUG_TRACE, ("APCLI_SYNC - ProbeTimeoutAtJoinAction\n")); *pCurrState = SYNC_IDLE; DBGPRINT(RT_DEBUG_TRACE, ("APCLI_SYNC - ApCliMlmeAux.Bssid=%02x:%02x:%02x:%02x:%02x:%02x\n", pAd->ApCliMlmeAux.Bssid[0], pAd->ApCliMlmeAux.Bssid[1], pAd->ApCliMlmeAux.Bssid[2], pAd->ApCliMlmeAux.Bssid[3], pAd->ApCliMlmeAux.Bssid[4], pAd->ApCliMlmeAux.Bssid[5])); if(!MAC_ADDR_EQUAL(pAd->ApCliMlmeAux.Bssid, ZERO_MAC_ADDR)) { ApCliCtrlMsg.Status = MLME_SUCCESS; MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_PROBE_RSP, sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex); } else { MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_JOIN_REQ_TIMEOUT, 0, NULL, ifIndex); } return; }
ULONG AutoChBssSearchWithSSID( IN PRTMP_ADAPTER pAd, IN PUCHAR Bssid, IN PUCHAR pSsid, IN UCHAR SsidLen, IN UCHAR Channel) { UCHAR i; PBSSINFO pBssInfoTab = pAd->pBssInfoTab; if(pBssInfoTab == NULL) { DBGPRINT(RT_DEBUG_ERROR, ("pAd->pBssInfoTab equal NULL.\n")); return (ULONG)BSS_NOT_FOUND; } for (i = 0; i < pBssInfoTab->BssNr; i++) { if ((((pBssInfoTab->BssEntry[i].Channel <= 14) && (Channel <= 14)) || ((pBssInfoTab->BssEntry[i].Channel > 14) && (Channel > 14))) && MAC_ADDR_EQUAL(&(pBssInfoTab->BssEntry[i].Bssid), Bssid) && (SSID_EQUAL(pSsid, SsidLen, pBssInfoTab->BssEntry[i].Ssid, pBssInfoTab->BssEntry[i].SsidLen) || (NdisEqualMemory(pSsid, ZeroSsid, SsidLen)) || (NdisEqualMemory(pBssInfoTab->BssEntry[i].Ssid, ZeroSsid, pBssInfoTab->BssEntry[i].SsidLen)))) { return i; } } return (ULONG)BSS_NOT_FOUND; }
MAC_TABLE_ENTRY *WdsTableLookup( IN PRTMP_ADAPTER pAd, IN PUCHAR pAddr, IN BOOLEAN bResetIdelCount) { USHORT HashIdx; PMAC_TABLE_ENTRY pEntry = NULL; NdisAcquireSpinLock(&pAd->WdsTabLock); NdisAcquireSpinLock(&pAd->MacTabLock); HashIdx = MAC_ADDR_HASH_INDEX(pAddr); pEntry = pAd->MacTab.Hash[HashIdx]; while (pEntry) { if (IS_ENTRY_WDS(pEntry) && MAC_ADDR_EQUAL(pEntry->Addr, pAddr)) { if(bResetIdelCount) pEntry->NoDataIdleCount = 0; break; } else pEntry = pEntry->pNext; } NdisReleaseSpinLock(&pAd->MacTabLock); NdisReleaseSpinLock(&pAd->WdsTabLock); return pEntry; }
LONG WdsEntryAlloc( IN PRTMP_ADAPTER pAd, IN PUCHAR pAddr) { INT i; LONG WdsTabIdx = -1; NdisAcquireSpinLock(&pAd->WdsTabLock); for (i = 0; i < MAX_WDS_ENTRY; i++) { if ((pAd->WdsTab.Mode >= WDS_LAZY_MODE) && !WDS_IF_UP_CHECK(pAd, i)) continue; if (pAd->WdsTab.WdsEntry[i].Valid == FALSE) { pAd->WdsTab.WdsEntry[i].Valid = TRUE; pAd->WdsTab.Size ++; COPY_MAC_ADDR(pAd->WdsTab.WdsEntry[i].PeerWdsAddr, pAddr); WdsTabIdx = i; break; } else if (MAC_ADDR_EQUAL(pAd->WdsTab.WdsEntry[i].PeerWdsAddr, pAddr)) { WdsTabIdx = i; break; } } if (i == MAX_WDS_ENTRY) DBGPRINT(RT_DEBUG_ERROR, ("%s: Unable to allocate WdsEntry.\n", __FUNCTION__)); NdisReleaseSpinLock(&pAd->WdsTabLock); return WdsTabIdx; }
VOID PeerDeauthAction( IN PRTMP_ADAPTER pAd, IN PMLME_QUEUE_ELEM Elem) { UCHAR Addr2[MAC_ADDR_LEN]; USHORT Reason; if (PeerDeauthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Reason)) { if (INFRA_ON(pAd) && MAC_ADDR_EQUAL(Addr2, pAd->CommonCfg.Bssid)) { DBGPRINT(RT_DEBUG_TRACE,("AUTH_RSP - receive DE-AUTH from our AP (Reason=%d)\n", Reason)); { union iwreq_data wrqu; memset(wrqu.ap_addr.sa_data, 0, MAC_ADDR_LEN); wireless_send_event(pAd->net_dev, SIOCGIWAP, &wrqu, NULL); } if (pAd->CommonCfg.bWirelessEvent) RTMPSendWirelessEvent(pAd, IW_DEAUTH_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0); LinkDown(pAd, TRUE); } } else { DBGPRINT(RT_DEBUG_TRACE,("AUTH_RSP - PeerDeauthAction() sanity check fail\n")); } }
VOID NotifyChSwAnnToPeerAPs( IN PRTMP_ADAPTER pAd, IN PUCHAR pRA, IN PUCHAR pTA, IN UINT8 ChSwMode, IN UINT8 Channel) { #ifdef WDS_SUPPORT if (!((pRA[0] & 0xff) == 0xff)) // is pRA a broadcase address. { INT i; // info neighbor APs that Radar signal found throgh WDS link. for (i = 0; i < MAX_WDS_ENTRY; i++) { if (ValidWdsEntry(pAd, i)) { PUCHAR pDA = pAd->WdsTab.WdsEntry[i].PeerWdsAddr; // DA equal to SA. have no necessary orignal AP which found Radar signal. if (MAC_ADDR_EQUAL(pTA, pDA)) continue; // send Channel Switch Action frame to info Neighbro APs. EnqueueChSwAnn(pAd, pDA, ChSwMode, Channel); } } } #endif // WDS_SUPPORT // }
/* ========================================================================== Description: peer sends reassoc rsp Parametrs: Elem - MLME message cntaining the received frame ========================================================================== */ VOID PeerReassocRspAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { USHORT CapabilityInfo; USHORT Status; USHORT Aid; UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES], SupRateLen; UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRateLen; UCHAR Addr2[MAC_ADDR_LEN]; EDCA_PARM EdcaParm; BOOLEAN TimerCancelled; #ifdef RALINK_WPA_SUPPLICANT_SUPPORT union iwreq_data wrqu; #endif if(PeerAssocRspSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &CapabilityInfo, &Status, &Aid, SupRate, &SupRateLen, ExtRate, &ExtRateLen, &EdcaParm)) { if(MAC_ADDR_EQUAL(Addr2, pAd->MlmeAux.Bssid)) // The frame is for me ? { DBGPRINT(RT_DEBUG_TRACE, "ASSOC - receive REASSOC_RSP to me (status=%d)\n", Status); RTMPCancelTimer(&pAd->MlmeAux.ReassocTimer,&TimerCancelled); if(Status == MLME_SUCCESS) { // go to procedure listed on page 376 AssocPostProc(pAd, Addr2, CapabilityInfo, Aid, SupRate, SupRateLen, ExtRate, ExtRateLen, &EdcaParm); #ifdef RALINK_WPA_SUPPLICANT_SUPPORT if (pAd->PortCfg.WPA_Supplicant == TRUE) { //collect associate info link_status_handler(pAd); //send associnfo event to wpa_supplicant memset(&wrqu, 0, sizeof(wrqu)); wrqu.data.flags = RT_ASSOC_EVENT_FLAG; wireless_send_event(pAd->net_dev, IWEVCUSTOM, &wrqu, NULL); } DBGPRINT(RT_DEBUG_OFF, "ASSOC - receive REASSOC_RSP to me (status=%d)\n", Status); #endif #ifdef NATIVE_WPA_SUPPLICANT_SUPPORT if (pAd->PortCfg.bNativeWpa == TRUE) // add by johnli wext_notify_event_assoc(pAd, SIOCGIWAP, TRUE); #endif // NATIVE_WPA_SUPPLICANT_SUPPORT } pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_REASSOC_CONF, 2, &Status); } } else { DBGPRINT(RT_DEBUG_TRACE, "ASSOC - PeerReassocRspAction() sanity check fail\n"); } }
ULONG QueryHashID( IN PRTMP_ADAPTER pAd, PUCHAR pAddr, BOOLEAN RemoveBSS) { ULONG HashIdx; UCHAR j = 0; for(j = 1; j < NULLFRAMESPACE; j++) { if (MAC_ADDR_EQUAL(&pAd->HASH_BSSID[j][0],pAddr)) { DBGPRINT(RT_DEBUG_TRACE, ("COEX: j = %d\n",j)); DBGPRINT(RT_DEBUG_TRACE, ("COEX: Find BSSID Address = %02X:%02X:%02X:%02X:%02X:%02X\n",pAd->HASH_BSSID[j][0],pAd->HASH_BSSID[j][1], pAd->HASH_BSSID[j][2],pAd->HASH_BSSID[j][3], pAd->HASH_BSSID[j][4], pAd->HASH_BSSID[j][5])); HashIdx = j; if (RemoveBSS == TRUE) { pAd->HASH_BSSID[j][MAC_ADDR_LEN] = 0; DBGPRINT(RT_DEBUG_TRACE, ("COEX: Remove BSSID Address = %02X:%02X:%02X:%02X:%02X:%02X\n",pAd->HASH_BSSID[j][0],pAd->HASH_BSSID[j][1], pAd->HASH_BSSID[j][2],pAd->HASH_BSSID[j][3], pAd->HASH_BSSID[j][4], pAd->HASH_BSSID[j][5])); } return HashIdx; } //MAC_ADDR_EQUAL(&pAd->HASH_BSSID[j][0],) DBGPRINT(RT_DEBUG_TRACE, ("COEX:Miss search j = %d\n",j)); } for(j = 1; j < NULLFRAMESPACE; j++) { if (pAd->HASH_BSSID[j][MAC_ADDR_LEN] == 0) { COPY_MAC_ADDR(&pAd->HASH_BSSID[j][0], pAddr); pAd->HASH_BSSID[j][MAC_ADDR_LEN] = 1; HashIdx = j; DBGPRINT(RT_DEBUG_TRACE, ("COEX: free space j = %d\n",j)); DBGPRINT(RT_DEBUG_TRACE, ("COEX: Insert MAC Address = %02X:%02X:%02X:%02X:%02X:%02X\n",pAd->HASH_BSSID[j][0],pAd->HASH_BSSID[j][1], pAd->HASH_BSSID[j][2],pAd->HASH_BSSID[j][3], pAd->HASH_BSSID[j][4], pAd->HASH_BSSID[j][5])); return HashIdx; } //debug if there is an overflow issue if (j == (NULLFRAMESPACE -1 )) { COPY_MAC_ADDR(&pAd->HASH_BSSID[j][0], pAddr); pAd->HASH_BSSID[1][MAC_ADDR_LEN] = 1; pAd->HASH_BSSID[2][MAC_ADDR_LEN] = 0; pAd->HASH_BSSID[3][MAC_ADDR_LEN] = 0; HashIdx = 1; return HashIdx; } } return 0; }
REPEATER_CLIENT_ENTRY *RTMPLookupRepeaterCliEntry( IN PRTMP_ADAPTER pAd, IN BOOLEAN bRealMAC, IN PUCHAR pAddr) { ULONG HashIdx; UCHAR tempMAC[6]; REPEATER_CLIENT_ENTRY *pEntry = NULL; REPEATER_CLIENT_ENTRY_MAP *pMapEntry = NULL; NdisAcquireSpinLock(&pAd->ApCfg.ReptCliEntryLock); COPY_MAC_ADDR(tempMAC, pAddr); HashIdx = MAC_ADDR_HASH_INDEX(tempMAC); if (bRealMAC == TRUE) { pMapEntry = pAd->ApCfg.ReptMapHash[HashIdx]; while (pMapEntry) { pEntry = pMapEntry->pReptCliEntry; if (pEntry->CliValid && MAC_ADDR_EQUAL(pEntry->OriginalAddress, tempMAC)) break; else { pEntry = NULL; pMapEntry = pMapEntry->pNext; } } } else { pEntry = pAd->ApCfg.ReptCliHash[HashIdx]; while (pEntry) { if (pEntry->CliValid && MAC_ADDR_EQUAL(pEntry->CurrentAddress, tempMAC)) break; else pEntry = pEntry->pNext; } } NdisReleaseSpinLock(&pAd->ApCfg.ReptCliEntryLock); return pEntry; }
static inline BOOLEAN isSpecialIgmpMacAddr(IN PUCHAR pGrpId) { if (MAC_ADDR_EQUAL(pGrpId, itunes_mac)) { return TRUE; } return FALSE; }
/* ========================================================================== Description: left part of IEEE 802.11/1999 p.374 Parameters: Elem - MLME message containing the received frame ========================================================================== */ static VOID ApCliPeerDisassocAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { UCHAR Addr2[MAC_ADDR_LEN]; USHORT Reason; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = NULL; #ifdef MAC_REPEATER_SUPPORT UCHAR CliIdx = 0xFF; #endif /* MAC_REPEATER_SUPPORT */ if ((ifIndex >= MAX_APCLI_NUM) #ifdef MAC_REPEATER_SUPPORT && (ifIndex < 64) #endif /* MAC_REPEATER_SUPPORT */ ) return; #ifdef MAC_REPEATER_SUPPORT if (ifIndex >= 64) { CliIdx = ((ifIndex - 64) % 16); ifIndex = ((ifIndex - 64) / 16); pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].AssocCurrState; } else #endif /* MAC_REPEATER_SUPPORT */ pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AssocCurrState; if(PeerDisassocSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Reason)) { if (MAC_ADDR_EQUAL(pAd->ApCfg.ApCliTab[ifIndex].ApCliMlmeAux.Bssid, Addr2)) { *pCurrState = APCLI_ASSOC_IDLE; #ifdef MAC_REPEATER_SUPPORT ifIndex = (USHORT)(Elem->Priv); #endif /* MAC_REPEATER_SUPPORT */ MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_PEER_DISCONNECT_REQ, 0, NULL, ifIndex); #ifdef MAC_REPEATER_SUPPORT if ((pAd->ApCfg.bMACRepeaterEn == TRUE) && (ifIndex >= 64)) { RTMP_MLME_HANDLER(pAd); ifIndex = ((ifIndex - 64) / 16); RTMPRemoveRepeaterEntry(pAd, ifIndex, CliIdx); } #endif /* MAC_REPEATER_SUPPORT */ } } else { DBGPRINT(RT_DEBUG_TRACE, ("APCLI_ASSOC - ApCliPeerDisassocAction() sanity check fail\n")); } return; }
/* ========================================================================== Description: peer sends assoc rsp back Parameters: Elme - MLME message containing the received frame ========================================================================== */ static VOID ApCliPeerAssocRspAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { BOOLEAN Cancelled; USHORT CapabilityInfo, Status, Aid; UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES], SupRateLen; UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRateLen; UCHAR Addr2[MAC_ADDR_LEN]; EDCA_PARM EdcaParm; UCHAR CkipFlag; APCLI_CTRL_MSG_STRUCT ApCliCtrlMsg; HT_CAPABILITY_IE HtCapability; ADD_HT_INFO_IE AddHtInfo; /* AP might use this additional ht info IE */ UCHAR HtCapabilityLen; UCHAR AddHtInfoLen; UCHAR NewExtChannelOffset = 0xff; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AssocCurrState; if (ApCliPeerAssocRspSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &CapabilityInfo, &Status, &Aid, SupRate, &SupRateLen, ExtRate, &ExtRateLen, &HtCapability, &AddHtInfo, &HtCapabilityLen,&AddHtInfoLen,&NewExtChannelOffset, &EdcaParm, &CkipFlag)) { /* The frame is for me ? */ if(MAC_ADDR_EQUAL(Addr2, pAd->ApCliMlmeAux.Bssid)) { DBGPRINT(RT_DEBUG_TRACE, ("APCLI_ASSOC - receive ASSOC_RSP to me (status=%d)\n", Status)); RTMPCancelTimer(&pAd->ApCliMlmeAux.ApCliAssocTimer, &Cancelled); if(Status == MLME_SUCCESS) { /* go to procedure listed on page 376 */ ApCliAssocPostProc(pAd, Addr2, CapabilityInfo, ifIndex, SupRate, SupRateLen, ExtRate, ExtRateLen, &EdcaParm, &HtCapability, HtCapabilityLen, &AddHtInfo); ApCliCtrlMsg.Status = MLME_SUCCESS; MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_ASSOC_RSP, sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex); } else { ApCliCtrlMsg.Status = Status; MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_ASSOC_RSP, sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex); } *pCurrState = APCLI_ASSOC_IDLE; } } else { DBGPRINT(RT_DEBUG_TRACE, ("APCLI_ASSOC - ApCliPeerAssocRspAction() sanity check fail\n")); } return; }
/* ========================================================================== Description: left part of IEEE 802.11/1999 p.374 Parameters: Elem - MLME message containing the received frame ========================================================================== */ VOID PeerDisassocAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { UCHAR Addr2[MAC_ADDR_LEN]; USHORT Reason; #ifdef RALINK_WPA_SUPPLICANT_SUPPORT union iwreq_data wrqu; #endif if(PeerDisassocSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Reason)) { if (INFRA_ON(pAd) && MAC_ADDR_EQUAL(pAd->PortCfg.Bssid, Addr2)) { LinkDown(pAd, TRUE); pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; #ifdef RALINK_WPA_SUPPLICANT_SUPPORT if (pAd->PortCfg.WPA_Supplicant == TRUE) { // send disassoc event to wpa_supplicant memset(&wrqu, 0, sizeof(wrqu)); wrqu.data.flags = RT_DISASSOC_EVENT_FLAG; wireless_send_event(pAd->net_dev, IWEVCUSTOM, &wrqu, NULL); } #endif #ifdef NATIVE_WPA_SUPPLICANT_SUPPORT if (pAd->PortCfg.bNativeWpa == TRUE) // add by johnli wext_notify_event_assoc(pAd, SIOCGIWAP, FALSE); #endif // NATIVE_WPA_SUPPLICANT_SUPPORT #if 0 // 2004-09-11 john: can't remember why AP will DISASSOCIATE us. // But since it says for 2430 only, we temporaily remove the patch. // 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); #endif } } else { DBGPRINT(RT_DEBUG_TRACE, "ASSOC - PeerDisassocAction() sanity check fail\n"); } }
PMESH_BMPKTSIG_ENTRY BMPktSigTabLookUp( IN PRTMP_ADAPTER pAd, IN PUCHAR MeshSA) { UINT HashIdx; ULONG Now; PMESH_BMPKTSIG_TAB pTab = pAd->MeshTab.pBMPktSigTab; PMESH_BMPKTSIG_ENTRY pEntry = NULL; PMESH_BMPKTSIG_ENTRY pPrevEntry = NULL; if (pTab == NULL) { DBGPRINT(RT_DEBUG_ERROR, ("%s: pBMPktSigTab doesn't exist.\n", __FUNCTION__)); return NULL; } RTMP_SEM_LOCK(&pAd->MeshTab.MeshBMPktTabLock); HashIdx = BMPKT_MAC_ADDR_HASH_INDEX(MeshSA); pEntry = pTab->Hash[HashIdx]; while (pEntry) { if (MAC_ADDR_EQUAL(pEntry->MeshSA, MeshSA)) break; else { pPrevEntry = pEntry; pEntry = pEntry->pNext; } } if (pEntry) { NdisGetSystemUpTime(&Now); if (RTMP_TIME_AFTER((unsigned long)Now, (unsigned long)(pEntry->LastRefTime + MESH_BMPKT_RECORD_TIME))) { /* remove ageout entry. */ if (pPrevEntry == NULL) pTab->Hash[HashIdx] = pEntry->pNext; else pPrevEntry->pNext = pEntry->pNext; NdisZeroMemory(pEntry, sizeof(MESH_BMPKTSIG_ENTRY)); pEntry = NULL; pTab->Size--; } else pEntry->LastRefTime = Now; } RTMP_SEM_UNLOCK(&pAd->MeshTab.MeshBMPktTabLock); return pEntry; }
static VOID ApCliProbeTimeoutAtJoinAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { APCLI_CTRL_MSG_STRUCT ApCliCtrlMsg; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].SyncCurrState; PAPCLI_STRUCT pApCliEntry = NULL; #ifdef APCLI_CONNECTION_TRIAL PULONG pCurrCtrlState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState; DBGPRINT(RT_DEBUG_TRACE, ("APCLI_SYNC - ProbeTimeoutAtJoinAction, ifIndex = %d, pCurrCtrlState = %ld, pCurrSyncState = %ld\n", ifIndex, *pCurrCtrlState, *pCurrState)); #endif if (ifIndex >= MAX_APCLI_NUM) return; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; pCurrState = &pApCliEntry->SyncCurrState; DBGPRINT(RT_DEBUG_TRACE, ("APCLI_SYNC - ProbeTimeoutAtJoinAction\n")); *pCurrState = SYNC_IDLE; #ifdef APCLI_CONNECTION_TRIAL if (ifIndex == 1) *pCurrCtrlState = APCLI_CTRL_DISCONNECTED; #endif DBGPRINT(RT_DEBUG_TRACE, ("APCLI_SYNC - ApCliMlmeAux.Bssid=%02x:%02x:%02x:%02x:%02x:%02x\n", pApCliEntry->ApCliMlmeAux.Bssid[0], pApCliEntry->ApCliMlmeAux.Bssid[1], pApCliEntry->ApCliMlmeAux.Bssid[2], pApCliEntry->ApCliMlmeAux.Bssid[3], pApCliEntry->ApCliMlmeAux.Bssid[4], pApCliEntry->ApCliMlmeAux.Bssid[5])); if(!MAC_ADDR_EQUAL(pApCliEntry->ApCliMlmeAux.Bssid, ZERO_MAC_ADDR)) { ApCliCtrlMsg.Status = MLME_SUCCESS; #ifdef MAC_REPEATER_SUPPORT ApCliCtrlMsg.BssIdx = ifIndex; ApCliCtrlMsg.CliIdx = 0xFF; #endif /* MAC_REPEATER_SUPPORT */ MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_PROBE_RSP, sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex); } else { MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_JOIN_REQ_TIMEOUT, 0, NULL, ifIndex); } return; }
VOID MeshClonePacket( IN PRTMP_ADAPTER pAd, IN PNDIS_PACKET pPacket, IN UINT8 MeshSrc, IN UINT8 MeshLinkIdx) { INT idx; PUCHAR pSA = NULL; PUCHAR pDA = NULL; for (idx = 0; idx < MAX_MESH_LINKS; idx++) { if ((MeshSrc == MESH_FORWARD) && (MeshLinkIdx == idx)) continue; pSA = GET_OS_PKT_DATAPTR(pPacket) + MAC_ADDR_LEN; if (MAC_ADDR_EQUAL(pAd->MeshTab.MeshLink[idx].Entry.PeerMacAddr, pSA)) continue; pDA = GET_OS_PKT_DATAPTR(pPacket); if (IS_MULTICAST_MAC_ADDR(pDA) && (MultipathEntryLookUp(pAd, idx, pSA) != NULL)) continue; if (PeerLinkValidCheck(pAd, idx) == TRUE) { PNDIS_PACKET pPacketClone; /* pPacketClone = skb_clone(RTPKT_TO_OSPKT(pPacket), GFP_ATOMIC); */ OS_PKT_CLONE(pAd, pPacket, pPacketClone, GFP_ATOMIC); if (pPacketClone == NULL) continue; RTMP_SET_PACKET_NET_DEVICE_MESH(pPacketClone, 0); RTMP_SET_PACKET_SOURCE(pPacketClone, PKTSRC_NDIS); RTMP_SET_PACKET_MOREDATA(pPacketClone, FALSE); RTMP_SET_PACKET_WCID(pPacketClone, pAd->MeshTab.MeshLink[idx].Entry.MacTabMatchWCID); RTMP_SET_MESH_ROUTE_ID(pPacketClone, BMCAST_ROUTE_ID); RTMP_SET_MESH_SOURCE(pPacketClone, MeshSrc); #ifdef CONFIG_AP_SUPPORT APSendPacket(pAd, pPacketClone); #endif /* CONFIG_AP_SUPPORT */ #ifdef CONFIG_STA_SUPPORT STASendPacket(pAd, pPacketClone); #endif /* CONFIG_STA_SUPPORT */ } } return; }
MAC_TABLE_ENTRY *WdsTableLookupByWcid( IN PRTMP_ADAPTER pAd, IN UCHAR wcid, IN PUCHAR pAddr, IN BOOLEAN bResetIdelCount) { /*USHORT HashIdx; */ ULONG WdsIndex; PMAC_TABLE_ENTRY pCurEntry = NULL; PMAC_TABLE_ENTRY pEntry = NULL; if (wcid <=0 || wcid >= MAX_LEN_OF_MAC_TABLE ) return NULL; NdisAcquireSpinLock(&pAd->WdsTabLock); NdisAcquireSpinLock(&pAd->MacTabLock); do { /*HashIdx = MAC_ADDR_HASH_INDEX(pAddr); */ /*pCurEntry = pAd->MacTab.Hash[wcid]; */ pCurEntry = &pAd->MacTab.Content[wcid]; WdsIndex = 0xff; if ((pCurEntry) && IS_ENTRY_WDS(pCurEntry)) { WdsIndex = pCurEntry->MatchWDSTabIdx; } if (WdsIndex == 0xff) break; if (pAd->WdsTab.WdsEntry[WdsIndex].Valid != TRUE) break; if (MAC_ADDR_EQUAL(pCurEntry->Addr, pAddr)) { if(bResetIdelCount) pCurEntry->NoDataIdleCount = 0; pEntry = pCurEntry; break; } } while(FALSE); NdisReleaseSpinLock(&pAd->MacTabLock); NdisReleaseSpinLock(&pAd->WdsTabLock); return pEntry; }
/* ========================================================================== Description: IRQL = DISPATCH_LEVEL ========================================================================== */ VOID PeerDeauthAction( IN PRTMP_ADAPTER pAd, IN PMLME_QUEUE_ELEM Elem) { UCHAR Addr2[MAC_ADDR_LEN]; USHORT Reason; if (PeerDeauthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Reason)) { if (INFRA_ON(pAd) && MAC_ADDR_EQUAL(Addr2, pAd->CommonCfg.Bssid)) { DBGPRINT(RT_DEBUG_TRACE,("AUTH_RSP - receive DE-AUTH from our AP (Reason=%d)\n", Reason)); #ifdef NATIVE_WPA_SUPPLICANT_SUPPORT { union iwreq_data wrqu; memset(wrqu.ap_addr.sa_data, 0, MAC_ADDR_LEN); wireless_send_event(pAd->net_dev, SIOCGIWAP, &wrqu, NULL); } #endif // NATIVE_WPA_SUPPLICANT_SUPPORT // // send wireless event - for deauthentication if (pAd->CommonCfg.bWirelessEvent) RTMPSendWirelessEvent(pAd, IW_DEAUTH_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0); LinkDown(pAd, TRUE); // Authentication Mode Cisco_LEAP has start a timer // We should cancel it if using LEAP #ifdef LEAP_SUPPORT if (pAd->StaCfg.LeapAuthMode == CISCO_AuthModeLEAP) { RTMPCancelTimer(&pAd->StaCfg.LeapAuthTimer, &TimerCancelled); //Check is it mach the LEAP Authentication failed as possible a Rogue AP //on it's PortSecured not equal to WPA_802_1X_PORT_SECURED while process the Authenticaton. if ((pAd->StaCfg.PortSecured != WPA_802_1X_PORT_SECURED) && (pAd->Mlme.LeapMachine.CurrState != LEAP_IDLE)) { RogueApTableSetEntry(pAd, &pAd->StaCfg.RogueApTab, Addr2, LEAP_REASON_AUTH_TIMEOUT); } } #endif // LEAP_SUPPORT // } } else { DBGPRINT(RT_DEBUG_TRACE,("AUTH_RSP - PeerDeauthAction() sanity check fail\n")); } }
/* ========================================================================== Description: IRQL = DISPATCH_LEVEL ========================================================================== */ VOID PeerAuthRspAtSeq4Action( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { UCHAR Addr2[MAC_ADDR_LEN]; USHORT Alg, Seq, Status; /* CHAR ChlgText[CIPHER_TEXT_LEN]; */ CHAR *ChlgText = NULL; BOOLEAN TimerCancelled; /* allocate memory */ os_alloc_mem(NULL, (UCHAR **) & ChlgText, CIPHER_TEXT_LEN); if (ChlgText == NULL) { DBGPRINT(RT_DEBUG_ERROR, ("%s: ChlgText Allocate memory fail!!!\n", __FUNCTION__)); return; } if (PeerAuthSanity (pAd, Elem->Msg, Elem->MsgLen, Addr2, &Alg, &Seq, &Status, ChlgText)) { if (MAC_ADDR_EQUAL(pAd->MlmeAux.Bssid, Addr2) && Seq == 4) { DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Receive AUTH_RSP seq#4 to me\n")); RTMPCancelTimer(&pAd->MlmeAux.AuthTimer, &TimerCancelled); if (Status != MLME_SUCCESS) { pAd->StaCfg.AuthFailReason = Status; COPY_MAC_ADDR(pAd->StaCfg.AuthFailSta, Addr2); RTMPSendWirelessEvent(pAd, IW_SHARED_WEP_FAIL, NULL, BSS0, 0); } pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status, 0); } } else { DBGPRINT(RT_DEBUG_TRACE, ("AUTH - PeerAuthRspAtSeq4Action() sanity check fail\n")); } if (ChlgText != NULL) os_free_mem(NULL, ChlgText); }
/* ========================================================================== Description: left part of IEEE 802.11/1999 p.374 Parameters: Elem - MLME message containing the received frame ========================================================================== */ static VOID ApCliPeerDisassocAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { UCHAR Addr2[MAC_ADDR_LEN]; USHORT Reason; USHORT ifIndex = (USHORT)(Elem->Priv); if ((ifIndex >= MAX_APCLI_NUM) ) return; PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AssocCurrState; if(PeerDisassocSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Reason)) { if (MAC_ADDR_EQUAL(pAd->ApCfg.ApCliTab[ifIndex].ApCliMlmeAux.Bssid, Addr2)) { #ifdef DPA_S #ifdef P2P_SUPPORT UCHAR p2pIndex = P2P_NOT_FOUND; #endif /* P2P_SUPPORT */ #endif /* DPA_S */ *pCurrState = APCLI_ASSOC_IDLE; MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_PEER_DISCONNECT_REQ, 0, NULL, ifIndex); #ifdef DPA_S #ifdef P2P_SUPPORT p2pIndex = P2pGroupTabSearch(pAd, Addr2); if (p2pIndex != P2P_NOT_FOUND) { PRT_P2P_CLIENT_ENTRY pP2pEntry = &pAd->P2pTable.Client[p2pIndex]; P2pSendSamsungEvent(pAd, P2P_NOTIF_SOFTAP_STA_DISASSOC, Addr2, pP2pEntry->DeviceName, pP2pEntry->DeviceNameLen); } else P2pSendSamsungEvent(pAd, P2P_NOTIF_SOFTAP_STA_DISASSOC, Addr2, NULL, 0); #endif /* P2P_SUPPORT */ #endif /* DPA_S */ } } else { DBGPRINT(RT_DEBUG_TRACE, ("APCLI_ASSOC - ApCliPeerDisassocAction() sanity check fail\n")); } return; }
MAC_TABLE_ENTRY *WdsTableLookupByWcid( IN PRTMP_ADAPTER pAd, IN UCHAR wcid, IN PUCHAR pAddr, IN BOOLEAN bResetIdelCount) { ULONG WdsIndex; MAC_TABLE_ENTRY *pCurEntry = NULL, *pEntry = NULL; if (wcid <=0 || wcid >= MAX_LEN_OF_MAC_TABLE ) return NULL; NdisAcquireSpinLock(&pAd->WdsTabLock); NdisAcquireSpinLock(&pAd->MacTabLock); do { pCurEntry = &pAd->MacTab.Content[wcid]; WdsIndex = 0xff; if ((pCurEntry) && IS_ENTRY_WDS(pCurEntry)) WdsIndex = pCurEntry->func_tb_idx; if (WdsIndex == 0xff) break; if (pAd->WdsTab.WdsEntry[WdsIndex].Valid != TRUE) break; if (MAC_ADDR_EQUAL(pCurEntry->Addr, pAddr)) { if(bResetIdelCount) { pCurEntry->NoDataIdleCount = 0; // TODO: shiang-usw, remove upper setting becasue we need to migrate to tr_entry! pAd->MacTab.tr_entry[pEntry->wcid].NoDataIdleCount = 0; } pEntry = pCurEntry; break; } } while(FALSE); NdisReleaseSpinLock(&pAd->MacTabLock); NdisReleaseSpinLock(&pAd->WdsTabLock); return pEntry; }
PBND_STRG_CLI_ENTRY BndStrg_TableLookup(PBND_STRG_CLI_TABLE table, PUCHAR pAddr) { ULONG HashIdx; BND_STRG_CLI_ENTRY *entry = NULL; HashIdx = MAC_ADDR_HASH_INDEX(pAddr); entry = table->Hash[HashIdx]; while (entry && entry->bValid) { if (MAC_ADDR_EQUAL(entry->Addr, pAddr)) break; else entry = entry->pNext; } return entry; }
/* ========================================================================== Description: Look up the MAC address in the MAC table. Return NULL if not found. Return: pEntry - pointer to the MAC entry; NULL is not found ========================================================================== */ MAC_TABLE_ENTRY *MacTableLookup(RTMP_ADAPTER *pAd, UCHAR *pAddr) { ULONG HashIdx; MAC_TABLE_ENTRY *pEntry = NULL; HashIdx = MAC_ADDR_HASH_INDEX(pAddr); pEntry = pAd->MacTab.Hash[HashIdx]; while (pEntry && !IS_ENTRY_NONE(pEntry)) { if (MAC_ADDR_EQUAL(pEntry->Addr, pAddr)) break; else pEntry = pEntry->pNext; } return pEntry; }
/* ========================================================================== Description: ========================================================================== */ static VOID ApCliPeerAuthRspAtSeq4Action( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { BOOLEAN Cancelled; UCHAR Addr2[MAC_ADDR_LEN]; USHORT Alg, Seq, Status; CHAR ChlgText[CIPHER_TEXT_LEN]; APCLI_CTRL_MSG_STRUCT ApCliCtrlMsg; USHORT ifIndex = (USHORT)(Elem->Priv); PAPCLI_STRUCT pApCliEntry = NULL; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AuthCurrState; if (ifIndex >= MAX_APCLI_NUM) return; if(PeerAuthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Alg, &Seq, &Status, ChlgText)) { if(MAC_ADDR_EQUAL(pApCliEntry->ApCliMlmeAux.Bssid, Addr2) && Seq == 4) { DBGPRINT(RT_DEBUG_TRACE, ("APCLI AUTH - Receive AUTH_RSP seq#4 to me\n")); RTMPCancelTimer(&pApCliEntry->ApCliMlmeAux.ApCliAuthTimer, &Cancelled); ApCliCtrlMsg.Status = MLME_SUCCESS; if(Status != MLME_SUCCESS) { ApCliCtrlMsg.Status = Status; } *pCurrState = APCLI_AUTH_REQ_IDLE; MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_AUTH_RSP, sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex); } } else { DBGPRINT(RT_DEBUG_TRACE, ("APCLI - PeerAuthRspAtSeq4Action() sanity check fail\n")); } return; }
/* ========================================================================== Description: ========================================================================== */ VOID PeerDeauthAction( IN PRTMP_ADAPTER pAd, IN PMLME_QUEUE_ELEM Elem) { UCHAR Addr2[MAC_ADDR_LEN]; USHORT Reason; if (PeerDeauthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Reason)) { if (INFRA_ON(pAd) && MAC_ADDR_EQUAL(Addr2, &pAd->PortCfg.Bssid)) { DBGPRINT(RT_DEBUG_TRACE,"AUTH_RSP - receive DE-AUTH from our AP\n"); LinkDown(pAd, TRUE); } } else { DBGPRINT(RT_DEBUG_TRACE,"AUTH_RSP - PeerDeauthAction() sanity check fail\n"); } }