#define SL_NO_STATS #ifndef _COMPRESS #define _COMPRESS #include "kernel.h" #include "streams.h" #include "f_ip.h" #include "vanj.h" #include "van_j.h" /* * Definitions for tcp compression routines. * * $Header: /usr/src/cvs/kernel/isdn/van_j/compress.h,v 1.2 1996/09/16 01:03:31 smurf Exp $ * * 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. */ #define MAX_STATES 16 /* must be > 2 and < 256 */ #define MAX_HDR 128 /* * Compressed packet format: * * The first octet contains the packet type (top 3 bits), TCP 'push' bit, and * flags that indicate which of the 4 TCP sequence numbers have changed (bottom * 5 bits). The next octet is a conversation number that associates a saved * IP/TCP header with the compressed packet. The next two octets are the TCP * checksum from the original datagram. The next 0 to 15 octets are sequence * number changes, one change per bit set in the header (there may be no * changes and there are two special cases where the receiver implicitly knows * what changed -- see below). * * There are 5 numbers which can change (they are always inserted in the following * order): TCP urgent pointer, window, acknowlegement, sequence number and IP * ID. (The urgent pointer is different from the others in that its value is * sent, not the change in value.) Since typical use of SLIP links is biased * toward small packets (see comments on MTU/MSS below), changes use a variable * length coding with one octet for numbers in the range 1 - 255 and 3 octets * (0, MSB, LSB) for numbers in the range 256 - 65535 or 0. (If the change in * sequence number or ack is more than 65535, an uncompressed packet is sent.) */ /* * Packet types (must not conflict with IP protocol version) * * The top nibble of the first octet is the packet type. There are three possible * types: IP (not proto TCP or tcp with one of the control flags set); * uncompressed TCP (a normal IP/TCP packet but with the 8-bit protocol field * replaced by an 8-bit connection id -- this type of packet syncs the sender & * receiver); and compressed TCP (described above). * _ LSB of 4-bit field is TCP "PUSH" bit (a worthless anachronism) and is logically * part of the 4-bit "changes" field that follows. Top three bits are actual * packet type. For backward compatibility and in the interest of conserving * bits, numbers are chosen so the IP protocol version number (4) which * normally appears in this nibble means "IP packet". */ /* packet types */ #define TYPE_IP 0x40 #define TYPE_UNCOMPRESSED_TCP 0x70 #define TYPE_COMPRESSED_TCP 0x80 #define TYPE_ERROR 0x00 /* Bits in first octet of compressed packet */ #define NEW_C 0x40 /* flag bits for what changed in a packet */ #define NEW_I 0x20 #define NEW_S 0x08 #define NEW_A 0x04 #define NEW_W 0x02 #define NEW_U 0x01 /* reserved, special-case values of above */ #define SPECIAL_I (NEW_S|NEW_W|NEW_U) /* echoed interactive traffic */ #define SPECIAL_D (NEW_S|NEW_A|NEW_W|NEW_U) /* unidirectional data */ #define SPECIALS_MASK (NEW_S|NEW_A|NEW_W|NEW_U) #define TCP_PUSH_BIT 0x10 /* * "state" data for each active tcp conversation on the wire. This is * basically a copy of the entire IP/TCP header from the last packet we saw * from the conversation together with a small identifier the transmit & * receive ends of the line use to locate saved header. */ struct cstate { struct cstate *cs_next; /* next most recently used cstate (xmit only) */ ushort_t cs_hlen; /* size of hdr (receive only) */ uchar_t cs_id; /* connection # associated with this state */ uchar_t cs_filler; union { char csu_hdr[MAX_HDR]; struct ip csu_ip; /* ip/tcp hdr from most recent packet */ } slcs_u; }; #define cs_ip slcs_u.csu_ip #define cs_hdr slcs_u.csu_hdr /* * all the state data for one serial line (we need one of these per line). */ struct compress { struct cstate *last_cs; /* most recently used tstate */ uchar_t last_recv; /* last rcvd conn. id */ uchar_t last_xmit; /* last sent conn. id */ ushort_t flags; #ifndef SL_NO_STATS int sls_packets; /* outbound packets */ int sls_compressed; /* outbound compressed packets */ int sls_searches; /* searches for connection state */ int sls_misses; /* times couldn't find conn. state */ int sls_uncompressedin; /* inbound uncompressed packets */ int sls_compressedin; /* inbound compressed packets */ int sls_errorin; /* inbound unknown type packets */ int sls_tossed; /* inbound packets tossed because of error */ #endif struct cstate tstate[MAX_STATES]; /* xmit connection states */ struct cstate rstate[MAX_STATES]; /* receive connection states */ }; /* flag values */ #define SLF_TOSS 1 /* tossing rcvd frames because of input err */ void compress_init (struct compress *); ushort_t compress_tcp (struct compress *, mblk_t **); void uncompress_tcp (struct compress *, mblk_t **, ushort_t); #endif