sta_ctrl.c

来自「Ralink RT61 SoftAP Driver source code. 」· C语言 代码 · 共 691 行 · 第 1/2 页

C
691
字号
/*
 ***************************************************************************
 * 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:
	sta_ctrl.c

	Abstract:

	Revision History:
	Who			When			What
	--------	----------		----------------------------------------------
	Fonchi		2006-06-23      modified for rt61-APClinent
*/
#include "rt_config.h"

/*
    ==========================================================================
    Description:
        The apcli ctrl state machine, 
    Parameters:
        Sm - pointer to the state machine
    Note:
        the state machine looks like the following
    ==========================================================================
 */
VOID StaCtrlStateMachineInit(
	IN PRTMP_ADAPTER pAd,
	IN STA_STATE_MACHINE *Sm,
	OUT STA_STATE_MACHINE_FUNC Trans[])
{
	UCHAR i;

	StaStateMachineInit(Sm, (STA_STATE_MACHINE_FUNC*)Trans, STA_MAX_CTRL_STATE, STA_MAX_CTRL_MSG, (STA_STATE_MACHINE_FUNC)StaDrop, STA_CTRL_DISCONNECTED, STA_CTRL_MACHINE_BASE);

	// disconnected state
	StaStateMachineSetAction(Sm, STA_CTRL_DISCONNECTED, STA_CTRL_JOIN_REQ, (STA_STATE_MACHINE_FUNC)StaCtrlJoinReqAction);

	// probe state
	StaStateMachineSetAction(Sm, STA_CTRL_PROBE, STA_CTRL_PROBE_RSP, (STA_STATE_MACHINE_FUNC)StaCtrlProbeRspAction);
	StaStateMachineSetAction(Sm, STA_CTRL_PROBE, STA_CTRL_JOIN_REQ_TIMEOUT, (STA_STATE_MACHINE_FUNC)StaCtrlJoinReqTimeoutAction);
	StaStateMachineSetAction(Sm, STA_CTRL_PROBE, STA_CTRL_DISCONNECT_REQ, (STA_STATE_MACHINE_FUNC)StaCtrlDisconnectReqAction);

	// auth state
	StaStateMachineSetAction(Sm, STA_CTRL_AUTH, STA_CTRL_AUTH_RSP, (STA_STATE_MACHINE_FUNC)StaCtrlAuthRspAction);
	StaStateMachineSetAction(Sm, STA_CTRL_AUTH, STA_CTRL_AUTH_REQ_TIMEOUT, (STA_STATE_MACHINE_FUNC)StaCtrlAuthReqTimeoutAction);
	StaStateMachineSetAction(Sm, STA_CTRL_AUTH, STA_CTRL_DISCONNECT_REQ, (STA_STATE_MACHINE_FUNC)StaCtrlDisconnectReqAction);
 	StaStateMachineSetAction(Sm, STA_CTRL_AUTH, STA_CTRL_PEER_DISCONNECT_REQ, (STA_STATE_MACHINE_FUNC)StaCtrlPeerDeAssocReqAction);

	// auth2 state
	StaStateMachineSetAction(Sm, STA_CTRL_AUTH_2, STA_CTRL_AUTH_RSP, (STA_STATE_MACHINE_FUNC)StaCtrlAuth2RspAction);
	StaStateMachineSetAction(Sm, STA_CTRL_AUTH_2, STA_CTRL_AUTH_REQ_TIMEOUT, (STA_STATE_MACHINE_FUNC)StaCtrlAuth2ReqTimeoutAction);
	StaStateMachineSetAction(Sm, STA_CTRL_AUTH_2, STA_CTRL_DISCONNECT_REQ, (STA_STATE_MACHINE_FUNC)StaCtrlDisconnectReqAction);
 	StaStateMachineSetAction(Sm, STA_CTRL_AUTH_2, STA_CTRL_PEER_DISCONNECT_REQ, (STA_STATE_MACHINE_FUNC)StaCtrlPeerDeAssocReqAction);

	// assoc state
	StaStateMachineSetAction(Sm, STA_CTRL_ASSOC, STA_CTRL_ASSOC_RSP, (STA_STATE_MACHINE_FUNC)StaCtrlAssocRspAction);
	StaStateMachineSetAction(Sm, STA_CTRL_ASSOC, STA_CTRL_ASSOC_REQ_TIMEOUT, (STA_STATE_MACHINE_FUNC)StaCtrlAssocReqTimeoutAction);
	StaStateMachineSetAction(Sm, STA_CTRL_ASSOC, STA_CTRL_DISCONNECT_REQ, (STA_STATE_MACHINE_FUNC)StaCtrlDeAssocAction);
 	StaStateMachineSetAction(Sm, STA_CTRL_ASSOC, STA_CTRL_PEER_DISCONNECT_REQ, (STA_STATE_MACHINE_FUNC)StaCtrlPeerDeAssocReqAction);

	// deassoc state
	StaStateMachineSetAction(Sm, STA_CTRL_DEASSOC, STA_CTRL_DEASSOC_RSP, (STA_STATE_MACHINE_FUNC)StaCtrlDeAssocRspAction);

	// connected state
	StaStateMachineSetAction(Sm, STA_CTRL_CONNECTED, STA_CTRL_DISCONNECT_REQ, (STA_STATE_MACHINE_FUNC)StaCtrlDeAssocAction);
 	StaStateMachineSetAction(Sm, STA_CTRL_CONNECTED, STA_CTRL_PEER_DISCONNECT_REQ, (STA_STATE_MACHINE_FUNC)StaCtrlPeerDeAssocReqAction);

	for (i = 0; i < MAX_APCLI_ENTRY; i++)
		pAd->ApCliTab.ApCliEntry[i].CtrlCurrState = STA_CTRL_DISCONNECTED;

	return;
}


/* 
    ==========================================================================
    Description:
        APCLI MLME JOIN req state machine procedure
    ==========================================================================
 */
VOID StaCtrlJoinReqAction(
	IN PRTMP_ADAPTER pAd, 
	IN MLME_QUEUE_ELEM *Elem,
	OUT PULONG pCurrState,
	IN USHORT ifIndex)
{
	MLME_JOIN_REQ_STRUCT JoinReq;

#ifdef RTL865X_SOC
	printk("(%s) Start Probe Req.\n", __FUNCTION__);
#else	
	DBGPRINT(RT_DEBUG_TRACE, "(%s) Start Probe Req.\n", __FUNCTION__);
#endif	

	NdisZeroMemory(&JoinReq, sizeof(MLME_JOIN_REQ_STRUCT));

	if (!MAC_ADDR_EQUAL(pAd->ApCliTab.ApCliEntry[ifIndex].CfgApCliBssid, ZERO_MAC_ADDR))
	{
		COPY_MAC_ADDR(JoinReq.Bssid, pAd->ApCliTab.ApCliEntry[ifIndex].CfgApCliBssid);
	}

	if (pAd->ApCliTab.ApCliEntry[ifIndex].CfgSsidLen != 0)
	{
		JoinReq.SsidLen = pAd->ApCliTab.ApCliEntry[ifIndex].CfgSsidLen;
		NdisMoveMemory(&(JoinReq.Ssid), pAd->ApCliTab.ApCliEntry[ifIndex].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]);

	*pCurrState = STA_CTRL_PROBE;

	StaMlmeEnqueue(pAd, STA_SYNC_STATE_MACHINE, STA_MT2_MLME_PROBE_REQ,
		sizeof(MLME_JOIN_REQ_STRUCT), &JoinReq, ifIndex);

	return;
}

/* 
    ==========================================================================
    Description:
        APCLI MLME JOIN req timeout state machine procedure
    ==========================================================================
 */
VOID StaCtrlJoinReqTimeoutAction(
	IN PRTMP_ADAPTER pAd, 
	IN MLME_QUEUE_ELEM *Elem,
	OUT PULONG pCurrState,
	IN USHORT ifIndex)
{
	MLME_JOIN_REQ_STRUCT JoinReq;

	DBGPRINT(RT_DEBUG_TRACE, "(%s) Probe Req Timeout.\n", __FUNCTION__);

	// stay in same state.
	*pCurrState = STA_CTRL_PROBE;

	// retry Probe Req.
	DBGPRINT(RT_DEBUG_TRACE, "(%s) Retry Probe Req.\n", __FUNCTION__);

	NdisZeroMemory(&JoinReq, sizeof(MLME_JOIN_REQ_STRUCT));

	if (!MAC_ADDR_EQUAL(pAd->ApCliTab.ApCliEntry[ifIndex].ApCliBssid, ZERO_MAC_ADDR))
	{
		COPY_MAC_ADDR(JoinReq.Bssid, pAd->ApCliTab.ApCliEntry[ifIndex].ApCliBssid);
	}

	if (pAd->ApCliTab.ApCliEntry[ifIndex].SsidLen != 0)
	{
		JoinReq.SsidLen = pAd->ApCliTab.ApCliEntry[ifIndex].SsidLen;
		NdisMoveMemory(&(JoinReq.Ssid), pAd->ApCliTab.ApCliEntry[ifIndex].Ssid, 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]);
	StaMlmeEnqueue(pAd, STA_SYNC_STATE_MACHINE, STA_MT2_MLME_PROBE_REQ,
		sizeof(MLME_JOIN_REQ_STRUCT), &JoinReq, ifIndex);

	return;
}

/* 
    ==========================================================================
    Description:
        APCLI MLME Probe Rsp state machine procedure
    ==========================================================================
 */
VOID StaCtrlProbeRspAction(
	IN PRTMP_ADAPTER pAd, 
	IN MLME_QUEUE_ELEM *Elem,
	OUT PULONG pCurrState,
	IN USHORT ifIndex)
{
	STA_CTRL_MSG_STRUCT *Info = (STA_CTRL_MSG_STRUCT *)(Elem->Msg);
	USHORT Status = Info->Status;

	MLME_AUTH_REQ_STRUCT AuthReq;

	if (Status == MLME_SUCCESS)
	{
		DBGPRINT(RT_DEBUG_TRACE, "(%s) Probe respond success.\n", __FUNCTION__);
			COPY_MAC_ADDR(pAd->ApCliTab.ApCliEntry[ifIndex].ApCliBssid, pAd->MlmeAux.Bssid);

			pAd->ApCliTab.ApCliEntry[ifIndex].SsidLen = pAd->MlmeAux.SsidLen;
			NdisMoveMemory(pAd->ApCliTab.ApCliEntry[ifIndex].Ssid, pAd->MlmeAux.Ssid, pAd->ApCliTab.ApCliEntry[ifIndex].SsidLen);

		// Store RSN_IE got from AP's Beacon or Probe rsp
		if (pAd->MlmeAux.VarIELen != 0)
		{
			DBGPRINT(RT_DEBUG_TRACE, "(%s) Store RSN_IE got from AP's Beacon or Probe rsp \n", __FUNCTION__);
			NdisMoveMemory(pAd->ApCliTab.ApCliEntry[ifIndex].RSN_IE, pAd->MlmeAux.VarIEs, pAd->MlmeAux.VarIELen);
			pAd->ApCliTab.ApCliEntry[ifIndex].RSN_IELen = pAd->MlmeAux.VarIELen;
		}
		else
			pAd->ApCliTab.ApCliEntry[ifIndex].RSN_IELen = 0;

		DBGPRINT(RT_DEBUG_TRACE, "(%s) Apcli-Interface Ssid=%s.\n", __FUNCTION__, pAd->ApCliTab.ApCliEntry[ifIndex].Ssid);
		DBGPRINT(RT_DEBUG_TRACE, "(%s) Apcli-Interface Bssid=%02x:%02x:%02x:%02x:%02x:%02x.\n",
			__FUNCTION__,
			pAd->ApCliTab.ApCliEntry[ifIndex].ApCliBssid[0],
			pAd->ApCliTab.ApCliEntry[ifIndex].ApCliBssid[1],
			pAd->ApCliTab.ApCliEntry[ifIndex].ApCliBssid[2],
			pAd->ApCliTab.ApCliEntry[ifIndex].ApCliBssid[3],
			pAd->ApCliTab.ApCliEntry[ifIndex].ApCliBssid[4],
			pAd->ApCliTab.ApCliEntry[ifIndex].ApCliBssid[5]);

		*pCurrState = STA_CTRL_AUTH;

		pAd->ApCliTab.ApCliEntry[ifIndex].AuthReqCnt = 0;

		COPY_MAC_ADDR(AuthReq.Addr, pAd->ApCliTab.ApCliEntry[ifIndex].ApCliBssid);

		// start Authentication Req.		
		// If AuthMode is Auto, try shared key first
		if ((pAd->PortCfg.MBSSID[MAIN_MBSSID].AuthMode == Ndis802_11AuthModeShared) ||
				(pAd->PortCfg.MBSSID[MAIN_MBSSID].AuthMode == Ndis802_11AuthModeAutoSwitch))
		{		
			AuthReq.Alg = Ndis802_11AuthModeShared;
		}
		else
		{
			AuthReq.Alg = Ndis802_11AuthModeOpen;
		}

		AuthReq.Timeout = AUTH_TIMEOUT;
		StaMlmeEnqueue(pAd, STA_AUTH_STATE_MACHINE, STA_MT2_MLME_AUTH_REQ,
			sizeof(MLME_AUTH_REQ_STRUCT), &AuthReq, ifIndex);
	} else
	{
		DBGPRINT(RT_DEBUG_TRACE, "(%s) Probe respond fail.\n", __FUNCTION__);
		*pCurrState = STA_CTRL_DISCONNECTED;
	}

	return;
}

/* 
    ==========================================================================
    Description:
        APCLI MLME AUTH Rsp state machine procedure
    ==========================================================================
 */
VOID StaCtrlAuthRspAction(
	IN PRTMP_ADAPTER pAd, 
	IN MLME_QUEUE_ELEM *Elem,
	OUT PULONG pCurrState,
	IN USHORT ifIndex)
{
	STA_CTRL_MSG_STRUCT *Info = (STA_CTRL_MSG_STRUCT *)(Elem->Msg);
	USHORT Status = Info->Status;
	MLME_ASSOC_REQ_STRUCT  AssocReq;
	MLME_AUTH_REQ_STRUCT AuthReq;

	if(Status == MLME_SUCCESS)
	{
		DBGPRINT(RT_DEBUG_TRACE, "(%s) Auth Rsp Success.\n", __FUNCTION__);
		*pCurrState = STA_CTRL_ASSOC;

		pAd->ApCliTab.ApCliEntry[ifIndex].AssocReqCnt = 0;

		AssocParmFill(pAd, &AssocReq, pAd->MlmeAux.Bssid, pAd->MlmeAux.CapabilityInfo,
			ASSOC_TIMEOUT, /*pAd->PortCfg.DefaultListenCount*/5);
		StaMlmeEnqueue(pAd, STA_ASSOC_STATE_MACHINE, STA_MT2_MLME_ASSOC_REQ, 
			sizeof(MLME_ASSOC_REQ_STRUCT), &AssocReq, ifIndex);
	} else
	{
		if (pAd->PortCfg.MBSSID[MAIN_MBSSID].AuthMode == Ndis802_11AuthModeAutoSwitch)
		{
			DBGPRINT(RT_DEBUG_TRACE, "(%s) Auth Rsp Failure.\n", __FUNCTION__);

			*pCurrState = STA_CTRL_AUTH_2;

			// start Second Authentication Req.
			DBGPRINT(RT_DEBUG_TRACE, "(%s) Start Second Auth Rep.\n", __FUNCTION__);
			COPY_MAC_ADDR(AuthReq.Addr, pAd->ApCliTab.ApCliEntry[ifIndex].ApCliBssid);
			AuthReq.Alg = Ndis802_11AuthModeOpen;
			AuthReq.Timeout = AUTH_TIMEOUT;
			StaMlmeEnqueue(pAd, STA_AUTH_STATE_MACHINE, STA_MT2_MLME_AUTH_REQ,
			sizeof(MLME_AUTH_REQ_STRUCT), &AuthReq, ifIndex);
		} else
		{
			NdisZeroMemory(pAd->MlmeAux.Bssid, MAC_ADDR_LEN);
			NdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID);
			pAd->ApCliTab.ApCliEntry[ifIndex].AuthReqCnt = 0;
			*pCurrState = STA_CTRL_DISCONNECTED;
		}
	}

	return;
}

/* 
    ==========================================================================
    Description:
        APCLI MLME AUTH2 Rsp state machine procedure
    ==========================================================================
 */
VOID StaCtrlAuth2RspAction(
	IN PRTMP_ADAPTER pAd, 
	IN MLME_QUEUE_ELEM *Elem,
	OUT PULONG pCurrState,
	IN USHORT ifIndex)
{
	STA_CTRL_MSG_STRUCT *Info = (STA_CTRL_MSG_STRUCT *)(Elem->Msg);
	USHORT Status = Info->Status;
	MLME_ASSOC_REQ_STRUCT  AssocReq;

	if(Status == MLME_SUCCESS)
	{
		DBGPRINT(RT_DEBUG_TRACE, "(%s) Auth2 Rsp Success.\n", __FUNCTION__);
		*pCurrState = STA_CTRL_ASSOC;

		pAd->ApCliTab.ApCliEntry[ifIndex].AssocReqCnt = 0;

		AssocParmFill(pAd, &AssocReq, pAd->MlmeAux.Bssid, pAd->MlmeAux.CapabilityInfo,
			ASSOC_TIMEOUT, /*pAd->PortCfg.DefaultListenCount*/5);
		StaMlmeEnqueue(pAd, STA_ASSOC_STATE_MACHINE, STA_MT2_MLME_ASSOC_REQ, 
			sizeof(MLME_ASSOC_REQ_STRUCT), &AssocReq, ifIndex);
	} else
	{
		DBGPRINT(RT_DEBUG_TRACE, "(%s) Sta Auth Rsp Failure.\n", __FUNCTION__);

		*pCurrState = STA_CTRL_DISCONNECTED;
	}

	return;
}

/* 
    ==========================================================================

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?