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

📄 cmm_data.c

📁 ralink 2870 usb无线网卡 最新驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
#ifdef DOT11_N_SUPPORT			// free resources of BA			BASessionTearDownALL(pAd, pEntry->Aid);#endif // DOT11_N_SUPPORT //			pPrevEntry = NULL;			pProbeEntry = pAd->MacTab.Hash[HashIdx];			ASSERT(pProbeEntry);			// update Hash list			do			{				if (pProbeEntry == pEntry)				{					if (pPrevEntry == NULL)					{						pAd->MacTab.Hash[HashIdx] = pEntry->pNext;					}					else					{						pPrevEntry->pNext = pEntry->pNext;					}					break;				}				pPrevEntry = pProbeEntry;				pProbeEntry = pProbeEntry->pNext;			} while (pProbeEntry);			// not found !!!			ASSERT(pProbeEntry != NULL);			RTMP_STA_ENTRY_KEY_DEL(pAd, BSS0, wcid);		if (pEntry->EnqueueEapolStartTimerRunning != EAPOL_START_DISABLE)		{            RTMPCancelTimer(&pEntry->EnqueueStartForPSKTimer, &Cancelled);			pEntry->EnqueueEapolStartTimerRunning = EAPOL_START_DISABLE;        }   			NdisZeroMemory(pEntry, sizeof(MAC_TABLE_ENTRY));			pAd->MacTab.Size --;			DBGPRINT(RT_DEBUG_TRACE, ("MacTableDeleteEntry1 - Total= %d\n", pAd->MacTab.Size));		}		else		{			DBGPRINT(RT_DEBUG_OFF, ("\n%s: Impossible Wcid = %d !!!!!\n", __FUNCTION__, wcid));		}	}	NdisReleaseSpinLock(&pAd->MacTabLock);	//Reset operating mode when no Sta.	if (pAd->MacTab.Size == 0)	{#ifdef DOT11_N_SUPPORT		pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode = 0;#endif // DOT11_N_SUPPORT //		//AsicUpdateProtect(pAd, 0 /*pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode*/, (ALLN_SETPROTECT), TRUE, 0 /*pAd->MacTab.fAnyStationNonGF*/);		RTMP_UPDATE_PROTECT(pAd);  // edit by johnli, fix "in_interrupt" error when call "MacTableDeleteEntry" in Rx tasklet	}	return TRUE;}/*	==========================================================================	Description:		This routine reset the entire MAC table. All packets pending in		the power-saving queues are freed here.	========================================================================== */VOID MacTableReset(	IN  PRTMP_ADAPTER  pAd){	int         i;	DBGPRINT(RT_DEBUG_TRACE, ("MacTableReset\n"));	//NdisAcquireSpinLock(&pAd->MacTabLock);	for (i=1; i<MAX_LEN_OF_MAC_TABLE; i++)	{		if (pAd->MacTab.Content[i].ValidAsCLI == TRUE)	   {#ifdef DOT11_N_SUPPORT			// free resources of BA			BASessionTearDownALL(pAd, i);#endif // DOT11_N_SUPPORT //			pAd->MacTab.Content[i].ValidAsCLI = FALSE;#ifdef RTMP_MAC_USB			NdisZeroMemory(pAd->MacTab.Content[i].Addr, 6);			RTMP_STA_ENTRY_MAC_RESET(pAd, i);#endif // RTMP_MAC_USB //			//AsicDelWcidTab(pAd, i);		}	}	return;}/*	==========================================================================	Description:	IRQL = DISPATCH_LEVEL		==========================================================================*/VOID AssocParmFill(	IN PRTMP_ADAPTER pAd,	IN OUT MLME_ASSOC_REQ_STRUCT *AssocReq,	IN PUCHAR                     pAddr,	IN USHORT                     CapabilityInfo,	IN ULONG                      Timeout,	IN USHORT                     ListenIntv){	COPY_MAC_ADDR(AssocReq->Addr, pAddr);	// Add mask to support 802.11b mode only	AssocReq->CapabilityInfo = CapabilityInfo & SUPPORTED_CAPABILITY_INFO; // not cf-pollable, not cf-poll-request	AssocReq->Timeout = Timeout;	AssocReq->ListenIntv = ListenIntv;}/*	==========================================================================	Description:	IRQL = DISPATCH_LEVEL		==========================================================================*/VOID DisassocParmFill(	IN PRTMP_ADAPTER pAd,	IN OUT MLME_DISASSOC_REQ_STRUCT *DisassocReq,	IN PUCHAR pAddr,	IN USHORT Reason){	COPY_MAC_ADDR(DisassocReq->Addr, pAddr);	DisassocReq->Reason = Reason;}/*	========================================================================	Routine Description:		Check the out going frame, if this is an DHCP or ARP datagram	will be duplicate another frame at low data rate transmit.			Arguments:		pAd 		Pointer to our adapter		pPacket 	Pointer to outgoing Ndis frame			Return Value:		TRUE		To be duplicate at Low data rate transmit. (1mb)		FALSE		Do nothing.	IRQL = DISPATCH_LEVEL		Note:		MAC header + IP Header + UDP Header		  14 Bytes	  20 Bytes		  		UDP Header		00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|						Source Port		16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|					Destination Port		port 0x43 means Bootstrap Protocol, server.		Port 0x44 means Bootstrap Protocol, client.	========================================================================*/BOOLEAN RTMPCheckDHCPFrame(	IN	PRTMP_ADAPTER	pAd,	IN	PNDIS_PACKET	pPacket){	PACKET_INFO 	PacketInfo;	ULONG			NumberOfBytesRead = 0;	ULONG			CurrentOffset = 0;	PVOID			pVirtualAddress = NULL;	UINT			NdisBufferLength;	PUCHAR			pSrc;	USHORT			Protocol;	UCHAR			ByteOffset36 = 0;	UCHAR			ByteOffset38 = 0;	BOOLEAN 		ReadFirstParm = TRUE;			RTMP_QueryPacketInfo(pPacket, &PacketInfo, (PUCHAR *)&pVirtualAddress, &NdisBufferLength);	NumberOfBytesRead += NdisBufferLength;	pSrc = (PUCHAR) pVirtualAddress;	Protocol = *(pSrc + 12) * 256 + *(pSrc + 13);	//	// Check DHCP & BOOTP protocol	//	while (NumberOfBytesRead <= PacketInfo.TotalPacketLength)	{		if ((NumberOfBytesRead >= 35) && (ReadFirstParm == TRUE))		{			CurrentOffset = 35 - (NumberOfBytesRead - NdisBufferLength);			ByteOffset36 = *(pSrc + CurrentOffset);			ReadFirstParm = FALSE;		}				if (NumberOfBytesRead >= 37)		{			CurrentOffset = 37 - (NumberOfBytesRead - NdisBufferLength);			ByteOffset38 = *(pSrc + CurrentOffset);			//End of Read			break;		}		return FALSE;	}	// Check for DHCP & BOOTP protocol	if ((ByteOffset36 != 0x44) || (ByteOffset38 != 0x43))		{		//		// 2054 (hex 0806) for ARP datagrams		// if this packet is not ARP datagrams, then do nothing		// ARP datagrams will also be duplicate at 1mb broadcast frames		//		if (Protocol != 0x0806 )			return FALSE;		}	return TRUE;}BOOLEAN RTMPCheckEtherType(	IN	PRTMP_ADAPTER	pAd,	IN	PNDIS_PACKET	pPacket){	USHORT	TypeLen;	UCHAR	Byte0, Byte1;	PUCHAR	pSrcBuf;	UINT32	pktLen;	UINT16 	srcPort, dstPort;	BOOLEAN	status = TRUE;						pSrcBuf = GET_OS_PKT_DATAPTR(pPacket);	pktLen = GET_OS_PKT_LEN(pPacket);	ASSERT(pSrcBuf);	RTMP_SET_PACKET_SPECIFIC(pPacket, 0);		// get Ethernet protocol field	TypeLen = (pSrcBuf[12] << 8) + pSrcBuf[13];	pSrcBuf += LENGTH_802_3;	// Skip the Ethernet Header.		if (TypeLen <= 1500)	{	// 802.3, 802.3 LLC		/*			DestMAC(6) + SrcMAC(6) + Lenght(2) +			DSAP(1) + SSAP(1) + Control(1) +			if the DSAP = 0xAA, SSAP=0xAA, Contorl = 0x03, it has a 5-bytes SNAP header.				=> + SNAP (5, OriginationID(3) + etherType(2))		*/		if (pSrcBuf[0] == 0xAA && pSrcBuf[1] == 0xAA && pSrcBuf[2] == 0x03)		{			Sniff2BytesFromNdisBuffer((PNDIS_BUFFER)pSrcBuf, 6, &Byte0, &Byte1);			RTMP_SET_PACKET_LLCSNAP(pPacket, 1);			TypeLen = (USHORT)((Byte0 << 8) + Byte1);			pSrcBuf += 8; // Skip this LLC/SNAP header		}		else		{			//It just has 3-byte LLC header, maybe a legacy ether type frame. we didn't handle it.		}	}		// If it's a VLAN packet, get the real Type/Length field.	if (TypeLen == 0x8100)	{		/* 0x8100 means VLAN packets */		/* Dest. MAC Address (6-bytes) +		   Source MAC Address (6-bytes) +		   Length/Type = 802.1Q Tag Type (2-byte) +		   Tag Control Information (2-bytes) +		   Length / Type (2-bytes) +		   data payload (0-n bytes) +		   Pad (0-p bytes) +		   Frame Check Sequence (4-bytes) */				   		RTMP_SET_PACKET_VLAN(pPacket, 1);		Sniff2BytesFromNdisBuffer((PNDIS_BUFFER)pSrcBuf, 2, &Byte0, &Byte1);		TypeLen = (USHORT)((Byte0 << 8) + Byte1);		pSrcBuf += 4; // Skip the VLAN Header.	}	switch (TypeLen)	{		case 0x0800:			{				ASSERT((pktLen > 34));				if (*(pSrcBuf + 9) == 0x11)				{	// udp packet					ASSERT((pktLen > 34));	// 14 for ethernet header, 20 for IP header										pSrcBuf += 20;	// Skip the IP header					srcPort = OS_NTOHS(get_unaligned((PUINT16)(pSrcBuf)));					dstPort = OS_NTOHS(get_unaligned((PUINT16)(pSrcBuf+2)));							if ((srcPort==0x44 && dstPort==0x43) || (srcPort==0x43 && dstPort==0x44))					{	//It's a BOOTP/DHCP packet						RTMP_SET_PACKET_DHCP(pPacket, 1);					}				}			}			break;		case 0x0806:			{				//ARP Packet.				RTMP_SET_PACKET_DHCP(pPacket, 1);			}			break;		case 0x888e:			{				// EAPOL Packet.				RTMP_SET_PACKET_EAPOL(pPacket, 1);			}			break;		default:			status = FALSE;			break;	}	return status;	}VOID Update_Rssi_Sample(	IN PRTMP_ADAPTER	pAd,	IN RSSI_SAMPLE		*pRssi,	IN PRXWI_STRUC		pRxWI)		{	CHAR	rssi0 = pRxWI->RSSI0;	CHAR	rssi1 = pRxWI->RSSI1;	CHAR	rssi2 = pRxWI->RSSI2;	if (rssi0 != 0)	{		pRssi->LastRssi0	= ConvertToRssi(pAd, (CHAR)rssi0, RSSI_0);		pRssi->AvgRssi0X8	= (pRssi->AvgRssi0X8 - pRssi->AvgRssi0) + pRssi->LastRssi0;		pRssi->AvgRssi0	= pRssi->AvgRssi0X8 >> 3;	}	if (rssi1 != 0)	{		pRssi->LastRssi1	= ConvertToRssi(pAd, (CHAR)rssi1, RSSI_1);		pRssi->AvgRssi1X8	= (pRssi->AvgRssi1X8 - pRssi->AvgRssi1) + pRssi->LastRssi1;		pRssi->AvgRssi1	= pRssi->AvgRssi1X8 >> 3;	}	if (rssi2 != 0)	{		pRssi->LastRssi2	= ConvertToRssi(pAd, (CHAR)rssi2, RSSI_2);		pRssi->AvgRssi2X8  = (pRssi->AvgRssi2X8 - pRssi->AvgRssi2) + pRssi->LastRssi2;		pRssi->AvgRssi2 = pRssi->AvgRssi2X8 >> 3;	}}// Normal legacy Rx packet indicationVOID Indicate_Legacy_Packet(	IN	PRTMP_ADAPTER	pAd,	IN	RX_BLK			*pRxBlk,	IN	UCHAR			FromWhichBSSID){	PNDIS_PACKET	pRxPacket = pRxBlk->pRxPacket;	UCHAR			Header802_3[LENGTH_802_3];	// 1. get 802.3 Header	// 2. remove LLC	// 		a. pointer pRxBlk->pData to payload	//      b. modify pRxBlk->DataSize#ifdef CONFIG_STA_SUPPORT	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)		RTMP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(pRxBlk, Header802_3);#endif // CONFIG_STA_SUPPORT //	if (pRxBlk->DataSize > MAX_RX_PKT_LEN)	{		// release packet		RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);		return;	}	STATS_INC_RX_PACKETS(pAd, FromWhichBSSID);#ifdef RTMP_MAC_USB#ifdef DOT11_N_SUPPORT	if (pAd->CommonCfg.bDisableReordering == 0)	{		PBA_REC_ENTRY		pBAEntry;		ULONG				Now32;		UCHAR				Wcid = pRxBlk->pRxWI->WirelessCliID;		UCHAR				TID = pRxBlk->pRxWI->TID;		USHORT				Idx;		#define REORDERING_PACKET_TIMEOUT		((100 * OS_HZ)/1000)	// system ticks -- 100 ms		if (Wcid < MAX_LEN_OF_MAC_TABLE)		{			Idx = pAd->MacTab.Content[Wcid].BARecWcidArray[TID];			if (Idx != 0)			{				pBAEntry = &pAd->BATable.BARecEntry[Idx];				// update last rx time				NdisGetSystemUpTime(&Now32);				if ((pBAEntry->list.qlen > 0) &&					 RTMP_TIME_AFTER((unsigned long)Now32, (unsigned long)(pBAEntry->LastIndSeqAtTimer+(REORDERING_PACKET_TIMEOUT)))	   				)				{					DBGPRINT(RT_DEBUG_OFF, ("Indicate_Legacy_Packet():flush reordering_timeout_mpdus! RxWI->Flags=%d, pRxWI.TID=%d, RxD->AMPDU=%d!\n", 												pRxBlk->Flags, pRxBlk->pRxWI->TID, pRxBlk->RxD.AMPDU));					hex_dump("Dump the legacy Packet:", GET_OS_PKT_DATAPTR(pRxBlk->pRxPacket), 64);					ba_flush_reordering_timeout_mpdus(pAd, pBAEntry, Now32);				}			}		}	}#endif // DOT11_N_SUPPORT //#endif // RTMP_MAC_USB //	wlan_802_11_to_802_3_packet(pAd, pRxBlk, Header802_3, FromWhichBSSID);	//	// pass this 802.3 packet to upper layer or forward this packet to WM directly	//#ifdef CONFIG_STA_SUPPORT	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)		ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pRxPacket, FromWhichBSSID);#endif // CONFIG_STA_SUPPORT //}// Normal, AMPDU or AMSDUVOID CmmRxnonRalinkFrameIndicate(	IN	PRTMP_ADAPTER	pAd,	IN	RX_BLK			*pRxBlk,	IN	UCHAR			FromWhichBSSID){#ifdef DOT11_N_SUPPORT	if (RX_BLK_TEST_FLAG(pRxBlk, fRX_AMPDU) && (pAd->CommonCfg.bDisableReordering == 0))	{		Indicate_AMPDU_Packet(pAd, pRxBlk, FromWhichBSSID);	}	else#endif // DOT11_N_SUPPORT //	{#ifdef DOT11_N_SUPPORT		if (RX_BLK_TEST_FLAG(pRxBlk, fRX_AMSDU))		{			// handle A

⌨️ 快捷键说明

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