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

📄 rt_linux.c

📁 Linux下的RT系列无线网卡驱动,可以直接在x86平台上编译
💻 C
📖 第 1 页 / 共 3 页
字号:
		skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);		pPacket = OSPKT_TO_RTPKT(skb);	}	return pPacket;}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	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);    /* Push up the protocol stack */	pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev);//#ifdef CONFIG_5VT_ENHANCE//	*(int*)(pRxPkt->cb) = BRIDGE_TAG; //#endif	netif_rx(pRxPkt);}/* * invaild or writeback cache  * and convert virtual address to physical address  */dma_addr_t linux_pci_map_single(void *handle, void *ptr, size_t size, int direction){	PRTMP_ADAPTER pAd;	POS_COOKIE pObj;		pAd = (PRTMP_ADAPTER)handle;	pObj = (POS_COOKIE)pAd->OS_Cookie;		return pci_map_single(pObj->pci_dev, ptr, size, direction);}void linux_pci_unmap_single(void *handle, dma_addr_t dma_addr, size_t size, int direction){	PRTMP_ADAPTER pAd;	POS_COOKIE pObj;	pAd=(PRTMP_ADAPTER)handle;	pObj = (POS_COOKIE)pAd->OS_Cookie;		pci_unmap_single(pObj->pci_dev, dma_addr, size, direction);	}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	MAC_TABLE_ENTRY *pEntry){#if WIRELESS_EXT >= 15	union 	iwreq_data      wrqu;	PUCHAR 	pBuf = NULL, pBufPtr = NULL;	USHORT	event, BufLen;		event = Event_flag & 0x00FF;	// sanity check	if (event > IW_EVENT_TYPE_NUM)	{		DBGPRINT(RT_DEBUG_ERROR, ("%s : The event(%d) is not valid.\n", __FUNCTION__, event));			       		       				return;	}		if (!pEntry)	{		DBGPRINT(RT_DEBUG_ERROR, ("%s : The Entry doesn't exist.\n", __FUNCTION__));			       		       				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;				pBufPtr += sprintf(pBufPtr, "(RT2860) %02x:%02x:%02x:%02x:%02x:%02x %s", PRINT_MAC(pEntry->Addr), pWirelessEventText[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);			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;    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);    pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);    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)));        RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);        return;    }        	pOSPkt->dev = get_netdev_from_bssid(pAd, BSS0);        if (pRxBlk->pHeader->FC.Type == BTYPE_DATA)    {        UCHAR header_len = LENGTH_802_11;        UCHAR temp_header[40] = {0};        pRxBlk->DataSize -= 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;        pOSPkt->data = pRxBlk->pData;    	pOSPkt->len = pRxBlk->DataSize;    	pOSPkt->tail = pOSPkt->data + pOSPkt->len;                        NdisMoveMemory(skb_push(pOSPkt, header_len), temp_header, header_len);    }    else     {        pOSPkt->data = pRxBlk->pData;    	pOSPkt->len = pRxBlk->DataSize;    	pOSPkt->tail = pOSPkt->data + pOSPkt->len;    }    if (skb_headroom(pOSPkt) < sizeof(wlan_ng_prism2_header))	    pskb_expand_head(pOSPkt, sizeof(wlan_ng_prism2_header), 0, GFP_ATOMIC);    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;    if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED &&        pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)	    ph->channel.data = (u_int32_t)pAd->CommonCfg.CentralChannel;    else        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;    if (pRxBlk->pRxWI->PHYMODE >= MODE_HTMIX)    {    	rate_index = 16 + ((UCHAR)pRxBlk->pRxWI->BW *16) + ((UCHAR)pRxBlk->pRxWI->ShortGI *32) + ((UCHAR)pRxBlk->pRxWI->MCS);    }    else 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;}#endif // CONFIG_STA_SUPPORT //

⌨️ 快捷键说明

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