|
|
1.1 ! root 1: /* slcompress.h 7.4 90/06/28 */ ! 2: /* ! 3: * Definitions for tcp compression routines. ! 4: * ! 5: * $Header: slcompress.h,v 1.10 89/12/31 08:53:02 van Exp $ ! 6: * ! 7: * Copyright (c) 1989 Regents of the University of California. ! 8: * All rights reserved. ! 9: * ! 10: * Redistribution and use in source and binary forms, with or without ! 11: * modification, are permitted provided that the following conditions ! 12: * are met: ! 13: * 1. Redistributions of source code must retain the above copyright ! 14: * notice, this list of conditions and the following disclaimer. ! 15: * 2. Redistributions in binary form must reproduce the above copyright ! 16: * notice, this list of conditions and the following disclaimer in the ! 17: * documentation and/or other materials provided with the distribution. ! 18: * 3. All advertising materials mentioning features or use of this software ! 19: * must display the following acknowledgement: ! 20: * This product includes software developed by the University of ! 21: * California, Berkeley and its contributors. ! 22: * 4. Neither the name of the University nor the names of its contributors ! 23: * may be used to endorse or promote products derived from this software ! 24: * without specific prior written permission. ! 25: * ! 26: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ! 27: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ! 28: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ! 29: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ! 30: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ! 31: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ! 32: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 33: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ! 34: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ! 35: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! 36: * SUCH DAMAGE. ! 37: * ! 38: * Van Jacobson ([email protected]), Dec 31, 1989: ! 39: * - Initial distribution. ! 40: */ ! 41: ! 42: #define MAX_STATES 16 /* must be > 2 and < 256 */ ! 43: #define MAX_HDR MLEN /* XXX 4bsd-ism: should really be 128 */ ! 44: ! 45: /* ! 46: * Compressed packet format: ! 47: * ! 48: * The first octet contains the packet type (top 3 bits), TCP ! 49: * 'push' bit, and flags that indicate which of the 4 TCP sequence ! 50: * numbers have changed (bottom 5 bits). The next octet is a ! 51: * conversation number that associates a saved IP/TCP header with ! 52: * the compressed packet. The next two octets are the TCP checksum ! 53: * from the original datagram. The next 0 to 15 octets are ! 54: * sequence number changes, one change per bit set in the header ! 55: * (there may be no changes and there are two special cases where ! 56: * the receiver implicitly knows what changed -- see below). ! 57: * ! 58: * There are 5 numbers which can change (they are always inserted ! 59: * in the following order): TCP urgent pointer, window, ! 60: * acknowlegement, sequence number and IP ID. (The urgent pointer ! 61: * is different from the others in that its value is sent, not the ! 62: * change in value.) Since typical use of SLIP links is biased ! 63: * toward small packets (see comments on MTU/MSS below), changes ! 64: * use a variable length coding with one octet for numbers in the ! 65: * range 1 - 255 and 3 octets (0, MSB, LSB) for numbers in the ! 66: * range 256 - 65535 or 0. (If the change in sequence number or ! 67: * ack is more than 65535, an uncompressed packet is sent.) ! 68: */ ! 69: ! 70: /* ! 71: * Packet types (must not conflict with IP protocol version) ! 72: * ! 73: * The top nibble of the first octet is the packet type. There are ! 74: * three possible types: IP (not proto TCP or tcp with one of the ! 75: * control flags set); uncompressed TCP (a normal IP/TCP packet but ! 76: * with the 8-bit protocol field replaced by an 8-bit connection id -- ! 77: * this type of packet syncs the sender & receiver); and compressed ! 78: * TCP (described above). ! 79: * ! 80: * LSB of 4-bit field is TCP "PUSH" bit (a worthless anachronism) and ! 81: * is logically part of the 4-bit "changes" field that follows. Top ! 82: * three bits are actual packet type. For backward compatibility ! 83: * and in the interest of conserving bits, numbers are chosen so the ! 84: * IP protocol version number (4) which normally appears in this nibble ! 85: * means "IP packet". ! 86: */ ! 87: ! 88: /* packet types */ ! 89: #define TYPE_IP 0x40 ! 90: #define TYPE_UNCOMPRESSED_TCP 0x70 ! 91: #define TYPE_COMPRESSED_TCP 0x80 ! 92: #define TYPE_ERROR 0x00 ! 93: ! 94: /* Bits in first octet of compressed packet */ ! 95: #define NEW_C 0x40 /* flag bits for what changed in a packet */ ! 96: #define NEW_I 0x20 ! 97: #define NEW_S 0x08 ! 98: #define NEW_A 0x04 ! 99: #define NEW_W 0x02 ! 100: #define NEW_U 0x01 ! 101: ! 102: /* reserved, special-case values of above */ ! 103: #define SPECIAL_I (NEW_S|NEW_W|NEW_U) /* echoed interactive traffic */ ! 104: #define SPECIAL_D (NEW_S|NEW_A|NEW_W|NEW_U) /* unidirectional data */ ! 105: #define SPECIALS_MASK (NEW_S|NEW_A|NEW_W|NEW_U) ! 106: ! 107: #define TCP_PUSH_BIT 0x10 ! 108: ! 109: ! 110: /* ! 111: * "state" data for each active tcp conversation on the wire. This is ! 112: * basically a copy of the entire IP/TCP header from the last packet ! 113: * we saw from the conversation together with a small identifier ! 114: * the transmit & receive ends of the line use to locate saved header. ! 115: */ ! 116: struct cstate { ! 117: struct cstate *cs_next; /* next most recently used cstate (xmit only) */ ! 118: u_short cs_hlen; /* size of hdr (receive only) */ ! 119: u_char cs_id; /* connection # associated with this state */ ! 120: u_char cs_filler; ! 121: union { ! 122: char csu_hdr[MAX_HDR]; ! 123: struct ip csu_ip; /* ip/tcp hdr from most recent packet */ ! 124: } slcs_u; ! 125: }; ! 126: #define cs_ip slcs_u.csu_ip ! 127: #define cs_hdr slcs_u.csu_hdr ! 128: ! 129: /* ! 130: * all the state data for one serial line (we need one of these ! 131: * per line). ! 132: */ ! 133: struct slcompress { ! 134: struct cstate *last_cs; /* most recently used tstate */ ! 135: u_char last_recv; /* last rcvd conn. id */ ! 136: u_char last_xmit; /* last sent conn. id */ ! 137: u_short flags; ! 138: #ifndef SL_NO_STATS ! 139: int sls_packets; /* outbound packets */ ! 140: int sls_compressed; /* outbound compressed packets */ ! 141: int sls_searches; /* searches for connection state */ ! 142: int sls_misses; /* times couldn't find conn. state */ ! 143: int sls_uncompressedin; /* inbound uncompressed packets */ ! 144: int sls_compressedin; /* inbound compressed packets */ ! 145: int sls_errorin; /* inbound unknown type packets */ ! 146: int sls_tossed; /* inbound packets tossed because of error */ ! 147: #endif ! 148: struct cstate tstate[MAX_STATES]; /* xmit connection states */ ! 149: struct cstate rstate[MAX_STATES]; /* receive connection states */ ! 150: }; ! 151: /* flag values */ ! 152: #define SLF_TOSS 1 /* tossing rcvd frames because of input err */ ! 153: ! 154: extern void sl_compress_init(/* struct slcompress * */); ! 155: extern u_char sl_compress_tcp(/* struct mbuf *, struct ip *, ! 156: struct slcompress *, int compress_cid_flag */); ! 157: extern int sl_uncompress_tcp(/* u_char **, int, u_char, struct slcompress * */);
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.