Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / netinet / ip.h @ 13

History | View | Annotate | Download (8.05 KB)

1
/*        $NetBSD: ip.h,v 1.34 2012/11/02 21:07:07 christos Exp $        */
2

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

    
34
#ifndef _NETINET_IP_H_
35
#define _NETINET_IP_H_
36

    
37
#include <netinet/in_systm.h>        /* for n_time */
38
/*
39
 * Definitions for internet protocol version 4.
40
 * Per RFC 791, September 1981.
41
 */
42
#define        IPVERSION        4
43

    
44
/*
45
 * Structure of an internet header, naked of options.
46
 */
47
struct ip {
48
#if BYTE_ORDER == LITTLE_ENDIAN
49
        unsigned int ip_hl:4,                /* header length */
50
                     ip_v:4;                /* version */
51
#endif
52
#if BYTE_ORDER == BIG_ENDIAN
53
        unsigned int ip_v:4,                /* version */
54
                     ip_hl:4;                /* header length */
55
#endif
56
        u_int8_t  ip_tos;                /* type of service */
57
        u_int16_t ip_len;                /* total length */
58
        u_int16_t ip_id;                /* identification */
59
        u_int16_t ip_off;                /* fragment offset field */
60
#define        IP_RF 0x8000                        /* reserved fragment flag */
61
#define        IP_EF 0x8000                        /* evil flag, per RFC 3514 */
62
#define        IP_DF 0x4000                        /* dont fragment flag */
63
#define        IP_MF 0x2000                        /* more fragments flag */
64
#define        IP_OFFMASK 0x1fff                /* mask for fragmenting bits */
65
        u_int8_t  ip_ttl;                /* time to live */
66
        u_int8_t  ip_p;                        /* protocol */
67
        u_int16_t ip_sum;                /* checksum */
68
        struct          in_addr ip_src, ip_dst; /* source and dest address */
69
} __packed;
70

    
71
#define        IP_MAXPACKET        65535                /* maximum packet size */
72
#define        IP_MINFRAGSIZE        69                /* minumum size that can be fraged */
73

    
74
/*
75
 * Definitions for IP type of service (ip_tos)
76
 */
77

    
78
/*
79
 * Definitions for DiffServ Codepoints as per RFC2474
80
 */
81
#define        IPTOS_DSCP_CS0                0x00
82
#define        IPTOS_DSCP_CS1                0x20
83
#define        IPTOS_DSCP_AF11                0x28
84
#define        IPTOS_DSCP_AF12                0x30
85
#define        IPTOS_DSCP_AF13                0x38
86
#define        IPTOS_DSCP_CS2                0x40
87
#define        IPTOS_DSCP_AF21                0x48
88
#define        IPTOS_DSCP_AF22                0x50
89
#define        IPTOS_DSCP_AF23                0x58
90
#define        IPTOS_DSCP_CS3                0x60
91
#define        IPTOS_DSCP_AF31                0x68
92
#define        IPTOS_DSCP_AF32                0x70
93
#define        IPTOS_DSCP_AF33                0x78
94
#define        IPTOS_DSCP_CS4                0x80
95
#define        IPTOS_DSCP_AF41                0x88
96
#define        IPTOS_DSCP_AF42                0x90
97
#define        IPTOS_DSCP_AF43                0x98
98
#define        IPTOS_DSCP_CS5                0xa0
99
#define        IPTOS_DSCP_EF                0xb8
100
#define        IPTOS_DSCP_CS6                0xc0
101
#define        IPTOS_DSCP_CS7                0xe0
102

    
103
/*
104
 * Definitions for DiffServ Class Selector Codepoints
105
 */
106
#define        IPTOS_CLASS_CS0                0x00
107
#define        IPTOS_CLASS_CS1                0x20
108
#define        IPTOS_CLASS_CS2                0x40
109
#define        IPTOS_CLASS_CS3                0x60
110
#define        IPTOS_CLASS_CS4                0x80
111
#define        IPTOS_CLASS_CS5                0xa0
112
#define        IPTOS_CLASS_CS6                0xc0
113
#define        IPTOS_CLASS_CS7                0xe0
114
#define        IPTOS_CLASS_DEFAULT        IPTOS_CLASS_CS0
115
#define        IPTOS_CLASS_MASK        0xe0
116
#define        IPTOS_CLASS(cs)                ((cs) & IPTOS_CLASS_MASK)
117
#define        IPTOS_DSCP_MASK                0xfc
118
#define        IPTOS_DSCP(cp)                ((cp) & IPTOS_DSCP_MASK)
119

    
120
/*
121
 * ECN (Explicit Congestion Notification) codepoints in RFC3168
122
 * mapped to the lower 2 bits of the TOS field.
123
 */
124
#define        IPTOS_ECN_NOTECT        0x00        /* not-ECT */
125
#define        IPTOS_ECN_ECT1                0x01        /* ECN-capable transport (1) */
126
#define        IPTOS_ECN_ECT0                0x02        /* ECN-capable transport (0) */
127
#define        IPTOS_ECN_CE                0x03        /* congestion experienced */
128
#define        IPTOS_ECN_MASK                0x03        /* ECN field mask */
129
#define        IPTOS_ECN(cn)                ((cn) & IPTOS_ECN_MASK)
130
#define        IPTOS_ECN_NOT_ECT        0x00
131

    
132
/*
133
 * Definitions for IP type of service per RFC1349 (ip_tos)
134
 * DEPRECATED
135
 */
136
#define        IPTOS_LOWDELAY                0x10
137
#define        IPTOS_THROUGHPUT        0x08
138
#define        IPTOS_RELIABILITY        0x04
139
#define        IPTOS_MINCOST                0x02
140
/* ECN RFC3168 obsoletes RFC2481, and these will be deprecated soon. */
141
#define        IPTOS_CE                0x01        /* congestion experienced */
142
#define        IPTOS_ECT                0x02        /* ECN-capable transport */
143

    
144
/*
145
 * Definitions for IP precedence per RFC1195 (also in ip_tos) (hopefully unused)
146
 */
147
#define        IPTOS_PREC_NETCONTROL                0xe0
148
#define        IPTOS_PREC_INTERNETCONTROL        0xc0
149
#define        IPTOS_PREC_CRITIC_ECP                0xa0
150
#define        IPTOS_PREC_FLASHOVERRIDE        0x80
151
#define        IPTOS_PREC_FLASH                0x60
152
#define        IPTOS_PREC_IMMEDIATE                0x40
153
#define        IPTOS_PREC_PRIORITY                0x20
154
#define        IPTOS_PREC_ROUTINE                0x00
155

    
156
/*
157
 * Definitions for options.
158
 */
159
#define        IPOPT_COPIED(o)                ((o)&0x80)
160
#define        IPOPT_CLASS(o)                ((o)&0x60)
161
#define        IPOPT_NUMBER(o)                ((o)&0x1f)
162

    
163
#define        IPOPT_CONTROL                0x00
164
#define        IPOPT_RESERVED1                0x20
165
#define        IPOPT_DEBMEAS                0x40
166
#define        IPOPT_RESERVED2                0x60
167

    
168
#define        IPOPT_EOL                0                /* end of option list */
169
#define        IPOPT_NOP                1                /* no operation */
170

    
171
#define        IPOPT_RR                7                /* record packet route */
172
#define        IPOPT_TS                68                /* timestamp */
173
#define        IPOPT_SECURITY                130                /* provide s,c,h,tcc */
174
#define        IPOPT_LSRR                131                /* loose source route */
175
#define        IPOPT_SATID                136                /* satnet id */
176
#define        IPOPT_SSRR                137                /* strict source route */
177

    
178
/*
179
 * Offsets to fields in options other than EOL and NOP.
180
 */
181
#define        IPOPT_OPTVAL                0                /* option ID */
182
#define        IPOPT_OLEN                1                /* option length */
183
#define        IPOPT_OFFSET                2                /* offset within option */
184
#define        IPOPT_MINOFF                4                /* min value of above */
185

    
186
/*
187
 * Time stamp option structure.
188
 */
189
struct        ip_timestamp {
190
        u_int8_t ipt_code;                /* IPOPT_TS */
191
        u_int8_t ipt_len;                /* size of structure (variable) */
192
        u_int8_t ipt_ptr;                /* index of current entry */
193
#if BYTE_ORDER == LITTLE_ENDIAN
194
        unsigned int ipt_flg:4,                /* flags, see below */
195
                     ipt_oflw:4;        /* overflow counter */
196
#endif
197
#if BYTE_ORDER == BIG_ENDIAN
198
        unsigned int ipt_oflw:4,        /* overflow counter */
199
                     ipt_flg:4;                /* flags, see below */
200
#endif
201
        union ipt_timestamp {
202
                 n_time        ipt_time[1];
203
                 struct        ipt_ta {
204
                        struct in_addr ipt_addr;
205
                        n_time ipt_time;
206
                 } ipt_ta[1] __packed;
207
        } ipt_timestamp __packed;
208
} __packed;
209

    
210
/* flag bits for ipt_flg */
211
#define        IPOPT_TS_TSONLY                0                /* timestamps only */
212
#define        IPOPT_TS_TSANDADDR        1                /* timestamps and addresses */
213
#define        IPOPT_TS_PRESPEC        3                /* specified modules only */
214

    
215
/* bits for security (not byte swapped) */
216
#define        IPOPT_SECUR_UNCLASS        0x0000
217
#define        IPOPT_SECUR_CONFID        0xf135
218
#define        IPOPT_SECUR_EFTO        0x789a
219
#define        IPOPT_SECUR_MMMM        0xbc4d
220
#define        IPOPT_SECUR_RESTR        0xaf13
221
#define        IPOPT_SECUR_SECRET        0xd788
222
#define        IPOPT_SECUR_TOPSECRET        0x6bc5
223

    
224
/*
225
 * Internet implementation parameters.
226
 */
227
#define        MAXTTL                255                /* maximum time to live (seconds) */
228
#define        IPDEFTTL        64                /* default ttl, from RFC 1340 */
229
#define        IPFRAGTTL        60                /* time to live for frags, slowhz */
230
#define        IPTTLDEC        1                /* subtracted when forwarding */
231

    
232
#define        IP_MSS                576                /* default maximum segment size */
233

    
234
/*
235
 * This is the real IPv4 pseudo header, used for computing the TCP and UDP
236
 * checksums. For the Internet checksum, struct ipovly can be used instead.
237
 * For stronger checksums, the real thing must be used.
238
 */
239
struct ippseudo {
240
        struct        in_addr        ippseudo_src;        /* source internet address */
241
        struct        in_addr        ippseudo_dst;        /* destination internet address */
242
        u_int8_t        ippseudo_pad;        /* pad, must be zero */
243
        u_int8_t        ippseudo_p;        /* protocol */
244
        u_int16_t        ippseudo_len;        /* protocol length */
245
} __packed;
246
#endif /* !_NETINET_IP_H_ */