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

📄 sync.c

📁 r73模块的无线网卡在Linux下的驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
        if (ScanType == FAST_SCAN_ACTIVE)        {			RTMPSetTimer(pAd, &pAd->MlmeAux.ScanTimer, FAST_ACTIVE_SCAN_TIME);        }        else // must be SCAN_PASSIVE or SCAN_ACTIVE        {        	if (pAd->PortCfg.PhyMode == PHY_11ABG_MIXED)				RTMPSetTimer(pAd, &pAd->MlmeAux.ScanTimer, MIN_CHANNEL_TIME);			else			    RTMPSetTimer(pAd, &pAd->MlmeAux.ScanTimer, MAX_CHANNEL_TIME);        }	if ((pAd->MlmeAux.Channel == 34) || (pAd->MlmeAux.Channel == 38) ||	    (pAd->MlmeAux.Channel == 42) || (pAd->MlmeAux.Channel == 46))	{			ScanType = SCAN_PASSIVE;	}        if ((ScanType == SCAN_ACTIVE) || (ScanType == FAST_SCAN_ACTIVE))        {            NStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer);  //Get an unused nonpaged memory            if (NStatus != NDIS_STATUS_SUCCESS)            {    	        DBGPRINT(RT_DEBUG_TRACE, "SYNC - ScanNextChannel() allocate memory fail\n");        	    pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;        	    Status = MLME_FAIL_NO_RESOURCE;                MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status);	            return;    	    }    		// There is no need to send broadcast probe request if active scan is in effect.            SsidLen = pAd->MlmeAux.SsidLen;   	if (pAd->MlmeAux.Channel <= 14)	{		// B&G band use 1,2,5.5,11		pSupRate = pAd->PortCfg.SupRate;		SupRateLen = pAd->PortCfg.SupRateLen;		pExtRate = pAd->PortCfg.ExtRate;		ExtRateLen = pAd->PortCfg.ExtRateLen;	}	else    // A band use OFDM rate	{		//		// Overwrite Support Rate, CCK rate are not allowed		//		pSupRate = ASupRate;		SupRateLen = ASupRateLen;		ExtRateLen = 0;	}    	    MgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0, BROADCAST_ADDR, BROADCAST_ADDR);            MakeOutgoingFrame(pOutBuffer,               &FrameLen,                              sizeof(HEADER_802_11),    &Hdr80211,                              1,                        &SsidIe,                              1,                        &SsidLen,                              SsidLen,			pAd->MlmeAux.Ssid,                              1,                        &SupRateIe,                              1,                        &SupRateLen,	                      SupRateLen,  		pSupRate,                              END_OF_ARGS);            if (ExtRateLen)            {                ULONG Tmp;            	MakeOutgoingFrame(pOutBuffer + FrameLen,        &Tmp,                                  1,                            &ExtRateIe,                                  1,                            &ExtRateLen,                                  ExtRateLen,      		pExtRate,                                  END_OF_ARGS);            	FrameLen += Tmp;            }            // add Simple Config Information Element            if (pAd->PortCfg.bWscCapable && pAd->PortCfg.WscIEProbeReq.ValueLen)            {                ULONG WscTmpLen = 0;                MakeOutgoingFrame(pOutBuffer+FrameLen,                      &WscTmpLen,                                  pAd->PortCfg.WscIEProbeReq.ValueLen,      pAd->PortCfg.WscIEProbeReq.Value,                                  END_OF_ARGS);                FrameLen += WscTmpLen;            }            if (pAd->PortCfg.bGetAPConfig)            {                UCHAR RalinkSpecificIEForGetCfg[6] = {IE_VENDOR_SPECIFIC, 4, 0x00, 0x0c, 0x43, 0x80};                ULONG Tmp = 0;                MakeOutgoingFrame(pOutBuffer + FrameLen,        &Tmp,                                  6,                            RalinkSpecificIEForGetCfg,                                  END_OF_ARGS);                FrameLen += Tmp;            }            MiniportMMRequest(pAd, pOutBuffer, FrameLen);            DBGPRINT(RT_DEBUG_INFO, "SYNC - send ProbeReq @ channel=%d, Len=%d\n", pAd->MlmeAux.Channel, FrameLen);        }		// For SCAN_CISCO_PASSIVE, do nothing and silently wait for beacon or other probe reponse        pAd->Mlme.SyncMachine.CurrState = SCAN_LISTEN;    }}/*    ==========================================================================    Description:    ========================================================================== */VOID InvalidStateWhenScan(    IN PRTMP_ADAPTER pAd,    IN MLME_QUEUE_ELEM *Elem){    USHORT  Status;    DBGPRINT(RT_DEBUG_TRACE, "AYNC - InvalidStateWhenScan(state=%d). Reset SYNC machine\n", pAd->Mlme.SyncMachine.CurrState);    pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;    Status = MLME_STATE_MACHINE_REJECT;    MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status);}/*    ==========================================================================    Description:    ========================================================================== */VOID InvalidStateWhenJoin(    IN PRTMP_ADAPTER pAd,    IN MLME_QUEUE_ELEM *Elem){    USHORT  Status;    DBGPRINT(RT_DEBUG_TRACE, "AYNC - InvalidStateWhenJoin(state=%d). Reset SYNC machine\n", pAd->Mlme.SyncMachine.CurrState);    pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;    Status = MLME_STATE_MACHINE_REJECT;    MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_JOIN_CONF, 2, &Status);}/*    ==========================================================================    Description:    ========================================================================== */VOID InvalidStateWhenStart(    IN PRTMP_ADAPTER pAd,    IN MLME_QUEUE_ELEM *Elem){    USHORT  Status;    DBGPRINT(RT_DEBUG_TRACE, "AYNC - InvalidStateWhenStart(state=%d). Reset SYNC machine\n", pAd->Mlme.SyncMachine.CurrState);    pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;    Status = MLME_STATE_MACHINE_REJECT;    MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_START_CONF, 2, &Status);}/*    ==========================================================================    Description:    ========================================================================== */VOID EnqueuePsPoll(    IN PRTMP_ADAPTER pAd){    DBGPRINT(RT_DEBUG_TRACE, "SYNC - send PsPoll ...\n");    MiniportMMRequest(pAd, (PUCHAR)&pAd->PsPollFrame, sizeof(PSPOLL_FRAME));}// 2003-04-17 john// driver force send out a BEACON frame to cover ADHOC mode BEACON starving issue// that is, in ADHOC mode, driver guarantee itself can send out at least a BEACON// per a specified duration, even the peer's clock is faster than us and win all the// hardware-based BEACON TX oppertunity.// we may remove this software feature once 2560 IC fix this problem in ASIC.VOID EnqueueBeaconFrame(    IN PRTMP_ADAPTER pAd){    PTXD_STRUC		pTxD;#ifdef BIG_ENDIAN    PTXD_STRUC      pDestTxD;    TXD_STRUC       TxD;#endif    PCHAR           pBeaconFrame = pAd->BeaconBuf;    PUCHAR			pOutBuffer = NULL;    NDIS_STATUS		NStatus;#ifndef BIG_ENDIAN	pTxD = &pAd->BeaconTxD;#else    pDestTxD  = &pAd->BeaconTxD;    TxD = *pDestTxD;    pTxD = &TxD;    RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD);#endif    DBGPRINT(RT_DEBUG_TRACE, "SYNC - driver sent BEACON (len=%d)...\n",pTxD->DataByteCnt);    NStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer);  //Get an unused nonpaged memory	if (NStatus != NDIS_STATUS_SUCCESS)	{		DBGPRINT(RT_DEBUG_TRACE, "EnqueueBeaconFrame allocate memory fail\n");		return;	}	// Preserve eight byte TSF little endian byte order - bb    RTUSBMultiRead(pAd, TXRX_CSR12,				pBeaconFrame + sizeof(HEADER_802_11), TIMESTAMP_LEN);	memcpy(pOutBuffer, pBeaconFrame, 256);	MiniportMMRequest(pAd, pOutBuffer, pTxD->DataByteCnt);#ifdef BIG_ENDIAN    RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD);    WriteBackToDescriptor((PUCHAR)pDestTxD, (PUCHAR)pTxD, FALSE, TYPE_TXD);#endif}/*    ==========================================================================    Description:    ========================================================================== */VOID EnqueueProbeRequest(    IN PRTMP_ADAPTER pAd){    PUCHAR          pOutBuffer;    ULONG           FrameLen = 0;    HEADER_802_11   Hdr80211;    USHORT          NStatus;    DBGPRINT(RT_DEBUG_TRACE, "force out a ProbeRequest ...\n");    NStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer);  //Get an unused nonpaged memory    if (NStatus != NDIS_STATUS_SUCCESS)    {        DBGPRINT(RT_DEBUG_TRACE, "EnqueueProbeRequest() allocate memory fail\n");        return;    }    else    {        MgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0, BROADCAST_ADDR, BROADCAST_ADDR);		// this ProbeRequest explicitly specify SSID to reduce unwanted ProbeResponse        MakeOutgoingFrame(pOutBuffer,                     &FrameLen,                          sizeof(HEADER_802_11),          &Hdr80211,                          1,                              &SsidIe,                          1,                              &pAd->PortCfg.SsidLen,                          pAd->PortCfg.SsidLen,		      pAd->PortCfg.Ssid,                          1,                              &SupRateIe,                          1,                              &pAd->ActiveCfg.SupRateLen,                          pAd->ActiveCfg.SupRateLen,      pAd->ActiveCfg.SupRate,                          END_OF_ARGS);        // add Simple Config Information Element        if (pAd->PortCfg.bWscCapable && pAd->PortCfg.WscIEProbeReq.ValueLen)        {            ULONG WscTmpLen = 0;            MakeOutgoingFrame(pOutBuffer+FrameLen,                   &WscTmpLen,        		              pAd->PortCfg.WscIEProbeReq.ValueLen,   pAd->PortCfg.WscIEProbeReq.Value,                              END_OF_ARGS);            FrameLen += WscTmpLen;        }	    if (pAd->PortCfg.bGetAPConfig)	    {	 	    UCHAR RalinkSpecificIEForGetCfg[6] = {IE_VENDOR_SPECIFIC, 4, 0x00, 0x0c, 0x43, 0x80};		    ULONG Tmp = 0;		    MakeOutgoingFrame(pOutBuffer + FrameLen,        &Tmp,			                  6,                            RalinkSpecificIEForGetCfg,			                  END_OF_ARGS);		FrameLen += Tmp;	    }        MiniportMMRequest(pAd, pOutBuffer, FrameLen);    }}/*    ==========================================================================    Description:        Update PortCfg->ChannelList[] according to 1) Country Region 2) RF IC type,        and 3) PHY-mode user selected.        The outcome is used by driver when doing site survey.    ========================================================================== */VOID BuildChannelList(	IN PRTMP_ADAPTER pAd){    UCHAR i, j, index=0, num=0;    PUCHAR	pChannelList=NULL;    memset(pAd->ChannelList, 0, MAX_NUM_OF_CHANNELS * sizeof(CHANNEL_TX_POWER));    // if not 11a-only mode, channel list starts from 2.4Ghz band    if (pAd->PortCfg.PhyMode != PHY_11A)    {        switch (pAd->PortCfg.CountryRegion & 0x7f)        {            case REGION_0_BG_BAND:	// 1 -11                memcpy(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_0_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_0_SIZE);                index += BG_BAND_REGION_0_SIZE;                break;            case REGION_1_BG_BAND:	// 1 - 13                memcpy(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_1_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_1_SIZE);                index += BG_BAND_REGION_1_SIZE;                break;            case REGION_2_BG_BAND:	// 10 - 11                memcpy(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_2_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_2_SIZE);                index += BG_BAND_REGION_2_SIZE;                break;            case REGION_3_BG_BAND:	// 10 - 13                memcpy(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_3_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_3_SIZE);                index += BG_BAND_REGION_3_SIZE;                break;            case REGION_4_BG_BAND:	// 14                memcpy(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_4_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_4_SIZE);                index += BG_BAND_REGION_4_SIZE;                break;            case REGION_5_BG_BAND:	// 1 - 14                memcpy(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_5_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_5_SIZE);                index += BG_BAND_REGION_5_SIZE;                break;            case REGION_6_BG_BAND:	// 3 - 9                memcpy(

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -