Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Release 1.0
[palacios.git] / geekos / src / lwip / netif / ppp / vj.h
1 /*
2  * Definitions for tcp compression routines.
3  *
4  * $Id: vj.h,v 1.5 2007/12/19 20:47:23 fbernon 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 */