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

📄 rtmp_data.c

📁 ralink 2870 usb无线网卡 最新驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
			pMacEntry->isCached = TRUE;		}		// calculate Transmitted AMPDU count and ByteCount 			{			pAd->RalinkCounters.TransmittedMPDUsInAMPDUCount.u.LowPart ++;			pAd->RalinkCounters.TransmittedOctetsInAMPDUCount.QuadPart += pTxBlk->SrcBufLen;				}		//FreeNumber = GET_TXRING_FREENO(pAd, QueIdx);		HAL_WriteTxResource(pAd, pTxBlk, TRUE, &FreeNumber);		//		// Kick out Tx		// 		HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);		pAd->RalinkCounters.KickTxCount++;		pAd->RalinkCounters.OneSecTxDoneCount++;	}	}VOID STA_AMSDU_Frame_Tx(	IN	PRTMP_ADAPTER	pAd,	IN	TX_BLK			*pTxBlk){	PUCHAR			pHeaderBufPtr;	USHORT			FreeNumber;	USHORT			subFramePayloadLen = 0;	// AMSDU Subframe length without AMSDU-Header / Padding.	USHORT			totalMPDUSize=0;	UCHAR			*subFrameHeader;	UCHAR			padding = 0;	USHORT			FirstTx = 0, LastTxIdx = 0;	BOOLEAN			bVLANPkt;	int 			frameNum = 0;	PQUEUE_ENTRY	pQEntry;			ASSERT(pTxBlk);		ASSERT((pTxBlk->TxPacketList.Number > 1));	while(pTxBlk->TxPacketList.Head)	{		pQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList);		pTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);		if (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE)		{			RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE);			continue;		}				bVLANPkt = (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) ? TRUE : FALSE);				// skip 802.3 header		pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3;		pTxBlk->SrcBufLen  -= LENGTH_802_3;		// skip vlan tag		if (bVLANPkt)		{			pTxBlk->pSrcBufData	+= LENGTH_802_1Q;			pTxBlk->SrcBufLen	-= LENGTH_802_1Q;		}				if (frameNum == 0)		{			pHeaderBufPtr = STA_Build_AMSDU_Frame_Header(pAd, pTxBlk);			// NOTE: TxWI->MPDUtotalByteCount will be updated after final frame was handled.			RTMPWriteTxWI_Data(pAd, (PTXWI_STRUC)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk);		}		else		{			pHeaderBufPtr = &pTxBlk->HeaderBuf[0];			padding = ROUND_UP(LENGTH_AMSDU_SUBFRAMEHEAD + subFramePayloadLen, 4) - (LENGTH_AMSDU_SUBFRAMEHEAD + subFramePayloadLen);			NdisZeroMemory(pHeaderBufPtr, padding + LENGTH_AMSDU_SUBFRAMEHEAD);			pHeaderBufPtr += padding;			pTxBlk->MpduHeaderLen = padding;		}		//		// A-MSDU subframe		//   DA(6)+SA(6)+Length(2) + LLC/SNAP Encap		// 		subFrameHeader = pHeaderBufPtr;		subFramePayloadLen = pTxBlk->SrcBufLen;		NdisMoveMemory(subFrameHeader, pTxBlk->pSrcBufHeader, 12);		pHeaderBufPtr += LENGTH_AMSDU_SUBFRAMEHEAD;		pTxBlk->MpduHeaderLen += LENGTH_AMSDU_SUBFRAMEHEAD;		//		// Insert LLC-SNAP encapsulation - 8 octets		// 		EXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(pTxBlk->pSrcBufData-2, pTxBlk->pExtraLlcSnapEncap);		subFramePayloadLen = pTxBlk->SrcBufLen;		if (pTxBlk->pExtraLlcSnapEncap)		{			NdisMoveMemory(pHeaderBufPtr, pTxBlk->pExtraLlcSnapEncap, 6);			pHeaderBufPtr += 6;			// get 2 octets (TypeofLen)			NdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufData-2, 2);			pHeaderBufPtr += 2;			pTxBlk->MpduHeaderLen += LENGTH_802_1_H;			subFramePayloadLen += LENGTH_802_1_H;		}		// update subFrame Length field		subFrameHeader[12] = (subFramePayloadLen & 0xFF00) >> 8;		subFrameHeader[13] = subFramePayloadLen & 0xFF;		totalMPDUSize += pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen;		if (frameNum ==0)			FirstTx = HAL_WriteMultiTxResource(pAd, pTxBlk, frameNum, &FreeNumber);		else			LastTxIdx = HAL_WriteMultiTxResource(pAd, pTxBlk, frameNum, &FreeNumber);				frameNum++;		pAd->RalinkCounters.KickTxCount++;		pAd->RalinkCounters.OneSecTxDoneCount++;						// calculate Transmitted AMSDU Count and ByteCount		{			pAd->RalinkCounters.TransmittedAMSDUCount.u.LowPart ++;			pAd->RalinkCounters.TransmittedOctetsInAMSDU.QuadPart += totalMPDUSize;					}			}	HAL_FinalWriteTxResource(pAd, pTxBlk, totalMPDUSize, FirstTx);	HAL_LastTxIdx(pAd, pTxBlk->QueIdx, LastTxIdx);	//	// Kick out Tx	// 	HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);}#endif // DOT11_N_SUPPORT //VOID STA_Legacy_Frame_Tx(	IN	PRTMP_ADAPTER	pAd,	IN	TX_BLK			*pTxBlk){	HEADER_802_11	*pHeader_802_11;	PUCHAR			pHeaderBufPtr;	USHORT			FreeNumber;	BOOLEAN			bVLANPkt;	PQUEUE_ENTRY	pQEntry;		ASSERT(pTxBlk);	pQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList);	pTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);	if (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE)	{		RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE);		return;	}	if (pTxBlk->TxFrameType == TX_MCAST_FRAME)	{		INC_COUNTER64(pAd->WlanCounters.MulticastTransmittedFrameCount);	}		if (RTMP_GET_PACKET_RTS(pTxBlk->pPacket))		TX_BLK_SET_FLAG(pTxBlk, fTX_bRtsRequired);	else		TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bRtsRequired);	bVLANPkt = (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) ? TRUE : FALSE);	if (pTxBlk->TxRate < pAd->CommonCfg.MinTxRate)		pTxBlk->TxRate = pAd->CommonCfg.MinTxRate;		STAFindCipherAlgorithm(pAd, pTxBlk);	STABuildCommon802_11Header(pAd, pTxBlk);	// skip 802.3 header	pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3;	pTxBlk->SrcBufLen  -= LENGTH_802_3;	// skip vlan tag	if (bVLANPkt)	{		pTxBlk->pSrcBufData	+= LENGTH_802_1Q;		pTxBlk->SrcBufLen	-= LENGTH_802_1Q;	}	pHeaderBufPtr = &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWI_SIZE];	pHeader_802_11 = (HEADER_802_11 *) pHeaderBufPtr;	// skip common header	pHeaderBufPtr += pTxBlk->MpduHeaderLen;	if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM))	{		//		// build QOS Control bytes		// 		*(pHeaderBufPtr) = ((pTxBlk->UserPriority & 0x0F) | (pAd->CommonCfg.AckPolicy[pTxBlk->QueIdx]<<5));		*(pHeaderBufPtr+1) = 0;		pHeaderBufPtr +=2;		pTxBlk->MpduHeaderLen += 2;	}	// The remaining content of MPDU header should locate at 4-octets aligment		pTxBlk->HdrPadLen = (ULONG)pHeaderBufPtr;	pHeaderBufPtr = (PUCHAR) ROUND_UP(pHeaderBufPtr, 4);	pTxBlk->HdrPadLen = (ULONG)(pHeaderBufPtr - pTxBlk->HdrPadLen);	{		//		// Insert LLC-SNAP encapsulation - 8 octets		// 		//   		// if original Ethernet frame contains no LLC/SNAP, 		// then an extra LLC/SNAP encap is required 		//		EXTRA_LLCSNAP_ENCAP_FROM_PKT_START(pTxBlk->pSrcBufHeader, pTxBlk->pExtraLlcSnapEncap);		if (pTxBlk->pExtraLlcSnapEncap)		{			UCHAR vlan_size;				NdisMoveMemory(pHeaderBufPtr, pTxBlk->pExtraLlcSnapEncap, 6);			pHeaderBufPtr += 6;			// skip vlan tag			vlan_size =  (bVLANPkt) ? LENGTH_802_1Q : 0;			// get 2 octets (TypeofLen)			NdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufHeader+12+vlan_size, 2);			pHeaderBufPtr += 2;			pTxBlk->MpduHeaderLen += LENGTH_802_1_H;		}	}	//	// prepare for TXWI	// use Wcid as Key Index	//	RTMPWriteTxWI_Data(pAd, (PTXWI_STRUC)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk);	//FreeNumber = GET_TXRING_FREENO(pAd, QueIdx);	HAL_WriteTxResource(pAd, pTxBlk, TRUE, &FreeNumber);		pAd->RalinkCounters.KickTxCount++;	pAd->RalinkCounters.OneSecTxDoneCount++;	//	// Kick out Tx	// 	HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);}VOID STA_ARalink_Frame_Tx(	IN	PRTMP_ADAPTER	pAd,	IN	TX_BLK			*pTxBlk){	PUCHAR			pHeaderBufPtr;	USHORT			FreeNumber;	USHORT			totalMPDUSize=0;	USHORT			FirstTx, LastTxIdx;	int 			frameNum = 0;	BOOLEAN			bVLANPkt;	PQUEUE_ENTRY	pQEntry;	ASSERT(pTxBlk);		ASSERT((pTxBlk->TxPacketList.Number== 2));	FirstTx = LastTxIdx = 0;  // Is it ok init they as 0?	while(pTxBlk->TxPacketList.Head)	{		pQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList);		pTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);				if (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE)		{			RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE);			continue;		}				bVLANPkt = (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) ? TRUE : FALSE);				// skip 802.3 header		pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3;		pTxBlk->SrcBufLen  -= LENGTH_802_3;		// skip vlan tag		if (bVLANPkt)		{			pTxBlk->pSrcBufData	+= LENGTH_802_1Q;			pTxBlk->SrcBufLen	-= LENGTH_802_1Q;		}				if (frameNum == 0)		{	// For first frame, we need to create the 802.11 header + padding(optional) + RA-AGG-LEN + SNAP Header					pHeaderBufPtr = STA_Build_ARalink_Frame_Header(pAd, pTxBlk);						// It's ok write the TxWI here, because the TxWI->MPDUtotalByteCount 			//	will be updated after final frame was handled.			RTMPWriteTxWI_Data(pAd, (PTXWI_STRUC)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk);			//			// Insert LLC-SNAP encapsulation - 8 octets			// 			EXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(pTxBlk->pSrcBufData-2, pTxBlk->pExtraLlcSnapEncap);			if (pTxBlk->pExtraLlcSnapEncap)			{				NdisMoveMemory(pHeaderBufPtr, pTxBlk->pExtraLlcSnapEncap, 6);				pHeaderBufPtr += 6;				// get 2 octets (TypeofLen)				NdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufData-2, 2);				pHeaderBufPtr += 2;				pTxBlk->MpduHeaderLen += LENGTH_802_1_H;			}		}		else		{	// For second aggregated frame, we need create the 802.3 header to headerBuf, because PCI will copy it to SDPtr0.					pHeaderBufPtr = &pTxBlk->HeaderBuf[0];			pTxBlk->MpduHeaderLen = 0;						// A-Ralink sub-sequent frame header is the same as 802.3 header.			//   DA(6)+SA(6)+FrameType(2)			NdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufHeader, 12);			pHeaderBufPtr += 12;			// get 2 octets (TypeofLen)			NdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufData-2, 2);			pHeaderBufPtr += 2;			pTxBlk->MpduHeaderLen = LENGTH_ARALINK_SUBFRAMEHEAD;		}		totalMPDUSize += pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen;				//FreeNumber = GET_TXRING_FREENO(pAd, QueIdx);		if (frameNum ==0)			FirstTx = HAL_WriteMultiTxResource(pAd, pTxBlk, frameNum, &FreeNumber);		else			LastTxIdx = HAL_WriteMultiTxResource(pAd, pTxBlk, frameNum, &FreeNumber);		frameNum++;				pAd->RalinkCounters.OneSecTxAggregationCount++;		pAd->RalinkCounters.KickTxCount++;		pAd->RalinkCounters.OneSecTxDoneCount++;			}	HAL_FinalWriteTxResource(pAd, pTxBlk, totalMPDUSize, FirstTx);	HAL_LastTxIdx(pAd, pTxBlk->QueIdx, LastTxIdx);	//	// Kick out Tx	// 	HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);}VOID STA_Fragment_Frame_Tx(	IN RTMP_ADAPTER *pAd,	IN TX_BLK		*pTxBlk){	HEADER_802_11	*pHeader_802_11;	PUCHAR			pHeaderBufPtr;	USHORT			FreeNumber;	UCHAR 			fragNum = 0;	PACKET_INFO		PacketInfo;	USHORT			EncryptionOverhead = 0;		UINT32			FreeMpduSize, SrcRemainingBytes;	USHORT			AckDuration;	UINT 			NextMpduSize;	BOOLEAN			bVLANPkt;	PQUEUE_ENTRY	pQEntry;	HTTRANSMIT_SETTING	*pTransmit;			ASSERT(pTxBlk);	pQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList);	pTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);	if (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE)	{		RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE);		return;	}	ASSERT(TX_BLK_TEST_FLAG(pTxBlk, fTX_bAllowFrag));	bVLANPkt = (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) ? TRUE : FALSE);		STAFindCipherAlgorithm(pAd, pTxBlk);	STABuildCommon802_11Header(pAd, pTxBlk);		if (pTxBlk->CipherAlg == CIPHER_TKIP)	{		pTxBlk->pPacket = duplicate_pkt_with_TKIP_MIC(pAd, pTxBlk->pPacket);		if (pTxBlk->pPacket == NULL)			return;		RTMP_QueryPacketInfo(pTxBlk->pPacket, &PacketInfo, &pTxBlk->pSrcBufHeader, &pTxBlk->SrcBufLen);	}	// skip 802.3 header	pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3;	pTxBlk->SrcBufLen  -= LENGTH_802_3;	// skip vlan tag	if (bVLANPkt)	{		pTxBlk->pSrcBufData	+= LENGTH_802_1Q;		pTxBlk->SrcBufLen	-= LENGTH_802_1Q;	}	pHeaderBufPtr = &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWI_SIZE];	pHeader_802_11 = (HEADER_802_11 *)pHeaderBufPtr;	// skip common header	pHeaderBufPtr += pTxBlk->MpduHeaderLen;	if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM))	{		//		// build QOS Control bytes		// 		*pHeaderBufPtr = (pTxBlk->UserPriority & 0x0F);		*(pHeaderBufPtr+1) = 0;		pHeaderBufPtr +=2;		pTxBlk->MpduHeaderLen += 2;	}	//	// padding at front of LLC header	// LLC header should locate at 4-octets aligment	// 	pTxBlk->HdrPadLen = (ULONG)pHeaderBufPtr;	pHeaderBufPtr = (PUCHAR) ROUND_UP(pHeaderBufPtr, 4);	pTxBlk->HdrPadLen = (ULONG)(pHeaderBufPtr - pTxBlk->HdrPadLen);	//	// Insert LLC-SNAP encapsulation - 8 octets	// 	//   	// if original Ethernet frame contains no LLC/SNAP, 	// then an extra LLC/SNAP encap is required 	// 	EXTRA_LLCSNAP_ENCAP_FROM_PKT_START(pTxBlk->pSrcBufHeader, pTxBlk->pExtraLlcSnapEncap);	if

⌨️ 快捷键说明

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