Statistics
| Branch: | Revision:

root / slirp / ip.h @ 31a60e22

History | View | Annotate | Download (9.7 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
struct ip {
80
#ifdef WORDS_BIGENDIAN
81
        u_int ip_v:4,                        /* version */
82
                ip_hl:4;                /* header length */
83
#else
84
        u_int ip_hl:4,                /* header length */
85
                ip_v:4;                        /* version */
86
#endif
87
        u_int8_t ip_tos;                        /* type of service */
88
        u_int16_t        ip_len;                        /* total length */
89
        u_int16_t        ip_id;                        /* identification */
90
        u_int16_t        ip_off;                        /* fragment offset field */
91
#define        IP_DF 0x4000                        /* don't fragment flag */
92
#define        IP_MF 0x2000                        /* more fragments flag */
93
#define        IP_OFFMASK 0x1fff                /* mask for fragmenting bits */
94
        u_int8_t ip_ttl;                        /* time to live */
95
        u_int8_t ip_p;                        /* protocol */
96
        u_int16_t        ip_sum;                        /* checksum */
97
        struct        in_addr ip_src,ip_dst;        /* source and dest address */
98
};
99

    
100
#define        IP_MAXPACKET        65535                /* maximum packet size */
101

    
102
/*
103
 * Definitions for IP type of service (ip_tos)
104
 */
105
#define        IPTOS_LOWDELAY                0x10
106
#define        IPTOS_THROUGHPUT        0x08
107
#define        IPTOS_RELIABILITY        0x04
108

    
109
/*
110
 * Definitions for options.
111
 */
112
#define        IPOPT_COPIED(o)                ((o)&0x80)
113
#define        IPOPT_CLASS(o)                ((o)&0x60)
114
#define        IPOPT_NUMBER(o)                ((o)&0x1f)
115

    
116
#define        IPOPT_CONTROL                0x00
117
#define        IPOPT_RESERVED1                0x20
118
#define        IPOPT_DEBMEAS                0x40
119
#define        IPOPT_RESERVED2                0x60
120

    
121
#define        IPOPT_EOL                0                /* end of option list */
122
#define        IPOPT_NOP                1                /* no operation */
123

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

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

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

    
162
/* flag bits for ipt_flg */
163
#define        IPOPT_TS_TSONLY                0                /* timestamps only */
164
#define        IPOPT_TS_TSANDADDR        1                /* timestamps and addresses */
165
#define        IPOPT_TS_PRESPEC        3                /* specified modules only */
166

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

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

    
184
#define        IP_MSS                576                /* default maximum segment size */
185

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

    
196
#if SIZEOF_CHAR_P == 4
197
typedef struct ipq *ipqp_32;
198
typedef struct ipasfrag *ipasfragp_32;
199
#else
200
typedef caddr32_t ipqp_32;
201
typedef caddr32_t ipasfragp_32;
202
#endif
203

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

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

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

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

    
270
struct ipoption {
271
        struct        in_addr ipopt_dst;        /* first-hop dst if source routed */
272
        int8_t        ipopt_list[MAX_IPOPTLEN];        /* options proper */
273
};
274

    
275
#ifdef LOG_ENABLED
276
/*
277
 * Structure attached to inpcb.ip_moptions and
278
 * passed to ip_output when IP multicast options are in use.
279
 */
280

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

    
309
extern struct        ipstat        ipstat;
310
#endif
311

    
312
extern struct        ipq        ipq;                        /* ip reass. queue */
313
extern u_int16_t        ip_id;                                /* ip packet ctr, for ids */
314

    
315
extern int        ip_defttl;                        /* default IP ttl */
316

    
317
#endif