📄 sync.c
字号:
/*
***************************************************************************
* Ralink Tech Inc.
* 4F, No. 2 Technology 5th Rd.
* Science-based Industrial Park
* Hsin-chu, Taiwan, R.O.C.
*
* (c) Copyright 2002-2004, Ralink Technology, Inc.
*
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
************************************************************************
Module Name:
sync.c
Abstract:
Revision History:
Who When What
-------- ---------- ----------------------------------------------
Name Date Modification logs
Jan Lee 2005-06-01 Release
*/
#include "rt_config.h"
// 2.4 Ghz channel plan
UCHAR Ra24Ghz_FCC[] = {1,2,3,4,5,6,7,8,9,10,11};
UCHAR Ra24Ghz_IC[] = {1,2,3,4,5,6,7,8,9,10,11};
UCHAR Ra24Ghz_ESTI[]= {1,2,3,4,5,6,7,8,9,10,11,12,13};
UCHAR Ra24Ghz_SPAIN[] = {10,11};
UCHAR Ra24Ghz_FRANCE[] = {10,11,12,13};
UCHAR Ra24Ghz_MKK[] = {14};
UCHAR Ra24Ghz_MKK1[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14};
UCHAR Ra24Ghz_ISRAEL[] = {3,4,5,6,7,8,9};
// 5 Ghz channel plan
UCHAR Ra5Ghz_UNII[] = {36,40,44,48,52,56,60,64, 149,153,157,161};
UCHAR Ra5Ghz_MMAC[] = {34,38,42,46};
UCHAR Ra5Ghz_HyperLAN2[] = {36,40,44,48,52,56,60,64, 100,104,108,112,116,120,124,128,132,136,140};
extern UCHAR CipherSuiteWpaNoneTkip[];
extern UCHAR CipherSuiteWpaNoneTkipLen;
extern UCHAR CipherSuiteWpaNoneAes[];
extern UCHAR CipherSuiteWpaNoneAesLen;
/*
==========================================================================
Description:
The sync state machine,
Parameters:
Sm - pointer to the state machine
Note:
the state machine looks like the following
Column 1-2
SYNC_IDLE JOIN_WAIT_BEACON
MT2_MLME_SCAN_REQ mlme_scan_req_action invalid_state_when_scan
MT2_MLME_JOIN_REQ mlme_join_req_action invalid_state_when_join
MT2_MLME_START_REQ mlme_start_req_action invalid_state_when_start
MT2_PEER_BEACON peer_beacon peer_beacon_at_join_wait_beacon_action
MT2_PEER_PROBE_RSP peer_beacon drop
MT2_PEER_ATIM drop drop
MT2_SCAN_TIMEOUT Drop Drop
MT2_BEACON_TIMEOUT Drop beacon_timeout_at_join_wait_beacon_action
MT2_ATIM_TIMEOUT Drop Drop
MT2_PEER_PROBE_REQ ???? drop
column 3
SCAN_LISTEN
MT2_MLME_SCAN_REQ invalid_state_when_scan
MT2_MLME_JOIN_REQ invalid_state_when_join
MT2_MLME_START_REQ invalid_state_when_start
MT2_PEER_BEACON peer_beacon_at_scan_action
MT2_PEER_PROBE_RSP peer_probe_rsp_at_scan_action
MT2_PEER_ATIM drop
MT2_SCAN_TIMEOUT scan_timeout_action
MT2_BEACON_TIMEOUT Drop
MT2_ATIM_TIMEOUT Drop
MT2_PEER_PROBE_REQ drop
==========================================================================
*/
VOID SyncStateMachineInit(
IN PRT2570ADAPTER pAd,
IN STATE_MACHINE *Sm,
OUT STATE_MACHINE_FUNC Trans[])
{
StateMachineInit(Sm, Trans, MAX_SYNC_STATE, MAX_SYNC_MSG, (STATE_MACHINE_FUNC)Drop, SYNC_IDLE, SYNC_MACHINE_BASE);
// column 1
StateMachineSetAction(Sm, SYNC_IDLE, MT2_MLME_SCAN_REQ, (STATE_MACHINE_FUNC)MlmeScanReqAction);
StateMachineSetAction(Sm, SYNC_IDLE, MT2_MLME_JOIN_REQ, (STATE_MACHINE_FUNC)MlmeJoinReqAction);
StateMachineSetAction(Sm, SYNC_IDLE, MT2_MLME_START_REQ, (STATE_MACHINE_FUNC)MlmeStartReqAction);
StateMachineSetAction(Sm, SYNC_IDLE, MT2_PEER_BEACON, (STATE_MACHINE_FUNC)PeerBeacon);
// StateMachineSetAction(Sm, SYNC_IDLE, MT2_PEER_PROBE_RSP, PeerBeacon);
StateMachineSetAction(Sm, SYNC_IDLE, MT2_PEER_PROBE_REQ, (STATE_MACHINE_FUNC)PeerProbeReqAction);
//column 2
StateMachineSetAction(Sm, JOIN_WAIT_BEACON, MT2_MLME_SCAN_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenScan);
StateMachineSetAction(Sm, JOIN_WAIT_BEACON, MT2_MLME_JOIN_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenJoin);
StateMachineSetAction(Sm, JOIN_WAIT_BEACON, MT2_MLME_START_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenStart);
StateMachineSetAction(Sm, JOIN_WAIT_BEACON, MT2_PEER_BEACON, (STATE_MACHINE_FUNC)PeerBeaconAtJoinAction);
StateMachineSetAction(Sm, JOIN_WAIT_BEACON, MT2_BEACON_TIMEOUT, (STATE_MACHINE_FUNC)BeaconTimeoutAtJoinAction);
// column 3
StateMachineSetAction(Sm, SCAN_LISTEN, MT2_MLME_SCAN_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenScan);
StateMachineSetAction(Sm, SCAN_LISTEN, MT2_MLME_JOIN_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenJoin);
StateMachineSetAction(Sm, SCAN_LISTEN, MT2_MLME_START_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenStart);
StateMachineSetAction(Sm, SCAN_LISTEN, MT2_PEER_BEACON, (STATE_MACHINE_FUNC)PeerBeaconAtScanAction);
StateMachineSetAction(Sm, SCAN_LISTEN, MT2_PEER_PROBE_RSP, (STATE_MACHINE_FUNC)PeerBeaconAtScanAction);
StateMachineSetAction(Sm, SCAN_LISTEN, MT2_SCAN_TIMEOUT, (STATE_MACHINE_FUNC)ScanTimeoutAction);
// timer init
RTMPInitTimer(pAd, &pAd->Mlme.SyncAux.BeaconTimer, &BeaconTimeout);
//pAd->Mlme.SyncAux.BeaconTimer.data = (unsigned long)pAd;
//pAd->Mlme.SyncAux.BeaconTimer.function = &BeaconTimeout;
RTMPInitTimer(pAd, &pAd->Mlme.SyncAux.ScanTimer, &ScanTimeout);
//pAd->Mlme.SyncAux.ScanTimer.data = (unsigned long)pAd;
//pAd->Mlme.SyncAux.ScanTimer.function = &ScanTimeout;
}
/*
==========================================================================
Description:
Becaon timeout handler, executed in timer thread
==========================================================================
*/
VOID BeaconTimeout(
IN unsigned long data)
{
PRT2570ADAPTER pAd = (PRT2570ADAPTER)data;
DBGPRINT(RT_DEBUG_TRACE,"SYNC - BeaconTimeout\n");
// Do nothing if the driver is starting halt state.
// This might happen when timer already been fired before cancel timer with mlmehalt
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS))
return;
MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_BEACON_TIMEOUT, 0, NULL);
RTUSBUp(pAd, &pAd->mlme_semaphore);
}
/*
==========================================================================
Description:
ATIM timeout handler, executed in timer thread
==========================================================================
*/
VOID AtimTimeout(
IN unsigned long data)
{
PRT2570ADAPTER pAd = (PRT2570ADAPTER)data;
DBGPRINT(RT_DEBUG_TRACE,"SYNC - AtimTimeout \n");
MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_ATIM_TIMEOUT, 0, NULL);
RTUSBUp(pAd, &pAd->mlme_semaphore);
}
/*
==========================================================================
Description:
Scan timeout handler, executed in timer thread
==========================================================================
*/
VOID ScanTimeout(
IN unsigned long data)
{
PRT2570ADAPTER pAd = (PRT2570ADAPTER)data;
DBGPRINT(RT_DEBUG_INFO,"SYNC - Scan Timeout \n");
// Do nothing if the driver is starting halt state.
// This might happen when timer already been fired before cancel timer with mlmehalt
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS))
return;
MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_SCAN_TIMEOUT, 0, NULL);
RTUSBUp(pAd, &pAd->mlme_semaphore);
}
/*
==========================================================================
Description:
MLME SCAN req state machine procedure
==========================================================================
*/
VOID MlmeScanReqAction(
IN PRT2570ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem)
{
UCHAR Ssid[MAX_LEN_OF_SSID], SsidLen, ScanType, BssType;
ULONG Now;
DBGPRINT(RT_DEBUG_INFO, "SYNC - MlmeScanReqAction\n");
#if 0
// Check the total scan tries for one single OID command
if (pAd->PortCfg.IgnoredScanNumber >= 3)
{
DBGPRINT(RT_DEBUG_TRACE, "SYNC - MlmeScanReqAction: Too many tries already\n");
pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;
MlmeCntlConfirm(pAd, MT2_SCAN_CONF, MLME_INVALID_FORMAT);
return;
}
#endif
// Increase the scan retry counters.
pAd->PortCfg.IgnoredScanNumber++;
// Suspend MSDU transmission here
RTUSBSuspendMsduTransmission(pAd);
// first check the parameter sanity
if (MlmeScanReqSanity(pAd,
Elem->Msg,
Elem->MsgLen,
&BssType,
Ssid,
&SsidLen,
&ScanType))
{
DBGPRINT(RT_DEBUG_TRACE, "SYNC - MlmeScanReqAction\n");
// temporarily recover BBP from short-distance-low-sensibility mode during SCAN
// for best SCANNING result;
AsicRestoreBbpSensibility(pAd);
Now = jiffies;
pAd->PortCfg.LastScanTime = Now;
// reset all the timers
RTMPCancelTimer(&pAd->Mlme.SyncAux.BeaconTimer);
RTMPCancelTimer(&pAd->Mlme.SyncAux.ScanTimer);
// record desired BSS parameters
pAd->Mlme.SyncAux.BssType = BssType;
pAd->Mlme.SyncAux.ScanType = ScanType;
pAd->Mlme.SyncAux.SsidLen = SsidLen;
NdisMoveMemory(pAd->Mlme.SyncAux.Ssid, Ssid, SsidLen);
// start from the first channel
pAd->Mlme.SyncAux.Channel = FirstChannel(pAd);
ScanNextChannel(pAd);
}
else
{
DBGPRINT(RT_DEBUG_ERROR, "SYNC - MlmeScanReqAction() sanity check fail. BUG!!!\n");
pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;
MlmeCntlConfirm(pAd, MT2_SCAN_CONF, MLME_INVALID_FORMAT);
}
}
/*
==========================================================================
Description:
MLME JOIN req state machine procedure
==========================================================================
*/
VOID MlmeJoinReqAction(
IN PRT2570ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem)
{
BSS_ENTRY *pBss;
MLME_JOIN_REQ_STRUCT *Info = (MLME_JOIN_REQ_STRUCT *)(Elem->Msg);
DBGPRINT(RT_DEBUG_INFO, "SYNC - MlmeJoinReqAction(BSS #%d)\n", Info->BssIdx);
// reset all the timers
RTMPCancelTimer(&pAd->Mlme.SyncAux.ScanTimer);
RTMPCancelTimer(&pAd->Mlme.SyncAux.BeaconTimer);
pBss = &pAd->Mlme.CntlAux.SsidBssTab.BssEntry[Info->BssIdx];
// record the desired SSID & BSSID we're waiting for
COPY_MAC_ADDR(&pAd->Mlme.SyncAux.Bssid, &pBss->Bssid);
NdisMoveMemory(pAd->Mlme.SyncAux.Ssid, pBss->Ssid, pBss->SsidLen);
pAd->Mlme.SyncAux.SsidLen = pBss->SsidLen;
// switch channel and waiting for beacon timer
AsicSwitchChannel(pAd, pBss->Channel);
AsicLockChannel(pAd, pBss->Channel);
DBGPRINT(RT_DEBUG_INFO, "SYNC - Wait BEACON from %02x:%02x:%02x:%02x:%02x:%02x ...\n",
pAd->Mlme.SyncAux.Bssid.Octet[0], pAd->Mlme.SyncAux.Bssid.Octet[1],
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -