18ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 28ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Definitions for tcp compression routines. 38ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 48ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * $Id: slcompress.h,v 1.4 1994/09/21 06:50:08 paulus Exp $ 58ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 68ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Copyright (c) 1989 Regents of the University of California. 78ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * All rights reserved. 88ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 98ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Redistribution and use in source and binary forms are permitted 108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * provided that the above copyright notice and this paragraph are 118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * duplicated in all such forms and that any documentation, 128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * advertising materials, and other materials related to such 138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * distribution and use acknowledge that the software was developed 148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * by the University of California, Berkeley. The name of the 158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * University may not be used to endorse or promote products derived 168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * from this software without specific prior written permission. 178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Van Jacobson (van@helios.ee.lbl.gov), Dec 31, 1989: 228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * - Initial distribution. 238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifndef _SLCOMPRESS_H_ 268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define _SLCOMPRESS_H_ 278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define MAX_STATES 16 /* must be > 2 and < 256 */ 298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define MAX_HDR MLEN /* XXX 4bsd-ism: should really be 128 */ 308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Compressed packet format: 338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * The first octet contains the packet type (top 3 bits), TCP 358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 'push' bit, and flags that indicate which of the 4 TCP sequence 368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * numbers have changed (bottom 5 bits). The next octet is a 378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * conversation number that associates a saved IP/TCP header with 388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * the compressed packet. The next two octets are the TCP checksum 398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * from the original datagram. The next 0 to 15 octets are 408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * sequence number changes, one change per bit set in the header 418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * (there may be no changes and there are two special cases where 428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * the receiver implicitly knows what changed -- see below). 438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * There are 5 numbers which can change (they are always inserted 458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * in the following order): TCP urgent pointer, window, 468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * acknowlegement, sequence number and IP ID. (The urgent pointer 478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * is different from the others in that its value is sent, not the 488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * change in value.) Since typical use of SLIP links is biased 498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * toward small packets (see comments on MTU/MSS below), changes 508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * use a variable length coding with one octet for numbers in the 518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * range 1 - 255 and 3 octets (0, MSB, LSB) for numbers in the 528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * range 256 - 65535 or 0. (If the change in sequence number or 538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * ack is more than 65535, an uncompressed packet is sent.) 548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Packet types (must not conflict with IP protocol version) 588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * The top nibble of the first octet is the packet type. There are 608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * three possible types: IP (not proto TCP or tcp with one of the 618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * control flags set); uncompressed TCP (a normal IP/TCP packet but 628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * with the 8-bit protocol field replaced by an 8-bit connection id -- 638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * this type of packet syncs the sender & receiver); and compressed 648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * TCP (described above). 658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * LSB of 4-bit field is TCP "PUSH" bit (a worthless anachronism) and 678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * is logically part of the 4-bit "changes" field that follows. Top 688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * three bits are actual packet type. For backward compatibility 698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * and in the interest of conserving bits, numbers are chosen so the 708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * IP protocol version number (4) which normally appears in this nibble 718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * means "IP packet". 728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* packet types */ 758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define TYPE_IP 0x40 768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define TYPE_UNCOMPRESSED_TCP 0x70 778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define TYPE_COMPRESSED_TCP 0x80 788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define TYPE_ERROR 0x00 798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Bits in first octet of compressed packet */ 818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define NEW_C 0x40 /* flag bits for what changed in a packet */ 828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define NEW_I 0x20 838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define NEW_S 0x08 848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define NEW_A 0x04 858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define NEW_W 0x02 868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define NEW_U 0x01 878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* reserved, special-case values of above */ 898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define SPECIAL_I (NEW_S|NEW_W|NEW_U) /* echoed interactive traffic */ 908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define SPECIAL_D (NEW_S|NEW_A|NEW_W|NEW_U) /* unidirectional data */ 918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define SPECIALS_MASK (NEW_S|NEW_A|NEW_W|NEW_U) 928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define TCP_PUSH_BIT 0x10 948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * "state" data for each active tcp conversation on the wire. This is 988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * basically a copy of the entire IP/TCP header from the last packet 998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * we saw from the conversation together with a small identifier 1008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * the transmit & receive ends of the line use to locate saved header. 1018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 1028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstruct cstate { 1038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project struct cstate *cs_next; /* next most recently used cstate (xmit only) */ 1048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project u_short cs_hlen; /* size of hdr (receive only) */ 1058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project u_char cs_id; /* connection # associated with this state */ 1068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project u_char cs_filler; 1078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project union { 1088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char csu_hdr[MAX_HDR]; 1098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project struct ip csu_ip; /* ip/tcp hdr from most recent packet */ 1108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } slcs_u; 1118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}; 1128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define cs_ip slcs_u.csu_ip 1138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define cs_hdr slcs_u.csu_hdr 1148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 1168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * all the state data for one serial line (we need one of these 1178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * per line). 1188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 1198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstruct slcompress { 1208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project struct cstate *last_cs; /* most recently used tstate */ 1218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project u_char last_recv; /* last rcvd conn. id */ 1228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project u_char last_xmit; /* last sent conn. id */ 1238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project u_short flags; 1248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifndef SL_NO_STATS 1258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int sls_packets; /* outbound packets */ 1268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int sls_compressed; /* outbound compressed packets */ 1278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int sls_searches; /* searches for connection state */ 1288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int sls_misses; /* times couldn't find conn. state */ 1298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int sls_uncompressedin; /* inbound uncompressed packets */ 1308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int sls_compressedin; /* inbound compressed packets */ 1318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int sls_errorin; /* inbound unknown type packets */ 1328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int sls_tossed; /* inbound packets tossed because of error */ 1338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 1348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project struct cstate tstate[MAX_STATES]; /* xmit connection states */ 1358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project struct cstate rstate[MAX_STATES]; /* receive connection states */ 1368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}; 1378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* flag values */ 1388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define SLF_TOSS 1 /* tossing rcvd frames because of input err */ 1398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid sl_compress_init __P((struct slcompress *)); 1418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid sl_compress_setup __P((struct slcompress *, int)); 1428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectu_int sl_compress_tcp __P((struct mbuf *, 1438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project struct ip *, struct slcompress *, int)); 1448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint sl_uncompress_tcp __P((u_char **, int, u_int, struct slcompress *)); 1458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint sl_uncompress_tcp_core __P((u_char *, int, int, u_int, 1468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project struct slcompress *, u_char **, u_int *)); 1478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif /* _SLCOMPRESS_H_ */ 149