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

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

?? snull.c

?? 驅(qū)動實例
?? C
?? 第 1 頁 / 共 2 頁
字號:
	}	/* Unlock the device and we are done */	spin_unlock(&priv->lock);	if (pkt) snull_release_buffer(pkt); /* Do this outside the lock! */	return;}/* * A NAPI interrupt handler. */static void snull_napi_interrupt(int irq, void *dev_id, struct pt_regs *regs){	int statusword;	struct snull_priv *priv;	/*	 * As usual, check the "device" pointer for shared handlers.	 * Then assign "struct device *dev"	 */	struct net_device *dev = (struct net_device *)dev_id;	/* ... and check with hw if it's really ours */	/* paranoid */	if (!dev)		return;	/* Lock the device */	priv = netdev_priv(dev);	spin_lock(&priv->lock);	/* retrieve statusword: real netdevices use I/O instructions */	statusword = priv->status;	priv->status = 0;	if (statusword & SNULL_RX_INTR) {		snull_rx_ints(dev, 0);  /* Disable further interrupts */		netif_rx_schedule(dev);	}	if (statusword & SNULL_TX_INTR) {        	/* a transmission is over: free the skb */		priv->stats.tx_packets++;		priv->stats.tx_bytes += priv->tx_packetlen;		dev_kfree_skb(priv->skb);	}	/* Unlock the device and we are done */	spin_unlock(&priv->lock);	return;}/* * Transmit a packet (low level interface) */static void snull_hw_tx(char *buf, int len, struct net_device *dev){	/*	 * This function deals with hw details. This interface loops	 * back the packet to the other snull interface (if any).	 * In other words, this function implements the snull behaviour,	 * while all other procedures are rather device-independent	 */	struct iphdr *ih;	struct net_device *dest;	struct snull_priv *priv;	u32 *saddr, *daddr;	struct snull_packet *tx_buffer;    	/* I am paranoid. Ain't I? */	if (len < sizeof(struct ethhdr) + sizeof(struct iphdr)) {		printk("snull: Hmm... packet too short (%i octets)\n",				len);		return;	}	if (0) { /* enable this conditional to look at the data */		int i;		PDEBUG("len is %i\n" KERN_DEBUG "data:",len);		for (i=14 ; i<len; i++)			printk(" %02x",buf[i]&0xff);		printk("\n");	}	/*	 * Ethhdr is 14 bytes, but the kernel arranges for iphdr	 * to be aligned (i.e., ethhdr is unaligned)	 */	ih = (struct iphdr *)(buf+sizeof(struct ethhdr));	saddr = &ih->saddr;	daddr = &ih->daddr;	((u8 *)saddr)[2] ^= 1; /* change the third octet (class C) */	((u8 *)daddr)[2] ^= 1;	ih->check = 0;         /* and rebuild the checksum (ip needs it) */	ih->check = ip_fast_csum((unsigned char *)ih,ih->ihl);	if (dev == snull_devs[0])		PDEBUGG("%08x:%05i --> %08x:%05i\n",				ntohl(ih->saddr),ntohs(((struct tcphdr *)(ih+1))->source),				ntohl(ih->daddr),ntohs(((struct tcphdr *)(ih+1))->dest));	else		PDEBUGG("%08x:%05i <-- %08x:%05i\n",				ntohl(ih->daddr),ntohs(((struct tcphdr *)(ih+1))->dest),				ntohl(ih->saddr),ntohs(((struct tcphdr *)(ih+1))->source));	/*	 * Ok, now the packet is ready for transmission: first simulate a	 * receive interrupt on the twin device, then  a	 * transmission-done on the transmitting device	 */	dest = snull_devs[dev == snull_devs[0] ? 1 : 0];	priv = netdev_priv(dest);	tx_buffer = snull_get_tx_buffer(dev);	tx_buffer->datalen = len;	memcpy(tx_buffer->data, buf, len);	snull_enqueue_buf(dest, tx_buffer);	if (priv->rx_int_enabled) {		priv->status |= SNULL_RX_INTR;		snull_interrupt(0, dest, NULL);	}	priv = netdev_priv(dev);	priv->tx_packetlen = len;	priv->tx_packetdata = buf;	priv->status |= SNULL_TX_INTR;	if (lockup && ((priv->stats.tx_packets + 1) % lockup) == 0) {        	/* Simulate a dropped transmit interrupt */		netif_stop_queue(dev);		PDEBUG("Simulate lockup at %ld, txp %ld\n", jiffies,				(unsigned long) priv->stats.tx_packets);	}	else		snull_interrupt(0, dev, NULL);}/* * Transmit a packet (called by the kernel) */int snull_tx(struct sk_buff *skb, struct net_device *dev){	int len;	char *data, shortpkt[ETH_ZLEN];	struct snull_priv *priv = netdev_priv(dev);		data = skb->data;	len = skb->len;	if (len < ETH_ZLEN) {		memset(shortpkt, 0, ETH_ZLEN);		memcpy(shortpkt, skb->data, skb->len);		len = ETH_ZLEN;		data = shortpkt;	}	dev->trans_start = jiffies; /* save the timestamp */	/* Remember the skb, so we can free it at interrupt time */	priv->skb = skb;	/* actual deliver of data is device-specific, and not shown here */	snull_hw_tx(data, len, dev);	return 0; /* Our simple device can not fail */}/* * Deal with a transmit timeout. */void snull_tx_timeout (struct net_device *dev){	struct snull_priv *priv = netdev_priv(dev);	PDEBUG("Transmit timeout at %ld, latency %ld\n", jiffies,			jiffies - dev->trans_start);        /* Simulate a transmission interrupt to get things moving */	priv->status = SNULL_TX_INTR;	snull_interrupt(0, dev, NULL);	priv->stats.tx_errors++;	netif_wake_queue(dev);	return;}/* * Ioctl commands  */int snull_ioctl(struct net_device *dev, struct ifreq *rq, int cmd){	PDEBUG("ioctl\n");	return 0;}/* * Return statistics to the caller */struct net_device_stats *snull_stats(struct net_device *dev){	struct snull_priv *priv = netdev_priv(dev);	return &priv->stats;}/* * This function is called to fill up an eth header, since arp is not * available on the interface */int snull_rebuild_header(struct sk_buff *skb){	struct ethhdr *eth = (struct ethhdr *) skb->data;	struct net_device *dev = skb->dev;    	memcpy(eth->h_source, dev->dev_addr, dev->addr_len);	memcpy(eth->h_dest, dev->dev_addr, dev->addr_len);	eth->h_dest[ETH_ALEN-1]   ^= 0x01;   /* dest is us xor 1 */	return 0;}int snull_header(struct sk_buff *skb, struct net_device *dev,                unsigned short type, void *daddr, void *saddr,                unsigned int len){	struct ethhdr *eth = (struct ethhdr *)skb_push(skb,ETH_HLEN);	eth->h_proto = htons(type);	memcpy(eth->h_source, saddr ? saddr : dev->dev_addr, dev->addr_len);	memcpy(eth->h_dest,   daddr ? daddr : dev->dev_addr, dev->addr_len);	eth->h_dest[ETH_ALEN-1]   ^= 0x01;   /* dest is us xor 1 */	return (dev->hard_header_len);}/* * The "change_mtu" method is usually not needed. * If you need it, it must be like this. */int snull_change_mtu(struct net_device *dev, int new_mtu){	unsigned long flags;	struct snull_priv *priv = netdev_priv(dev);	spinlock_t *lock = &priv->lock;    	/* check ranges */	if ((new_mtu < 68) || (new_mtu > 1500))		return -EINVAL;	/*	 * Do anything you need, and the accept the value	 */	spin_lock_irqsave(lock, flags);	dev->mtu = new_mtu;	spin_unlock_irqrestore(lock, flags);	return 0; /* success */}/* * The init function (sometimes called probe). * It is invoked by register_netdev() */void snull_init(struct net_device *dev){	struct snull_priv *priv;#if 0    	/*	 * Make the usual checks: check_region(), probe irq, ...  -ENODEV	 * should be returned if no device found.  No resource should be	 * grabbed: this is done on open(). 	 */#endif    	/* 	 * Then, assign other fields in dev, using ether_setup() and some	 * hand assignments	 */	ether_setup(dev); /* assign some of the fields */	dev->open            = snull_open;	dev->stop            = snull_release;	dev->set_config      = snull_config;	dev->hard_start_xmit = snull_tx;	dev->do_ioctl        = snull_ioctl;	dev->get_stats       = snull_stats;	dev->change_mtu      = snull_change_mtu;  	dev->rebuild_header  = snull_rebuild_header;	dev->hard_header     = snull_header;	dev->tx_timeout      = snull_tx_timeout;	dev->watchdog_timeo = timeout;	if (use_napi) {		dev->poll        = snull_poll;		dev->weight      = 2;	}	/* keep the default flags, just add NOARP */	dev->flags           |= IFF_NOARP;	dev->features        |= NETIF_F_NO_CSUM;	dev->hard_header_cache = NULL;      /* Disable caching */	/*	 * Then, initialize the priv field. This encloses the statistics	 * and a few private fields.	 */	priv = netdev_priv(dev);	memset(priv, 0, sizeof(struct snull_priv));	spin_lock_init(&priv->lock);	snull_rx_ints(dev, 1);		/* enable receive interrupts */	snull_setup_pool(dev);}/* * The devices */struct net_device *snull_devs[2];/* * Finally, the module stuff */void snull_cleanup(void){	int i;    	for (i = 0; i < 2;  i++) {		if (snull_devs[i]) {			unregister_netdev(snull_devs[i]);			snull_teardown_pool(snull_devs[i]);			free_netdev(snull_devs[i]);		}	}	return;}int snull_init_module(void){	int result, i, ret = -ENOMEM;	snull_interrupt = use_napi ? snull_napi_interrupt : snull_regular_interrupt;	/* Allocate the devices */	snull_devs[0] = alloc_netdev(sizeof(struct snull_priv), "sn%d",			snull_init);	snull_devs[1] = alloc_netdev(sizeof(struct snull_priv), "sn%d",			snull_init);	if (snull_devs[0] == NULL || snull_devs[1] == NULL)		goto out;	ret = -ENODEV;	for (i = 0; i < 2;  i++)		if ((result = register_netdev(snull_devs[i])))			printk("snull: error %i registering device \"%s\"\n",					result, snull_devs[i]->name);		else			ret = 0;   out:	if (ret) 		snull_cleanup();	return ret;}module_init(snull_init_module);module_exit(snull_cleanup);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧洲生活片亚洲生活在线观看| 久久综合九色综合欧美亚洲| 欧美日韩国产免费| 9191精品国产综合久久久久久| 精品噜噜噜噜久久久久久久久试看| 国产三区在线成人av| 一区二区三区在线视频观看58| 麻豆一区二区三| 欧美日本在线观看| 欧美一级免费观看| 国产精品情趣视频| 午夜av电影一区| 高清在线成人网| 91精品国模一区二区三区| 国产精品蜜臀av| 美美哒免费高清在线观看视频一区二区 | 91在线精品一区二区三区| 在线亚洲+欧美+日本专区| xfplay精品久久| 亚洲一二三四区| 成人激情午夜影院| 日韩精品在线一区| 一区二区三区**美女毛片| 国产福利91精品| 欧美精品一卡二卡| 伊人一区二区三区| 国产精品18久久久久久vr| 欧美日韩电影一区| 亚洲欧美一区二区不卡| 精品无人码麻豆乱码1区2区| 精品视频一区二区不卡| 国产精品久久久久7777按摩| 免费一级欧美片在线观看| 日本久久一区二区| 国产精品女人毛片| 国产一区二区三区在线观看免费 | 免费国产亚洲视频| 欧美午夜精品久久久久久孕妇 | 91精品国产综合久久精品麻豆 | 国产成人在线视频网站| 91精品国产色综合久久久蜜香臀| 国产精品不卡一区| 粉嫩在线一区二区三区视频| 日韩午夜在线播放| 日本人妖一区二区| 欧美日韩高清在线播放| 亚洲精选视频在线| 91亚洲精品久久久蜜桃网站| 亚洲欧美综合另类在线卡通| 国产精品白丝jk白祙喷水网站| 9191久久久久久久久久久| 亚洲综合在线视频| 欧洲视频一区二区| 亚洲www啪成人一区二区麻豆 | 欧美午夜片在线观看| 亚洲乱码国产乱码精品精可以看| 成人黄动漫网站免费app| 中文字幕欧美激情| 不卡在线视频中文字幕| 自拍偷拍亚洲欧美日韩| 91在线视频网址| 亚洲欧美另类在线| 91色婷婷久久久久合中文| 国产精品福利在线播放| 91视频在线看| 一区二区三区自拍| 欧美色精品在线视频| 日韩av一区二区在线影视| 日韩三区在线观看| 国产成人欧美日韩在线电影| 中文字幕在线观看不卡视频| 色综合天天综合给合国产| 亚洲一区二区在线免费看| 67194成人在线观看| 精品亚洲成a人| 中文字幕欧美日韩一区| 一本色道亚洲精品aⅴ| 亚洲成人7777| 精品电影一区二区三区| 国产成人小视频| 夜夜爽夜夜爽精品视频| 日韩欧美资源站| 国产九色精品成人porny | 成人福利在线看| 一区二区三区欧美日韩| 欧美一级片在线看| 成人97人人超碰人人99| 亚洲成人免费在线观看| 久久久综合精品| 在线观看不卡一区| 黄色成人免费在线| 综合久久一区二区三区| 日韩一区二区精品葵司在线| 成人综合婷婷国产精品久久 | 欧美日韩精品一区二区三区四区 | 亚洲欧美在线高清| 欧美一级高清大全免费观看| 国产成a人无v码亚洲福利| 一区二区三区视频在线观看| 欧美一级日韩免费不卡| 99精品视频中文字幕| 美女视频黄久久| 中文字幕视频一区二区三区久| 欧美日韩国产一二三| 成人午夜在线视频| 奇米777欧美一区二区| 亚洲视频精选在线| 精品伦理精品一区| 欧美日韩国产综合一区二区| 成人综合婷婷国产精品久久蜜臀| 日精品一区二区| 中文av一区特黄| 日韩欧美美女一区二区三区| 色综合久久综合网97色综合| 国产黄人亚洲片| 日本女优在线视频一区二区| 亚洲乱码国产乱码精品精可以看 | 欧美色窝79yyyycom| 成人免费视频一区二区| 裸体歌舞表演一区二区| 一区二区欧美精品| 亚洲色图欧美偷拍| 欧美激情在线免费观看| 久久综合九色综合久久久精品综合 | 国产欧美日韩在线| 日韩欧美123| 在线不卡a资源高清| 91国在线观看| 色婷婷综合在线| 成人av电影免费在线播放| 国产伦精品一区二区三区视频青涩| 亚洲成人av在线电影| 一区二区三区欧美日| 亚洲三级在线免费| 国产精品午夜电影| 26uuu精品一区二区在线观看| 91麻豆精品国产91久久久使用方法| 一本一道综合狠狠老| eeuss鲁一区二区三区| 成人性色生活片免费看爆迷你毛片| 久久精品国产77777蜜臀| 日韩经典中文字幕一区| 亚洲mv在线观看| 亚洲成人第一页| 天天综合天天做天天综合| 午夜精品一区二区三区电影天堂| 亚洲国产一区二区视频| 亚洲一区在线视频| 亚洲成人av在线电影| 日精品一区二区三区| 男男gaygay亚洲| 久久99精品久久久久久久久久久久 | 国产精品第五页| 亚洲视频免费在线观看| 亚洲综合一二三区| 日韩激情中文字幕| 国模无码大尺度一区二区三区| 久久国产精品免费| 国产在线视视频有精品| 国产成人午夜精品5599| 91在线小视频| 在线欧美日韩国产| 欧美一区二区三区免费在线看| 欧美一区二区在线视频| 久久综合中文字幕| 国产精品久久久久婷婷二区次| 亚洲欧洲韩国日本视频 | 亚洲一区二区视频在线观看| 三级在线观看一区二区| 久88久久88久久久| 成人动漫av在线| 制服丝袜av成人在线看| 欧美日韩亚洲国产综合| 欧美一区午夜视频在线观看| 久久免费偷拍视频| 亚洲精品视频一区二区| 久久精品99国产精品日本| 国产成人免费视频一区| 色94色欧美sute亚洲线路一久| 欧美精品 日韩| 国产午夜精品一区二区三区嫩草| 亚洲天堂av一区| 日本不卡免费在线视频| 成人91在线观看| 91精品国产综合久久久久久| 国产欧美一区二区精品婷婷| 亚洲一二三四久久| 国产一区二区成人久久免费影院 | 精品一区二区三区在线观看国产| 国产成a人亚洲| 欧美日韩黄色一区二区| 久久久久久久久蜜桃| 亚洲国产欧美日韩另类综合| 精品一区二区三区影院在线午夜| 成人的网站免费观看| 日韩午夜激情av| 一区二区在线免费| 国产很黄免费观看久久| 欧美一区二区三区四区五区| 日韩一区欧美小说|