/* *************************************************************************** * Ralink Tech Inc. * 4F, No. 2 Technology 5th Rd. * Science-based Industrial Park * Hsin-chu, Taiwan, R.O.C. * * (c) Copyright 2002-2006, Ralink Technology, Inc. * * All rights reserved. Ralink's source code is an unpublished work and the * use of a copyright notice does not imply otherwise. This source code * contains confidential trade secret material of Ralink Tech. Any attemp * or participation in deciphering, decoding, reverse engineering or in any * way altering the source code is stricitly prohibited, unless the prior * written consent of Ralink Technology, Inc. is obtained. *************************************************************************** Module Name: apcli_ctrl.c Abstract: Revision History: Who When What -------- ---------- ---------------------------------------------- Fonchi 2006-06-23 modified for rt61-APClinent */ #ifdef APCLI_SUPPORT #include "rt_config.h" static VOID ApCliCtrlJoinReqAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); static VOID ApCliCtrlJoinReqTimeoutAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); static VOID ApCliCtrlProbeRspAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); static VOID ApCliCtrlAuthRspAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); static VOID ApCliCtrlAuth2RspAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); static VOID ApCliCtrlAuthReqTimeoutAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); static VOID ApCliCtrlAuth2ReqTimeoutAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); static VOID ApCliCtrlAssocRspAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); static VOID ApCliCtrlDeAssocRspAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); static VOID ApCliCtrlAssocReqTimeoutAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); static VOID ApCliCtrlDisconnectReqAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); static VOID ApCliCtrlPeerDeAssocReqAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); static VOID ApCliCtrlDeAssocAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); static VOID ApCliCtrlDeAuthAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); /* ========================================================================== Description: The apcli ctrl state machine, Parameters: Sm - pointer to the state machine Note: the state machine looks like the following ========================================================================== */ VOID ApCliCtrlStateMachineInit( IN PRTMP_ADAPTER pAd, IN STATE_MACHINE *Sm, OUT STATE_MACHINE_FUNC Trans[]) { UCHAR i; #ifdef MAC_REPEATER_SUPPORT UCHAR j; #endif /* MAC_REPEATER_SUPPORT */ StateMachineInit(Sm, (STATE_MACHINE_FUNC*)Trans, APCLI_MAX_CTRL_STATE, APCLI_MAX_CTRL_MSG, (STATE_MACHINE_FUNC)Drop, APCLI_CTRL_DISCONNECTED, APCLI_CTRL_MACHINE_BASE); /* disconnected state */ StateMachineSetAction(Sm, APCLI_CTRL_DISCONNECTED, APCLI_CTRL_JOIN_REQ, (STATE_MACHINE_FUNC)ApCliCtrlJoinReqAction); /* probe state */ StateMachineSetAction(Sm, APCLI_CTRL_PROBE, APCLI_CTRL_PROBE_RSP, (STATE_MACHINE_FUNC)ApCliCtrlProbeRspAction); StateMachineSetAction(Sm, APCLI_CTRL_PROBE, APCLI_CTRL_JOIN_REQ_TIMEOUT, (STATE_MACHINE_FUNC)ApCliCtrlJoinReqTimeoutAction); StateMachineSetAction(Sm, APCLI_CTRL_PROBE, APCLI_CTRL_DISCONNECT_REQ, (STATE_MACHINE_FUNC)ApCliCtrlDisconnectReqAction); /* auth state */ StateMachineSetAction(Sm, APCLI_CTRL_AUTH, APCLI_CTRL_AUTH_RSP, (STATE_MACHINE_FUNC)ApCliCtrlAuthRspAction); StateMachineSetAction(Sm, APCLI_CTRL_AUTH, APCLI_CTRL_AUTH_REQ_TIMEOUT, (STATE_MACHINE_FUNC)ApCliCtrlAuthReqTimeoutAction); StateMachineSetAction(Sm, APCLI_CTRL_AUTH, APCLI_CTRL_DISCONNECT_REQ, (STATE_MACHINE_FUNC)ApCliCtrlDisconnectReqAction); StateMachineSetAction(Sm, APCLI_CTRL_AUTH, APCLI_CTRL_PEER_DISCONNECT_REQ, (STATE_MACHINE_FUNC)ApCliCtrlPeerDeAssocReqAction); /* auth2 state */ StateMachineSetAction(Sm, APCLI_CTRL_AUTH_2, APCLI_CTRL_AUTH_RSP, (STATE_MACHINE_FUNC)ApCliCtrlAuth2RspAction); StateMachineSetAction(Sm, APCLI_CTRL_AUTH_2, APCLI_CTRL_AUTH_REQ_TIMEOUT, (STATE_MACHINE_FUNC)ApCliCtrlAuth2ReqTimeoutAction); StateMachineSetAction(Sm, APCLI_CTRL_AUTH_2, APCLI_CTRL_DISCONNECT_REQ, (STATE_MACHINE_FUNC)ApCliCtrlDisconnectReqAction); StateMachineSetAction(Sm, APCLI_CTRL_AUTH_2, APCLI_CTRL_PEER_DISCONNECT_REQ, (STATE_MACHINE_FUNC)ApCliCtrlPeerDeAssocReqAction); /* assoc state */ StateMachineSetAction(Sm, APCLI_CTRL_ASSOC, APCLI_CTRL_ASSOC_RSP, (STATE_MACHINE_FUNC)ApCliCtrlAssocRspAction); StateMachineSetAction(Sm, APCLI_CTRL_ASSOC, APCLI_CTRL_ASSOC_REQ_TIMEOUT, (STATE_MACHINE_FUNC)ApCliCtrlAssocReqTimeoutAction); StateMachineSetAction(Sm, APCLI_CTRL_ASSOC, APCLI_CTRL_DISCONNECT_REQ, (STATE_MACHINE_FUNC)ApCliCtrlDeAssocAction); StateMachineSetAction(Sm, APCLI_CTRL_ASSOC, APCLI_CTRL_PEER_DISCONNECT_REQ, (STATE_MACHINE_FUNC)ApCliCtrlPeerDeAssocReqAction); /* deassoc state */ StateMachineSetAction(Sm, APCLI_CTRL_DEASSOC, APCLI_CTRL_DEASSOC_RSP, (STATE_MACHINE_FUNC)ApCliCtrlDeAssocRspAction); /* connected state */ StateMachineSetAction(Sm, APCLI_CTRL_CONNECTED, APCLI_CTRL_DISCONNECT_REQ, (STATE_MACHINE_FUNC)ApCliCtrlDeAuthAction); StateMachineSetAction(Sm, APCLI_CTRL_CONNECTED, APCLI_CTRL_PEER_DISCONNECT_REQ, (STATE_MACHINE_FUNC)ApCliCtrlPeerDeAssocReqAction); StateMachineSetAction(Sm, APCLI_CTRL_CONNECTED, APCLI_CTRL_MT2_AUTH_REQ, (STATE_MACHINE_FUNC)ApCliCtrlProbeRspAction); for (i = 0; i < MAX_APCLI_NUM; i++) { pAd->ApCfg.ApCliTab[i].CtrlCurrState = APCLI_CTRL_DISCONNECTED; #ifdef MAC_REPEATER_SUPPORT for (j = 0; j < MAX_EXT_MAC_ADDR_SIZE; j++) { pAd->ApCfg.ApCliTab[i].RepeaterCli[j].pAd = pAd; pAd->ApCfg.ApCliTab[i].RepeaterCli[j].MatchApCliIdx = i; pAd->ApCfg.ApCliTab[i].RepeaterCli[j].MatchLinkIdx = j; pAd->ApCfg.ApCliTab[i].RepeaterCli[j].AuthCurrState = APCLI_CTRL_DISCONNECTED; pAd->ApCfg.ApCliTab[i].RepeaterCli[j].CliConnectState = 0; } #endif /* MAC_REPEATER_SUPPORT */ } return; } /* ========================================================================== Description: APCLI MLME JOIN req state machine procedure ========================================================================== */ static VOID ApCliCtrlJoinReqAction( 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; #ifdef WSC_AP_SUPPORT PWSC_CTRL pWpsCtrl = &pAd->ApCfg.ApCliTab[ifIndex].WscControl; #endif /* WSC_AP_SUPPORT */ DBGPRINT(RT_DEBUG_TRACE, ("(%s) Start Probe Req.\n", __FUNCTION__)); if (ifIndex >= MAX_APCLI_NUM) return; if (ApScanRunning(pAd) == TRUE) return; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; pApCliEntry->LastDeauthReason = REASON_DEAUTH_STA_LEAVING; 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 ((pWpsCtrl->WscConfMode != WSC_DISABLE) && (pWpsCtrl->bWscTrigger == TRUE)) { ULONG bss_idx = 0; 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); if (pWpsCtrl->WscMode == 1) /* PIN */ { bss_idx = BssSsidTableSearchBySSID(&pAd->ScanTab, (PUCHAR)(JoinReq.Ssid), JoinReq.SsidLen); if (bss_idx == BSS_NOT_FOUND) { ApSiteSurvey(pAd, NULL, SCAN_WSC_ACTIVE, FALSE); return; } else { INT old_conf_mode = pWpsCtrl->WscConfMode; ADD_HTINFO RootApHtInfo, ApHtInfo; UCHAR channel = pAd->CommonCfg.Channel, RootApChannel = pAd->ScanTab.BssEntry[bss_idx].Channel; UCHAR RootApCentralChannel = pAd->ScanTab.BssEntry[bss_idx].CentralChannel; ApHtInfo = pAd->CommonCfg.AddHTInfo.AddHtInfo; RootApHtInfo = pAd->ScanTab.BssEntry[bss_idx].AddHtInfo.AddHtInfo; if ((RootApChannel != channel) || ((RootApCentralChannel != RootApChannel) && (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40) && (ApHtInfo.ExtChanOffset != RootApHtInfo.ExtChanOffset))) { RTMP_STRING ChStr[5] = {0}; if (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40) { if (RootApHtInfo.ExtChanOffset == EXTCHA_ABOVE) Set_HtExtcha_Proc(pAd, "1"); else Set_HtExtcha_Proc(pAd, "0"); } snprintf(ChStr, sizeof(ChStr), "%d", pAd->ScanTab.BssEntry[bss_idx].Channel); Set_Channel_Proc(pAd, ChStr); /* ApStop will call WscStop, we need to reset WscConfMode, WscMode & bWscTrigger here. */ pWpsCtrl->WscState = WSC_STATE_START; pWpsCtrl->WscStatus = STATUS_WSC_START_ASSOC; pWpsCtrl->WscMode = 1; pWpsCtrl->WscConfMode = old_conf_mode; pWpsCtrl->bWscTrigger = TRUE; return; } } } } else #endif /* WSC_AP_SUPPORT */ #ifdef WPA3_SUPPORT if (pApCliEntry->CfgSsidLen != 0 || !MAC_ADDR_EQUAL(pApCliEntry->CfgApCliBssid, ZERO_MAC_ADDR)) #else if (pApCliEntry->CfgSsidLen != 0) #endif { #if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) ULONG bss_idx = BSS_NOT_FOUND; #ifdef WPA3_SUPPORT if (pApCliEntry->CfgSsidLen == 0) { bss_idx = BssTableSearchWithSSID(&pAd->ScanTab, JoinReq.Bssid, (PCHAR)pApCliEntry->CfgSsid, pApCliEntry->CfgSsidLen, pAd->CommonCfg.Channel); DBGPRINT(RT_DEBUG_TRACE, ("%s:pApCliEntry->CfgSsidLen == 0.\n", __func__)); } else #endif bss_idx = BssSsidTableSearchBySSID(&pAd->ScanTab, (PCHAR)pApCliEntry->CfgSsid, pApCliEntry->CfgSsidLen); if (bss_idx == BSS_NOT_FOUND || bss_idx >= MAX_LEN_OF_BSS_TABLE) { DBGPRINT(RT_DEBUG_TRACE, ("%s:: can't find SSID[%s] in ScanTab.\n", __FUNCTION__, pApCliEntry->CfgSsid)); *pCurrState = APCLI_CTRL_PROBE; CFG80211_checkScanTable(pAd); RT_CFG80211_P2P_CLI_CONN_RESULT_INFORM(pAd, JoinReq.Bssid, NULL, 0, NULL, 0, 0); return; } DBGPRINT(RT_DEBUG_TRACE, ("%s:: find SSID[%ld][%s] channel[%d-%d] in ScanTab.\n", __FUNCTION__, bss_idx, pApCliEntry->CfgSsid, pAd->ScanTab.BssEntry[bss_idx].Channel, pAd->ScanTab.BssEntry[bss_idx].CentralChannel)); //TODO /* BssSearch Table has found the pEntry, send Prob Req. directly */ // if (pAd->CommonCfg.Channel != pAd->ScanTab.BssEntry[bss_idx].Channel) { pApCliEntry->MlmeAux.Channel = pAd->ScanTab.BssEntry[bss_idx].Channel; pApCliEntry->MlmeAux.CentralChannel = pAd->ScanTab.BssEntry[bss_idx].CentralChannel; pApCliEntry->wdev.CentralChannel = pApCliEntry->MlmeAux.Channel ; //should be check and update in in asso to check ==> ApCliCheckHt() pApCliEntry->wdev.channel = pApCliEntry->wdev.CentralChannel; pApCliEntry->wdev.bw = HT_BW_20; pApCliEntry->wdev.extcha = EXTCHA_NONE; pAd->CommonCfg.Channel = pApCliEntry->MlmeAux.Channel; //lk added pAd->CommonCfg.CentralChannel = pApCliEntry->MlmeAux.CentralChannel; if(pAd->CommonCfg.CentralChannel != pAd->CommonCfg.Channel) { DBGPRINT(RT_DEBUG_OFF, ("%s:: CommonCfg.CentralChannel[%d] follow CommonCfg.Channel[%d]\n", __FUNCTION__, pAd->CommonCfg.CentralChannel, pAd->CommonCfg.Channel)); pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel; } /* If sta connected with AP, BW=40M */ if (INFRA_ON(pAd) && (pAd->StaCfg.wdev.bw == BW_40)) { bbp_set_bw(pAd, pAd->StaCfg.wdev.bw); AsicSwitchChannel(pAd, pAd->StaCfg.wdev.CentralChannel, FALSE); } else { bbp_set_bw(pAd, BW_20); AsicSwitchChannel(pAd, pApCliEntry->MlmeAux.Channel, FALSE); } } #endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE || CFG80211_MULTI_STA */ #ifdef WPA3_SUPPORT if (pApCliEntry->CfgSsidLen == 0) { JoinReq.SsidLen = pAd->ScanTab.BssEntry[bss_idx].SsidLen; NdisMoveMemory(&(JoinReq.Ssid), pAd->ScanTab.BssEntry[bss_idx].Ssid, JoinReq.SsidLen); } else #endif { JoinReq.SsidLen = pApCliEntry->CfgSsidLen; NdisMoveMemory(&(JoinReq.Ssid), pApCliEntry->CfgSsid, JoinReq.SsidLen); } } DBGPRINT(RT_DEBUG_OFF, ("(%s) Probe Ssid=%s, Bssid=%02x:%02x:%02x:%02x:%02x:%02x\n", __FUNCTION__, JoinReq.Ssid, PRINT_MAC(JoinReq.Bssid))); *pCurrState = APCLI_CTRL_PROBE; MlmeEnqueue(pAd, APCLI_SYNC_STATE_MACHINE, APCLI_MT2_MLME_PROBE_REQ, sizeof(APCLI_MLME_JOIN_REQ_STRUCT), &JoinReq, ifIndex); return; } /* ========================================================================== 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; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; if (ApScanRunning(pAd) == TRUE) { *pCurrState = APCLI_CTRL_DISCONNECTED; #ifdef WPA3_SUPPORT pApCliEntry->fgIsConnInitialized = FALSE; pApCliEntry->MlmeAux.fgPeerAuthCommitReceived = FALSE; pApCliEntry->MlmeAux.fgPeerAuthConfirmReceived = FALSE; pApCliEntry->MlmeAux.fgOwnAuthCommitSend = FALSE; pApCliEntry->MlmeAux.fgOwnAuthConfirmSend = FALSE; #endif return; } #ifdef APCLI_AUTO_CONNECT_SUPPORT pApCliEntry->ProbeReqCnt++; DBGPRINT(RT_DEBUG_TRACE, ("(%s) Probe Req Timeout. ProbeReqCnt=%d\n", __FUNCTION__, pApCliEntry->ProbeReqCnt)); if (pApCliEntry->ProbeReqCnt > 7) { /* if exceed the APCLI_MAX_PROBE_RETRY_NUM (7), switch to try next candidate AP. */ *pCurrState = APCLI_CTRL_DISCONNECTED; #ifdef WPA3_SUPPORT pApCliEntry->fgIsConnInitialized = FALSE; pApCliEntry->MlmeAux.fgPeerAuthCommitReceived = FALSE; pApCliEntry->MlmeAux.fgPeerAuthConfirmReceived = FALSE; pApCliEntry->MlmeAux.fgOwnAuthCommitSend = FALSE; pApCliEntry->MlmeAux.fgOwnAuthConfirmSend = FALSE; #endif NdisZeroMemory(pApCliEntry->MlmeAux.Bssid, MAC_ADDR_LEN); NdisZeroMemory(pApCliEntry->MlmeAux.Ssid, MAX_LEN_OF_SSID); pApCliEntry->ProbeReqCnt = 0; if (pAd->ApCfg.ApCliAutoConnectRunning == TRUE) ApCliSwitchCandidateAP(pAd); return; } #endif /* APCLI_AUTO_CONNECT_SUPPORT */ /* stay in same state. */ *pCurrState = APCLI_CTRL_PROBE; /* retry Probe Req. */ DBGPRINT(RT_DEBUG_TRACE, ("(%s) Retry Probe Req.\n", __FUNCTION__)); 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; } /* ========================================================================== Description: APCLI MLME Probe Rsp state machine procedure ========================================================================== */ static VOID ApCliCtrlProbeRspAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { APCLI_CTRL_MSG_STRUCT *Info = (APCLI_CTRL_MSG_STRUCT *)(Elem->Msg); USHORT Status = Info->Status; PAPCLI_STRUCT pApCliEntry; MLME_AUTH_REQ_STRUCT AuthReq; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = NULL; struct wifi_dev *wdev; #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); } if (Info->CliIdx != 0xFF) CliIdx = Info->CliIdx; #endif /* MAC_REPEATER_SUPPORT */ pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; wdev = &pApCliEntry->wdev; #ifdef MAC_REPEATER_SUPPORT if (CliIdx != 0xFF) pCurrState = &pApCliEntry->RepeaterCli[CliIdx].CtrlCurrState; else #endif /* MAC_REPEATER_SUPPORT */ pCurrState = &pApCliEntry->CtrlCurrState; if (Status == MLME_SUCCESS) { DBGPRINT(RT_DEBUG_OFF, ("%s():ProbeResp success. SSID=%s, Bssid=%02x:%02x:%02x:%02x:%02x:%02x\n", __FUNCTION__, pApCliEntry->Ssid, PRINT_MAC(pApCliEntry->MlmeAux.Bssid))); *pCurrState = APCLI_CTRL_AUTH; #ifdef MAC_REPEATER_SUPPORT if (CliIdx != 0xFF) pApCliEntry->RepeaterCli[CliIdx].AuthReqCnt = 0; else #endif /* MAC_REPEATER_SUPPORT */ pApCliEntry->AuthReqCnt = 0; COPY_MAC_ADDR(AuthReq.Addr, pApCliEntry->MlmeAux.Bssid); /* start Authentication Req. */ /* If AuthMode is Auto, try shared key first */ #ifdef WPA3_SUPPORT if (wdev->AuthMode == Ndis802_11AuthModeWPA3SAE) { AuthReq.Alg = Ndis802_11AuthModeWPA3SAE; } else #endif if ((wdev->AuthMode == Ndis802_11AuthModeShared) || (wdev->AuthMode == Ndis802_11AuthModeAutoSwitch)) AuthReq.Alg = Ndis802_11AuthModeShared; else AuthReq.Alg = Ndis802_11AuthModeOpen; AuthReq.Timeout = AUTH_TIMEOUT; #ifdef WPA3_SUPPORT pApCliEntry->fgIsConnInitialized = TRUE; #endif #ifdef MAC_REPEATER_SUPPORT AuthReq.BssIdx = ifIndex; AuthReq.CliIdx = CliIdx; if (CliIdx != 0xFF) { ifIndex = (64 + 16*ifIndex + CliIdx); DBGPRINT(RT_DEBUG_ERROR, ("(%s) Repeater Cli Trigger Auth Req ifIndex = %d, CliIdx = %d !!!\n", __FUNCTION__, ifIndex, CliIdx)); } #endif /* MAC_REPEATER_SUPPORT */ MlmeEnqueue(pAd, APCLI_AUTH_STATE_MACHINE, APCLI_MT2_MLME_AUTH_REQ, sizeof(MLME_AUTH_REQ_STRUCT), &AuthReq, ifIndex); } else { DBGPRINT(RT_DEBUG_TRACE, ("(%s) Probe respond fail.\n", __FUNCTION__)); *pCurrState = APCLI_CTRL_DISCONNECTED; #ifdef WPA3_SUPPORT pApCliEntry->fgIsConnInitialized = FALSE; pApCliEntry->MlmeAux.fgPeerAuthCommitReceived = FALSE; pApCliEntry->MlmeAux.fgPeerAuthConfirmReceived = FALSE; pApCliEntry->MlmeAux.fgOwnAuthCommitSend = FALSE; pApCliEntry->MlmeAux.fgOwnAuthConfirmSend = FALSE; #endif #ifdef APCLI_AUTO_CONNECT_SUPPORT if ((pAd->ApCfg.ApCliAutoConnectRunning == TRUE) #ifdef MAC_REPEATER_SUPPORT && (CliIdx == 0xFF) #endif /* MAC_REPEATER_SUPPORT */ ) ApCliSwitchCandidateAP(pAd); #endif /* APCLI_AUTO_CONNECT_SUPPORT */ } return; } /* ========================================================================== Description: APCLI MLME AUTH Rsp state machine procedure ========================================================================== */ static VOID ApCliCtrlAuthRspAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { APCLI_CTRL_MSG_STRUCT *Info = (APCLI_CTRL_MSG_STRUCT *)(Elem->Msg); USHORT Status = Info->Status; #ifndef WPA3_SUPPORT MLME_ASSOC_REQ_STRUCT AssocReq; #endif MLME_AUTH_REQ_STRUCT AuthReq; PAPCLI_STRUCT pApCliEntry; 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); } #endif /* MAC_REPEATER_SUPPORT */ pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; #ifdef MAC_REPEATER_SUPPORT if (CliIdx != 0xFF) { DBGPRINT(RT_DEBUG_ERROR, ("(%s) Repeater Cli Receive ifIndex = %d, CliIdx = %d !!!\n", __FUNCTION__, ifIndex, CliIdx)); pCurrState = &pApCliEntry->RepeaterCli[CliIdx].CtrlCurrState; } else #endif /* MAC_REPEATER_SUPPORT */ pCurrState = &pApCliEntry->CtrlCurrState; if(Status == MLME_SUCCESS) { DBGPRINT(RT_DEBUG_OFF, ("(%s) Auth Rsp Success.\n", __FUNCTION__)); #ifndef WPA3_SUPPORT *pCurrState = APCLI_CTRL_ASSOC; #ifdef MAC_REPEATER_SUPPORT if (CliIdx != 0xFF) pApCliEntry->RepeaterCli[CliIdx].AssocReqCnt = 0; else #endif /* MAC_REPEATER_SUPPORT */ pApCliEntry->AssocReqCnt = 0; AssocParmFill(pAd, &AssocReq, pApCliEntry->MlmeAux.Bssid, pApCliEntry->MlmeAux.CapabilityInfo, ASSOC_TIMEOUT, 5); #ifdef MAC_REPEATER_SUPPORT ifIndex = (USHORT)(Elem->Priv); #endif /* MAC_REPEATER_SUPPORT */ MlmeEnqueue(pAd, APCLI_ASSOC_STATE_MACHINE, APCLI_MT2_MLME_ASSOC_REQ, sizeof(MLME_ASSOC_REQ_STRUCT), &AssocReq, ifIndex); #endif } else { if (pApCliEntry->wdev.AuthMode == Ndis802_11AuthModeAutoSwitch) { DBGPRINT(RT_DEBUG_TRACE, ("(%s) Auth Rsp Failure.\n", __FUNCTION__)); *pCurrState = APCLI_CTRL_AUTH_2; /* start Second Authentication Req. */ DBGPRINT(RT_DEBUG_TRACE, ("(%s) Start Second Auth Rep.\n", __FUNCTION__)); COPY_MAC_ADDR(AuthReq.Addr, pApCliEntry->MlmeAux.Bssid); AuthReq.Alg = Ndis802_11AuthModeOpen; AuthReq.Timeout = AUTH_TIMEOUT; #ifdef WPA3_SUPPORT pApCliEntry->fgIsConnInitialized = TRUE; #endif #ifdef MAC_REPEATER_SUPPORT AuthReq.BssIdx = ifIndex; AuthReq.CliIdx = CliIdx; ifIndex = (USHORT)(Elem->Priv); #endif /* MAC_REPEATER_SUPPORT */ MlmeEnqueue(pAd, APCLI_AUTH_STATE_MACHINE, APCLI_MT2_MLME_AUTH_REQ, sizeof(MLME_AUTH_REQ_STRUCT), &AuthReq, ifIndex); } else { #ifdef MAC_REPEATER_SUPPORT if (CliIdx != 0xFF) { pApCliEntry->RepeaterCli[CliIdx].AuthReqCnt = 0; } else #endif /* MAC_REPEATER_SUPPORT */ { NdisZeroMemory(pApCliEntry->MlmeAux.Bssid, MAC_ADDR_LEN); NdisZeroMemory(pApCliEntry->MlmeAux.Ssid, MAX_LEN_OF_SSID); pApCliEntry->AuthReqCnt = 0; } *pCurrState = APCLI_CTRL_DISCONNECTED; #ifdef WPA3_SUPPORT pApCliEntry->fgIsConnInitialized = FALSE; pApCliEntry->MlmeAux.fgPeerAuthCommitReceived = FALSE; pApCliEntry->MlmeAux.fgPeerAuthConfirmReceived = FALSE; pApCliEntry->MlmeAux.fgOwnAuthCommitSend = FALSE; pApCliEntry->MlmeAux.fgOwnAuthConfirmSend = FALSE; #endif #ifdef APCLI_AUTO_CONNECT_SUPPORT if ((pAd->ApCfg.ApCliAutoConnectRunning == TRUE) #ifdef MAC_REPEATER_SUPPORT && (CliIdx == 0xFF) #endif /* MAC_REPEATER_SUPPORT */ ) ApCliSwitchCandidateAP(pAd); #endif /* APCLI_AUTO_CONNECT_SUPPORT */ } } return; } /* ========================================================================== Description: APCLI MLME AUTH2 Rsp state machine procedure ========================================================================== */ static VOID ApCliCtrlAuth2RspAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { APCLI_CTRL_MSG_STRUCT *Info = (APCLI_CTRL_MSG_STRUCT *)(Elem->Msg); USHORT Status = Info->Status; #ifndef WPA3_SUPPORT MLME_ASSOC_REQ_STRUCT AssocReq; #endif PAPCLI_STRUCT pApCliEntry; 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); } #endif /* MAC_REPEATER_SUPPORT */ pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; #ifdef MAC_REPEATER_SUPPORT if (CliIdx != 0xFF) pCurrState = &pApCliEntry->RepeaterCli[CliIdx].CtrlCurrState; else #endif /* MAC_REPEATER_SUPPORT */ pCurrState = &pApCliEntry->CtrlCurrState; if(Status == MLME_SUCCESS) { DBGPRINT(RT_DEBUG_TRACE, ("(%s) Auth2 Rsp Success.\n", __FUNCTION__)); *pCurrState = APCLI_CTRL_ASSOC; #ifdef MAC_REPEATER_SUPPORT if (CliIdx != 0xFF) pApCliEntry->RepeaterCli[CliIdx].AssocReqCnt = 0; else #endif /* MAC_REPEATER_SUPPORT */ pApCliEntry->AssocReqCnt = 0; #ifndef WPA3_SUPPORT AssocParmFill(pAd, &AssocReq, pApCliEntry->MlmeAux.Bssid, pApCliEntry->MlmeAux.CapabilityInfo, ASSOC_TIMEOUT, 5); #ifdef MAC_REPEATER_SUPPORT ifIndex = (USHORT)(Elem->Priv); #endif /* MAC_REPEATER_SUPPORT */ MlmeEnqueue(pAd, APCLI_ASSOC_STATE_MACHINE, APCLI_MT2_MLME_ASSOC_REQ, sizeof(MLME_ASSOC_REQ_STRUCT), &AssocReq, ifIndex); #endif } else { DBGPRINT(RT_DEBUG_TRACE, ("(%s) Apcli Auth Rsp Failure.\n", __FUNCTION__)); *pCurrState = APCLI_CTRL_DISCONNECTED; #ifdef WPA3_SUPPORT pApCliEntry->fgIsConnInitialized = FALSE; pApCliEntry->MlmeAux.fgPeerAuthCommitReceived = FALSE; pApCliEntry->MlmeAux.fgPeerAuthConfirmReceived = FALSE; pApCliEntry->MlmeAux.fgOwnAuthCommitSend = FALSE; pApCliEntry->MlmeAux.fgOwnAuthConfirmSend = FALSE; #endif #ifdef APCLI_AUTO_CONNECT_SUPPORT if ((pAd->ApCfg.ApCliAutoConnectRunning == TRUE) #ifdef MAC_REPEATER_SUPPORT && (CliIdx == 0xFF) #endif /* MAC_REPEATER_SUPPORT */ ) ApCliSwitchCandidateAP(pAd); #endif /* APCLI_AUTO_CONNECT_SUPPORT */ } return; } /* ========================================================================== Description: APCLI MLME Auth Req timeout state machine procedure ========================================================================== */ static VOID ApCliCtrlAuthReqTimeoutAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { MLME_AUTH_REQ_STRUCT AuthReq; PAPCLI_STRUCT pApCliEntry; 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].CtrlCurrState; } else #endif /* MAC_REPEATER_SUPPORT */ pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; DBGPRINT(RT_DEBUG_TRACE, ("(%s) Auth Req Timeout.\n", __FUNCTION__)); #ifdef MAC_REPEATER_SUPPORT if (CliIdx != 0xFF) { pApCliEntry->RepeaterCli[CliIdx].AuthReqCnt++; if (pApCliEntry->RepeaterCli[CliIdx].AuthReqCnt > 5) { *pCurrState = APCLI_CTRL_DISCONNECTED; #ifdef WPA3_SUPPORT pApCliEntry->fgIsConnInitialized = FALSE; pApCliEntry->MlmeAux.fgPeerAuthCommitReceived = FALSE; pApCliEntry->MlmeAux.fgPeerAuthConfirmReceived = FALSE; pApCliEntry->MlmeAux.fgOwnAuthCommitSend = FALSE; pApCliEntry->MlmeAux.fgOwnAuthConfirmSend = FALSE; #endif pApCliEntry->RepeaterCli[CliIdx].AuthReqCnt = 0; return; } } else #endif /* MAC_REPEATER_SUPPORT */ { pApCliEntry->AuthReqCnt++; if (pApCliEntry->AuthReqCnt > 5) { *pCurrState = APCLI_CTRL_DISCONNECTED; #ifdef WPA3_SUPPORT pApCliEntry->fgIsConnInitialized = FALSE; pApCliEntry->MlmeAux.fgPeerAuthCommitReceived = FALSE; pApCliEntry->MlmeAux.fgPeerAuthConfirmReceived = FALSE; pApCliEntry->MlmeAux.fgOwnAuthCommitSend = FALSE; pApCliEntry->MlmeAux.fgOwnAuthConfirmSend = FALSE; #endif NdisZeroMemory(pApCliEntry->MlmeAux.Bssid, MAC_ADDR_LEN); NdisZeroMemory(pApCliEntry->MlmeAux.Ssid, MAX_LEN_OF_SSID); pApCliEntry->AuthReqCnt = 0; #ifdef APCLI_AUTO_CONNECT_SUPPORT if ((pAd->ApCfg.ApCliAutoConnectRunning == TRUE) #ifdef MAC_REPEATER_SUPPORT && (CliIdx == 0xFF) #endif /* MAC_REPEATER_SUPPORT */ ) ApCliSwitchCandidateAP(pAd); #endif /* APCLI_AUTO_CONNECT_SUPPORT */ return; } } /* stay in same state. */ *pCurrState = APCLI_CTRL_AUTH; /* retry Authentication. */ DBGPRINT(RT_DEBUG_TRACE, ("(%s) Retry Auth Req.\n", __FUNCTION__)); COPY_MAC_ADDR(AuthReq.Addr, pApCliEntry->MlmeAux.Bssid); AuthReq.Alg = pApCliEntry->MlmeAux.Alg; /*Ndis802_11AuthModeOpen; */ AuthReq.Timeout = AUTH_TIMEOUT; #ifdef WPA3_SUPPORT pApCliEntry->fgIsConnInitialized = TRUE; #endif #ifdef MAC_REPEATER_SUPPORT AuthReq.BssIdx = ifIndex; AuthReq.CliIdx = CliIdx; ifIndex = (USHORT)(Elem->Priv); #endif /* MAC_REPEATER_SUPPORT */ MlmeEnqueue(pAd, APCLI_AUTH_STATE_MACHINE, APCLI_MT2_MLME_AUTH_REQ, sizeof(MLME_AUTH_REQ_STRUCT), &AuthReq, ifIndex); return; } /* ========================================================================== Description: APCLI MLME Auth2 Req timeout state machine procedure ========================================================================== */ static VOID ApCliCtrlAuth2ReqTimeoutAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { return; } /* ========================================================================== Description: APCLI MLME ASSOC RSP state machine procedure ========================================================================== */ static VOID ApCliCtrlAssocRspAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { PAPCLI_STRUCT pApCliEntry; APCLI_CTRL_MSG_STRUCT *Info = (APCLI_CTRL_MSG_STRUCT *)(Elem->Msg); USHORT Status = Info->Status; 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); DBGPRINT(RT_DEBUG_ERROR, ("(%s) Repeater Cli Receive Assoc Rsp ifIndex = %d, CliIdx = %d.\n", __FUNCTION__, ifIndex, CliIdx)); pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].CtrlCurrState; } else #endif /* MAC_REPEATER_SUPPORT */ pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; if(Status == MLME_SUCCESS) { DBGPRINT(RT_DEBUG_OFF, ("(%s) apCliIf = %d, Receive Assoc Rsp Success.\n", __FUNCTION__, ifIndex)); #ifdef WPA_SUPPLICANT_SUPPORT if (pAd->ApCfg.ApCliTab[ifIndex].wpa_supplicant_info.WpaSupplicantUP) { ApcliSendAssocIEsToWpaSupplicant(pAd,ifIndex); RtmpOSWrielessEventSend(pAd->net_dev, RT_WLAN_EVENT_CUSTOM, RT_ASSOC_EVENT_FLAG, NULL, NULL, 0); } #endif /* WPA_SUPPLICANT_SUPPORT */ #ifdef MAC_REPEATER_SUPPORT ifIndex = (USHORT)(Elem->Priv); #endif /* MAC_REPEATER_SUPPORT */ if (ApCliLinkUp(pAd, (UCHAR)ifIndex)) { *pCurrState = APCLI_CTRL_CONNECTED; #if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) CFG80211_checkScanTable(pAd); #ifndef WPA3_SUPPORT RT_CFG80211_P2P_CLI_CONN_RESULT_INFORM(pAd, pApCliEntry->MlmeAux.Bssid, pApCliEntry->ReqVarIEs, pApCliEntry->ReqVarIELen, pApCliEntry->ResVarIEs, pApCliEntry->ResVarIELen, TRUE); #endif if (pAd->cfg80211_ctrl.bP2pCliPmEnable == TRUE) { CmdP2pNoaOffloadCtrl(pAd, P2P_NOA_RX_ON); } #endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE || CFG80211_MULTI_STA */ } else { DBGPRINT(RT_DEBUG_TRACE, ("(%s) apCliIf = %d, Insert Remote AP to MacTable failed.\n", __FUNCTION__, ifIndex)); /* Reset the apcli interface as disconnected and Invalid. */ *pCurrState = APCLI_CTRL_DISCONNECTED; #ifdef WPA3_SUPPORT pApCliEntry->fgIsConnInitialized = FALSE; pApCliEntry->MlmeAux.fgPeerAuthCommitReceived = FALSE; pApCliEntry->MlmeAux.fgPeerAuthConfirmReceived = FALSE; pApCliEntry->MlmeAux.fgOwnAuthCommitSend = FALSE; pApCliEntry->MlmeAux.fgOwnAuthConfirmSend = FALSE; #endif #ifdef MAC_REPEATER_SUPPORT if (CliIdx != 0xFF) { ifIndex = ((ifIndex - 64) / 16); pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].CliValid = FALSE; } else #endif /* MAC_REPEATER_SUPPORT */ pApCliEntry->Valid = FALSE; #ifdef APCLI_AUTO_CONNECT_SUPPORT if ((pAd->ApCfg.ApCliAutoConnectRunning == TRUE) #ifdef MAC_REPEATER_SUPPORT && (CliIdx == 0xFF) #endif /* MAC_REPEATER_SUPPORT */ ) ApCliSwitchCandidateAP(pAd); #endif /* APCLI_AUTO_CONNECT_SUPPORT */ #if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) CFG80211_checkScanTable(pAd); RT_CFG80211_P2P_CLI_CONN_RESULT_INFORM(pAd, pApCliEntry->MlmeAux.Bssid, NULL, 0, NULL, 0, 0); #endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE || CFG80211_MULTI_STA */ } } else { DBGPRINT(RT_DEBUG_TRACE, ("(%s) apCliIf = %d, Receive Assoc Rsp Failure.\n", __FUNCTION__, ifIndex)); #ifdef WPA3_SUPPORT if (pApCliEntry->AssocReqCnt <= 5) { MLME_ASSOC_REQ_STRUCT AssocReq; /* retry Association Req. */ pApCliEntry->AssocReqCnt++; DBGPRINT(RT_DEBUG_TRACE, ("(%s) Retry Association Req.\n", __func__)); AssocParmFill(pAd, &AssocReq, pApCliEntry->MlmeAux.Bssid, pApCliEntry->MlmeAux.CapabilityInfo, ASSOC_TIMEOUT, 5); MlmeEnqueue(pAd, APCLI_ASSOC_STATE_MACHINE, APCLI_MT2_MLME_ASSOC_REQ, sizeof(MLME_ASSOC_REQ_STRUCT), &AssocReq, ifIndex); } else #endif { *pCurrState = APCLI_CTRL_DISCONNECTED; #ifdef WPA3_SUPPORT pApCliEntry->fgIsConnInitialized = FALSE; pApCliEntry->MlmeAux.fgPeerAuthCommitReceived = FALSE; pApCliEntry->MlmeAux.fgPeerAuthConfirmReceived = FALSE; pApCliEntry->MlmeAux.fgOwnAuthCommitSend = FALSE; pApCliEntry->MlmeAux.fgOwnAuthConfirmSend = FALSE; #endif /* set the apcli interface be valid. */ #ifdef MAC_REPEATER_SUPPORT if (CliIdx != 0xFF) pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].CliValid = FALSE; else #endif /* MAC_REPEATER_SUPPORT */ pApCliEntry->Valid = FALSE; #ifdef APCLI_AUTO_CONNECT_SUPPORT if ((pAd->ApCfg.ApCliAutoConnectRunning == TRUE) #ifdef MAC_REPEATER_SUPPORT && (CliIdx == 0xFF) #endif /* MAC_REPEATER_SUPPORT */ ) ApCliSwitchCandidateAP(pAd); #endif /* APCLI_AUTO_CONNECT_SUPPORT */ #if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) CFG80211_checkScanTable(pAd); RT_CFG80211_P2P_CLI_CONN_RESULT_INFORM(pAd, pApCliEntry->MlmeAux.Bssid, NULL, 0, NULL, 0, 0); #endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE || CFG80211_MULTI_STA */ } } return; } /* ========================================================================== Description: APCLI MLME DeASSOC RSP state machine procedure ========================================================================== */ static VOID ApCliCtrlDeAssocRspAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { PAPCLI_STRUCT pApCliEntry; APCLI_CTRL_MSG_STRUCT *Info = (APCLI_CTRL_MSG_STRUCT *)(Elem->Msg); USHORT Status = Info->Status; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = NULL; BOOLEAN bValid = FALSE; #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].CtrlCurrState; } else #endif /* MAC_REPEATER_SUPPORT */ pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; if (Status == MLME_SUCCESS) { DBGPRINT(RT_DEBUG_TRACE, ("(%s) Receive DeAssoc Rsp Success.\n", __FUNCTION__)); } else { DBGPRINT(RT_DEBUG_TRACE, ("(%s) Receive DeAssoc Rsp Failure.\n", __FUNCTION__)); } #ifdef MAC_REPEATER_SUPPORT if (CliIdx != 0xFF) bValid = pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].CliValid; else #endif /* MAC_REPEATER_SUPPORT */ bValid = pApCliEntry->Valid; #ifdef MAC_REPEATER_SUPPORT ifIndex = (USHORT)(Elem->Priv); #endif /* MAC_REPEATER_SUPPORT */ if (bValid) ApCliLinkDown(pAd, (UCHAR)ifIndex); *pCurrState = APCLI_CTRL_DISCONNECTED; #ifdef WPA3_SUPPORT pApCliEntry->fgIsConnInitialized = FALSE; pApCliEntry->MlmeAux.fgPeerAuthCommitReceived = FALSE; pApCliEntry->MlmeAux.fgPeerAuthConfirmReceived = FALSE; pApCliEntry->MlmeAux.fgOwnAuthCommitSend = FALSE; pApCliEntry->MlmeAux.fgOwnAuthConfirmSend = FALSE; #endif return; } /* ========================================================================== Description: APCLI MLME Assoc Req timeout state machine procedure ========================================================================== */ static VOID ApCliCtrlAssocReqTimeoutAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { MLME_ASSOC_REQ_STRUCT AssocReq; PAPCLI_STRUCT pApCliEntry; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = NULL; #ifdef MAC_REPEATER_SUPPORT UCHAR CliIdx = 0xFF; #endif /* MAC_REPEATER_SUPPORT */ DBGPRINT(RT_DEBUG_TRACE, ("(%s) Assoc Req Timeout.\n", __FUNCTION__)); 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].CtrlCurrState; } else #endif /* MAC_REPEATER_SUPPORT */ pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; /* give up to retry authentication req after retry it 5 times. */ #ifdef MAC_REPEATER_SUPPORT if (CliIdx !=0xFF) { pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].AssocReqCnt++; if (pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].AssocReqCnt > 5) { *pCurrState = APCLI_CTRL_DISCONNECTED; #ifdef WPA3_SUPPORT pApCliEntry->fgIsConnInitialized = FALSE; pApCliEntry->MlmeAux.fgPeerAuthCommitReceived = FALSE; pApCliEntry->MlmeAux.fgPeerAuthConfirmReceived = FALSE; pApCliEntry->MlmeAux.fgOwnAuthCommitSend = FALSE; pApCliEntry->MlmeAux.fgOwnAuthConfirmSend = FALSE; #endif pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].AssocReqCnt = 0; return; } } else #endif /* MAC_REPEATER_SUPPORT */ { pApCliEntry->AssocReqCnt++; if (pApCliEntry->AssocReqCnt > 5) { *pCurrState = APCLI_CTRL_DISCONNECTED; #ifdef WPA3_SUPPORT pApCliEntry->fgIsConnInitialized = FALSE; pApCliEntry->MlmeAux.fgPeerAuthCommitReceived = FALSE; pApCliEntry->MlmeAux.fgPeerAuthConfirmReceived = FALSE; pApCliEntry->MlmeAux.fgOwnAuthCommitSend = FALSE; pApCliEntry->MlmeAux.fgOwnAuthConfirmSend = FALSE; #endif NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid, MAC_ADDR_LEN); NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Ssid, MAX_LEN_OF_SSID); pApCliEntry->AssocReqCnt = 0; #ifdef APCLI_AUTO_CONNECT_SUPPORT if ((pAd->ApCfg.ApCliAutoConnectRunning == TRUE) #ifdef MAC_REPEATER_SUPPORT && (CliIdx == 0xFF) #endif /* MAC_REPEATER_SUPPORT */ ) ApCliSwitchCandidateAP(pAd); #endif /* APCLI_AUTO_CONNECT_SUPPORT */ return; } } /* stay in same state. */ *pCurrState = APCLI_CTRL_ASSOC; /* retry Association Req. */ DBGPRINT(RT_DEBUG_TRACE, ("(%s) Retry Association Req.\n", __FUNCTION__)); AssocParmFill(pAd, &AssocReq, pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid, pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.CapabilityInfo, ASSOC_TIMEOUT, 5); #ifdef MAC_REPEATER_SUPPORT ifIndex = (USHORT)(Elem->Priv); #endif /* MAC_REPEATER_SUPPORT */ MlmeEnqueue(pAd, APCLI_ASSOC_STATE_MACHINE, APCLI_MT2_MLME_ASSOC_REQ, sizeof(MLME_ASSOC_REQ_STRUCT), &AssocReq, ifIndex); return; } /* ========================================================================== Description: APCLI MLME Disconnect Rsp state machine procedure ========================================================================== */ static VOID ApCliCtrlDisconnectReqAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { PAPCLI_STRUCT pApCliEntry; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = NULL; BOOLEAN bValid = FALSE; #ifdef MAC_REPEATER_SUPPORT UCHAR CliIdx = 0xFF; #endif /* MAC_REPEATER_SUPPORT */ DBGPRINT(RT_DEBUG_TRACE, ("(%s) MLME Request disconnect.\n", __FUNCTION__)); 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].CtrlCurrState; } else #endif /* MAC_REPEATER_SUPPORT */ pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; #ifdef MAC_REPEATER_SUPPORT if (CliIdx != 0xFF) bValid = pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].CliValid; else #endif /* MAC_REPEATER_SUPPORT */ bValid = pApCliEntry->Valid; #ifdef MAC_REPEATER_SUPPORT ifIndex = (USHORT)(Elem->Priv); #endif /* MAC_REPEATER_SUPPORT */ DBGPRINT(RT_DEBUG_ERROR, ("(%s) 2. Before do ApCliLinkDown.\n", __FUNCTION__)); if (bValid) ApCliLinkDown(pAd, (UCHAR)ifIndex); /* set the apcli interface be invalid. */ #ifdef MAC_REPEATER_SUPPORT if (CliIdx != 0xFF) { ifIndex = ((ifIndex - 64) / 16); pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].CliValid = FALSE; pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].CliEnable = FALSE; } else #endif /* MAC_REPEATER_SUPPORT */ { pApCliEntry->Valid = FALSE; /* clear MlmeAux.Ssid and Bssid. */ NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid, MAC_ADDR_LEN); pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.SsidLen = 0; NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Ssid, MAX_LEN_OF_SSID); pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Rssi = 0; } *pCurrState = APCLI_CTRL_DISCONNECTED; #ifdef WPA3_SUPPORT pApCliEntry->fgIsConnInitialized = FALSE; pApCliEntry->MlmeAux.fgPeerAuthCommitReceived = FALSE; pApCliEntry->MlmeAux.fgPeerAuthConfirmReceived = FALSE; pApCliEntry->MlmeAux.fgOwnAuthCommitSend = FALSE; pApCliEntry->MlmeAux.fgOwnAuthConfirmSend = FALSE; #endif return; } /* ========================================================================== Description: APCLI MLME Peer DeAssoc Req state machine procedure ========================================================================== */ static VOID ApCliCtrlPeerDeAssocReqAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { PAPCLI_STRUCT pApCliEntry; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = NULL; BOOLEAN bValid = FALSE; #ifdef MAC_REPEATER_SUPPORT UCHAR CliIdx = 0xFF; #endif /* MAC_REPEATER_SUPPORT */ DBGPRINT(RT_DEBUG_OFF, ("(%s) Peer DeAssoc Req.\n", __FUNCTION__)); 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].CtrlCurrState; } else #endif /* MAC_REPEATER_SUPPORT */ pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; #ifdef MAC_REPEATER_SUPPORT if (CliIdx == 0xFF) { UCHAR index; BOOLEAN Cancelled; for(index = 0; index < MAX_EXT_MAC_ADDR_SIZE; index++) { if (pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[index].CliEnable) { RTMPCancelTimer(&pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[index].ApCliAuthTimer, &Cancelled); RTMPCancelTimer(&pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[index].ApCliAssocTimer, &Cancelled); if (pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[index].CliValid) ApCliLinkDown(pAd, (64 + MAX_EXT_MAC_ADDR_SIZE*ifIndex + index)); pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[index].CliValid = FALSE; pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[index].CliEnable = FALSE; RTMPRemoveRepeaterEntry(pAd, ifIndex, index); } } } #endif /* MAC_REPEATER_SUPPORT */ #ifdef MAC_REPEATER_SUPPORT if (CliIdx != 0xFF) bValid = pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].CliValid; else #endif /* MAC_REPEATER_SUPPORT */ bValid = pApCliEntry->Valid; #ifdef MAC_REPEATER_SUPPORT ifIndex = (USHORT)(Elem->Priv); #endif /* MAC_REPEATER_SUPPORT */ if (bValid) ApCliLinkDown(pAd, (UCHAR)ifIndex); #ifdef APCLI_AUTO_CONNECT_SUPPORT if ((pAd->ApCfg.ApCliAutoConnectRunning == TRUE) #ifdef MAC_REPEATER_SUPPORT && (CliIdx == 0xFF) #endif /* MAC_REPEATER_SUPPORT */ ) { STA_TR_ENTRY *tr_entry = &pAd->MacTab.tr_entry[pApCliEntry->MacTabWCID]; if (tr_entry->PortSecured == WPA_802_1X_PORT_NOT_SECURED) ApCliSwitchCandidateAP(pAd); } #endif /* APCLI_AUTO_CONNECT_SUPPORT */ /* set the apcli interface be invalid. */ #ifdef MAC_REPEATER_SUPPORT if (CliIdx != 0xFF) { ifIndex = ((ifIndex - 64) / 16); pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].CliValid = FALSE; pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].CliEnable = FALSE; } else #endif /* MAC_REPEATER_SUPPORT */ { pApCliEntry->Valid = FALSE; /* clear MlmeAux.Ssid and Bssid. */ NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid, MAC_ADDR_LEN); pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.SsidLen = 0; NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Ssid, MAX_LEN_OF_SSID); pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Rssi = 0; } *pCurrState = APCLI_CTRL_DISCONNECTED; #ifdef WPA3_SUPPORT pApCliEntry->fgIsConnInitialized = FALSE; pApCliEntry->MlmeAux.fgPeerAuthCommitReceived = FALSE; pApCliEntry->MlmeAux.fgPeerAuthConfirmReceived = FALSE; pApCliEntry->MlmeAux.fgOwnAuthCommitSend = FALSE; pApCliEntry->MlmeAux.fgOwnAuthConfirmSend = FALSE; #endif return; } /* ========================================================================== Description: APCLI MLME Disconnect Req state machine procedure ========================================================================== */ static VOID ApCliCtrlDeAssocAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { PAPCLI_STRUCT pApCliEntry; MLME_DISASSOC_REQ_STRUCT DisassocReq; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = NULL; BOOLEAN bValid = FALSE; #ifdef MAC_REPEATER_SUPPORT UCHAR CliIdx = 0xFF; #endif /* MAC_REPEATER_SUPPORT */ DBGPRINT(RT_DEBUG_TRACE, ("(%s) MLME Request Disconnect.\n", __FUNCTION__)); 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].CtrlCurrState; } else #endif /* MAC_REPEATER_SUPPORT */ pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; DisassocParmFill(pAd, &DisassocReq, pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid, REASON_DISASSOC_STA_LEAVING); #ifdef MAC_REPEATER_SUPPORT if (CliIdx != 0xFF) bValid = pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].CliValid; else #endif /* MAC_REPEATER_SUPPORT */ bValid = pApCliEntry->Valid; #ifdef MAC_REPEATER_SUPPORT ifIndex = (USHORT)(Elem->Priv); #endif /* MAC_REPEATER_SUPPORT */ MlmeEnqueue(pAd, APCLI_ASSOC_STATE_MACHINE, APCLI_MT2_MLME_DISASSOC_REQ, sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq, ifIndex); if (bValid) ApCliLinkDown(pAd, (UCHAR)ifIndex); /* set the apcli interface be invalid. */ #ifdef MAC_REPEATER_SUPPORT if (CliIdx != 0xFF) { ifIndex = ((ifIndex - 64) / 16); pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].CliValid = FALSE; pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].CliEnable = FALSE; } else #endif /* MAC_REPEATER_SUPPORT */ { pApCliEntry->Valid = FALSE; /* clear MlmeAux.Ssid and Bssid. */ NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid, MAC_ADDR_LEN); pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.SsidLen = 0; NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Ssid, MAX_LEN_OF_SSID); pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Rssi = 0; } *pCurrState = APCLI_CTRL_DEASSOC; return; } /* ========================================================================== Description: APCLI MLME Disconnect Req state machine procedure ========================================================================== */ static VOID ApCliCtrlDeAuthAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { PAPCLI_STRUCT pApCliEntry; MLME_DEAUTH_REQ_STRUCT DeAuthFrame; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = NULL; BOOLEAN bValid = FALSE; #ifdef MAC_REPEATER_SUPPORT UCHAR CliIdx = 0xFF; #endif /* MAC_REPEATER_SUPPORT */ DBGPRINT(RT_DEBUG_TRACE, ("(%s) MLME Request Disconnect.\n", __FUNCTION__)); 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].CtrlCurrState; } else #endif /* MAC_REPEATER_SUPPORT */ pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; /* Fill in the related information */ DeAuthFrame.Reason = (USHORT)REASON_DEAUTH_STA_LEAVING; COPY_MAC_ADDR(DeAuthFrame.Addr, pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid); #ifdef MAC_REPEATER_SUPPORT if (CliIdx != 0xFF) bValid = pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].CliValid; else #endif /* MAC_REPEATER_SUPPORT */ bValid = pApCliEntry->Valid; #ifdef MAC_REPEATER_SUPPORT ifIndex = (USHORT)(Elem->Priv); #endif /* MAC_REPEATER_SUPPORT */ MlmeEnqueue(pAd, APCLI_AUTH_STATE_MACHINE, APCLI_MT2_MLME_DEAUTH_REQ, sizeof(MLME_DEAUTH_REQ_STRUCT), &DeAuthFrame, ifIndex); if (bValid) ApCliLinkDown(pAd, (UCHAR)ifIndex); /* set the apcli interface be invalid. */ #ifdef MAC_REPEATER_SUPPORT if (CliIdx != 0xFF) { ifIndex = ((ifIndex - 64) / 16); pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].CliValid = FALSE; pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].CliEnable = FALSE; //RTMPDelRepeaterCliAsicEntry(pAd, CliIdx); } else #endif /* MAC_REPEATER_SUPPORT */ { pApCliEntry->Valid = FALSE; /* clear MlmeAux.Ssid and Bssid. */ NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid, MAC_ADDR_LEN); pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.SsidLen = 0; NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Ssid, MAX_LEN_OF_SSID); pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Rssi = 0; } *pCurrState = APCLI_CTRL_DISCONNECTED; #ifdef WPA3_SUPPORT pApCliEntry->fgIsConnInitialized = FALSE; pApCliEntry->MlmeAux.fgPeerAuthCommitReceived = FALSE; pApCliEntry->MlmeAux.fgPeerAuthConfirmReceived = FALSE; pApCliEntry->MlmeAux.fgOwnAuthCommitSend = FALSE; pApCliEntry->MlmeAux.fgOwnAuthConfirmSend = FALSE; #endif return; } #endif /* APCLI_SUPPORT */