xref: /xnu-10002.81.5/bsd/netinet/ip_compat.h (revision 5e3eaea39dcf651e66cb99ba7d70e32cc4a99587)
1 /*
2  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 /*
29  * Copyright (C) 1993-1997 by Darren Reed.
30  *
31  * Redistribution and use in source and binary forms are permitted
32  * provided that this notice is preserved and due credit is given
33  * to the original author and the contributors.
34  *
35  * @(#)ip_compat.h	1.8 1/14/96
36  */
37 #ifndef DRIVERKIT
38 #include <sys/appleapiopts.h>
39 #endif /* DRIVERKIT */
40 
41 #if 0
42 
43 #ifndef __IP_COMPAT_H__
44 #define __IP_COMPAT_H__
45 
46 #ifndef __STDC__
47 # define        const
48 #endif
49 
50 #ifndef SOLARIS
51 #define SOLARIS (defined(sun) && (defined(__svr4__) || defined(__SVR4)))
52 #endif
53 
54 #if defined(_KERNEL) && !defined(KERNEL)
55 # define        KERNEL
56 #endif
57 #if defined(KERNEL) && !defined(_KERNEL)
58 # define        _KERNEL
59 #endif
60 #if!defined(__KERNEL__) && defined(KERNEL)
61 # define        __KERNEL__
62 #endif
63 
64 #if defined(__SVR4) || defined(__svr4__) || defined(__sgi)
65 #define index   strchr
66 # if !defined(_KERNEL)
67 #  define       bzero(a, b)      memset(a,0,b)
68 #  define       bcmp            memcmp
69 #  define       bcopy(a, b, c)    memmove(b,a,c)
70 # endif
71 #endif
72 
73 struct  ether_addr {
74 	u_char  ether_addr_octet[6];
75 };
76 
77 #ifdef  linux
78 # include <sys/sysmacros.h>
79 #endif
80 #if     SOLARIS
81 # define        MTYPE(m)        ((m)->b_datap->db_type)
82 # include       <sys/ioccom.h>
83 # include       <sys/sysmacros.h>
84 # include       <sys/kmem.h>
85 /*
86  * because Solaris 2 defines these in two places :-/
87  */
88 # undef IPOPT_EOL
89 # undef IPOPT_NOP
90 # undef IPOPT_LSRR
91 # undef IPOPT_RR
92 # undef IPOPT_SSRR
93 # ifndef        _KERNEL
94 #  define       _KERNEL
95 #  undef        RES_INIT
96 #  include <inet/common.h>
97 #  include <inet/ip.h>
98 #  include <inet/ip_ire.h>
99 #  undef        _KERNEL
100 # else /* _KERNEL */
101 #  include <inet/common.h>
102 #  include <inet/ip.h>
103 #  include <inet/ip_ire.h>
104 # endif /* _KERNEL */
105 #endif /* SOLARIS */
106 #define IPMINLEN(i, h)  ((i)->ip_len >= ((i)->ip_hl * 4 + sizeof(struct h)))
107 
108 #ifndef IP_OFFMASK
109 #define IP_OFFMASK      0x1fff
110 #endif
111 
112 #if     BSD > 199306
113 # define        USE_QUAD_T
114 # define        U_QUAD_T        u_quad_t
115 # define        QUAD_T          quad_t
116 #else /* BSD > 199306 */
117 # define        U_QUAD_T        u_int32_t
118 # define        QUAD_T          long
119 #endif /* BSD > 199306 */
120 
121 /*
122  * These operating systems already take care of the problem for us.
123  */
124 #if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__) || \
125         defined(__sgi)
126 typedef u_int32_t       u_32_t;
127 #else
128 /*
129  * Really, any arch where sizeof(long) != sizeof(int).
130  */
131 # if defined(__alpha__) || defined(__alpha)
132 typedef unsigned int    u_32_t;
133 # else
134 typedef u_int32_t   u_32_t;
135 # endif
136 #endif /* __NetBSD__ || __OpenBSD__ || __FreeBSD__ || __sgi */
137 
138 #ifndef MAX
139 #define MAX(a, b)        (((a) > (b)) ? (a) : (b))
140 #endif
141 
142 /*
143  * Security Options for Intenet Protocol (IPSO) as defined in RFC 1108.
144  *
145  * Basic Option
146  *
147  * 00000001   -   (Reserved 4)
148  * 00111101   -   Top Secret
149  * 01011010   -   Secret
150  * 10010110   -   Confidential
151  * 01100110   -   (Reserved 3)
152  * 11001100   -   (Reserved 2)
153  * 10101011   -   Unclassified
154  * 11110001   -   (Reserved 1)
155  */
156 #define IPSO_CLASS_RES4         0x01
157 #define IPSO_CLASS_TOPS         0x3d
158 #define IPSO_CLASS_SECR         0x5a
159 #define IPSO_CLASS_CONF         0x96
160 #define IPSO_CLASS_RES3         0x66
161 #define IPSO_CLASS_RES2         0xcc
162 #define IPSO_CLASS_UNCL         0xab
163 #define IPSO_CLASS_RES1         0xf1
164 
165 #define IPSO_AUTH_GENSER        0x80
166 #define IPSO_AUTH_ESI           0x40
167 #define IPSO_AUTH_SCI           0x20
168 #define IPSO_AUTH_NSA           0x10
169 #define IPSO_AUTH_DOE           0x08
170 #define IPSO_AUTH_UN            0x06
171 #define IPSO_AUTH_FTE           0x01
172 
173 /*
174  * IP option #defines
175  */
176 /*#define	IPOPT_RR	7 */
177 #define IPOPT_ZSU       10      /* ZSU */
178 #define IPOPT_MTUP      11      /* MTUP */
179 #define IPOPT_MTUR      12      /* MTUR */
180 #define IPOPT_ENCODE    15      /* ENCODE */
181 /*#define	IPOPT_TS	68 */
182 #define IPOPT_TR        82      /* TR */
183 /*#define	IPOPT_SECURITY	130 */
184 /*#define	IPOPT_LSRR	131 */
185 #define IPOPT_E_SEC     133     /* E-SEC */
186 #define IPOPT_CIPSO     134     /* CIPSO */
187 /*#define	IPOPT_SATID	136 */
188 #ifndef IPOPT_SID
189 # define        IPOPT_SID       IPOPT_SATID
190 #endif
191 /*#define	IPOPT_SSRR	137 */
192 #define IPOPT_ADDEXT    147     /* ADDEXT */
193 #define IPOPT_VISA      142     /* VISA */
194 #define IPOPT_IMITD     144     /* IMITD */
195 #define IPOPT_EIP       145     /* EIP */
196 #define IPOPT_FINN      205     /* FINN */
197 
198 
199 #if defined(__FreeBSD__) && defined(KERNEL)
200 # if __FreeBSD__ < 3
201 #  include <machine/spl.h>
202 # endif
203 #endif /* __FreeBSD__ && KERNEL */
204 
205 /*
206  * Build some macros and #defines to enable the same code to compile anywhere
207  * Well, that's the idea, anyway :-)
208  */
209 #ifdef KERNEL
210 # if SOLARIS
211 #  define       MUTEX_ENTER(x)  mutex_enter(x)
212 #  define       MUTEX_EXIT(x)   mutex_exit(x)
213 #  define       MTOD(m, t)       (t)((m)->b_rptr)
214 #  define       IRCOPY(a, b, c)   copyin((a), (b), (c))
215 #  define       IWCOPY(a, b, c)   copyout((a), (b), (c))
216 #  define       FREE_MB_T(m)    freemsg(m)
217 #  define       SPL_NET(x)      ;
218 #  define       SPL_IMP(x)      ;
219 #  undef        SPL_X
220 #  define       SPL_X(x)        ;
221 #  ifdef sparc
222 #   define      ntohs(x)        (x)
223 #   define      ntohl(x)        (x)
224 #   define      htons(x)        (x)
225 #   define      htonl(x)        (x)
226 #  endif /* sparc */
227 #  define       KMALLOC(a, b, c)  (a) = (b)kmem_alloc((c), KM_NOSLEEP)
228 #  define       GET_MINOR(x)    getminor(x)
229 typedef struct  qif     {
230 	struct  qif     *qf_next;
231 	ill_t   *qf_ill;
232 	kmutex_t        qf_lock;
233 	void    *qf_iptr;
234 	void    *qf_optr;
235 	queue_t *qf_in;
236 	queue_t *qf_out;
237 	struct  qinit   *qf_wqinfo;
238 	struct  qinit   *qf_rqinfo;
239 	struct  qinit   qf_wqinit;
240 	struct  qinit   qf_rqinit;
241 	mblk_t  *qf_m;  /* These three fields are for passing data up from */
242 	queue_t *qf_q;  /* fr_qin and fr_qout to the packet processing. */
243 	int     qf_off;
244 	int     qf_len; /* this field is used for in ipfr_fastroute */
245 	char    qf_name[8];
246 	/*
247 	 * in case the ILL has disappeared...
248 	 */
249 	int     qf_hl;  /* header length */
250 } qif_t;
251 extern  ill_t   *get_unit(char *);
252 #  define       GETUNIT(n)      get_unit((n))
253 # else /* SOLARIS */
254 #  if defined(__sgi)
255 #   include <sys/ksynch.h>
256 #   define      IPF_LOCK_PL     plhi
257 #   include <sys/sema.h>
258 #undef kmutex_t
259 typedef struct {
260 	lock_t *l;
261 	int pl;
262 } kmutex_t;
263 #   define      MUTEX_ENTER(x)  (x)->pl = LOCK((x)->l, IPF_LOCK_PL);
264 #   define      MUTEX_EXIT(x)   UNLOCK((x)->l, (x)->pl);
265 #  else /* __sgi */
266 #   define      MUTEX_ENTER(x)  ;
267 #   define      MUTEX_EXIT(x)   ;
268 #  endif /* __sgi */
269 #  ifndef linux
270 #   define      FREE_MB_T(m)    m_freem(m)
271 #   define      MTOD(m, t)       mtod(m,t)
272 #   define      IRCOPY(a, b, c)   bcopy((a), (b), (c))
273 #   define      IWCOPY(a, b, c)   bcopy((a), (b), (c))
274 #  endif /* !linux */
275 # endif /* SOLARIS */
276 
277 # ifdef sun
278 #  if !SOLARIS
279 #   include     <sys/kmem_alloc.h>
280 #   define      GETUNIT(n)      ifunit((n), IFNAMSIZ)
281 #  endif
282 # else
283 #  ifndef       linux
284 #   define      GETUNIT(n)      ifunit((n))
285 #  endif
286 # endif /* sun */
287 
288 # if defined(sun) && !defined(linux) || defined(__sgi)
289 #  define       UIOMOVE(a, b, c, d)        uiomove((caddr_t)a,b,c,d)
290 #  define       SLEEP(id, n)    sleep((id), PZERO+1)
291 #  define       WAKEUP(id)      wakeup(id)
292 #  define       KFREE(x)        kmem_free((char *)(x), sizeof(*(x)))
293 #  define       KFREES(x, s)     kmem_free((char *)(x), (s))
294 #  if !SOLARIS
295 extern  void    m_copydata(struct mbuf *, int, int, caddr_t);
296 extern  void    m_copyback(struct mbuf *, int, int, caddr_t);
297 #  endif
298 #  ifdef __sgi
299 #   include <sys/kmem.h>
300 #   include <sys/ddi.h>
301 #   define      KMALLOC(a, b, c)  (a) = (b)kmem_alloc((c), KM_NOSLEEP)
302 #   define      GET_MINOR(x)    getminor(x)
303 #  else
304 #   if !SOLARIS
305 #    define     KMALLOC(a, b, c)  (a) = (b)new_kmem_alloc((c), KMEM_NOSLEEP)
306 #   endif /* SOLARIS */
307 #  endif /* __sgi */
308 # endif /* sun && !linux */
309 # ifndef        GET_MINOR
310 #  define       GET_MINOR(x)    minor(x)
311 # endif
312 # if (BSD >= 199306) || defined(__FreeBSD__)
313 #  include <vm/vm.h>
314 #  if !defined(__FreeBSD__) || (defined (__FreeBSD__) && __FreeBSD__ >= 3)
315 #   include <vm/vm_extern.h>
316 #   include <sys/proc.h>
317 extern  vm_map_t        kmem_map;
318 #  else /* !__FreeBSD__ || (__FreeBSD__ && __FreeBSD__>=3) */
319 #   include <vm/vm_kern.h>
320 #  endif /* !__FreeBSD__ || (__FreeBSD__ && __FreeBSD__>=3) */
321 #  ifdef        M_PFIL
322 #   define      KMALLOC(a, b, c)        MALLOC((a), b, (c), M_PFIL, M_NOWAIT)
323 #   define      KFREE(x)        FREE((x), M_PFIL)
324 #   define      KFREES(x, s)     FREE((x), M_PFIL)
325 #  else
326 #   define      KMALLOC(a, b, c)        MALLOC((a), b, (c), M_TEMP, M_NOWAIT)
327 #   define      KFREE(x)        FREE((x), M_TEMP)
328 #   define      KFREES(x, s)     FREE((x), M_TEMP)
329 #  endif /* M_PFIL */
330 #  define       UIOMOVE(a, b, c, d)        uiomove(a,b,d)
331 #  define       SLEEP(id, n)    tsleep((id), PPAUSE|PCATCH, n, 0)
332 #  define       WAKEUP(id)      wakeup(id)
333 # endif /* BSD */
334 # if defined(NetBSD) && NetBSD <= 1991011 && NetBSD >= 199407
335 #  define       SPL_NET(x)      x = splsoftnet()
336 #  define       SPL_X(x)        (void) splx(x)
337 # else
338 #  if !SOLARIS && !defined(linux)
339 #   define      SPL_IMP(x)      ;
340 #   define      SPL_NET(x)      ;
341 #   define      SPL_X(x)        ;
342 #  endif
343 # endif /* NetBSD && NetBSD <= 1991011 && NetBSD >= 199407 */
344 # define        PANIC(x, y)      if (x) panic y
345 #else /* KERNEL */
346 # define        SLEEP(x, y)      ;
347 # define        WAKEUP(x)       ;
348 # define        PANIC(x, y)      ;
349 # define        MUTEX_ENTER(x)  ;
350 # define        MUTEX_EXIT(x)   ;
351 # define        SPL_NET(x)      ;
352 # define        SPL_IMP(x)      ;
353 # undef         SPL_X
354 # define        SPL_X(x)        ;
355 /*# define	KMALLOC(a,b,c)	(a) = (b)malloc(c) */
356 # define        KFREE(x)        FREE(x)
357 # define        KFREES(x, s)     FREE(x)
358 # define        GETUNIT(x)      get_unit(x)
359 # define        IRCOPY(a, b, c)   bcopy((a), (b), (c))
360 # define        IWCOPY(a, b, c)   bcopy((a), (b), (c))
361 #endif /* KERNEL */
362 
363 #if SOLARIS
364 typedef mblk_t mb_t;
365 #else
366 # ifdef linux
367 typedef struct sk_buff mb_t;
368 # else
369 typedef struct mbuf mb_t;
370 # endif
371 #endif /* SOLARIS */
372 
373 #if defined(linux) || defined(__sgi)
374 /*
375  * These #ifdef's are here mainly for linux, but who knows, they may
376  * not be in other places or maybe one day linux will grow up and some
377  * of these will turn up there too.
378  */
379 #ifndef ICMP_MINLEN
380 # define        ICMP_MINLEN     8
381 #endif
382 #ifndef ICMP_UNREACH
383 # define        ICMP_UNREACH    ICMP_DEST_UNREACH
384 #endif
385 #ifndef ICMP_SOURCEQUENCH
386 # define        ICMP_SOURCEQUENCH       ICMP_SOURCE_QUENCH
387 #endif
388 #ifndef ICMP_TIMXCEED
389 # define        ICMP_TIMXCEED   ICMP_TIME_EXCEEDED
390 #endif
391 #ifndef ICMP_PARAMPROB
392 # define        ICMP_PARAMPROB  ICMP_PARAMETERPROB
393 #endif
394 #ifndef ICMP_TSTAMP
395 # define        ICMP_TSTAMP     ICMP_TIMESTAMP
396 #endif
397 #ifndef ICMP_TSTAMPREPLY
398 # define        ICMP_TSTAMPREPLY        ICMP_TIMESTAMPREPLY
399 #endif
400 #ifndef ICMP_IREQ
401 # define        ICMP_IREQ       ICMP_INFO_REQUEST
402 #endif
403 #ifndef ICMP_IREQREPLY
404 # define        ICMP_IREQREPLY  ICMP_INFO_REPLY
405 #endif
406 #ifndef ICMP_MASKREQ
407 # define        ICMP_MASKREQ    ICMP_ADDRESS
408 #endif
409 #ifndef ICMP_MASKREPLY
410 # define        ICMP_MASKREPLY  ICMP_ADDRESSREPLY
411 #endif
412 #ifndef IPVERSION
413 # define        IPVERSION       4
414 #endif
415 #ifndef IPOPT_MINOFF
416 # define        IPOPT_MINOFF    4
417 #endif
418 #ifndef IPOPT_COPIED
419 # define        IPOPT_COPIED(x) ((x)&0x80)
420 #endif
421 #ifndef IPOPT_EOL
422 # define        IPOPT_EOL       0
423 #endif
424 #ifndef IPOPT_NOP
425 # define        IPOPT_NOP       1
426 #endif
427 #ifndef IP_MF
428 # define        IP_MF   ((u_short)0x2000)
429 #endif
430 #ifndef ETHERTYPE_IP
431 # define        ETHERTYPE_IP    ((u_short)0x0800)
432 #endif
433 #ifndef TH_FIN
434 # define        TH_FIN  0x01
435 #endif
436 #ifndef TH_SYN
437 # define        TH_SYN  0x02
438 #endif
439 #ifndef TH_RST
440 # define        TH_RST  0x04
441 #endif
442 #ifndef TH_PUSH
443 # define        TH_PUSH 0x08
444 #endif
445 #ifndef TH_ACK
446 # define        TH_ACK  0x10
447 #endif
448 #ifndef TH_URG
449 # define        TH_URG  0x20
450 #endif
451 #ifndef IPOPT_EOL
452 # define        IPOPT_EOL       0
453 #endif
454 #ifndef IPOPT_NOP
455 # define        IPOPT_NOP       1
456 #endif
457 #ifndef IPOPT_RR
458 # define        IPOPT_RR        7
459 #endif
460 #ifndef IPOPT_TS
461 # define        IPOPT_TS        68
462 #endif
463 #ifndef IPOPT_SECURITY
464 # define        IPOPT_SECURITY  130
465 #endif
466 #ifndef IPOPT_LSRR
467 # define        IPOPT_LSRR      131
468 #endif
469 #ifndef IPOPT_SATID
470 # define        IPOPT_SATID     136
471 #endif
472 #ifndef IPOPT_SSRR
473 # define        IPOPT_SSRR      137
474 #endif
475 #ifndef IPOPT_SECUR_UNCLASS
476 # define        IPOPT_SECUR_UNCLASS     ((u_short)0x0000)
477 #endif
478 #ifndef IPOPT_SECUR_CONFID
479 # define        IPOPT_SECUR_CONFID      ((u_short)0xf135)
480 #endif
481 #ifndef IPOPT_SECUR_EFTO
482 # define        IPOPT_SECUR_EFTO        ((u_short)0x789a)
483 #endif
484 #ifndef IPOPT_SECUR_MMMM
485 # define        IPOPT_SECUR_MMMM        ((u_short)0xbc4d)
486 #endif
487 #ifndef IPOPT_SECUR_RESTR
488 # define        IPOPT_SECUR_RESTR       ((u_short)0xaf13)
489 #endif
490 #ifndef IPOPT_SECUR_SECRET
491 # define        IPOPT_SECUR_SECRET      ((u_short)0xd788)
492 #endif
493 #ifndef IPOPT_SECUR_TOPSECRET
494 # define        IPOPT_SECUR_TOPSECRET   ((u_short)0x6bc5)
495 #endif
496 #ifndef IPOPT_OLEN
497 # define        IPOPT_OLEN      1
498 #endif
499 #endif /* linux || __sgi */
500 
501 #ifdef  linux
502 /*
503  * TCP States
504  */
505 #define TCPS_CLOSED             0       /* closed */
506 #define TCPS_LISTEN             1       /* listening for connection */
507 #define TCPS_SYN_SENT           2       /* active, have sent syn */
508 #define TCPS_SYN_RECEIVED       3       /* have send and received syn */
509 /* states < TCPS_ESTABLISHED are those where connections not established */
510 #define TCPS_ESTABLISHED        4       /* established */
511 #define TCPS_CLOSE_WAIT         5       /* rcvd fin, waiting for close */
512 /* states > TCPS_CLOSE_WAIT are those where user has closed */
513 #define TCPS_FIN_WAIT_1         6       /* have closed, sent fin */
514 #define TCPS_CLOSING            7       /* closed xchd FIN; await FIN ACK */
515 #define TCPS_LAST_ACK           8       /* had fin and close; await FIN ACK */
516 /* states > TCPS_CLOSE_WAIT && < TCPS_FIN_WAIT_2 await ACK of FIN */
517 #define TCPS_FIN_WAIT_2         9       /* have closed, fin is acked */
518 #define TCPS_TIME_WAIT          10      /* in 2*msl quiet wait after close */
519 
520 /*
521  * file flags.
522  */
523 #define FWRITE  WRITE
524 #define FREAD   READ
525 /*
526  * mbuf related problems.
527  */
528 #define mtod(m, t)       (t)((m)->data)
529 #define m_len           len
530 #define m_next          next
531 
532 #define IP_DF           0x8000
533 
534 typedef struct  {
535 	__u16   th_sport;
536 	__u16   th_dport;
537 	__u32   th_seq;
538 	__u32   th_ack;
539 # if defined(__i386__) || defined(__MIPSEL__) || defined(__alpha__) || \
540 	defined(vax)
541 	__u8    th_res:4;
542 	__u8    th_off:4;
543 #else
544 	__u8    th_off:4;
545 	__u8    th_res:4;
546 #endif
547 	__u8    th_flags;
548 	__u16   th_win;
549 	__u16   th_sum;
550 	__u16   th_urp;
551 } tcphdr_t;
552 
553 typedef struct  {
554 	__u16   uh_sport;
555 	__u16   uh_dport;
556 	__u16   uh_ulen;
557 	__u16   uh_sum;
558 } udphdr_t;
559 
560 typedef struct  {
561 # if defined(__i386__) || defined(__MIPSEL__) || defined(__alpha__) || \
562 	defined(vax)
563 	__u8    ip_hl:4;
564 	__u8    ip_v:4;
565 # else
566 	__u8    ip_hl:4;
567 	__u8    ip_v:4;
568 # endif
569 	__u8    ip_tos;
570 	__u16   ip_len;
571 	__u16   ip_id;
572 	__u16   ip_off;
573 	__u8    ip_ttl;
574 	__u8    ip_p;
575 	__u16   ip_sum;
576 	struct  in_addr ip_src;
577 	struct  in_addr ip_dst;
578 } ip_t;
579 
580 /*
581  * Structure of an icmp header.
582  */
583 typedef struct icmp {
584 	u_char  icmp_type;              /* type of message, see below */
585 	u_char  icmp_code;              /* type sub code */
586 	u_short icmp_cksum;             /* ones complement cksum of struct */
587 	union {
588 		u_char ih_pptr;                 /* ICMP_PARAMPROB */
589 		struct in_addr ih_gwaddr;       /* ICMP_REDIRECT */
590 		struct ih_idseq {
591 			n_short icd_id;
592 			n_short icd_seq;
593 		} ih_idseq;
594 		int ih_void;
595 	} icmp_hun;
596 # define        icmp_pptr       icmp_hun.ih_pptr
597 # define        icmp_gwaddr     icmp_hun.ih_gwaddr
598 # define        icmp_id         icmp_hun.ih_idseq.icd_id
599 # define        icmp_seq        icmp_hun.ih_idseq.icd_seq
600 # define        icmp_void       icmp_hun.ih_void
601 	union {
602 		struct id_ts {
603 			n_time its_otime;
604 			n_time its_rtime;
605 			n_time its_ttime;
606 		} id_ts;
607 		struct id_ip  {
608 			ip_t idi_ip;
609 			/* options and then 64 bits of data */
610 		} id_ip;
611 		u_int32_t       id_mask;
612 		char    id_data[1];
613 	} icmp_dun;
614 # define        icmp_otime      icmp_dun.id_ts.its_otime
615 # define        icmp_rtime      icmp_dun.id_ts.its_rtime
616 # define        icmp_ttime      icmp_dun.id_ts.its_ttime
617 # define        icmp_ip         icmp_dun.id_ip.idi_ip
618 # define        icmp_mask       icmp_dun.id_mask
619 # define        icmp_data       icmp_dun.id_data
620 } icmphdr_t;
621 
622 # ifndef LINUX_IPOVLY
623 #  define LINUX_IPOVLY
624 struct ipovly {
625 	caddr_t ih_next, ih_prev;       /* for protocol sequence q's */
626 	u_char  ih_x1;                  /* (unused) */
627 	u_char  ih_pr;                  /* protocol */
628 	short   ih_len;                 /* protocol length */
629 	struct  in_addr ih_src;         /* source internet address */
630 	struct  in_addr ih_dst;         /* destination internet address */
631 };
632 # endif
633 
634 typedef struct  {
635 	__u8    ether_dhost[6];
636 	__u8    ether_shost[6];
637 	__u16   ether_type;
638 } ether_header_t;
639 
640 typedef struct  uio     {
641 	int     uio_resid;
642 	int     uio_rw;
643 	caddr_t uio_buf;
644 } uio_t;
645 
646 # define        UIO_READ        0
647 # define        UIO_WRITE       1
648 # define        UIOMOVE(a, b, c, d)     uiomove(a,b,c,d)
649 
650 /*
651  * For masking struct ifnet onto struct device
652  */
653 # define        if_name name
654 
655 # ifdef KERNEL
656 #  define       GETUNIT(x)      dev_get(x)
657 #  define       FREE_MB_T(m)    kfree_skb(m, FREE_WRITE)
658 #  define       uniqtime        do_gettimeofday
659 #  undef INT_MAX
660 #  undef UINT_MAX
661 #  undef LONG_MAX
662 #  undef ULONG_MAX
663 #  include <linux/netdevice.h>
664 #  define       SPL_X(x)
665 #  define       SPL_NET(x)
666 #  define       SPL_IMP(x)
667 
668 #  define       bcmp(a, b, c)     memcmp(a,b,c)
669 #  define       bcopy(a, b, c)    memcpy(b,a,c)
670 #  define       bzero(a, c)      memset(a,0,c)
671 
672 #  define       UNITNAME(n)     dev_get((n))
673 
674 #  define       KMALLOC(a, b, c)  (a) = (b)kmalloc((c), GFP_ATOMIC)
675 #  define       KFREE(x)        kfree_s((x), sizeof(*(x)))
676 #  define       KFREES(x, s)     kfree_s((x), (s))
677 #  define       IRCOPY(a, b, c)   {\
678 	                         error = verify_area(VERIFY_READ, (a) ,(c)); \
679 	                         if (!error) \
680 	                                memcpy_fromfs((b), (a), (c)); \
681 	                        }
682 #  define       IWCOPY(a, b, c)   {\
683 	                         error = verify_area(VERIFY_WRITE, (b), (c)); \
684 	                         if (!error) \
685 	                                memcpy_tofs((b), (a), (c)); \
686 	                        }
687 # else
688 #  define       __KERNEL__
689 #  undef INT_MAX
690 #  undef UINT_MAX
691 #  undef LONG_MAX
692 #  undef ULONG_MAX
693 #  define       s8 __s8
694 #  define       u8 __u8
695 #  define       s16 __s16
696 #  define       u16 __u16
697 #  define       s32 __s32
698 #  define       u32 __u32
699 #  include <linux/netdevice.h>
700 #  undef        __KERNEL__
701 # endif
702 # define        ifnet   device
703 #else
704 typedef struct  tcphdr  tcphdr_t;
705 typedef struct  udphdr  udphdr_t;
706 typedef struct  icmp    icmphdr_t;
707 typedef struct  ip      ip_t;
708 typedef struct  ether_header    ether_header_t;
709 #endif /* linux */
710 typedef struct  tcpiphdr        tcpiphdr_t;
711 
712 #if defined(hpux) || defined(linux)
713 struct  ether_addr      {
714 	char    ether_addr_octet[6];
715 };
716 #endif
717 
718 /*
719  * XXX - This is one of those *awful* hacks which nobody likes
720  */
721 #ifdef  ultrix
722 #define A_A
723 #else
724 #define A_A     &
725 #endif
726 
727 #ifndef ICMP_ROUTERADVERT
728 # define        ICMP_ROUTERADVERT       9
729 #endif
730 #ifndef ICMP_ROUTERSOLICIT
731 # define        ICMP_ROUTERSOLICIT      10
732 #endif
733 
734 #endif  /* __IP_COMPAT_H__ */
735 
736 #endif /* #if 0 */
737