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

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

?? 6pack.c

?? linux和2410結合開發 用他可以生成2410所需的zImage文件
?? 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. * * Version:	@(#)6pack.c	0.3.0	04/07/98 * * Authors:	Andreas K鰊sgen <ajk@iehk.rwth-aachen.de> * * Quite a lot of stuff "stolen" by J鰎g 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 <asm/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/if_arp.h>#include <linux/init.h>#include <linux/ip.h>#include <linux/tcp.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			25	/* in 10 ms */#define SIXP_PERSIST			50	/* in 256ths */#define SIXP_SLOTTIME			10	/* in 10 ms */#define SIXP_INIT_RESYNC_TIMEOUT	150	/* in 10 ms */#define SIXP_RESYNC_TIMEOUT		500	/* in 10 ms *//* 6pack configuration. */#define SIXP_NRUNIT			31      /* MAX number of 6pack channels */#define SIXP_MTU			256	/* Default MTU */enum sixpack_flags {	SIXPF_INUSE,	/* Channel in use	*/	SIXPF_ERROR,	/* Parity, etc. error	*/};struct sixpack {	int			magic;	/* 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;         /* pointer to 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		persistance;	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_ok;	struct timer_list	tx_t;	struct timer_list	resync_t;};#define AX25_6PACK_HEADER_LEN 0#define SIXPACK_MAGIC 0x5304typedef struct sixpack_ctrl {	struct sixpack	ctrl;			/* 6pack things			*/	struct net_device	dev;		/* the device			*/} sixpack_ctrl_t;static sixpack_ctrl_t **sixpack_ctrls;int sixpack_maxdev = SIXP_NRUNIT;	/* Can be overridden with insmod! */MODULE_PARM(sixpack_maxdev, "i");MODULE_PARM_DESC(sixpack_maxdev, "number of 6PACK devices");static void sp_start_tx_timer(struct sixpack *);static void sp_xmit_on_air(unsigned long);static void resync_tnc(unsigned long);static void sixpack_decode(struct sixpack *, unsigned char[], int);static int encode_sixpack(unsigned char *, unsigned char *, int, unsigned char);static int sixpack_init(struct net_device *dev);static void decode_prio_command(unsigned char, struct sixpack *);static void decode_std_command(unsigned char, struct sixpack *);static void decode_data(unsigned char, struct sixpack *);static int tnc_init(struct sixpack *);/* Find a free 6pack channel, and link in this `tty' line. */static inline struct sixpack *sp_alloc(void){	sixpack_ctrl_t *spp = NULL;	int i;	for (i = 0; i < sixpack_maxdev; i++) {		spp = sixpack_ctrls[i];		if (spp == NULL)			break;		if (!test_and_set_bit(SIXPF_INUSE, &spp->ctrl.flags))			break;	}	/* Too many devices... */	if (i >= sixpack_maxdev)		return NULL;	/* If no channels are available, allocate one */	if (!spp &&	    (sixpack_ctrls[i] = (sixpack_ctrl_t *)kmalloc(sizeof(sixpack_ctrl_t),						    GFP_KERNEL)) != NULL) {		spp = sixpack_ctrls[i];		memset(spp, 0, sizeof(sixpack_ctrl_t));		/* Initialize channel control data */		set_bit(SIXPF_INUSE, &spp->ctrl.flags);		spp->ctrl.tty         = NULL;		sprintf(spp->dev.name, "sp%d", i);		spp->dev.base_addr    = i;		spp->dev.priv         = (void *) &spp->ctrl;		spp->dev.next         = NULL;		spp->dev.init         = sixpack_init;	}	if (spp != NULL) {		/* register device so that it can be ifconfig'ed       */		/* sixpack_init() will be called as a side-effect         */		/* SIDE-EFFECT WARNING: sixpack_init() CLEARS spp->ctrl ! */		if (register_netdev(&spp->dev) == 0) {			set_bit(SIXPF_INUSE, &spp->ctrl.flags);			spp->ctrl.dev = &spp->dev;			spp->dev.priv = (void *) &spp->ctrl;			SET_MODULE_OWNER(&spp->dev);			return &spp->ctrl;		} else {			clear_bit(SIXPF_INUSE, &spp->ctrl.flags);			printk(KERN_WARNING "sp_alloc() - register_netdev() failure.\n");		}	}	return NULL;}/* Free a 6pack channel. */static inline void sp_free(struct sixpack *sp){	/* Free all 6pack frame buffers. */	if (sp->rbuff)		kfree(sp->rbuff);	sp->rbuff = NULL;	if (sp->xbuff)		kfree(sp->xbuff);	sp->xbuff = NULL;	if (!test_and_clear_bit(SIXPF_INUSE, &sp->flags))		printk(KERN_WARNING "%s: sp_free for already free unit.\n", sp->dev->name);}/* 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) {		printk(KERN_DEBUG "%s: memory squeeze, dropping packet.\n", sp->dev->name);		sp->stats.rx_dropped++;		return;	}	skb->dev = sp->dev;	ptr = skb_put(skb, count);	*ptr++ = cmd;	/* KISS command */	memcpy(ptr, (sp->cooked_buf)+1, count);	skb->mac.raw = skb->data;	skb->protocol = htons(ETH_P_AX25);	netif_rx(skb);	sp->stats.rx_packets++;}/* ----------------------------------------------------------------------- *//* 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 *p;	int actual, count;	if (len > sp->mtu) {	/* sp->mtu = AX25_MTU = max. PACLEN = 256 */		printk(KERN_DEBUG "%s: truncating oversized transmit packet!\n", sp->dev->name);		sp->stats.tx_dropped++;		netif_start_queue(sp->dev);		return;	}	p = icp;	if (p[0] > 5) {		printk(KERN_DEBUG "%s: invalid KISS command -- dropped\n", sp->dev->name);		netif_start_queue(sp->dev);		return;	}	if ((p[0] != 0) && (len > 2)) {		printk(KERN_DEBUG "%s: KISS control packet too long -- dropped\n", sp->dev->name);		netif_start_queue(sp->dev);		return;	}	if ((p[0] == 0) && (len < 15)) {		printk(KERN_DEBUG "%s: bad AX.25 packet to transmit -- dropped\n", sp->dev->name);		netif_start_queue(sp->dev);		sp->stats.tx_dropped++;		return;	}	count = encode_sixpack(p, (unsigned char *) sp->xbuff, len, sp->tx_delay);	sp->tty->flags |= (1 << TTY_DO_WRITE_WAKEUP);	switch (p[0]) {		case 1:	sp->tx_delay = p[1];		return;		case 2:	sp->persistance = 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) {		/* 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, 0, &sp->led_state, 1);			sp->tx_enable = 1;			actual = sp->tty->driver.write(sp->tty, 0, sp->xbuff, count);			sp->xleft = count - actual;			sp->xhead = sp->xbuff + actual;			sp->led_state = 0x60;			sp->tty->driver.write(sp->tty, 0, &sp->led_state, 1);		} else {			sp->xleft = count;			sp->xhead = sp->xbuff;			sp->status2 = count;			if (sp->duplex == 0)				sp_start_tx_timer(sp);		}	}}/* * 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){	int actual;	struct sixpack *sp = (struct sixpack *) tty->disc_data;	/* First make sure we're connected. */	if (!sp || sp->magic != SIXPACK_MAGIC ||	    !netif_running(sp->dev))		return;	if (sp->xleft <= 0)  {		/* Now serial buffer is almost free & we can start		 * transmission of another packet */		sp->stats.tx_packets++;		tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);		sp->tx_enable = 0;		netif_wake_queue(sp->dev);		return;	}	if (sp->tx_enable == 1) {		actual = tty->driver.write(tty, 0, sp->xhead, sp->xleft);		sp->xleft -= actual;		sp->xhead += actual;	}}/* ----------------------------------------------------------------------- *//* 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 = (struct sixpack *) dev->priv;	/* 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);	dev_kfree_skb(skb);	return 0;}/* 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;	static unsigned char random;	random = random * 17 + 41;	if (((sp->status1 & SIXP_DCD_MASK) == 0) && (random < sp->persistance)) {		sp->led_state = 0x70;		sp->tty->driver.write(sp->tty, 0, &sp->led_state, 1);		sp->tx_enable = 1;		actual = sp->tty->driver.write(sp->tty, 0, sp->xbuff, sp->status2);		sp->xleft -= actual;		sp->xhead += actual;		sp->led_state = 0x60;		sp->tty->driver.write(sp->tty, 0, &sp->led_state, 1);		sp->status2 = 0;	} else		sp_start_tx_timer(sp);}/* 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_encapsulate(skb, dev, type, daddr, saddr, len);#endif	return 0;}static int sp_rebuild_header(struct sk_buff *skb){#ifdef CONFIG_INET	return ax25_rebuild_header(skb);#else	return 0;#endif}/* Open the low-level part of the 6pack channel. */static int sp_open(struct net_device *dev){	struct sixpack *sp = (struct sixpack *) dev->priv;	unsigned long len;	if (sp->tty == NULL)		return -ENODEV;	/*	 * Allocate the 6pack frame buffers:	 *	 * rbuff	Receive buffer.	 * xbuff	Transmit buffer.	 */	/* !!! length of the buffers. MTU is IP MTU, not PACLEN!	 */	len = dev->mtu * 2;	if ((sp->rbuff = kmalloc(len + 4, GFP_KERNEL)) == NULL)		return -ENOMEM;	if ((sp->xbuff = kmalloc(len + 4, GFP_KERNEL)) == NULL) {		kfree(sp->rbuff);		return -ENOMEM;	}	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   &= (1 << SIXPF_INUSE);      /* Clear ESCAPE & ERROR flags */	sp->duplex = 0;	sp->tx_delay    = SIXP_TXDELAY;	sp->persistance = SIXP_PERSIST;	sp->slottime    = SIXP_SLOTTIME;	sp->led_state   = 0x60;	sp->status      = 1;	sp->status1     = 1;	sp->status2     = 0;	sp->tnc_ok      = 0;	sp->tx_enable   = 0;	netif_start_queue(dev);	init_timer(&sp->tx_t);	init_timer(&sp->resync_t);	return 0;}/* Close the low-level part of the 6pack channel. */static int sp_close(struct net_device *dev){	struct sixpack *sp = (struct sixpack *) dev->priv;	if (sp->tty == NULL)		return -EBUSY;	sp->tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);	netif_stop_queue(dev);	return 0;}static int sixpack_receive_room(struct tty_struct *tty){	return 65536;  /* We can handle an infinite amount of data. :-) */}/* !!! receive state machine *//* * 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){	unsigned char buf[512];	unsigned long flags;	int count1;	struct sixpack *sp = (struct sixpack *) tty->disc_data;	if (!sp || sp->magic != SIXPACK_MAGIC ||	    !netif_running(sp->dev) || !count)		return;	save_flags(flags);	cli();	memcpy(buf, cp, count<sizeof(buf)? count:sizeof(buf));	restore_flags(flags);	/* Read the characters out of the buffer */	count1 = count;	while (count) {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美丰满一区二区免费视频| 成人av午夜电影| 欧美日精品一区视频| 亚洲欧美激情小说另类| 色综合夜色一区| 亚洲一区成人在线| 91精品国产综合久久精品| 美国三级日本三级久久99| 日韩精品一区二区三区蜜臀 | 一本大道久久a久久综合婷婷| 成人免费一区二区三区在线观看| 97久久久精品综合88久久| 亚洲在线观看免费视频| 欧美大尺度电影在线| 高清视频一区二区| 一二三四社区欧美黄| 精品捆绑美女sm三区| 国产黄色成人av| 亚洲综合久久av| 日韩欧美国产一区二区三区 | 激情小说欧美图片| 国产精品入口麻豆原神| 欧美视频你懂的| 久久电影网站中文字幕| 亚洲欧洲精品一区二区三区| 欧美日韩一区二区三区免费看| 麻豆精品在线播放| 综合欧美一区二区三区| 精品国产网站在线观看| 91亚洲资源网| 久久国产精品免费| 亚洲欧美成人一区二区三区| 日韩一级成人av| 91视频91自| 国产精品资源网站| 亚洲成人午夜影院| 亚洲国产精品二十页| 欧美丰满一区二区免费视频| 成人av小说网| 国产精品影视网| 天涯成人国产亚洲精品一区av| 国产午夜亚洲精品午夜鲁丝片 | 6080亚洲精品一区二区| 国产91高潮流白浆在线麻豆| 午夜成人在线视频| 亚洲欧美一区二区三区国产精品| 日韩精品一区二区三区蜜臀 | 国产精品综合av一区二区国产馆| 亚洲国产精品久久久久秋霞影院 | 中文字幕+乱码+中文字幕一区| 欧美精品xxxxbbbb| 99久久婷婷国产精品综合| 蜜桃精品视频在线| 丝袜美腿亚洲一区二区图片| 亚洲卡通欧美制服中文| 国产欧美一区二区精品久导航| 日韩视频永久免费| 在线精品视频免费播放| 一本到不卡免费一区二区| 丁香天五香天堂综合| 九九热在线视频观看这里只有精品| 亚洲三级电影网站| 日韩久久一区二区| 自拍偷拍国产精品| 亚洲欧美在线另类| 国产精品理伦片| 国产精品麻豆欧美日韩ww| 精品粉嫩超白一线天av| 日韩亚洲电影在线| 在线成人免费观看| 欧美日韩精品一区视频| 欧美日韩精品三区| 欧美精品久久久久久久多人混战 | 一区二区三区欧美在线观看| 国产精品狼人久久影院观看方式| 欧美精品一区二区三区一线天视频| 91精品国产综合久久精品app| 精品视频免费在线| 欧美日韩国产免费一区二区| 欧美日韩1区2区| 欧美一区二区人人喊爽| 日韩一区国产二区欧美三区| 3d成人动漫网站| 欧美一区二区免费视频| 日韩一区二区三| 日韩精品一区二区三区蜜臀| 精品国产三级电影在线观看| 26uuu色噜噜精品一区二区| 精品美女一区二区| 久久精品在线免费观看| 国产欧美va欧美不卡在线| 国产日韩欧美精品综合| 中文字幕欧美一区| 一区二区在线观看av| 爽好久久久欧美精品| 久久精品999| 成人小视频免费观看| 97se亚洲国产综合在线| 欧美日韩一区在线观看| 91麻豆精品国产91久久久资源速度 | 欧美激情一区不卡| 亚洲欧洲日本在线| 亚洲国产日产av| 久久99久久精品欧美| 成人精品一区二区三区中文字幕| 91在线精品秘密一区二区| 欧美美女喷水视频| 久久精品欧美一区二区三区不卡| 中文字幕中文乱码欧美一区二区| 亚洲一区二区三区视频在线播放 | 日韩av在线发布| 国产精品综合二区| 欧美性受极品xxxx喷水| 欧美成人猛片aaaaaaa| 国产精品国产三级国产a| 午夜精品福利在线| 不卡一区二区在线| 91精品国产91综合久久蜜臀| 国产区在线观看成人精品| 亚洲国产成人91porn| 国产激情一区二区三区| 欧美三级在线播放| 日本一二三不卡| 美女视频一区在线观看| eeuss国产一区二区三区| 欧美一级理论片| 亚洲视频精选在线| 国产乱码精品1区2区3区| 欧美日韩在线观看一区二区| 国产日韩欧美激情| 日韩成人dvd| 在线观看欧美黄色| 国产精品沙发午睡系列990531| 日韩av电影免费观看高清完整版 | 日韩福利视频导航| 99久久国产综合精品色伊| 精品美女在线观看| 天天综合网天天综合色| 91精品福利在线| 中文字幕欧美日本乱码一线二线| 日韩高清不卡一区二区| 色88888久久久久久影院按摩| 久久亚区不卡日本| 日本中文字幕一区二区视频 | 在线观看91视频| 中文字幕在线不卡| 国产一区二区福利| 欧美电影一区二区三区| 亚洲精品中文字幕在线观看| 国内精品久久久久影院色| 欧美电影在哪看比较好| 亚洲一区二区在线视频| 色呦呦网站一区| 自拍偷拍欧美精品| www.久久精品| 国产精品盗摄一区二区三区| 国产99久久久国产精品潘金| 国产亚洲欧美一级| 国产一区二区三区不卡在线观看| 日韩视频一区二区三区在线播放| 婷婷国产在线综合| 欧美人体做爰大胆视频| 亚洲高清不卡在线| 欧美日韩一区二区在线观看视频| 亚洲欧美另类小说| 日本乱码高清不卡字幕| 亚洲精品欧美专区| 色视频成人在线观看免| 亚洲精品视频在线观看免费| 91视视频在线观看入口直接观看www | 国产在线精品一区在线观看麻豆| 日韩一区二区免费在线电影| 免费看黄色91| 日韩一级大片在线观看| 久久国产精品一区二区| 久久精品视频一区| 国产成人av在线影院| 国产精品不卡在线| 日本韩国一区二区三区| 亚洲第一搞黄网站| 56国语精品自产拍在线观看| 日韩电影在线免费看| 欧美一二三区在线观看| 国产一区二区电影| 国产精品久久久久久亚洲伦 | 91精品国产欧美日韩| 免费美女久久99| 欧美极品少妇xxxxⅹ高跟鞋 | 欧美激情在线观看视频免费| 成人精品一区二区三区四区| 亚洲欧美另类久久久精品2019| 欧美午夜影院一区| 久久精品国产色蜜蜜麻豆| 国产片一区二区| 在线亚洲人成电影网站色www| 首页国产欧美日韩丝袜| 久久综合久久久久88| 99久久精品国产毛片| 日一区二区三区| 国产无一区二区|