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

📄 sync.c

📁 r73模块的无线网卡在Linux下的驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
//				UCHAR FreeNumber;				//	1. AP has backlogged unicast-to-me frame, stay AWAKE, send PSPOLL				//	2. AP has backlogged broadcast/multicast frame and we want those frames, stay AWAKE				//	3. we have outgoing frames in TxRing or MgmtRing, better stay AWAKE				//	4. Psm change to PWR_SAVE, but AP not been informed yet, we better stay AWAKE				//	5. otherwise, put PHY back to sleep to save battery.				if (MessageToMe)				{					DBGPRINT(RT_DEBUG_TRACE, "SYNC - AP backlog unicast-to-me, stay AWAKE, send PSPOLL\n");					EnqueuePsPoll(pAd);				}				else if (BcastFlag && (DtimCount == 0) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM))				{					DBGPRINT(RT_DEBUG_TRACE, "SYNC - AP backlog broadcast/multicast, stay AWAKE\n");				}#if 0				else if ((RTUSBFreeTXDRequest(pAd, QID_AC_BE, TX_RING_SIZE, &FreeNumber) != NDIS_STATUS_SUCCESS)  ||//						 (RTUSBFreeTXDRequest(pAd, QID_AC_BK, TX_RING_SIZE, &FreeNumber) != NDIS_STATUS_SUCCESS)  ||//						 (RTUSBFreeTXDRequest(pAd, QID_AC_VI, TX_RING_SIZE, &FreeNumber) != NDIS_STATUS_SUCCESS)	   ||//						 (RTUSBFreeTXDRequest(pAd, QID_AC_VO, TX_RING_SIZE, &FreeNumber) != NDIS_STATUS_SUCCESS)	   ||						 (RTUSBFreeTXDRequest(pAd, QID_MGMT, MGMT_RING_SIZE, &FreeNumber) != NDIS_STATUS_SUCCESS))				{					// TODO: consider scheduled HCCA. might not be proper to use traditional DTIM-based power-saving scheme					// can we cheat here (i.e. just check MGMT & AC_BE) for better performance?					DBGPRINT(RT_DEBUG_TRACE, "SYNC - outgoing frame in TxRing/MgmtRing, stay AWAKE\n");				}#endif				else				{					USHORT NextDtim = DtimCount;					if (NextDtim == 0)						NextDtim = DtimPeriod;					TbttNumToNextWakeUp = pAd->PortCfg.DefaultListenCount;					if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM) && (TbttNumToNextWakeUp > NextDtim))						TbttNumToNextWakeUp = NextDtim;					DBGPRINT(RT_DEBUG_INFO, "SYNC - PHY sleeps for %d TBTT, Dtim=%d/%d\n", TbttNumToNextWakeUp, DtimCount, DtimPeriod);					AsicSleepThenAutoWakeup(pAd, TbttNumToNextWakeUp);				}			}#ifndef	SINGLE_ADHOC_LINKUP			// At least another peer in this IBSS, declare MediaState as CONNECTED			if (ADHOC_ON(pAd) &&				!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))			{				OPSTATUS_SET_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);				// 2003/03/12 - john				// Make sure this entry in "ScanTab" table, thus complies to Microsoft's policy that				// "site survey" result should always include the current connected network.				//				Bssidx = BssTableSearch(&pAd->ScanTab, Bssid, Channel);				if (Bssidx == BSS_NOT_FOUND)				{					Bssidx = BssTableSetEntry(pAd, &pAd->ScanTab, Bssid, Ssid, SsidLen,								BssType, BeaconPeriod, &CfParm, AtimWin, CapabilityInfo,								SupRate, SupRateLen, ExtRate, ExtRateLen, Channel, RealRssi + pAd->BbpRssiToDbmDelta, TimeStamp, CkipFlag,								&EdcaParm, &QosCapability, &QbssLoad, LenVIE, pVIE);				}			}#endif		}		// not my BSSID, ignore it	}	// sanity check fail, ignore this frame}/*    ==========================================================================    Description:        Receive PROBE REQ from remote peer when operating in IBSS mode    ========================================================================== */VOID PeerProbeReqAction(    IN PRTMP_ADAPTER pAd,    IN MLME_QUEUE_ELEM *Elem){    UCHAR         Addr2[MAC_ADDR_LEN];    CHAR          Ssid[MAX_LEN_OF_SSID];    UCHAR         SsidLen;    HEADER_802_11 ProbeRspHdr;    PUCHAR        pOutBuffer = NULL;    ULONG         FrameLen = 0;    LARGE_INTEGER FakeTimestamp;    UCHAR         DsLen = 1, IbssLen = 2;    UCHAR         LocalErpIe[3] = {IE_ERP, 1, 0};    USHORT        NStatus;    BOOLEAN       Privacy;    USHORT        BeaconPeriod, CapabilityInfo, AtimWin;    if (! ADHOC_ON(pAd))        return;    if (PeerProbeReqSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, Ssid, &SsidLen))    {        if ((SsidLen == 0) || SSID_EQUAL(Ssid, SsidLen, pAd->PortCfg.Ssid, pAd->PortCfg.SsidLen))        {#if 0            CSR15_STRUC Csr15;            // we should respond a ProbeRsp only when we're the last BEACON transmitter            // in this ADHOC network.            RTMP_IO_READ32(pAd, CSR15, &Csr15.word);            if (Csr15.field.BeaconSent == 0)            {                DBGPRINT(RT_DEBUG_INFO, "SYNC - NOT last BEACON sender, no PROBE_RSP to %02x:%02x:%02x:%02x:%02x:%02x...\n",                    Addr2[0],Addr2[1],Addr2[2],Addr2[3],Addr2[4],Addr2[5] );                return;            }#endif            // allocate and send out ProbeReq frame            NStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer);  //Get an unused nonpaged memory            if (NStatus != NDIS_STATUS_SUCCESS)	            return;            //pAd->PortCfg.AtimWin = 0;  // ??????            DBGPRINT(RT_DEBUG_TRACE,					"SYNC - Send PROBE_RSP to %02x:%02x:%02x:%02x:%02x:%02x\n",                	Addr2[0],Addr2[1],Addr2[2],Addr2[3],Addr2[4],Addr2[5] );            MgtMacHeaderInit(pAd, &ProbeRspHdr,							SUBTYPE_PROBE_RSP, 0, Addr2, pAd->PortCfg.Bssid);			BeaconPeriod = cpu_to_le16(pAd->PortCfg.BeaconPeriod);			Privacy = (pAd->PortCfg.WepStatus==Ndis802_11Encryption1Enabled) ||					(pAd->PortCfg.WepStatus==Ndis802_11Encryption2Enabled) ||					(pAd->PortCfg.WepStatus==Ndis802_11Encryption3Enabled);			CapabilityInfo = cpu_to_le16(CAP_GENERATE(0, 1, Privacy,					(pAd->PortCfg.TxPreamble == Rt802_11PreambleShort), 0));			AtimWin = cpu_to_le16(pAd->ActiveCfg.AtimWin);            MakeOutgoingFrame(pOutBuffer,                   &FrameLen,                              sizeof(HEADER_802_11),        &ProbeRspHdr,                              TIMESTAMP_LEN,                &FakeTimestamp,                              2,                            &BeaconPeriod,                              2,                            &CapabilityInfo,                              1,                            &SsidIe,                              1,                            &pAd->PortCfg.SsidLen,                              pAd->PortCfg.SsidLen,         pAd->PortCfg.Ssid,                              1,                            &SupRateIe,                              1,                            &pAd->ActiveCfg.SupRateLen,                              pAd->ActiveCfg.SupRateLen,    pAd->ActiveCfg.SupRate,                              1,                            &DsIe,                              1,                            &DsLen,                              1,                            &pAd->PortCfg.Channel,                              1,                            &IbssIe,                              1,                            &IbssLen,                              2,                            &AtimWin,                              END_OF_ARGS);            if (pAd->ActiveCfg.ExtRateLen)            {                ULONG tmp;                MakeOutgoingFrame(pOutBuffer + FrameLen,        &tmp,                                  3,                            LocalErpIe,                                  1,                            &ExtRateIe,                                  1,                            &pAd->ActiveCfg.ExtRateLen,                                  pAd->ActiveCfg.ExtRateLen,    &pAd->ActiveCfg.ExtRate,                                  END_OF_ARGS);                FrameLen += tmp;            }			// If adhoc secruity is set for WPA-None, append the cipher suite IE			if (pAd->PortCfg.AuthMode == Ndis802_11AuthModeWPANone)			{				ULONG	tmp;				if (pAd->PortCfg.WepStatus == Ndis802_11Encryption2Enabled) 	// Tkip				{					MakeOutgoingFrame(pOutBuffer + FrameLen, 		&tmp,							          1,						    &WpaIe,							          1,							&CipherSuiteWpaNoneTkipLen,							          CipherSuiteWpaNoneTkipLen,	&CipherSuiteWpaNoneTkip[0],							          END_OF_ARGS);					FrameLen += tmp;				}				else if (pAd->PortCfg.WepStatus == Ndis802_11Encryption3Enabled)	// Aes				{					MakeOutgoingFrame(pOutBuffer + FrameLen, 		&tmp,							          1,						    &WpaIe,							          1,							&CipherSuiteWpaNoneAesLen,							          CipherSuiteWpaNoneAesLen,	    &CipherSuiteWpaNoneAes[0],							          END_OF_ARGS);					FrameLen += tmp;				}			}            MiniportMMRequest(pAd, pOutBuffer, FrameLen);        }    }}VOID BeaconTimeoutAtJoinAction(    IN PRTMP_ADAPTER pAd,    IN MLME_QUEUE_ELEM *Elem){    USHORT  Status;    DBGPRINT(RT_DEBUG_TRACE, "SYNC - BeaconTimeoutAtJoinAction\n");    pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;    Status = MLME_REJ_TIMEOUT;    MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_JOIN_CONF, 2, &Status);}/*    ==========================================================================    Description:        Scan timeout procedure. basically add channel index by 1 and rescan    ========================================================================== */VOID ScanTimeoutAction(    IN PRTMP_ADAPTER pAd,    IN MLME_QUEUE_ELEM *Elem){//  DBGPRINT(RT_DEBUG_TRACE,"SYNC - ScanTimeoutAction\n");    pAd->MlmeAux.Channel = NextChannel(pAd, pAd->MlmeAux.Channel);    ScanNextChannel(pAd); // this routine will stop if pAd->MlmeAux.Channel == 0}/*    ==========================================================================    Description:        Scan next channel    ========================================================================== */VOID ScanNextChannel(	IN PRTMP_ADAPTER pAd){    HEADER_802_11   Hdr80211;    PUCHAR          pOutBuffer = NULL;    ULONG           FrameLen = 0;    UCHAR           SsidLen = 0, ScanType = pAd->MlmeAux.ScanType;    USHORT          Status;    PHEADER_802_11  pHdr80211;    USHORT          NStatus;    PUCHAR          pSupRate = NULL;    UCHAR           SupRateLen;    PUCHAR          pExtRate = NULL;    UCHAR           ExtRateLen;//For A band    UCHAR           ASupRate[] = {0x8C, 0x12, 0x98, 0x24, 0xb0, 0x48, 0x60, 0x6C};    UCHAR           ASupRateLen = sizeof(ASupRate)/sizeof(UCHAR);    DBGPRINT(RT_DEBUG_INFO, "ScanNextChannel(ch=%d)\n",pAd->MlmeAux.Channel);    if (pAd->MlmeAux.Channel == 0)    {        DBGPRINT(RT_DEBUG_TRACE, "SYNC - End of SCAN, restore to channel %d\n",pAd->PortCfg.Channel);        AsicSwitchChannel(pAd, pAd->PortCfg.Channel);        AsicLockChannel(pAd, pAd->PortCfg.Channel);        // G band - set BBP_R62 to 0x02 when site survey or rssi<-82		// A band - always set BBP_R62 to 0x04        if (pAd->PortCfg.Channel <= 14)        {        	RTUSBWriteBBPRegister(pAd, BBP_R62, 0x02);        }        else        {        	RTUSBWriteBBPRegister(pAd, BBP_R62, 0x04);        }		//		// To prevent data lost.		// Send an NULL data with turned PSM bit on to current associated AP before SCAN progress.		// Now, we need to 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_ACTIVE;				// Send using priority queue				MiniportMMRequest(pAd, pOutBuffer, sizeof(HEADER_802_11));				DBGPRINT(RT_DEBUG_TRACE, "MlmeScanReqAction -- Send PSM Data frame\n");				RTMPusecDelay(5000);			}		}        pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;        Status = MLME_SUCCESS;        MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status);    }    else if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))	{		pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;		Status = MLME_FAIL_NO_RESOURCE;		MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status);	}    else    {        // BBP and RF are not accessible in PS mode, we has to wake them up first        if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))            AsicForceWakeup(pAd);        // leave PSM during scanning. otherwise we may lost ProbeRsp & BEACON        if (pAd->PortCfg.Psm == PWR_SAVE)            MlmeSetPsmBit(pAd, PWR_ACTIVE);        AsicSwitchChannel(pAd, pAd->MlmeAux.Channel);        AsicLockChannel(pAd, pAd->MlmeAux.Channel);        // G band - set BBP_R62 to 0x02 when site survey or rssi<-82		// A band - always set BBP_R62 to 0x04        if (pAd->MlmeAux.Channel <= 14)        {		    //			// For the high power and False CCA issue.(Gary)			//			RTUSBWriteBBPRegister(pAd, BBP_R62, 0x04);			RTUSBWriteBBPRegister(pAd, 17, pAd->BbpTuning.R17LowerBoundG);        }        else        {            if ((pAd->PortCfg.bIEEE80211H == 1) && RadarChannelCheck(pAd, pAd->MlmeAux.Channel))			    ScanType = SCAN_PASSIVE;        	RTUSBWriteBBPRegister(pAd, 17, pAd->BbpTuning.R17LowerBoundA);        	RTUSBWriteBBPRegister(pAd, BBP_R62, 0x04);        }		// We need to shorten active scan time in order for WZC connect issue		// Chnage the channel scan time for CISCO stuff based on its IAPP announcement

⌨️ 快捷键说明

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