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

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

?? 6pack.c

?? 底層驅動開發
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * 6pack.c	This module implements the 6pack protocol for kernel-based *		devices like TTY. It interfaces between a raw TTY and the *		kernel's AX.25 protocol layers. * * Authors:	Andreas K鰊sgen <ajk@iehk.rwth-aachen.de> *              Ralf Baechle DL5RB <ralf@linux-mips.org> * * Quite a lot of stuff "stolen" by Joerg Reuter from slip.c, written by * *		Laurence Culhane, <loz@holmes.demon.co.uk> *		Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> */#include <linux/config.h>#include <linux/module.h>#include <asm/system.h>#include <asm/uaccess.h>#include <linux/bitops.h>#include <linux/string.h>#include <linux/mm.h>#include <linux/interrupt.h>#include <linux/in.h>#include <linux/tty.h>#include <linux/errno.h>#include <linux/netdevice.h>#include <linux/timer.h>#include <net/ax25.h>#include <linux/etherdevice.h>#include <linux/skbuff.h>#include <linux/rtnetlink.h>#include <linux/spinlock.h>#include <linux/if_arp.h>#include <linux/init.h>#include <linux/ip.h>#include <linux/tcp.h>#include <asm/semaphore.h>#include <asm/atomic.h>#define SIXPACK_VERSION    "Revision: 0.3.0"/* sixpack priority commands */#define SIXP_SEOF		0x40	/* start and end of a 6pack frame */#define SIXP_TX_URUN		0x48	/* transmit overrun */#define SIXP_RX_ORUN		0x50	/* receive overrun */#define SIXP_RX_BUF_OVL		0x58	/* receive buffer overflow */#define SIXP_CHKSUM		0xFF	/* valid checksum of a 6pack frame *//* masks to get certain bits out of the status bytes sent by the TNC */#define SIXP_CMD_MASK		0xC0#define SIXP_CHN_MASK		0x07#define SIXP_PRIO_CMD_MASK	0x80#define SIXP_STD_CMD_MASK	0x40#define SIXP_PRIO_DATA_MASK	0x38#define SIXP_TX_MASK		0x20#define SIXP_RX_MASK		0x10#define SIXP_RX_DCD_MASK	0x18#define SIXP_LEDS_ON		0x78#define SIXP_LEDS_OFF		0x60#define SIXP_CON		0x08#define SIXP_STA		0x10#define SIXP_FOUND_TNC		0xe9#define SIXP_CON_ON		0x68#define SIXP_DCD_MASK		0x08#define SIXP_DAMA_OFF		0/* default level 2 parameters */#define SIXP_TXDELAY			(HZ/4)	/* in 1 s */#define SIXP_PERSIST			50	/* in 256ths */#define SIXP_SLOTTIME			(HZ/10)	/* in 1 s */#define SIXP_INIT_RESYNC_TIMEOUT	(3*HZ/2) /* in 1 s */#define SIXP_RESYNC_TIMEOUT		5*HZ	/* in 1 s *//* 6pack configuration. */#define SIXP_NRUNIT			31      /* MAX number of 6pack channels */#define SIXP_MTU			256	/* Default MTU */enum sixpack_flags {	SIXPF_ERROR,	/* Parity, etc. error	*/};struct sixpack {	/* Various fields. */	struct tty_struct	*tty;		/* ptr to TTY structure	*/	struct net_device	*dev;		/* easy for intr handling  */	/* These are pointers to the malloc()ed frame buffers. */	unsigned char		*rbuff;		/* receiver buffer	*/	int			rcount;         /* received chars counter  */	unsigned char		*xbuff;		/* transmitter buffer	*/	unsigned char		*xhead;         /* next byte to XMIT */	int			xleft;          /* bytes left in XMIT queue  */	unsigned char		raw_buf[4];	unsigned char		cooked_buf[400];	unsigned int		rx_count;	unsigned int		rx_count_cooked;	/* 6pack interface statistics. */	struct net_device_stats stats;	int			mtu;		/* Our mtu (to spot changes!) */	int			buffsize;       /* Max buffers sizes */	unsigned long		flags;		/* Flag values/ mode etc */	unsigned char		mode;		/* 6pack mode */	/* 6pack stuff */	unsigned char		tx_delay;	unsigned char		persistence;	unsigned char		slottime;	unsigned char		duplex;	unsigned char		led_state;	unsigned char		status;	unsigned char		status1;	unsigned char		status2;	unsigned char		tx_enable;	unsigned char		tnc_state;	struct timer_list	tx_t;	struct timer_list	resync_t;	atomic_t		refcnt;	struct semaphore	dead_sem;	spinlock_t		lock;};#define AX25_6PACK_HEADER_LEN 0static void sixpack_decode(struct sixpack *, unsigned char[], int);static int encode_sixpack(unsigned char *, unsigned char *, int, unsigned char);/* * Perform the persistence/slottime algorithm for CSMA access. If the * persistence check was successful, write the data to the serial driver. * Note that in case of DAMA operation, the data is not sent here. */static void sp_xmit_on_air(unsigned long channel){	struct sixpack *sp = (struct sixpack *) channel;	int actual, when = sp->slottime;	static unsigned char random;	random = random * 17 + 41;	if (((sp->status1 & SIXP_DCD_MASK) == 0) && (random < sp->persistence)) {		sp->led_state = 0x70;		sp->tty->driver->write(sp->tty, &sp->led_state, 1);		sp->tx_enable = 1;		actual = sp->tty->driver->write(sp->tty, sp->xbuff, sp->status2);		sp->xleft -= actual;		sp->xhead += actual;		sp->led_state = 0x60;		sp->tty->driver->write(sp->tty, &sp->led_state, 1);		sp->status2 = 0;	} else		mod_timer(&sp->tx_t, jiffies + ((when + 1) * HZ) / 100);}/* ----> 6pack timer interrupt handler and friends. <---- *//* Encapsulate one AX.25 frame and stuff into a TTY queue. */static void sp_encaps(struct sixpack *sp, unsigned char *icp, int len){	unsigned char *msg, *p = icp;	int actual, count;	if (len > sp->mtu) {	/* sp->mtu = AX25_MTU = max. PACLEN = 256 */		msg = "oversized transmit packet!";		goto out_drop;	}	if (len > sp->mtu) {	/* sp->mtu = AX25_MTU = max. PACLEN = 256 */		msg = "oversized transmit packet!";		goto out_drop;	}	if (p[0] > 5) {		msg = "invalid KISS command";		goto out_drop;	}	if ((p[0] != 0) && (len > 2)) {		msg = "KISS control packet too long";		goto out_drop;	}	if ((p[0] == 0) && (len < 15)) {		msg = "bad AX.25 packet to transmit";		goto out_drop;	}	count = encode_sixpack(p, sp->xbuff, len, sp->tx_delay);	set_bit(TTY_DO_WRITE_WAKEUP, &sp->tty->flags);	switch (p[0]) {	case 1:	sp->tx_delay = p[1];		return;	case 2:	sp->persistence = p[1];		return;	case 3:	sp->slottime = p[1];		return;	case 4:	/* ignored */		return;	case 5:	sp->duplex = p[1];		return;	}	if (p[0] != 0)		return;	/*	 * In case of fullduplex or DAMA operation, we don't take care about the	 * state of the DCD or of any timers, as the determination of the	 * correct time to send is the job of the AX.25 layer. We send	 * immediately after data has arrived.	 */	if (sp->duplex == 1) {		sp->led_state = 0x70;		sp->tty->driver->write(sp->tty, &sp->led_state, 1);		sp->tx_enable = 1;		actual = sp->tty->driver->write(sp->tty, sp->xbuff, count);		sp->xleft = count - actual;		sp->xhead = sp->xbuff + actual;		sp->led_state = 0x60;		sp->tty->driver->write(sp->tty, &sp->led_state, 1);	} else {		sp->xleft = count;		sp->xhead = sp->xbuff;		sp->status2 = count;		sp_xmit_on_air((unsigned long)sp);	}	return;out_drop:	sp->stats.tx_dropped++;	netif_start_queue(sp->dev);	if (net_ratelimit())		printk(KERN_DEBUG "%s: %s - dropped.\n", sp->dev->name, msg);}/* Encapsulate an IP datagram and kick it into a TTY queue. */static int sp_xmit(struct sk_buff *skb, struct net_device *dev){	struct sixpack *sp = netdev_priv(dev);	spin_lock_bh(&sp->lock);	/* We were not busy, so we are now... :-) */	netif_stop_queue(dev);	sp->stats.tx_bytes += skb->len;	sp_encaps(sp, skb->data, skb->len);	spin_unlock_bh(&sp->lock);	dev_kfree_skb(skb);	return 0;}static int sp_open_dev(struct net_device *dev){	struct sixpack *sp = netdev_priv(dev);	if (sp->tty == NULL)		return -ENODEV;	return 0;}/* Close the low-level part of the 6pack channel. */static int sp_close(struct net_device *dev){	struct sixpack *sp = netdev_priv(dev);	spin_lock_bh(&sp->lock);	if (sp->tty) {		/* TTY discipline is running. */		clear_bit(TTY_DO_WRITE_WAKEUP, &sp->tty->flags);	}	netif_stop_queue(dev);	spin_unlock_bh(&sp->lock);	return 0;}/* Return the frame type ID */static int sp_header(struct sk_buff *skb, struct net_device *dev,	unsigned short type, void *daddr, void *saddr, unsigned len){#ifdef CONFIG_INET	if (type != htons(ETH_P_AX25))		return ax25_hard_header(skb, dev, type, daddr, saddr, len);#endif	return 0;}static struct net_device_stats *sp_get_stats(struct net_device *dev){	struct sixpack *sp = netdev_priv(dev);	return &sp->stats;}static int sp_set_mac_address(struct net_device *dev, void *addr){	struct sockaddr_ax25 *sa = addr;	spin_lock_irq(&dev->xmit_lock);	memcpy(dev->dev_addr, &sa->sax25_call, AX25_ADDR_LEN);	spin_unlock_irq(&dev->xmit_lock);	return 0;}static int sp_rebuild_header(struct sk_buff *skb){#ifdef CONFIG_INET	return ax25_rebuild_header(skb);#else	return 0;#endif}static void sp_setup(struct net_device *dev){	static char ax25_bcast[AX25_ADDR_LEN] =		{'Q'<<1,'S'<<1,'T'<<1,' '<<1,' '<<1,' '<<1,'0'<<1};	static char ax25_test[AX25_ADDR_LEN] =		{'L'<<1,'I'<<1,'N'<<1,'U'<<1,'X'<<1,' '<<1,'1'<<1};	/* Finish setting up the DEVICE info. */	dev->mtu		= SIXP_MTU;	dev->hard_start_xmit	= sp_xmit;	dev->open		= sp_open_dev;	dev->destructor		= free_netdev;	dev->stop		= sp_close;	dev->hard_header	= sp_header;	dev->get_stats	        = sp_get_stats;	dev->set_mac_address    = sp_set_mac_address;	dev->hard_header_len	= AX25_MAX_HEADER_LEN;	dev->addr_len		= AX25_ADDR_LEN;	dev->type		= ARPHRD_AX25;	dev->tx_queue_len	= 10;	dev->rebuild_header	= sp_rebuild_header;	dev->tx_timeout		= NULL;	/* Only activated in AX.25 mode */	memcpy(dev->broadcast, ax25_bcast, AX25_ADDR_LEN);	memcpy(dev->dev_addr, ax25_test, AX25_ADDR_LEN);	SET_MODULE_OWNER(dev);	dev->flags		= 0;}/* Send one completely decapsulated IP datagram to the IP layer. *//* * This is the routine that sends the received data to the kernel AX.25. * 'cmd' is the KISS command. For AX.25 data, it is zero. */static void sp_bump(struct sixpack *sp, char cmd){	struct sk_buff *skb;	int count;	unsigned char *ptr;	count = sp->rcount + 1;	sp->stats.rx_bytes += count;	if ((skb = dev_alloc_skb(count)) == NULL)		goto out_mem;	ptr = skb_put(skb, count);	*ptr++ = cmd;	/* KISS command */	memcpy(ptr, sp->cooked_buf + 1, count);	skb->protocol = ax25_type_trans(skb, sp->dev);	netif_rx(skb);	sp->dev->last_rx = jiffies;	sp->stats.rx_packets++;	return;out_mem:	sp->stats.rx_dropped++;}/* ----------------------------------------------------------------------- *//* * We have a potential race on dereferencing tty->disc_data, because the tty * layer provides no locking at all - thus one cpu could be running * sixpack_receive_buf while another calls sixpack_close, which zeroes * tty->disc_data and frees the memory that sixpack_receive_buf is using.  The * best way to fix this is to use a rwlock in the tty struct, but for now we * use a single global rwlock for all ttys in ppp line discipline. */static DEFINE_RWLOCK(disc_data_lock);                                                                                static struct sixpack *sp_get(struct tty_struct *tty){	struct sixpack *sp;	read_lock(&disc_data_lock);	sp = tty->disc_data;	if (sp)		atomic_inc(&sp->refcnt);	read_unlock(&disc_data_lock);	return sp;}static void sp_put(struct sixpack *sp){	if (atomic_dec_and_test(&sp->refcnt))		up(&sp->dead_sem);}/* * Called by the TTY driver when there's room for more data.  If we have * more packets to send, we send them here. */static void sixpack_write_wakeup(struct tty_struct *tty){	struct sixpack *sp = sp_get(tty);	int actual;	if (!sp)		return;	if (sp->xleft <= 0)  {		/* Now serial buffer is almost free & we can start		 * transmission of another packet */		sp->stats.tx_packets++;		clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);		sp->tx_enable = 0;		netif_wake_queue(sp->dev);		goto out;	}	if (sp->tx_enable) {		actual = tty->driver->write(tty, sp->xhead, sp->xleft);		sp->xleft -= actual;		sp->xhead += actual;	}out:	sp_put(sp);}/* ----------------------------------------------------------------------- */static int sixpack_receive_room(struct tty_struct *tty){	return 65536;  /* We can handle an infinite amount of data. :-) */}/* * Handle the 'receiver data ready' interrupt. * This function is called by the 'tty_io' module in the kernel when * a block of 6pack data has been received, which can now be decapsulated * and sent on to some IP layer for further processing. */static void sixpack_receive_buf(struct tty_struct *tty,	const unsigned char *cp, char *fp, int count){	struct sixpack *sp;	unsigned char buf[512];	int count1;	if (!count)		return;	sp = sp_get(tty);	if (!sp)		return;	memcpy(buf, cp, count < sizeof(buf) ? count : sizeof(buf));	/* Read the characters out of the buffer */	count1 = count;	while (count) {		count--;		if (fp && *fp++) {			if (!test_and_set_bit(SIXPF_ERROR, &sp->flags))				sp->stats.rx_errors++;			continue;		}	}	sixpack_decode(sp, buf, count1);	sp_put(sp);	if (test_and_clear_bit(TTY_THROTTLED, &tty->flags)	    && tty->driver->unthrottle)		tty->driver->unthrottle(tty);}/* * Try to resync the TNC. Called by the resync timer defined in * decode_prio_command */#define TNC_UNINITIALIZED	0#define TNC_UNSYNC_STARTUP	1#define TNC_UNSYNCED		2#define TNC_IN_SYNC		3static void __tnc_set_sync_state(struct sixpack *sp, int new_tnc_state){	char *msg;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧美综合在线精品| 五月开心婷婷久久| 奇米一区二区三区av| 欧美美女激情18p| 日韩精品视频网| 日韩精品中文字幕在线不卡尤物| 亚洲成人中文在线| 制服丝袜成人动漫| 国产精品中文字幕一区二区三区| 久久先锋影音av鲁色资源网| 懂色av一区二区三区蜜臀| 国产精品欧美一级免费| 一本到三区不卡视频| 一区二区三区蜜桃网| 欧美一二三在线| 国产成人免费av在线| 亚洲视频在线观看三级| 欧美日韩国产另类不卡| 国产在线精品一区二区夜色| 国产精品免费视频观看| 欧美亚洲一区二区在线观看| 麻豆视频观看网址久久| 国产精品久久777777| 欧美日韩在线精品一区二区三区激情| 琪琪久久久久日韩精品| 国产精品丝袜在线| 欧美日韩一区二区三区视频| 久久99深爱久久99精品| 亚洲欧洲一区二区三区| 欧美一区二区视频网站| 成人免费看视频| 欧美aaaaaa午夜精品| 国产精品久久久久久久久免费樱桃 | 欧美精品一区二区久久婷婷| 成人激情校园春色| 热久久国产精品| 最新高清无码专区| 久久综合成人精品亚洲另类欧美 | 国产精品一二一区| 亚洲在线中文字幕| 久久先锋影音av| 欧美日韩1234| 99视频超级精品| 久久国产福利国产秒拍| 樱花影视一区二区| 欧美—级在线免费片| 欧美一区二区三区视频免费播放| 国产精品99久久久久久似苏梦涵 | 成人黄色软件下载| 麻豆精品一区二区av白丝在线| 国产精品免费av| 精品国产一区二区三区久久久蜜月 | 欧美人与z0zoxxxx视频| 91在线你懂得| 丁香网亚洲国际| 久久97超碰国产精品超碰| 亚洲成人免费视频| 亚洲美女在线一区| 国产精品毛片a∨一区二区三区| 日韩欧美国产成人一区二区| 欧美日韩精品二区第二页| 色诱视频网站一区| 91免费看片在线观看| 国产成人一区在线| 国产一区二区三区香蕉 | 久久99久久久欧美国产| 五月天丁香久久| 亚洲成人av福利| 一区二区免费在线播放| 亚洲日本在线看| 一区视频在线播放| 成人免费在线视频观看| 中文字幕一区二区三区不卡在线 | 99亚偷拍自图区亚洲| 国产成人免费在线观看不卡| 国产剧情一区二区三区| 激情综合色播激情啊| 国产真实乱偷精品视频免| 狠狠狠色丁香婷婷综合久久五月| 美国欧美日韩国产在线播放| 日产欧产美韩系列久久99| 日韩电影在线免费| 青青国产91久久久久久| 老司机免费视频一区二区 | 亚洲国产一区二区在线播放| 一区二区三区中文字幕精品精品| 国产精品久久久久久久久晋中| 国产精品视频一二三区| 中文字幕制服丝袜一区二区三区 | 91社区在线播放| 欧美亚一区二区| 欧美人伦禁忌dvd放荡欲情| 日韩你懂的在线播放| 久久这里只有精品视频网| 国产日产精品1区| 国产精品国产三级国产aⅴ中文 | 久久不见久久见免费视频1| 狠狠色丁香婷婷综合久久片| 成人免费毛片嘿嘿连载视频| 91伊人久久大香线蕉| 欧美精品日韩一本| 欧美精品一区二区久久婷婷| 亚洲欧洲精品一区二区三区不卡| 亚洲女子a中天字幕| 日韩电影在线一区二区| 国产精品白丝jk黑袜喷水| 91毛片在线观看| 国产麻豆精品theporn| 欧美天堂亚洲电影院在线播放| 久久色在线视频| 国产精品久久久久aaaa| 国产三级精品三级在线专区| 中文字幕乱码亚洲精品一区| 亚洲日本乱码在线观看| 日韩电影在线一区| 成人av网址在线| 欧美日韩免费不卡视频一区二区三区| 日韩欧美国产三级电影视频| 国产精品初高中害羞小美女文| 天天色综合成人网| 国产不卡视频一区二区三区| 欧美日韩国产区一| 中文字幕不卡的av| 欧美a级一区二区| 91香蕉视频mp4| 日韩欧美中文字幕精品| 亚洲女同女同女同女同女同69| 日本美女一区二区三区视频| 99精品视频中文字幕| 日韩小视频在线观看专区| 最新热久久免费视频| 精品一区二区三区视频在线观看 | 亚洲三级在线免费观看| 美女一区二区三区在线观看| 色噜噜狠狠成人网p站| 久久久久久久久久久久久久久99| 亚洲综合另类小说| 99久久综合99久久综合网站| 日韩免费看网站| 午夜av一区二区三区| 色综合咪咪久久| 国产亚洲精品bt天堂精选| 青青草视频一区| 欧美网站一区二区| 综合分类小说区另类春色亚洲小说欧美| 麻豆精品一区二区三区| 欧美日韩免费观看一区三区| 亚洲色欲色欲www| 成人综合激情网| 国产日韩欧美电影| 国产一区二区调教| 精品国产91亚洲一区二区三区婷婷 | 国产精品人妖ts系列视频| 国产真实乱子伦精品视频| 日韩三级视频在线观看| 丝瓜av网站精品一区二区| 欧美体内she精视频| 一区二区在线观看免费| 91视频免费播放| 亚洲久草在线视频| 色综合久久综合网| 亚洲欧美日韩在线| 91精品福利在线| 亚洲伊人伊色伊影伊综合网| 99re66热这里只有精品3直播| 亚洲国产成人自拍| 成人午夜短视频| 中文字幕日韩一区| 色综合久久88色综合天天6 | 亚洲一区二区三区激情| 欧美主播一区二区三区美女| 一区二区三区免费网站| 欧美性大战久久久久久久蜜臀| 亚洲乱码国产乱码精品精98午夜| 91激情五月电影| 亚洲1区2区3区4区| 日韩一区二区在线观看视频 | 裸体一区二区三区| 欧美精品一区二区精品网| 国产一区二区三区不卡在线观看| 久久久久久久免费视频了| 成人精品一区二区三区四区 | 日韩一区二区影院| 国产一区激情在线| 国产精品免费视频一区| 91精品1区2区| 日本欧美肥老太交大片| 久久精品在线观看| 91在线视频免费观看| 亚洲不卡在线观看| 欧美xingq一区二区| 国产suv精品一区二区6| 自拍偷拍欧美精品| 在线电影一区二区三区| 国产一区二区按摩在线观看| 亚洲欧洲精品一区二区三区不卡| 欧洲一区在线观看| 精品一区二区三区在线播放| 中文字幕一区二区三区四区| 欧美精品亚洲二区|