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

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

?? slip.c

?? <Linux1.0核心游記>電子書+書后源碼+Linux1.0源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * slip.c	This module implements the SLIP protocol for kernel-based *		devices like TTY.  It interfaces between a raw TTY, and the *		kernel's INET protocol layers (via DDI). * * Version:	@(#)slip.c	0.7.6	05/25/93 * * Authors:	Laurence Culhane, <loz@holmes.demon.co.uk> *		Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> * * Fixes: *		Alan Cox	: 	Sanity checks and avoid tx overruns. *					Has a new sl->mtu field. *		Alan Cox	: 	Found cause of overrun. ifconfig sl0 mtu upwards. *					Driver now spots this and grows/shrinks its buffers(hack!). *					Memory leak if you run out of memory setting up a slip driver fixed. *		Matt Dillon	:	Printable slip (borrowed from NET2E) *	Pauline Middelink	:	Slip driver fixes. *		Alan Cox	:	Honours the old SL_COMPRESSED flag *		Alan Cox	:	KISS AX.25 and AXUI IP support *		Michael Riepe	:	Automatic CSLIP recognition added *		Charles Hedrick :	CSLIP header length problem fix. *		Alan Cox	:	Corrected non-IP cases of the above. */ #include <asm/segment.h>#include <asm/system.h>#include <linux/config.h>#include <linux/types.h>#include <linux/kernel.h>#include <linux/sched.h>#include <linux/string.h>#include <linux/mm.h>#include <linux/socket.h>#include <linux/sockios.h>#include <linux/interrupt.h>#include <linux/tty.h>#include <linux/errno.h>#include <linux/stat.h>#include <linux/in.h>#include "inet.h"#include "dev.h"#ifdef CONFIG_AX25#include "ax25.h"#endif#include "eth.h"#include "ip.h"#include "route.h"#include "protocol.h"#include "tcp.h"#include "skbuff.h"#include "sock.h"#include "arp.h"#include "slip.h"#include "slhc.h"#define	SLIP_VERSION	"0.7.5"/* Define some IP layer stuff.  Not all systems have it. */#ifdef SL_DUMP#   define	IP_VERSION	4	/* version# of our IP software	*/#   define	IPF_F_OFFSET	0x1fff	/* Offset field			*/#   define	IPF_DF		0x4000	/* Don't fragment flag		*/#   define	IPF_MF		0x2000	/* More Fragments flag		*/#   define	IP_OF_COPIED	0x80	/* Copied-on-fragmentation flag	*/#   define	IP_OF_CLASS	0x60	/* Option class			*/#   define	IP_OF_NUMBER	0x1f	/* Option number		*/#endifstatic struct slip	sl_ctrl[SL_NRUNIT];static struct tty_ldisc	sl_ldisc;static int		already = 0;/* Dump the contents of an IP datagram. */static voidip_dump(unsigned char *ptr, int len){#ifdef SL_DUMP  struct iphdr *ip;  struct tcphdr *th;  int dlen, doff;  if (inet_debug != DBG_SLIP) return;  ip = (struct iphdr *) ptr;  th = (struct tcphdr *) (ptr + ip->ihl * 4);  printk("\r%s -> %s seq %lx ack %lx len %d\n",	 in_ntoa(ip->saddr), in_ntoa(ip->daddr), 	 ntohl(th->seq), ntohl(th->ack_seq), ntohs(ip->tot_len));  return;  printk("\r*****\n");  printk("%p %d\n", ptr, len);  ip = (struct iphdr *) ptr;  dlen = ntohs(ip->tot_len);  doff = ((ntohs(ip->frag_off) & IPF_F_OFFSET) << 3);  printk("SLIP: %s->", in_ntoa(ip->saddr));  printk("%s\n", in_ntoa(ip->daddr));  printk(" len %u ihl %u ver %u ttl %u prot %u",	dlen, ip->ihl, ip->version, ip->ttl, ip->protocol);  if (ip->tos != 0) printk(" tos %u", ip->tos);  if (doff != 0 || (ntohs(ip->frag_off) & IPF_MF))	printk(" id %u offs %u", ntohs(ip->id), doff);  if (ntohs(ip->frag_off) & IPF_DF) printk(" DF");  if (ntohs(ip->frag_off) & IPF_MF) printk(" MF");  printk("\n*****\n");#endif}#if 0void clh_dump(unsigned char *cp, int len){  if (len > 60)    len = 60;  printk("%d:", len);  while (len > 0) {    printk(" %x", *cp++);    len--;  }  printk("\n\n");}#endif/* Initialize a SLIP control block for use. */static voidsl_initialize(struct slip *sl, struct device *dev){  sl->inuse		= 0;  sl->sending		= 0;  sl->escape		= 0;  sl->flags		= 0;#ifdef SL_ADAPTIVE  sl->mode		= SL_MODE_ADAPTIVE;	/* automatic CSLIP recognition */#else#ifdef SL_COMPRESSED  sl->mode		= SL_MODE_CSLIP | SL_MODE_ADAPTIVE;	/* Default */#else  sl->mode		= SL_MODE_SLIP;		/* Default for non compressors */#endif#endif    sl->line		= dev->base_addr;  sl->tty		= NULL;  sl->dev		= dev;  sl->slcomp		= NULL;  /* Clear all pointers. */  sl->rbuff		= NULL;  sl->xbuff		= NULL;  sl->cbuff		= NULL;  sl->rhead		= NULL;  sl->rend		= NULL;  dev->rmem_end		= (unsigned long) NULL;  dev->rmem_start	= (unsigned long) NULL;  dev->mem_end		= (unsigned long) NULL;  dev->mem_start	= (unsigned long) NULL;}/* Find a SLIP channel from its `tty' link. */static struct slip *sl_find(struct tty_struct *tty){  struct slip *sl;  int i;  if (tty == NULL) return(NULL);  for (i = 0; i < SL_NRUNIT; i++) {	sl = &sl_ctrl[i];	if (sl->tty == tty) return(sl);  }  return(NULL);}/* Find a free SLIP channel, and link in this `tty' line. */static inline struct slip *sl_alloc(void){  unsigned long flags;  struct slip *sl;  int i;  save_flags (flags);  cli();  for (i = 0; i < SL_NRUNIT; i++) {	sl = &sl_ctrl[i];	if (sl->inuse == 0) {		sl->inuse = 1;		sl->tty = NULL;		restore_flags(flags);		return(sl);	}  }  restore_flags(flags);  return(NULL);}/* Free a SLIP channel. */static inline voidsl_free(struct slip *sl){  unsigned long flags;  if (sl->inuse) {  	save_flags(flags);  	cli();	sl->inuse = 0;	sl->tty = NULL;	restore_flags(flags);  }}/* MTU has been changed by the IP layer. Unfortunately we are not told about this, but   we spot it ourselves and fix things up. We could be in an upcall from the tty   driver, or in an ip packet queue. */   static void sl_changedmtu(struct slip *sl){	struct device *dev=sl->dev;	unsigned char *tb,*rb,*cb,*tf,*rf,*cf;	int l;	int omtu=sl->mtu;		sl->mtu=dev->mtu;	l=(dev->mtu *2);/* * allow for arrival of larger UDP packets, even if we say not to * also fixes a bug in which SunOS sends 512-byte packets even with * an MSS of 128 */	if (l < (576 * 2))	  l = 576 * 2;		DPRINTF((DBG_SLIP,"SLIP: mtu changed!\n"));		tb= (unsigned char *) kmalloc(l + 4, GFP_ATOMIC);	rb= (unsigned char *) kmalloc(l + 4, GFP_ATOMIC);	cb= (unsigned char *) kmalloc(l + 4, GFP_ATOMIC);		if(tb==NULL || rb==NULL || cb==NULL)	{		printk("Unable to grow slip buffers. MTU change cancelled.\n");		sl->mtu=omtu;		dev->mtu=omtu;		if(tb!=NULL)			kfree(tb);		if(rb!=NULL)			kfree(rb);		if(cb!=NULL)			kfree(cb);		return;	}		cli();		tf=(unsigned char *)sl->dev->mem_start;	sl->dev->mem_start=(unsigned long)tb;	sl->dev->mem_end=(unsigned long) (sl->dev->mem_start + l);	rf=(unsigned char *)sl->dev->rmem_start;	sl->dev->rmem_start=(unsigned long)rb;	sl->dev->rmem_end=(unsigned long) (sl->dev->rmem_start + l);		sl->xbuff = (unsigned char *) sl->dev->mem_start;	sl->rbuff = (unsigned char *) sl->dev->rmem_start;	sl->rend  = (unsigned char *) sl->dev->rmem_end;	sl->rhead = sl->rbuff;		cf=sl->cbuff;	sl->cbuff=cb;		sl->escape=0;	sl->sending=0;	sl->rcount=0;	sti();			if(rf!=NULL)		kfree(rf);	if(tf!=NULL)		kfree(tf);	if(cf!=NULL)		kfree(cf);}/* Stuff one byte into a SLIP receiver buffer. */static inline voidsl_enqueue(struct slip *sl, unsigned char c){  unsigned long flags;  save_flags(flags);  cli();  if (sl->rhead < sl->rend) {	*sl->rhead = c;	sl->rhead++;	sl->rcount++;  } else sl->roverrun++;  restore_flags(flags);}/* Release 'i' bytes from a SLIP receiver buffer. */static inline voidsl_dequeue(struct slip *sl, int i){  unsigned long flags;  save_flags(flags);  cli();  if (sl->rhead > sl->rbuff) {	sl->rhead -= i;	sl->rcount -= i;  }  restore_flags(flags);}/* Set the "sending" flag.  This must be atomic, hence the ASM. */static inline voidsl_lock(struct slip *sl){  unsigned long flags;  save_flags(flags);  cli();  sl->sending = 1;  sl->dev->tbusy = 1;  restore_flags(flags);}/* Clear the "sending" flag.  This must be atomic, hence the ASM. */static inline voidsl_unlock(struct slip *sl){  unsigned long flags;  save_flags(flags);  cli();  sl->sending = 0;  sl->dev->tbusy = 0;  restore_flags(flags);}/* Send one completely decapsulated IP datagram to the IP layer. */static voidsl_bump(struct slip *sl){  int done;  unsigned char c;  unsigned long flags;  int count;  count = sl->rcount;  if (sl->mode & (SL_MODE_ADAPTIVE | SL_MODE_CSLIP)) {    if ((c = sl->rbuff[0]) & SL_TYPE_COMPRESSED_TCP) {#if 1      /* ignore compressed packets when CSLIP is off */      if (!(sl->mode & SL_MODE_CSLIP)) {	printk("SLIP: compressed packet ignored\n");	return;      }#endif      /* make sure we've reserved enough space for uncompress to use */      save_flags(flags);      cli();      if ((sl->rhead + 80) < sl->rend) {	sl->rhead += 80;	sl->rcount += 80;	done = 1;      } else {	sl->roverrun++;	done = 0;      }      restore_flags(flags);      if (! done)  /* not enough space available */	return;      count = slhc_uncompress(sl->slcomp, sl->rbuff, count);      if (count <= 0) {	sl->errors++;	return;      }    } else if (c >= SL_TYPE_UNCOMPRESSED_TCP) {      if (!(sl->mode & SL_MODE_CSLIP)) {	/* turn on header compression */	sl->mode |= SL_MODE_CSLIP;	printk("SLIP: header compression turned on\n");      }      sl->rbuff[0] &= 0x4f;      if (slhc_remember(sl->slcomp, sl->rbuff, count) <= 0) {	sl->errors++;	return;      }    }  }  DPRINTF((DBG_SLIP, "<< \"%s\" recv:\r\n", sl->dev->name));  ip_dump(sl->rbuff, sl->rcount);  /* Bump the datagram to the upper layers... */  do {	DPRINTF((DBG_SLIP, "SLIP: packet is %d at 0x%X\n",					sl->rcount, sl->rbuff));	/* clh_dump(sl->rbuff, count); */	done = dev_rint(sl->rbuff, count, 0, sl->dev);	if (done == 0 || done == 1) break;  } while(1);  sl->rpacket++;}/* TTY finished sending a datagram, so clean up. */static voidsl_next(struct slip *sl){  DPRINTF((DBG_SLIP, "SLIP: sl_next(0x%X) called!\n", sl));  sl_unlock(sl);  dev_tint(sl->dev);}/* Encapsulate one IP datagram and stuff into a TTY queue. */static voidsl_encaps(struct slip *sl, unsigned char *icp, int len){  unsigned char *bp, *p;  int count;  DPRINTF((DBG_SLIP, "SLIP: sl_encaps(0x%X, %d) called\n", icp, len));  DPRINTF((DBG_SLIP, ">> \"%s\" sent:\r\n", sl->dev->name));    ip_dump(icp, len);    if(sl->mtu != sl->dev->mtu)	/* Someone has been ifconfigging */  	sl_changedmtu(sl);    if(len>sl->mtu)		/* Sigh, shouldn't occur BUT ... */  {  	len=sl->mtu;  	printk("slip: truncating oversized transmit packet!\n");  }  p = icp;  if(sl->mode & SL_MODE_CSLIP)	  len = slhc_compress(sl->slcomp, p, len, sl->cbuff, &p, 1);#ifdef OLD    /*   * Send an initial END character to flush out any   * data that may have accumulated in the receiver   * due to line noise.   */  bp = sl->xbuff;  *bp++ = END;  count = 1;  /*   * For each byte in the packet, send the appropriate   * character sequence, according to the SLIP protocol.   */  while(len-- > 0) {	c = *p++;	switch(c) {		case END:			*bp++ = ESC;			*bp++ = ESC_END;			count += 2;                       	break;		case ESC:			*bp++ = ESC;			*bp++ = ESC_ESC;			count += 2;                       	break;		default:			*bp++ = c;			count++;	}  }  *bp++ = END;    count++;#else  if(sl->mode & SL_MODE_SLIP6)  	count=slip_esc6(p, (unsigned char *)sl->xbuff,len);  else  	count=slip_esc(p, (unsigned char *)sl->xbuff,len);#endif  	    sl->spacket++;  bp = sl->xbuff;  /* Tell TTY to send it on its way. */  DPRINTF((DBG_SLIP, "SLIP: kicking TTY for %d bytes at 0x%X\n", count, bp));  if (tty_write_data(sl->tty, (char *) bp, count,	     (void (*)(void *))sl_next, (void *) sl) == 0) {	DPRINTF((DBG_SLIP, "SLIP: TTY already done with %d bytes!\n", count));	sl_next(sl);  }}/*static void sl_hex_dump(unsigned char *x,int l){	int n=0;	printk("sl_xmit: (%d bytes)\n",l);	while(l)	{		printk("%2X ",(int)*x++);		l--;		n++;		if(n%32==0)			printk("\n");	}	if(n%32)		printk("\n");}*//* Encapsulate an IP datagram and kick it into a TTY queue. */static intsl_xmit(struct sk_buff *skb, struct device *dev){  struct tty_struct *tty;  struct slip *sl;  int size;  /* Find the correct SLIP channel to use. */  sl = &sl_ctrl[dev->base_addr];  tty = sl->tty;  DPRINTF((DBG_SLIP, "SLIP: sl_xmit(\"%s\") skb=0x%X busy=%d\n",				dev->name, skb, sl->sending));  /*   * If we are busy already- too bad.  We ought to be able   * to queue things at this point, to allow for a little   * frame buffer.  Oh well...   */  if (sl->sending) {	DPRINTF((DBG_SLIP, "SLIP: sl_xmit: BUSY\r\n"));	sl->sbusy++;	return(1);  }  /* We were not, so we are now... :-) */  if (skb != NULL) {#ifdef CONFIG_AX25  	if(sl->mode & SL_MODE_AX25)	{		if(!skb->arp && dev->rebuild_header(skb->data,dev))		{			skb->dev=dev;			arp_queue(skb);			return 0;		}		skb->arp=1;	}#endif  		sl_lock(sl);	size = skb->len;	if (!(sl->mode & SL_MODE_AX25)) {		if (size < sizeof(struct iphdr)) {			printk("Runt IP frame fed to slip!\n");		} else {			size = ((struct iphdr *)(skb->data))->tot_len;			size = ntohs(size);		}	}	/*	sl_hex_dump(skb->data,skb->len);*/	sl_encaps(sl, skb->data, size);	if (skb->free)		kfree_skb(skb, FREE_WRITE);  }  return(0);}/* Return the frame type ID.  This is normally IP but maybe be AX.25. */static unsigned shortsl_type_trans (struct sk_buff *skb, struct device *dev){#ifdef CONFIG_AX25	struct slip *sl=&sl_ctrl[dev->base_addr];	if(sl->mode&SL_MODE_AX25)		return(NET16(ETH_P_AX25));#endif  return(NET16(ETH_P_IP));}/* Fill in the MAC-level header. Not used by SLIP. */static intsl_header(unsigned char *buff, struct device *dev, unsigned short type,	  unsigned long daddr, unsigned long saddr, unsigned len){#ifdef CONFIG_AX25  struct slip *sl=&sl_ctrl[dev->base_addr];  if((sl->mode&SL_MODE_AX25) && type!=NET16(ETH_P_AX25))  	return ax25_encapsulate_ip(buff,dev,type,daddr,saddr,len);#endif    return(0);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人免费在线视频| 午夜av一区二区| 国产精品资源网站| 日韩精品一区二区三区中文不卡| 亚洲国产综合视频在线观看| 色综合欧美在线视频区| 亚洲图片另类小说| 一本一本大道香蕉久在线精品| 国产婷婷精品av在线| 国产激情视频一区二区三区欧美| 欧美精品一区二区三区久久久| 久久99在线观看| 久久综合色天天久久综合图片| 国内精品免费在线观看| 久久久久国产精品麻豆ai换脸| 国产麻豆精品在线观看| 国产日韩精品一区二区三区| 粉嫩在线一区二区三区视频| 国产精品乱码人人做人人爱| 99麻豆久久久国产精品免费优播| 亚洲婷婷国产精品电影人久久| 精品国产区一区| 国产美女一区二区三区| 国产无人区一区二区三区| 成人精品视频.| 亚洲欧洲99久久| 91国产视频在线观看| 亚洲一区二区影院| 欧美一区二区三区四区高清| 久久精品噜噜噜成人av农村| 久久精品视频免费| 成人激情动漫在线观看| 亚洲日本一区二区| 精品婷婷伊人一区三区三| 蜜臀av亚洲一区中文字幕| 日韩精品中文字幕在线一区| 国产精品一卡二卡在线观看| 国产精品福利在线播放| 在线观看av不卡| 麻豆成人免费电影| 久久婷婷一区二区三区| 99re热这里只有精品视频| 亚洲福利一区二区| 欧美精品一区二区三区高清aⅴ| 成人福利视频在线| 亚洲已满18点击进入久久| 91精品国产黑色紧身裤美女| 国产美女在线精品| 一区二区三区在线视频免费| 欧美一区二区三区电影| 成人亚洲一区二区一| 一区二区三区免费网站| 日韩视频免费直播| 成人av电影在线播放| 亚洲成av人在线观看| 久久久久久久久久看片| 色av成人天堂桃色av| 日本不卡的三区四区五区| 欧美激情资源网| 欧美人体做爰大胆视频| 国产精品综合av一区二区国产馆| 亚洲激情自拍偷拍| 26uuu另类欧美亚洲曰本| 99这里都是精品| 免费在线成人网| 国产精品福利av| 日韩亚洲国产中文字幕欧美| 成人av手机在线观看| 天堂va蜜桃一区二区三区| 亚洲国产精品ⅴa在线观看| 欧美视频自拍偷拍| 福利一区福利二区| 爽好久久久欧美精品| 中文字幕成人在线观看| 91精品婷婷国产综合久久| 成人av手机在线观看| 麻豆精品视频在线| 亚洲综合av网| 欧美激情中文不卡| 日韩午夜中文字幕| 色综合激情五月| 国产精品资源在线观看| 日韩中文字幕91| 成人免费一区二区三区在线观看| 欧美一级二级在线观看| 91精品办公室少妇高潮对白| 国产精品白丝jk黑袜喷水| 亚洲mv在线观看| 亚洲男人天堂av| 国产视频一区二区在线观看| 正在播放亚洲一区| 在线精品视频免费观看| 成人网页在线观看| 久久精品国产精品亚洲综合| 亚洲午夜在线视频| 亚洲欧美色一区| 国产亚洲精品超碰| 欧美v日韩v国产v| 欧美三级中文字幕在线观看| 91首页免费视频| 成人综合婷婷国产精品久久| 青青草视频一区| 亚洲sss视频在线视频| 亚洲免费看黄网站| 国产精品伦理一区二区| 久久精品视频一区二区| 亚洲精品在线电影| 欧美一区二区成人6969| 欧美日韩一二三区| 欧美中文字幕一区| 色综合久久久久网| 成人aa视频在线观看| 国产成人精品网址| 国产精品1区二区.| 国产在线观看免费一区| 韩国毛片一区二区三区| 免费在线视频一区| 免费成人在线观看| 免费观看一级特黄欧美大片| 舔着乳尖日韩一区| 香蕉成人啪国产精品视频综合网| 亚洲另类在线一区| 一区二区三区日韩| 亚洲乱码国产乱码精品精的特点 | aaa国产一区| 成人一二三区视频| 成熟亚洲日本毛茸茸凸凹| 国产福利一区二区三区| 国产成人在线观看| 国产.欧美.日韩| 成人午夜av电影| aaa欧美色吧激情视频| 91老师片黄在线观看| 91蝌蚪国产九色| 色综合av在线| 欧美性受xxxx| 制服丝袜成人动漫| 日韩欧美中文字幕精品| 精品日韩一区二区三区| 精品国产乱码久久久久久蜜臀| 精品国产一区二区三区四区四| 久久这里只有精品首页| 国产欧美精品一区二区色综合朱莉| 国产婷婷一区二区| 国产精品久久久久久妇女6080 | 亚洲精品视频在线观看免费| 一级特黄大欧美久久久| 亚洲国产精品久久不卡毛片| 午夜欧美在线一二页| 蜜桃av一区二区三区| 极品少妇xxxx精品少妇偷拍| 国产成人亚洲综合色影视| 成人国产精品免费观看| 色综合久久久网| 欧美日韩精品系列| 日韩美女视频在线| 中文字幕成人在线观看| 一区二区三区欧美日韩| 青青国产91久久久久久 | 理论片日本一区| 国产乱码精品一区二区三区忘忧草| 懂色一区二区三区免费观看| 99精品欧美一区二区三区综合在线| 欧美在线免费视屏| 日韩欧美一二区| 国产精品色噜噜| 亚洲大片在线观看| 韩国精品免费视频| 99精品国产91久久久久久| 欧美性三三影院| 欧美精品一区二区高清在线观看 | 夜夜嗨av一区二区三区四季av| 亚洲mv大片欧洲mv大片精品| 极品少妇xxxx精品少妇| 91视视频在线观看入口直接观看www | 亚洲午夜一区二区三区| 久久精工是国产品牌吗| 成人午夜激情在线| 欧美精品国产精品| 国产亚洲一二三区| 亚洲一区在线观看免费 | 日本aⅴ亚洲精品中文乱码| 高清国产一区二区| 欧美性高清videossexo| 国产欧美精品区一区二区三区| 国产精品亚洲一区二区三区妖精| 一本色道久久综合精品竹菊| 51精品国自产在线| 国产精品电影院| 日韩精品久久理论片| 高清在线成人网| 欧美浪妇xxxx高跟鞋交| 久久精品夜色噜噜亚洲aⅴ| 亚洲午夜精品17c| 国产福利一区在线观看| 欧美日韩国产中文| 中文字幕免费一区| 美美哒免费高清在线观看视频一区二区 | 国产香蕉久久精品综合网| 一区二区日韩av|