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

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

?? snull.c

?? Linux設(shè)備驅(qū)動(dòng)的經(jīng)典教材, 該電子書是第三版,并附有全部配套代碼.
?? C
?? 第 1 頁 / 共 2 頁
字號(hào):
/* * snull.c --  the Simple Network Utility * * Copyright (C) 2001 Alessandro Rubini and Jonathan Corbet * Copyright (C) 2001 O'Reilly & Associates * * The source code in this file can be freely used, adapted, * and redistributed in source or binary form, so long as an * acknowledgment appears in derived source files.  The citation * should list that the code comes from the book "Linux Device * Drivers" by Alessandro Rubini and Jonathan Corbet, published * by O'Reilly & Associates.   No warranty is attached; * we cannot take responsibility for errors or fitness for use. * * $Id: snull.c,v 1.21 2004/11/05 02:36:03 rubini Exp $ */#include <linux/config.h>#include <linux/module.h>#include <linux/init.h>#include <linux/moduleparam.h>#include <linux/sched.h>#include <linux/kernel.h> /* printk() */#include <linux/slab.h> /* kmalloc() */#include <linux/errno.h>  /* error codes */#include <linux/types.h>  /* size_t */#include <linux/interrupt.h> /* mark_bh */#include <linux/in.h>#include <linux/netdevice.h>   /* struct device, and other headers */#include <linux/etherdevice.h> /* eth_type_trans */#include <linux/ip.h>          /* struct iphdr */#include <linux/tcp.h>         /* struct tcphdr */#include <linux/skbuff.h>#include "snull.h"#include <linux/in6.h>#include <asm/checksum.h>MODULE_AUTHOR("Alessandro Rubini, Jonathan Corbet");MODULE_LICENSE("Dual BSD/GPL");/* * Transmitter lockup simulation, normally disabled. */static int lockup = 0;module_param(lockup, int, 0);static int timeout = SNULL_TIMEOUT;module_param(timeout, int, 0);/* * Do we run in NAPI mode? */static int use_napi = 0;module_param(use_napi, int, 0);/* * A structure representing an in-flight packet. */struct snull_packet {	struct snull_packet *next;	struct net_device *dev;	int	datalen;	u8 data[ETH_DATA_LEN];};int pool_size = 8;module_param(pool_size, int, 0);/* * This structure is private to each device. It is used to pass * packets in and out, so there is place for a packet */struct snull_priv {	struct net_device_stats stats;	int status;	struct snull_packet *ppool;	struct snull_packet *rx_queue;  /* List of incoming packets */	int rx_int_enabled;	int tx_packetlen;	u8 *tx_packetdata;	struct sk_buff *skb;	spinlock_t lock;};static void snull_tx_timeout(struct net_device *dev);static void (*snull_interrupt)(int, void *, struct pt_regs *);/* * Set up a device's packet pool. */void snull_setup_pool(struct net_device *dev){	struct snull_priv *priv = netdev_priv(dev);	int i;	struct snull_packet *pkt;	priv->ppool = NULL;	for (i = 0; i < pool_size; i++) {		pkt = kmalloc (sizeof (struct snull_packet), GFP_KERNEL);		if (pkt == NULL) {			printk (KERN_NOTICE "Ran out of memory allocating packet pool\n");			return;		}		pkt->dev = dev;		pkt->next = priv->ppool;		priv->ppool = pkt;	}}void snull_teardown_pool(struct net_device *dev){	struct snull_priv *priv = netdev_priv(dev);	struct snull_packet *pkt;    	while ((pkt = priv->ppool)) {		priv->ppool = pkt->next;		kfree (pkt);		/* FIXME - in-flight packets ? */	}}    /* * Buffer/pool management. */struct snull_packet *snull_get_tx_buffer(struct net_device *dev){	struct snull_priv *priv = netdev_priv(dev);	unsigned long flags;	struct snull_packet *pkt;    	spin_lock_irqsave(&priv->lock, flags);	pkt = priv->ppool;	priv->ppool = pkt->next;	if (priv->ppool == NULL) {		printk (KERN_INFO "Pool empty\n");		netif_stop_queue(dev);	}	spin_unlock_irqrestore(&priv->lock, flags);	return pkt;}void snull_release_buffer(struct snull_packet *pkt){	unsigned long flags;	struct snull_priv *priv = netdev_priv(pkt->dev);		spin_lock_irqsave(&priv->lock, flags);	pkt->next = priv->ppool;	priv->ppool = pkt;	spin_unlock_irqrestore(&priv->lock, flags);	if (netif_queue_stopped(pkt->dev) && pkt->next == NULL)		netif_wake_queue(pkt->dev);}void snull_enqueue_buf(struct net_device *dev, struct snull_packet *pkt){	unsigned long flags;	struct snull_priv *priv = netdev_priv(dev);	spin_lock_irqsave(&priv->lock, flags);	pkt->next = priv->rx_queue;  /* FIXME - misorders packets */	priv->rx_queue = pkt;	spin_unlock_irqrestore(&priv->lock, flags);}struct snull_packet *snull_dequeue_buf(struct net_device *dev){	struct snull_priv *priv = netdev_priv(dev);	struct snull_packet *pkt;	unsigned long flags;	spin_lock_irqsave(&priv->lock, flags);	pkt = priv->rx_queue;	if (pkt != NULL)		priv->rx_queue = pkt->next;	spin_unlock_irqrestore(&priv->lock, flags);	return pkt;}/* * Enable and disable receive interrupts. */static void snull_rx_ints(struct net_device *dev, int enable){	struct snull_priv *priv = netdev_priv(dev);	priv->rx_int_enabled = enable;}    /* * Open and close */int snull_open(struct net_device *dev){	/* request_region(), request_irq(), ....  (like fops->open) */	/* 	 * Assign the hardware address of the board: use "\0SNULx", where	 * x is 0 or 1. The first byte is '\0' to avoid being a multicast	 * address (the first byte of multicast addrs is odd).	 */	memcpy(dev->dev_addr, "\0SNUL0", ETH_ALEN);	if (dev == snull_devs[1])		dev->dev_addr[ETH_ALEN-1]++; /* \0SNUL1 */	netif_start_queue(dev);	return 0;}int snull_release(struct net_device *dev){    /* release ports, irq and such -- like fops->close */	netif_stop_queue(dev); /* can't transmit any more */	return 0;}/* * Configuration changes (passed on by ifconfig) */int snull_config(struct net_device *dev, struct ifmap *map){	if (dev->flags & IFF_UP) /* can't act on a running interface */		return -EBUSY;	/* Don't allow changing the I/O address */	if (map->base_addr != dev->base_addr) {		printk(KERN_WARNING "snull: Can't change I/O address\n");		return -EOPNOTSUPP;	}	/* Allow changing the IRQ */	if (map->irq != dev->irq) {		dev->irq = map->irq;        	/* request_irq() is delayed to open-time */	}	/* ignore other fields */	return 0;}/* * Receive a packet: retrieve, encapsulate and pass over to upper levels */void snull_rx(struct net_device *dev, struct snull_packet *pkt){	struct sk_buff *skb;	struct snull_priv *priv = netdev_priv(dev);	/*	 * The packet has been retrieved from the transmission	 * medium. Build an skb around it, so upper layers can handle it	 */	skb = dev_alloc_skb(pkt->datalen + 2);	if (!skb) {		if (printk_ratelimit())			printk(KERN_NOTICE "snull rx: low on mem - packet dropped\n");		priv->stats.rx_dropped++;		goto out;	}	skb_reserve(skb, 2); /* align IP on 16B boundary */  	memcpy(skb_put(skb, pkt->datalen), pkt->data, pkt->datalen);	/* Write metadata, and then pass to the receive level */	skb->dev = dev;	skb->protocol = eth_type_trans(skb, dev);	skb->ip_summed = CHECKSUM_UNNECESSARY; /* don't check it */	priv->stats.rx_packets++;	priv->stats.rx_bytes += pkt->datalen;	netif_rx(skb);  out:	return;}    /* * The poll implementation. */static int snull_poll(struct net_device *dev, int *budget){	int npackets = 0, quota = min(dev->quota, *budget);	struct sk_buff *skb;	struct snull_priv *priv = netdev_priv(dev);	struct snull_packet *pkt;    	while (npackets < quota && priv->rx_queue) {		pkt = snull_dequeue_buf(dev);		skb = dev_alloc_skb(pkt->datalen + 2);		if (! skb) {			if (printk_ratelimit())				printk(KERN_NOTICE "snull: packet dropped\n");			priv->stats.rx_dropped++;			snull_release_buffer(pkt);			continue;		}		skb_reserve(skb, 2); /* align IP on 16B boundary */  		memcpy(skb_put(skb, pkt->datalen), pkt->data, pkt->datalen);		skb->dev = dev;		skb->protocol = eth_type_trans(skb, dev);		skb->ip_summed = CHECKSUM_UNNECESSARY; /* don't check it */		netif_receive_skb(skb);		        	/* Maintain stats */		npackets++;		priv->stats.rx_packets++;		priv->stats.rx_bytes += pkt->datalen;		snull_release_buffer(pkt);	}	/* If we processed all packets, we're done; tell the kernel and reenable ints */	*budget -= npackets;	dev->quota -= npackets;	if (! priv->rx_queue) {		netif_rx_complete(dev);		snull_rx_ints(dev, 1);		return 0;	}	/* We couldn't process everything. */	return 1;}	            /* * The typical interrupt entry point */static void snull_regular_interrupt(int irq, void *dev_id, struct pt_regs *regs){	int statusword;	struct snull_priv *priv;	struct snull_packet *pkt = NULL;	/*	 * As usual, check the "device" pointer to be sure it is	 * really interrupting.	 * 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) {		/* send it to snull_rx for handling */		pkt = priv->rx_queue;		if (pkt) {			priv->rx_queue = pkt->next;			snull_rx(dev, pkt);		}	}	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);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品自拍偷拍| 亚洲大片免费看| 久久欧美一区二区| 日韩精品一区二区三区在线观看| 欧美在线啊v一区| 91九色最新地址| 色视频成人在线观看免| 91黄色在线观看| 在线观看日韩av先锋影音电影院| 91免费视频网址| 色综合久久久久久久久久久| 91久久免费观看| 欧美日韩大陆一区二区| 8v天堂国产在线一区二区| 欧美精品vⅰdeose4hd| 欧美一区二区播放| 日韩精品一区二区三区视频| 精品国产1区二区| 欧美精品一区二区三区久久久 | 欧美一级日韩免费不卡| 91麻豆精品国产91久久久使用方法| 欧美狂野另类xxxxoooo| 欧美www视频| 国产日韩欧美精品一区| 亚洲私人影院在线观看| 亚洲午夜电影在线观看| 伦理电影国产精品| 国产91精品一区二区麻豆亚洲| 成人app在线| 欧美三级电影在线看| 日韩欧美在线一区二区三区| 久久人人97超碰com| 自拍偷在线精品自拍偷无码专区| 一区二区欧美国产| 蜜臀久久99精品久久久久宅男 | 91麻豆.com| 91精品国产一区二区三区蜜臀| 欧美va亚洲va| 国产精品国产自产拍高清av王其| 亚洲一区二区3| 国内精品久久久久影院一蜜桃| www.欧美日韩| 3751色影院一区二区三区| 国产亚洲1区2区3区| 一区二区三区四区中文字幕| 久久精品国产99| 99r精品视频| 欧美v亚洲v综合ⅴ国产v| 亚洲欧美一区二区三区极速播放 | 亚洲一区二区三区中文字幕| 免费高清在线一区| 97久久人人超碰| 日韩午夜在线播放| 亚洲精品一二三| 韩国成人福利片在线播放| 在线观看亚洲a| 国产区在线观看成人精品| 丝袜美腿亚洲色图| 99久久精品一区| 欧美成人精精品一区二区频| 亚洲黄色性网站| 国产传媒欧美日韩成人| 欧美日韩国产美| 亚洲欧美影音先锋| 国模冰冰炮一区二区| 欧美日韩国产三级| 亚洲欧美日韩一区二区| 国产成人在线观看免费网站| 欧美高清视频不卡网| 亚洲丝袜另类动漫二区| 国产美女精品人人做人人爽| 欧美日韩dvd在线观看| 中文字幕在线不卡视频| 国产精品888| 精品三级av在线| 亚洲第一在线综合网站| 99热精品一区二区| 26uuu亚洲| 蜜桃av噜噜一区| 欧美日韩国产乱码电影| 亚洲激情网站免费观看| 99国产精品久久久久久久久久 | 性做久久久久久| 91亚洲精品乱码久久久久久蜜桃| 久久男人中文字幕资源站| 美国毛片一区二区| 3d成人h动漫网站入口| 亚洲成人在线网站| 欧美三级三级三级| 一区二区三区不卡视频| 一本久久a久久免费精品不卡| 日本一区二区三区在线不卡| 国产一区二区精品久久| 精品国产乱码久久久久久1区2区 | 国内成人自拍视频| 日韩一区二区三区视频在线观看| 亚洲一二三区在线观看| 欧美视频一区二区在线观看| 亚洲伊人伊色伊影伊综合网| 色老头久久综合| 亚洲乱码国产乱码精品精的特点 | 欧美日韩黄视频| 亚洲自拍偷拍综合| 在线免费不卡视频| 亚洲一区二区欧美日韩 | 亚洲成人动漫在线免费观看| 欧美色涩在线第一页| 亚洲成人动漫av| 91精品麻豆日日躁夜夜躁| 日韩va欧美va亚洲va久久| 91精品国产麻豆| 久久av中文字幕片| 精品国产伦理网| 国产99精品在线观看| 亚洲欧美另类小说| 欧美亚洲愉拍一区二区| 亚洲午夜日本在线观看| 欧美一区二区高清| 精品综合久久久久久8888| 国产婷婷色一区二区三区四区 | 91麻豆国产在线观看| 亚洲另类春色国产| 欧美午夜精品理论片a级按摩| 午夜精品福利在线| 精品国产髙清在线看国产毛片| 激情深爱一区二区| 中文字幕亚洲综合久久菠萝蜜| 色综合久久久久综合体| 日韩二区三区四区| 久久久久国产精品免费免费搜索| 成人av免费在线观看| 亚洲综合激情另类小说区| 日韩视频一区在线观看| 丰满放荡岳乱妇91ww| 樱桃视频在线观看一区| 欧美一区二区三区四区久久| 国产一区二区三区国产| 亚洲免费观看高清完整版在线| 精品视频色一区| 国产一区二区伦理| 亚洲亚洲精品在线观看| 久久综合色一综合色88| 97久久精品人人澡人人爽| 奇米影视一区二区三区小说| 国产亚洲精品久| 欧美午夜精品一区二区蜜桃| 国产在线麻豆精品观看| 亚洲免费高清视频在线| 精品国精品自拍自在线| 一本一道波多野结衣一区二区| 另类小说一区二区三区| 亚洲欧美激情小说另类| 欧美mv和日韩mv的网站| 91在线丨porny丨国产| 日日摸夜夜添夜夜添精品视频| 国产日韩欧美综合一区| 91超碰这里只有精品国产| 国产91清纯白嫩初高中在线观看 | 国产在线播放一区三区四| 亚洲激情网站免费观看| 久久久91精品国产一区二区三区| 欧美在线视频你懂得| 国产精品69久久久久水密桃| 午夜一区二区三区视频| 国产精品人妖ts系列视频| 欧美一区二区在线播放| 日本精品视频一区二区| 国产成人av网站| 美脚の诱脚舐め脚责91| 亚洲一区二区3| 亚洲素人一区二区| 欧美国产精品中文字幕| 欧美一区二区三区婷婷月色| 色婷婷综合久色| 波多野结衣91| 精油按摩中文字幕久久| 日韩高清在线不卡| 一区二区三区四区不卡在线| 欧美激情一区二区三区不卡| 欧美草草影院在线视频| 欧美视频完全免费看| 一道本成人在线| www.视频一区| 成人免费电影视频| 国模娜娜一区二区三区| 美国三级日本三级久久99| 婷婷开心激情综合| 亚洲自拍偷拍网站| 亚洲精品久久嫩草网站秘色| 国产精品乱码妇女bbbb| 国产视频亚洲色图| 精品国产百合女同互慰| 欧美一区二区三区男人的天堂| 欧美性色黄大片手机版| 91社区在线播放| 成人黄色777网| 国产成人在线视频网址| 国产成人综合网站| 国产精品一二一区| 国产精品羞羞答答xxdd|