Statistics
| Branch: | Revision:

root / slirp / ip.h @ f0cbd3ec

History | View | Annotate | Download (9.8 kB)

1
/*
2
 * Copyright (c) 1982, 1986, 1993
3
 *        The Regents of the University of California.  All rights reserved.
4
 *
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions
7
 * are met:
8
 * 1. Redistributions of source code must retain the above copyright
9
 *    notice, this list of conditions and the following disclaimer.
10
 * 2. Redistributions in binary form must reproduce the above copyright
11
 *    notice, this list of conditions and the following disclaimer in the
12
 *    documentation and/or other materials provided with the distribution.
13
 * 3. All advertising materials mentioning features or use of this software
14
 *    must display the following acknowledgement:
15
 *        This product includes software developed by the University of
16
 *        California, Berkeley and its contributors.
17
 * 4. Neither the name of the University nor the names of its contributors
18
 *    may be used to endorse or promote products derived from this software
19
 *    without specific prior written permission.
20
 *
21
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31
 * SUCH DAMAGE.
32
 *
33
 *        @(#)ip.h        8.1 (Berkeley) 6/10/93
34
 * ip.h,v 1.3 1994/08/21 05:27:30 paul Exp
35
 */
36

    
37
#ifndef _IP_H_
38
#define _IP_H_
39

    
40
#ifdef WORDS_BIGENDIAN
41
# ifndef NTOHL
42
#  define NTOHL(d)
43
# endif
44
# ifndef NTOHS
45
#  define NTOHS(d)
46
# endif
47
# ifndef HTONL
48
#  define HTONL(d)
49
# endif
50
# ifndef HTONS
51
#  define HTONS(d)
52
# endif
53
#else
54
# ifndef NTOHL
55
#  define NTOHL(d) ((d) = ntohl((d)))
56
# endif
57
# ifndef NTOHS
58
#  define NTOHS(d) ((d) = ntohs((u_int16_t)(d)))
59
# endif
60
# ifndef HTONL
61
#  define HTONL(d) ((d) = htonl((d)))
62
# endif
63
# ifndef HTONS
64
#  define HTONS(d) ((d) = htons((u_int16_t)(d)))
65
# endif
66
#endif
67

    
68
typedef u_int32_t n_long;                 /* long as received from the net */
69

    
70
/*
71
 * Definitions for internet protocol version 4.
72
 * Per RFC 791, September 1981.
73
 */
74
#define        IPVERSION        4
75

    
76
/*
77
 * Structure of an internet header, naked of options.
78
 *
79
 * We declare ip_len and ip_off to be short, rather than u_short
80
 * pragmatically since otherwise unsigned comparisons can result
81
 * against negative integers quite easily, and fail in subtle ways.
82
 */
83
struct ip {
84
#ifdef WORDS_BIGENDIAN
85
        u_int ip_v:4,                        /* version */
86
                ip_hl:4;                /* header length */
87
#else
88
        u_int ip_hl:4,                /* header length */
89
                ip_v:4;                        /* version */
90
#endif
91
        u_int8_t ip_tos;                        /* type of service */
92
        int16_t        ip_len;                        /* total length */
93
        u_int16_t        ip_id;                        /* identification */
94
        int16_t        ip_off;                        /* fragment offset field */
95
#define        IP_DF 0x4000                        /* don't fragment flag */
96
#define        IP_MF 0x2000                        /* more fragments flag */
97
#define        IP_OFFMASK 0x1fff                /* mask for fragmenting bits */
98
        u_int8_t ip_ttl;                        /* time to live */
99
        u_int8_t ip_p;                        /* protocol */
100
        u_int16_t        ip_sum;                        /* checksum */
101
        struct        in_addr ip_src,ip_dst;        /* source and dest address */
102
};
103

    
104
#define        IP_MAXPACKET        65535                /* maximum packet size */
105

    
106
/*
107
 * Definitions for IP type of service (ip_tos)
108
 */
109
#define        IPTOS_LOWDELAY                0x10
110
#define        IPTOS_THROUGHPUT        0x08
111
#define        IPTOS_RELIABILITY        0x04
112

    
113
/*
114
 * Definitions for options.
115
 */
116
#define        IPOPT_COPIED(o)                ((o)&0x80)
117
#define        IPOPT_CLASS(o)                ((o)&0x60)
118
#define        IPOPT_NUMBER(o)                ((o)&0x1f)
119

    
120
#define        IPOPT_CONTROL                0x00
121
#define        IPOPT_RESERVED1                0x20
122
#define        IPOPT_DEBMEAS                0x40
123
#define        IPOPT_RESERVED2                0x60
124

    
125
#define        IPOPT_EOL                0                /* end of option list */
126
#define        IPOPT_NOP                1                /* no operation */
127

    
128
#define        IPOPT_RR                7                /* record packet route */
129
#define        IPOPT_TS                68                /* timestamp */
130
#define        IPOPT_SECURITY                130                /* provide s,c,h,tcc */
131
#define        IPOPT_LSRR                131                /* loose source route */
132
#define        IPOPT_SATID                136                /* satnet id */
133
#define        IPOPT_SSRR                137                /* strict source route */
134

    
135
/*
136
 * Offsets to fields in options other than EOL and NOP.
137
 */
138
#define        IPOPT_OPTVAL                0                /* option ID */
139
#define        IPOPT_OLEN                1                /* option length */
140
#define IPOPT_OFFSET                2                /* offset within option */
141
#define        IPOPT_MINOFF                4                /* min value of above */
142

    
143
/*
144
 * Time stamp option structure.
145
 */
146
struct        ip_timestamp {
147
        u_int8_t        ipt_code;                /* IPOPT_TS */
148
        u_int8_t        ipt_len;                /* size of structure (variable) */
149
        u_int8_t        ipt_ptr;                /* index of current entry */
150
#ifdef WORDS_BIGENDIAN
151
        u_int        ipt_oflw:4,                /* overflow counter */
152
                ipt_flg:4;                /* flags, see below */
153
#else
154
        u_int        ipt_flg:4,                /* flags, see below */
155
                ipt_oflw:4;                /* overflow counter */
156
#endif
157
        union ipt_timestamp {
158
                n_long        ipt_time[1];
159
                struct        ipt_ta {
160
                        struct in_addr ipt_addr;
161
                        n_long ipt_time;
162
                } ipt_ta[1];
163
        } ipt_timestamp;
164
};
165

    
166
/* flag bits for ipt_flg */
167
#define        IPOPT_TS_TSONLY                0                /* timestamps only */
168
#define        IPOPT_TS_TSANDADDR        1                /* timestamps and addresses */
169
#define        IPOPT_TS_PRESPEC        3                /* specified modules only */
170

    
171
/* bits for security (not byte swapped) */
172
#define        IPOPT_SECUR_UNCLASS        0x0000
173
#define        IPOPT_SECUR_CONFID        0xf135
174
#define        IPOPT_SECUR_EFTO        0x789a
175
#define        IPOPT_SECUR_MMMM        0xbc4d
176
#define        IPOPT_SECUR_RESTR        0xaf13
177
#define        IPOPT_SECUR_SECRET        0xd788
178
#define        IPOPT_SECUR_TOPSECRET        0x6bc5
179

    
180
/*
181
 * Internet implementation parameters.
182
 */
183
#define        MAXTTL                255                /* maximum time to live (seconds) */
184
#define        IPDEFTTL        64                /* default ttl, from RFC 1340 */
185
#define        IPFRAGTTL        60                /* time to live for frags, slowhz */
186
#define        IPTTLDEC        1                /* subtracted when forwarding */
187

    
188
#define        IP_MSS                576                /* default maximum segment size */
189

    
190
#ifdef HAVE_SYS_TYPES32_H  /* Overcome some Solaris 2.x junk */
191
#include <sys/types32.h>
192
#else
193
#if SIZEOF_CHAR_P == 4
194
typedef caddr_t caddr32_t;
195
#else
196
typedef u_int32_t caddr32_t;
197
#endif
198
#endif
199

    
200
#if SIZEOF_CHAR_P == 4
201
typedef struct ipq *ipqp_32;
202
typedef struct ipasfrag *ipasfragp_32;
203
#else
204
typedef caddr32_t ipqp_32;
205
typedef caddr32_t ipasfragp_32;
206
#endif
207

    
208
/*
209
 * Overlay for ip header used by other protocols (tcp, udp).
210
 */
211
struct ipovly {
212
        caddr32_t        ih_next, ih_prev;        /* for protocol sequence q's */
213
        u_int8_t        ih_x1;                        /* (unused) */
214
        u_int8_t        ih_pr;                        /* protocol */
215
        int16_t        ih_len;                        /* protocol length */
216
        struct        in_addr ih_src;                /* source internet address */
217
        struct        in_addr ih_dst;                /* destination internet address */
218
};
219

    
220
/*
221
 * Ip reassembly queue structure.  Each fragment
222
 * being reassembled is attached to one of these structures.
223
 * They are timed out after ipq_ttl drops to 0, and may also
224
 * be reclaimed if memory becomes tight.
225
 * size 28 bytes
226
 */
227
struct ipq {
228
        ipqp_32 next,prev;        /* to other reass headers */
229
        u_int8_t        ipq_ttl;                /* time for reass q to live */
230
        u_int8_t        ipq_p;                        /* protocol of this fragment */
231
        u_int16_t        ipq_id;                        /* sequence id for reassembly */
232
        ipasfragp_32 ipq_next,ipq_prev;
233
                                        /* to ip headers of fragments */
234
        struct        in_addr ipq_src,ipq_dst;
235
};
236

    
237
/*
238
 * Ip header, when holding a fragment.
239
 *
240
 * Note: ipf_next must be at same offset as ipq_next above
241
 */
242
struct        ipasfrag {
243
#ifdef WORDS_BIGENDIAN
244
        u_int        ip_v:4,
245
                 ip_hl:4;
246
#else
247
        u_int        ip_hl:4,
248
                ip_v:4;
249
#endif
250
                                        /* BUG : u_int changed to u_int8_t.
251
                                         * sizeof(u_int)==4 on linux 2.0
252
                                         */
253
        u_int8_t ipf_mff;                /* XXX overlays ip_tos: use low bit
254
                                         * to avoid destroying tos (PPPDTRuu);
255
                                         * copied from (ip_off&IP_MF) */
256
        int16_t        ip_len;
257
        u_int16_t        ip_id;
258
        int16_t        ip_off;
259
        u_int8_t        ip_ttl;
260
        u_int8_t        ip_p;
261
        u_int16_t        ip_sum;
262
        ipasfragp_32 ipf_next;                /* next fragment */
263
        ipasfragp_32 ipf_prev;                /* previous fragment */
264
};
265

    
266
/*
267
 * Structure stored in mbuf in inpcb.ip_options
268
 * and passed to ip_output when ip options are in use.
269
 * The actual length of the options (including ipopt_dst)
270
 * is in m_len.
271
 */
272
#define MAX_IPOPTLEN        40
273

    
274
struct ipoption {
275
        struct        in_addr ipopt_dst;        /* first-hop dst if source routed */
276
        int8_t        ipopt_list[MAX_IPOPTLEN];        /* options proper */
277
};
278

    
279
/*
280
 * Structure attached to inpcb.ip_moptions and
281
 * passed to ip_output when IP multicast options are in use.
282
 */
283

    
284
struct        ipstat {
285
        u_long        ips_total;                /* total packets received */
286
        u_long        ips_badsum;                /* checksum bad */
287
        u_long        ips_tooshort;                /* packet too short */
288
        u_long        ips_toosmall;                /* not enough data */
289
        u_long        ips_badhlen;                /* ip header length < data size */
290
        u_long        ips_badlen;                /* ip length < ip header length */
291
        u_long        ips_fragments;                /* fragments received */
292
        u_long        ips_fragdropped;        /* frags dropped (dups, out of space) */
293
        u_long        ips_fragtimeout;        /* fragments timed out */
294
        u_long        ips_forward;                /* packets forwarded */
295
        u_long        ips_cantforward;        /* packets rcvd for unreachable dest */
296
        u_long        ips_redirectsent;        /* packets forwarded on same net */
297
        u_long        ips_noproto;                /* unknown or unsupported protocol */
298
        u_long        ips_delivered;                /* datagrams delivered to upper level*/
299
        u_long        ips_localout;                /* total ip packets generated here */
300
        u_long        ips_odropped;                /* lost packets due to nobufs, etc. */
301
        u_long        ips_reassembled;        /* total packets reassembled ok */
302
        u_long        ips_fragmented;                /* datagrams successfully fragmented */
303
        u_long        ips_ofragments;                /* output fragments created */
304
        u_long        ips_cantfrag;                /* don't fragment flag was set, etc. */
305
        u_long        ips_badoptions;                /* error in option processing */
306
        u_long        ips_noroute;                /* packets discarded due to no route */
307
        u_long        ips_badvers;                /* ip version != 4 */
308
        u_long        ips_rawout;                /* total raw ip packets generated */
309
        u_long        ips_unaligned;                /* times the ip packet was not aligned */
310
};
311

    
312
extern struct        ipstat        ipstat;
313
extern struct        ipq        ipq;                        /* ip reass. queue */
314
extern u_int16_t        ip_id;                                /* ip packet ctr, for ids */
315
extern int        ip_defttl;                        /* default IP ttl */
316

    
317
#endif