1 | /* $NetBSD: ip_compat.h,v 1.11 2016/08/05 09:05:02 christos Exp $ */ |
2 | |
3 | /* |
4 | * Copyright (C) 2012 by Darren Reed. |
5 | * |
6 | * See the IPFILTER.LICENCE file for details on licencing. |
7 | * |
8 | * @(#)ip_compat.h 1.8 1/14/96 |
9 | * Id: ip_compat.h,v 1.1.1.2 2012/07/22 13:45:09 darrenr Exp |
10 | */ |
11 | |
12 | #ifndef _NETINET_IP_COMPAT_H_ |
13 | #define _NETINET_IP_COMPAT_H_ |
14 | |
15 | #ifndef __STDC__ |
16 | # undef const |
17 | # define const |
18 | #endif |
19 | |
20 | #if defined(_KERNEL) || defined(KERNEL) || defined(__KERNEL__) |
21 | # undef KERNEL |
22 | # undef _KERNEL |
23 | # undef __KERNEL__ |
24 | # define KERNEL |
25 | # define _KERNEL |
26 | # define __KERNEL__ |
27 | #endif |
28 | |
29 | # if (defined(sun) && (defined(__svr4__) || defined(__SVR4))) |
30 | # define SOLARIS 1 |
31 | # else |
32 | # define SOLARIS 0 |
33 | # endif |
34 | #if (defined(SOLARIS2) && (SOLARIS2 >= 8)) |
35 | # ifndef USE_INET6 |
36 | # define USE_INET6 |
37 | # endif |
38 | #endif |
39 | #if defined(__FreeBSD_version) && (__FreeBSD_version >= 400000) && \ |
40 | !defined(_KERNEL) && !defined(USE_INET6) && !defined(NOINET6) |
41 | # define USE_INET6 |
42 | #endif |
43 | #if defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 105000000) && \ |
44 | !defined(_KERNEL) && !defined(USE_INET6) && !defined(NOINET6) |
45 | # define USE_INET6 |
46 | #endif |
47 | #if defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 106140000) && \ |
48 | defined(_KERNEL) && \ |
49 | (!defined(IPFILTER_LKM) || (__NetBSD_Version__ >= 399000100)) |
50 | # define IPFILTER_M_IPFILTER |
51 | #endif |
52 | #if !defined(USE_INET6) |
53 | # if defined(OpenBSD) && (OpenBSD >= 200206) && \ |
54 | !defined(_KERNEL) && !defined(USE_INET6) |
55 | # define USE_INET6 |
56 | # endif |
57 | # if defined(__osf__) |
58 | # define USE_INET6 1 |
59 | # endif |
60 | # if defined(linux) && (!defined(_KERNEL) || defined(CONFIG_IPV6)) |
61 | # define USE_INET6 |
62 | # endif |
63 | # if defined(HPUXREV) && (HPUXREV >= 1111) |
64 | # define USE_INET6 |
65 | # endif |
66 | #endif |
67 | |
68 | #if defined(BSD) && (BSD < 199103) && defined(__osf__) |
69 | # undef BSD |
70 | # define BSD 199103 |
71 | #endif |
72 | |
73 | #if defined(__SVR4) || defined(__svr4__) || defined(__sgi) |
74 | # define index strchr |
75 | # if !defined(_KERNEL) |
76 | # define bzero(a,b) memset(a,0,b) |
77 | # define bcmp memcmp |
78 | # define bcopy(a,b,c) memmove(b,a,c) |
79 | # endif |
80 | #endif |
81 | |
82 | #ifndef LIFNAMSIZ |
83 | # ifdef IF_NAMESIZE |
84 | # define LIFNAMSIZ IF_NAMESIZE |
85 | # else |
86 | # ifdef IFNAMSIZ |
87 | # define LIFNAMSIZ IFNAMSIZ |
88 | # else |
89 | # define LIFNAMSIZ 16 |
90 | # endif |
91 | # endif |
92 | #endif |
93 | |
94 | #if defined(__sgi) || defined(bsdi) || defined(__hpux) || defined(hpux) |
95 | struct ether_addr { |
96 | u_char ether_addr_octet[6]; |
97 | }; |
98 | #endif |
99 | |
100 | #if defined(__sgi) && !defined(IPFILTER_LKM) |
101 | # ifdef __STDC__ |
102 | # define IPL_EXTERN(ep) ipfilter##ep |
103 | # else |
104 | # define IPL_EXTERN(ep) ipfilter/**/ep |
105 | # endif |
106 | #else |
107 | # ifdef __STDC__ |
108 | # define IPL_EXTERN(ep) ipl##ep |
109 | # else |
110 | # define IPL_EXTERN(ep) ipl/**/ep |
111 | # endif |
112 | #endif |
113 | |
114 | /* |
115 | * This is a workaround for <sys/uio.h> troubles on FreeBSD and OpenBSD. |
116 | */ |
117 | #ifndef linux |
118 | # ifndef _KERNEL |
119 | # define ADD_KERNEL |
120 | # define _KERNEL |
121 | # define KERNEL |
122 | # endif |
123 | # ifdef __OpenBSD__ |
124 | struct file; |
125 | # endif |
126 | # include <sys/uio.h> |
127 | # ifdef ADD_KERNEL |
128 | # undef _KERNEL |
129 | # undef KERNEL |
130 | # endif |
131 | #endif |
132 | |
133 | # define NETBSD_GE_REV(x) (__NetBSD_Version__ >= (x)) |
134 | # define NETBSD_GT_REV(x) (__NetBSD_Version__ > (x)) |
135 | # define NETBSD_LT_REV(x) (__NetBSD_Version__ < (x)) |
136 | |
137 | # define FREEBSD_GE_REV(x) 0 |
138 | # define FREEBSD_GT_REV(x) 0 |
139 | # define FREEBSD_LT_REV(x) 0 |
140 | |
141 | # define BSDOS_GE_REV(x) 0 |
142 | # define BSDOS_GT_REV(x) 0 |
143 | # define BSDOS_LT_REV(x) 0 |
144 | |
145 | # define OPENBSD_GE_REV(x) 0 |
146 | # define OPENBSD_GT_REV(x) 0 |
147 | # define OPENBSD_LT_REV(x) 0 |
148 | |
149 | # define BSD_GE_YEAR(x) (BSD >= (x)) |
150 | # define BSD_GT_YEAR(x) (BSD > (x)) |
151 | # define BSD_LT_YEAR(x) (BSD < (x)) |
152 | |
153 | |
154 | /* ----------------------------------------------------------------------- */ |
155 | /* N E T B S D */ |
156 | /* ----------------------------------------------------------------------- */ |
157 | #ifdef __NetBSD__ |
158 | # define HAS_SYS_MD5_H 1 |
159 | # if (NetBSD >= 199905) && !defined(IPFILTER_LKM) && defined(_KERNEL) |
160 | # if (__NetBSD_Version__ < 399001400) |
161 | # include "opt_ipfilter_log.h" |
162 | # else |
163 | # if (__NetBSD_Version__ >= 799003000) |
164 | # if defined(_KERNEL_OPT) |
165 | # include "opt_ipfilter.h" |
166 | # endif |
167 | # else |
168 | # include "opt_ipfilter.h" |
169 | # endif |
170 | # endif |
171 | # endif |
172 | # if defined(_KERNEL) |
173 | # include <sys/systm.h> |
174 | # include <sys/malloc.h> |
175 | # if (__NetBSD_Version__ > 500000000) |
176 | # include <sys/kauth.h> |
177 | # endif |
178 | # else |
179 | # include <stddef.h> |
180 | # include <stdbool.h> |
181 | # endif |
182 | # if defined(_KERNEL) && !defined(IPFILTER_LKM) |
183 | # if defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 599002300) |
184 | # define NBPFILTER 1 |
185 | # else |
186 | # include "bpfilter.h" |
187 | # endif |
188 | # if defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 104110000) |
189 | # if (__NetBSD_Version__ >= 799003000) |
190 | # if defined(_KERNEL_OPT) |
191 | # include "opt_inet.h" |
192 | # endif |
193 | # else |
194 | # include "opt_inet.h" |
195 | # endif |
196 | # endif |
197 | # ifdef INET6 |
198 | # define USE_INET6 |
199 | # endif |
200 | # if (__NetBSD_Version__ >= 105000000) |
201 | # define HAVE_M_PULLDOWN 1 |
202 | # endif |
203 | # endif |
204 | |
205 | #ifndef _KERNEL |
206 | # define ipf_random arc4random |
207 | #endif |
208 | |
209 | # if (__NetBSD_Version__ >= 499000000) |
210 | # ifdef _KERNEL |
211 | # include <sys/rwlock.h> |
212 | # define USE_MUTEXES 1 |
213 | # define KMUTEX_T kmutex_t |
214 | # define KRWLOCK_T krwlock_t |
215 | # define MUTEX_DESTROY(x) mutex_destroy(&(x)->ipf_lk) |
216 | # define MUTEX_DOWNGRADE(x) rw_downgrade(&(x)->ipf_lk) |
217 | # define MUTEX_ENTER(x) mutex_enter(&(x)->ipf_lk) |
218 | # define MUTEX_EXIT(x) mutex_exit(&(x)->ipf_lk) |
219 | # define MUTEX_INIT(x,y) mutex_init(&(x)->ipf_lk, MUTEX_DRIVER,\ |
220 | IPL_SOFTNET) |
221 | # define MUTEX_NUKE(x) bzero((x), sizeof(*(x))) |
222 | # define READ_ENTER(x) rw_enter(&(x)->ipf_lk, RW_READER) |
223 | # define RWLOCK_INIT(x, y) rw_init(&(x)->ipf_lk) |
224 | # define RWLOCK_EXIT(x) rw_exit(&(x)->ipf_lk) |
225 | # define RW_DESTROY(x) rw_destroy(&(x)->ipf_lk) |
226 | # define WRITE_ENTER(x) rw_enter(&(x)->ipf_lk, RW_WRITER) |
227 | # define SPL_SCHED(x) ; |
228 | # define SPL_NET(x) ; |
229 | # define SPL_IMP(x) ; |
230 | # define SPL_X(x) ; |
231 | # endif |
232 | # endif |
233 | |
234 | #if (__NetBSD_Version__ >= 699000000) |
235 | # define HAVE_RBTREE 1 |
236 | #endif |
237 | |
238 | # ifdef _KERNEL |
239 | # include <sys/cprng.h> |
240 | # if (__NetBSD_Version__ >= 399001400) |
241 | # include <sys/selinfo.h> /* Not in NetBSD 3.1 */ |
242 | # define PROC_T struct lwp |
243 | # define KFREE(a) free((a), _M_IPF) |
244 | # define KFREES(a, b) free((a), _M_IPF) |
245 | # define KMALLOC(a, b) (a) = (b)malloc(sizeof (*(a)), \ |
246 | _M_IPF, M_NOWAIT) |
247 | # define KMALLOCS(a, b, c) (a) = (b)malloc((c), _M_IPF, M_NOWAIT) |
248 | # else |
249 | # define PROC_T struct proc |
250 | # endif |
251 | # define MSGDSIZE(m) mbufchainlen(m) |
252 | # define M_LEN(m) (m)->m_len |
253 | # define M_ADJ(m,x) m_adj(m, x) |
254 | # define M_COPY(x) m_copy((x), 0, M_COPYALL) |
255 | # define GETKTIME(x) microtime((struct timeval *)x) |
256 | # define IPF_PANIC(x,y) if (x) { printf y; panic("ipf_panic"); } |
257 | # define COPYIN(a,b,c) copyin((void *)(a), (void *)(b), (c)) |
258 | # define COPYOUT(a,b,c) copyout((void *)(a), (void *)(b), (c)) |
259 | # define BCOPYIN(a,b,c) (bcopy((void *)(a), (void *)(b), (c)), 0) |
260 | # define BCOPYOUT(a,b,c) (bcopy((void *)(a), (void *)(b), (c)), 0) |
261 | # if (defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 499004900)) |
262 | # define POLLWAKEUP(x) selnotify(softc->ipf_selwait+x, 0, 0) |
263 | # endif |
264 | # define ASSERT(x) KASSERT(x) |
265 | typedef struct mbuf mb_t; |
266 | # endif /* _KERNEL */ |
267 | # if (NetBSD <= 1991011) && (NetBSD >= 199606) |
268 | # define IFNAME(x) ((struct ifnet *)x)->if_xname |
269 | # define COPYIFNAME(v, x, b) \ |
270 | (void) strncpy(b, \ |
271 | ((struct ifnet *)x)->if_xname, \ |
272 | LIFNAMSIZ) |
273 | # else |
274 | # define IFNAME(x) ((struct ifnet *)x)->if_name |
275 | # endif |
276 | typedef struct uio uio_t; |
277 | typedef u_long ioctlcmd_t; |
278 | typedef int minor_t; |
279 | typedef u_int32_t u_32_t; |
280 | # define U_32_T 1 |
281 | |
282 | # define OS_RECOGNISED 1 |
283 | #endif /* __NetBSD__ */ |
284 | |
285 | /* ----------------------------------------------------------------------- */ |
286 | /* G E N E R I C */ |
287 | /* ----------------------------------------------------------------------- */ |
288 | |
289 | /* |
290 | * For BSD kernels, if bpf is in the kernel, enable ipfilter to use bpf in |
291 | * filter rules. |
292 | */ |
293 | #if !defined(IPFILTER_BPF) |
294 | # if (defined(NBPF) && (NBPF > 0)) || (defined(DEV_BPF) && (DEV_BPF > 0)) || \ |
295 | (defined(NBPFILTER) && (NBPFILTER > 0)) |
296 | # define IPFILTER_BPF |
297 | # endif |
298 | #endif |
299 | |
300 | /* |
301 | * Userland locking primitives |
302 | */ |
303 | #if !defined(KMUTEX_FILL_SZ) |
304 | # define KMUTEX_FILL_SZ 1 |
305 | #endif |
306 | #if !defined(KRWLOCK_FILL_SZ) |
307 | # define KRWLOCK_FILL_SZ 1 |
308 | #endif |
309 | |
310 | typedef struct { |
311 | char *eMm_owner; |
312 | char *eMm_heldin; |
313 | u_int eMm_magic; |
314 | int eMm_held; |
315 | int eMm_heldat; |
316 | } eMmutex_t; |
317 | |
318 | typedef struct { |
319 | char *eMrw_owner; |
320 | char *eMrw_heldin; |
321 | u_int eMrw_magic; |
322 | short eMrw_read; |
323 | short eMrw_write; |
324 | int eMrw_heldat; |
325 | } eMrwlock_t; |
326 | |
327 | typedef union { |
328 | char _fill[KMUTEX_FILL_SZ]; |
329 | #ifdef KMUTEX_T |
330 | struct { |
331 | KMUTEX_T ipf_slk; |
332 | const char *ipf_lname; |
333 | } ipf_lkun_s; |
334 | #endif |
335 | eMmutex_t ipf_emu; |
336 | } ipfmutex_t; |
337 | |
338 | typedef union { |
339 | char _fill[KRWLOCK_FILL_SZ]; |
340 | #ifdef KRWLOCK_T |
341 | struct { |
342 | KRWLOCK_T ipf_slk; |
343 | const char *ipf_lname; |
344 | int ipf_sr; |
345 | int ipf_sw; |
346 | u_int ipf_magic; |
347 | } ipf_lkun_s; |
348 | #endif |
349 | eMrwlock_t ipf_emu; |
350 | } ipfrwlock_t; |
351 | |
352 | #define ipf_lk ipf_lkun_s.ipf_slk |
353 | #define ipf_lname ipf_lkun_s.ipf_lname |
354 | #define ipf_isr ipf_lkun_s.ipf_sr |
355 | #define ipf_isw ipf_lkun_s.ipf_sw |
356 | #define ipf_magic ipf_lkun_s.ipf_magic |
357 | |
358 | #if !defined(__GNUC__) || \ |
359 | (defined(__FreeBSD_version) && (__FreeBSD_version >= 503000)) |
360 | # ifndef INLINE |
361 | # define INLINE |
362 | # endif |
363 | #else |
364 | # define INLINE __inline__ |
365 | #endif |
366 | |
367 | #ifndef EXTERN_INLINE |
368 | # if defined(__GNUC__) && !defined(__GNUC_STDC_INLINE__) |
369 | # define EXTERN_INLINE inline |
370 | # else |
371 | # define EXTERN_INLINE extern inline |
372 | # endif |
373 | #endif |
374 | |
375 | #if defined(linux) && defined(_KERNEL) |
376 | extern void ipf_read_enter(ipfrwlock_t *); |
377 | extern void ipf_write_enter(ipfrwlock_t *); |
378 | extern void ipf_rw_exit(ipfrwlock_t *); |
379 | extern void ipf_rw_init(ipfrwlock_t *, char *); |
380 | extern void ipf_rw_downgrade(ipfrwlock_t *); |
381 | #endif |
382 | |
383 | /* |
384 | * In a non-kernel environment, there are a lot of macros that need to be |
385 | * filled in to be null-ops or to point to some compatibility function, |
386 | * somewhere in userland. |
387 | */ |
388 | #ifndef _KERNEL |
389 | typedef struct mb_s { |
390 | struct mb_s *mb_next; |
391 | char *mb_data; |
392 | void *mb_ifp; |
393 | int mb_len; |
394 | int mb_flags; |
395 | u_long mb_buf[2048]; |
396 | } mb_t; |
397 | # undef m_next |
398 | # define m_next mb_next |
399 | # undef m_len |
400 | # define m_len mb_len |
401 | # undef m_flags |
402 | # define m_flags mb_flags |
403 | # undef m_data |
404 | # define m_data mb_data |
405 | # undef M_MCAST |
406 | # define M_MCAST 0x01 |
407 | # undef M_BCAST |
408 | # define M_BCAST 0x02 |
409 | # undef M_MBCAST |
410 | # define M_MBCAST 0x04 |
411 | # define MSGDSIZE(m) msgdsize(m) |
412 | # define M_LEN(m) (m)->mb_len |
413 | # define M_ADJ(m,x) (m)->mb_len += x |
414 | # define M_COPY(m) dupmbt(m) |
415 | # define M_DUP(m) dupmbt(m) |
416 | # define GETKTIME(x) gettimeofday((struct timeval *)(x), NULL) |
417 | # define MTOD(m, t) ((t)(m)->mb_data) |
418 | # define FREE_MB_T(m) freembt(m) |
419 | # define ALLOC_MB_T(m,l) (m) = allocmbt(l) |
420 | # define PREP_MB_T(f, m) do { \ |
421 | (m)->mb_next = *(f)->fin_mp; \ |
422 | *(fin)->fin_mp = (m); \ |
423 | (f)->fin_m = (m); \ |
424 | } while (0) |
425 | # define SLEEP(x,y) 1; |
426 | # define WAKEUP(x,y) ; |
427 | # define POLLWAKEUP(y) ; |
428 | # define IPF_PANIC(x,y) ; |
429 | # define PANIC(x,y) ; |
430 | # define SPL_SCHED(x) ; |
431 | # define SPL_NET(x) ; |
432 | # define SPL_IMP(x) ; |
433 | # define SPL_X(x) ; |
434 | # define KMALLOC(a,b) (a) = (b)malloc(sizeof(*a)) |
435 | # define KMALLOCS(a,b,c) (a) = (b)malloc(c) |
436 | # define KFREE(x) free(x) |
437 | # define KFREES(x,s) free(x) |
438 | # define GETIFP(x, v) get_unit(x,v) |
439 | # define GETIFMTU_4(x) 2048 |
440 | # define GETIFMTU_6(x) 2048 |
441 | # define COPYIN(a,b,c) bcopywrap((a), (b), (c)) |
442 | # define COPYOUT(a,b,c) bcopywrap((a), (b), (c)) |
443 | # define COPYDATA(m, o, l, b) bcopy(MTOD((mb_t *)m, char *) + (o), \ |
444 | (b), (l)) |
445 | # define COPYBACK(m, o, l, b) bcopy((b), \ |
446 | MTOD((mb_t *)m, char *) + (o), \ |
447 | (l)) |
448 | # define UIOMOVE(a,b,c,d) ipfuiomove(a,b,c,d) |
449 | extern void m_copydata(mb_t *, int, int, void *); |
450 | extern int ipfuiomove(void *, int, int, struct uio *); |
451 | extern int bcopywrap(void *, void *, size_t); |
452 | extern mb_t *allocmbt(size_t); |
453 | extern mb_t *dupmbt(mb_t *); |
454 | extern void freembt(mb_t *); |
455 | |
456 | # define MUTEX_DESTROY(x) eMmutex_destroy(&(x)->ipf_emu, \ |
457 | __FILE__, __LINE__) |
458 | # define MUTEX_ENTER(x) eMmutex_enter(&(x)->ipf_emu, \ |
459 | __FILE__, __LINE__) |
460 | # define MUTEX_EXIT(x) eMmutex_exit(&(x)->ipf_emu, \ |
461 | __FILE__, __LINE__) |
462 | # define MUTEX_INIT(x,y) eMmutex_init(&(x)->ipf_emu, y, \ |
463 | __FILE__, __LINE__) |
464 | # define MUTEX_NUKE(x) bzero((x), sizeof(*(x))) |
465 | |
466 | # define MUTEX_DOWNGRADE(x) eMrwlock_downgrade(&(x)->ipf_emu, \ |
467 | __FILE__, __LINE__) |
468 | # define READ_ENTER(x) eMrwlock_read_enter(&(x)->ipf_emu, \ |
469 | __FILE__, __LINE__) |
470 | # define RWLOCK_INIT(x, y) eMrwlock_init(&(x)->ipf_emu, y) |
471 | # define RWLOCK_EXIT(x) eMrwlock_exit(&(x)->ipf_emu) |
472 | # define RW_DESTROY(x) eMrwlock_destroy(&(x)->ipf_emu) |
473 | # define WRITE_ENTER(x) eMrwlock_write_enter(&(x)->ipf_emu, \ |
474 | __FILE__, \ |
475 | __LINE__) |
476 | |
477 | # define USE_MUTEXES 1 |
478 | |
479 | extern void eMmutex_destroy(eMmutex_t *, char *, int); |
480 | extern void eMmutex_enter(eMmutex_t *, char *, int); |
481 | extern void eMmutex_exit(eMmutex_t *, char *, int); |
482 | extern void eMmutex_init(eMmutex_t *, char *, char *, int); |
483 | extern void eMrwlock_destroy(eMrwlock_t *); |
484 | extern void eMrwlock_exit(eMrwlock_t *); |
485 | extern void eMrwlock_init(eMrwlock_t *, char *); |
486 | extern void eMrwlock_read_enter(eMrwlock_t *, char *, int); |
487 | extern void eMrwlock_write_enter(eMrwlock_t *, char *, int); |
488 | extern void eMrwlock_downgrade(eMrwlock_t *, char *, int); |
489 | |
490 | #endif |
491 | |
492 | extern mb_t *allocmbt(size_t); |
493 | |
494 | #define MAX_IPV4HDR ((0xf << 2) + sizeof(struct icmp) + sizeof(ip_t) + 8) |
495 | |
496 | #ifndef IP_OFFMASK |
497 | # define IP_OFFMASK 0x1fff |
498 | #endif |
499 | |
500 | |
501 | /* |
502 | * On BSD's use quad_t as a guarantee for getting at least a 64bit sized |
503 | * object. |
504 | */ |
505 | #if !defined(__amd64__) && BSD_GT_YEAR(199306) |
506 | # define USE_QUAD_T |
507 | # define U_QUAD_T u_quad_t |
508 | # define QUAD_T quad_t |
509 | #else /* BSD > 199306 */ |
510 | # if !defined(U_QUAD_T) |
511 | # define U_QUAD_T u_long |
512 | # define QUAD_T long |
513 | # endif |
514 | #endif /* BSD > 199306 */ |
515 | |
516 | |
517 | #ifdef USE_INET6 |
518 | # if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__) || \ |
519 | defined(__osf__) || defined(linux) |
520 | # include <netinet/ip6.h> |
521 | # include <netinet/icmp6.h> |
522 | # if !defined(linux) |
523 | # if defined(_KERNEL) && !defined(__osf__) |
524 | # include <netinet6/ip6_var.h> |
525 | # endif |
526 | # endif |
527 | typedef struct ip6_hdr ip6_t; |
528 | # endif |
529 | #endif |
530 | |
531 | #ifndef MAX |
532 | # define MAX(a,b) (((a) > (b)) ? (a) : (b)) |
533 | #endif |
534 | |
535 | #if defined(_KERNEL) |
536 | # if defined(MENTAT) && !defined(INSTANCES) |
537 | # define COPYDATA mb_copydata |
538 | # define COPYBACK mb_copyback |
539 | # else |
540 | # define COPYDATA m_copydata |
541 | # define COPYBACK m_copyback |
542 | # endif |
543 | # if BSD_GE_YEAR(199306) || defined(__FreeBSD__) |
544 | # if (defined(__NetBSD_Version__) && (__NetBSD_Version__ < 105180000)) || \ |
545 | defined(__FreeBSD__) || (defined(OpenBSD) && (OpenBSD < 200206)) || \ |
546 | defined(_BSDI_VERSION) |
547 | # include <vm/vm.h> |
548 | # endif |
549 | # if !defined(__FreeBSD__) || FREEBSD_GE_REV(300000) |
550 | # if NETBSD_GE_REV(105180000) || OPENBSD_GE_REV(200111) |
551 | /* # include <uvm/uvm_extern.h> */ |
552 | # else |
553 | # include <vm/vm_extern.h> |
554 | extern vm_map_t kmem_map; |
555 | # endif |
556 | # include <sys/proc.h> |
557 | # else /* !__FreeBSD__ || (__FreeBSD__ && __FreeBSD_version >= 300000) */ |
558 | # include <vm/vm_kern.h> |
559 | # endif /* !__FreeBSD__ || (__FreeBSD__ && __FreeBSD_version >= 300000) */ |
560 | |
561 | # ifdef IPFILTER_M_IPFILTER |
562 | # include <sys/malloc.h> |
563 | MALLOC_DECLARE(M_IPFILTER); |
564 | # define _M_IPF M_IPFILTER |
565 | # else /* IPFILTER_M_IPFILTER */ |
566 | # ifdef M_PFIL |
567 | # define _M_IPF M_PFIL |
568 | # else |
569 | # ifdef M_IPFILTER |
570 | # define _M_IPF M_IPFILTER |
571 | # else |
572 | # define _M_IPF M_TEMP |
573 | # endif /* M_IPFILTER */ |
574 | # endif /* M_PFIL */ |
575 | # endif /* IPFILTER_M_IPFILTER */ |
576 | # if !defined(KMALLOC) |
577 | # define KMALLOC(a, b) (a) = (b)malloc(sizeof(*(a)), _M_IPF, M_NOWAIT) |
578 | # endif |
579 | # if !defined(KMALLOCS) |
580 | # define KMALLOCS(a, b, c) (a) = (b)malloc((c), _M_IPF, M_NOWAIT) |
581 | # endif |
582 | # if !defined(KFREE) |
583 | # define KFREE(x) free((x), _M_IPF) |
584 | # endif |
585 | # if !defined(KFREES) |
586 | # define KFREES(x,s) free((x), _M_IPF) |
587 | # endif |
588 | # define UIOMOVE(a,b,c,d) uiomove((void *)a,b,d) |
589 | # define SLEEP(id, n) tsleep((id), PPAUSE|PCATCH, n, 0) |
590 | # define WAKEUP(id,x) wakeup(id+x) |
591 | # if !defined(POLLWAKEUP) |
592 | # define POLLWAKEUP(x) selwakeup(softc->ipf_selwait+x) |
593 | # endif |
594 | # define GETIFP(n, v) ifunit(n) |
595 | # define GETIFMTU_4(x) ((struct ifnet *)x)->if_mtu |
596 | # define GETIFMTU_6(x) ((struct ifnet *)x)->if_mtu |
597 | # endif /* (Free)BSD */ |
598 | |
599 | # if !defined(USE_MUTEXES) && !defined(SPL_NET) |
600 | # if (defined(NetBSD) && (NetBSD <= 1991011) && (NetBSD >= 199407)) || \ |
601 | OPENBSD_GE_REV(200006) |
602 | # define SPL_NET(x) x = splsoftnet() |
603 | # else |
604 | # define SPL_IMP(x) x = splimp() |
605 | # define SPL_NET(x) x = splnet() |
606 | # endif /* NetBSD && (NetBSD <= 1991011) && (NetBSD >= 199407) */ |
607 | # if !defined(SPL_SCHED) |
608 | # define SPL_SCHED(x) x = splsched() |
609 | # endif |
610 | # define SPL_X(x) (void) splx(x) |
611 | # endif /* !USE_MUTEXES */ |
612 | |
613 | # ifndef FREE_MB_T |
614 | # define FREE_MB_T(m) m_freem(m) |
615 | # endif |
616 | # ifndef ALLOC_MB_T |
617 | # ifdef MGETHDR |
618 | # define ALLOC_MB_T(m,l) do { \ |
619 | MGETHDR((m), M_DONTWAIT, MT_HEADER); \ |
620 | if ((m) != NULL) { \ |
621 | (m)->m_len = (l); \ |
622 | (m)->m_pkthdr.len = (l); \ |
623 | } \ |
624 | } while (0) |
625 | # else |
626 | # define ALLOC_MB_T(m,l) do { \ |
627 | MGET((m), M_DONTWAIT, MT_HEADER); \ |
628 | if ((m) != NULL) { \ |
629 | (m)->m_len = (l); \ |
630 | (m)->m_pkthdr.len = (l); \ |
631 | } \ |
632 | } while (0) |
633 | # endif |
634 | # endif |
635 | # ifndef PREP_MB_T |
636 | # define PREP_MB_T(f, m) do { \ |
637 | mb_t *_o = *(f)->fin_mp; \ |
638 | (m)->m_next = _o; \ |
639 | *(fin)->fin_mp = (m); \ |
640 | if (_o->m_flags & M_PKTHDR) { \ |
641 | (m)->m_pkthdr.len += \ |
642 | _o->m_pkthdr.len; \ |
643 | m_copy_rcvif((m), _o); \ |
644 | } \ |
645 | } while (0) |
646 | # endif |
647 | # ifndef M_DUP |
648 | # ifdef M_COPYALL |
649 | # define M_DUP(m) m_dup(m, 0, M_COPYALL, 0) |
650 | # else |
651 | # define M_DUP(m) m_dup(m) |
652 | # endif |
653 | # endif |
654 | |
655 | # ifndef MTOD |
656 | # define MTOD(m,t) mtod(m,t) |
657 | # endif |
658 | |
659 | # ifndef COPYIN |
660 | # define COPYIN(a,b,c) (bcopy((caddr_t)(a), (caddr_t)(b), (c)), 0) |
661 | # define COPYOUT(a,b,c) (bcopy((caddr_t)(a), (caddr_t)(b), (c)), 0) |
662 | # endif |
663 | |
664 | # ifndef KMALLOC |
665 | # define KMALLOC(a,b) (a) = (b)new_kmem_alloc(sizeof(*(a)), \ |
666 | KMEM_NOSLEEP) |
667 | # define KMALLOCS(a,b,c) (a) = (b)new_kmem_alloc((c), KMEM_NOSLEEP) |
668 | # endif |
669 | |
670 | # ifndef GET_MINOR |
671 | # define GET_MINOR(x) minor(x) |
672 | # endif |
673 | # define PANIC(x,y) if (x) panic y |
674 | #endif /* _KERNEL */ |
675 | |
676 | #if !defined(IFNAME) && !defined(_KERNEL) |
677 | # define IFNAME(x) get_ifname((struct ifnet *)x) |
678 | #endif |
679 | #ifndef COPYIFNAME |
680 | # define NEED_FRGETIFNAME |
681 | extern char *ipf_getifname(struct ifnet *, char *); |
682 | # define COPYIFNAME(v, x, b) \ |
683 | ipf_getifname((struct ifnet *)x, b) |
684 | #endif |
685 | |
686 | #ifndef ASSERT |
687 | # ifdef _KERNEL |
688 | # define ASSERT(x) |
689 | # else |
690 | # define ASSERT(x) do { if (!(x)) abort(); } while (0) |
691 | # endif |
692 | #endif |
693 | |
694 | #ifndef BCOPYIN |
695 | # define BCOPYIN(a,b,c) (bcopy((caddr_t)(a), (caddr_t)(b), (c)), 0) |
696 | # define BCOPYOUT(a,b,c) (bcopy((caddr_t)(a), (caddr_t)(b), (c)), 0) |
697 | #endif |
698 | |
699 | /* |
700 | * Because the ctype(3) posix definition, if used "safely" in code everywhere, |
701 | * would mean all normal code that walks through strings needed casts. Yuck. |
702 | */ |
703 | #define ISALNUM(x) isalnum((u_char)(x)) |
704 | #define ISALPHA(x) isalpha((u_char)(x)) |
705 | #define ISDIGIT(x) isdigit((u_char)(x)) |
706 | #define ISSPACE(x) isspace((u_char)(x)) |
707 | #define ISUPPER(x) isupper((u_char)(x)) |
708 | #define ISXDIGIT(x) isxdigit((u_char)(x)) |
709 | #define ISLOWER(x) islower((u_char)(x)) |
710 | #define TOUPPER(x) toupper((u_char)(x)) |
711 | #define TOLOWER(x) tolower((u_char)(x)) |
712 | |
713 | /* |
714 | * If mutexes aren't being used, turn all the mutex functions into null-ops. |
715 | */ |
716 | #if !defined(USE_MUTEXES) |
717 | # define USE_SPL 1 |
718 | # undef RW_DESTROY |
719 | # undef MUTEX_INIT |
720 | # undef MUTEX_NUKE |
721 | # undef MUTEX_DESTROY |
722 | # define MUTEX_ENTER(x) ; |
723 | # define READ_ENTER(x) ; |
724 | # define WRITE_ENTER(x) ; |
725 | # define MUTEX_DOWNGRADE(x) ; |
726 | # define RWLOCK_INIT(x, y) ; |
727 | # define RWLOCK_EXIT(x) ; |
728 | # define RW_DESTROY(x) ; |
729 | # define MUTEX_EXIT(x) ; |
730 | # define MUTEX_INIT(x,y) ; |
731 | # define MUTEX_DESTROY(x) ; |
732 | # define MUTEX_NUKE(x) ; |
733 | #endif /* !USE_MUTEXES */ |
734 | #ifndef ATOMIC_INC |
735 | # define ATOMIC_INC(x) (x)++ |
736 | # define ATOMIC_DEC(x) (x)-- |
737 | #endif |
738 | |
739 | #if defined(USE_SPL) && defined(_KERNEL) |
740 | # define SPL_INT(x) int x |
741 | #else |
742 | # define SPL_INT(x) |
743 | #endif |
744 | |
745 | /* |
746 | * If there are no atomic operations for bit sizes defined, define them to all |
747 | * use a generic one that works for all sizes. |
748 | */ |
749 | #ifndef ATOMIC_INCL |
750 | # define ATOMIC_INCL ATOMIC_INC |
751 | # define ATOMIC_INC64 ATOMIC_INC |
752 | # define ATOMIC_INC32 ATOMIC_INC |
753 | # define ATOMIC_DECL ATOMIC_DEC |
754 | # define ATOMIC_DEC64 ATOMIC_DEC |
755 | # define ATOMIC_DEC32 ATOMIC_DEC |
756 | #endif |
757 | |
758 | #ifndef HDR_T_PRIVATE |
759 | typedef struct tcphdr tcphdr_t; |
760 | typedef struct udphdr udphdr_t; |
761 | #endif |
762 | typedef struct icmp icmphdr_t; |
763 | typedef struct ip ip_t; |
764 | typedef struct ether_header ; |
765 | typedef struct tcpiphdr tcpiphdr_t; |
766 | |
767 | #ifndef FR_GROUPLEN |
768 | # define FR_GROUPLEN 16 |
769 | #endif |
770 | |
771 | #ifndef offsetof |
772 | # define offsetof(t,m) (size_t)((&((t *)0L)->m)) |
773 | #endif |
774 | #ifndef stsizeof |
775 | # define stsizeof(t,m) sizeof(((t *)0L)->m) |
776 | #endif |
777 | |
778 | /* |
779 | * This set of macros has been brought about because on Tru64 it is not |
780 | * possible to easily assign or examine values in a structure that are |
781 | * bit fields. |
782 | */ |
783 | #ifndef IP_V |
784 | # define IP_V(x) (x)->ip_v |
785 | #endif |
786 | #ifndef IP_V_A |
787 | # define IP_V_A(x,y) (x)->ip_v = (y) |
788 | #endif |
789 | #ifndef IP_HL |
790 | # define IP_HL(x) (x)->ip_hl |
791 | #endif |
792 | #ifndef IP_HL_A |
793 | # define IP_HL_A(x,y) (x)->ip_hl = ((y) & 0xf) |
794 | #endif |
795 | #ifndef TCP_X2 |
796 | # define TCP_X2(x) (x)->th_x2 |
797 | #endif |
798 | #ifndef TCP_X2_A |
799 | # define TCP_X2_A(x,y) (x)->th_x2 = (y) |
800 | #endif |
801 | #ifndef TCP_OFF |
802 | # define TCP_OFF(x) (x)->th_off |
803 | #endif |
804 | #ifndef TCP_OFF_A |
805 | # define TCP_OFF_A(x,y) (x)->th_off = (y) |
806 | #endif |
807 | #define IPMINLEN(i, h) ((i)->ip_len >= (IP_HL(i) * 4 + sizeof(struct h))) |
808 | |
809 | |
810 | /* |
811 | * XXX - This is one of those *awful* hacks which nobody likes |
812 | */ |
813 | #ifdef ultrix |
814 | #define A_A |
815 | #else |
816 | #define A_A & |
817 | #endif |
818 | |
819 | #define TCPF_ALL (TH_FIN|TH_SYN|TH_RST|TH_PUSH|TH_ACK|TH_URG|\ |
820 | TH_ECN|TH_CWR) |
821 | |
822 | #if BSD_GE_YEAR(199306) && !defined(m_act) |
823 | # define m_act m_nextpkt |
824 | #endif |
825 | |
826 | /* |
827 | * Security Options for Intenet Protocol (IPSO) as defined in RFC 1108. |
828 | * |
829 | * Basic Option |
830 | * |
831 | * 00000001 - (Reserved 4) |
832 | * 00111101 - Top Secret |
833 | * 01011010 - Secret |
834 | * 10010110 - Confidential |
835 | * 01100110 - (Reserved 3) |
836 | * 11001100 - (Reserved 2) |
837 | * 10101011 - Unclassified |
838 | * 11110001 - (Reserved 1) |
839 | */ |
840 | #define IPSO_CLASS_RES4 0x01 |
841 | #define IPSO_CLASS_TOPS 0x3d |
842 | #define IPSO_CLASS_SECR 0x5a |
843 | #define IPSO_CLASS_CONF 0x96 |
844 | #define IPSO_CLASS_RES3 0x66 |
845 | #define IPSO_CLASS_RES2 0xcc |
846 | #define IPSO_CLASS_UNCL 0xab |
847 | #define IPSO_CLASS_RES1 0xf1 |
848 | |
849 | #define IPSO_AUTH_GENSER 0x80 |
850 | #define IPSO_AUTH_ESI 0x40 |
851 | #define IPSO_AUTH_SCI 0x20 |
852 | #define IPSO_AUTH_NSA 0x10 |
853 | #define IPSO_AUTH_DOE 0x08 |
854 | #define IPSO_AUTH_UN 0x06 |
855 | #define IPSO_AUTH_FTE 0x01 |
856 | |
857 | /* |
858 | * IP option #defines |
859 | */ |
860 | #undef IPOPT_RR |
861 | #define IPOPT_RR 7 |
862 | #undef IPOPT_ZSU |
863 | #define IPOPT_ZSU 10 /* ZSU */ |
864 | #undef IPOPT_MTUP |
865 | #define IPOPT_MTUP 11 /* MTUP */ |
866 | #undef IPOPT_MTUR |
867 | #define IPOPT_MTUR 12 /* MTUR */ |
868 | #undef IPOPT_ENCODE |
869 | #define IPOPT_ENCODE 15 /* ENCODE */ |
870 | #undef IPOPT_TS |
871 | #define IPOPT_TS 68 |
872 | #undef IPOPT_TR |
873 | #define IPOPT_TR 82 /* TR */ |
874 | #undef IPOPT_SECURITY |
875 | #define IPOPT_SECURITY 130 |
876 | #undef IPOPT_LSRR |
877 | #define IPOPT_LSRR 131 |
878 | #undef IPOPT_E_SEC |
879 | #define IPOPT_E_SEC 133 /* E-SEC */ |
880 | #undef IPOPT_CIPSO |
881 | #define IPOPT_CIPSO 134 /* CIPSO */ |
882 | #undef IPOPT_SATID |
883 | #define IPOPT_SATID 136 |
884 | #ifndef IPOPT_SID |
885 | # define IPOPT_SID IPOPT_SATID |
886 | #endif |
887 | #undef IPOPT_SSRR |
888 | #define IPOPT_SSRR 137 |
889 | #undef IPOPT_ADDEXT |
890 | #define IPOPT_ADDEXT 147 /* ADDEXT */ |
891 | #undef IPOPT_VISA |
892 | #define IPOPT_VISA 142 /* VISA */ |
893 | #undef IPOPT_IMITD |
894 | #define IPOPT_IMITD 144 /* IMITD */ |
895 | #undef IPOPT_EIP |
896 | #define IPOPT_EIP 145 /* EIP */ |
897 | #undef IPOPT_RTRALRT |
898 | #define IPOPT_RTRALRT 148 /* RTRALRT */ |
899 | #undef IPOPT_SDB |
900 | #define IPOPT_SDB 149 |
901 | #undef IPOPT_NSAPA |
902 | #define IPOPT_NSAPA 150 |
903 | #undef IPOPT_DPS |
904 | #define IPOPT_DPS 151 |
905 | #undef IPOPT_UMP |
906 | #define IPOPT_UMP 152 |
907 | #undef IPOPT_FINN |
908 | #define IPOPT_FINN 205 /* FINN */ |
909 | #undef IPOPT_AH |
910 | #define IPOPT_AH 256+IPPROTO_AH |
911 | |
912 | #ifndef TCPOPT_EOL |
913 | # define TCPOPT_EOL 0 |
914 | #endif |
915 | #ifndef TCPOPT_NOP |
916 | # define TCPOPT_NOP 1 |
917 | #endif |
918 | #ifndef TCPOPT_MAXSEG |
919 | # define TCPOPT_MAXSEG 2 |
920 | #endif |
921 | #ifndef TCPOLEN_MAXSEG |
922 | # define TCPOLEN_MAXSEG 4 |
923 | #endif |
924 | #ifndef TCPOPT_WINDOW |
925 | # define TCPOPT_WINDOW 3 |
926 | #endif |
927 | #ifndef TCPOLEN_WINDOW |
928 | # define TCPOLEN_WINDOW 3 |
929 | #endif |
930 | #ifndef TCPOPT_SACK_PERMITTED |
931 | # define TCPOPT_SACK_PERMITTED 4 |
932 | #endif |
933 | #ifndef TCPOLEN_SACK_PERMITTED |
934 | # define TCPOLEN_SACK_PERMITTED 2 |
935 | #endif |
936 | #ifndef TCPOPT_SACK |
937 | # define TCPOPT_SACK 5 |
938 | #endif |
939 | #ifndef TCPOPT_TIMESTAMP |
940 | # define TCPOPT_TIMESTAMP 8 |
941 | #endif |
942 | |
943 | #ifndef ICMP_MINLEN |
944 | # define ICMP_MINLEN 8 |
945 | #endif |
946 | #ifndef ICMP_ECHOREPLY |
947 | # define ICMP_ECHOREPLY 0 |
948 | #endif |
949 | #ifndef ICMP_UNREACH |
950 | # define ICMP_UNREACH 3 |
951 | #endif |
952 | #ifndef ICMP_UNREACH_NET |
953 | # define ICMP_UNREACH_NET 0 |
954 | #endif |
955 | #ifndef ICMP_UNREACH_HOST |
956 | # define ICMP_UNREACH_HOST 1 |
957 | #endif |
958 | #ifndef ICMP_UNREACH_PROTOCOL |
959 | # define ICMP_UNREACH_PROTOCOL 2 |
960 | #endif |
961 | #ifndef ICMP_UNREACH_PORT |
962 | # define ICMP_UNREACH_PORT 3 |
963 | #endif |
964 | #ifndef ICMP_UNREACH_NEEDFRAG |
965 | # define ICMP_UNREACH_NEEDFRAG 4 |
966 | #endif |
967 | #ifndef ICMP_UNREACH_SRCFAIL |
968 | # define ICMP_UNREACH_SRCFAIL 5 |
969 | #endif |
970 | #ifndef ICMP_UNREACH_NET_UNKNOWN |
971 | # define ICMP_UNREACH_NET_UNKNOWN 6 |
972 | #endif |
973 | #ifndef ICMP_UNREACH_HOST_UNKNOWN |
974 | # define ICMP_UNREACH_HOST_UNKNOWN 7 |
975 | #endif |
976 | #ifndef ICMP_UNREACH_ISOLATED |
977 | # define ICMP_UNREACH_ISOLATED 8 |
978 | #endif |
979 | #ifndef ICMP_UNREACH_NET_PROHIB |
980 | # define ICMP_UNREACH_NET_PROHIB 9 |
981 | #endif |
982 | #ifndef ICMP_UNREACH_HOST_PROHIB |
983 | # define ICMP_UNREACH_HOST_PROHIB 10 |
984 | #endif |
985 | #ifndef ICMP_UNREACH_TOSNET |
986 | # define ICMP_UNREACH_TOSNET 11 |
987 | #endif |
988 | #ifndef ICMP_UNREACH_TOSHOST |
989 | # define ICMP_UNREACH_TOSHOST 12 |
990 | #endif |
991 | #ifndef ICMP_UNREACH_ADMIN_PROHIBIT |
992 | # define ICMP_UNREACH_ADMIN_PROHIBIT 13 |
993 | #endif |
994 | #ifndef ICMP_UNREACH_FILTER |
995 | # define ICMP_UNREACH_FILTER 13 |
996 | #endif |
997 | #ifndef ICMP_UNREACH_HOST_PRECEDENCE |
998 | # define ICMP_UNREACH_HOST_PRECEDENCE 14 |
999 | #endif |
1000 | #ifndef ICMP_UNREACH_PRECEDENCE_CUTOFF |
1001 | # define ICMP_UNREACH_PRECEDENCE_CUTOFF 15 |
1002 | #endif |
1003 | #ifndef ICMP_SOURCEQUENCH |
1004 | # define ICMP_SOURCEQUENCH 4 |
1005 | #endif |
1006 | #ifndef ICMP_REDIRECT_NET |
1007 | # define ICMP_REDIRECT_NET 0 |
1008 | #endif |
1009 | #ifndef ICMP_REDIRECT_HOST |
1010 | # define ICMP_REDIRECT_HOST 1 |
1011 | #endif |
1012 | #ifndef ICMP_REDIRECT_TOSNET |
1013 | # define ICMP_REDIRECT_TOSNET 2 |
1014 | #endif |
1015 | #ifndef ICMP_REDIRECT_TOSHOST |
1016 | # define ICMP_REDIRECT_TOSHOST 3 |
1017 | #endif |
1018 | #ifndef ICMP_ALTHOSTADDR |
1019 | # define ICMP_ALTHOSTADDR 6 |
1020 | #endif |
1021 | #ifndef ICMP_TIMXCEED |
1022 | # define ICMP_TIMXCEED 11 |
1023 | #endif |
1024 | #ifndef ICMP_TIMXCEED_INTRANS |
1025 | # define ICMP_TIMXCEED_INTRANS 0 |
1026 | #endif |
1027 | #ifndef ICMP_TIMXCEED_REASS |
1028 | # define ICMP_TIMXCEED_REASS 1 |
1029 | #endif |
1030 | #ifndef ICMP_PARAMPROB |
1031 | # define ICMP_PARAMPROB 12 |
1032 | #endif |
1033 | #ifndef ICMP_PARAMPROB_ERRATPTR |
1034 | # define ICMP_PARAMPROB_ERRATPTR 0 |
1035 | #endif |
1036 | #ifndef ICMP_PARAMPROB_OPTABSENT |
1037 | # define ICMP_PARAMPROB_OPTABSENT 1 |
1038 | #endif |
1039 | #ifndef ICMP_PARAMPROB_LENGTH |
1040 | # define ICMP_PARAMPROB_LENGTH 2 |
1041 | #endif |
1042 | #ifndef ICMP_TSTAMP |
1043 | # define ICMP_TSTAMP 13 |
1044 | #endif |
1045 | #ifndef ICMP_TSTAMPREPLY |
1046 | # define ICMP_TSTAMPREPLY 14 |
1047 | #endif |
1048 | #ifndef ICMP_IREQ |
1049 | # define ICMP_IREQ 15 |
1050 | #endif |
1051 | #ifndef ICMP_IREQREPLY |
1052 | # define ICMP_IREQREPLY 16 |
1053 | #endif |
1054 | #ifndef ICMP_MASKREQ |
1055 | # define ICMP_MASKREQ 17 |
1056 | #endif |
1057 | #ifndef ICMP_MASKREPLY |
1058 | # define ICMP_MASKREPLY 18 |
1059 | #endif |
1060 | #ifndef ICMP_TRACEROUTE |
1061 | # define ICMP_TRACEROUTE 30 |
1062 | #endif |
1063 | #ifndef ICMP_DATACONVERR |
1064 | # define ICMP_DATACONVERR 31 |
1065 | #endif |
1066 | #ifndef ICMP_MOBILE_REDIRECT |
1067 | # define ICMP_MOBILE_REDIRECT 32 |
1068 | #endif |
1069 | #ifndef ICMP_IPV6_WHEREAREYOU |
1070 | # define ICMP_IPV6_WHEREAREYOU 33 |
1071 | #endif |
1072 | #ifndef ICMP_IPV6_IAMHERE |
1073 | # define ICMP_IPV6_IAMHERE 34 |
1074 | #endif |
1075 | #ifndef ICMP_MOBILE_REGREQUEST |
1076 | # define ICMP_MOBILE_REGREQUEST 35 |
1077 | #endif |
1078 | #ifndef ICMP_MOBILE_REGREPLY |
1079 | # define ICMP_MOBILE_REGREPLY 36 |
1080 | #endif |
1081 | #ifndef ICMP_SKIP |
1082 | # define ICMP_SKIP 39 |
1083 | #endif |
1084 | #ifndef ICMP_PHOTURIS |
1085 | # define ICMP_PHOTURIS 40 |
1086 | #endif |
1087 | #ifndef ICMP_PHOTURIS_UNKNOWN_INDEX |
1088 | # define ICMP_PHOTURIS_UNKNOWN_INDEX 1 |
1089 | #endif |
1090 | #ifndef ICMP_PHOTURIS_AUTH_FAILED |
1091 | # define ICMP_PHOTURIS_AUTH_FAILED 2 |
1092 | #endif |
1093 | #ifndef ICMP_PHOTURIS_DECRYPT_FAILED |
1094 | # define ICMP_PHOTURIS_DECRYPT_FAILED 3 |
1095 | #endif |
1096 | #ifndef IPVERSION |
1097 | # define IPVERSION 4 |
1098 | #endif |
1099 | #ifndef IPOPT_MINOFF |
1100 | # define IPOPT_MINOFF 4 |
1101 | #endif |
1102 | #ifndef IPOPT_COPIED |
1103 | # define IPOPT_COPIED(x) ((x)&0x80) |
1104 | #endif |
1105 | #ifndef IPOPT_EOL |
1106 | # define IPOPT_EOL 0 |
1107 | #endif |
1108 | #ifndef IPOPT_NOP |
1109 | # define IPOPT_NOP 1 |
1110 | #endif |
1111 | #ifndef IP_MF |
1112 | # define IP_MF ((u_short)0x2000) |
1113 | #endif |
1114 | #ifndef ETHERTYPE_IP |
1115 | # define ETHERTYPE_IP ((u_short)0x0800) |
1116 | #endif |
1117 | #ifndef TH_FIN |
1118 | # define TH_FIN 0x01 |
1119 | #endif |
1120 | #ifndef TH_SYN |
1121 | # define TH_SYN 0x02 |
1122 | #endif |
1123 | #ifndef TH_RST |
1124 | # define TH_RST 0x04 |
1125 | #endif |
1126 | #ifndef TH_PUSH |
1127 | # define TH_PUSH 0x08 |
1128 | #endif |
1129 | #ifndef TH_ACK |
1130 | # define TH_ACK 0x10 |
1131 | #endif |
1132 | #ifndef TH_URG |
1133 | # define TH_URG 0x20 |
1134 | #endif |
1135 | #undef TH_ACKMASK |
1136 | #define TH_ACKMASK (TH_FIN|TH_SYN|TH_RST|TH_ACK) |
1137 | |
1138 | #ifndef IPOPT_EOL |
1139 | # define IPOPT_EOL 0 |
1140 | #endif |
1141 | #ifndef IPOPT_NOP |
1142 | # define IPOPT_NOP 1 |
1143 | #endif |
1144 | #ifndef IPOPT_RR |
1145 | # define IPOPT_RR 7 |
1146 | #endif |
1147 | #ifndef IPOPT_TS |
1148 | # define IPOPT_TS 68 |
1149 | #endif |
1150 | #ifndef IPOPT_SECURITY |
1151 | # define IPOPT_SECURITY 130 |
1152 | #endif |
1153 | #ifndef IPOPT_LSRR |
1154 | # define IPOPT_LSRR 131 |
1155 | #endif |
1156 | #ifndef IPOPT_SATID |
1157 | # define IPOPT_SATID 136 |
1158 | #endif |
1159 | #ifndef IPOPT_SSRR |
1160 | # define IPOPT_SSRR 137 |
1161 | #endif |
1162 | #ifndef IPOPT_SECUR_UNCLASS |
1163 | # define IPOPT_SECUR_UNCLASS ((u_short)0x0000) |
1164 | #endif |
1165 | #ifndef IPOPT_SECUR_CONFID |
1166 | # define IPOPT_SECUR_CONFID ((u_short)0xf135) |
1167 | #endif |
1168 | #ifndef IPOPT_SECUR_EFTO |
1169 | # define IPOPT_SECUR_EFTO ((u_short)0x789a) |
1170 | #endif |
1171 | #ifndef IPOPT_SECUR_MMMM |
1172 | # define IPOPT_SECUR_MMMM ((u_short)0xbc4d) |
1173 | #endif |
1174 | #ifndef IPOPT_SECUR_RESTR |
1175 | # define IPOPT_SECUR_RESTR ((u_short)0xaf13) |
1176 | #endif |
1177 | #ifndef IPOPT_SECUR_SECRET |
1178 | # define IPOPT_SECUR_SECRET ((u_short)0xd788) |
1179 | #endif |
1180 | #ifndef IPOPT_SECUR_TOPSECRET |
1181 | # define IPOPT_SECUR_TOPSECRET ((u_short)0x6bc5) |
1182 | #endif |
1183 | #ifndef IPOPT_OLEN |
1184 | # define IPOPT_OLEN 1 |
1185 | #endif |
1186 | #ifndef IPPROTO_HOPOPTS |
1187 | # define IPPROTO_HOPOPTS 0 |
1188 | #endif |
1189 | #ifndef IPPROTO_IPIP |
1190 | # define IPPROTO_IPIP 4 |
1191 | #endif |
1192 | #ifndef IPPROTO_ENCAP |
1193 | # define IPPROTO_ENCAP 98 |
1194 | #endif |
1195 | #ifndef IPPROTO_IPV6 |
1196 | # define IPPROTO_IPV6 41 |
1197 | #endif |
1198 | #ifndef IPPROTO_ROUTING |
1199 | # define IPPROTO_ROUTING 43 |
1200 | #endif |
1201 | #ifndef IPPROTO_FRAGMENT |
1202 | # define IPPROTO_FRAGMENT 44 |
1203 | #endif |
1204 | #ifndef IPPROTO_GRE |
1205 | # define IPPROTO_GRE 47 /* GRE encaps RFC 1701 */ |
1206 | #endif |
1207 | #ifndef IPPROTO_ESP |
1208 | # define IPPROTO_ESP 50 |
1209 | #endif |
1210 | #ifndef IPPROTO_AH |
1211 | # define IPPROTO_AH 51 |
1212 | #endif |
1213 | #ifndef IPPROTO_ICMPV6 |
1214 | # define IPPROTO_ICMPV6 58 |
1215 | #endif |
1216 | #ifndef IPPROTO_NONE |
1217 | # define IPPROTO_NONE 59 |
1218 | #endif |
1219 | #ifndef IPPROTO_DSTOPTS |
1220 | # define IPPROTO_DSTOPTS 60 |
1221 | #endif |
1222 | #ifndef IPPROTO_MOBILITY |
1223 | # define IPPROTO_MOBILITY 135 |
1224 | #endif |
1225 | |
1226 | #ifndef ICMP_ROUTERADVERT |
1227 | # define ICMP_ROUTERADVERT 9 |
1228 | #endif |
1229 | #ifndef ICMP_ROUTERSOLICIT |
1230 | # define ICMP_ROUTERSOLICIT 10 |
1231 | #endif |
1232 | #ifndef ICMP6_DST_UNREACH |
1233 | # define ICMP6_DST_UNREACH 1 |
1234 | #endif |
1235 | #ifndef ICMP6_PACKET_TOO_BIG |
1236 | # define ICMP6_PACKET_TOO_BIG 2 |
1237 | #endif |
1238 | #ifndef ICMP6_TIME_EXCEEDED |
1239 | # define ICMP6_TIME_EXCEEDED 3 |
1240 | #endif |
1241 | #ifndef ICMP6_PARAM_PROB |
1242 | # define ICMP6_PARAM_PROB 4 |
1243 | #endif |
1244 | |
1245 | #ifndef ICMP6_ECHO_REQUEST |
1246 | # define ICMP6_ECHO_REQUEST 128 |
1247 | #endif |
1248 | #ifndef ICMP6_ECHO_REPLY |
1249 | # define ICMP6_ECHO_REPLY 129 |
1250 | #endif |
1251 | #ifndef ICMP6_MEMBERSHIP_QUERY |
1252 | # define ICMP6_MEMBERSHIP_QUERY 130 |
1253 | #endif |
1254 | #ifndef MLD6_LISTENER_QUERY |
1255 | # define MLD6_LISTENER_QUERY 130 |
1256 | #endif |
1257 | #ifndef ICMP6_MEMBERSHIP_REPORT |
1258 | # define ICMP6_MEMBERSHIP_REPORT 131 |
1259 | #endif |
1260 | #ifndef MLD6_LISTENER_REPORT |
1261 | # define MLD6_LISTENER_REPORT 131 |
1262 | #endif |
1263 | #ifndef ICMP6_MEMBERSHIP_REDUCTION |
1264 | # define ICMP6_MEMBERSHIP_REDUCTION 132 |
1265 | #endif |
1266 | #ifndef MLD6_LISTENER_DONE |
1267 | # define MLD6_LISTENER_DONE 132 |
1268 | #endif |
1269 | #ifndef ND_ROUTER_SOLICIT |
1270 | # define ND_ROUTER_SOLICIT 133 |
1271 | #endif |
1272 | #ifndef ND_ROUTER_ADVERT |
1273 | # define ND_ROUTER_ADVERT 134 |
1274 | #endif |
1275 | #ifndef ND_NEIGHBOR_SOLICIT |
1276 | # define ND_NEIGHBOR_SOLICIT 135 |
1277 | #endif |
1278 | #ifndef ND_NEIGHBOR_ADVERT |
1279 | # define ND_NEIGHBOR_ADVERT 136 |
1280 | #endif |
1281 | #ifndef ND_REDIRECT |
1282 | # define ND_REDIRECT 137 |
1283 | #endif |
1284 | #ifndef ICMP6_ROUTER_RENUMBERING |
1285 | # define ICMP6_ROUTER_RENUMBERING 138 |
1286 | #endif |
1287 | #ifndef ICMP6_WRUREQUEST |
1288 | # define ICMP6_WRUREQUEST 139 |
1289 | #endif |
1290 | #ifndef ICMP6_WRUREPLY |
1291 | # define ICMP6_WRUREPLY 140 |
1292 | #endif |
1293 | #ifndef ICMP6_FQDN_QUERY |
1294 | # define ICMP6_FQDN_QUERY 139 |
1295 | #endif |
1296 | #ifndef ICMP6_FQDN_REPLY |
1297 | # define ICMP6_FQDN_REPLY 140 |
1298 | #endif |
1299 | #ifndef ICMP6_NI_QUERY |
1300 | # define ICMP6_NI_QUERY 139 |
1301 | #endif |
1302 | #ifndef ICMP6_NI_REPLY |
1303 | # define ICMP6_NI_REPLY 140 |
1304 | #endif |
1305 | #ifndef MLD6_MTRACE_RESP |
1306 | # define MLD6_MTRACE_RESP 200 |
1307 | #endif |
1308 | #ifndef MLD6_MTRACE |
1309 | # define MLD6_MTRACE 201 |
1310 | #endif |
1311 | #ifndef ICMP6_HADISCOV_REQUEST |
1312 | # define ICMP6_HADISCOV_REQUEST 202 |
1313 | #endif |
1314 | #ifndef ICMP6_HADISCOV_REPLY |
1315 | # define ICMP6_HADISCOV_REPLY 203 |
1316 | #endif |
1317 | #ifndef ICMP6_MOBILEPREFIX_SOLICIT |
1318 | # define ICMP6_MOBILEPREFIX_SOLICIT 204 |
1319 | #endif |
1320 | #ifndef ICMP6_MOBILEPREFIX_ADVERT |
1321 | # define ICMP6_MOBILEPREFIX_ADVERT 205 |
1322 | #endif |
1323 | #ifndef ICMP6_MAXTYPE |
1324 | # define ICMP6_MAXTYPE 205 |
1325 | #endif |
1326 | |
1327 | #ifndef ICMP6_DST_UNREACH_NOROUTE |
1328 | # define ICMP6_DST_UNREACH_NOROUTE 0 |
1329 | #endif |
1330 | #ifndef ICMP6_DST_UNREACH_ADMIN |
1331 | # define ICMP6_DST_UNREACH_ADMIN 1 |
1332 | #endif |
1333 | #ifndef ICMP6_DST_UNREACH_NOTNEIGHBOR |
1334 | # define ICMP6_DST_UNREACH_NOTNEIGHBOR 2 |
1335 | #endif |
1336 | #ifndef ICMP6_DST_UNREACH_BEYONDSCOPE |
1337 | # define ICMP6_DST_UNREACH_BEYONDSCOPE 2 |
1338 | #endif |
1339 | #ifndef ICMP6_DST_UNREACH_ADDR |
1340 | # define ICMP6_DST_UNREACH_ADDR 3 |
1341 | #endif |
1342 | #ifndef ICMP6_DST_UNREACH_NOPORT |
1343 | # define ICMP6_DST_UNREACH_NOPORT 4 |
1344 | #endif |
1345 | #ifndef ICMP6_TIME_EXCEED_TRANSIT |
1346 | # define ICMP6_TIME_EXCEED_TRANSIT 0 |
1347 | #endif |
1348 | #ifndef ICMP6_TIME_EXCEED_REASSEMBLY |
1349 | # define ICMP6_TIME_EXCEED_REASSEMBLY 1 |
1350 | #endif |
1351 | |
1352 | #ifndef ICMP6_NI_SUCCESS |
1353 | # define ICMP6_NI_SUCCESS 0 |
1354 | #endif |
1355 | #ifndef ICMP6_NI_REFUSED |
1356 | # define ICMP6_NI_REFUSED 1 |
1357 | #endif |
1358 | #ifndef ICMP6_NI_UNKNOWN |
1359 | # define ICMP6_NI_UNKNOWN 2 |
1360 | #endif |
1361 | |
1362 | #ifndef ICMP6_ROUTER_RENUMBERING_COMMAND |
1363 | # define ICMP6_ROUTER_RENUMBERING_COMMAND 0 |
1364 | #endif |
1365 | #ifndef ICMP6_ROUTER_RENUMBERING_RESULT |
1366 | # define ICMP6_ROUTER_RENUMBERING_RESULT 1 |
1367 | #endif |
1368 | #ifndef ICMP6_ROUTER_RENUMBERING_SEQNUM_RESET |
1369 | # define ICMP6_ROUTER_RENUMBERING_SEQNUM_RESET 255 |
1370 | #endif |
1371 | |
1372 | #ifndef ICMP6_PARAMPROB_HEADER |
1373 | # define ICMP6_PARAMPROB_HEADER 0 |
1374 | #endif |
1375 | #ifndef ICMP6_PARAMPROB_NEXTHEADER |
1376 | # define ICMP6_PARAMPROB_NEXTHEADER 1 |
1377 | #endif |
1378 | #ifndef ICMP6_PARAMPROB_OPTION |
1379 | # define ICMP6_PARAMPROB_OPTION 2 |
1380 | #endif |
1381 | |
1382 | #ifndef ICMP6_NI_SUBJ_IPV6 |
1383 | # define ICMP6_NI_SUBJ_IPV6 0 |
1384 | #endif |
1385 | #ifndef ICMP6_NI_SUBJ_FQDN |
1386 | # define ICMP6_NI_SUBJ_FQDN 1 |
1387 | #endif |
1388 | #ifndef ICMP6_NI_SUBJ_IPV4 |
1389 | # define ICMP6_NI_SUBJ_IPV4 2 |
1390 | #endif |
1391 | |
1392 | #ifndef MLD_MTRACE_RESP |
1393 | # define MLD_MTRACE_RESP 200 |
1394 | #endif |
1395 | #ifndef MLD_MTRACE |
1396 | # define MLD_MTRACE 201 |
1397 | #endif |
1398 | #ifndef MLD6_MTRACE_RESP |
1399 | # define MLD6_MTRACE_RESP MLD_MTRACE_RESP |
1400 | #endif |
1401 | #ifndef MLD6_MTRACE |
1402 | # define MLD6_MTRACE MLD_MTRACE |
1403 | #endif |
1404 | |
1405 | #if !defined(IPV6_FLOWINFO_MASK) |
1406 | # if (BYTE_ORDER == BIG_ENDIAN) || defined(_BIG_ENDIAN) |
1407 | # define IPV6_FLOWINFO_MASK 0x0fffffff /* flow info (28 bits) */ |
1408 | # else |
1409 | # if(BYTE_ORDER == LITTLE_ENDIAN) || !defined(_BIG_ENDIAN) |
1410 | # define IPV6_FLOWINFO_MASK 0xffffff0f /* flow info (28 bits) */ |
1411 | # endif /* LITTLE_ENDIAN */ |
1412 | # endif |
1413 | #endif |
1414 | #if !defined(IPV6_FLOWLABEL_MASK) |
1415 | # if (BYTE_ORDER == BIG_ENDIAN) || defined(_BIG_ENDIAN) |
1416 | # define IPV6_FLOWLABEL_MASK 0x000fffff /* flow label (20 bits) */ |
1417 | # else |
1418 | # if (BYTE_ORDER == LITTLE_ENDIAN) || !defined(_BIG_ENDIAN) |
1419 | # define IPV6_FLOWLABEL_MASK 0xffff0f00 /* flow label (20 bits) */ |
1420 | # endif /* LITTLE_ENDIAN */ |
1421 | # endif |
1422 | #endif |
1423 | |
1424 | /* |
1425 | * ECN is a new addition to TCP - RFC 2481 |
1426 | */ |
1427 | #ifndef TH_ECN |
1428 | # define TH_ECN 0x40 |
1429 | #endif |
1430 | #ifndef TH_CWR |
1431 | # define TH_CWR 0x80 |
1432 | #endif |
1433 | #define TH_ECNALL (TH_ECN|TH_CWR) |
1434 | |
1435 | /* |
1436 | * TCP States |
1437 | */ |
1438 | #define IPF_TCPS_LISTEN 0 /* listening for connection */ |
1439 | #define IPF_TCPS_SYN_SENT 1 /* active, have sent syn */ |
1440 | #define IPF_TCPS_SYN_RECEIVED 2 /* have send and received syn */ |
1441 | #define IPF_TCPS_HALF_ESTAB 3 /* for connections not fully "up" */ |
1442 | /* states < IPF_TCPS_ESTABLISHED are those where connections not established */ |
1443 | #define IPF_TCPS_ESTABLISHED 4 /* established */ |
1444 | #define IPF_TCPS_CLOSE_WAIT 5 /* rcvd fin, waiting for close */ |
1445 | /* states > IPF_TCPS_CLOSE_WAIT are those where user has closed */ |
1446 | #define IPF_TCPS_FIN_WAIT_1 6 /* have closed, sent fin */ |
1447 | #define IPF_TCPS_CLOSING 7 /* closed xchd FIN; await FIN ACK */ |
1448 | #define IPF_TCPS_LAST_ACK 8 /* had fin and close; await FIN ACK */ |
1449 | /* states > IPF_TCPS_CLOSE_WAIT && < IPF_TCPS_FIN_WAIT_2 await ACK of FIN */ |
1450 | #define IPF_TCPS_FIN_WAIT_2 9 /* have closed, fin is acked */ |
1451 | #define IPF_TCPS_TIME_WAIT 10 /* in 2*msl quiet wait after close */ |
1452 | #define IPF_TCPS_CLOSED 11 /* closed */ |
1453 | #define IPF_TCP_NSTATES 12 |
1454 | |
1455 | #define TCP_MSL 120 |
1456 | |
1457 | #undef ICMP_MAX_UNREACH |
1458 | #define ICMP_MAX_UNREACH 14 |
1459 | #undef ICMP_MAXTYPE |
1460 | #define ICMP_MAXTYPE 18 |
1461 | |
1462 | #ifndef IFNAMSIZ |
1463 | #define IFNAMSIZ 16 |
1464 | #endif |
1465 | |
1466 | #ifndef LOG_FTP |
1467 | # define LOG_FTP (11<<3) |
1468 | #endif |
1469 | #ifndef LOG_AUTHPRIV |
1470 | # define LOG_AUTHPRIV (10<<3) |
1471 | #endif |
1472 | #ifndef LOG_AUDIT |
1473 | # define LOG_AUDIT (13<<3) |
1474 | #endif |
1475 | #ifndef LOG_NTP |
1476 | # define LOG_NTP (12<<3) |
1477 | #endif |
1478 | #ifndef LOG_SECURITY |
1479 | # define LOG_SECURITY (13<<3) |
1480 | #endif |
1481 | #ifndef LOG_LFMT |
1482 | # define LOG_LFMT (14<<3) |
1483 | #endif |
1484 | #ifndef LOG_CONSOLE |
1485 | # define LOG_CONSOLE (14<<3) |
1486 | #endif |
1487 | |
1488 | /* |
1489 | * ICMP error replies have an IP header (20 bytes), 8 bytes of ICMP data, |
1490 | * another IP header and then 64 bits of data, totalling 56. Of course, |
1491 | * the last 64 bits is dependent on that being available. |
1492 | */ |
1493 | #define ICMPERR_ICMPHLEN 8 |
1494 | #define ICMPERR_IPICMPHLEN (20 + 8) |
1495 | #define ICMPERR_MINPKTLEN (20 + 8 + 20) |
1496 | #define ICMPERR_MAXPKTLEN (20 + 8 + 20 + 8) |
1497 | #define ICMP6ERR_MINPKTLEN (40 + 8) |
1498 | #define ICMP6ERR_IPICMPHLEN (40 + 8 + 40) |
1499 | |
1500 | #ifndef MIN |
1501 | # define MIN(a,b) (((a)<(b))?(a):(b)) |
1502 | #endif |
1503 | |
1504 | #ifdef RESCUE |
1505 | # undef IPFILTER_BPF |
1506 | #endif |
1507 | |
1508 | #ifdef IPF_DEBUG |
1509 | # define DPRINT(x) printf x |
1510 | #else |
1511 | # define DPRINT(x) |
1512 | #endif |
1513 | |
1514 | #ifndef AF_INET6 |
1515 | # define AF_INET6 26 |
1516 | #endif |
1517 | |
1518 | #ifdef DTRACE_PROBE |
1519 | # ifdef _KERNEL |
1520 | # define DT(_n) DTRACE_PROBE(_n) |
1521 | # define DT1(_n,_a,_b) DTRACE_PROBE1(_n,_a,_b) |
1522 | # define DT2(_n,_a,_b,_c,_d) DTRACE_PROBE2(_n,_a,_b,_c,_d) |
1523 | # define DT3(_n,_a,_b,_c,_d,_e,_f) \ |
1524 | DTRACE_PROBE3(_n,_a,_b,_c,_d,_e,_f) |
1525 | # define DT4(_n,_a,_b,_c,_d,_e,_f,_g,_h) \ |
1526 | DTRACE_PROBE4(_n,_a,_b,_c,_d,_e,_f,_g,_h) |
1527 | # else |
1528 | # define DT(_n) |
1529 | # define DT1(_n,_a,_b) |
1530 | # define DT2(_n,_a,_b,_c,_d) |
1531 | # define DT3(_n,_a,_b,_c,_d,_e,_f) |
1532 | # define DT4(_n,_a,_b,_c,_d,_e,_f,_g,_h) |
1533 | # endif |
1534 | #else |
1535 | # define DT(_n) |
1536 | # define DT1(_n,_a,_b) |
1537 | # define DT2(_n,_a,_b,_c,_d) |
1538 | # define DT3(_n,_a,_b,_c,_d,_e,_f) |
1539 | # define DT4(_n,_a,_b,_c,_d,_e,_f,_g,_h) |
1540 | #endif |
1541 | |
1542 | struct ip6_routing { |
1543 | u_char ip6r_nxt; /* next header */ |
1544 | u_char ip6r_len; /* length in units of 8 octets */ |
1545 | u_char ip6r_type; /* always zero */ |
1546 | u_char ip6r_segleft; /* segments left */ |
1547 | u_32_t ip6r_reserved; /* reserved field */ |
1548 | }; |
1549 | |
1550 | #endif /* __IP_COMPAT_H__ */ |
1551 | |