1669 lines
51 KiB
C
1669 lines
51 KiB
C
/*
|
|
***************************************************************************
|
|
* 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 */
|
|
|