Mistake on this page?
Report an issue in GitHub or email us
vj.h
1 /*
2  * Definitions for tcp compression routines.
3  *
4  * $Id: vj.h,v 1.7 2010/02/22 17:52:09 goldsimon 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 #include "ppp_opts.h"
26 #if PPP_SUPPORT && VJ_SUPPORT /* don't build if not configured for use in ppp_opts.h */
27 
28 #ifndef VJ_H
29 #define VJ_H
30 
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34 
35 #define MAX_SLOTS 16 /* must be > 2 and < 256 */
36 #define MAX_HDR 128
37 
38 /*
39  * Compressed packet format:
40  *
41  * The first octet contains the packet type (top 3 bits), TCP
42  * 'push' bit, and flags that indicate which of the 4 TCP sequence
43  * numbers have changed (bottom 5 bits). The next octet is a
44  * conversation number that associates a saved IP/TCP header with
45  * the compressed packet. The next two octets are the TCP checksum
46  * from the original datagram. The next 0 to 15 octets are
47  * sequence number changes, one change per bit set in the header
48  * (there may be no changes and there are two special cases where
49  * the receiver implicitly knows what changed -- see below).
50  *
51  * There are 5 numbers which can change (they are always inserted
52  * in the following order): TCP urgent pointer, window,
53  * acknowlegement, sequence number and IP ID. (The urgent pointer
54  * is different from the others in that its value is sent, not the
55  * change in value.) Since typical use of SLIP links is biased
56  * toward small packets (see comments on MTU/MSS below), changes
57  * use a variable length coding with one octet for numbers in the
58  * range 1 - 255 and 3 octets (0, MSB, LSB) for numbers in the
59  * range 256 - 65535 or 0. (If the change in sequence number or
60  * ack is more than 65535, an uncompressed packet is sent.)
61  */
62 
63 /*
64  * Packet types (must not conflict with IP protocol version)
65  *
66  * The top nibble of the first octet is the packet type. There are
67  * three possible types: IP (not proto TCP or tcp with one of the
68  * control flags set); uncompressed TCP (a normal IP/TCP packet but
69  * with the 8-bit protocol field replaced by an 8-bit connection id --
70  * this type of packet syncs the sender & receiver); and compressed
71  * TCP (described above).
72  *
73  * LSB of 4-bit field is TCP "PUSH" bit (a worthless anachronism) and
74  * is logically part of the 4-bit "changes" field that follows. Top
75  * three bits are actual packet type. For backward compatibility
76  * and in the interest of conserving bits, numbers are chosen so the
77  * IP protocol version number (4) which normally appears in this nibble
78  * means "IP packet".
79  */
80 
81 /* packet types */
82 #define TYPE_IP 0x40
83 #define TYPE_UNCOMPRESSED_TCP 0x70
84 #define TYPE_COMPRESSED_TCP 0x80
85 #define TYPE_ERROR 0x00
86 
87 /* Bits in first octet of compressed packet */
88 #define NEW_C 0x40 /* flag bits for what changed in a packet */
89 #define NEW_I 0x20
90 #define NEW_S 0x08
91 #define NEW_A 0x04
92 #define NEW_W 0x02
93 #define NEW_U 0x01
94 
95 /* reserved, special-case values of above */
96 #define SPECIAL_I (NEW_S|NEW_W|NEW_U) /* echoed interactive traffic */
97 #define SPECIAL_D (NEW_S|NEW_A|NEW_W|NEW_U) /* unidirectional data */
98 #define SPECIALS_MASK (NEW_S|NEW_A|NEW_W|NEW_U)
99 
100 #define TCP_PUSH_BIT 0x10
101 
102 
103 /*
104  * "state" data for each active tcp conversation on the wire. This is
105  * basically a copy of the entire IP/TCP header from the last packet
106  * we saw from the conversation together with a small identifier
107  * the transmit & receive ends of the line use to locate saved header.
108  */
109 struct cstate {
110  struct cstate *cs_next; /* next most recently used state (xmit only) */
111  u16_t cs_hlen; /* size of hdr (receive only) */
112  u8_t cs_id; /* connection # associated with this state */
113  u8_t cs_filler;
114  union {
115  char csu_hdr[MAX_HDR];
116  struct ip_hdr csu_ip; /* ip/tcp hdr from most recent packet */
117  } vjcs_u;
118 };
119 #define cs_ip vjcs_u.csu_ip
120 #define cs_hdr vjcs_u.csu_hdr
121 
122 
123 struct vjstat {
124  u32_t vjs_packets; /* outbound packets */
125  u32_t vjs_compressed; /* outbound compressed packets */
126  u32_t vjs_searches; /* searches for connection state */
127  u32_t vjs_misses; /* times couldn't find conn. state */
128  u32_t vjs_uncompressedin; /* inbound uncompressed packets */
129  u32_t vjs_compressedin; /* inbound compressed packets */
130  u32_t vjs_errorin; /* inbound unknown type packets */
131  u32_t vjs_tossed; /* inbound packets tossed because of error */
132 };
133 
134 /*
135  * all the state data for one serial line (we need one of these per line).
136  */
137 struct vjcompress {
138  struct cstate *last_cs; /* most recently used tstate */
139  u8_t last_recv; /* last rcvd conn. id */
140  u8_t last_xmit; /* last sent conn. id */
141  u16_t flags;
142  u8_t maxSlotIndex;
143  u8_t compressSlot; /* Flag indicating OK to compress slot ID. */
144 #if LINK_STATS
145  struct vjstat stats;
146 #endif
147  struct cstate tstate[MAX_SLOTS]; /* xmit connection states */
148  struct cstate rstate[MAX_SLOTS]; /* receive connection states */
149 };
150 
151 /* flag values */
152 #define VJF_TOSS 1U /* tossing rcvd frames because of input err */
153 
154 extern void vj_compress_init (struct vjcompress *comp);
155 extern u8_t vj_compress_tcp (struct vjcompress *comp, struct pbuf **pb);
156 extern void vj_uncompress_err (struct vjcompress *comp);
157 extern int vj_uncompress_uncomp(struct pbuf *nb, struct vjcompress *comp);
158 extern int vj_uncompress_tcp (struct pbuf **nb, struct vjcompress *comp);
159 
160 #ifdef __cplusplus
161 }
162 #endif
163 
164 #endif /* VJ_H */
165 
166 #endif /* PPP_SUPPORT && VJ_SUPPORT */
Important Information for this Arm website

This site uses cookies to store information on your computer. By continuing to use our site, you consent to our cookies. If you are not happy with the use of these cookies, please review our Cookie Policy to learn how they can be disabled. By disabling cookies, some features of the site will not work.