📄 sync.c
字号:
/* *************************************************************************** * 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: 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)MlmeJoinReqAction); 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, GET_TIMER_FUNCTION(BeaconTimeout), pAd, FALSE); RTMPInitTimer(pAd, &pAd->MlmeAux.ScanTimer, GET_TIMER_FUNCTION(ScanTimeout), pAd, FALSE); }/* ========================================================================== Description: Becaon timeout handler, executed in timer thread ========================================================================== */VOID BeaconTimeout( IN PVOID SystemSpecific1, IN PVOID FunctionContext, IN PVOID SystemSpecific2, IN PVOID SystemSpecific3){ RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext; 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); RTUSBMlmeUp(pAd);}/* ========================================================================== Description: Scan timeout handler, executed in timer thread ========================================================================== */VOID ScanTimeout( IN PVOID SystemSpecific1, IN PVOID FunctionContext, IN PVOID SystemSpecific2, IN PVOID SystemSpecific3){ RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext; 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); 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+1], SsidLen, ScanType, BssType; ULONG Now; USHORT Status; PHEADER_802_11 pHdr80211; PUCHAR pOutBuffer = NULL; USHORT NStatus; BOOLEAN TimerCancelled; // 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"); AsicDisableSync(pAd); // // 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, QID_AC_BE, 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, &TimerCancelled); RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &TimerCancelled); // record desired BSS parameters pAd->MlmeAux.BssType = BssType; pAd->MlmeAux.ScanType = ScanType; pAd->MlmeAux.SsidLen = SsidLen; NdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID); NdisMoveMemory(pAd->MlmeAux.Ssid, Ssid, SsidLen); pAd->MlmeAux.Ssid[SsidLen]=0; DBGPRINT(RT_DEBUG_INFO, "KH:SYNC - MlmeScanReqAction() SSID[%d]=%s \n",SsidLen,pAd->MlmeAux.Ssid); // 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; BOOLEAN TimerCancelled; 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,&TimerCancelled); RTMPCancelTimer(&pAd->MlmeAux.BeaconTimer,&TimerCancelled); pBss = &pAd->MlmeAux.SsidBssTab.BssEntry[Info->BssIdx]; // record the desired SSID & BSSID we're waiting forDBGPRINT(RT_DEBUG_TRACE,"MlmeJoinReqAction - PortCfg.Ssid[%d]=%s... MlmeAux.Ssid[%d]=%s\n", pAd->PortCfg.SsidLen, pAd->PortCfg.Ssid, pAd->MlmeAux.SsidLen, pAd->MlmeAux.Ssid); COPY_MAC_ADDR(pAd->MlmeAux.Bssid, pBss->Bssid); NdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID); //2007/12/05:KH add to slove hidden SSID problem if(pBss->SsidLen>0&&pBss->Ssid[0]!=0) { NdisMoveMemory(pAd->MlmeAux.Ssid, pBss->Ssid, pBss->SsidLen); pAd->MlmeAux.SsidLen = pBss->SsidLen; } else { if(pAd->PortCfg.SsidLen>0) { NdisMoveMemory(pAd->MlmeAux.Ssid, pAd->PortCfg.Ssid, pAd->PortCfg.SsidLen); pAd->MlmeAux.SsidLen = pAd->PortCfg.SsidLen; } else //Only when the status is LINK DOWN. if(pAd->PortCfg.LastSsidLen>0) { NdisMoveMemory(pAd->MlmeAux.Ssid, pAd->PortCfg.LastSsid, pAd->PortCfg.LastSsidLen); pAd->MlmeAux.SsidLen =pAd->PortCfg.LastSsidLen; } } DBGPRINT(RT_DEBUG_TRACE, "Beacon SSID(NULL)=%d SSID(empty)=%d Len<0=%d station SsidLen(==0)=%d SYNC - SSID[%d]=%s\n",pBss->Ssid==NULL,pBss->Ssid[0]==0,pBss->SsidLen==0,pAd->PortCfg.LastSsidLen==0,pAd->MlmeAux.SsidLen,pAd->MlmeAux.Ssid); 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->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],
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -