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

📄 rt_linux.c

📁 ralink最新rt3070 usb wifi 无线网卡驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
		skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);		pRetPacket = OSPKT_TO_RTPKT(skb);	}	return pRetPacket;}PNDIS_PACKET duplicate_pkt(	IN	PRTMP_ADAPTER	pAd, 	IN	PUCHAR			pHeader802_3,    IN  UINT            HdrLen,	IN	PUCHAR			pData,	IN	ULONG			DataSize,	IN	UCHAR			FromWhichBSSID){	struct sk_buff	*skb;	PNDIS_PACKET	pPacket = NULL;	if ((skb = __dev_alloc_skb(HdrLen + DataSize + 2, MEM_ALLOC_FLAG)) != NULL)	{		skb_reserve(skb, 2);						NdisMoveMemory(skb->tail, pHeader802_3, HdrLen);		skb_put(skb, HdrLen);		NdisMoveMemory(skb->tail, pData, DataSize);		skb_put(skb, DataSize);		skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);		pPacket = OSPKT_TO_RTPKT(skb);	}	return pPacket;}#define TKIP_TX_MIC_SIZE		8PNDIS_PACKET duplicate_pkt_with_TKIP_MIC(	IN	PRTMP_ADAPTER	pAd,	IN	PNDIS_PACKET	pPacket){	struct sk_buff	*skb, *newskb;		skb = RTPKT_TO_OSPKT(pPacket);	if (skb_tailroom(skb) < TKIP_TX_MIC_SIZE)	{		// alloc a new skb and copy the packet		newskb = skb_copy_expand(skb, skb_headroom(skb), TKIP_TX_MIC_SIZE, GFP_ATOMIC);		dev_kfree_skb_any(skb);		if (newskb == NULL)		{			DBGPRINT(RT_DEBUG_ERROR, ("Extend Tx.MIC for packet failed!, dropping packet!\n"));			return NULL;		}		skb = newskb;	}	return OSPKT_TO_RTPKT(skb);}PNDIS_PACKET ClonePacket(	IN	PRTMP_ADAPTER	pAd, 	IN	PNDIS_PACKET	pPacket,		IN	PUCHAR			pData,	IN	ULONG			DataSize){	struct sk_buff	*pRxPkt;	struct sk_buff	*pClonedPkt;	ASSERT(pPacket);	pRxPkt = RTPKT_TO_OSPKT(pPacket);	// clone the packet 	pClonedPkt = skb_clone(pRxPkt, MEM_ALLOC_FLAG);	if (pClonedPkt)	{    	// set the correct dataptr and data len    	pClonedPkt->dev = pRxPkt->dev;    	pClonedPkt->data = pData;    	pClonedPkt->len = DataSize;    	pClonedPkt->tail = pClonedPkt->data + pClonedPkt->len;		ASSERT(DataSize < 1530);	}	return pClonedPkt;}// // change OS packet DataPtr and DataLen// void  update_os_packet_info(	IN	PRTMP_ADAPTER	pAd, 	IN	RX_BLK			*pRxBlk,	IN  UCHAR			FromWhichBSSID){	struct sk_buff	*pOSPkt;	ASSERT(pRxBlk->pRxPacket);	pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);	pOSPkt->dev = get_netdev_from_bssid(pAd, FromWhichBSSID); 	pOSPkt->data = pRxBlk->pData;	pOSPkt->len = pRxBlk->DataSize;	pOSPkt->tail = pOSPkt->data + pOSPkt->len;}void wlan_802_11_to_802_3_packet(	IN	PRTMP_ADAPTER	pAd, 	IN	RX_BLK			*pRxBlk,	IN	PUCHAR			pHeader802_3,	IN  UCHAR			FromWhichBSSID){	struct sk_buff	*pOSPkt;	ASSERT(pRxBlk->pRxPacket);	ASSERT(pHeader802_3);	pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);	pOSPkt->dev = get_netdev_from_bssid(pAd, FromWhichBSSID); 	pOSPkt->data = pRxBlk->pData;	pOSPkt->len = pRxBlk->DataSize;	pOSPkt->tail = pOSPkt->data + pOSPkt->len;	//	// copy 802.3 header	// 	// #ifdef CONFIG_STA_SUPPORT	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)		NdisMoveMemory(skb_push(pOSPkt, LENGTH_802_3), pHeader802_3, LENGTH_802_3);#endif // CONFIG_STA_SUPPORT //	}void announce_802_3_packet(	IN	PRTMP_ADAPTER	pAd, 	IN	PNDIS_PACKET	pPacket){	struct sk_buff	*pRxPkt;	ASSERT(pPacket);	pRxPkt = RTPKT_TO_OSPKT(pPacket);#ifdef CONFIG_STA_SUPPORT#endif // CONFIG_STA_SUPPORT //    /* Push up the protocol stack */#ifdef IKANOS_VX_1X0	IKANOS_DataFrameRx(pAd, pRxPkt->dev, pRxPkt, pRxPkt->len);#else	pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev);//#ifdef CONFIG_5VT_ENHANCE//	*(int*)(pRxPkt->cb) = BRIDGE_TAG; //#endif	netif_rx(pRxPkt);#endif // IKANOS_VX_1X0 //}PRTMP_SCATTER_GATHER_LISTrt_get_sg_list_from_packet(PNDIS_PACKET pPacket, RTMP_SCATTER_GATHER_LIST *sg){	sg->NumberOfElements = 1;	sg->Elements[0].Address =  GET_OS_PKT_DATAPTR(pPacket);		sg->Elements[0].Length = GET_OS_PKT_LEN(pPacket);		return (sg);}void hex_dump(char *str, unsigned char *pSrcBufVA, unsigned int SrcBufLen){	unsigned char *pt;	int x;	if (RTDebugLevel < RT_DEBUG_TRACE)		return;		pt = pSrcBufVA;	printk("%s: %p, len = %d\n",str,  pSrcBufVA, SrcBufLen);	for (x=0; x<SrcBufLen; x++)	{		if (x % 16 == 0) 			printk("0x%04x : ", x);		printk("%02x ", ((unsigned char)pt[x]));		if (x%16 == 15) printk("\n");	}	printk("\n");}/*	========================================================================		Routine Description:		Send log message through wireless event		Support standard iw_event with IWEVCUSTOM. It is used below.		iwreq_data.data.flags is used to store event_flag that is defined by user. 		iwreq_data.data.length is the length of the event log.		The format of the event log is composed of the entry's MAC address and		the desired log message (refer to pWirelessEventText).			ex: 11:22:33:44:55:66 has associated successfully		p.s. The requirement of Wireless Extension is v15 or newer. 	========================================================================*/VOID RTMPSendWirelessEvent(	IN	PRTMP_ADAPTER	pAd,	IN	USHORT			Event_flag,	IN	PUCHAR 			pAddr,	IN	UCHAR			BssIdx,	IN	CHAR			Rssi){#if WIRELESS_EXT >= 15	union 	iwreq_data      wrqu;	PUCHAR 	pBuf = NULL, pBufPtr = NULL;	USHORT	event, type, BufLen;		UCHAR	event_table_len = 0;	type = Event_flag & 0xFF00;		event = Event_flag & 0x00FF;	switch (type)	{		case IW_SYS_EVENT_FLAG_START:			event_table_len = IW_SYS_EVENT_TYPE_NUM;			break;		case IW_SPOOF_EVENT_FLAG_START:			event_table_len = IW_SPOOF_EVENT_TYPE_NUM;			break;		case IW_FLOOD_EVENT_FLAG_START:			event_table_len = IW_FLOOD_EVENT_TYPE_NUM;			break;	}		if (event_table_len == 0)	{		DBGPRINT(RT_DEBUG_ERROR, ("%s : The type(%0x02x) is not valid.\n", __FUNCTION__, type));			       		       				return;	}		if (event >= event_table_len)	{		DBGPRINT(RT_DEBUG_ERROR, ("%s : The event(%0x02x) is not valid.\n", __FUNCTION__, event));			       		       				return;	}	 	//Allocate memory and copy the msg.	if((pBuf = kmalloc(IW_CUSTOM_MAX_LEN, GFP_ATOMIC)) != NULL)	{		//Prepare the payload 		memset(pBuf, 0, IW_CUSTOM_MAX_LEN);		pBufPtr = pBuf;				if (pAddr)			pBufPtr += sprintf(pBufPtr, "(RT2860) STA(%02x:%02x:%02x:%02x:%02x:%02x) ", PRINT_MAC(pAddr));						else if (BssIdx < MAX_MBSSID_NUM)			pBufPtr += sprintf(pBufPtr, "(RT2860) BSS(ra%d) ", BssIdx);		else			pBufPtr += sprintf(pBufPtr, "(RT2860) ");		if (type == IW_SYS_EVENT_FLAG_START)			pBufPtr += sprintf(pBufPtr, "%s", pWirelessSysEventText[event]);		else if (type == IW_SPOOF_EVENT_FLAG_START)			pBufPtr += sprintf(pBufPtr, "%s (RSSI=%d)", pWirelessSpoofEventText[event], Rssi);		else if (type == IW_FLOOD_EVENT_FLAG_START)			pBufPtr += sprintf(pBufPtr, "%s", pWirelessFloodEventText[event]);		else			pBufPtr += sprintf(pBufPtr, "%s", "unknown event");				pBufPtr[pBufPtr - pBuf] = '\0';		BufLen = pBufPtr - pBuf;				memset(&wrqu, 0, sizeof(wrqu));		    wrqu.data.flags = Event_flag;		wrqu.data.length = BufLen;					//send wireless event	    wireless_send_event(pAd->net_dev, IWEVCUSTOM, &wrqu, pBuf);			//DBGPRINT(RT_DEBUG_TRACE, ("%s : %s\n", __FUNCTION__, pBuf));				kfree(pBuf);	}	else		DBGPRINT(RT_DEBUG_ERROR, ("%s : Can't allocate memory for wireless event.\n", __FUNCTION__));			       		       				#else	DBGPRINT(RT_DEBUG_ERROR, ("%s : The Wireless Extension MUST be v15 or newer.\n", __FUNCTION__));	#endif  /* WIRELESS_EXT >= 15 */  }#ifdef CONFIG_STA_SUPPORTvoid send_monitor_packets(	IN	PRTMP_ADAPTER	pAd, 	IN	RX_BLK			*pRxBlk){   	    struct sk_buff	*pOSPkt;    wlan_ng_prism2_header *ph;    int rate_index = 0;    USHORT header_len = 0;    UCHAR temp_header[40] = {0};    u_int32_t ralinkrate[256] = {2,4,11,22, 12,18,24,36,48,72,96,  108,   109, 110, 111, 112, 13, 26, 39, 52,78,104, 117, 130, 26, 52, 78,104, 156, 208, 234, 260, 27, 54,81,108,162, 216, 243, 270, // Last 38	54, 108, 162, 216, 324, 432, 486, 540,  14, 29, 43, 57, 87, 115, 130, 144, 29, 59,87,115, 173, 230,260, 288, 30, 60,90,120,180,240,270,300,60,120,180,240,360,480,540,600, 0,1,2,3,4,5,6,7,8,9,10,	11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80};        ASSERT(pRxBlk->pRxPacket);    if (pRxBlk->DataSize < 10)    {        DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too small! (%d)\n", __FUNCTION__, pRxBlk->DataSize));		goto err_free_sk_buff;    }    if (pRxBlk->DataSize + sizeof(wlan_ng_prism2_header) > RX_BUFFER_AGGRESIZE)    {        DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too large! (%d)\n", __FUNCTION__, pRxBlk->DataSize + sizeof(wlan_ng_prism2_header)));		goto err_free_sk_buff;    }            pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);	pOSPkt->dev = get_netdev_from_bssid(pAd, BSS0);     if (pRxBlk->pHeader->FC.Type == BTYPE_DATA)    {        pRxBlk->DataSize -= LENGTH_802_11;        if ((pRxBlk->pHeader->FC.ToDs == 1) &&            (pRxBlk->pHeader->FC.FrDs == 1))            header_len = LENGTH_802_11_WITH_ADDR4;        else            header_len = LENGTH_802_11;        // QOS    	if (pRxBlk->pHeader->FC.SubType & 0x08)    	{    	    header_len += 2;    		// Data skip QOS contorl field    		pRxBlk->DataSize -=2;    	}    	// Order bit: A-Ralink or HTC+    	if (pRxBlk->pHeader->FC.Order)    	{    	    header_len += 4;			// Data skip HTC contorl field			pRxBlk->DataSize -= 4;    	}        // Copy Header        if (header_len <= 40)            NdisMoveMemory(temp_header, pRxBlk->pData, header_len);        // skip HW padding     	if (pRxBlk->RxD.L2PAD)    	    pRxBlk->pData += (header_len + 2);        else            pRxBlk->pData += header_len;    } //end if	if (pRxBlk->DataSize < pOSPkt->len) {        skb_trim(pOSPkt,pRxBlk->DataSize);    } else {        skb_put(pOSPkt,(pRxBlk->DataSize - pOSPkt->len));    } //end if    if ((pRxBlk->pData - pOSPkt->data) > 0) {	    skb_put(pOSPkt,(pRxBlk->pData - pOSPkt->data));	    skb_pull(pOSPkt,(pRxBlk->pData - pOSPkt->data));    } //end if    if (skb_headroom(pOSPkt) < (sizeof(wlan_ng_prism2_header)+ header_len)) {        if (pskb_expand_head(pOSPkt, (sizeof(wlan_ng_prism2_header) + header_len), 0, GFP_ATOMIC)) {	        DBGPRINT(RT_DEBUG_ERROR, ("%s : Reallocate header size of sk_buff fail!\n", __FUNCTION__));			goto err_free_sk_buff;	    } //end if    } //end if    if (header_len > 0)        NdisMoveMemory(skb_push(pOSPkt, header_len), temp_header, header_len);    ph = (wlan_ng_prism2_header *) skb_push(pOSPkt, sizeof(wlan_ng_prism2_header));	NdisZeroMemory(ph, sizeof(wlan_ng_prism2_header));        ph->msgcode		    = DIDmsg_lnxind_wlansniffrm;	ph->msglen		    = sizeof(wlan_ng_prism2_header);	strcpy(ph->devname, pAd->net_dev->name);    ph->hosttime.did = DIDmsg_lnxind_wlansniffrm_hosttime;	ph->hosttime.status = 0;	ph->hosttime.len = 4;	ph->hosttime.data = jiffies;	ph->mactime.did = DIDmsg_lnxind_wlansniffrm_mactime;	ph->mactime.status = 0;	ph->mactime.len = 0;	ph->mactime.data = 0;    ph->istx.did = DIDmsg_lnxind_wlansniffrm_istx;	ph->istx.status = 0;	ph->istx.len = 0;	ph->istx.data = 0;     ph->channel.did = DIDmsg_lnxind_wlansniffrm_channel;	ph->channel.status = 0;	ph->channel.len = 4;    ph->channel.data = (u_int32_t)pAd->CommonCfg.Channel;    ph->rssi.did = DIDmsg_lnxind_wlansniffrm_rssi;	ph->rssi.status = 0;	ph->rssi.len = 4;    ph->rssi.data = (u_int32_t)RTMPMaxRssi(pAd, ConvertToRssi(pAd, pRxBlk->pRxWI->RSSI0, RSSI_0), ConvertToRssi(pAd, pRxBlk->pRxWI->RSSI1, RSSI_1), ConvertToRssi(pAd, pRxBlk->pRxWI->RSSI2, RSSI_2));;            	ph->signal.did = DIDmsg_lnxind_wlansniffrm_signal;	ph->signal.status = 0;	ph->signal.len = 4;	ph->signal.data = 0; //rssi + noise;            	ph->noise.did = DIDmsg_lnxind_wlansniffrm_noise;	ph->noise.status = 0;	ph->noise.len = 4;	ph->noise.data = 0;#ifdef DOT11_N_SUPPORT    if (pRxBlk->pRxWI->PHYMODE >= MODE_HTMIX)    {    	rate_index = 16 + ((UCHAR)pRxBlk->pRxWI->BW *16) + ((UCHAR)pRxBlk->pRxWI->ShortGI *32) + ((UCHAR)pRxBlk->pRxWI->MCS);    }    else#endif // DOT11_N_SUPPORT //	if (pRxBlk->pRxWI->PHYMODE == MODE_OFDM)    	rate_index = (UCHAR)(pRxBlk->pRxWI->MCS) + 4;    else     	rate_index = (UCHAR)(pRxBlk->pRxWI->MCS);    if (rate_index < 0)        rate_index = 0;    if (rate_index > 255)        rate_index = 255;    	ph->rate.did = DIDmsg_lnxind_wlansniffrm_rate;	ph->rate.status = 0;	ph->rate.len = 4;    ph->rate.data = ralinkrate[rate_index];	ph->frmlen.did = DIDmsg_lnxind_wlansniffrm_frmlen;    ph->frmlen.status = 0;	ph->frmlen.len = 4;	ph->frmlen.data	= (u_int32_t)pRxBlk->DataSize;            pOSPkt->pkt_type = PACKET_OTHERHOST;    pOSPkt->protocol = eth_type_trans(pOSPkt, pOSPkt->dev);    pOSPkt->ip_summed = CHECKSUM_NONE;    netif_rx(pOSPkt);        return;err_free_sk_buff:	RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);		return;	}#endif // CONFIG_STA_SUPPORT //void rtmp_os_thread_init(PUCHAR pThreadName, PVOID pNotify){#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)	daemonize(pThreadName /*"%s",pAd->net_dev->name*/);	allow_signal(SIGTERM);	allow_signal(SIGKILL);	current->flags |= PF_NOFREEZE;#else	unsigned long flags;	daemonize();	reparent_to_init();	strcpy(current->comm, pThreadName);	siginitsetinv(&current->blocked, sigmask(SIGTERM) | sigmask(SIGKILL));			/* Allow interception of SIGKILL only	 * Don't allow other signals to interrupt the transmission */#if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22)	spin_lock_irqsave(&current->sigmask_lock, flags);	flush_signals(current);	recalc_sigpending(current);	spin_unlock_irqrestore(&current->sigmask_lock, flags);#endif#endif	    /* signal that we've started the thread */	complete(pNotify);}void RTMP_IndicateMediaState(		IN	PRTMP_ADAPTER	pAd){		if (pAd->CommonCfg.bWirelessEvent)		{		if (pAd->IndicateMediaState == NdisMediaStateConnected)		{			RTMPSendWirelessEvent(pAd, IW_STA_LINKUP_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);		}		else		{										RTMPSendWirelessEvent(pAd, IW_STA_LINKDOWN_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0); 				}		}}

⌨️ 快捷键说明

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