📄 sync.c
字号:
/*************************************************************************** * RT2x00 SourceForge Project - http://rt2x00.sourceforge.net * * * * 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. * * * * Licensed under the GNU GPL * * Original code supplied under license from RaLink Inc, 2004. * ***************************************************************************//*************************************************************************** * 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 planUCHAR 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 planUCHAR 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; if (pAd->PortCfg.BssType == BSS_MONITOR) return; 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; memcpy(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); memcpy(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], pAd->Mlme.SyncAux.Bssid.Octet[2], pAd->Mlme.SyncAux.Bssid.Octet[3], pAd->Mlme.SyncAux.Bssid.Octet[4], pAd->Mlme.SyncAux.Bssid.Octet[5]); pAd->Mlme.SyncAux.BeaconTimer.Timer.expires = JOIN_TIMEOUT; RTMPSetTimer(pAd, &pAd->Mlme.SyncAux.BeaconTimer, JOIN_TIMEOUT); pAd->Mlme.SyncMachine.CurrState = JOIN_WAIT_BEACON;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -