|
|
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 is only permitted until one year after the first shipment ! 11: * of 4.4BSD by the Regents. Otherwise, redistribution and use in source and ! 12: * binary forms are permitted provided that: (1) source distributions retain ! 13: * this entire copyright notice and comment, and (2) distributions including ! 14: * binaries display the following acknowledgement: This product includes ! 15: * software developed by the University of California, Berkeley and its ! 16: * contributors'' in the documentation or other materials provided with the ! 17: * distribution and in all advertising materials mentioning features or use ! 18: * of this software. Neither the name of the University nor the names of ! 19: * its contributors may be used to endorse or promote products derived from ! 20: * this software without specific prior written permission. ! 21: * THIS SOFTWARE IS PROVIDED AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ! 22: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ! 23: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 24: * ! 25: * Van Jacobson ([email protected]), Dec 31, 1989: ! 26: * - Initial distribution. ! 27: */ ! 28: ! 29: #define MAX_STATES 16 /* must be > 2 and < 256 */ ! 30: #define MAX_HDR MLEN /* XXX 4bsd-ism: should really be 128 */ ! 31: ! 32: /* ! 33: * Compressed packet format: ! 34: * ! 35: * The first octet contains the packet type (top 3 bits), TCP ! 36: * 'push' bit, and flags that indicate which of the 4 TCP sequence ! 37: * numbers have changed (bottom 5 bits). The next octet is a ! 38: * conversation number that associates a saved IP/TCP header with ! 39: * the compressed packet. The next two octets are the TCP checksum ! 40: * from the original datagram. The next 0 to 15 octets are ! 41: * sequence number changes, one change per bit set in the header ! 42: * (there may be no changes and there are two special cases where ! 43: * the receiver implicitly knows what changed -- see below). ! 44: * ! 45: * There are 5 numbers which can change (they are always inserted ! 46: * in the following order): TCP urgent pointer, window, ! 47: * acknowlegement, sequence number and IP ID. (The urgent pointer ! 48: * is different from the others in that its value is sent, not the ! 49: * change in value.) Since typical use of SLIP links is biased ! 50: * toward small packets (see comments on MTU/MSS below), changes ! 51: * use a variable length coding with one octet for numbers in the ! 52: * range 1 - 255 and 3 octets (0, MSB, LSB) for numbers in the ! 53: * range 256 - 65535 or 0. (If the change in sequence number or ! 54: * ack is more than 65535, an uncompressed packet is sent.) ! 55: */ ! 56: ! 57: /* ! 58: * Packet types (must not conflict with IP protocol version) ! 59: * ! 60: * The top nibble of the first octet is the packet type. There are ! 61: * three possible types: IP (not proto TCP or tcp with one of the ! 62: * control flags set); uncompressed TCP (a normal IP/TCP packet but ! 63: * with the 8-bit protocol field replaced by an 8-bit connection id -- ! 64: * this type of packet syncs the sender & receiver); and compressed ! 65: * TCP (described above). ! 66: * ! 67: * LSB of 4-bit field is TCP "PUSH" bit (a worthless anachronism) and ! 68: * is logically part of the 4-bit "changes" field that follows. Top ! 69: * three bits are actual packet type. For backward compatibility ! 70: * and in the interest of conserving bits, numbers are chosen so the ! 71: * IP protocol version number (4) which normally appears in this nibble ! 72: * means "IP packet". ! 73: */ ! 74: ! 75: /* packet types */ ! 76: #define TYPE_IP 0x40 ! 77: #define TYPE_UNCOMPRESSED_TCP 0x70 ! 78: #define TYPE_COMPRESSED_TCP 0x80 ! 79: #define TYPE_ERROR 0x00 ! 80: ! 81: /* Bits in first octet of compressed packet */ ! 82: #define NEW_C 0x40 /* flag bits for what changed in a packet */ ! 83: #define NEW_I 0x20 ! 84: #define NEW_S 0x08 ! 85: #define NEW_A 0x04 ! 86: #define NEW_W 0x02 ! 87: #define NEW_U 0x01 ! 88: ! 89: /* reserved, special-case values of above */ ! 90: #define SPECIAL_I (NEW_S|NEW_W|NEW_U) /* echoed interactive traffic */ ! 91: #define SPECIAL_D (NEW_S|NEW_A|NEW_W|NEW_U) /* unidirectional data */ ! 92: #define SPECIALS_MASK (NEW_S|NEW_A|NEW_W|NEW_U) ! 93: ! 94: #define TCP_PUSH_BIT 0x10 ! 95: ! 96: ! 97: /* ! 98: * "state" data for each active tcp conversation on the wire. This is ! 99: * basically a copy of the entire IP/TCP header from the last packet ! 100: * we saw from the conversation together with a small identifier ! 101: * the transmit & receive ends of the line use to locate saved header. ! 102: */ ! 103: struct cstate { ! 104: struct cstate *cs_next; /* next most recently used cstate (xmit only) */ ! 105: u_short cs_hlen; /* size of hdr (receive only) */ ! 106: u_char cs_id; /* connection # associated with this state */ ! 107: u_char cs_filler; ! 108: union { ! 109: char csu_hdr[MAX_HDR]; ! 110: struct ip csu_ip; /* ip/tcp hdr from most recent packet */ ! 111: } slcs_u; ! 112: }; ! 113: #define cs_ip slcs_u.csu_ip ! 114: #define cs_hdr slcs_u.csu_hdr ! 115: ! 116: /* ! 117: * all the state data for one serial line (we need one of these ! 118: * per line). ! 119: */ ! 120: struct slcompress { ! 121: struct cstate *last_cs; /* most recently used tstate */ ! 122: u_char last_recv; /* last rcvd conn. id */ ! 123: u_char last_xmit; /* last sent conn. id */ ! 124: u_short flags; ! 125: #ifndef SL_NO_STATS ! 126: int sls_packets; /* outbound packets */ ! 127: int sls_compressed; /* outbound compressed packets */ ! 128: int sls_searches; /* searches for connection state */ ! 129: int sls_misses; /* times couldn't find conn. state */ ! 130: int sls_uncompressedin; /* inbound uncompressed packets */ ! 131: int sls_compressedin; /* inbound compressed packets */ ! 132: int sls_errorin; /* inbound unknown type packets */ ! 133: int sls_tossed; /* inbound packets tossed because of error */ ! 134: #endif ! 135: struct cstate tstate[MAX_STATES]; /* xmit connection states */ ! 136: struct cstate rstate[MAX_STATES]; /* receive connection states */ ! 137: }; ! 138: /* flag values */ ! 139: #define SLF_TOSS 1 /* tossing rcvd frames because of input err */ ! 140: ! 141: extern void sl_compress_init(/* struct slcompress * */); ! 142: extern u_char sl_compress_tcp(/* struct mbuf *, struct ip *, ! 143: struct slcompress *, int compress_cid_flag */); ! 144: 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.