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

📄 cmm_data.c

📁 ralink 2870 usb无线网卡 最新驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
	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;		}		//DBGPRINT(RT_DEBUG_TRACE,("%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);			if (Elem != NULL)			{				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);				REPORT_MGMT_FRAME_TO_MLME(pAd, BSSID_WCID, Elem->Msg, Elem->MsgLen, 0, 0, 0, 0);				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)				pEntry->apidx = (apidx - MIN_NET_DEVICE_FOR_WDS);#ifdef CONFIG_STA_SUPPORT#ifdef QOS_DLS_SUPPORT			else if (pEntry->ValidAsDls)				pEntry->apidx = (apidx - MIN_NET_DEVICE_FOR_DLS);#endif // QOS_DLS_SUPPORT //#endif // CONFIG_STA_SUPPORT //			else				pEntry->apidx = apidx;			{#ifdef CONFIG_STA_SUPPORT				IF_DEV_CONFIG_OPMODE_ON_STA(pAd)				{					pEntry->AuthMode = pAd->StaCfg.AuthMode;					pEntry->WepStatus = pAd->StaCfg.WepStatus;					pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;				}#endif // CONFIG_STA_SUPPORT //			}			pEntry->GTKState = REKEY_NEGOTIATING;			pEntry->PairwiseKey.KeyLen = 0;			pEntry->PairwiseKey.CipherAlg = CIPHER_NONE;#ifdef CONFIG_STA_SUPPORT#ifdef QOS_DLS_SUPPORT			if (pEntry->ValidAsDls == TRUE)				pEntry->PortSecured = WPA_802_1X_PORT_SECURED;			else#endif //QOS_DLS_SUPPORT#endif // CONFIG_STA_SUPPORT //				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;			pEntry->AssocDeadLine = MAC_TABLE_ASSOC_TIMEOUT;			pEntry->ContinueTxFailCnt = 0;#ifdef WDS_SUPPORT			pEntry->LockEntryTx = FALSE;			pEntry->TimeStamp_toTxRing = 0;#endif // WDS_SUPPORT //			InitializeQueueHeader(&pEntry->PsQueue);			pAd->MacTab.Size ++;			// Add this entry into ASIC RX WCID search table			RTMP_STA_ENTRY_ADD(pAd, 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:		Delete a specified client from MAC table	========================================================================== */BOOLEAN MacTableDeleteEntry(	IN PRTMP_ADAPTER pAd,	IN USHORT wcid,	IN PUCHAR pAddr){	USHORT HashIdx;	MAC_TABLE_ENTRY *pEntry, *pPrevEntry, *pProbeEntry;	BOOLEAN Cancelled;	//USHORT	offset;	// unused variable	//UCHAR	j;			// unused variable	if (wcid >= MAX_LEN_OF_MAC_TABLE)		return FALSE;	NdisAcquireSpinLock(&pAd->MacTabLock);	HashIdx = MAC_ADDR_HASH_INDEX(pAddr);	//pEntry = pAd->MacTab.Hash[HashIdx];	pEntry = &pAd->MacTab.Content[wcid];	if (pEntry && (pEntry->ValidAsCLI || pEntry->ValidAsApCli || pEntry->ValidAsWDS || pEntry->ValidAsMesh#ifdef CONFIG_STA_SUPPORT#ifdef QOS_DLS_SUPPORT 		|| pEntry->ValidAsDls#endif // QOS_DLS_SUPPORT //#endif // CONFIG_STA_SUPPORT //		))	{		if (MAC_ADDR_EQUAL(pEntry->Addr, pAddr))		{			// Delete this entry from ASIC on-chip WCID Table			RTMP_STA_ENTRY_MAC_RESET(pAd, wcid);

⌨️ 快捷键说明

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