⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sync.c

📁 TP Link 321 Linux Driver
💻 C
📖 第 1 页 / 共 5 页
字号:
/* *************************************************************************** * 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 + -