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