qemu/slirp/src/ip.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: BSD-3-Clause */
   2/*
   3 * Copyright (c) 1982, 1986, 1993
   4 *      The Regents of the University of California.  All rights reserved.
   5 *
   6 * Redistribution and use in source and binary forms, with or without
   7 * modification, are permitted provided that the following conditions
   8 * are met:
   9 * 1. Redistributions of source code must retain the above copyright
  10 *    notice, this list of conditions and the following disclaimer.
  11 * 2. Redistributions in binary form must reproduce the above copyright
  12 *    notice, this list of conditions and the following disclaimer in the
  13 *    documentation and/or other materials provided with the distribution.
  14 * 3. Neither the name of the University nor the names of its contributors
  15 *    may be used to endorse or promote products derived from this software
  16 *    without specific prior written permission.
  17 *
  18 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  21 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  28 * SUCH DAMAGE.
  29 *
  30 *      @(#)ip.h        8.1 (Berkeley) 6/10/93
  31 * ip.h,v 1.3 1994/08/21 05:27:30 paul Exp
  32 */
  33
  34#ifndef IP_H
  35#define IP_H
  36
  37#include <glib.h>
  38
  39#if G_BYTE_ORDER == G_BIG_ENDIAN
  40# undef NTOHL
  41# undef NTOHS
  42# undef HTONL
  43# undef HTONS
  44# define NTOHL(d)
  45# define NTOHS(d)
  46# define HTONL(d)
  47# define HTONS(d)
  48#else
  49# ifndef NTOHL
  50#  define NTOHL(d) ((d) = ntohl((d)))
  51# endif
  52# ifndef NTOHS
  53#  define NTOHS(d) ((d) = ntohs((uint16_t)(d)))
  54# endif
  55# ifndef HTONL
  56#  define HTONL(d) ((d) = htonl((d)))
  57# endif
  58# ifndef HTONS
  59#  define HTONS(d) ((d) = htons((uint16_t)(d)))
  60# endif
  61#endif
  62
  63typedef uint32_t n_long;                 /* long as received from the net */
  64
  65/*
  66 * Definitions for internet protocol version 4.
  67 * Per RFC 791, September 1981.
  68 */
  69#define IPVERSION       4
  70
  71/*
  72 * Structure of an internet header, naked of options.
  73 */
  74struct ip {
  75#if G_BYTE_ORDER == G_BIG_ENDIAN
  76        uint8_t ip_v:4,                 /* version */
  77                ip_hl:4;                /* header length */
  78#else
  79        uint8_t ip_hl:4,                /* header length */
  80                ip_v:4;                 /* version */
  81#endif
  82        uint8_t         ip_tos;                 /* type of service */
  83        uint16_t        ip_len;                 /* total length */
  84        uint16_t        ip_id;                  /* identification */
  85        uint16_t        ip_off;                 /* fragment offset field */
  86#define IP_DF 0x4000                    /* don't fragment flag */
  87#define IP_MF 0x2000                    /* more fragments flag */
  88#define IP_OFFMASK 0x1fff               /* mask for fragmenting bits */
  89        uint8_t ip_ttl;                 /* time to live */
  90        uint8_t ip_p;                   /* protocol */
  91        uint16_t        ip_sum;                 /* checksum */
  92        struct  in_addr ip_src,ip_dst;  /* source and dest address */
  93} SLIRP_PACKED;
  94
  95#define IP_MAXPACKET    65535           /* maximum packet size */
  96
  97/*
  98 * Definitions for IP type of service (ip_tos)
  99 */
 100#define IPTOS_LOWDELAY          0x10
 101#define IPTOS_THROUGHPUT        0x08
 102#define IPTOS_RELIABILITY       0x04
 103
 104/*
 105 * Definitions for options.
 106 */
 107#define IPOPT_COPIED(o)         ((o)&0x80)
 108#define IPOPT_CLASS(o)          ((o)&0x60)
 109#define IPOPT_NUMBER(o)         ((o)&0x1f)
 110
 111#define IPOPT_CONTROL           0x00
 112#define IPOPT_RESERVED1         0x20
 113#define IPOPT_DEBMEAS           0x40
 114#define IPOPT_RESERVED2         0x60
 115
 116#define IPOPT_EOL               0               /* end of option list */
 117#define IPOPT_NOP               1               /* no operation */
 118
 119#define IPOPT_RR                7               /* record packet route */
 120#define IPOPT_TS                68              /* timestamp */
 121#define IPOPT_SECURITY          130             /* provide s,c,h,tcc */
 122#define IPOPT_LSRR              131             /* loose source route */
 123#define IPOPT_SATID             136             /* satnet id */
 124#define IPOPT_SSRR              137             /* strict source route */
 125
 126/*
 127 * Offsets to fields in options other than EOL and NOP.
 128 */
 129#define IPOPT_OPTVAL            0               /* option ID */
 130#define IPOPT_OLEN              1               /* option length */
 131#define IPOPT_OFFSET            2               /* offset within option */
 132#define IPOPT_MINOFF            4               /* min value of above */
 133
 134/*
 135 * Time stamp option structure.
 136 */
 137struct  ip_timestamp {
 138        uint8_t ipt_code;               /* IPOPT_TS */
 139        uint8_t ipt_len;                /* size of structure (variable) */
 140        uint8_t ipt_ptr;                /* index of current entry */
 141#if G_BYTE_ORDER == G_BIG_ENDIAN
 142        uint8_t ipt_oflw:4,             /* overflow counter */
 143                ipt_flg:4;              /* flags, see below */
 144#else
 145        uint8_t ipt_flg:4,              /* flags, see below */
 146                ipt_oflw:4;             /* overflow counter */
 147#endif
 148        union ipt_timestamp {
 149                n_long  ipt_time[1];
 150                struct  ipt_ta {
 151                        struct in_addr ipt_addr;
 152                        n_long ipt_time;
 153                } ipt_ta[1];
 154        } ipt_timestamp;
 155} SLIRP_PACKED;
 156
 157/* flag bits for ipt_flg */
 158#define IPOPT_TS_TSONLY         0               /* timestamps only */
 159#define IPOPT_TS_TSANDADDR      1               /* timestamps and addresses */
 160#define IPOPT_TS_PRESPEC        3               /* specified modules only */
 161
 162/* bits for security (not byte swapped) */
 163#define IPOPT_SECUR_UNCLASS     0x0000
 164#define IPOPT_SECUR_CONFID      0xf135
 165#define IPOPT_SECUR_EFTO        0x789a
 166#define IPOPT_SECUR_MMMM        0xbc4d
 167#define IPOPT_SECUR_RESTR       0xaf13
 168#define IPOPT_SECUR_SECRET      0xd788
 169#define IPOPT_SECUR_TOPSECRET   0x6bc5
 170
 171/*
 172 * Internet implementation parameters.
 173 */
 174#define MAXTTL          255             /* maximum time to live (seconds) */
 175#define IPDEFTTL        64              /* default ttl, from RFC 1340 */
 176#define IPFRAGTTL       60              /* time to live for frags, slowhz */
 177#define IPTTLDEC        1               /* subtracted when forwarding */
 178
 179#define IP_MSS          576             /* default maximum segment size */
 180
 181#if GLIB_SIZEOF_VOID_P == 4
 182struct mbuf_ptr {
 183        struct mbuf *mptr;
 184        uint32_t dummy;
 185} SLIRP_PACKED;
 186#else
 187struct mbuf_ptr {
 188        struct mbuf *mptr;
 189} SLIRP_PACKED;
 190#endif
 191struct qlink {
 192        void *next, *prev;
 193};
 194
 195/*
 196 * Overlay for ip header used by other protocols (tcp, udp).
 197 */
 198struct ipovly {
 199        struct mbuf_ptr ih_mbuf;        /* backpointer to mbuf */
 200        uint8_t ih_x1;                  /* (unused) */
 201        uint8_t ih_pr;                  /* protocol */
 202        uint16_t        ih_len;                 /* protocol length */
 203        struct  in_addr ih_src;         /* source internet address */
 204        struct  in_addr ih_dst;         /* destination internet address */
 205} SLIRP_PACKED;
 206
 207/*
 208 * Ip reassembly queue structure.  Each fragment
 209 * being reassembled is attached to one of these structures.
 210 * They are timed out after ipq_ttl drops to 0, and may also
 211 * be reclaimed if memory becomes tight.
 212 * size 28 bytes
 213 */
 214struct ipq {
 215        struct qlink frag_link;                 /* to ip headers of fragments */
 216        struct qlink ip_link;                           /* to other reass headers */
 217        uint8_t ipq_ttl;                /* time for reass q to live */
 218        uint8_t ipq_p;                  /* protocol of this fragment */
 219        uint16_t        ipq_id;                 /* sequence id for reassembly */
 220        struct  in_addr ipq_src,ipq_dst;
 221};
 222
 223/*
 224 * Ip header, when holding a fragment.
 225 *
 226 * Note: ipf_link must be at same offset as frag_link above
 227 */
 228struct  ipasfrag {
 229        struct qlink ipf_link;
 230        struct ip ipf_ip;
 231};
 232
 233G_STATIC_ASSERT(offsetof(struct ipq, frag_link) ==
 234                offsetof(struct ipasfrag, ipf_link));
 235
 236#define ipf_off      ipf_ip.ip_off
 237#define ipf_tos      ipf_ip.ip_tos
 238#define ipf_len      ipf_ip.ip_len
 239#define ipf_next     ipf_link.next
 240#define ipf_prev     ipf_link.prev
 241
 242#endif
 243