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

📄 sync.c

📁 r73模块的无线网卡在Linux下的驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
/*************************************************************************** * 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 + -