|
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 #endif |