Statistics
| Branch: | Revision:

root / slirp / ip.h @ 430116a1

History | View | Annotate | Download (9.8 kB)

1 f0cbd3ec bellard
/*
2 f0cbd3ec bellard
 * Copyright (c) 1982, 1986, 1993
3 f0cbd3ec bellard
 *        The Regents of the University of California.  All rights reserved.
4 f0cbd3ec bellard
 *
5 f0cbd3ec bellard
 * Redistribution and use in source and binary forms, with or without
6 f0cbd3ec bellard
 * modification, are permitted provided that the following conditions
7 f0cbd3ec bellard
 * are met:
8 f0cbd3ec bellard
 * 1. Redistributions of source code must retain the above copyright
9 f0cbd3ec bellard
 *    notice, this list of conditions and the following disclaimer.
10 f0cbd3ec bellard
 * 2. Redistributions in binary form must reproduce the above copyright
11 f0cbd3ec bellard
 *    notice, this list of conditions and the following disclaimer in the
12 f0cbd3ec bellard
 *    documentation and/or other materials provided with the distribution.
13 f0cbd3ec bellard
 * 3. All advertising materials mentioning features or use of this software
14 f0cbd3ec bellard
 *    must display the following acknowledgement:
15 f0cbd3ec bellard
 *        This product includes software developed by the University of
16 f0cbd3ec bellard
 *        California, Berkeley and its contributors.
17 f0cbd3ec bellard
 * 4. Neither the name of the University nor the names of its contributors
18 f0cbd3ec bellard
 *    may be used to endorse or promote products derived from this software
19 f0cbd3ec bellard
 *    without specific prior written permission.
20 f0cbd3ec bellard
 *
21 f0cbd3ec bellard
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 f0cbd3ec bellard
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 f0cbd3ec bellard
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 f0cbd3ec bellard
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 f0cbd3ec bellard
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 f0cbd3ec bellard
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 f0cbd3ec bellard
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 f0cbd3ec bellard
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 f0cbd3ec bellard
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 f0cbd3ec bellard
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 f0cbd3ec bellard
 * SUCH DAMAGE.
32 f0cbd3ec bellard
 *
33 f0cbd3ec bellard
 *        @(#)ip.h        8.1 (Berkeley) 6/10/93
34 f0cbd3ec bellard
 * ip.h,v 1.3 1994/08/21 05:27:30 paul Exp
35 f0cbd3ec bellard
 */
36 f0cbd3ec bellard
37 f0cbd3ec bellard
#ifndef _IP_H_
38 f0cbd3ec bellard
#define _IP_H_
39 f0cbd3ec bellard
40 f0cbd3ec bellard
#ifdef WORDS_BIGENDIAN
41 f0cbd3ec bellard
# ifndef NTOHL
42 f0cbd3ec bellard
#  define NTOHL(d)
43 f0cbd3ec bellard
# endif
44 f0cbd3ec bellard
# ifndef NTOHS
45 f0cbd3ec bellard
#  define NTOHS(d)
46 f0cbd3ec bellard
# endif
47 f0cbd3ec bellard
# ifndef HTONL
48 f0cbd3ec bellard
#  define HTONL(d)
49 f0cbd3ec bellard
# endif
50 f0cbd3ec bellard
# ifndef HTONS
51 f0cbd3ec bellard
#  define HTONS(d)
52 f0cbd3ec bellard
# endif
53 f0cbd3ec bellard
#else
54 f0cbd3ec bellard
# ifndef NTOHL
55 f0cbd3ec bellard
#  define NTOHL(d) ((d) = ntohl((d)))
56 f0cbd3ec bellard
# endif
57 f0cbd3ec bellard
# ifndef NTOHS
58 f0cbd3ec bellard
#  define NTOHS(d) ((d) = ntohs((u_int16_t)(d)))
59 f0cbd3ec bellard
# endif
60 f0cbd3ec bellard
# ifndef HTONL
61 f0cbd3ec bellard
#  define HTONL(d) ((d) = htonl((d)))
62 f0cbd3ec bellard
# endif
63 f0cbd3ec bellard
# ifndef HTONS
64 f0cbd3ec bellard
#  define HTONS(d) ((d) = htons((u_int16_t)(d)))
65 f0cbd3ec bellard
# endif
66 f0cbd3ec bellard
#endif
67 f0cbd3ec bellard
68 f0cbd3ec bellard
typedef u_int32_t n_long;                 /* long as received from the net */
69 f0cbd3ec bellard
70 f0cbd3ec bellard
/*
71 f0cbd3ec bellard
 * Definitions for internet protocol version 4.
72 f0cbd3ec bellard
 * Per RFC 791, September 1981.
73 f0cbd3ec bellard
 */
74 f0cbd3ec bellard
#define        IPVERSION        4
75 f0cbd3ec bellard
76 f0cbd3ec bellard
/*
77 f0cbd3ec bellard
 * Structure of an internet header, naked of options.
78 f0cbd3ec bellard
 *
79 f0cbd3ec bellard
 * We declare ip_len and ip_off to be short, rather than u_short
80 f0cbd3ec bellard
 * pragmatically since otherwise unsigned comparisons can result
81 f0cbd3ec bellard
 * against negative integers quite easily, and fail in subtle ways.
82 f0cbd3ec bellard
 */
83 f0cbd3ec bellard
struct ip {
84 f0cbd3ec bellard
#ifdef WORDS_BIGENDIAN
85 f0cbd3ec bellard
        u_int ip_v:4,                        /* version */
86 f0cbd3ec bellard
                ip_hl:4;                /* header length */
87 f0cbd3ec bellard
#else
88 f0cbd3ec bellard
        u_int ip_hl:4,                /* header length */
89 f0cbd3ec bellard
                ip_v:4;                        /* version */
90 f0cbd3ec bellard
#endif
91 f0cbd3ec bellard
        u_int8_t ip_tos;                        /* type of service */
92 f0cbd3ec bellard
        int16_t        ip_len;                        /* total length */
93 f0cbd3ec bellard
        u_int16_t        ip_id;                        /* identification */
94 f0cbd3ec bellard
        int16_t        ip_off;                        /* fragment offset field */
95 f0cbd3ec bellard
#define        IP_DF 0x4000                        /* don't fragment flag */
96 f0cbd3ec bellard
#define        IP_MF 0x2000                        /* more fragments flag */
97 f0cbd3ec bellard
#define        IP_OFFMASK 0x1fff                /* mask for fragmenting bits */
98 f0cbd3ec bellard
        u_int8_t ip_ttl;                        /* time to live */
99 f0cbd3ec bellard
        u_int8_t ip_p;                        /* protocol */
100 f0cbd3ec bellard
        u_int16_t        ip_sum;                        /* checksum */
101 f0cbd3ec bellard
        struct        in_addr ip_src,ip_dst;        /* source and dest address */
102 f0cbd3ec bellard
};
103 f0cbd3ec bellard
104 f0cbd3ec bellard
#define        IP_MAXPACKET        65535                /* maximum packet size */
105 f0cbd3ec bellard
106 f0cbd3ec bellard
/*
107 f0cbd3ec bellard
 * Definitions for IP type of service (ip_tos)
108 f0cbd3ec bellard
 */
109 f0cbd3ec bellard
#define        IPTOS_LOWDELAY                0x10
110 f0cbd3ec bellard
#define        IPTOS_THROUGHPUT        0x08
111 f0cbd3ec bellard
#define        IPTOS_RELIABILITY        0x04
112 f0cbd3ec bellard
113 f0cbd3ec bellard
/*
114 f0cbd3ec bellard
 * Definitions for options.
115 f0cbd3ec bellard
 */
116 f0cbd3ec bellard
#define        IPOPT_COPIED(o)                ((o)&0x80)
117 f0cbd3ec bellard
#define        IPOPT_CLASS(o)                ((o)&0x60)
118 f0cbd3ec bellard
#define        IPOPT_NUMBER(o)                ((o)&0x1f)
119 f0cbd3ec bellard
120 f0cbd3ec bellard
#define        IPOPT_CONTROL                0x00
121 f0cbd3ec bellard
#define        IPOPT_RESERVED1                0x20
122 f0cbd3ec bellard
#define        IPOPT_DEBMEAS                0x40
123 f0cbd3ec bellard
#define        IPOPT_RESERVED2                0x60
124 f0cbd3ec bellard
125 f0cbd3ec bellard
#define        IPOPT_EOL                0                /* end of option list */
126 f0cbd3ec bellard
#define        IPOPT_NOP                1                /* no operation */
127 f0cbd3ec bellard
128 f0cbd3ec bellard
#define        IPOPT_RR                7                /* record packet route */
129 f0cbd3ec bellard
#define        IPOPT_TS                68                /* timestamp */
130 f0cbd3ec bellard
#define        IPOPT_SECURITY                130                /* provide s,c,h,tcc */
131 f0cbd3ec bellard
#define        IPOPT_LSRR                131                /* loose source route */
132 f0cbd3ec bellard
#define        IPOPT_SATID                136                /* satnet id */
133 f0cbd3ec bellard
#define        IPOPT_SSRR                137                /* strict source route */
134 f0cbd3ec bellard
135 f0cbd3ec bellard
/*
136 f0cbd3ec bellard
 * Offsets to fields in options other than EOL and NOP.
137 f0cbd3ec bellard
 */
138 f0cbd3ec bellard
#define        IPOPT_OPTVAL                0                /* option ID */
139 f0cbd3ec bellard
#define        IPOPT_OLEN                1                /* option length */
140 f0cbd3ec bellard
#define IPOPT_OFFSET                2                /* offset within option */
141 f0cbd3ec bellard
#define        IPOPT_MINOFF                4                /* min value of above */
142 f0cbd3ec bellard
143 f0cbd3ec bellard
/*
144 f0cbd3ec bellard
 * Time stamp option structure.
145 f0cbd3ec bellard
 */
146 f0cbd3ec bellard
struct        ip_timestamp {
147 f0cbd3ec bellard
        u_int8_t        ipt_code;                /* IPOPT_TS */
148 f0cbd3ec bellard
        u_int8_t        ipt_len;                /* size of structure (variable) */
149 f0cbd3ec bellard
        u_int8_t        ipt_ptr;                /* index of current entry */
150 f0cbd3ec bellard
#ifdef WORDS_BIGENDIAN
151 f0cbd3ec bellard
        u_int        ipt_oflw:4,                /* overflow counter */
152 f0cbd3ec bellard
                ipt_flg:4;                /* flags, see below */
153 f0cbd3ec bellard
#else
154 f0cbd3ec bellard
        u_int        ipt_flg:4,                /* flags, see below */
155 f0cbd3ec bellard
                ipt_oflw:4;                /* overflow counter */
156 f0cbd3ec bellard
#endif
157 f0cbd3ec bellard
        union ipt_timestamp {
158 f0cbd3ec bellard
                n_long        ipt_time[1];
159 f0cbd3ec bellard
                struct        ipt_ta {
160 f0cbd3ec bellard
                        struct in_addr ipt_addr;
161 f0cbd3ec bellard
                        n_long ipt_time;
162 f0cbd3ec bellard
                } ipt_ta[1];
163 f0cbd3ec bellard
        } ipt_timestamp;
164 f0cbd3ec bellard
};
165 f0cbd3ec bellard
166 f0cbd3ec bellard
/* flag bits for ipt_flg */
167 f0cbd3ec bellard
#define        IPOPT_TS_TSONLY                0                /* timestamps only */
168 f0cbd3ec bellard
#define        IPOPT_TS_TSANDADDR        1                /* timestamps and addresses */
169 f0cbd3ec bellard
#define        IPOPT_TS_PRESPEC        3                /* specified modules only */
170 f0cbd3ec bellard
171 f0cbd3ec bellard
/* bits for security (not byte swapped) */
172 f0cbd3ec bellard
#define        IPOPT_SECUR_UNCLASS        0x0000
173 f0cbd3ec bellard
#define        IPOPT_SECUR_CONFID        0xf135
174 f0cbd3ec bellard
#define        IPOPT_SECUR_EFTO        0x789a
175 f0cbd3ec bellard
#define        IPOPT_SECUR_MMMM        0xbc4d
176 f0cbd3ec bellard
#define        IPOPT_SECUR_RESTR        0xaf13
177 f0cbd3ec bellard
#define        IPOPT_SECUR_SECRET        0xd788
178 f0cbd3ec bellard
#define        IPOPT_SECUR_TOPSECRET        0x6bc5
179 f0cbd3ec bellard
180 f0cbd3ec bellard
/*
181 f0cbd3ec bellard
 * Internet implementation parameters.
182 f0cbd3ec bellard
 */
183 f0cbd3ec bellard
#define        MAXTTL                255                /* maximum time to live (seconds) */
184 f0cbd3ec bellard
#define        IPDEFTTL        64                /* default ttl, from RFC 1340 */
185 f0cbd3ec bellard
#define        IPFRAGTTL        60                /* time to live for frags, slowhz */
186 f0cbd3ec bellard
#define        IPTTLDEC        1                /* subtracted when forwarding */
187 f0cbd3ec bellard
188 f0cbd3ec bellard
#define        IP_MSS                576                /* default maximum segment size */
189 f0cbd3ec bellard
190 f0cbd3ec bellard
#ifdef HAVE_SYS_TYPES32_H  /* Overcome some Solaris 2.x junk */
191 f0cbd3ec bellard
#include <sys/types32.h>
192 f0cbd3ec bellard
#else
193 f0cbd3ec bellard
#if SIZEOF_CHAR_P == 4
194 f0cbd3ec bellard
typedef caddr_t caddr32_t;
195 f0cbd3ec bellard
#else
196 f0cbd3ec bellard
typedef u_int32_t caddr32_t;
197 f0cbd3ec bellard
#endif
198 f0cbd3ec bellard
#endif
199 f0cbd3ec bellard
200 f0cbd3ec bellard
#if SIZEOF_CHAR_P == 4
201 f0cbd3ec bellard
typedef struct ipq *ipqp_32;
202 f0cbd3ec bellard
typedef struct ipasfrag *ipasfragp_32;
203 f0cbd3ec bellard
#else
204 f0cbd3ec bellard
typedef caddr32_t ipqp_32;
205 f0cbd3ec bellard
typedef caddr32_t ipasfragp_32;
206 f0cbd3ec bellard
#endif
207 f0cbd3ec bellard
208 f0cbd3ec bellard
/*
209 f0cbd3ec bellard
 * Overlay for ip header used by other protocols (tcp, udp).
210 f0cbd3ec bellard
 */
211 f0cbd3ec bellard
struct ipovly {
212 f0cbd3ec bellard
        caddr32_t        ih_next, ih_prev;        /* for protocol sequence q's */
213 f0cbd3ec bellard
        u_int8_t        ih_x1;                        /* (unused) */
214 f0cbd3ec bellard
        u_int8_t        ih_pr;                        /* protocol */
215 f0cbd3ec bellard
        int16_t        ih_len;                        /* protocol length */
216 f0cbd3ec bellard
        struct        in_addr ih_src;                /* source internet address */
217 f0cbd3ec bellard
        struct        in_addr ih_dst;                /* destination internet address */
218 f0cbd3ec bellard
};
219 f0cbd3ec bellard
220 f0cbd3ec bellard
/*
221 f0cbd3ec bellard
 * Ip reassembly queue structure.  Each fragment
222 f0cbd3ec bellard
 * being reassembled is attached to one of these structures.
223 f0cbd3ec bellard
 * They are timed out after ipq_ttl drops to 0, and may also
224 f0cbd3ec bellard
 * be reclaimed if memory becomes tight.
225 f0cbd3ec bellard
 * size 28 bytes
226 f0cbd3ec bellard
 */
227 f0cbd3ec bellard
struct ipq {
228 f0cbd3ec bellard
        ipqp_32 next,prev;        /* to other reass headers */
229 f0cbd3ec bellard
        u_int8_t        ipq_ttl;                /* time for reass q to live */
230 f0cbd3ec bellard
        u_int8_t        ipq_p;                        /* protocol of this fragment */
231 f0cbd3ec bellard
        u_int16_t        ipq_id;                        /* sequence id for reassembly */
232 f0cbd3ec bellard
        ipasfragp_32 ipq_next,ipq_prev;
233 f0cbd3ec bellard
                                        /* to ip headers of fragments */
234 f0cbd3ec bellard
        struct        in_addr ipq_src,ipq_dst;
235 f0cbd3ec bellard
};
236 f0cbd3ec bellard
237 f0cbd3ec bellard
/*
238 f0cbd3ec bellard
 * Ip header, when holding a fragment.
239 f0cbd3ec bellard
 *
240 f0cbd3ec bellard
 * Note: ipf_next must be at same offset as ipq_next above
241 f0cbd3ec bellard
 */
242 f0cbd3ec bellard
struct        ipasfrag {
243 f0cbd3ec bellard
#ifdef WORDS_BIGENDIAN
244 f0cbd3ec bellard
        u_int        ip_v:4,
245 f0cbd3ec bellard
                 ip_hl:4;
246 f0cbd3ec bellard
#else
247 f0cbd3ec bellard
        u_int        ip_hl:4,
248 f0cbd3ec bellard
                ip_v:4;
249 f0cbd3ec bellard
#endif
250 f0cbd3ec bellard
                                        /* BUG : u_int changed to u_int8_t.
251 f0cbd3ec bellard
                                         * sizeof(u_int)==4 on linux 2.0
252 f0cbd3ec bellard
                                         */
253 f0cbd3ec bellard
        u_int8_t ipf_mff;                /* XXX overlays ip_tos: use low bit
254 f0cbd3ec bellard
                                         * to avoid destroying tos (PPPDTRuu);
255 f0cbd3ec bellard
                                         * copied from (ip_off&IP_MF) */
256 f0cbd3ec bellard
        int16_t        ip_len;
257 f0cbd3ec bellard
        u_int16_t        ip_id;
258 f0cbd3ec bellard
        int16_t        ip_off;
259 f0cbd3ec bellard
        u_int8_t        ip_ttl;
260 f0cbd3ec bellard
        u_int8_t        ip_p;
261 f0cbd3ec bellard
        u_int16_t        ip_sum;
262 f0cbd3ec bellard
        ipasfragp_32 ipf_next;                /* next fragment */
263 f0cbd3ec bellard
        ipasfragp_32 ipf_prev;                /* previous fragment */
264 f0cbd3ec bellard
};
265 f0cbd3ec bellard
266 f0cbd3ec bellard
/*
267 f0cbd3ec bellard
 * Structure stored in mbuf in inpcb.ip_options
268 f0cbd3ec bellard
 * and passed to ip_output when ip options are in use.
269 f0cbd3ec bellard
 * The actual length of the options (including ipopt_dst)
270 f0cbd3ec bellard
 * is in m_len.
271 f0cbd3ec bellard
 */
272 f0cbd3ec bellard
#define MAX_IPOPTLEN        40
273 f0cbd3ec bellard
274 f0cbd3ec bellard
struct ipoption {
275 f0cbd3ec bellard
        struct        in_addr ipopt_dst;        /* first-hop dst if source routed */
276 f0cbd3ec bellard
        int8_t        ipopt_list[MAX_IPOPTLEN];        /* options proper */
277 f0cbd3ec bellard
};
278 f0cbd3ec bellard
279 f0cbd3ec bellard
/*
280 f0cbd3ec bellard
 * Structure attached to inpcb.ip_moptions and
281 f0cbd3ec bellard
 * passed to ip_output when IP multicast options are in use.
282 f0cbd3ec bellard
 */
283 f0cbd3ec bellard
284 f0cbd3ec bellard
struct        ipstat {
285 f0cbd3ec bellard
        u_long        ips_total;                /* total packets received */
286 f0cbd3ec bellard
        u_long        ips_badsum;                /* checksum bad */
287 f0cbd3ec bellard
        u_long        ips_tooshort;                /* packet too short */
288 f0cbd3ec bellard
        u_long        ips_toosmall;                /* not enough data */
289 f0cbd3ec bellard
        u_long        ips_badhlen;                /* ip header length < data size */
290 f0cbd3ec bellard
        u_long        ips_badlen;                /* ip length < ip header length */
291 f0cbd3ec bellard
        u_long        ips_fragments;                /* fragments received */
292 f0cbd3ec bellard
        u_long        ips_fragdropped;        /* frags dropped (dups, out of space) */
293 f0cbd3ec bellard
        u_long        ips_fragtimeout;        /* fragments timed out */
294 f0cbd3ec bellard
        u_long        ips_forward;                /* packets forwarded */
295 f0cbd3ec bellard
        u_long        ips_cantforward;        /* packets rcvd for unreachable dest */
296 f0cbd3ec bellard
        u_long        ips_redirectsent;        /* packets forwarded on same net */
297 f0cbd3ec bellard
        u_long        ips_noproto;                /* unknown or unsupported protocol */
298 f0cbd3ec bellard
        u_long        ips_delivered;                /* datagrams delivered to upper level*/
299 f0cbd3ec bellard
        u_long        ips_localout;                /* total ip packets generated here */
300 f0cbd3ec bellard
        u_long        ips_odropped;                /* lost packets due to nobufs, etc. */
301 f0cbd3ec bellard
        u_long        ips_reassembled;        /* total packets reassembled ok */
302 f0cbd3ec bellard
        u_long        ips_fragmented;                /* datagrams successfully fragmented */
303 f0cbd3ec bellard
        u_long        ips_ofragments;                /* output fragments created */
304 f0cbd3ec bellard
        u_long        ips_cantfrag;                /* don't fragment flag was set, etc. */
305 f0cbd3ec bellard
        u_long        ips_badoptions;                /* error in option processing */
306 f0cbd3ec bellard
        u_long        ips_noroute;                /* packets discarded due to no route */
307 f0cbd3ec bellard
        u_long        ips_badvers;                /* ip version != 4 */
308 f0cbd3ec bellard
        u_long        ips_rawout;                /* total raw ip packets generated */
309 f0cbd3ec bellard
        u_long        ips_unaligned;                /* times the ip packet was not aligned */
310 f0cbd3ec bellard
};
311 f0cbd3ec bellard
312 f0cbd3ec bellard
extern struct        ipstat        ipstat;
313 f0cbd3ec bellard
extern struct        ipq        ipq;                        /* ip reass. queue */
314 f0cbd3ec bellard
extern u_int16_t        ip_id;                                /* ip packet ctr, for ids */
315 f0cbd3ec bellard
extern int        ip_defttl;                        /* default IP ttl */
316 f0cbd3ec bellard
317 f0cbd3ec bellard
#endif