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