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

📄 cmm_sync.c

📁 Linux下的RT系列无线网卡驱动,可以直接在x86平台上编译
💻 C
📖 第 1 页 / 共 2 页
字号:
	if (pAd->CommonCfg.TxPowerPercentage > pAd->CommonCfg.TxPowerDefault)		pAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault;	}CHAR	ConvertToRssi(	IN PRTMP_ADAPTER pAd,	IN	CHAR			Rssi,	IN  UCHAR   RssiNumber){	UCHAR	RssiOffset, LNAGain;	// Rssi equals to zero should be an invalid value	if (Rssi == 0)		return -99;	LNAGain = GET_LNA_GAIN(pAd);    if (pAd->LatchRfRegs.Channel > 14)    {        if (RssiNumber == 0)			RssiOffset = pAd->ARssiOffset0;		else if (RssiNumber == 1)			RssiOffset = pAd->ARssiOffset1;		else			RssiOffset = pAd->ARssiOffset2;    }    else    {        if (RssiNumber == 0)			RssiOffset = pAd->BGRssiOffset0;		else if (RssiNumber == 1)			RssiOffset = pAd->BGRssiOffset1;		else			RssiOffset = pAd->BGRssiOffset2;    }	    return (-12 - RssiOffset - LNAGain - Rssi);}/*	==========================================================================	Description:		Scan next channel	========================================================================== */VOID ScanNextChannel(	IN PRTMP_ADAPTER pAd) {	HEADER_802_11   Hdr80211;	PUCHAR          pOutBuffer = NULL;	NDIS_STATUS     NStatus;	ULONG           FrameLen = 0;	UCHAR           SsidLen = 0, ScanType = pAd->MlmeAux.ScanType, BBPValue = 0;#ifdef CONFIG_STA_SUPPORT	USHORT          Status;	PHEADER_802_11  pHdr80211;#endif // CONFIG_STA_SUPPORT //	UCHAR		HtLen;#ifdef CONFIG_STA_SUPPORT    if (MONITOR_ON(pAd))		return;#endif // CONFIG_STA_SUPPORT //#ifdef RALINK_ATE	// Nothing to do in ATE mode. 	if (pAd->ate.Mode != ATE_STOP)		return;#endif // RALINK_ATE //	if (pAd->MlmeAux.Channel == 0) 	{		if ((pAd->CommonCfg.BBPCurrentBW == BW_40)#ifdef CONFIG_STA_SUPPORT			&& INFRA_ON(pAd)#endif // CONFIG_STA_SUPPORT //			)		{			AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);			AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);			RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);			BBPValue &= (~0x18);			BBPValue |= 0x10;			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);			DBGPRINT(RT_DEBUG_TRACE, ("SYNC - End of SCAN, restore to 40MHz channel %d, Total BSS[%02d]\n",pAd->CommonCfg.CentralChannel, pAd->ScanTab.BssNr));		}		else		{			AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);			AsicLockChannel(pAd, pAd->CommonCfg.Channel);			DBGPRINT(RT_DEBUG_TRACE, ("SYNC - End of SCAN, restore to channel %d, Total BSS[%02d]\n",pAd->CommonCfg.Channel, pAd->ScanTab.BssNr));		}		#ifdef CONFIG_STA_SUPPORT		//		// 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);			if (NStatus	== NDIS_STATUS_SUCCESS)			{				pHdr80211 = (PHEADER_802_11) pOutBuffer;				MgtMacHeaderInit(pAd, pHdr80211, SUBTYPE_NULL_FUNC, 1, pAd->CommonCfg.Bssid, pAd->CommonCfg.Bssid);				pHdr80211->Duration = 0;				pHdr80211->FC.Type = BTYPE_DATA;				pHdr80211->FC.PwrMgmt = (pAd->StaCfg.Psm == PWR_SAVE);				// Send using priority queue				MiniportMMRequest(pAd, 0, pOutBuffer, sizeof(HEADER_802_11));				DBGPRINT(RT_DEBUG_TRACE, ("MlmeScanReqAction -- Send PSM Data frame\n"));				MlmeFreeMemory(pAd, pOutBuffer);				RTMPusecDelay(5000);			}		}		pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;		Status = MLME_SUCCESS;		MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status);#endif // CONFIG_STA_SUPPORT //	} 	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);#ifdef CONFIG_STA_SUPPORT		// leave PSM during scanning. otherwise we may lost ProbeRsp & BEACON		if (pAd->StaCfg.Psm == PWR_SAVE)			MlmeSetPsmBit(pAd, PWR_ACTIVE);#endif // CONFIG_STA_SUPPORT //		AsicSwitchChannel(pAd, pAd->MlmeAux.Channel, TRUE);		AsicLockChannel(pAd, pAd->MlmeAux.Channel);#ifdef CONFIG_STA_SUPPORT		if (pAd->MlmeAux.Channel > 14)		{			if ((pAd->CommonCfg.bIEEE80211H == 1) && RadarChannelCheck(pAd, pAd->MlmeAux.Channel))				ScanType = SCAN_PASSIVE;		}#endif // CONFIG_STA_SUPPORT //		// 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		if (ScanType == FAST_SCAN_ACTIVE)			RTMPSetTimer(&pAd->MlmeAux.ScanTimer, FAST_ACTIVE_SCAN_TIME);#ifdef CONFIG_STA_SUPPORT		else if ((ScanType == SCAN_CISCO_ACTIVE) ||				(ScanType == SCAN_CISCO_PASSIVE) ||				(ScanType == SCAN_CISCO_CHANNEL_LOAD) ||				(ScanType == SCAN_CISCO_NOISE))		{			if (pAd->StaCfg.CCXScanTime < 25)				RTMPSetTimer(&pAd->MlmeAux.ScanTimer, pAd->StaCfg.CCXScanTime * 2);			else				RTMPSetTimer(&pAd->MlmeAux.ScanTimer, pAd->StaCfg.CCXScanTime);		}#endif // CONFIG_STA_SUPPORT //		else // must be SCAN_PASSIVE or SCAN_ACTIVE		{			if ((pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11AGN_MIXED))			{				if (pAd->MlmeAux.Channel > 14)					RTMPSetTimer(&pAd->MlmeAux.ScanTimer, SHORT_CHANNEL_TIME);				else						RTMPSetTimer(&pAd->MlmeAux.ScanTimer, MIN_CHANNEL_TIME);			}			else				RTMPSetTimer(&pAd->MlmeAux.ScanTimer, MAX_CHANNEL_TIME);		}		if ((ScanType == SCAN_ACTIVE) || (ScanType == FAST_SCAN_ACTIVE) ||			(ScanType == SCAN_CISCO_ACTIVE))		{			NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  //Get an unused nonpaged memory			if (NStatus != NDIS_STATUS_SUCCESS)			{				DBGPRINT(RT_DEBUG_TRACE, ("SYNC - ScanNextChannel() allocate memory fail\n"));#ifdef CONFIG_STA_SUPPORT				pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;				Status = MLME_FAIL_NO_RESOURCE;				MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status);#endif // CONFIG_STA_SUPPORT //				return;			}			// There is no need to send broadcast probe request if active scan is in effect.			if ((ScanType == SCAN_ACTIVE) || (ScanType == FAST_SCAN_ACTIVE))				SsidLen = pAd->MlmeAux.SsidLen;			else				SsidLen = 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,                        &pAd->CommonCfg.SupRateLen,							  pAd->CommonCfg.SupRateLen,  pAd->CommonCfg.SupRate, 							  END_OF_ARGS);			if (pAd->CommonCfg.ExtRateLen)			{				ULONG Tmp;				MakeOutgoingFrame(pOutBuffer + FrameLen,            &Tmp,								  1,                                &ExtRateIe,								  1,                                &pAd->CommonCfg.ExtRateLen,								  pAd->CommonCfg.ExtRateLen,          pAd->CommonCfg.ExtRate, 								  END_OF_ARGS);				FrameLen += Tmp;			}			if ((pAd->CommonCfg.PhyMode == PHY_11N) || (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED))			{				ULONG Tmp;				UCHAR	BROADCOM[4] = {0x0, 0x90, 0x4c, 0x33};#ifdef BIG_ENDIAN				HT_CAPABILITY_IE HtCapabilityTmp;#endif				if (pAd->bBroadComHT == TRUE)				{					HtLen = pAd->MlmeAux.HtCapabilityLen + 4;#ifdef BIG_ENDIAN					NdisMoveMemory(&HtCapabilityTmp, &pAd->MlmeAux.HtCapability, SIZE_HT_CAP_IE);					*(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo));					*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo));					MakeOutgoingFrame(pOutBuffer + FrameLen,          &Tmp,									1,                                &WpaIe,									1,                                &HtLen,									4,                                &BROADCOM[0],									pAd->MlmeAux.HtCapabilityLen,     &HtCapabilityTmp, 									END_OF_ARGS);#else					MakeOutgoingFrame(pOutBuffer + FrameLen,          &Tmp,									1,                                &WpaIe,									1,                                &HtLen,									4,                                &BROADCOM[0],									pAd->MlmeAux.HtCapabilityLen,     &pAd->MlmeAux.HtCapability, 									END_OF_ARGS);#endif // BIG_ENDIAN //				}				else								{					HtLen = pAd->MlmeAux.HtCapabilityLen;#ifdef BIG_ENDIAN					NdisMoveMemory(&HtCapabilityTmp, &pAd->CommonCfg.HtCapability, SIZE_HT_CAP_IE);					*(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo));					*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo));					MakeOutgoingFrame(pOutBuffer + FrameLen,          &Tmp,									1,                                &HtCapIe,									1,                                &HtLen,									HtLen,                            &HtCapabilityTmp, 									END_OF_ARGS);#else					MakeOutgoingFrame(pOutBuffer + FrameLen,          &Tmp,									1,                                &HtCapIe,									1,                                &HtLen,									HtLen,                            &pAd->CommonCfg.HtCapability, 									END_OF_ARGS);#endif // BIG_ENDIAN //				}				FrameLen += Tmp;			}			MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);			MlmeFreeMemory(pAd, pOutBuffer);		}		// For SCAN_CISCO_PASSIVE, do nothing and silently wait for beacon or other probe reponse		#ifdef CONFIG_STA_SUPPORT		pAd->Mlme.SyncMachine.CurrState = SCAN_LISTEN;#endif // CONFIG_STA_SUPPORT //	}}VOID MgtProbReqMacHeaderInit(	IN	PRTMP_ADAPTER	pAd, 	IN OUT PHEADER_802_11 pHdr80211, 	IN UCHAR SubType, 	IN UCHAR ToDs, 	IN PUCHAR pDA, 	IN PUCHAR pBssid) {	NdisZeroMemory(pHdr80211, sizeof(HEADER_802_11));		pHdr80211->FC.Type = BTYPE_MGMT;	pHdr80211->FC.SubType = SubType;	if (SubType == SUBTYPE_ACK)		pHdr80211->FC.Type = BTYPE_CNTL;	pHdr80211->FC.ToDs = ToDs;	COPY_MAC_ADDR(pHdr80211->Addr1, pDA);	COPY_MAC_ADDR(pHdr80211->Addr2, pAd->CurrentAddress);	COPY_MAC_ADDR(pHdr80211->Addr3, pBssid);}

⌨️ 快捷键说明

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