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 + -
显示快捷键?