linux/include/net/slhc_vj.h
<<
>>
Prefs
   1#ifndef _SLHC_H
   2#define _SLHC_H
   3/*
   4 * Definitions for tcp compression routines.
   5 *
   6 * $Header: slcompress.h,v 1.10 89/12/31 08:53:02 van Exp $
   7 *
   8 * Copyright (c) 1989 Regents of the University of California.
   9 * All rights reserved.
  10 *
  11 * Redistribution and use in source and binary forms are permitted
  12 * provided that the above copyright notice and this paragraph are
  13 * duplicated in all such forms and that any documentation,
  14 * advertising materials, and other materials related to such
  15 * distribution and use acknowledge that the software was developed
  16 * by the University of California, Berkeley.  The name of the
  17 * University may not be used to endorse or promote products derived
  18 * from this software without specific prior written permission.
  19 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  20 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  22 *
  23 *      Van Jacobson (van@helios.ee.lbl.gov), Dec 31, 1989:
  24 *      - Initial distribution.
  25 *
  26 *
  27 * modified for KA9Q Internet Software Package by
  28 * Katie Stevens (dkstevens@ucdavis.edu)
  29 * University of California, Davis
  30 * Computing Services
  31 *      - 01-31-90      initial adaptation
  32 *
  33 *      - Feb 1991      Bill_Simpson@um.cc.umich.edu
  34 *                      variable number of conversation slots
  35 *                      allow zero or one slots
  36 *                      separate routines
  37 *                      status display
  38 */
  39
  40/*
  41 * Compressed packet format:
  42 *
  43 * The first octet contains the packet type (top 3 bits), TCP
  44 * 'push' bit, and flags that indicate which of the 4 TCP sequence
  45 * numbers have changed (bottom 5 bits).  The next octet is a
  46 * conversation number that associates a saved IP/TCP header with
  47 * the compressed packet.  The next two octets are the TCP checksum
  48 * from the original datagram.  The next 0 to 15 octets are
  49 * sequence number changes, one change per bit set in the header
  50 * (there may be no changes and there are two special cases where
  51 * the receiver implicitly knows what changed -- see below).
  52 *
  53 * There are 5 numbers which can change (they are always inserted
  54 * in the following order): TCP urgent pointer, window,
  55 * acknowledgment, sequence number and IP ID.  (The urgent pointer
  56 * is different from the others in that its value is sent, not the
  57 * change in value.)  Since typical use of SLIP links is biased
  58 * toward small packets (see comments on MTU/MSS below), changes
  59 * use a variable length coding with one octet for numbers in the
  60 * range 1 - 255 and 3 octets (0, MSB, LSB) for numbers in the
  61 * range 256 - 65535 or 0.  (If the change in sequence number or
  62 * ack is more than 65535, an uncompressed packet is sent.)
  63 */
  64
  65/*
  66 * Packet types (must not conflict with IP protocol version)
  67 *
  68 * The top nibble of the first octet is the packet type.  There are
  69 * three possible types: IP (not proto TCP or tcp with one of the
  70 * control flags set); uncompressed TCP (a normal IP/TCP packet but
  71 * with the 8-bit protocol field replaced by an 8-bit connection id --
  72 * this type of packet syncs the sender & receiver); and compressed
  73 * TCP (described above).
  74 *
  75 * LSB of 4-bit field is TCP "PUSH" bit (a worthless anachronism) and
  76 * is logically part of the 4-bit "changes" field that follows.  Top
  77 * three bits are actual packet type.  For backward compatibility
  78 * and in the interest of conserving bits, numbers are chosen so the
  79 * IP protocol version number (4) which normally appears in this nibble
  80 * means "IP packet".
  81 */
  82
  83
  84#include <linux/ip.h>
  85#include <linux/tcp.h>
  86
  87/* SLIP compression masks for len/vers byte */
  88#define SL_TYPE_IP 0x40
  89#define SL_TYPE_UNCOMPRESSED_TCP 0x70
  90#define SL_TYPE_COMPRESSED_TCP 0x80
  91#define SL_TYPE_ERROR 0x00
  92
  93/* Bits in first octet of compressed packet */
  94#define NEW_C   0x40    /* flag bits for what changed in a packet */
  95#define NEW_I   0x20
  96#define NEW_S   0x08
  97#define NEW_A   0x04
  98#define NEW_W   0x02
  99#define NEW_U   0x01
 100
 101/* reserved, special-case values of above */
 102#define SPECIAL_I (NEW_S|NEW_W|NEW_U)           /* echoed interactive traffic */
 103#define SPECIAL_D (NEW_S|NEW_A|NEW_W|NEW_U)     /* unidirectional data */
 104#define SPECIALS_MASK (NEW_S|NEW_A|NEW_W|NEW_U)
 105
 106#define TCP_PUSH_BIT 0x10
 107
 108/*
 109 * data type and sizes conversion assumptions:
 110 *
 111 *      VJ code         KA9Q style      generic
 112 *      u_char          byte_t          unsigned char    8 bits
 113 *      u_short         int16           unsigned short  16 bits
 114 *      u_int           int16           unsigned short  16 bits
 115 *      u_long          unsigned long   unsigned long   32 bits
 116 *      int             int32           long            32 bits
 117 */
 118
 119typedef __u8 byte_t;
 120typedef __u32 int32;
 121
 122/*
 123 * "state" data for each active tcp conversation on the wire.  This is
 124 * basically a copy of the entire IP/TCP header from the last packet
 125 * we saw from the conversation together with a small identifier
 126 * the transmit & receive ends of the line use to locate saved header.
 127 */
 128struct cstate {
 129        byte_t  cs_this;        /* connection id number (xmit) */
 130        struct cstate *next;    /* next in ring (xmit) */
 131        struct iphdr cs_ip;     /* ip/tcp hdr from most recent packet */
 132        struct tcphdr cs_tcp;
 133        unsigned char cs_ipopt[64];
 134        unsigned char cs_tcpopt[64];
 135        int cs_hsize;
 136};
 137#define NULLSLSTATE     (struct cstate *)0
 138
 139/*
 140 * all the state data for one serial line (we need one of these per line).
 141 */
 142struct slcompress {
 143        struct cstate *tstate;  /* transmit connection states (array)*/
 144        struct cstate *rstate;  /* receive connection states (array)*/
 145
 146        byte_t tslot_limit;     /* highest transmit slot id (0-l)*/
 147        byte_t rslot_limit;     /* highest receive slot id (0-l)*/
 148
 149        byte_t xmit_oldest;     /* oldest xmit in ring */
 150        byte_t xmit_current;    /* most recent xmit id */
 151        byte_t recv_current;    /* most recent rcvd id */
 152
 153        byte_t flags;
 154#define SLF_TOSS        0x01    /* tossing rcvd frames until id received */
 155
 156        int32 sls_o_nontcp;     /* outbound non-TCP packets */
 157        int32 sls_o_tcp;        /* outbound TCP packets */
 158        int32 sls_o_uncompressed;       /* outbound uncompressed packets */
 159        int32 sls_o_compressed; /* outbound compressed packets */
 160        int32 sls_o_searches;   /* searches for connection state */
 161        int32 sls_o_misses;     /* times couldn't find conn. state */
 162
 163        int32 sls_i_uncompressed;       /* inbound uncompressed packets */
 164        int32 sls_i_compressed; /* inbound compressed packets */
 165        int32 sls_i_error;      /* inbound error packets */
 166        int32 sls_i_tossed;     /* inbound packets tossed because of error */
 167
 168        int32 sls_i_runt;
 169        int32 sls_i_badcheck;
 170};
 171#define NULLSLCOMPR     (struct slcompress *)0
 172
 173/* In slhc.c: */
 174struct slcompress *slhc_init(int rslots, int tslots);
 175void slhc_free(struct slcompress *comp);
 176
 177int slhc_compress(struct slcompress *comp, unsigned char *icp, int isize,
 178                  unsigned char *ocp, unsigned char **cpp, int compress_cid);
 179int slhc_uncompress(struct slcompress *comp, unsigned char *icp, int isize);
 180int slhc_remember(struct slcompress *comp, unsigned char *icp, int isize);
 181int slhc_toss(struct slcompress *comp);
 182
 183#endif  /* _SLHC_H */
 184