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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? snull.c

?? 驅動實例
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * 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);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色嗨嗨av一区二区三区| 欧美日本国产视频| 国产精品美女久久久久久2018| 国产精品综合二区| 国产精品五月天| 欧美三级午夜理伦三级中视频| 奇米色一区二区| 中文字幕一区二区三区四区| 这里只有精品电影| 国产美女精品一区二区三区| 亚洲欧美一区二区三区久本道91 | 欧美一级免费大片| 国产精品一区二区在线观看不卡| 自拍偷在线精品自拍偷无码专区 | 日韩精品电影一区亚洲| 26uuu国产电影一区二区| 91高清在线观看| 成人一区二区视频| 日本欧美一区二区三区乱码 | 国产无遮挡一区二区三区毛片日本| 一本色道a无线码一区v| 国产一区二区三区视频在线播放| 午夜精品123| 亚洲第一主播视频| 亚洲激情自拍偷拍| 亚洲精品国久久99热| 国产精品美女久久久久久2018| 久久久影视传媒| 国产精品免费久久久久| 欧美一区二区三区不卡| 欧美一区二区三区在线电影| 69堂精品视频| 久久综合久色欧美综合狠狠| 欧美一级欧美一级在线播放| 精品久久久网站| 国产精品天美传媒沈樵| 国产精品久久久久7777按摩 | 日韩国产精品久久久久久亚洲| 亚洲摸摸操操av| 亚洲在线观看免费视频| 丝瓜av网站精品一区二区| 日日夜夜精品视频免费| 美脚の诱脚舐め脚责91 | 久久亚洲一区二区三区明星换脸 | 国产在线一区二区综合免费视频| 国产剧情一区二区| 波多野结衣中文一区| 欧美视频在线播放| 337p粉嫩大胆噜噜噜噜噜91av| 国产精品久久久久一区| 天天影视涩香欲综合网| 丁香婷婷综合五月| 欧美一区二区视频网站| 亚洲欧美综合另类在线卡通| 香蕉久久夜色精品国产使用方法 | 日韩二区三区四区| 972aa.com艺术欧美| 6080亚洲精品一区二区| 亚洲欧洲av另类| 国产一区二区精品久久91| 欧美午夜片在线观看| 国产精品久久看| 国产一区二区三区久久久| 欧美日韩免费视频| 亚洲精品一二三区| 99精品视频在线播放观看| 2023国产精华国产精品| 老司机精品视频导航| 日韩欧美综合一区| 亚洲成a人片在线不卡一二三区 | 久久国产精品99精品国产 | 99久久99久久精品免费观看 | 精品国产91乱码一区二区三区| 九色综合狠狠综合久久| 久久久电影一区二区三区| 风间由美性色一区二区三区| 久久精品一区二区三区不卡 | 国产精品一区二区x88av| 欧美精品一区二区三区蜜臀| 国产福利精品导航| 亚洲天堂2016| 69成人精品免费视频| 国产盗摄一区二区三区| 亚洲色大成网站www久久九九| 色婷婷国产精品综合在线观看| 五月综合激情网| 久久精品夜夜夜夜久久| 在线观看区一区二| 精品在线免费观看| 自拍偷拍亚洲欧美日韩| 日韩欧美一区在线观看| 韩国成人福利片在线播放| 亚洲人成影院在线观看| 精品国内二区三区| 91福利在线观看| 国产大陆a不卡| 亚洲国产精品久久久久婷婷884 | 91麻豆精品国产自产在线| 成人免费高清在线观看| 美美哒免费高清在线观看视频一区二区 | 99在线精品免费| 国产一区二区三区免费看| 婷婷久久综合九色综合绿巨人| 国产精品狼人久久影院观看方式| 精品成人私密视频| 日韩欧美在线网站| 欧美精品免费视频| 欧美三日本三级三级在线播放| 91性感美女视频| 99在线热播精品免费| 国产成人免费在线观看不卡| 另类调教123区| 日本亚洲欧美天堂免费| 日日嗨av一区二区三区四区| 亚洲午夜久久久久久久久久久| 亚洲欧洲av在线| 亚洲精品亚洲人成人网在线播放| 国产精品久久久久三级| 亚洲欧美在线另类| 亚洲精品日韩专区silk| 亚洲自拍偷拍九九九| 亚洲v日本v欧美v久久精品| 亚洲一区二区美女| 麻豆国产精品官网| 波多野结衣亚洲一区| 91黄色小视频| 亚洲精品一区二区三区福利| 国产精品久久久爽爽爽麻豆色哟哟 | 婷婷国产v国产偷v亚洲高清| 久久国产成人午夜av影院| 成人免费不卡视频| 欧美日韩精品一区二区天天拍小说| 欧美日韩久久久| 日本一区二区三区四区在线视频 | 欧美主播一区二区三区| 日韩久久久久久| 国产精品久久久久久久浪潮网站| 亚洲精选视频在线| 成人综合在线观看| 欧美一级搡bbbb搡bbbb| 国产精品久久久久影院色老大| 日韩黄色小视频| 91高清视频在线| 中文字幕一区av| 成人免费观看av| 精品国产一区二区三区四区四| 亚洲黄色片在线观看| 成人听书哪个软件好| 国产偷国产偷精品高清尤物| 蜜乳av一区二区三区| 制服丝袜一区二区三区| 亚洲福利电影网| 欧美写真视频网站| 亚洲va欧美va人人爽| 91国产免费观看| 亚洲精品国久久99热| 99久久99久久精品免费看蜜桃| 国产三级精品视频| 成人av动漫网站| 亚洲综合丁香婷婷六月香| 色综合久久久久| 日韩国产在线观看| 久久久久久影视| 国产ts人妖一区二区| 日韩码欧中文字| 欧美放荡的少妇| 激情久久久久久久久久久久久久久久| 91精品欧美久久久久久动漫 | 亚洲天堂免费看| 欧美一区三区四区| 国产一区二区三区av电影| 国产精品国产三级国产三级人妇| 91小视频免费看| 捆绑调教一区二区三区| 亚洲色欲色欲www| 91麻豆国产在线观看| 精品少妇一区二区| 在线国产电影不卡| 欧美系列在线观看| 欧美日本在线播放| 在线播放欧美女士性生活| 欧美日韩国产在线播放网站| 成人av在线播放网址| 国产在线精品一区二区不卡了| 亚洲成av人片观看| 亚洲免费观看高清在线观看| 国产免费成人在线视频| 久久久高清一区二区三区| 日韩欧美成人激情| 在线不卡中文字幕播放| 欧美亚洲一区二区三区四区| 粉嫩欧美一区二区三区高清影视| 奇米在线7777在线精品| 捆绑调教美女网站视频一区| 毛片av一区二区| 国产精品资源在线看| kk眼镜猥琐国模调教系列一区二区| 成人福利视频在线看| 99久久99精品久久久久久| 欧美日韩国产免费一区二区|