cmm_data.c

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

C
2,434
字号
				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->ContinueTxFailCnt = 0;			InitializeQueueHeader(&pEntry->PsQueue);			pAd->MacTab.Size ++;			// Add this entry into ASIC RX WCID search table			RT28XX_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			RT28XX_STA_ENTRY_MAC_RESET(pAd, wcid);#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);			RT28XX_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		{			printk("\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*/);		RT28XX_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 RT2870			NdisZeroMemory(pAd->MacTab.Content[i].Addr, 6);			RT28XX_STA_ENTRY_MAC_RESET(pAd, i);#endif // RT2870 //			//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(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(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(*((UINT16 *)pSrcBuf));					dstPort = OS_NTOHS(*((UINT16 *)(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

⌨️ 快捷键说明

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