Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
vj.h
00001 /* 00002 * Definitions for tcp compression routines. 00003 * 00004 * $Id: vj.h,v 1.7 2010/02/22 17:52:09 goldsimon Exp $ 00005 * 00006 * Copyright (c) 1989 Regents of the University of California. 00007 * All rights reserved. 00008 * 00009 * Redistribution and use in source and binary forms are permitted 00010 * provided that the above copyright notice and this paragraph are 00011 * duplicated in all such forms and that any documentation, 00012 * advertising materials, and other materials related to such 00013 * distribution and use acknowledge that the software was developed 00014 * by the University of California, Berkeley. The name of the 00015 * University may not be used to endorse or promote products derived 00016 * from this software without specific prior written permission. 00017 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 00018 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 00019 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 00020 * 00021 * Van Jacobson (van@helios.ee.lbl.gov), Dec 31, 1989: 00022 * - Initial distribution. 00023 */ 00024 00025 #include "netif/ppp/ppp_opts.h" 00026 #if PPP_SUPPORT && VJ_SUPPORT /* don't build if not configured for use in lwipopts.h */ 00027 00028 #ifndef VJ_H 00029 #define VJ_H 00030 00031 #include "lwip/ip.h" 00032 #include "lwip/priv/tcp_priv.h" 00033 00034 #define MAX_SLOTS 16 /* must be > 2 and < 256 */ 00035 #define MAX_HDR 128 00036 00037 /* 00038 * Compressed packet format: 00039 * 00040 * The first octet contains the packet type (top 3 bits), TCP 00041 * 'push' bit, and flags that indicate which of the 4 TCP sequence 00042 * numbers have changed (bottom 5 bits). The next octet is a 00043 * conversation number that associates a saved IP/TCP header with 00044 * the compressed packet. The next two octets are the TCP checksum 00045 * from the original datagram. The next 0 to 15 octets are 00046 * sequence number changes, one change per bit set in the header 00047 * (there may be no changes and there are two special cases where 00048 * the receiver implicitly knows what changed -- see below). 00049 * 00050 * There are 5 numbers which can change (they are always inserted 00051 * in the following order): TCP urgent pointer, window, 00052 * acknowlegement, sequence number and IP ID. (The urgent pointer 00053 * is different from the others in that its value is sent, not the 00054 * change in value.) Since typical use of SLIP links is biased 00055 * toward small packets (see comments on MTU/MSS below), changes 00056 * use a variable length coding with one octet for numbers in the 00057 * range 1 - 255 and 3 octets (0, MSB, LSB) for numbers in the 00058 * range 256 - 65535 or 0. (If the change in sequence number or 00059 * ack is more than 65535, an uncompressed packet is sent.) 00060 */ 00061 00062 /* 00063 * Packet types (must not conflict with IP protocol version) 00064 * 00065 * The top nibble of the first octet is the packet type. There are 00066 * three possible types: IP (not proto TCP or tcp with one of the 00067 * control flags set); uncompressed TCP (a normal IP/TCP packet but 00068 * with the 8-bit protocol field replaced by an 8-bit connection id -- 00069 * this type of packet syncs the sender & receiver); and compressed 00070 * TCP (described above). 00071 * 00072 * LSB of 4-bit field is TCP "PUSH" bit (a worthless anachronism) and 00073 * is logically part of the 4-bit "changes" field that follows. Top 00074 * three bits are actual packet type. For backward compatibility 00075 * and in the interest of conserving bits, numbers are chosen so the 00076 * IP protocol version number (4) which normally appears in this nibble 00077 * means "IP packet". 00078 */ 00079 00080 /* packet types */ 00081 #define TYPE_IP 0x40 00082 #define TYPE_UNCOMPRESSED_TCP 0x70 00083 #define TYPE_COMPRESSED_TCP 0x80 00084 #define TYPE_ERROR 0x00 00085 00086 /* Bits in first octet of compressed packet */ 00087 #define NEW_C 0x40 /* flag bits for what changed in a packet */ 00088 #define NEW_I 0x20 00089 #define NEW_S 0x08 00090 #define NEW_A 0x04 00091 #define NEW_W 0x02 00092 #define NEW_U 0x01 00093 00094 /* reserved, special-case values of above */ 00095 #define SPECIAL_I (NEW_S|NEW_W|NEW_U) /* echoed interactive traffic */ 00096 #define SPECIAL_D (NEW_S|NEW_A|NEW_W|NEW_U) /* unidirectional data */ 00097 #define SPECIALS_MASK (NEW_S|NEW_A|NEW_W|NEW_U) 00098 00099 #define TCP_PUSH_BIT 0x10 00100 00101 00102 /* 00103 * "state" data for each active tcp conversation on the wire. This is 00104 * basically a copy of the entire IP/TCP header from the last packet 00105 * we saw from the conversation together with a small identifier 00106 * the transmit & receive ends of the line use to locate saved header. 00107 */ 00108 struct cstate { 00109 struct cstate *cs_next; /* next most recently used state (xmit only) */ 00110 u16_t cs_hlen; /* size of hdr (receive only) */ 00111 u8_t cs_id; /* connection # associated with this state */ 00112 u8_t cs_filler; 00113 union { 00114 char csu_hdr[MAX_HDR]; 00115 struct ip_hdr csu_ip; /* ip/tcp hdr from most recent packet */ 00116 } vjcs_u; 00117 }; 00118 #define cs_ip vjcs_u.csu_ip 00119 #define cs_hdr vjcs_u.csu_hdr 00120 00121 00122 struct vjstat { 00123 u32_t vjs_packets; /* outbound packets */ 00124 u32_t vjs_compressed; /* outbound compressed packets */ 00125 u32_t vjs_searches; /* searches for connection state */ 00126 u32_t vjs_misses; /* times couldn't find conn. state */ 00127 u32_t vjs_uncompressedin; /* inbound uncompressed packets */ 00128 u32_t vjs_compressedin; /* inbound compressed packets */ 00129 u32_t vjs_errorin; /* inbound unknown type packets */ 00130 u32_t vjs_tossed; /* inbound packets tossed because of error */ 00131 }; 00132 00133 /* 00134 * all the state data for one serial line (we need one of these per line). 00135 */ 00136 struct vjcompress { 00137 struct cstate *last_cs; /* most recently used tstate */ 00138 u8_t last_recv; /* last rcvd conn. id */ 00139 u8_t last_xmit; /* last sent conn. id */ 00140 u16_t flags; 00141 u8_t maxSlotIndex; 00142 u8_t compressSlot; /* Flag indicating OK to compress slot ID. */ 00143 #if LINK_STATS 00144 struct vjstat stats; 00145 #endif 00146 struct cstate tstate[MAX_SLOTS]; /* xmit connection states */ 00147 struct cstate rstate[MAX_SLOTS]; /* receive connection states */ 00148 }; 00149 00150 /* flag values */ 00151 #define VJF_TOSS 1U /* tossing rcvd frames because of input err */ 00152 00153 extern void vj_compress_init (struct vjcompress *comp); 00154 extern u8_t vj_compress_tcp (struct vjcompress *comp, struct pbuf **pb); 00155 extern void vj_uncompress_err (struct vjcompress *comp); 00156 extern int vj_uncompress_uncomp(struct pbuf *nb, struct vjcompress *comp); 00157 extern int vj_uncompress_tcp (struct pbuf **nb, struct vjcompress *comp); 00158 00159 #endif /* VJ_H */ 00160 00161 #endif /* PPP_SUPPORT && VJ_SUPPORT */
Generated on Tue Jul 12 2022 14:25:24 by
