亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? ethertap.c

?? powerpc內(nèi)核mpc8241linux系統(tǒng)下net驅(qū)動(dòng)程序
?? C
字號:
/* *	Ethertap: A network device for bouncing packets via user space * *	This is a very simple ethernet driver. It bounces ethernet frames *	to user space on /dev/tap0->/dev/tap15 and expects ethernet frames *	to be written back to it. By default it does not ARP. If you turn ARP *	on it will attempt to ARP the user space and reply to ARPS from the *	user space. * *	As this is an ethernet device you can use it for appletalk, IPX etc *	even for building bridging tunnels. */ #include <linux/config.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/sched.h>#include <linux/malloc.h>#include <linux/string.h>#include <linux/errno.h>#include <linux/netdevice.h>#include <linux/inetdevice.h>#include <linux/etherdevice.h>#include <linux/skbuff.h>#include <linux/init.h>#include <net/sock.h>#include <linux/netlink.h>/* *	Index to functions. */int	    ethertap_probe(struct device *dev);static int  ethertap_open(struct device *dev);static int  ethertap_start_xmit(struct sk_buff *skb, struct device *dev);static int  ethertap_close(struct device *dev);static struct net_device_stats *ethertap_get_stats(struct device *dev);static void ethertap_rx(struct sock *sk, int len);#ifdef CONFIG_ETHERTAP_MCstatic void set_multicast_list(struct device *dev);#endifstatic int ethertap_debug = 0;static struct device *tap_map[32];	/* Returns the tap device for a given netlink *//* *	Board-specific info in dev->priv. */struct net_local{	struct sock	*nl;#ifdef CONFIG_ETHERTAP_MC	__u32		groups;#endif	struct net_device_stats stats;};/* *	To call this a probe is a bit misleading, however for real *	hardware it would have to check what was present. */ __initfunc(int ethertap_probe(struct device *dev)){	memcpy(dev->dev_addr, "\xFE\xFD\x00\x00\x00\x00", 6);	if (dev->mem_start & 0xf)		ethertap_debug = dev->mem_start & 0x7;	/*	 *	Initialize the device structure.	 */	dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);	if (dev->priv == NULL)		return -ENOMEM;	memset(dev->priv, 0, sizeof(struct net_local));	/*	 *	The tap specific entries in the device structure.	 */	dev->open = ethertap_open;	dev->hard_start_xmit = ethertap_start_xmit;	dev->stop = ethertap_close;	dev->get_stats = ethertap_get_stats;#ifdef CONFIG_ETHERTAP_MC	dev->set_multicast_list = set_multicast_list;#endif	/*	 *	Setup the generic properties	 */	ether_setup(dev);	dev->tx_queue_len = 0;	dev->flags|=IFF_NOARP;	tap_map[dev->base_addr]=dev;	return 0;}/* *	Open/initialize the board. */static int ethertap_open(struct device *dev){	struct net_local *lp = (struct net_local*)dev->priv;	if (ethertap_debug > 2)		printk("%s: Doing ethertap_open()...", dev->name);	MOD_INC_USE_COUNT;	lp->nl = netlink_kernel_create(dev->base_addr, ethertap_rx);	if (lp->nl == NULL) {		MOD_DEC_USE_COUNT;		return -ENOBUFS;	}	dev->start = 1;	dev->tbusy = 0;	return 0;}#ifdef CONFIG_ETHERTAP_MCstatic unsigned ethertap_mc_hash(__u8 *dest){	unsigned idx = 0;	idx ^= dest[0];	idx ^= dest[1];	idx ^= dest[2];	idx ^= dest[3];	idx ^= dest[4];	idx ^= dest[5];	return 1U << (idx&0x1F);}static void set_multicast_list(struct device *dev){	unsigned groups = ~0;	struct net_local *lp = (struct net_local *)dev->priv;	if (!(dev->flags&(IFF_NOARP|IFF_PROMISC|IFF_ALLMULTI))) {		struct dev_mc_list *dmi;		groups = ethertap_mc_hash(dev->broadcast);		for (dmi=dev->mc_list; dmi; dmi=dmi->next) {			if (dmi->dmi_addrlen != 6)				continue;			groups |= ethertap_mc_hash(dmi->dmi_addr);		}	}	lp->groups = groups;	if (lp->nl)		lp->nl->protinfo.af_netlink.groups = groups;}#endif/* *	We transmit by throwing the packet at netlink. We have to clone *	it for 2.0 so that we dev_kfree_skb() the locked original. */ static int ethertap_start_xmit(struct sk_buff *skb, struct device *dev){	struct net_local *lp = (struct net_local *)dev->priv;#ifdef CONFIG_ETHERTAP_MC	struct ethhdr *eth = (struct ethhdr*)skb->data;#endif	if (skb_headroom(skb) < 2) {		printk(KERN_DEBUG "%s : bug --- xmit with head<2\n", dev->name);		dev_kfree_skb(skb);		return 0;	}	skb_push(skb, 2);	/* Make the same thing, which loopback does. */	if (skb_shared(skb)) {	  	struct sk_buff *skb2 = skb;	  	skb = skb_clone(skb, GFP_ATOMIC);	/* Clone the buffer */	  	if (skb==NULL) {			dev_kfree_skb(skb2);			return 0;		}	  	dev_kfree_skb(skb2);	}	/* ... but do not orphan it here, netlink does it in any case. */	lp->stats.tx_bytes+=skb->len;	lp->stats.tx_packets++;#ifndef CONFIG_ETHERTAP_MC	netlink_broadcast(lp->nl, skb, 0, ~0, GFP_ATOMIC);#else	if (dev->flags&IFF_NOARP) {		netlink_broadcast(lp->nl, skb, 0, ~0, GFP_ATOMIC);		return 0;	}	if (!(eth->h_dest[0]&1)) {		/* Unicast packet */		__u32 pid;		memcpy(&pid, eth->h_dest+2, 4);		netlink_unicast(lp->nl, skb, ntohl(pid), MSG_DONTWAIT);	} else		netlink_broadcast(lp->nl, skb, 0, ethertap_mc_hash(eth->h_dest), GFP_ATOMIC);#endif	return 0;}static __inline__ int ethertap_rx_skb(struct sk_buff *skb, struct device *dev){	struct net_local *lp = (struct net_local *)dev->priv;#ifdef CONFIG_ETHERTAP_MC	struct ethhdr *eth = (struct ethhdr*)(skb->data + 2);#endif	int len = skb->len;	if (len < 16) {		printk(KERN_DEBUG "%s : rx len = %d\n", dev->name, len);		kfree_skb(skb);		return -EINVAL;	}	if (NETLINK_CREDS(skb)->uid) {		printk(KERN_INFO "%s : user %d\n", dev->name, NETLINK_CREDS(skb)->uid);		kfree_skb(skb);		return -EPERM;	}#ifdef CONFIG_ETHERTAP_MC	if (!(dev->flags&(IFF_NOARP|IFF_PROMISC))) {		int drop = 0;		if (eth->h_dest[0]&1) {			if (!(ethertap_mc_hash(eth->h_dest)&lp->groups))				drop = 1;		} else if (memcmp(eth->h_dest, dev->dev_addr, 6) != 0)			drop = 1;		if (drop) {			if (ethertap_debug > 3)				printk(KERN_DEBUG "%s : not for us\n", dev->name);			kfree_skb(skb);			return -EINVAL;		}	}#endif	if (skb_shared(skb)) {	  	struct sk_buff *skb2 = skb;	  	skb = skb_clone(skb, GFP_KERNEL);	/* Clone the buffer */	  	if (skb==NULL) {			kfree_skb(skb2);			return -ENOBUFS;		}	  	kfree_skb(skb2);	} else		skb_orphan(skb);	skb_pull(skb, 2);	skb->dev = dev;	skb->protocol=eth_type_trans(skb,dev);	memset(skb->cb, 0, sizeof(skb->cb));	lp->stats.rx_packets++;	lp->stats.rx_bytes+=len;	netif_rx(skb);	return len;}/* *	The typical workload of the driver: *	Handle the ether interface interrupts. * *	(In this case handle the packets posted from user space..) */static void ethertap_rx(struct sock *sk, int len){	struct device *dev = tap_map[sk->protocol];	struct sk_buff *skb;	if (dev==NULL) {		printk(KERN_CRIT "ethertap: bad unit!\n");		skb_queue_purge(&sk->receive_queue);		return;	}	if (ethertap_debug > 3)		printk("%s: ethertap_rx()\n", dev->name);	while ((skb = skb_dequeue(&sk->receive_queue)) != NULL)		ethertap_rx_skb(skb, dev);}static int ethertap_close(struct device *dev){	struct net_local *lp = (struct net_local *)dev->priv;	struct sock *sk = lp->nl;	if (ethertap_debug > 2)		printk("%s: Shutting down.\n", dev->name);	dev->tbusy = 1;	dev->start = 0;	if (sk) {		lp->nl = NULL;		sock_release(sk->socket);	}	MOD_DEC_USE_COUNT;	return 0;}static struct net_device_stats *ethertap_get_stats(struct device *dev){	struct net_local *lp = (struct net_local *)dev->priv;	return &lp->stats;}#ifdef MODULEstatic int unit;MODULE_PARM(unit,"i");static char devicename[9] = { 0, };static struct device dev_ethertap ={	devicename,	0, 0, 0, 0,	1, 5,	0, 0, 0, NULL, ethertap_probe};int init_module(void){	dev_ethertap.base_addr=unit+NETLINK_TAPBASE;	sprintf(devicename,"tap%d",unit);	if (dev_get(devicename))	{		printk(KERN_INFO "%s already loaded.\n", devicename);		return -EBUSY;	}	if (register_netdev(&dev_ethertap) != 0)		return -EIO;	return 0;}void cleanup_module(void){	tap_map[dev_ethertap.base_addr]=NULL;	unregister_netdev(&dev_ethertap);	/*	 *	Free up the private structure.	 */	kfree(dev_ethertap.priv);	dev_ethertap.priv = NULL;	/* gets re-allocated by ethertap_probe */}#endif /* MODULE */

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲综合无码一区二区| 国产精品亚洲综合一区在线观看| 亚洲电影视频在线| 免费观看一级特黄欧美大片| 琪琪久久久久日韩精品| 国产美女精品在线| 一本到一区二区三区| 亚洲宅男天堂在线观看无病毒| 秋霞影院一区二区| av不卡免费电影| 日韩一区二区影院| 一区二区在线免费| 国产一区二区福利| 欧美日韩国产不卡| 国产精品灌醉下药二区| 日本视频中文字幕一区二区三区| 国产精品一区二区男女羞羞无遮挡| 91麻豆免费看| 久久一日本道色综合| 午夜精品123| 91丝袜国产在线播放| 久久中文字幕电影| 日韩有码一区二区三区| 一本色道a无线码一区v| 日本一区二区免费在线观看视频| 美日韩一级片在线观看| 91精品国产色综合久久久蜜香臀| 亚洲欧美日韩国产手机在线| 国内不卡的二区三区中文字幕| 欧美精品三级日韩久久| 亚洲最大成人网4388xx| 91色综合久久久久婷婷| 国产精品久久久久国产精品日日| 精品一区免费av| 精品福利在线导航| 美腿丝袜亚洲一区| 日韩一二三区视频| 久久福利视频一区二区| 日韩午夜在线播放| 美日韩一级片在线观看| 日韩色视频在线观看| 图片区小说区国产精品视频| 欧美日韩精品是欧美日韩精品| 亚洲欧美一区二区久久| 欧亚洲嫩模精品一区三区| 亚洲视频1区2区| 欧美午夜电影在线播放| 午夜激情久久久| 欧美一级片免费看| 国产精品综合二区| 日本一区二区三区电影| 99精品国产99久久久久久白柏| 亚洲激情图片小说视频| 欧美日韩成人在线| 国产一区二三区| 亚洲另类中文字| 欧美一区二区播放| 国产成人高清视频| 亚洲h精品动漫在线观看| 久久精品亚洲乱码伦伦中文 | 国产一区二区三区久久久| 国产精品国产a| 91精品国产色综合久久不卡电影| 高清国产午夜精品久久久久久| 亚洲欧美综合在线精品| 日韩视频永久免费| 欧美性感一类影片在线播放| 国模娜娜一区二区三区| 亚洲国产一区视频| 欧美激情一二三区| 日韩午夜中文字幕| 欧美午夜不卡视频| 99免费精品在线| 国产精品一区二区在线看| 天天综合日日夜夜精品| 亚洲免费视频中文字幕| 国产欧美日韩在线| 精品理论电影在线| 日韩一区二区在线观看视频播放| 色婷婷综合久久久久中文| 成人丝袜视频网| 国产成人在线电影| 韩国v欧美v亚洲v日本v| 蜜臀av一区二区| 日韩二区三区在线观看| 午夜视频久久久久久| 亚洲一卡二卡三卡四卡五卡| 激情图片小说一区| 久草热8精品视频在线观看| 日韩精品色哟哟| 亚洲成人先锋电影| 午夜精品久久久| 日av在线不卡| 精品一区二区三区免费视频| 天堂一区二区在线免费观看| 午夜精品在线看| 日本aⅴ免费视频一区二区三区| 日韩成人一区二区| 麻豆中文一区二区| 国产a级毛片一区| 日本丶国产丶欧美色综合| 91黄色激情网站| 欧美日韩国产一级| 日韩视频一区二区三区在线播放 | 国产精品1区2区| 国产91丝袜在线播放| 成人动漫av在线| 色综合久久66| 精品嫩草影院久久| 亚洲男人天堂av| 奇米色一区二区| 国产精品自拍毛片| 在线观看视频一区二区欧美日韩| 欧美精品亚洲二区| 国产精品系列在线| 亚洲高清不卡在线观看| 精品一区二区免费在线观看| 成人av影视在线观看| 欧美久久久一区| 综合自拍亚洲综合图不卡区| 日本vs亚洲vs韩国一区三区| www.爱久久.com| 国产亚洲午夜高清国产拍精品| 一级日本不卡的影视| 国产成人在线视频网站| 欧美一区二区视频在线观看| 国产精品理论在线观看| 国产综合色视频| 日韩三级高清在线| 亚洲在线视频网站| 色综合天天在线| 狠狠色丁香婷婷综合| 色狠狠桃花综合| 亚洲色图视频网| 成人免费三级在线| 久久久久久久av麻豆果冻| 蜜臀久久久久久久| 在线播放中文字幕一区| 亚洲成人动漫在线免费观看| 91成人看片片| 国产一区二区在线电影| 欧美tk—视频vk| 秋霞av亚洲一区二区三| 欧美丰满少妇xxxbbb| 亚洲成国产人片在线观看| 91黄视频在线观看| 亚洲国产中文字幕在线视频综合| 色欧美日韩亚洲| 亚洲六月丁香色婷婷综合久久| 99国产精品一区| 亚洲最大色网站| 在线播放一区二区三区| 视频在线观看一区| 日本精品裸体写真集在线观看| 欧美一区欧美二区| 亚洲欧洲精品一区二区三区不卡 | 一级特黄大欧美久久久| 欧美白人最猛性xxxxx69交| 99久久精品久久久久久清纯| 日本中文字幕一区二区有限公司| 欧美极品美女视频| 日本道精品一区二区三区 | 91免费看`日韩一区二区| 亚洲一区二区三区四区不卡| 日韩精品中文字幕一区| 成人涩涩免费视频| 亚洲国产视频a| 欧美精品一区二区在线观看| 色婷婷狠狠综合| 经典三级一区二区| 一级女性全黄久久生活片免费| 日韩一区二区三区免费看| 成人性生交大片| 欧美a一区二区| 亚洲天堂免费看| 日韩视频一区二区在线观看| 在线视频中文字幕一区二区| 国内不卡的二区三区中文字幕| 亚洲精品视频在线看| 2020国产精品自拍| 欧美理论在线播放| 3atv在线一区二区三区| 国产91精品一区二区麻豆网站 | 久久99精品久久久久久动态图| 亚洲bdsm女犯bdsm网站| 亚洲精品写真福利| 亚洲精品自拍动漫在线| 亚洲人成网站在线| 亚洲欧美日韩国产中文在线| 亚洲人成网站色在线观看| 国产视频在线观看一区二区三区| www欧美成人18+| 国产日韩欧美综合在线| 国产色综合久久| 日韩美女视频一区二区| 一区二区三区加勒比av| 亚洲亚洲精品在线观看| 丝袜美腿成人在线| 久久国产生活片100| 久国产精品韩国三级视频|