cmm_data.c

来自「ralink最新rt3070 usb wifi 无线网卡驱动程序」· C语言 代码 · 共 2,434 行 · 第 1/5 页

C
2,434
字号
	IN	PRTMP_ADAPTER	pAd,	IN	PTXD_STRUC		pTxD,	IN	BOOLEAN 		bWIV,	IN	UCHAR			QueueSEL){	//	// Always use Long preamble before verifiation short preamble functionality works well.	// Todo: remove the following line if short preamble functionality works	//	OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED);	pTxD->WIV	= (bWIV) ? 1: 0;	pTxD->QSEL= (QueueSEL);	if (pAd->bGenOneHCCA == TRUE)		pTxD->QSEL= FIFO_HCCA;	pTxD->DMADONE = 0;}// should be called only when -// 1. MEADIA_CONNECTED// 2. AGGREGATION_IN_USED// 3. Fragmentation not in used// 4. either no previous frame (pPrevAddr1=NULL) .OR. previoud frame is aggregatibleBOOLEAN TxFrameIsAggregatible(	IN	PRTMP_ADAPTER	pAd,	IN	PUCHAR			pPrevAddr1,	IN	PUCHAR			p8023hdr){	// can't aggregate EAPOL (802.1x) frame	if ((p8023hdr[12] == 0x88) && (p8023hdr[13] == 0x8e))		return FALSE;	// can't aggregate multicast/broadcast frame	if (p8023hdr[0] & 0x01)		return FALSE;	if (INFRA_ON(pAd)) // must be unicast to AP		return TRUE;	else if ((pPrevAddr1 == NULL) || MAC_ADDR_EQUAL(pPrevAddr1, p8023hdr)) // unicast to same STA		return TRUE;	else		return FALSE;}/*	========================================================================	Routine Description:	   Check the MSDU Aggregation policy	1.HT aggregation is A-MSDU	2.legaacy rate aggregation is software aggregation by Ralink.		Arguments:			Return Value:		Note:		========================================================================*/BOOLEAN PeerIsAggreOn(	IN	PRTMP_ADAPTER	pAd,	IN	ULONG		   TxRate,	IN	PMAC_TABLE_ENTRY pMacEntry){	ULONG	AFlags = (fCLIENT_STATUS_AMSDU_INUSED | fCLIENT_STATUS_AGGREGATION_CAPABLE);		if (pMacEntry != NULL && CLIENT_STATUS_TEST_FLAG(pMacEntry, AFlags))	{		#ifdef DOT11_N_SUPPORT		if (pMacEntry->HTPhyMode.field.MODE >= MODE_HTMIX)		{						return TRUE;		}#endif // DOT11_N_SUPPORT //#ifdef AGGREGATION_SUPPORT		if (TxRate >= RATE_6 && pAd->CommonCfg.bAggregationCapable && (!(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) && CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_WMM_CAPABLE))))		{	// legacy  Ralink Aggregation support			return TRUE;		}#endif // AGGREGATION_SUPPORT //	}	return FALSE;		}/*	========================================================================	Routine Description:		Check and fine the packet waiting in SW queue with highest priority			Arguments:		pAd Pointer to our adapter			Return Value:		pQueue		Pointer to Waiting Queue	IRQL = DISPATCH_LEVEL		Note:		========================================================================*/PQUEUE_HEADER	RTMPCheckTxSwQueue(	IN	PRTMP_ADAPTER	pAd,	OUT PUCHAR			pQueIdx){	ULONG	Number;	// 2004-11-15 to be removed. test aggregation only//	if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED)) && (*pNumber < 2))//		 return NULL;	Number = pAd->TxSwQueue[QID_AC_BK].Number 			 + pAd->TxSwQueue[QID_AC_BE].Number 			 + pAd->TxSwQueue[QID_AC_VI].Number 			 + pAd->TxSwQueue[QID_AC_VO].Number			 + pAd->TxSwQueue[QID_HCCA].Number;	if (pAd->TxSwQueue[QID_AC_VO].Head != NULL)	{		*pQueIdx = QID_AC_VO;		return (&pAd->TxSwQueue[QID_AC_VO]);	}	else if (pAd->TxSwQueue[QID_AC_VI].Head != NULL)	{		*pQueIdx = QID_AC_VI;		return (&pAd->TxSwQueue[QID_AC_VI]);	}	else if (pAd->TxSwQueue[QID_AC_BE].Head != NULL)	{		*pQueIdx = QID_AC_BE;		return (&pAd->TxSwQueue[QID_AC_BE]);	}	else if (pAd->TxSwQueue[QID_AC_BK].Head != NULL)	{		*pQueIdx = QID_AC_BK;		return (&pAd->TxSwQueue[QID_AC_BK]);	}	else if (pAd->TxSwQueue[QID_HCCA].Head != NULL)	{		*pQueIdx = QID_HCCA;		return (&pAd->TxSwQueue[QID_HCCA]);	}	// No packet pending in Tx Sw queue	*pQueIdx = QID_AC_BK;		return (NULL);}/*	========================================================================	Routine Description:		Suspend MSDU transmission			Arguments:		pAd 	Pointer to our adapter			Return Value:		None			Note:		========================================================================*/VOID	RTMPSuspendMsduTransmission(	IN	PRTMP_ADAPTER	pAd){	DBGPRINT(RT_DEBUG_TRACE,("SCANNING, suspend MSDU transmission ...\n"));	//	// Before BSS_SCAN_IN_PROGRESS, we need to keep Current R66 value and	// use Lowbound as R66 value on ScanNextChannel(...)	//	RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R66, &pAd->BbpTuning.R66CurrentValue);		// set BBP_R66 to 0x30/0x40 when scanning (AsicSwitchChannel will set R66 according to channel when scanning)	//RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, (0x26 + GET_LNA_GAIN(pAd)));	RTMPSetAGCInitValue(pAd, BW_20);		RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);	//RTMP_IO_WRITE32(pAd, TX_CNTL_CSR, 0x000f0000);		// abort all TX rings}/*	========================================================================	Routine Description:		Resume MSDU transmission			Arguments:		pAd 	Pointer to our adapter			Return Value:		None			IRQL = DISPATCH_LEVEL		Note:		========================================================================*/VOID RTMPResumeMsduTransmission(	IN	PRTMP_ADAPTER	pAd){//    UCHAR			IrqState;    	DBGPRINT(RT_DEBUG_TRACE,("SCAN done, resume MSDU transmission ...\n"));	// After finish BSS_SCAN_IN_PROGRESS, we need to restore Current R66 value	// R66 should not be 0	if (pAd->BbpTuning.R66CurrentValue == 0)	{		pAd->BbpTuning.R66CurrentValue = 0x38;		DBGPRINT_ERR(("RTMPResumeMsduTransmission, R66CurrentValue=0...\n"));	}	RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, pAd->BbpTuning.R66CurrentValue);	RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);// sample, for IRQ LOCK to SEM LOCK//    IrqState = pAd->irq_disabled;//	if (IrqState)//		RTMPDeQueuePacket(pAd, TRUE, NUM_OF_TX_RING, MAX_TX_PROCESS);//    else	RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);}UINT deaggregate_AMSDU_announce(	IN	PRTMP_ADAPTER	pAd,	PNDIS_PACKET		pPacket,	IN	PUCHAR			pData,	IN	ULONG			DataSize)	{	USHORT 			PayloadSize;	USHORT 			SubFrameSize; 		PHEADER_802_3 	pAMSDUsubheader;		UINT			nMSDU;    UCHAR			Header802_3[14];	PUCHAR			pPayload, pDA, pSA, pRemovedLLCSNAP;	PNDIS_PACKET	pClonePacket;	nMSDU = 0;	while (DataSize > LENGTH_802_3)	{		nMSDU++;		//hex_dump("subheader", pData, 64);		pAMSDUsubheader = (PHEADER_802_3)pData;		//pData += LENGTH_802_3;		PayloadSize = pAMSDUsubheader->Octet[1] + (pAMSDUsubheader->Octet[0]<<8);		SubFrameSize = PayloadSize + LENGTH_802_3;		if ((DataSize < SubFrameSize) || (PayloadSize > 1518 ))		{			break;		}		//printk("%d subframe: Size = %d\n",  nMSDU, PayloadSize);		pPayload = pData + LENGTH_802_3;		pDA = pData;		pSA = pData + MAC_ADDR_LEN;		// convert to 802.3 header         CONVERT_TO_802_3(Header802_3, pDA, pSA, pPayload, PayloadSize, pRemovedLLCSNAP);#ifdef CONFIG_STA_SUPPORT		if ((Header802_3[12] == 0x88) && (Header802_3[13] == 0x8E) )		{		    // avoid local heap overflow, use dyanamic allocation		   MLME_QUEUE_ELEM *Elem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG);		   memmove(Elem->Msg+(LENGTH_802_11 + LENGTH_802_1_H), pPayload, PayloadSize);             		   Elem->MsgLen = LENGTH_802_11 + LENGTH_802_1_H + PayloadSize;             		   WpaEAPOLKeyAction(pAd, Elem);		   kfree(Elem);		}#endif // CONFIG_STA_SUPPORT //#ifdef CONFIG_STA_SUPPORT		IF_DEV_CONFIG_OPMODE_ON_STA(pAd)		{	        	if (pRemovedLLCSNAP)	        	{	    			pPayload -= LENGTH_802_3;	    			PayloadSize += LENGTH_802_3;	    			NdisMoveMemory(pPayload, &Header802_3[0], LENGTH_802_3);	        	}		}#endif // CONFIG_STA_SUPPORT //		pClonePacket = ClonePacket(pAd, pPacket, pPayload, PayloadSize);		if (pClonePacket)		{#ifdef CONFIG_STA_SUPPORT			IF_DEV_CONFIG_OPMODE_ON_STA(pAd)				ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pClonePacket, RTMP_GET_PACKET_IF(pPacket));#endif // CONFIG_STA_SUPPORT //		}		// 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 || pEntry->ValidAsMesh))	{		if (MAC_ADDR_EQUAL(pEntry->Addr, pAddr)) 		{			break;		}		else			pEntry = pEntry->pNext;	}	return pEntry;}MAC_TABLE_ENTRY *MacTableInsertEntry(	IN  PRTMP_ADAPTER   pAd, 	IN  PUCHAR			pAddr,	IN	UCHAR			apidx,	IN BOOLEAN	CleanAll) {	UCHAR HashIdx;	int i, FirstWcid;	MAC_TABLE_ENTRY *pEntry = NULL, *pCurrEntry;//	USHORT	offset;//	ULONG	addr;	// if FULL, return	if (pAd->MacTab.Size >= MAX_LEN_OF_MAC_TABLE) 		return NULL;	FirstWcid = 1;#ifdef CONFIG_STA_SUPPORT	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)	if (pAd->StaCfg.BssType == BSS_INFRA)		FirstWcid = 2;#endif // CONFIG_STA_SUPPORT //	// allocate one MAC entry	NdisAcquireSpinLock(&pAd->MacTabLock);	for (i = FirstWcid; 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) &&			(pAd->MacTab.Content[i].ValidAsMesh == FALSE)#ifdef CONFIG_STA_SUPPORT#ifdef QOS_DLS_SUPPORT			&& (pAd->MacTab.Content[i].ValidAsDls == FALSE)#endif // QOS_DLS_SUPPORT //#endif // CONFIG_STA_SUPPORT //			)		{			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#ifdef QOS_DLS_SUPPORT			if (apidx >= MIN_NET_DEVICE_FOR_DLS)			{				pEntry->ValidAsCLI = FALSE;				pEntry->ValidAsWDS = FALSE;				pEntry->ValidAsApCli = FALSE;				pEntry->ValidAsMesh = FALSE;				pEntry->ValidAsDls = TRUE;				pEntry->isCached = FALSE;			}			else#endif // QOS_DLS_SUPPORT //#endif // CONFIG_STA_SUPPORT //			{#ifdef CONFIG_STA_SUPPORT					IF_DEV_CONFIG_OPMODE_ON_STA(pAd)				{					pEntry->ValidAsCLI = TRUE;					pEntry->ValidAsWDS = FALSE;					pEntry->ValidAsApCli = FALSE;					pEntry->ValidAsMesh = FALSE;					pEntry->ValidAsDls = FALSE;				}#endif // CONFIG_STA_SUPPORT //			}			pEntry->bIAmBadAtheros = FALSE;			pEntry->pAd = pAd;			pEntry->CMTimerRunning = FALSE;			pEntry->EnqueueEapolStartTimerRunning = EAPOL_START_DISABLE;			pEntry->RSNIE_Len = 0;			NdisZeroMemory(pEntry->R_Counter, sizeof(pEntry->R_Counter));			pEntry->ReTryCounter = PEER_MSG1_RETRY_TIMER_CTR;			if (pEntry->ValidAsMesh)				pEntry->apidx = (apidx - MIN_NET_DEVICE_FOR_MESH);			else if (pEntry->ValidAsApCli)				pEntry->apidx = (apidx - MIN_NET_DEVICE_FOR_APCLI);			else if (pEntry->ValidAsWDS)

⌨️ 快捷键说明

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