📄 sync.c
字号:
/*************************************************************************** * RT2x00 SourceForge Project - http://rt2x00.serialmonkey.com * * * * 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 * -------- ---------- ----------------------------- * John Chang 2004-09-01 modified for rt2561/2661 * ***************************************************************************/#include "rt_config.h"// 2.4 Ghz channel plan index in the TxPower arrays.#define BG_BAND_REGION_0_START 0 // 1,2,3,4,5,6,7,8,9,10,11#define BG_BAND_REGION_0_SIZE 11#define BG_BAND_REGION_1_START 0 // 1,2,3,4,5,6,7,8,9,10,11,12,13#define BG_BAND_REGION_1_SIZE 13#define BG_BAND_REGION_2_START 9 // 10,11#define BG_BAND_REGION_2_SIZE 2#define BG_BAND_REGION_3_START 9 // 10,11,12,13#define BG_BAND_REGION_3_SIZE 4#define BG_BAND_REGION_4_START 13 // 14#define BG_BAND_REGION_4_SIZE 1#define BG_BAND_REGION_5_START 0 // 1,2,3,4,5,6,7,8,9,10,11,12,13,14#define BG_BAND_REGION_5_SIZE 14#define BG_BAND_REGION_6_START 2 // 3,4,5,6,7,8,9#define BG_BAND_REGION_6_SIZE 7#define BG_BAND_REGION_7_START 4 // 5,6,7,8,9,10,11,12,13#define BG_BAND_REGION_7_SIZE 9// 5 Ghz channel plan index in the TxPower arrays.UCHAR A_BAND_REGION_0_CHANNEL_LIST[]={36, 40, 44, 48, 52, 56, 60, 64, 149, 153, 157, 161, 165};UCHAR A_BAND_REGION_1_CHANNEL_LIST[]={36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140};UCHAR A_BAND_REGION_2_CHANNEL_LIST[]={36, 40, 44, 48, 52, 56, 60, 64};UCHAR A_BAND_REGION_3_CHANNEL_LIST[]={52, 56, 60, 64, 149, 153, 157, 161};UCHAR A_BAND_REGION_4_CHANNEL_LIST[]={149, 153, 157, 161, 165};UCHAR A_BAND_REGION_5_CHANNEL_LIST[]={149, 153, 157, 161};UCHAR A_BAND_REGION_6_CHANNEL_LIST[]={36, 40, 44, 48};UCHAR A_BAND_REGION_7_CHANNEL_LIST[]={36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165};UCHAR A_BAND_REGION_8_CHANNEL_LIST[]={52, 56, 60, 64};UCHAR A_BAND_REGION_9_CHANNEL_LIST[]={34, 38, 42, 46};UCHAR A_BAND_REGION_10_CHANNEL_LIST[]={34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64};/* ========================================================================== 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 PRTMP_ADAPTER pAd, IN STATE_MACHINE *Sm, OUT STATE_MACHINE_FUNC Trans[]){ StateMachineInit(Sm, (STATE_MACHINE_FUNC*)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_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->MlmeAux.BeaconTimer, &BeaconTimeout); RTMPInitTimer(pAd, &pAd->MlmeAux.ScanTimer, &ScanTimeout);}/* ========================================================================== Description: Becaon timeout handler, executed in timer thread ========================================================================== */VOID BeaconTimeout( IN unsigned long data){ RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)data; DBGPRINT(RT_DEBUG_TRACE,"SYNC - BeaconTimeout\n"); MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_BEACON_TIMEOUT, 0, NULL); RTUSBMlmeUp(pAd);}/* ========================================================================== Description: Scan timeout handler, executed in timer thread ========================================================================== */VOID ScanTimeout( IN unsigned long data){ RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)data; DBGPRINT(RT_DEBUG_INFO,"SYNC - Scan Timeout \n"); MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_SCAN_TIMEOUT, 0, NULL); RTUSBMlmeUp(pAd);}/* ========================================================================== Description: MLME SCAN req state machine procedure ========================================================================== */VOID MlmeScanReqAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem){ UCHAR Ssid[MAX_LEN_OF_SSID], SsidLen, ScanType, BssType; ULONG Now; USHORT Status; PHEADER_802_11 pHdr80211; PUCHAR pOutBuffer = NULL; USHORT NStatus; // Increase the scan retry counters. pAd->PortCfg.ScanCnt++; // 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"); // // To prevent data lost. // Send an NULL data with turned PSM bit on to current associated AP before SCAN progress. // And should send an NULL data with turned PSM bit off to AP, when scan progress done // if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && (INFRA_ON(pAd))) { NStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer); //Get an unused nonpaged memory if (NStatus == NDIS_STATUS_SUCCESS) { pHdr80211 = (PHEADER_802_11) pOutBuffer; MgtMacHeaderInit(pAd, pHdr80211, SUBTYPE_NULL_FUNC, 1, pAd->PortCfg.Bssid, pAd->PortCfg.Bssid); pHdr80211->Duration = 0; pHdr80211->FC.Type = BTYPE_DATA; pHdr80211->FC.PwrMgmt = PWR_SAVE; // Send using priority queue MiniportMMRequest(pAd, pOutBuffer, sizeof(HEADER_802_11)); DBGPRINT(RT_DEBUG_TRACE, "MlmeScanReqAction -- Send PSM Data frame for off channel RM\n"); RTMPusecDelay(5000); } } Now = jiffies; pAd->PortCfg.LastScanTime = Now; RTMPCancelTimer(&pAd->MlmeAux.BeaconTimer); RTMPCancelTimer(&pAd->MlmeAux.ScanTimer); // record desired BSS parameters pAd->MlmeAux.BssType = BssType; pAd->MlmeAux.ScanType = ScanType; pAd->MlmeAux.SsidLen = SsidLen; memcpy(pAd->MlmeAux.Ssid, Ssid, SsidLen); // start from the first channel pAd->MlmeAux.Channel = FirstChannel(pAd); ScanNextChannel(pAd); } else { DBGPRINT(RT_DEBUG_ERROR, "SYNC - MlmeScanReqAction() sanity check fail. BUG!!!\n"); pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE; Status = MLME_INVALID_FORMAT; MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status); }}/* ========================================================================== Description: MLME JOIN req state machine procedure ========================================================================== */VOID MlmeJoinReqAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem){ BSS_ENTRY *pBss; MLME_JOIN_REQ_STRUCT *Info = (MLME_JOIN_REQ_STRUCT *)(Elem->Msg); DBGPRINT(RT_DEBUG_TRACE, "SYNC - MlmeJoinReqAction(BSS #%d)\n", Info->BssIdx); // reset all the timers RTMPCancelTimer(&pAd->MlmeAux.ScanTimer); RTMPCancelTimer(&pAd->MlmeAux.BeaconTimer); pBss = &pAd->MlmeAux.SsidBssTab.BssEntry[Info->BssIdx]; // record the desired SSID & BSSID we're waiting for COPY_MAC_ADDR(pAd->MlmeAux.Bssid, pBss->Bssid); memcpy(pAd->MlmeAux.Ssid, pBss->Ssid, pBss->SsidLen); pAd->MlmeAux.SsidLen = pBss->SsidLen; pAd->MlmeAux.BssType = pBss->BssType; pAd->MlmeAux.Channel = pBss->Channel; // switch channel and waiting for beacon timer AsicSwitchChannel(pAd, pAd->MlmeAux.Channel); AsicLockChannel(pAd, pAd->MlmeAux.Channel); RTMPSetTimer(pAd, &pAd->MlmeAux.BeaconTimer, JOIN_TIMEOUT); DBGPRINT(RT_DEBUG_TRACE, "SYNC - Switch to channel %d, SSID %s \n", pAd->MlmeAux.Channel, pAd->MlmeAux.Ssid); DBGPRINT(RT_DEBUG_TRACE, "SYNC - Wait BEACON from %02x:%02x:%02x:%02x:%02x:%02x ...\n", pAd->MlmeAux.Bssid[0], pAd->MlmeAux.Bssid[1], pAd->MlmeAux.Bssid[2], pAd->MlmeAux.Bssid[3], pAd->MlmeAux.Bssid[4], pAd->MlmeAux.Bssid[5]); pAd->Mlme.SyncMachine.CurrState = JOIN_WAIT_BEACON;}/* ========================================================================== Description: MLME START Request state machine procedure, starting an IBSS ========================================================================== */VOID MlmeStartReqAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem){ UCHAR Ssid[MAX_LEN_OF_SSID], SsidLen; USHORT Status; // New for WPA security suites UCHAR VarIE[MAX_VIE_LEN]; // Total VIE length = MAX_VIE_LEN - -5 NDIS_802_11_VARIABLE_IEs *pVIE = NULL; LARGE_INTEGER TimeStamp; BOOLEAN Privacy;#ifdef SINGLE_ADHOC_LINKUP ULONG Bssidx; CF_PARM CfParm; CfParm.bValid = FALSE;#endif // Init Variable IE structure pVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE; pVIE->Length = 0; TimeStamp.vv.LowPart = 0; TimeStamp.vv.HighPart = 0; if (MlmeStartReqSanity(pAd, Elem->Msg, Elem->MsgLen, Ssid, &SsidLen)) { // reset all the timers RTMPCancelTimer(&pAd->MlmeAux.ScanTimer); RTMPCancelTimer(&pAd->MlmeAux.BeaconTimer); //
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -