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