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

📄 cmm_data.c

📁 Linux下的RT系列无线网卡驱动,可以直接在x86平台上编译
💻 C
📖 第 1 页 / 共 5 页
字号:
		if (pClonePacket)		{			ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pClonePacket, RTMP_GET_PACKET_IF(pPacket));		}		// A-MSDU has padding to multiple of 4 including subframe header.		// align SubFrameSize up to multiple of 4 		SubFrameSize = (SubFrameSize+3)&(~0x3);		if (SubFrameSize > 1528 || SubFrameSize < 32)		{			break;		}		if (DataSize > SubFrameSize)		{			pData += SubFrameSize;			DataSize -= SubFrameSize;		}		else		{   			// end of A-MSDU			DataSize = 0;		}	}		// finally release original rx packet 	RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS);	return nMSDU;}UINT BA_Reorder_AMSDU_Annnounce(	IN	PRTMP_ADAPTER	pAd, 		IN	PNDIS_PACKET	pPacket){	PUCHAR			pData;	USHORT			DataSize;		UINT			nMSDU = 0;	pData = (PUCHAR) GET_OS_PKT_DATAPTR(pPacket);		DataSize = (USHORT) GET_OS_PKT_LEN(pPacket);	nMSDU = deaggregate_AMSDU_announce(pAd, pPacket, pData, DataSize);	return nMSDU;}/*	==========================================================================	Description:		Look up the MAC address in the MAC table. Return NULL if not found.	Return:		pEntry - pointer to the MAC entry; NULL is not found	==========================================================================*/MAC_TABLE_ENTRY *MacTableLookup(	IN PRTMP_ADAPTER pAd, 	PUCHAR pAddr) {	ULONG HashIdx;	MAC_TABLE_ENTRY *pEntry = NULL;		HashIdx = MAC_ADDR_HASH_INDEX(pAddr);	pEntry = pAd->MacTab.Hash[HashIdx];	while (pEntry && (pEntry->ValidAsCLI || pEntry->ValidAsWDS || pEntry->ValidAsApCli))	{		if (MAC_ADDR_EQUAL(pEntry->Addr, pAddr)) 		{			break;		}		else			pEntry = pEntry->pNext;	}	return pEntry;}/*	==========================================================================	Description:		This routine reset the entire MAC table. All packets pending in		the power-saving queues are freed here.	========================================================================== */VOID STAMacTableReset(	IN  PRTMP_ADAPTER  pAd){	int         i;//	BOOLEAN     Cancelled;//	PCHAR       pOutBuffer = NULL;//	NDIS_STATUS NStatus;//	ULONG       FrameLen = 0;//	HEADER_802_11 DisassocHdr;	USHORT      Reason;	DBGPRINT(RT_DEBUG_TRACE, ("STAMacTableReset\n"));	NdisAcquireSpinLock(&pAd->MacTabLock);	for (i=1; i<MAX_LEN_OF_MAC_TABLE; i++)	{		Reason = MAC_WCID_BASE + (i* HW_WCID_ENTRY_SIZE);			RTMP_IO_WRITE32(pAd, Reason, 0xffffffff);		RTMP_IO_WRITE32(pAd, Reason+4, 0xffff);		if (pAd->MacTab.Content[i].ValidAsCLI == TRUE)	    {			//RTMPCancelTimer(&pAd->MacTab.Content[i].RetryTimer, &Cancelled);			// free resources of BA			BASessionTearDownALL(pAd, i);			pAd->MacTab.Content[i].ValidAsCLI = FALSE;			Reason = MAC_WCID_BASE + (i* HW_WCID_ENTRY_SIZE);				RTMP_IO_WRITE32(pAd, Reason, 0xffffffff);			RTMP_IO_WRITE32(pAd, Reason+4, 0xffff);		}	}	NdisZeroMemory(&pAd->MacTab, sizeof(MAC_TABLE));	NdisReleaseSpinLock(&pAd->MacTabLock);}MAC_TABLE_ENTRY *MacTableInsertEntry(	IN  PRTMP_ADAPTER   pAd, 	IN  PUCHAR			pAddr,	IN	UCHAR			apidx,	IN BOOLEAN	CleanAll) {	UCHAR HashIdx;	int i;//, j;	MAC_TABLE_ENTRY *pEntry = NULL, *pCurrEntry;//	USHORT	offset;//	ULONG	addr;	// if FULL, return	if (pAd->MacTab.Size >= MAX_LEN_OF_MAC_TABLE) 		return NULL;	// allocate one MAC entry	NdisAcquireSpinLock(&pAd->MacTabLock);	for (i = 1; i< MAX_LEN_OF_MAC_TABLE; i++)   // skip entry#0 so that "entry index == AID" for fast lookup	{		// pick up the first available vacancy		if ((pAd->MacTab.Content[i].ValidAsCLI == FALSE) && 			(pAd->MacTab.Content[i].ValidAsWDS == FALSE) &&			(pAd->MacTab.Content[i].ValidAsApCli== FALSE))		{			pEntry = &pAd->MacTab.Content[i];			if (CleanAll == TRUE)			{				pEntry->MaxSupportedRate = RATE_11;				pEntry->CurrTxRate = RATE_11;				NdisZeroMemory(pEntry, sizeof(MAC_TABLE_ENTRY));				pEntry->PairwiseKey.KeyLen = 0;				pEntry->PairwiseKey.CipherAlg = CIPHER_NONE;			}#ifdef CONFIG_STA_SUPPORT						pEntry->ValidAsCLI = TRUE;			pEntry->ValidAsWDS = FALSE;			pEntry->ValidAsApCli = FALSE;#endif // CONFIG_STA_SUPPORT //			pEntry->bIAmBadAtheros = FALSE;			pEntry->pAd = pAd;			pEntry->CMTimerRunning = FALSE;			pEntry->EnqueueStartForPSKTimerRunning= FALSE;			pEntry->RSNIE_Len = 0;			NdisZeroMemory(pEntry->R_Counter, sizeof(pEntry->R_Counter));			pEntry->ReTryCounter = PEER_MSG1_RETRY_TIMER_CTR;			if (pEntry->ValidAsApCli)				pEntry->apidx = (apidx - MIN_NET_DEVICE_FOR_APCLI);			else if (pEntry->ValidAsWDS)				pEntry->apidx = (apidx - MIN_NET_DEVICE_FOR_WDS);			else				pEntry->apidx = apidx;#ifdef CONFIG_STA_SUPPORT						pEntry->AuthMode = pAd->StaCfg.AuthMode;			pEntry->WepStatus = pAd->StaCfg.WepStatus;			pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;			AsicRemovePairwiseKeyEntry(pAd, pEntry->apidx, (UCHAR)i);#endif // CONFIG_STA_SUPPORT //			pEntry->GTKState = REKEY_NEGOTIATING;			pEntry->PairwiseKey.KeyLen = 0;			pEntry->PairwiseKey.CipherAlg = CIPHER_NONE;			pEntry->PortSecured = WPA_802_1X_PORT_NOT_SECURED;			pEntry->PMKID_CacheIdx = ENTRY_NOT_FOUND;			COPY_MAC_ADDR(pEntry->Addr, pAddr);			pEntry->Sst = SST_NOT_AUTH;			pEntry->AuthState = AS_NOT_AUTH;			pEntry->Aid = (USHORT)i;  //0;			pEntry->CapabilityInfo = 0;			pEntry->PsMode = PWR_ACTIVE;			pEntry->PsQIdleCount = 0;			pEntry->NoDataIdleCount = 0;			InitializeQueueHeader(&pEntry->PsQueue);			pAd->MacTab.Size ++;			// Add this entry into ASIC RX WCID search table			AsicUpdateRxWCIDTable(pAd, pEntry->Aid, pEntry->Addr);			// If legacy WEP is used, set pair-wise cipherAlg into WCID attribute table for this entry			if (pEntry->ValidAsCLI && pEntry->WepStatus == Ndis802_11WEPEnabled)			{#ifdef CONFIG_STA_SUPPORT				UCHAR KeyIdx		= pAd->StaCfg.DefaultKeyId;#endif // CONFIG_STA_SUPPORT //				UCHAR CipherAlg 	= pAd->SharedKey[pEntry->apidx][KeyIdx].CipherAlg;										RTMPAddWcidAttributeEntry(							pAd, 							pEntry->apidx, 							KeyIdx, 							CipherAlg, 							pEntry);								    							}			DBGPRINT(RT_DEBUG_TRACE, ("MacTableInsertEntry - allocate entry #%d, Total= %d\n",i, pAd->MacTab.Size));			break;		}	}	// add this MAC entry into HASH table	if (pEntry)	{		HashIdx = MAC_ADDR_HASH_INDEX(pAddr);		if (pAd->MacTab.Hash[HashIdx] == NULL)		{			pAd->MacTab.Hash[HashIdx] = pEntry;		}		else		{			pCurrEntry = pAd->MacTab.Hash[HashIdx];			while (pCurrEntry->pNext != NULL)				pCurrEntry = pCurrEntry->pNext;			pCurrEntry->pNext = pEntry;		}	}	NdisReleaseSpinLock(&pAd->MacTabLock);	return pEntry;}/*	==========================================================================	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;}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;	}		}PNDIS_PACKET GetPacketFromRxRing(	IN		PRTMP_ADAPTER	pAd,	OUT		PRXD_STRUC		pSaveRxD,	OUT		BOOLEAN			*pbReschedule,	IN OUT	UINT32			*pRxPending){	PRXD_STRUC				pRxD;#ifdef BIG_ENDIAN	PRXD_STRUC				pDestRxD;	RXD_STRUC				RxD;#endif	PNDIS_PACKET			pRxPacket = NULL;	PNDIS_PACKET			pNewPacket;	PVOID					AllocVa;	NDIS_PHYSICAL_ADDRESS	AllocPa;	BOOLEAN					bReschedule = FALSE;	RTMP_SEM_LOCK(&pAd->RxRingLock);	if (*pRxPending == 0)	{		// Get how may packets had been received		RTMP_IO_READ32(pAd, RX_DRX_IDX , &pAd->RxRing.RxDmaIdx);		if (pAd->RxRing.RxSwReadIdx == pAd->RxRing.RxDmaIdx)		{			// no more rx packets			bReschedule = FALSE;			goto done;		}		// get rx pending count		if (pAd->RxRing.RxDmaIdx > pAd->RxRing.RxSwReadIdx)			*pRxPending = pAd->RxRing.RxDmaIdx - pAd->RxRing.RxSwReadIdx;		else			*pRxPending	= pAd->RxRing.RxDmaIdx + RX_RING_SIZE - pAd->RxRing.RxSwReadIdx;	}#ifndef BIG_ENDIAN	// Point to Rx indexed rx ring descriptor

⌨️ 快捷键说明

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