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

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

?? 6pack.c

?? h內核
?? C
?? 第 1 頁 / 共 2 頁
字號:
 * 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;	switch (new_tnc_state) {	default:			/* gcc oh piece-o-crap ... */	case TNC_UNSYNC_STARTUP:		msg = "Synchronizing with TNC";		break;	case TNC_UNSYNCED:		msg = "Lost synchronization with TNC\n";		break;	case TNC_IN_SYNC:		msg = "Found TNC";		break;	}	sp->tnc_state = new_tnc_state;	printk(KERN_INFO "%s: %s\n", sp->dev->name, msg);}static inline void tnc_set_sync_state(struct sixpack *sp, int new_tnc_state){	int old_tnc_state = sp->tnc_state;	if (old_tnc_state != new_tnc_state)		__tnc_set_sync_state(sp, new_tnc_state);}static void resync_tnc(unsigned long channel){	struct sixpack *sp = (struct sixpack *) channel;	static char resync_cmd = 0xe8;	/* clear any data that might have been received */	sp->rx_count = 0;	sp->rx_count_cooked = 0;	/* reset state machine */	sp->status = 1;	sp->status1 = 1;	sp->status2 = 0;	/* resync the TNC */	sp->led_state = 0x60;	sp->tty->driver->write(sp->tty, &sp->led_state, 1);	sp->tty->driver->write(sp->tty, &resync_cmd, 1);	/* Start resync timer again -- the TNC might be still absent */	del_timer(&sp->resync_t);	sp->resync_t.data	= (unsigned long) sp;	sp->resync_t.function	= resync_tnc;	sp->resync_t.expires	= jiffies + SIXP_RESYNC_TIMEOUT;	add_timer(&sp->resync_t);}static inline int tnc_init(struct sixpack *sp){	unsigned char inbyte = 0xe8;	tnc_set_sync_state(sp, TNC_UNSYNC_STARTUP);	sp->tty->driver->write(sp->tty, &inbyte, 1);	del_timer(&sp->resync_t);	sp->resync_t.data = (unsigned long) sp;	sp->resync_t.function = resync_tnc;	sp->resync_t.expires = jiffies + SIXP_RESYNC_TIMEOUT;	add_timer(&sp->resync_t);	return 0;}/* * Open the high-level part of the 6pack channel. * This function is called by the TTY module when the * 6pack line discipline is called for.  Because we are * sure the tty line exists, we only have to link it to * a free 6pcack channel... */static int sixpack_open(struct tty_struct *tty){	char *rbuff = NULL, *xbuff = NULL;	struct net_device *dev;	struct sixpack *sp;	unsigned long len;	int err = 0;	if (!capable(CAP_NET_ADMIN))		return -EPERM;	dev = alloc_netdev(sizeof(struct sixpack), "sp%d", sp_setup);	if (!dev) {		err = -ENOMEM;		goto out;	}	sp = netdev_priv(dev);	sp->dev = dev;	spin_lock_init(&sp->lock);	atomic_set(&sp->refcnt, 1);	init_MUTEX_LOCKED(&sp->dead_sem);	/* !!! length of the buffers. MTU is IP MTU, not PACLEN!  */	len = dev->mtu * 2;	rbuff = kmalloc(len + 4, GFP_KERNEL);	xbuff = kmalloc(len + 4, GFP_KERNEL);	if (rbuff == NULL || xbuff == NULL) {		err = -ENOBUFS;		goto out_free;	}	spin_lock_bh(&sp->lock);	sp->tty = tty;	sp->rbuff	= rbuff;	sp->xbuff	= xbuff;	sp->mtu		= AX25_MTU + 73;	sp->buffsize	= len;	sp->rcount	= 0;	sp->rx_count	= 0;	sp->rx_count_cooked = 0;	sp->xleft	= 0;	sp->flags	= 0;		/* Clear ESCAPE & ERROR flags */	sp->duplex	= 0;	sp->tx_delay    = SIXP_TXDELAY;	sp->persistence = SIXP_PERSIST;	sp->slottime    = SIXP_SLOTTIME;	sp->led_state   = 0x60;	sp->status      = 1;	sp->status1     = 1;	sp->status2     = 0;	sp->tx_enable   = 0;	netif_start_queue(dev);	init_timer(&sp->tx_t);	init_timer(&sp->resync_t);	spin_unlock_bh(&sp->lock);	/* Done.  We have linked the TTY line to a channel. */	tty->disc_data = sp;	/* Now we're ready to register. */	if (register_netdev(dev))		goto out_free;	tnc_init(sp);	return 0;out_free:	kfree(xbuff);	kfree(rbuff);	if (dev)		free_netdev(dev);out:	return err;}/* * Close down a 6pack channel. * This means flushing out any pending queues, and then restoring the * TTY line discipline to what it was before it got hooked to 6pack * (which usually is TTY again). */static void sixpack_close(struct tty_struct *tty){	struct sixpack *sp;	write_lock(&disc_data_lock);	sp = tty->disc_data;	tty->disc_data = NULL;	write_unlock(&disc_data_lock);	if (sp == 0)		return;	/*	 * We have now ensured that nobody can start using ap from now on, but	 * we have to wait for all existing users to finish.	 */	if (!atomic_dec_and_test(&sp->refcnt))		down(&sp->dead_sem);	unregister_netdev(sp->dev);	del_timer(&sp->tx_t);	del_timer(&sp->resync_t);	/* Free all 6pack frame buffers. */	kfree(sp->rbuff);	kfree(sp->xbuff);}/* Perform I/O control on an active 6pack channel. */static int sixpack_ioctl(struct tty_struct *tty, struct file *file,	unsigned int cmd, unsigned long arg){	struct sixpack *sp = sp_get(tty);	struct net_device *dev = sp->dev;	unsigned int tmp, err;	if (!sp)		return -ENXIO;	switch(cmd) {	case SIOCGIFNAME:		err = copy_to_user((void *) arg, dev->name,		                   strlen(dev->name) + 1) ? -EFAULT : 0;		break;	case SIOCGIFENCAP:		err = put_user(0, (int __user *)arg);		break;	case SIOCSIFENCAP:		if (get_user(tmp, (int __user *) arg)) {			err = -EFAULT;			break;		}		sp->mode = tmp;		dev->addr_len        = AX25_ADDR_LEN;		dev->hard_header_len = AX25_KISS_HEADER_LEN +		                       AX25_MAX_HEADER_LEN + 3;		dev->type            = ARPHRD_AX25;		err = 0;		break;	 case SIOCSIFHWADDR: {		char addr[AX25_ADDR_LEN];		if (copy_from_user(&addr,		                   (void __user *) arg, AX25_ADDR_LEN)) {			err = -EFAULT;			break;		}		spin_lock_irq(&dev->xmit_lock);		memcpy(dev->dev_addr, &addr, AX25_ADDR_LEN);		spin_unlock_irq(&dev->xmit_lock);		err = 0;		break;	}	/* Allow stty to read, but not set, the serial port */	case TCGETS:	case TCGETA:		err = n_tty_ioctl(tty, (struct file *) file, cmd, arg);		break;	default:		err = -ENOIOCTLCMD;	}	sp_put(sp);	return err;}static struct tty_ldisc sp_ldisc = {	.owner		= THIS_MODULE,	.magic		= TTY_LDISC_MAGIC,	.name		= "6pack",	.open		= sixpack_open,	.close		= sixpack_close,	.ioctl		= sixpack_ioctl,	.receive_buf	= sixpack_receive_buf,	.receive_room	= sixpack_receive_room,	.write_wakeup	= sixpack_write_wakeup,};/* Initialize 6pack control device -- register 6pack line discipline */static char msg_banner[]  __initdata = KERN_INFO \	"AX.25: 6pack driver, " SIXPACK_VERSION "\n";static char msg_regfail[] __initdata = KERN_ERR  \	"6pack: can't register line discipline (err = %d)\n";static int __init sixpack_init_driver(void){	int status;	printk(msg_banner);	/* Register the provided line protocol discipline */	if ((status = tty_register_ldisc(N_6PACK, &sp_ldisc)) != 0)		printk(msg_regfail, status);	return status;}static const char msg_unregfail[] __exitdata = KERN_ERR \	"6pack: can't unregister line discipline (err = %d)\n";static void __exit sixpack_exit_driver(void){	int ret;	if ((ret = tty_register_ldisc(N_6PACK, NULL)))		printk(msg_unregfail, ret);}/* encode an AX.25 packet into 6pack */static int encode_sixpack(unsigned char *tx_buf, unsigned char *tx_buf_raw,	int length, unsigned char tx_delay){	int count = 0;	unsigned char checksum = 0, buf[400];	int raw_count = 0;	tx_buf_raw[raw_count++] = SIXP_PRIO_CMD_MASK | SIXP_TX_MASK;	tx_buf_raw[raw_count++] = SIXP_SEOF;	buf[0] = tx_delay;	for (count = 1; count < length; count++)		buf[count] = tx_buf[count];	for (count = 0; count < length; count++)		checksum += buf[count];	buf[length] = (unsigned char) 0xff - checksum;	for (count = 0; count <= length; count++) {		if ((count % 3) == 0) {			tx_buf_raw[raw_count++] = (buf[count] & 0x3f);			tx_buf_raw[raw_count] = ((buf[count] >> 2) & 0x30);		} else if ((count % 3) == 1) {			tx_buf_raw[raw_count++] |= (buf[count] & 0x0f);			tx_buf_raw[raw_count] =	((buf[count] >> 2) & 0x3c);		} else {			tx_buf_raw[raw_count++] |= (buf[count] & 0x03);			tx_buf_raw[raw_count++] = (buf[count] >> 2);		}	}	if ((length % 3) != 2)		raw_count++;	tx_buf_raw[raw_count++] = SIXP_SEOF;	return raw_count;}/* decode 4 sixpack-encoded bytes into 3 data bytes */static void decode_data(struct sixpack *sp, unsigned char inbyte){	unsigned char *buf;	if (sp->rx_count != 3) {		sp->raw_buf[sp->rx_count++] = inbyte;		return;	}	buf = sp->raw_buf;	sp->cooked_buf[sp->rx_count_cooked++] =		buf[0] | ((buf[1] << 2) & 0xc0);	sp->cooked_buf[sp->rx_count_cooked++] =		(buf[1] & 0x0f) | ((buf[2] << 2) & 0xf0);	sp->cooked_buf[sp->rx_count_cooked++] =		(buf[2] & 0x03) | (inbyte << 2);	sp->rx_count = 0;}/* identify and execute a 6pack priority command byte */static void decode_prio_command(struct sixpack *sp, unsigned char cmd){	unsigned char channel;	int actual;	channel = cmd & SIXP_CHN_MASK;	if ((cmd & SIXP_PRIO_DATA_MASK) != 0) {     /* idle ? */	/* RX and DCD flags can only be set in the same prio command,	   if the DCD flag has been set without the RX flag in the previous	   prio command. If DCD has not been set before, something in the	   transmission has gone wrong. In this case, RX and DCD are	   cleared in order to prevent the decode_data routine from	   reading further data that might be corrupt. */		if (((sp->status & SIXP_DCD_MASK) == 0) &&			((cmd & SIXP_RX_DCD_MASK) == SIXP_RX_DCD_MASK)) {				if (sp->status != 1)					printk(KERN_DEBUG "6pack: protocol violation\n");				else					sp->status = 0;				cmd &= !SIXP_RX_DCD_MASK;		}		sp->status = cmd & SIXP_PRIO_DATA_MASK;	} else { /* output watchdog char if idle */		if ((sp->status2 != 0) && (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, sp->status2);			sp->xleft -= actual;			sp->xhead += actual;			sp->led_state = 0x60;			sp->status2 = 0;		}	}	/* needed to trigger the TNC watchdog */	sp->tty->driver->write(sp->tty, &sp->led_state, 1);        /* if the state byte has been received, the TNC is present,           so the resync timer can be reset. */	if (sp->tnc_state == TNC_IN_SYNC) {		del_timer(&sp->resync_t);		sp->resync_t.data	= (unsigned long) sp;		sp->resync_t.function	= resync_tnc;		sp->resync_t.expires	= jiffies + SIXP_INIT_RESYNC_TIMEOUT;		add_timer(&sp->resync_t);	}	sp->status1 = cmd & SIXP_PRIO_DATA_MASK;}/* identify and execute a standard 6pack command byte */static void decode_std_command(struct sixpack *sp, unsigned char cmd){	unsigned char checksum = 0, rest = 0, channel;	short i;	channel = cmd & SIXP_CHN_MASK;	switch (cmd & SIXP_CMD_MASK) {     /* normal command */	case SIXP_SEOF:		if ((sp->rx_count == 0) && (sp->rx_count_cooked == 0)) {			if ((sp->status & SIXP_RX_DCD_MASK) ==				SIXP_RX_DCD_MASK) {				sp->led_state = 0x68;				sp->tty->driver->write(sp->tty, &sp->led_state, 1);			}		} else {			sp->led_state = 0x60;			/* fill trailing bytes with zeroes */			sp->tty->driver->write(sp->tty, &sp->led_state, 1);			rest = sp->rx_count;			if (rest != 0)				 for (i = rest; i <= 3; i++)					decode_data(sp, 0);			if (rest == 2)				sp->rx_count_cooked -= 2;			else if (rest == 3)				sp->rx_count_cooked -= 1;			for (i = 0; i < sp->rx_count_cooked; i++)				checksum += sp->cooked_buf[i];			if (checksum != SIXP_CHKSUM) {				printk(KERN_DEBUG "6pack: bad checksum %2.2x\n", checksum);			} else {				sp->rcount = sp->rx_count_cooked-2;				sp_bump(sp, 0);			}			sp->rx_count_cooked = 0;		}		break;	case SIXP_TX_URUN: printk(KERN_DEBUG "6pack: TX underrun\n");		break;	case SIXP_RX_ORUN: printk(KERN_DEBUG "6pack: RX overrun\n");		break;	case SIXP_RX_BUF_OVL:		printk(KERN_DEBUG "6pack: RX buffer overflow\n");	}}/* decode a 6pack packet */static voidsixpack_decode(struct sixpack *sp, unsigned char *pre_rbuff, int count){	unsigned char inbyte;	int count1;	for (count1 = 0; count1 < count; count1++) {		inbyte = pre_rbuff[count1];		if (inbyte == SIXP_FOUND_TNC) {			tnc_set_sync_state(sp, TNC_IN_SYNC);			del_timer(&sp->resync_t);		}		if ((inbyte & SIXP_PRIO_CMD_MASK) != 0)			decode_prio_command(sp, inbyte);		else if ((inbyte & SIXP_STD_CMD_MASK) != 0)			decode_std_command(sp, inbyte);		else if ((sp->status & SIXP_RX_DCD_MASK) == SIXP_RX_DCD_MASK)			decode_data(sp, inbyte);	}}MODULE_AUTHOR("Ralf Baechle DO1GRB <ralf@linux-mips.org>");MODULE_DESCRIPTION("6pack driver for AX.25");MODULE_LICENSE("GPL");MODULE_ALIAS_LDISC(N_6PACK);module_init(sixpack_init_driver);module_exit(sixpack_exit_driver);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区在线播| 亚洲激情五月婷婷| 99久久精品国产观看| 亚洲国产一区二区在线播放| 日韩免费成人网| 成人av在线一区二区三区| 亚洲一区二区高清| 26uuu国产电影一区二区| 91蜜桃婷婷狠狠久久综合9色| 亚洲天堂a在线| 欧美一区二区在线视频| 成人h动漫精品一区二区| 丝袜国产日韩另类美女| 国产精品三级av在线播放| 欧美日韩国产色站一区二区三区| 国产精品自拍毛片| 亚洲成人在线观看视频| 国产欧美一区二区三区在线老狼| 成人深夜在线观看| 亚洲五码中文字幕| 国产调教视频一区| 欧美一区二区三区在| 成人av先锋影音| 欧美日韩午夜影院| 国产精品性做久久久久久| 亚洲成人免费视| 国产精品二区一区二区aⅴ污介绍| 欧美一区二区三区影视| 色综合久久综合| 麻豆91在线播放免费| 亚洲最大的成人av| 日本一区二区三区dvd视频在线| 欧美精品三级在线观看| 成人综合婷婷国产精品久久蜜臀 | 久久精品在这里| 欧美日韩黄色一区二区| 91网站黄www| 国产suv精品一区二区三区| 日产国产欧美视频一区精品| 一区二区三区色| 18成人在线观看| 久久久综合九色合综国产精品| 日本道色综合久久| 99麻豆久久久国产精品免费| 国产精品一区2区| 理论电影国产精品| 奇米综合一区二区三区精品视频| 亚洲午夜三级在线| 日韩伦理av电影| 国产精品国模大尺度视频| 久久久久久久久岛国免费| 91精品国产欧美日韩| 色视频成人在线观看免| 国产麻豆视频一区| 极品少妇一区二区三区精品视频| 免费在线成人网| 日本大胆欧美人术艺术动态| 婷婷六月综合网| 亚洲1区2区3区视频| 亚洲成人黄色小说| 亚洲高清在线视频| 亚洲福中文字幕伊人影院| 国产日韩欧美亚洲| 欧美成人a在线| 欧美精品一区二区在线观看| 欧美精品一区二区高清在线观看| 精品国产成人系列| 国产拍揄自揄精品视频麻豆| 日韩限制级电影在线观看| 日韩欧美123| 色94色欧美sute亚洲线路一ni | 亚洲一区二区三区影院| 亚洲成人免费视| 蜜臀久久久99精品久久久久久| 美女爽到高潮91| 国产精品白丝av| 成人网页在线观看| 国产成人亚洲综合a∨婷婷| 国产精品 日产精品 欧美精品| 成人动漫视频在线| 欧美在线观看视频在线| 欧美日韩高清在线播放| 日韩欧美电影一区| 日本一区二区视频在线| 亚洲激情自拍视频| 亚洲午夜一二三区视频| 日本成人在线不卡视频| 六月婷婷色综合| 成人精品视频一区二区三区| av激情综合网| 91麻豆精品91久久久久久清纯| 久久久久久免费网| 亚洲裸体xxx| 日日摸夜夜添夜夜添国产精品 | 麻豆精品一区二区av白丝在线| 日本少妇一区二区| 粉嫩久久99精品久久久久久夜| 色综合一个色综合| 日韩欧美在线不卡| 国产精品美日韩| 亚洲成人av一区二区三区| 国产制服丝袜一区| 日本韩国精品在线| 日韩美女视频在线| 亚洲色图清纯唯美| 老司机午夜精品| 懂色av一区二区三区免费观看| 欧美亚洲图片小说| 久久久久久一二三区| 午夜精品久久久久| www.久久久久久久久| 欧美一级午夜免费电影| 成人免费视频在线观看| 九色|91porny| 在线免费精品视频| 4438x亚洲最大成人网| 中文av一区二区| 久久国产欧美日韩精品| 91国偷自产一区二区三区成为亚洲经典 | 国产精品丝袜黑色高跟| 日本中文一区二区三区| 一本色道久久综合亚洲aⅴ蜜桃 | 日本午夜精品视频在线观看| 91碰在线视频| 久久久精品2019中文字幕之3| 亚洲视频1区2区| 国产成人一级电影| 日韩精品影音先锋| 午夜精品一区二区三区三上悠亚| 不卡区在线中文字幕| 久久综合av免费| 青青草原综合久久大伊人精品| 欧美一区二区三区视频| 免费观看一级欧美片| 欧美乱妇15p| 天堂av在线一区| 日韩欧美亚洲一区二区| 久久国产人妖系列| 久久丝袜美腿综合| 国产精品一二一区| 日韩av电影天堂| 日韩欧美色综合网站| 老司机精品视频在线| 精品美女一区二区三区| 国产美女娇喘av呻吟久久| 国产免费久久精品| 97se亚洲国产综合自在线观| 伊人开心综合网| 欧美日韩国产综合久久| 免费在线看成人av| 久久久久久久久久久久久夜| 春色校园综合激情亚洲| 亚洲精品日日夜夜| 91精品国产乱码久久蜜臀| 久久精品免费观看| 国产精品天美传媒| 欧美亚洲国产bt| 久久精品国产999大香线蕉| 国产免费观看久久| 在线观看国产日韩| 麻豆一区二区三区| 国产精品无遮挡| 91国产视频在线观看| 美女一区二区久久| 国产精品免费视频网站| 欧美午夜精品电影| 精品一区二区三区蜜桃| 国产精品蜜臀av| 91精品国产一区二区三区| 国产69精品久久久久毛片| 一区二区三区不卡在线观看 | 欧美日韩成人综合| 国产一区视频导航| 成人欧美一区二区三区小说| 91麻豆精品国产自产在线观看一区 | 亚洲男人的天堂网| 欧美一二三区在线| 成人av中文字幕| 男女男精品网站| 亚洲人吸女人奶水| 日韩三级电影网址| 91黄色小视频| 国产一区二区三区久久久| 亚洲一级二级在线| 欧美激情一区不卡| 日韩丝袜美女视频| 色综合久久久久| 国产一区二区伦理片| 亚洲.国产.中文慕字在线| 国产精品久久久久aaaa樱花| 日韩亚洲电影在线| 色综合色综合色综合| 国产精品一区二区久久精品爱涩 | 99久久精品久久久久久清纯| 麻豆国产精品777777在线| 亚洲午夜日本在线观看| 国产精品福利影院| 久久亚洲一区二区三区明星换脸| 777欧美精品| 在线观看日韩av先锋影音电影院|