~ubuntu-branches/ubuntu/feisty/basilisk2/feisty

« back to all changes in this revision

Viewing changes to src/slirp/ip.h

  • Committer: Bazaar Package Importer
  • Author(s): Jonas Smedegaard
  • Date: 2005-07-30 20:42:20 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20050730204220-1nl1cg2jkjvy63ry
Tags: 0.9.20050730-1
* New upstream CVS snapshot.
* Build-depend on virtual libsdl-dev (not libsdl1.2-dev).
* Invoke init rules also on clean (to separate better from official
  builds).
* Update URL of upstream source in debian/copyright.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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