Fix LINT64 build.
[dragonfly.git] / sys / contrib / ipfilter / netinet / ip_compat.h
1 /*
2  * Copyright (C) 1993-2001 by Darren Reed.
3  *
4  * See the IPFILTER.LICENCE file for details on licencing.
5  *
6  * @(#)ip_compat.h      1.8 1/14/96
7  * $Id: ip_compat.h,v 2.26.2.46 2002/06/27 14:39:40 darrenr Exp $
8  * $FreeBSD: src/sys/contrib/ipfilter/netinet/ip_compat.h,v 1.13.2.6 2004/07/04 09:24:38 darrenr Exp $
9  * $DragonFly: src/sys/contrib/ipfilter/netinet/ip_compat.h,v 1.12 2005/06/04 14:24:33 corecode Exp $
10  */
11
12 #ifndef __IP_COMPAT_H__
13 #define __IP_COMPAT_H__
14
15 #ifndef __STDC__
16 # undef         const
17 # define        const
18 #endif
19
20 #ifndef SOLARIS
21 #define SOLARIS (defined(sun) && (defined(__svr4__) || defined(__SVR4)))
22 #endif
23 #if SOLARIS
24 # if !defined(SOLARIS2)
25 #  define       SOLARIS2        3       /* Pick an old version */
26 # endif
27 # if SOLARIS2 >= 8
28 #  ifndef       USE_INET6
29 #   define      USE_INET6
30 #  endif
31 # else
32 #  undef        USE_INET6
33 # endif
34 #endif
35 #if defined(sun) && !(defined(__svr4__) || defined(__SVR4))
36 # undef USE_INET6
37 #endif
38
39 #if defined(_KERNEL) || defined(KERNEL) || defined(__KERNEL__)
40 # undef KERNEL
41 # undef _KERNEL
42 # undef         __KERNEL__
43 # define        KERNEL
44 # define        _KERNEL
45 # define        __KERNEL__
46 #endif
47
48 #if defined(__SVR4) || defined(__svr4__) || defined(__sgi)
49 #define index   strchr
50 # if !defined(KERNEL)
51 #  define       bzero(a,b)      memset(a,0,b)
52 #  define       bcmp            memcmp
53 #  define       bcopy(a,b,c)    memmove(b,a,c)
54 # endif
55 #endif
56
57 #ifndef offsetof
58 #define offsetof(t,m) (int)((&((t *)0L)->m))
59 #endif
60
61 #if defined(__sgi) || defined(bsdi)
62 struct  ether_addr {
63         u_char  ether_addr_octet[6];
64 };
65 #endif
66
67 #ifndef LIFNAMSIZ
68 # ifdef IF_NAMESIZE
69 #  define       LIFNAMSIZ       IF_NAMESIZE
70 # else
71 #  ifdef        IFNAMSIZ
72 #   define      LIFNAMSIZ       IFNAMSIZ
73 #  else
74 #   define      LIFNAMSIZ       16
75 #  endif
76 # endif
77 #endif
78
79 #if defined(__sgi) && !defined(IPFILTER_LKM)
80 # ifdef __STDC__
81 #  define IPL_EXTERN(ep) ipfilter##ep
82 # else
83 #  define IPL_EXTERN(ep) ipfilter/**/ep
84 # endif
85 #else
86 # ifdef __STDC__
87 #  define IPL_EXTERN(ep) ipl##ep
88 # else
89 #  define IPL_EXTERN(ep) ipl/**/ep
90 # endif
91 #endif
92
93 #ifdef __sgi
94 # include       <sys/debug.h>
95 #endif
96
97 #ifdef  linux
98 # include <sys/sysmacros.h>
99 #endif
100
101 /*
102  * This is a workaround for <sys/uio.h> troubles on FreeBSD
103  */
104 #ifndef _KERNEL
105 # define ADD_KERNEL
106 # define _KERNEL_STRUCTURES
107 #endif
108 #ifdef __OpenBSD__
109 struct file;
110 #endif
111 #include <sys/uio.h>
112 #ifdef ADD_KERNEL
113 # undef _KERNEL_STRUCTURES
114 #endif
115
116 #if     SOLARIS
117 # define        MTYPE(m)        ((m)->b_datap->db_type)
118 # if SOLARIS2 >= 4
119 #  include      <sys/isa_defs.h>
120 # endif
121 # include       <sys/ioccom.h>
122 # include       <sys/sysmacros.h>
123 # include       <sys/kmem.h>
124 /*
125  * because Solaris 2 defines these in two places :-/
126  */
127 # undef IPOPT_EOL
128 # undef IPOPT_NOP
129 # undef IPOPT_LSRR
130 # undef IPOPT_RR
131 # undef IPOPT_SSRR
132 # ifndef        KERNEL
133 #  define       _KERNEL
134 #  undef        RES_INIT
135 #  if SOLARIS2 >= 8
136 #   include <netinet/ip6.h>
137 #  endif
138 #  include <inet/common.h>
139 #  include <inet/ip.h>
140 #  include <inet/ip_ire.h>
141 #  undef        _KERNEL
142 # else /* _KERNEL */
143 #  if SOLARIS2 >= 8
144 #   include <netinet/ip6.h>
145 #  endif
146 #  include <inet/common.h>
147 #  include <inet/ip.h>
148 #  include <inet/ip_ire.h>
149 # endif /* _KERNEL */
150 # if SOLARIS2 >= 8
151 #  include <inet/ip_if.h>
152 #  include <netinet/ip6.h>
153 #  define       ipif_local_addr ipif_lcl_addr
154 /* Only defined in private include file */
155 #  ifndef       V4_PART_OF_V6
156 #   define      V4_PART_OF_V6(v6)       v6.s6_addr32[3]
157 #  endif
158 # endif
159 # define        M_BLEN(m)       ((m)->b_wptr - (m)->b_rptr)
160
161 typedef struct  qif     {
162         struct  qif     *qf_next;
163         ill_t   *qf_ill;
164         kmutex_t        qf_lock;
165         void    *qf_iptr;
166         void    *qf_optr;
167         queue_t *qf_in;
168         queue_t *qf_out;
169         void    *qf_data;       /* layer 3 header pointer */
170         struct  qinit   *qf_wqinfo;
171         struct  qinit   *qf_rqinfo;
172         struct  qinit   qf_wqinit;
173         struct  qinit   qf_rqinit;
174         mblk_t  *qf_m;  /* These three fields are for passing data up from */
175         queue_t *qf_q;  /* fr_qin and fr_qout to the packet processing. */
176         size_t  qf_off;
177         size_t  qf_len; /* this field is used for in ipfr_fastroute */
178         char    qf_name[LIFNAMSIZ];
179         /*
180          * in case the ILL has disappeared...
181          */
182         size_t  qf_hl;  /* header length */
183         int     qf_sap;
184 # if SOLARIS2 >= 8
185         int     qf_tunoff;      /* tunnel offset */
186 #endif
187         size_t  qf_incnt;
188         size_t  qf_outcnt;
189 } qif_t;
190 #else /* SOLARIS */
191 # if !defined(__sgi)
192 typedef  int    minor_t;
193 # endif
194 #endif /* SOLARIS */
195 #define IPMINLEN(i, h)  ((i)->ip_len >= ((i)->ip_hl * 4 + sizeof(struct h)))
196
197 #ifndef IP_OFFMASK
198 #define IP_OFFMASK      0x1fff
199 #endif
200
201 #if     BSD > 199306
202 # define        USE_QUAD_T
203 # define        U_QUAD_T        u_quad_t
204 # define        QUAD_T          quad_t
205 #else /* BSD > 199306 */
206 # define        U_QUAD_T        u_long
207 # define        QUAD_T          long
208 #endif /* BSD > 199306 */
209
210 #if defined(__DragonFly__)
211 # include <sys/param.h>
212 # ifdef IPFILTER_LKM
213 #  define       ACTUALLY_LKM_NOT_KERNEL
214 # endif
215 #endif
216
217 #if defined(__FreeBSD__) && (defined(KERNEL) || defined(_KERNEL))
218 # include <sys/param.h>
219 # ifndef __FreeBSD_version
220 #  ifdef IPFILTER_LKM
221 #   include <osreldate.h>
222 #  else
223 #   include <sys/osreldate.h>
224 #  endif
225 # endif
226 # ifdef IPFILTER_LKM
227 #  define       ACTUALLY_LKM_NOT_KERNEL
228 # endif
229 # if defined(__FreeBSD_version) && (__FreeBSD_version < 300000)
230 #  include <machine/spl.h>
231 # else
232 #  if (__FreeBSD_version >= 300000) && (__FreeBSD_version < 400000)
233 #   if defined(IPFILTER_LKM) && !defined(ACTUALLY_LKM_NOT_KERNEL)
234 #    define     ACTUALLY_LKM_NOT_KERNEL
235 #   endif
236 #  endif
237 # endif
238 #endif /* __FreeBSD__ && KERNEL */
239
240 #if defined(__DragonFly__) && defined(_KERNEL)
241 #include <sys/in_cksum.h>
242 #endif
243
244 /*
245  * These operating systems already take care of the problem for us.
246  */
247 #if defined(__DragonFly__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__) || \
248     defined(__sgi)
249 typedef u_int32_t       u_32_t;
250 # if defined(_KERNEL) && !defined(IPFILTER_LKM)
251 #  if defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 104110000)
252 #   include "opt_inet.h"
253 #  endif
254 #  if (defined(__DragonFly__) || defined(__FreeBSD_version) && (__FreeBSD_version >= 400000)) && \
255       !defined(KLD_MODULE)
256 #   include "opt_inet6.h"
257 #  endif
258 #  ifdef INET6
259 #   define USE_INET6     
260 #  endif   
261 # endif
262 # if !defined(_KERNEL) && !defined(IPFILTER_LKM) && !defined(USE_INET6)
263 #  if defined(__DragonFly__) || (defined(__FreeBSD_version) && (__FreeBSD_version >= 400000)) || \
264       (defined(OpenBSD) && (OpenBSD >= 200111)) || \
265       (defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 105000000))
266 #   define USE_INET6
267 #  endif
268 # endif
269 #else
270 /*
271  * Really, any arch where sizeof(long) != sizeof(int).
272  */
273 # if defined(__alpha__) || defined(__alpha) || defined(_LP64)
274 typedef unsigned int    u_32_t;
275 # else
276 #  if SOLARIS2 >= 6
277 typedef uint32_t        u_32_t;
278 #  else
279 typedef unsigned int    u_32_t;
280 #  endif
281 # endif
282 #endif /* __NetBSD__ || __OpenBSD__ || __FreeBSD__ || __sgi */
283
284 #ifdef  USE_INET6
285 # if defined(__DragonFly__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__)
286 #  include <netinet/ip6.h>
287 #  ifdef        _KERNEL
288 #   include <netinet6/ip6_var.h>
289 #  endif
290 typedef struct ip6_hdr  ip6_t;
291 # endif
292 # include <netinet/icmp6.h>
293 union   i6addr  {
294         u_32_t  i6[4];
295         struct  in_addr in4;
296         struct  in6_addr in6;
297 };
298 #else
299 union   i6addr  {
300         u_32_t  i6[4];
301         struct  in_addr in4;
302 };
303 #endif
304
305 #define IP6CMP(a,b)     bcmp((char *)&(a), (char *)&(b), sizeof(a))
306 #define IP6EQ(a,b)      (bcmp((char *)&(a), (char *)&(b), sizeof(a)) == 0)
307 #define IP6NEQ(a,b)     (bcmp((char *)&(a), (char *)&(b), sizeof(a)) != 0)
308 #define IP6_ISZERO(a)   ((((union i6addr *)(a))->i6[0] | \
309                           ((union i6addr *)(a))->i6[1] | \
310                           ((union i6addr *)(a))->i6[2] | \
311                           ((union i6addr *)(a))->i6[3]) == 0)
312 #define IP6_NOTZERO(a)  ((((union i6addr *)(a))->i6[0] | \
313                           ((union i6addr *)(a))->i6[1] | \
314                           ((union i6addr *)(a))->i6[2] | \
315                           ((union i6addr *)(a))->i6[3]) != 0)
316
317 #ifndef MAX
318 #define MAX(a,b)        (((a) > (b)) ? (a) : (b))
319 #endif
320
321 /*
322  * Security Options for Intenet Protocol (IPSO) as defined in RFC 1108.
323  *
324  * Basic Option
325  *
326  * 00000001   -   (Reserved 4)
327  * 00111101   -   Top Secret
328  * 01011010   -   Secret
329  * 10010110   -   Confidential
330  * 01100110   -   (Reserved 3)
331  * 11001100   -   (Reserved 2)
332  * 10101011   -   Unclassified
333  * 11110001   -   (Reserved 1)
334  */
335 #define IPSO_CLASS_RES4         0x01
336 #define IPSO_CLASS_TOPS         0x3d
337 #define IPSO_CLASS_SECR         0x5a
338 #define IPSO_CLASS_CONF         0x96
339 #define IPSO_CLASS_RES3         0x66
340 #define IPSO_CLASS_RES2         0xcc
341 #define IPSO_CLASS_UNCL         0xab
342 #define IPSO_CLASS_RES1         0xf1
343
344 #define IPSO_AUTH_GENSER        0x80
345 #define IPSO_AUTH_ESI           0x40
346 #define IPSO_AUTH_SCI           0x20
347 #define IPSO_AUTH_NSA           0x10
348 #define IPSO_AUTH_DOE           0x08
349 #define IPSO_AUTH_UN            0x06
350 #define IPSO_AUTH_FTE           0x01
351
352 /*
353  * IP option #defines
354  */
355 /*#define       IPOPT_RR        7 */
356 #define IPOPT_ZSU       10      /* ZSU */
357 #define IPOPT_MTUP      11      /* MTUP */
358 #define IPOPT_MTUR      12      /* MTUR */
359 #define IPOPT_ENCODE    15      /* ENCODE */
360 /*#define       IPOPT_TS        68 */
361 #define IPOPT_TR        82      /* TR */
362 /*#define       IPOPT_SECURITY  130 */
363 /*#define       IPOPT_LSRR      131 */
364 #define IPOPT_E_SEC     133     /* E-SEC */
365 #define IPOPT_CIPSO     134     /* CIPSO */
366 /*#define       IPOPT_SATID     136 */
367 #ifndef IPOPT_SID
368 # define        IPOPT_SID       IPOPT_SATID
369 #endif
370 /*#define       IPOPT_SSRR      137 */
371 #define IPOPT_ADDEXT    147     /* ADDEXT */
372 #define IPOPT_VISA      142     /* VISA */
373 #define IPOPT_IMITD     144     /* IMITD */
374 #define IPOPT_EIP       145     /* EIP */
375 #define IPOPT_FINN      205     /* FINN */
376
377 #ifndef TCPOPT_WSCALE
378 # define        TCPOPT_WSCALE   3
379 #endif
380
381 /*
382  * Build some macros and #defines to enable the same code to compile anywhere
383  * Well, that's the idea, anyway :-)
384  */
385 #if SOLARIS
386 typedef mblk_t mb_t;
387 # if SOLARIS2 >= 7
388 #  ifdef lint
389 #   define ALIGN32(ptr)    (ptr ? 0L : 0L)
390 #   define ALIGN16(ptr)    (ptr ? 0L : 0L)
391 #  else
392 #   define ALIGN32(ptr)    (ptr)
393 #   define ALIGN16(ptr)    (ptr)
394 #  endif
395 # endif
396 #else
397 typedef struct mbuf mb_t;
398 #endif /* SOLARIS */
399
400 #if !SOLARIS || (SOLARIS2 < 6) || !defined(KERNEL)
401 # define        ATOMIC_INCL             ATOMIC_INC
402 # define        ATOMIC_INC64            ATOMIC_INC
403 # define        ATOMIC_INC32            ATOMIC_INC
404 # define        ATOMIC_INC16            ATOMIC_INC
405 # define        ATOMIC_DECL             ATOMIC_DEC
406 # define        ATOMIC_DEC64            ATOMIC_DEC
407 # define        ATOMIC_DEC32            ATOMIC_DEC
408 # define        ATOMIC_DEC16            ATOMIC_DEC
409 #endif
410 #ifdef __sgi
411 # define  hz HZ
412 # include <sys/ksynch.h>
413 # define        IPF_LOCK_PL     plhi
414 # include <sys/sema.h>
415 #undef kmutex_t
416 typedef struct {
417         lock_t *l;
418         int pl;
419 } kmutex_t;
420 # undef MUTEX_INIT
421 # undef MUTEX_DESTROY
422 #endif
423 #ifdef KERNEL
424 # if SOLARIS
425 #  if SOLARIS2 >= 6
426 #   include <sys/atomic.h>
427 #   if SOLARIS2 == 6
428 #    define     ATOMIC_INCL(x)          atomic_add_long((uint32_t*)&(x), 1)
429 #    define     ATOMIC_DECL(x)          atomic_add_long((uint32_t*)&(x), -1)
430 #   else
431 #    define     ATOMIC_INCL(x)          atomic_add_long(&(x), 1)
432 #    define     ATOMIC_DECL(x)          atomic_add_long(&(x), -1)
433 #   endif
434 #   define      ATOMIC_INC64(x)         atomic_add_64((uint64_t*)&(x), 1)
435 #   define      ATOMIC_INC32(x)         atomic_add_32((uint32_t*)&(x), 1)
436 #   define      ATOMIC_INC16(x)         atomic_add_16((uint16_t*)&(x), 1)
437 #   define      ATOMIC_DEC64(x)         atomic_add_64((uint64_t*)&(x), -1)
438 #   define      ATOMIC_DEC32(x)         atomic_add_32((uint32_t*)&(x), -1)
439 #   define      ATOMIC_DEC16(x)         atomic_add_16((uint16_t*)&(x), -1)
440 #  else
441 #   define      IRE_CACHE               IRE_ROUTE
442 #   define      ATOMIC_INC(x)           { mutex_enter(&ipf_rw); (x)++; \
443                                           mutex_exit(&ipf_rw); }
444 #   define      ATOMIC_DEC(x)           { mutex_enter(&ipf_rw); (x)--; \
445                                           mutex_exit(&ipf_rw); }
446 #  endif
447 #  define       MUTEX_ENTER(x)          mutex_enter(x)
448 #  if 1
449 #   define      KRWLOCK_T               krwlock_t
450 #   define      READ_ENTER(x)           rw_enter(x, RW_READER)
451 #   define      WRITE_ENTER(x)          rw_enter(x, RW_WRITER)
452 #   define      RW_UPGRADE(x)           { if (rw_tryupgrade(x) == 0) { \
453                                               rw_exit(x); \
454                                               rw_enter(x, RW_WRITER); } \
455                                         }
456 #   define      MUTEX_DOWNGRADE(x)      rw_downgrade(x)
457 #   define      RWLOCK_INIT(x, y, z)    rw_init((x), (y), RW_DRIVER, (z))
458 #   define      RWLOCK_EXIT(x)          rw_exit(x)
459 #   define      RW_DESTROY(x)           rw_destroy(x)
460 #  else
461 #   define      KRWLOCK_T               kmutex_t
462 #   define      READ_ENTER(x)           mutex_enter(x)
463 #   define      WRITE_ENTER(x)          mutex_enter(x)
464 #   define      MUTEX_DOWNGRADE(x)      ;
465 #   define      RWLOCK_INIT(x, y, z)    mutex_init((x), (y), MUTEX_DRIVER, (z))
466 #   define      RWLOCK_EXIT(x)          mutex_exit(x)
467 #   define      RW_DESTROY(x)           mutex_destroy(x)
468 #  endif
469 #  define       MUTEX_INIT(x, y, z)     mutex_init((x), (y), MUTEX_DRIVER, (z))
470 #  define       MUTEX_DESTROY(x)        mutex_destroy(x)
471 #  define       MUTEX_EXIT(x)   mutex_exit(x)
472 #  define       MTOD(m,t)       (t)((m)->b_rptr)
473 #  define       IRCOPY(a,b,c)   copyin((caddr_t)(a), (caddr_t)(b), (c))
474 #  define       IWCOPY(a,b,c)   copyout((caddr_t)(a), (caddr_t)(b), (c))
475 #  define       IRCOPYPTR       ircopyptr
476 #  define       IWCOPYPTR       iwcopyptr
477 #  define       FREE_MB_T(m)    freemsg(m)
478 #  define       SPL_NET(x)      ;
479 #  define       SPL_IMP(x)      ;
480 #  undef        SPL_X
481 #  define       SPL_X(x)        ;
482 #  ifdef sparc
483 #   define      ntohs(x)        (x)
484 #   define      ntohl(x)        (x)
485 #   define      htons(x)        (x)
486 #   define      htonl(x)        (x)
487 #  endif /* sparc */
488 #  define       KMALLOC(a,b)    (a) = (b)kmem_alloc(sizeof(*(a)), KM_NOSLEEP)
489 #  define       KMALLOCS(a,b,c) (a) = (b)kmem_alloc((c), KM_NOSLEEP)
490 #  define       GET_MINOR(x)    getminor(x)
491 extern  ill_t   *get_unit (char *, int);
492 #  define       GETUNIT(n, v)   get_unit(n, v)
493 #  define       IFNAME(x)       ((ill_t *)x)->ill_name
494 # else /* SOLARIS */
495 #  if defined(__sgi)
496 #   define      ATOMIC_INC(x)           { MUTEX_ENTER(&ipf_rw); \
497                                           (x)++; MUTEX_EXIT(&ipf_rw); }
498 #   define      ATOMIC_DEC(x)           { MUTEX_ENTER(&ipf_rw); \
499                                           (x)--; MUTEX_EXIT(&ipf_rw); }
500 #   define      MUTEX_ENTER(x)          (x)->pl = LOCK((x)->l, IPF_LOCK_PL);
501 #   define      KRWLOCK_T               kmutex_t
502 #   define      READ_ENTER(x)           MUTEX_ENTER(x)
503 #   define      WRITE_ENTER(x)          MUTEX_ENTER(x)
504 #   define      RW_UPGRADE(x)           ;
505 #   define      MUTEX_DOWNGRADE(x)      ;
506 #   define      RWLOCK_EXIT(x)          MUTEX_EXIT(x)
507 #   define      MUTEX_EXIT(x)           UNLOCK((x)->l, (x)->pl);
508 #   define      MUTEX_INIT(x,y,z)       (x)->l = LOCK_ALLOC((uchar_t)-1, IPF_LOCK_PL, (lkinfo_t *)-1, KM_NOSLEEP)
509 #   define      MUTEX_DESTROY(x)        LOCK_DEALLOC((x)->l)
510 #  else /* __sgi */
511 #   define      ATOMIC_INC(x)           (x)++
512 #   define      ATOMIC_DEC(x)           (x)--
513 #   define      MUTEX_ENTER(x)          ;
514 #   define      READ_ENTER(x)           ;
515 #   define      WRITE_ENTER(x)          ;
516 #   define      RW_UPGRADE(x)           ;
517 #   define      MUTEX_DOWNGRADE(x)      ;
518 #   define      RWLOCK_EXIT(x)          ;
519 #   define      MUTEX_EXIT(x)           ;
520 #   define      MUTEX_INIT(x,y,z)       ;
521 #   define      MUTEX_DESTROY(x)        ;
522 #  endif /* __sgi */
523 #  ifndef linux
524 #   define      FREE_MB_T(m)    m_freem(m)
525 #   define      MTOD(m,t)       mtod(m,t)
526 #   define      M_BLEN(m)       (m)->m_len
527 #   define      IRCOPY(a,b,c)   (bcopy((a), (b), (c)), 0)
528 #   define      IWCOPY(a,b,c)   (bcopy((a), (b), (c)), 0)
529 #   define      IRCOPYPTR       ircopyptr
530 #   define      IWCOPYPTR       iwcopyptr
531 #  endif /* !linux */
532 # endif /* SOLARIS */
533
534 # ifdef sun
535 #  if !SOLARIS
536 #   include     <sys/time.h>
537 #   include     <sys/kmem_alloc.h>
538 #   define      GETUNIT(n, v)   ifunit(n, IFNAMSIZ)
539 #   define      IFNAME(x)       ((struct ifnet *)x)->if_name
540 #  endif
541 # else
542 #  ifndef       linux
543 #   define      GETUNIT(n, v)   ifunit(n)
544 #   if (defined(NetBSD) && (NetBSD <= 1991011) && (NetBSD >= 199606)) || \
545         (defined(OpenBSD) && (OpenBSD >= 199603)) || \
546         (defined(__DragonFly__))
547 #    define     IFNAME(x)       ((struct ifnet *)x)->if_xname
548 #   else
549 #    define     USE_GETIFNAME   1
550 #    define     IFNAME(x)       get_ifname((struct ifnet *)x)
551 extern  char    *get_ifname (struct ifnet *);
552 #   endif
553 #  endif
554 # endif /* sun */
555
556 # if defined(sun) && !defined(linux) || defined(__sgi)
557 #  define       UIOMOVE(a,b,c,d)        uiomove((caddr_t)a,b,c,d)
558 #  define       SLEEP(id, n)    sleep((id), 0)
559 #  define       WAKEUP(id)      wakeup(id)
560 #  define       KFREE(x)        kmem_free((char *)(x), sizeof(*(x)))
561 #  define       KFREES(x,s)     kmem_free((char *)(x), (s))
562 #  if !SOLARIS
563 extern  void    m_copydata (struct mbuf *, int, int, caddr_t);
564 extern  void    m_copyback (struct mbuf *, int, int, caddr_t);
565 #  endif
566 #  ifdef __sgi
567 #   include <sys/kmem.h>
568 #   include <sys/ddi.h>
569 #   define      KMALLOC(a,b)    (a) = (b)kmem_alloc(sizeof(*(a)), KM_NOSLEEP)
570 #   define      KMALLOCS(a,b,c) (a) = (b)kmem_alloc((c), KM_NOSLEEP)
571 #   define      GET_MINOR(x)    getminor(x)
572 #  else
573 #   if !SOLARIS
574 #    define     KMALLOC(a,b)    (a) = (b)new_kmem_alloc(sizeof(*(a)), \
575                                                         KMEM_NOSLEEP)
576 #    define     KMALLOCS(a,b,c) (a) = (b)new_kmem_alloc((c), KMEM_NOSLEEP)
577 #   endif /* SOLARIS */
578 #  endif /* __sgi */
579 # endif /* sun && !linux */
580 # ifndef        GET_MINOR
581 #  define       GET_MINOR(x)    minor(x)
582 # endif
583 # if (BSD >= 199306) || defined(__DragonFly__) || defined(__FreeBSD__)
584 #  if (defined(__NetBSD_Version__) && (__NetBSD_Version__ < 105180000)) || \
585        defined(__DragonFly__) || defined(__FreeBSD__) || (defined(OpenBSD) && (OpenBSD < 200206)) || \
586        defined(_BSDI_VERSION)
587 #   include <vm/vm.h>
588 #  endif
589 #  if !defined(__FreeBSD__) || (defined(__DragonFly__) || (defined (__FreeBSD_version) && \
590       (__FreeBSD_version >= 300000)))
591 #   if (defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 105180000)) || \
592        (defined(OpenBSD) && (OpenBSD >= 200111))
593 #    include <uvm/uvm_extern.h>
594 #   else
595 #    include <vm/vm_extern.h>
596 #   endif
597 #   include <sys/proc.h>
598 #  else /* !__FreeBSD__ || (__FreeBSD__ && __FreeBSD_version >= 300000) */
599 #   include <vm/vm_kern.h>
600 #  endif /* !__FreeBSD__ || (__FreeBSD__ && __FreeBSD_version >= 300000) */
601 #  ifdef        M_PFIL
602 #   define      KMALLOC(a, b)   MALLOC((a), b, sizeof(*(a)), M_PFIL, M_NOWAIT)
603 #   define      KMALLOCS(a, b, c)       MALLOC((a), b, (c), M_PFIL, M_NOWAIT)
604 #   define      KFREE(x)        FREE((x), M_PFIL)
605 #   define      KFREES(x,s)     FREE((x), M_PFIL)
606 #  else
607 #   define      KMALLOC(a, b)   MALLOC((a), b, sizeof(*(a)), M_TEMP, M_NOWAIT)
608 #   define      KMALLOCS(a, b, c)       MALLOC((a), b, (c), M_TEMP, M_NOWAIT)
609 #   define      KFREE(x)        FREE((x), M_TEMP)
610 #   define      KFREES(x,s)     FREE((x), M_TEMP)
611 #  endif /* M_PFIL */
612 #  define       UIOMOVE(a,b,c,d)        uiomove(a,b,d)
613 #  define       SLEEP(id, n)    tsleep((id), PCATCH, n, 0)
614 #  define       WAKEUP(id)      wakeup(id)
615 # endif /* BSD */
616 # if (defined(NetBSD) && (NetBSD <= 1991011) && (NetBSD >= 199407)) || \
617      (defined(OpenBSD) && (OpenBSD >= 200006))
618 #  define       SPL_NET(x)      x = splsoftnet()
619 #  define       SPL_X(x)        (void) splx(x)
620 # else
621 #  if defined(__DragonFly__)
622 #   define      SPL_NET(x)      crit_enter();
623 #   define      SPL_X(x)        crit_exit();
624 #  else /* __DragonFly__ */
625 #   if !SOLARIS && !defined(linux)
626 #    define     SPL_IMP(x)      x = splimp()
627 #    define     SPL_NET(x)      x = splnet()
628 #    define     SPL_X(x)        (void) splx(x)
629 #   endif
630 #  endif /* __DragonFly__ */
631 # endif /* NetBSD && (NetBSD <= 1991011) && (NetBSD >= 199407) */
632 # define        PANIC(x,y)      if (x) panic y
633 #else /* KERNEL */
634 # define        SLEEP(x,y)      1
635 # define        WAKEUP(x)       ;
636 # define        PANIC(x,y)      ;
637 # define        ATOMIC_INC(x)   (x)++
638 # define        ATOMIC_DEC(x)   (x)--
639 # define        MUTEX_ENTER(x)  ;
640 # define        READ_ENTER(x)   ;
641 # define        MUTEX_INIT(x,y,z)       ;
642 # define        MUTEX_DESTROY(x)        ;
643 # define        WRITE_ENTER(x)  ;
644 # define        RW_UPGRADE(x)   ;
645 # define        MUTEX_DOWNGRADE(x)      ;
646 # define        RWLOCK_EXIT(x)  ;
647 # define        MUTEX_EXIT(x)   ;
648 # define        SPL_NET(x)      ;
649 # define        SPL_IMP(x)      ;
650 # undef         SPL_X
651 # define        SPL_X(x)        ;
652 # define        KMALLOC(a,b)    (a) = (b)malloc(sizeof(*a))
653 # define        KMALLOCS(a,b,c) (a) = (b)malloc(c)
654 # define        KFREE(x)        free(x)
655 # define        KFREES(x,s)     free(x)
656 # define        FREE_MB_T(x)    ;
657 # define        GETUNIT(x, v)   get_unit(x,v)
658 # define        IRCOPY(a,b,c)   (bcopy((a), (b), (c)), 0)
659 # define        IWCOPY(a,b,c)   (bcopy((a), (b), (c)), 0)
660 # define        IRCOPYPTR       ircopyptr
661 # define        IWCOPYPTR       iwcopyptr
662 # define        IFNAME(x)       get_ifname((struct ifnet *)x)
663 # define        UIOMOVE(a,b,c,d)        ipfuiomove(a,b,c,d)
664 # include       <sys/time.h>
665 extern  void    m_copydata (mb_t *, int, int, caddr_t);
666 extern  int     ipfuiomove (caddr_t, int, int, struct uio *);
667 #endif /* KERNEL */
668
669 /*
670  * These #ifdef's are here mainly for linux, but who knows, they may
671  * not be in other places or maybe one day linux will grow up and some
672  * of these will turn up there too.
673  */
674 #ifndef ICMP_MINLEN
675 # define        ICMP_MINLEN     8
676 #endif
677 #ifndef ICMP_ECHOREPLY
678 # define        ICMP_ECHOREPLY  0
679 #endif
680 #ifndef ICMP_UNREACH
681 # define        ICMP_UNREACH    3
682 #endif
683 #ifndef ICMP_UNREACH_NET
684 # define        ICMP_UNREACH_NET        0
685 #endif
686 #ifndef ICMP_UNREACH_HOST
687 # define        ICMP_UNREACH_HOST       1
688 #endif
689 #ifndef ICMP_UNREACH_PROTOCOL
690 # define        ICMP_UNREACH_PROTOCOL   2
691 #endif
692 #ifndef ICMP_UNREACH_PORT
693 # define        ICMP_UNREACH_PORT       3
694 #endif
695 #ifndef ICMP_UNREACH_NEEDFRAG
696 # define        ICMP_UNREACH_NEEDFRAG   4
697 #endif
698 #ifndef ICMP_UNREACH_SRCFAIL
699 # define        ICMP_UNREACH_SRCFAIL    5
700 #endif
701 #ifndef ICMP_UNREACH_NET_UNKNOWN
702 # define        ICMP_UNREACH_NET_UNKNOWN        6
703 #endif
704 #ifndef ICMP_UNREACH_HOST_UNKNOWN
705 # define        ICMP_UNREACH_HOST_UNKNOWN       7
706 #endif
707 #ifndef ICMP_UNREACH_ISOLATED
708 # define        ICMP_UNREACH_ISOLATED   8
709 #endif
710 #ifndef ICMP_UNREACH_NET_PROHIB
711 # define        ICMP_UNREACH_NET_PROHIB 9
712 #endif
713 #ifndef ICMP_UNREACH_HOST_PROHIB
714 # define        ICMP_UNREACH_HOST_PROHIB        10
715 #endif
716 #ifndef ICMP_UNREACH_TOSNET
717 # define        ICMP_UNREACH_TOSNET     11
718 #endif
719 #ifndef ICMP_UNREACH_TOSHOST
720 # define        ICMP_UNREACH_TOSHOST    12
721 #endif
722 #ifndef ICMP_UNREACH_ADMIN_PROHIBIT
723 # define        ICMP_UNREACH_ADMIN_PROHIBIT     13
724 #endif
725 #ifndef ICMP_UNREACH_HOST_PRECEDENCE
726 # define        ICMP_UNREACH_HOST_PRECEDENCE    14
727 #endif
728 #ifndef ICMP_UNREACH_PRECEDENCE_CUTOFF
729 # define        ICMP_UNREACH_PRECEDENCE_CUTOFF  15
730 #endif
731 #ifndef ICMP_SOURCEQUENCH
732 # define        ICMP_SOURCEQUENCH       4
733 #endif
734 #ifndef ICMP_REDIRECT_NET
735 # define        ICMP_REDIRECT_NET       0
736 #endif
737 #ifndef ICMP_REDIRECT_HOST
738 # define        ICMP_REDIRECT_HOST      1
739 #endif
740 #ifndef ICMP_REDIRECT_TOSNET
741 # define        ICMP_REDIRECT_TOSNET    2
742 #endif
743 #ifndef ICMP_REDIRECT_TOSHOST
744 # define        ICMP_REDIRECT_TOSHOST   3
745 #endif
746 #ifndef ICMP_ALTHOSTADDR
747 # define        ICMP_ALTHOSTADDR        6
748 #endif
749 #ifndef ICMP_TIMXCEED
750 # define        ICMP_TIMXCEED   11
751 #endif
752 #ifndef ICMP_TIMXCEED_INTRANS
753 # define        ICMP_TIMXCEED_INTRANS   0
754 #endif
755 #ifndef ICMP_TIMXCEED_REASS
756 # define                ICMP_TIMXCEED_REASS     1
757 #endif
758 #ifndef ICMP_PARAMPROB
759 # define        ICMP_PARAMPROB  12
760 #endif
761 #ifndef ICMP_PARAMPROB_ERRATPTR
762 # define        ICMP_PARAMPROB_ERRATPTR 0
763 #endif
764 #ifndef ICMP_PARAMPROB_OPTABSENT
765 # define        ICMP_PARAMPROB_OPTABSENT        1
766 #endif
767 #ifndef ICMP_PARAMPROB_LENGTH
768 # define        ICMP_PARAMPROB_LENGTH   2
769 #endif
770 #ifndef ICMP_TSTAMP
771 # define        ICMP_TSTAMP     13
772 #endif
773 #ifndef ICMP_TSTAMPREPLY
774 # define        ICMP_TSTAMPREPLY        14
775 #endif
776 #ifndef ICMP_IREQ
777 # define        ICMP_IREQ       15
778 #endif
779 #ifndef ICMP_IREQREPLY
780 # define        ICMP_IREQREPLY  16
781 #endif
782 #ifndef ICMP_MASKREQ
783 # define        ICMP_MASKREQ    17
784 #endif
785 #ifndef ICMP_MASKREPLY
786 # define        ICMP_MASKREPLY  18
787 #endif
788 #ifndef ICMP_TRACEROUTE
789 # define        ICMP_TRACEROUTE 30
790 #endif
791 #ifndef ICMP_DATACONVERR
792 # define        ICMP_DATACONVERR        31
793 #endif
794 #ifndef ICMP_MOBILE_REDIRECT
795 # define        ICMP_MOBILE_REDIRECT    32
796 #endif
797 #ifndef ICMP_IPV6_WHEREAREYOU
798 # define        ICMP_IPV6_WHEREAREYOU   33
799 #endif
800 #ifndef ICMP_IPV6_IAMHERE
801 # define        ICMP_IPV6_IAMHERE       34
802 #endif
803 #ifndef ICMP_MOBILE_REGREQUEST
804 # define        ICMP_MOBILE_REGREQUEST  35
805 #endif
806 #ifndef ICMP_MOBILE_REGREPLY
807 # define        ICMP_MOBILE_REGREPLY    36
808 #endif
809 #ifndef ICMP_SKIP
810 # define        ICMP_SKIP       39
811 #endif
812 #ifndef ICMP_PHOTURIS
813 # define        ICMP_PHOTURIS   40
814 #endif
815 #ifndef ICMP_PHOTURIS_UNKNOWN_INDEX
816 # define        ICMP_PHOTURIS_UNKNOWN_INDEX     1
817 #endif
818 #ifndef ICMP_PHOTURIS_AUTH_FAILED
819 # define        ICMP_PHOTURIS_AUTH_FAILED       2
820 #endif
821 #ifndef ICMP_PHOTURIS_DECRYPT_FAILED
822 # define        ICMP_PHOTURIS_DECRYPT_FAILED    3
823 #endif
824 #ifndef IPVERSION
825 # define        IPVERSION       4
826 #endif
827 #ifndef IPOPT_MINOFF
828 # define        IPOPT_MINOFF    4
829 #endif
830 #ifndef IPOPT_COPIED
831 # define        IPOPT_COPIED(x) ((x)&0x80)
832 #endif
833 #ifndef IPOPT_EOL
834 # define        IPOPT_EOL       0
835 #endif
836 #ifndef IPOPT_NOP
837 # define        IPOPT_NOP       1
838 #endif
839 #ifndef IP_MF
840 # define        IP_MF   ((u_short)0x2000)
841 #endif
842 #ifndef ETHERTYPE_IP
843 # define        ETHERTYPE_IP    ((u_short)0x0800)
844 #endif
845 #ifndef TH_FIN
846 # define        TH_FIN  0x01
847 #endif
848 #ifndef TH_SYN
849 # define        TH_SYN  0x02
850 #endif
851 #ifndef TH_RST
852 # define        TH_RST  0x04
853 #endif
854 #ifndef TH_PUSH
855 # define        TH_PUSH 0x08
856 #endif
857 #ifndef TH_ACK
858 # define        TH_ACK  0x10
859 #endif
860 #ifndef TH_URG
861 # define        TH_URG  0x20
862 #endif
863 #ifndef IPOPT_EOL
864 # define        IPOPT_EOL       0
865 #endif
866 #ifndef IPOPT_NOP
867 # define        IPOPT_NOP       1
868 #endif
869 #ifndef IPOPT_RR
870 # define        IPOPT_RR        7
871 #endif
872 #ifndef IPOPT_TS
873 # define        IPOPT_TS        68
874 #endif
875 #ifndef IPOPT_SECURITY
876 # define        IPOPT_SECURITY  130
877 #endif
878 #ifndef IPOPT_LSRR
879 # define        IPOPT_LSRR      131
880 #endif
881 #ifndef IPOPT_SATID
882 # define        IPOPT_SATID     136
883 #endif
884 #ifndef IPOPT_SSRR
885 # define        IPOPT_SSRR      137
886 #endif
887 #ifndef IPOPT_SECUR_UNCLASS
888 # define        IPOPT_SECUR_UNCLASS     ((u_short)0x0000)
889 #endif
890 #ifndef IPOPT_SECUR_CONFID
891 # define        IPOPT_SECUR_CONFID      ((u_short)0xf135)
892 #endif
893 #ifndef IPOPT_SECUR_EFTO
894 # define        IPOPT_SECUR_EFTO        ((u_short)0x789a)
895 #endif
896 #ifndef IPOPT_SECUR_MMMM
897 # define        IPOPT_SECUR_MMMM        ((u_short)0xbc4d)
898 #endif
899 #ifndef IPOPT_SECUR_RESTR
900 # define        IPOPT_SECUR_RESTR       ((u_short)0xaf13)
901 #endif
902 #ifndef IPOPT_SECUR_SECRET
903 # define        IPOPT_SECUR_SECRET      ((u_short)0xd788)
904 #endif
905 #ifndef IPOPT_SECUR_TOPSECRET
906 # define        IPOPT_SECUR_TOPSECRET   ((u_short)0x6bc5)
907 #endif
908 #ifndef IPOPT_OLEN
909 # define        IPOPT_OLEN      1
910 #endif
911 #ifndef IPPROTO_GRE
912 # define        IPPROTO_GRE     47      /* GRE encaps RFC 1701 */
913 #endif
914 #ifndef IPPROTO_ESP
915 # define        IPPROTO_ESP     50
916 #endif
917 #ifndef IPPROTO_ICMPV6
918 # define        IPPROTO_ICMPV6  58
919 #endif
920
921 #ifdef  linux
922 #include <linux/in_systm.h>
923 /*
924  * TCP States
925  */
926 #define TCPS_CLOSED             0       /* closed */
927 #define TCPS_LISTEN             1       /* listening for connection */
928 #define TCPS_SYN_SENT           2       /* active, have sent syn */
929 #define TCPS_SYN_RECEIVED       3       /* have send and received syn */
930 /* states < TCPS_ESTABLISHED are those where connections not established */
931 #define TCPS_ESTABLISHED        4       /* established */
932 #define TCPS_CLOSE_WAIT         5       /* rcvd fin, waiting for close */
933 /* states > TCPS_CLOSE_WAIT are those where user has closed */
934 #define TCPS_FIN_WAIT_1         6       /* have closed, sent fin */
935 #define TCPS_CLOSING            7       /* closed xchd FIN; await FIN ACK */
936 #define TCPS_LAST_ACK           8       /* had fin and close; await FIN ACK */
937 /* states > TCPS_CLOSE_WAIT && < TCPS_FIN_WAIT_2 await ACK of FIN */
938 #define TCPS_FIN_WAIT_2         9       /* have closed, fin is acked */
939 #define TCPS_TIME_WAIT          10      /* in 2*msl quiet wait after close */
940
941 /*
942  * file flags.
943  */
944 #ifdef WRITE
945 #define FWRITE  WRITE
946 #define FREAD   READ
947 #else
948 #define FWRITE  _IOC_WRITE
949 #define FREAD   _IOC_READ
950 #endif
951 /*
952  * mbuf related problems.
953  */
954 #define mtod(m,t)       (t)((m)->data)
955 #define m_len           len
956 #define m_next          next
957
958 #ifdef  IP_DF
959 #undef  IP_DF
960 #endif
961 #define IP_DF           0x4000
962
963 typedef struct  {
964         __u16   th_sport;
965         __u16   th_dport;
966         __u32   th_seq;
967         __u32   th_ack;
968 # if defined(__i386__) || defined(__MIPSEL__) || defined(__alpha__) ||\
969     defined(__vax__)
970         __u8    th_res:4;
971         __u8    th_off:4;
972 #else
973         __u8    th_off:4;
974         __u8    th_res:4;
975 #endif
976         __u8    th_flags;
977         __u16   th_win;
978         __u16   th_sum;
979         __u16   th_urp;
980 } tcphdr_t;
981
982 typedef struct  {
983         __u16   uh_sport;
984         __u16   uh_dport;
985         __u16   uh_ulen;
986         __u16   uh_sum;
987 } udphdr_t;
988
989 typedef struct  {
990 # if defined(__i386__) || defined(__MIPSEL__) || defined(__alpha__) ||\
991     defined(__vax__)
992         __u8    ip_hl:4;
993         __u8    ip_v:4;
994 # else
995         __u8    ip_v:4;
996         __u8    ip_hl:4;
997 # endif
998         __u8    ip_tos;
999         __u16   ip_len;
1000         __u16   ip_id;
1001         __u16   ip_off;
1002         __u8    ip_ttl;
1003         __u8    ip_p;
1004         __u16   ip_sum;
1005         struct  in_addr ip_src;
1006         struct  in_addr ip_dst;
1007 } ip_t;
1008
1009 /*
1010  * Structure of an icmp header.
1011  */
1012 typedef struct icmp {
1013         __u8    icmp_type;              /* type of message, see below */
1014         __u8    icmp_code;              /* type sub code */
1015         __u16   icmp_cksum;             /* ones complement cksum of struct */
1016         union {
1017                 __u8    ih_pptr;                /* ICMP_PARAMPROB */
1018                 struct  in_addr ih_gwaddr;      /* ICMP_REDIRECT */
1019                 struct  ih_idseq {
1020                         __u16   icd_id;
1021                         __u16   icd_seq;
1022                 } ih_idseq;
1023                 int ih_void;
1024         } icmp_hun;
1025 # define        icmp_pptr       icmp_hun.ih_pptr
1026 # define        icmp_gwaddr     icmp_hun.ih_gwaddr
1027 # define        icmp_id         icmp_hun.ih_idseq.icd_id
1028 # define        icmp_seq        icmp_hun.ih_idseq.icd_seq
1029 # define        icmp_void       icmp_hun.ih_void
1030         union {
1031                 struct id_ts {
1032                         n_time its_otime;
1033                         n_time its_rtime;
1034                         n_time its_ttime;
1035                 } id_ts;
1036                 struct id_ip  {
1037                         ip_t idi_ip;
1038                         /* options and then 64 bits of data */
1039                 } id_ip;
1040                 u_long  id_mask;
1041                 char    id_data[1];
1042         } icmp_dun;
1043 # define        icmp_otime      icmp_dun.id_ts.its_otime
1044 # define        icmp_rtime      icmp_dun.id_ts.its_rtime
1045 # define        icmp_ttime      icmp_dun.id_ts.its_ttime
1046 # define        icmp_ip         icmp_dun.id_ip.idi_ip
1047 # define        icmp_mask       icmp_dun.id_mask
1048 # define        icmp_data       icmp_dun.id_data
1049 } icmphdr_t;
1050
1051 # ifndef LINUX_IPOVLY
1052 #  define LINUX_IPOVLY
1053 struct ipovly {
1054         caddr_t ih_next, ih_prev;       /* for protocol sequence q's */
1055         u_char  ih_x1;                  /* (unused) */
1056         u_char  ih_pr;                  /* protocol */
1057         short   ih_len;                 /* protocol length */
1058         struct  in_addr ih_src;         /* source internet address */
1059         struct  in_addr ih_dst;         /* destination internet address */
1060 };
1061 # endif
1062
1063 typedef struct  {
1064         __u8    ether_dhost[6];
1065         __u8    ether_shost[6];
1066         __u16   ether_type;
1067 } ether_header_t;
1068
1069 typedef struct  uio     {
1070         int     uio_resid;
1071         int     uio_rw;
1072         caddr_t uio_buf;
1073 } uio_t;
1074
1075 # define        UIO_READ        0
1076 # define        UIO_WRITE       1
1077 # define        UIOMOVE(a, b, c, d)     uiomove(a,b,c,d)
1078
1079 /*
1080  * For masking struct ifnet onto struct device
1081  */
1082 # define        if_name name
1083
1084 # ifdef KERNEL
1085 #  define       GETUNIT(x, v)   dev_get(x)
1086 #  define       FREE_MB_T(m)    kfree_skb(m, FREE_WRITE)
1087 #  define       uniqtime        do_gettimeofday
1088 #  undef INT_MAX
1089 #  undef UINT_MAX
1090 #  undef LONG_MAX
1091 #  undef ULONG_MAX
1092 #  include <linux/netdevice.h>
1093 #  define       SPL_X(x)
1094 #  define       SPL_NET(x)
1095 #  define       SPL_IMP(x)
1096  
1097 #  define       bcmp(a,b,c)     memcmp(a,b,c)
1098 #  define       bcopy(a,b,c)    memcpy(b,a,c)
1099 #  define       bzero(a,c)      memset(a,0,c)
1100
1101 #  define       UNITNAME(n)     dev_get((n))
1102
1103 #  define       KMALLOC(a,b)    (a) = (b)kmalloc(sizeof(*(a)), GFP_ATOMIC)
1104 #  define       KMALLOCS(a,b,c) (a) = (b)kmalloc((c), GFP_ATOMIC)
1105 #  define       KFREE(x)        kfree_s((x), sizeof(*(x)))
1106 #  define       KFREES(x,s)     kfree_s((x), (s))
1107 #define IRCOPY(const void *a, void *b, size_t c)        { \
1108         int error; \
1109
1110         error = verify_area(VERIFY_READ, a ,c); \
1111         if (!error) \
1112                 memcpy_fromfs(b, a, c); \
1113         return error; \
1114 }
1115 static inline int IWCOPY(const void *a, void *b, size_t c)
1116 {
1117         int error;
1118
1119         error = verify_area(VERIFY_WRITE, b, c);
1120         if (!error)
1121                 memcpy_tofs(b, a, c);
1122         return error;
1123 }
1124 static inline int IRCOPYPTR(const void *a, void *b, size_t c) {
1125         caddr_t ca;
1126         int     error;
1127
1128         error = verify_area(VERIFY_READ, a ,sizeof(ca));
1129         if (!error) {
1130                 memcpy_fromfs(ca, a, sizeof(ca));
1131                 error = verify_area(VERIFY_READ, ca , c);
1132                 if (!error)
1133                         memcpy_fromfs(b, ca, c);
1134         }
1135         return error;
1136 }
1137 static inline int IWCOPYPTR(const void *a, void *b, size_t c) {
1138         caddr_t ca;
1139         int     error;
1140
1141
1142         error = verify_area(VERIFY_READ, b ,sizeof(ca));
1143         if (!error) {
1144                 memcpy_fromfs(ca, b, sizeof(ca));
1145                 error = verify_area(VERIFY_WRITE, ca, c);
1146                 if (!error)
1147                         memcpy_tofs(ca, a, c);
1148         }
1149         return error;
1150 }
1151 # else
1152 #  define       __KERNEL__
1153 #  undef INT_MAX
1154 #  undef UINT_MAX
1155 #  undef LONG_MAX
1156 #  undef ULONG_MAX
1157 #  define       s8 __s8
1158 #  define       u8 __u8
1159 #  define       s16 __s16
1160 #  define       u16 __u16
1161 #  define       s32 __s32
1162 #  define       u32 __u32
1163 #  include <linux/netdevice.h>
1164 #  undef        __KERNEL__
1165 # endif
1166 # define        ifnet   device
1167 #else
1168 typedef struct  tcphdr  tcphdr_t;
1169 typedef struct  udphdr  udphdr_t;
1170 typedef struct  icmp    icmphdr_t;
1171 typedef struct  ip      ip_t;
1172 typedef struct  ether_header    ether_header_t;
1173 #endif /* linux */
1174 typedef struct  tcpiphdr        tcpiphdr_t;
1175
1176 #if defined(hpux) || defined(linux)
1177 struct  ether_addr      {
1178         char    ether_addr_octet[6];
1179 };
1180 #endif
1181
1182 /*
1183  * XXX - This is one of those *awful* hacks which nobody likes
1184  */
1185 #ifdef  ultrix
1186 #define A_A
1187 #else
1188 #define A_A     &
1189 #endif
1190
1191 #if (BSD >= 199306) && !defined(m_act)
1192 # define        m_act   m_nextpkt
1193 #endif
1194
1195 #ifndef ICMP_ROUTERADVERT
1196 # define        ICMP_ROUTERADVERT       9
1197 #endif
1198 #ifndef ICMP_ROUTERSOLICIT
1199 # define        ICMP_ROUTERSOLICIT      10
1200 #endif
1201 #undef  ICMP_MAX_UNREACH
1202 #define ICMP_MAX_UNREACH        14
1203 #undef  ICMP_MAXTYPE
1204 #define ICMP_MAXTYPE            18
1205 /*
1206  * ICMP error replies have an IP header (20 bytes), 8 bytes of ICMP data,
1207  * another IP header and then 64 bits of data, totalling 56.  Of course,
1208  * the last 64 bits is dependant on that being available.
1209  */
1210 #define ICMPERR_ICMPHLEN        8
1211 #define ICMPERR_IPICMPHLEN      (20 + 8)
1212 #define ICMPERR_MINPKTLEN       (20 + 8 + 20)
1213 #define ICMPERR_MAXPKTLEN       (20 + 8 + 20 + 8)
1214 #define ICMP6_MINLEN            8
1215 #define ICMP6ERR_IPICMPHLEN     (40 + 8)
1216 #define ICMP6ERR_MINPKTLEN      (40 + 8 + 40)
1217
1218 #ifndef ICMP6_DST_UNREACH
1219 # define        ICMP6_DST_UNREACH       1
1220 #endif
1221 #ifndef ICMP6_PACKET_TOO_BIG
1222 # define        ICMP6_PACKET_TOO_BIG    2
1223 #endif
1224 #ifndef ICMP6_TIME_EXCEEDED
1225 # define        ICMP6_TIME_EXCEEDED     3
1226 #endif
1227 #ifndef ICMP6_PARAM_PROB
1228 # define        ICMP6_PARAM_PROB        4
1229 #endif
1230
1231 #ifndef ICMP6_ECHO_REQUEST
1232 # define        ICMP6_ECHO_REQUEST      128
1233 #endif
1234 #ifndef ICMP6_ECHO_REPLY
1235 # define        ICMP6_ECHO_REPLY        129
1236 #endif
1237 #ifndef ICMP6_MEMBERSHIP_QUERY
1238 # define        ICMP6_MEMBERSHIP_QUERY  130
1239 #endif
1240 #ifndef MLD6_LISTENER_QUERY
1241 # define        MLD6_LISTENER_QUERY     130
1242 #endif
1243 #ifndef ICMP6_MEMBERSHIP_REPORT
1244 # define        ICMP6_MEMBERSHIP_REPORT 131
1245 #endif
1246 #ifndef MLD6_LISTENER_REPORT
1247 # define        MLD6_LISTENER_REPORT    131
1248 #endif
1249 #ifndef ICMP6_MEMBERSHIP_REDUCTION
1250 # define        ICMP6_MEMBERSHIP_REDUCTION      132
1251 #endif
1252 #ifndef MLD6_LISTENER_DONE
1253 # define        MLD6_LISTENER_DONE      132
1254 #endif
1255 #ifndef ND_ROUTER_SOLICIT
1256 # define        ND_ROUTER_SOLICIT       133
1257 #endif
1258 #ifndef ND_ROUTER_ADVERT
1259 # define        ND_ROUTER_ADVERT        134
1260 #endif
1261 #ifndef ND_NEIGHBOR_SOLICIT
1262 # define        ND_NEIGHBOR_SOLICIT     135
1263 #endif
1264 #ifndef ND_NEIGHBOR_ADVERT
1265 # define        ND_NEIGHBOR_ADVERT      136
1266 #endif
1267 #ifndef ND_REDIRECT
1268 # define        ND_REDIRECT     137
1269 #endif
1270 #ifndef ICMP6_ROUTER_RENUMBERING
1271 # define        ICMP6_ROUTER_RENUMBERING        138
1272 #endif
1273 #ifndef ICMP6_WRUREQUEST
1274 # define        ICMP6_WRUREQUEST        139
1275 #endif
1276 #ifndef ICMP6_WRUREPLY
1277 # define        ICMP6_WRUREPLY          140
1278 #endif
1279 #ifndef ICMP6_FQDN_QUERY
1280 # define        ICMP6_FQDN_QUERY        139
1281 #endif
1282 #ifndef ICMP6_FQDN_REPLY
1283 # define        ICMP6_FQDN_REPLY        140
1284 #endif
1285 #ifndef ICMP6_NI_QUERY
1286 # define        ICMP6_NI_QUERY          139
1287 #endif
1288 #ifndef ICMP6_NI_REPLY
1289 # define        ICMP6_NI_REPLY          140
1290 #endif
1291 #ifndef MLD6_MTRACE_RESP
1292 # define        MLD6_MTRACE_RESP        200
1293 #endif
1294 #ifndef MLD6_MTRACE
1295 # define        MLD6_MTRACE             201
1296 #endif
1297 #ifndef ICMP6_HADISCOV_REQUEST
1298 # define        ICMP6_HADISCOV_REQUEST  202
1299 #endif
1300 #ifndef ICMP6_HADISCOV_REPLY
1301 # define        ICMP6_HADISCOV_REPLY    203
1302 #endif
1303 #ifndef ICMP6_MOBILEPREFIX_SOLICIT
1304 # define        ICMP6_MOBILEPREFIX_SOLICIT      204
1305 #endif
1306 #ifndef ICMP6_MOBILEPREFIX_ADVERT
1307 # define        ICMP6_MOBILEPREFIX_ADVERT       205
1308 #endif
1309 #ifndef ICMP6_MAXTYPE
1310 # define        ICMP6_MAXTYPE           205
1311 #endif
1312
1313 #ifndef ICMP6_DST_UNREACH_NOROUTE
1314 # define        ICMP6_DST_UNREACH_NOROUTE       0
1315 #endif
1316 #ifndef ICMP6_DST_UNREACH_ADMIN
1317 # define        ICMP6_DST_UNREACH_ADMIN         1
1318 #endif
1319 #ifndef ICMP6_DST_UNREACH_NOTNEIGHBOR
1320 # define        ICMP6_DST_UNREACH_NOTNEIGHBOR   2
1321 #endif
1322 #ifndef ICMP6_DST_UNREACH_BEYONDSCOPE
1323 # define        ICMP6_DST_UNREACH_BEYONDSCOPE   2
1324 #endif
1325 #ifndef ICMP6_DST_UNREACH_ADDR
1326 # define        ICMP6_DST_UNREACH_ADDR          3
1327 #endif
1328 #ifndef ICMP6_DST_UNREACH_NOPORT
1329 # define        ICMP6_DST_UNREACH_NOPORT        4
1330 #endif
1331 #ifndef ICMP6_TIME_EXCEED_TRANSIT
1332 # define        ICMP6_TIME_EXCEED_TRANSIT       0
1333 #endif
1334 #ifndef ICMP6_TIME_EXCEED_REASSEMBLY
1335 # define        ICMP6_TIME_EXCEED_REASSEMBLY    1
1336 #endif
1337
1338 #ifndef ICMP6_NI_SUCCESS
1339 # define        ICMP6_NI_SUCCESS        0
1340 #endif
1341 #ifndef ICMP6_NI_REFUSED
1342 # define        ICMP6_NI_REFUSED        1
1343 #endif
1344 #ifndef ICMP6_NI_UNKNOWN
1345 # define        ICMP6_NI_UNKNOWN        2
1346 #endif
1347
1348 #ifndef ICMP6_ROUTER_RENUMBERING_COMMAND
1349 # define        ICMP6_ROUTER_RENUMBERING_COMMAND        0
1350 #endif
1351 #ifndef ICMP6_ROUTER_RENUMBERING_RESULT
1352 # define        ICMP6_ROUTER_RENUMBERING_RESULT 1
1353 #endif
1354 #ifndef ICMP6_ROUTER_RENUMBERING_SEQNUM_RESET
1355 # define        ICMP6_ROUTER_RENUMBERING_SEQNUM_RESET   255
1356 #endif
1357
1358 #ifndef ICMP6_PARAMPROB_HEADER
1359 # define        ICMP6_PARAMPROB_HEADER  0
1360 #endif
1361 #ifndef ICMP6_PARAMPROB_NEXTHEADER
1362 # define        ICMP6_PARAMPROB_NEXTHEADER      1
1363 #endif
1364 #ifndef ICMP6_PARAMPROB_OPTION
1365 # define        ICMP6_PARAMPROB_OPTION  2
1366 #endif
1367
1368 #ifndef ICMP6_NI_SUBJ_IPV6
1369 # define        ICMP6_NI_SUBJ_IPV6      0
1370 #endif
1371 #ifndef ICMP6_NI_SUBJ_FQDN
1372 # define        ICMP6_NI_SUBJ_FQDN      1
1373 #endif
1374 #ifndef ICMP6_NI_SUBJ_IPV4
1375 # define        ICMP6_NI_SUBJ_IPV4      2
1376 #endif
1377
1378 /*
1379  * ECN is a new addition to TCP - RFC 2481
1380  */
1381 #ifndef TH_ECN
1382 # define        TH_ECN  0x40
1383 #endif
1384 #ifndef TH_CWR
1385 # define        TH_CWR  0x80
1386 #endif
1387 #define TH_ECNALL       (TH_ECN|TH_CWR)
1388
1389 #define TCPF_ALL (TH_FIN|TH_SYN|TH_RST|TH_PUSH|TH_ACK|TH_URG|TH_ECN|TH_CWR)
1390
1391 #endif  /* __IP_COMPAT_H__ */