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

📄 rt_linux.c

📁 ralink最新rt3070 usb wifi 无线网卡驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/* ************************************************************************* * Ralink Tech Inc. * 5F., No.36, Taiyuan St., Jhubei City, * Hsinchu County 302, * Taiwan, R.O.C. * * (c) Copyright 2002-2007, Ralink Technology, Inc. * * This program is free software; you can redistribute it and/or modify  *  * it under the terms of the GNU General Public License as published by  *  * the Free Software Foundation; either version 2 of the License, or     *  * (at your option) any later version.                                   *  *                                                                       *  * This program is distributed in the hope that it will be useful,       *  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *  * GNU General Public License for more details.                          *  *                                                                       *  * You should have received a copy of the GNU General Public License     *  * along with this program; if not, write to the                         *  * Free Software Foundation, Inc.,                                       *  * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *  *                                                                       *  ************************************************************************* */#include "rt_config.h"ULONG	RTDebugLevel = RT_DEBUG_ERROR;BUILD_TIMER_FUNCTION(MlmePeriodicExec);//BUILD_TIMER_FUNCTION(MlmeRssiReportExec);BUILD_TIMER_FUNCTION(AsicRxAntEvalTimeout);BUILD_TIMER_FUNCTION(APSDPeriodicExec);BUILD_TIMER_FUNCTION(AsicRfTuningExec);#ifdef RT2870BUILD_TIMER_FUNCTION(BeaconUpdateExec);#endif // RT2870 //#ifdef CONFIG_STA_SUPPORTBUILD_TIMER_FUNCTION(BeaconTimeout);BUILD_TIMER_FUNCTION(ScanTimeout);BUILD_TIMER_FUNCTION(AuthTimeout);BUILD_TIMER_FUNCTION(AssocTimeout);BUILD_TIMER_FUNCTION(ReassocTimeout);BUILD_TIMER_FUNCTION(DisassocTimeout);BUILD_TIMER_FUNCTION(LinkDownExec);#ifdef LEAP_SUPPORTBUILD_TIMER_FUNCTION(LeapAuthTimeout);#endifBUILD_TIMER_FUNCTION(StaQuickResponeForRateUpExec);BUILD_TIMER_FUNCTION(WpaDisassocApAndBlockAssoc);#ifdef QOS_DLS_SUPPORTBUILD_TIMER_FUNCTION(DlsTimeoutAction);#endif // QOS_DLS_SUPPORT //#endif // CONFIG_STA_SUPPORT //// for wireless system event messagechar const *pWirelessSysEventText[IW_SYS_EVENT_TYPE_NUM] = {    	// system status event         "had associated successfully",							/* IW_ASSOC_EVENT_FLAG */    "had disassociated",									/* IW_DISASSOC_EVENT_FLAG */    "had deauthenticated",									/* IW_DEAUTH_EVENT_FLAG */    "had been aged-out and disassociated",					/* IW_AGEOUT_EVENT_FLAG */    "occurred CounterMeasures attack",						/* IW_COUNTER_MEASURES_EVENT_FLAG */	    "occurred replay counter different in Key Handshaking",	/* IW_REPLAY_COUNTER_DIFF_EVENT_FLAG */    "occurred RSNIE different in Key Handshaking",			/* IW_RSNIE_DIFF_EVENT_FLAG */    "occurred MIC different in Key Handshaking",			/* IW_MIC_DIFF_EVENT_FLAG */    "occurred ICV error in RX",								/* IW_ICV_ERROR_EVENT_FLAG */    "occurred MIC error in RX",								/* IW_MIC_ERROR_EVENT_FLAG */	"Group Key Handshaking timeout",						/* IW_GROUP_HS_TIMEOUT_EVENT_FLAG */ 	"Pairwise Key Handshaking timeout",						/* IW_PAIRWISE_HS_TIMEOUT_EVENT_FLAG */ 	"RSN IE sanity check failure",							/* IW_RSNIE_SANITY_FAIL_EVENT_FLAG */ 	"set key done in WPA/WPAPSK",							/* IW_SET_KEY_DONE_WPA1_EVENT_FLAG */ 	"set key done in WPA2/WPA2PSK",                         /* IW_SET_KEY_DONE_WPA2_EVENT_FLAG */ 	"connects with our wireless client",                    /* IW_STA_LINKUP_EVENT_FLAG */ 	"disconnects with our wireless client",                 /* IW_STA_LINKDOWN_EVENT_FLAG */	"scan completed"										/* IW_SCAN_COMPLETED_EVENT_FLAG */	"scan terminate!! Busy!! Enqueue fail!!"				/* IW_SCAN_ENQUEUE_FAIL_EVENT_FLAG */	};						// for wireless IDS_spoof_attack event messagechar const *pWirelessSpoofEventText[IW_SPOOF_EVENT_TYPE_NUM] = {   	    "detected conflict SSID",								/* IW_CONFLICT_SSID_EVENT_FLAG */    "detected spoofed association response",				/* IW_SPOOF_ASSOC_RESP_EVENT_FLAG */    "detected spoofed reassociation responses",				/* IW_SPOOF_REASSOC_RESP_EVENT_FLAG */    "detected spoofed probe response",						/* IW_SPOOF_PROBE_RESP_EVENT_FLAG */    "detected spoofed beacon",								/* IW_SPOOF_BEACON_EVENT_FLAG */    "detected spoofed disassociation",						/* IW_SPOOF_DISASSOC_EVENT_FLAG */    "detected spoofed authentication",						/* IW_SPOOF_AUTH_EVENT_FLAG */    "detected spoofed deauthentication",					/* IW_SPOOF_DEAUTH_EVENT_FLAG */    "detected spoofed unknown management frame",			/* IW_SPOOF_UNKNOWN_MGMT_EVENT_FLAG */	"detected replay attack"								/* IW_REPLAY_ATTACK_EVENT_FLAG */		};// for wireless IDS_flooding_attack event messagechar const *pWirelessFloodEventText[IW_FLOOD_EVENT_TYPE_NUM] = {   		"detected authentication flooding",						/* IW_FLOOD_AUTH_EVENT_FLAG */    "detected association request flooding",				/* IW_FLOOD_ASSOC_REQ_EVENT_FLAG */    "detected reassociation request flooding",				/* IW_FLOOD_REASSOC_REQ_EVENT_FLAG */    "detected probe request flooding",						/* IW_FLOOD_PROBE_REQ_EVENT_FLAG */    "detected disassociation flooding",						/* IW_FLOOD_DISASSOC_EVENT_FLAG */    "detected deauthentication flooding",					/* IW_FLOOD_DEAUTH_EVENT_FLAG */    "detected 802.1x eap-request flooding"					/* IW_FLOOD_EAP_REQ_EVENT_FLAG */		};/* timeout -- ms */VOID RTMP_SetPeriodicTimer(	IN	NDIS_MINIPORT_TIMER *pTimer, 	IN	unsigned long timeout){	timeout = ((timeout*HZ) / 1000);	pTimer->expires = jiffies + timeout;	add_timer(pTimer);}/* convert NdisMInitializeTimer --> RTMP_OS_Init_Timer */VOID RTMP_OS_Init_Timer(	IN	PRTMP_ADAPTER pAd,	IN	NDIS_MINIPORT_TIMER *pTimer, 	IN	TIMER_FUNCTION function,	IN	PVOID data){	init_timer(pTimer);    pTimer->data = (unsigned long)data;    pTimer->function = function;		}VOID RTMP_OS_Add_Timer(	IN	NDIS_MINIPORT_TIMER		*pTimer,	IN	unsigned long timeout){	if (timer_pending(pTimer))		return;	timeout = ((timeout*HZ) / 1000);	pTimer->expires = jiffies + timeout;	add_timer(pTimer);}VOID RTMP_OS_Mod_Timer(	IN	NDIS_MINIPORT_TIMER		*pTimer,	IN	unsigned long timeout){	timeout = ((timeout*HZ) / 1000);	mod_timer(pTimer, jiffies + timeout);}VOID RTMP_OS_Del_Timer(	IN	NDIS_MINIPORT_TIMER		*pTimer,	OUT	BOOLEAN					*pCancelled){	if (timer_pending(pTimer))	{			*pCancelled = del_timer_sync(pTimer);		}	else	{		*pCancelled = TRUE;	}	}VOID RTMP_OS_Release_Packet(	IN	PRTMP_ADAPTER pAd,	IN	PQUEUE_ENTRY  pEntry){	//RTMPFreeNdisPacket(pAd, (struct sk_buff *)pEntry);}	// Unify all delay routine by using udelayVOID RTMPusecDelay(	IN	ULONG	usec){	ULONG	i;	for (i = 0; i < (usec / 50); i++)		udelay(50);	if (usec % 50)		udelay(usec % 50);}void RTMP_GetCurrentSystemTime(LARGE_INTEGER *time){	time->u.LowPart = jiffies;}// pAd MUST allow to be NULLNDIS_STATUS os_alloc_mem(	IN	PRTMP_ADAPTER pAd,	OUT	PUCHAR *mem,	IN	ULONG  size){		*mem = (PUCHAR) kmalloc(size, GFP_ATOMIC);	if (*mem)		return (NDIS_STATUS_SUCCESS);	else		return (NDIS_STATUS_FAILURE);}// pAd MUST allow to be NULLNDIS_STATUS os_free_mem(	IN	PRTMP_ADAPTER pAd,	IN	PUCHAR mem){		ASSERT(mem);	kfree(mem);	return (NDIS_STATUS_SUCCESS);}PNDIS_PACKET RTMP_AllocateFragPacketBuffer(	IN	PRTMP_ADAPTER pAd,	IN	ULONG	Length){	struct sk_buff *pkt;	pkt = dev_alloc_skb(Length);	if (pkt == NULL)	{		DBGPRINT(RT_DEBUG_ERROR, ("can't allocate frag rx %ld size packet\n",Length));	}	if (pkt)	{		RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);	}		return (PNDIS_PACKET) pkt;	}PNDIS_PACKET RTMP_AllocateTxPacketBuffer(	IN	PRTMP_ADAPTER pAd,	IN	ULONG	Length,	IN	BOOLEAN	Cached,	OUT	PVOID	*VirtualAddress){	struct sk_buff *pkt;	pkt = dev_alloc_skb(Length);	if (pkt == NULL)	{		DBGPRINT(RT_DEBUG_ERROR, ("can't allocate tx %ld size packet\n",Length));	}	if (pkt)	{		RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);		*VirtualAddress = (PVOID) pkt->data;		}	else	{		*VirtualAddress = (PVOID) NULL;	}		return (PNDIS_PACKET) pkt;	}VOID build_tx_packet(	IN	PRTMP_ADAPTER	pAd,	IN	PNDIS_PACKET	pPacket,	IN	PUCHAR	pFrame,	IN	ULONG	FrameLen){	struct sk_buff	*pTxPkt;	ASSERT(pPacket);	pTxPkt = RTPKT_TO_OSPKT(pPacket);	NdisMoveMemory(skb_put(pTxPkt, FrameLen), pFrame, FrameLen);	}VOID	RTMPFreeAdapter(	IN	PRTMP_ADAPTER	pAd){    POS_COOKIE os_cookie;	int index;		os_cookie=(POS_COOKIE)pAd->OS_Cookie;	kfree(pAd->BeaconBuf);	NdisFreeSpinLock(&pAd->MgmtRingLock);		for (index =0 ; index < NUM_OF_TX_RING; index++)	{    	NdisFreeSpinLock(&pAd->TxSwQueueLock[index]);		NdisFreeSpinLock(&pAd->DeQueueLock[index]);		pAd->DeQueueRunning[index] = FALSE;	}		NdisFreeSpinLock(&pAd->irq_lock);	vfree(pAd); // pci_free_consistent(os_cookie->pci_dev,sizeof(RTMP_ADAPTER),pAd,os_cookie->pAd_pa);	kfree(os_cookie);}BOOLEAN OS_Need_Clone_Packet(void){	return (FALSE);	}/*	========================================================================	Routine Description:		clone an input NDIS PACKET to another one. The new internally created NDIS PACKET		must have only one NDIS BUFFER		return - byte copied. 0 means can't create NDIS PACKET		NOTE: internally created NDIS_PACKET should be destroyed by RTMPFreeNdisPacket			Arguments:		pAd 	Pointer to our adapter		pInsAMSDUHdr	EWC A-MSDU format has extra 14-bytes header. if TRUE, insert this 14-byte hdr in front of MSDU.		*pSrcTotalLen			return total packet length. This lenght is calculated with 802.3 format packet.			Return Value:		NDIS_STATUS_SUCCESS 			NDIS_STATUS_FAILURE 				Note:		========================================================================*/NDIS_STATUS RTMPCloneNdisPacket(	IN	PRTMP_ADAPTER	pAd,	IN	BOOLEAN			pInsAMSDUHdr,	IN	PNDIS_PACKET	pInPacket,	OUT PNDIS_PACKET   *ppOutPacket){	struct sk_buff *pkt;	ASSERT(pInPacket);	ASSERT(ppOutPacket);	// 1. Allocate a packet 	pkt = dev_alloc_skb(2048);		if (pkt == NULL)	{		return NDIS_STATUS_FAILURE;	} 	skb_put(pkt, GET_OS_PKT_LEN(pInPacket));	NdisMoveMemory(pkt->data, GET_OS_PKT_DATAPTR(pInPacket), GET_OS_PKT_LEN(pInPacket));  	*ppOutPacket = OSPKT_TO_RTPKT(pkt);	RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);	printk("###Clone###\n");	return NDIS_STATUS_SUCCESS;}// the allocated NDIS PACKET must be freed via RTMPFreeNdisPacket()NDIS_STATUS RTMPAllocateNdisPacket(	IN	PRTMP_ADAPTER	pAd,	OUT PNDIS_PACKET   *ppPacket,	IN	PUCHAR			pHeader,	IN	UINT			HeaderLen,	IN	PUCHAR			pData,	IN	UINT			DataLen){	PNDIS_PACKET	pPacket;	ASSERT(pData);	ASSERT(DataLen);	// 1. Allocate a packet 	pPacket = (PNDIS_PACKET *) dev_alloc_skb(HeaderLen + DataLen + TXPADDING_SIZE);	if (pPacket == NULL) 	{		*ppPacket = NULL;#ifdef DEBUG		printk("RTMPAllocateNdisPacket Fail\n\n");#endif		return NDIS_STATUS_FAILURE;	}	// 2. clone the frame content	if (HeaderLen > 0)		NdisMoveMemory(GET_OS_PKT_DATAPTR(pPacket), pHeader, HeaderLen);	if (DataLen > 0)		NdisMoveMemory(GET_OS_PKT_DATAPTR(pPacket) + HeaderLen, pData, DataLen);	// 3. update length of packet 	skb_put(GET_OS_PKT_TYPE(pPacket), HeaderLen+DataLen);	RTMP_SET_PACKET_SOURCE(pPacket, PKTSRC_NDIS);//	printk("%s : pPacket = %p, len = %d\n", __FUNCTION__, pPacket, GET_OS_PKT_LEN(pPacket));	*ppPacket = pPacket;	return NDIS_STATUS_SUCCESS;}/*  ========================================================================  Description:	This routine frees a miniport internally allocated NDIS_PACKET and its	corresponding NDIS_BUFFER and allocated memory.  ========================================================================*/VOID RTMPFreeNdisPacket(	IN PRTMP_ADAPTER pAd,	IN PNDIS_PACKET  pPacket){	dev_kfree_skb_any(RTPKT_TO_OSPKT(pPacket));}// IRQL = DISPATCH_LEVEL// NOTE: we do have an assumption here, that Byte0 and Byte1 always reasid at the same //			 scatter gather bufferNDIS_STATUS Sniff2BytesFromNdisBuffer(	IN	PNDIS_BUFFER	pFirstBuffer,	IN	UCHAR			DesiredOffset,	OUT PUCHAR			pByte0,	OUT PUCHAR			pByte1){    *pByte0 = *(PUCHAR)(pFirstBuffer + DesiredOffset);    *pByte1 = *(PUCHAR)(pFirstBuffer + DesiredOffset + 1);	return NDIS_STATUS_SUCCESS;}void RTMP_QueryPacketInfo(	IN  PNDIS_PACKET pPacket,	OUT PACKET_INFO  *pPacketInfo,	OUT PUCHAR		 *pSrcBufVA,	OUT	UINT		 *pSrcBufLen){	pPacketInfo->BufferCount = 1;	pPacketInfo->pFirstBuffer = GET_OS_PKT_DATAPTR(pPacket);	pPacketInfo->PhysicalBufferCount = 1;	pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket);	*pSrcBufVA = GET_OS_PKT_DATAPTR(pPacket);	*pSrcBufLen = GET_OS_PKT_LEN(pPacket); 	}void RTMP_QueryNextPacketInfo(	IN  PNDIS_PACKET *ppPacket,	OUT PACKET_INFO  *pPacketInfo,	OUT PUCHAR		 *pSrcBufVA,	OUT	UINT		 *pSrcBufLen){	PNDIS_PACKET pPacket = NULL;	if (*ppPacket)		pPacket = GET_OS_PKT_NEXT(*ppPacket);	if (pPacket)	{		pPacketInfo->BufferCount = 1;		pPacketInfo->pFirstBuffer = GET_OS_PKT_DATAPTR(pPacket);		pPacketInfo->PhysicalBufferCount = 1;		pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket);		*pSrcBufVA = GET_OS_PKT_DATAPTR(pPacket);		*pSrcBufLen = GET_OS_PKT_LEN(pPacket); 			*ppPacket = GET_OS_PKT_NEXT(pPacket);			}	else	{		pPacketInfo->BufferCount = 0;		pPacketInfo->pFirstBuffer = NULL;		pPacketInfo->PhysicalBufferCount = 0;		pPacketInfo->TotalPacketLength = 0;		*pSrcBufVA = NULL;		*pSrcBufLen = 0; 			*ppPacket = NULL;	}}// not yet support MBSSPNET_DEV get_netdev_from_bssid(	IN	PRTMP_ADAPTER	pAd,	IN	UCHAR			FromWhichBSSID){    PNET_DEV dev_p = NULL;#ifdef CONFIG_STA_SUPPORT	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)	{		dev_p = pAd->net_dev;	}#endif // CONFIG_STA_SUPPORT //	ASSERT(dev_p);	return dev_p; /* return one of MBSS */}	PNDIS_PACKET DuplicatePacket(	IN	PRTMP_ADAPTER	pAd, 	IN	PNDIS_PACKET	pPacket,	IN	UCHAR			FromWhichBSSID){	struct sk_buff	*skb;	PNDIS_PACKET	pRetPacket = NULL;	USHORT			DataSize;	UCHAR			*pData;	DataSize = (USHORT) GET_OS_PKT_LEN(pPacket);	pData = (PUCHAR) GET_OS_PKT_DATAPTR(pPacket);		skb = skb_clone(RTPKT_TO_OSPKT(pPacket), MEM_ALLOC_FLAG);	if (skb)	{

⌨️ 快捷键说明

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