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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? slhc.c

?? 內(nèi)核是系統(tǒng)的心臟
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
 * Routines to compress and uncompress tcp packets (for transmission
 * over low speed serial lines).
 *
 * Copyright (c) 1989 Regents of the University of California.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms are permitted
 * provided that the above copyright notice and this paragraph are
 * duplicated in all such forms and that any documentation,
 * advertising materials, and other materials related to such
 * distribution and use acknowledge that the software was developed
 * by the University of California, Berkeley.  The name of the
 * University may not be used to endorse or promote products derived
 * from this software without specific prior written permission.
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 *
 *	Van Jacobson (van@helios.ee.lbl.gov), Dec 31, 1989:
 *	- Initial distribution.
 *
 *
 * modified for KA9Q Internet Software Package by
 * Katie Stevens (dkstevens@ucdavis.edu)
 * University of California, Davis
 * Computing Services
 *	- 01-31-90	initial adaptation (from 1.19)
 *	PPP.05	02-15-90 [ks]
 *	PPP.08	05-02-90 [ks]	use PPP protocol field to signal compression
 *	PPP.15	09-90	 [ks]	improve mbuf handling
 *	PPP.16	11-02	 [karn]	substantially rewritten to use NOS facilities
 *
 *	- Feb 1991	Bill_Simpson@um.cc.umich.edu
 *			variable number of conversation slots
 *			allow zero or one slots
 *			separate routines
 *			status display
 */

#include <linux/types.h>
#include <linux/sched.h>
#include <linux/mm.h>
#include <linux/string.h>
#include <linux/socket.h>
#include <linux/sockios.h>
#include <linux/termios.h>
#include <linux/in.h>
#include <linux/fcntl.h>
#include "inet.h"
#include "dev.h"
#include "ip.h"
#include "protocol.h"
#include "icmp.h"
#include "tcp.h"
#include "skbuff.h"
#include "sock.h"
#include "arp.h"
#include <linux/errno.h>
#include <linux/timer.h>
#include <asm/system.h>
#include <asm/segment.h>
#include <linux/mm.h>
#include "slhc.h"

#define DPRINT(x)

int last_retran;

static unsigned char *encode(unsigned char *cp,int n);
static long decode(unsigned char **cpp);
static unsigned char * put16(unsigned char *cp, unsigned short x);
static unsigned short pull16(unsigned char **cpp);

extern int ip_csum(struct iphdr *iph);


/* Initialize compression data structure
 *	slots must be in range 0 to 255 (zero meaning no compression)
 */
struct slcompress *
slhc_init(int rslots, int tslots)
{
	register short i;
	register struct cstate *ts;
	struct slcompress *comp;

	comp = (struct slcompress *)kmalloc(sizeof(struct slcompress), 
					    GFP_KERNEL);
	if (! comp)
		return NULL;

	memset(comp, 0, sizeof(struct slcompress));

	if ( rslots > 0  &&  rslots < 256 ) {
		comp->rstate =
		  (struct cstate *)kmalloc(rslots * sizeof(struct cstate),
					   GFP_KERNEL);
		if (! comp->rstate)
			return NULL;
		memset(comp->rstate, 0, rslots * sizeof(struct cstate));
		comp->rslot_limit = rslots - 1;
	}

	if ( tslots > 0  &&  tslots < 256 ) {
		comp->tstate = 
		  (struct cstate *)kmalloc(tslots * sizeof(struct cstate),
					   GFP_KERNEL);
		if (! comp->tstate)
			return NULL;
		memset(comp->tstate, 0, rslots * sizeof(struct cstate));
		comp->tslot_limit = tslots - 1;
	}

	comp->xmit_oldest = 0;
	comp->xmit_current = 255;
	comp->recv_current = 255;
	/*
	 * don't accept any packets with implicit index until we get
	 * one with an explicit index.  Otherwise the uncompress code
	 * will try to use connection 255, which is almost certainly
	 * out of range
	 */
	comp->flags |= SLF_TOSS;

	if ( tslots > 0 ) {
		ts = comp->tstate;
		for(i = comp->tslot_limit; i > 0; --i){
			ts[i].cs_this = i;
			ts[i].next = &(ts[i - 1]);
		}
		ts[0].next = &(ts[comp->tslot_limit]);
		ts[0].cs_this = 0;
	}
	return comp;
}


/* Free a compression data structure */
void
slhc_free(struct slcompress *comp)
{
	if ( comp == NULLSLCOMPR )
		return;

	if ( comp->rstate != NULLSLSTATE )
		kfree( comp->rstate );

	if ( comp->tstate != NULLSLSTATE )
		kfree( comp->tstate );

	kfree( comp );
}


/* Put a short in host order into a char array in network order */
static unsigned char *
put16(unsigned char *cp, unsigned short x)
{
	*cp++ = x >> 8;
	*cp++ = x;

	return cp;
}


/* Encode a number */
unsigned char *
encode(unsigned char *cp, int n)
{
	if(n >= 256 || n == 0){
		*cp++ = 0;
		cp = put16(cp,n);
	} else {
		*cp++ = n;
	}
	return cp;
}

/* Pull a 16-bit integer in host order from buffer in network byte order */
static unsigned short
pull16(unsigned char **cpp)
{
	short rval;

	rval = *(*cpp)++;
	rval <<= 8;
	rval |= *(*cpp)++;
	return rval;
}

/* Decode a number */
long
decode(unsigned char **cpp)
{
	register int x;

	x = *(*cpp)++;
	if(x == 0){
		return pull16(cpp) & 0xffff;	/* pull16 returns -1 on error */
	} else {
		return x & 0xff;		/* -1 if PULLCHAR returned error */
	}
}

/* 
 * icp and isize are the original packet.
 * ocp is a place to put a copy if necessary.
 * cpp is initially a pointer to icp.  If the copy is used,
 *    change it to ocp.
 */

int
slhc_compress(struct slcompress *comp, unsigned char *icp, int isize,
	unsigned char *ocp, unsigned char **cpp, int compress_cid)
{
	register struct cstate *ocs = &(comp->tstate[comp->xmit_oldest]);
	register struct cstate *lcs = ocs;
	register struct cstate *cs = lcs->next;
	register unsigned long deltaS, deltaA;
	register short changes = 0;
	int hlen;
	unsigned char new_seq[16];
	register unsigned char *cp = new_seq;
	struct iphdr *ip;
	struct tcphdr *th, *oth;

	ip = (struct iphdr *) icp;

	/* Bail if this packet isn't TCP, or is an IP fragment */
	if(ip->protocol != IPPROTO_TCP || (ntohs(ip->frag_off) & 0x1fff) || 
				       (ip->frag_off & 32)){
		DPRINT(("comp: noncomp 1 %d %d %d\n", ip->protocol, 
		      ntohs(ip->frag_off), ip->frag_off));
		/* Send as regular IP */
		if(ip->protocol != IPPROTO_TCP)
			comp->sls_o_nontcp++;
		else
			comp->sls_o_tcp++;
		return isize;
	}
	/* Extract TCP header */

	th = (struct tcphdr *)(((unsigned char *)ip) + ip->ihl*4);
	hlen = ip->ihl*4 + th->doff*4;

	/*  Bail if the TCP packet isn't `compressible' (i.e., ACK isn't set or
	 *  some other control bit is set).
	 */
	if(th->syn || th->fin || th->rst ||
	    ! (th->ack)){
		DPRINT(("comp: noncomp 2 %x %x %d %d %d %d\n", ip, th, 
		       th->syn, th->fin, th->rst, th->ack));
		/* TCP connection stuff; send as regular IP */
		comp->sls_o_tcp++;
		return isize;
	}
	/*
	 * Packet is compressible -- we're going to send either a
	 * COMPRESSED_TCP or UNCOMPRESSED_TCP packet.  Either way,
	 * we need to locate (or create) the connection state.
	 *
	 * States are kept in a circularly linked list with
	 * xmit_oldest pointing to the end of the list.  The
	 * list is kept in lru order by moving a state to the
	 * head of the list whenever it is referenced.  Since
	 * the list is short and, empirically, the connection
	 * we want is almost always near the front, we locate
	 * states via linear search.  If we don't find a state
	 * for the datagram, the oldest state is (re-)used.
	 */
	for ( ; ; ) {
		if( ip->saddr == cs->cs_ip.saddr
		 && ip->daddr == cs->cs_ip.daddr
		 && th->source == cs->cs_tcp.source
		 && th->dest == cs->cs_tcp.dest)
			goto found;

		/* if current equal oldest, at end of list */
		if ( cs == ocs )
			break;
		lcs = cs;
		cs = cs->next;
		comp->sls_o_searches++;
	};
	/*
	 * Didn't find it -- re-use oldest cstate.  Send an
	 * uncompressed packet that tells the other side what
	 * connection number we're using for this conversation.
	 *
	 * Note that since the state list is circular, the oldest
	 * state points to the newest and we only need to set
	 * xmit_oldest to update the lru linkage.
	 */
	comp->sls_o_misses++;
	comp->xmit_oldest = lcs->cs_this;
	DPRINT(("comp: not found\n"));
	goto uncompressed;

found:
	/*
	 * Found it -- move to the front on the connection list.
	 */
	if(lcs == ocs) {
		/* found at most recently used */
	} else if (cs == ocs) {
		/* found at least recently used */
		comp->xmit_oldest = lcs->cs_this;
	} else {
		/* more than 2 elements */
		lcs->next = cs->next;
		cs->next = ocs->next;
		ocs->next = cs;
	}

	/*
	 * Make sure that only what we expect to change changed.
	 * Check the following:
	 * IP protocol version, header length & type of service.
	 * The "Don't fragment" bit.
	 * The time-to-live field.
	 * The TCP header length.
	 * IP options, if any.
	 * TCP options, if any.
	 * If any of these things are different between the previous &
	 * current datagram, we send the current datagram `uncompressed'.
	 */
	oth = &cs->cs_tcp;

	if(last_retran
	 || ip->version != cs->cs_ip.version || ip->ihl != cs->cs_ip.ihl
	 || ip->tos != cs->cs_ip.tos
	 || (ip->frag_off & 64) != (cs->cs_ip.frag_off & 64)
	 || ip->ttl != cs->cs_ip.ttl
	 || th->doff != cs->cs_tcp.doff
	 || (ip->ihl > 5 && memcmp(ip+1,cs->cs_ipopt,((ip->ihl)-5)*4) != 0)
	 || (th->doff > 5 && memcmp(th+1,cs->cs_tcpopt,((th->doff)-5)*4 != 0))){
		DPRINT(("comp: incompat\n"));
		goto uncompressed;
	}
	
	/*
	 * Figure out which of the changing fields changed.  The
	 * receiver expects changes in the order: urgent, window,
	 * ack, seq (the order minimizes the number of temporaries
	 * needed in this section of code).
	 */
	if(th->urg){
		deltaS = ntohs(th->urg_ptr);
		cp = encode(cp,deltaS);
		changes |= NEW_U;
	} else if(th->urg_ptr != oth->urg_ptr){
		/* argh! URG not set but urp changed -- a sensible
		 * implementation should never do this but RFC793
		 * doesn't prohibit the change so we have to deal
		 * with it. */
		DPRINT(("comp: urg incompat\n"));
		goto uncompressed;
	}
	if((deltaS = ntohs(th->window) - ntohs(oth->window)) != 0){
		cp = encode(cp,deltaS);
		changes |= NEW_W;
	}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
aaa国产一区| 国产精品欧美一区二区三区| 亚洲制服欧美中文字幕中文字幕| 成人精品一区二区三区四区| 国产精品美女一区二区在线观看| 成人av小说网| 夜夜嗨av一区二区三区网页| 欧美唯美清纯偷拍| 日本一不卡视频| 欧美tk丨vk视频| 春色校园综合激情亚洲| 亚洲色图视频网| 欧美高清www午色夜在线视频| 蜜臀a∨国产成人精品| 久久亚洲二区三区| 99热在这里有精品免费| 亚洲国产另类av| 26uuu国产电影一区二区| 99久久精品情趣| 日韩高清不卡一区| 久久―日本道色综合久久| av午夜一区麻豆| 日韩 欧美一区二区三区| 久久精品欧美日韩| 91美女片黄在线观看91美女| 日韩福利视频导航| 中文字幕在线观看不卡| 欧美日本乱大交xxxxx| 韩国精品主播一区二区在线观看| 国产精品传媒视频| 日韩欧美国产一区二区在线播放| 国产成人精品免费看| 亚洲福利国产精品| 国产午夜精品久久久久久免费视| 91成人免费在线| 日本不卡视频在线| 亚洲视频在线观看三级| 日韩片之四级片| av亚洲产国偷v产偷v自拍| 另类小说视频一区二区| 亚洲男人天堂av网| 国产亚洲精品超碰| 欧美一区二区三区在线视频| av午夜精品一区二区三区| 精品制服美女丁香| 亚洲不卡在线观看| 国产精品成人午夜| 亚洲一区二区三区影院| 亚洲精品一区在线观看| 欧美私人免费视频| 97久久精品人人做人人爽| 激情综合网av| 青青草国产精品97视觉盛宴 | 欧美伦理电影网| 成人免费毛片app| 精品一区二区三区在线观看 | 日韩欧美你懂的| 欧美性生活大片视频| 成人美女视频在线看| 激情成人午夜视频| 美女尤物国产一区| 香港成人在线视频| 亚洲成在线观看| 一区二区三区自拍| 亚洲私人影院在线观看| 亚洲欧洲精品一区二区三区不卡| 久久久99精品免费观看不卡| 欧美成人a视频| 日韩欧美一二三四区| 欧美一区在线视频| 欧美美女bb生活片| 欧美午夜精品一区| 欧洲精品在线观看| 色综合视频在线观看| aaa亚洲精品一二三区| 99久久精品国产导航| 99热在这里有精品免费| 91在线视频播放| 色婷婷精品大视频在线蜜桃视频| 99精品国产99久久久久久白柏| 成a人片亚洲日本久久| 99视频一区二区| 91蝌蚪国产九色| 在线免费观看日韩欧美| 欧美日韩亚洲综合在线| 6080国产精品一区二区| 制服丝袜中文字幕亚洲| 欧美亚一区二区| 国产在线播精品第三| 日韩高清在线不卡| 捆绑调教一区二区三区| 国产一区不卡视频| 成人免费观看男女羞羞视频| www.成人网.com| 色偷偷成人一区二区三区91| 欧美日韩一区二区在线观看| 制服.丝袜.亚洲.中文.综合| 日韩美女一区二区三区| 久久蜜桃av一区精品变态类天堂 | 久久99精品国产麻豆不卡| 国产一区二区三区免费观看| 成人国产视频在线观看 | 欧美大片在线观看一区| 2020国产精品久久精品美国| 国产精品麻豆视频| 亚洲一区二区三区视频在线 | 亚洲乱码日产精品bd| 爽好多水快深点欧美视频| 久久99日本精品| 99久久精品免费| 欧美一卡二卡在线观看| 久久久美女艺术照精彩视频福利播放| 国产欧美日韩一区二区三区在线观看 | 欧美色电影在线| 69p69国产精品| 国产精品久久久久久久岛一牛影视| 国产精品大尺度| 美腿丝袜亚洲三区| av在线一区二区| 欧美性大战久久久| 欧美不卡一区二区三区四区| 亚洲欧洲精品天堂一级| 蜜桃视频一区二区| 91性感美女视频| 久久综合久久久久88| 亚洲一区二区三区中文字幕| 国产精品一区二区在线观看不卡| 色天使色偷偷av一区二区| 久久综合九色综合欧美就去吻 | 国产在线播放一区二区三区| 国产成人精品aa毛片| 日韩一区二区三区在线| 亚洲美女偷拍久久| 国产精品91xxx| 欧美日韩国产a| 中文字幕在线观看不卡视频| 极品少妇xxxx精品少妇| 91国在线观看| 国产精品久久久久久久久免费樱桃 | 国产午夜亚洲精品羞羞网站| 亚洲一区二区三区不卡国产欧美| 久久精品国内一区二区三区| 91婷婷韩国欧美一区二区| 久久午夜羞羞影院免费观看| 亚洲国产综合在线| 91论坛在线播放| 国产精品久久久久影院亚瑟 | 成人一区二区三区视频在线观看| 欧美日韩成人在线| 中文字幕在线一区| 国产一区二区在线看| 日韩视频一区二区在线观看| 一级特黄大欧美久久久| 91视频免费播放| 国产精品美女久久久久久久久久久 | www.色精品| 久久精品综合网| 久久99国内精品| 日韩欧美一级二级| 热久久一区二区| 欧美肥妇bbw| 午夜国产精品影院在线观看| 91精品办公室少妇高潮对白| 欧美国产日韩在线观看| 国产精品18久久久久久久久| 精品欧美乱码久久久久久1区2区| 香蕉久久夜色精品国产使用方法 | 色综合一区二区| 欧美国产日韩精品免费观看| 国产成人亚洲精品青草天美| 麻豆国产欧美日韩综合精品二区| 99久久国产综合精品女不卡| 国产精品三级av| www.亚洲在线| 亚洲另类色综合网站| av不卡免费电影| 亚洲影院免费观看| 欧美高清视频一二三区| 日本美女一区二区| 精品国产伦一区二区三区观看方式 | 色婷婷激情久久| 亚洲福利一二三区| 7777精品伊人久久久大香线蕉最新版| 天天综合天天做天天综合| 在线播放中文一区| 久久狠狠亚洲综合| 国产亚洲人成网站| 99精品久久免费看蜜臀剧情介绍| 亚洲人午夜精品天堂一二香蕉| 色老汉av一区二区三区| 午夜免费久久看| 日韩免费高清av| 丁香婷婷深情五月亚洲| 亚洲人成在线观看一区二区| 欧美性色欧美a在线播放| 日本va欧美va欧美va精品| 国产欧美日韩三级| 91色在线porny| 日日夜夜精品视频天天综合网| 日韩女优制服丝袜电影|