Loading...
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
/*
 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
 *
 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
 *
 * This file contains Original Code and/or Modifications of Original Code
 * as defined in and that are subject to the Apple Public Source License
 * Version 2.0 (the 'License'). You may not use this file except in
 * compliance with the License. The rights granted to you under the License
 * may not be used to create, or enable the creation or redistribution of,
 * unlawful or unlicensed copies of an Apple operating system, or to
 * circumvent, violate, or enable the circumvention or violation of, any
 * terms of an Apple operating system software license agreement.
 *
 * Please obtain a copy of the License at
 * http://www.opensource.apple.com/apsl/ and read it before using this file.
 *
 * The Original Code and all software distributed under the License are
 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 * Please see the License for the specific language governing rights and
 * limitations under the License.
 *
 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
 */
/*
 * Copyright (C) 1993-1997 by Darren Reed.
 *
 * Redistribution and use in source and binary forms are permitted
 * provided that this notice is preserved and due credit is given
 * to the original author and the contributors.
 *
 * @(#)ip_compat.h	1.8 1/14/96
 */
#ifndef DRIVERKIT
#include <sys/appleapiopts.h>
#endif /* DRIVERKIT */

#if 0

#ifndef __IP_COMPAT_H__
#define __IP_COMPAT_H__

#ifndef __STDC__
# define        const
#endif

#ifndef SOLARIS
#define SOLARIS (defined(sun) && (defined(__svr4__) || defined(__SVR4)))
#endif

#if defined(_KERNEL) && !defined(KERNEL)
# define        KERNEL
#endif
#if defined(KERNEL) && !defined(_KERNEL)
# define        _KERNEL
#endif
#if!defined(__KERNEL__) && defined(KERNEL)
# define        __KERNEL__
#endif

#if defined(__SVR4) || defined(__svr4__) || defined(__sgi)
#define index   strchr
# if !defined(_KERNEL)
#  define       bzero(a, b)      memset(a,0,b)
#  define       bcmp            memcmp
#  define       bcopy(a, b, c)    memmove(b,a,c)
# endif
#endif

struct  ether_addr {
	u_char  ether_addr_octet[6];
};

#ifdef  linux
# include <sys/sysmacros.h>
#endif
#if     SOLARIS
# define        MTYPE(m)        ((m)->b_datap->db_type)
# include       <sys/ioccom.h>
# include       <sys/sysmacros.h>
# include       <sys/kmem.h>
/*
 * because Solaris 2 defines these in two places :-/
 */
# undef IPOPT_EOL
# undef IPOPT_NOP
# undef IPOPT_LSRR
# undef IPOPT_RR
# undef IPOPT_SSRR
# ifndef        _KERNEL
#  define       _KERNEL
#  undef        RES_INIT
#  include <inet/common.h>
#  include <inet/ip.h>
#  include <inet/ip_ire.h>
#  undef        _KERNEL
# else /* _KERNEL */
#  include <inet/common.h>
#  include <inet/ip.h>
#  include <inet/ip_ire.h>
# endif /* _KERNEL */
#endif /* SOLARIS */
#define IPMINLEN(i, h)  ((i)->ip_len >= ((i)->ip_hl * 4 + sizeof(struct h)))

#ifndef IP_OFFMASK
#define IP_OFFMASK      0x1fff
#endif

#if     BSD > 199306
# define        USE_QUAD_T
# define        U_QUAD_T        u_quad_t
# define        QUAD_T          quad_t
#else /* BSD > 199306 */
# define        U_QUAD_T        u_int32_t
# define        QUAD_T          long
#endif /* BSD > 199306 */

/*
 * These operating systems already take care of the problem for us.
 */
#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__) || \
        defined(__sgi)
typedef u_int32_t       u_32_t;
#else
/*
 * Really, any arch where sizeof(long) != sizeof(int).
 */
# if defined(__alpha__) || defined(__alpha)
typedef unsigned int    u_32_t;
# else
typedef u_int32_t   u_32_t;
# endif
#endif /* __NetBSD__ || __OpenBSD__ || __FreeBSD__ || __sgi */

#ifndef MAX
#define MAX(a, b)        (((a) > (b)) ? (a) : (b))
#endif

/*
 * Security Options for Intenet Protocol (IPSO) as defined in RFC 1108.
 *
 * Basic Option
 *
 * 00000001   -   (Reserved 4)
 * 00111101   -   Top Secret
 * 01011010   -   Secret
 * 10010110   -   Confidential
 * 01100110   -   (Reserved 3)
 * 11001100   -   (Reserved 2)
 * 10101011   -   Unclassified
 * 11110001   -   (Reserved 1)
 */
#define IPSO_CLASS_RES4         0x01
#define IPSO_CLASS_TOPS         0x3d
#define IPSO_CLASS_SECR         0x5a
#define IPSO_CLASS_CONF         0x96
#define IPSO_CLASS_RES3         0x66
#define IPSO_CLASS_RES2         0xcc
#define IPSO_CLASS_UNCL         0xab
#define IPSO_CLASS_RES1         0xf1

#define IPSO_AUTH_GENSER        0x80
#define IPSO_AUTH_ESI           0x40
#define IPSO_AUTH_SCI           0x20
#define IPSO_AUTH_NSA           0x10
#define IPSO_AUTH_DOE           0x08
#define IPSO_AUTH_UN            0x06
#define IPSO_AUTH_FTE           0x01

/*
 * IP option #defines
 */
/*#define	IPOPT_RR	7 */
#define IPOPT_ZSU       10      /* ZSU */
#define IPOPT_MTUP      11      /* MTUP */
#define IPOPT_MTUR      12      /* MTUR */
#define IPOPT_ENCODE    15      /* ENCODE */
/*#define	IPOPT_TS	68 */
#define IPOPT_TR        82      /* TR */
/*#define	IPOPT_SECURITY	130 */
/*#define	IPOPT_LSRR	131 */
#define IPOPT_E_SEC     133     /* E-SEC */
#define IPOPT_CIPSO     134     /* CIPSO */
/*#define	IPOPT_SATID	136 */
#ifndef IPOPT_SID
# define        IPOPT_SID       IPOPT_SATID
#endif
/*#define	IPOPT_SSRR	137 */
#define IPOPT_ADDEXT    147     /* ADDEXT */
#define IPOPT_VISA      142     /* VISA */
#define IPOPT_IMITD     144     /* IMITD */
#define IPOPT_EIP       145     /* EIP */
#define IPOPT_FINN      205     /* FINN */


#if defined(__FreeBSD__) && defined(KERNEL)
# if __FreeBSD__ < 3
#  include <machine/spl.h>
# endif
#endif /* __FreeBSD__ && KERNEL */

/*
 * Build some macros and #defines to enable the same code to compile anywhere
 * Well, that's the idea, anyway :-)
 */
#ifdef KERNEL
# if SOLARIS
#  define       MUTEX_ENTER(x)  mutex_enter(x)
#  define       MUTEX_EXIT(x)   mutex_exit(x)
#  define       MTOD(m, t)       (t)((m)->b_rptr)
#  define       IRCOPY(a, b, c)   copyin((a), (b), (c))
#  define       IWCOPY(a, b, c)   copyout((a), (b), (c))
#  define       FREE_MB_T(m)    freemsg(m)
#  define       SPL_NET(x)      ;
#  define       SPL_IMP(x)      ;
#  undef        SPL_X
#  define       SPL_X(x)        ;
#  ifdef sparc
#   define      ntohs(x)        (x)
#   define      ntohl(x)        (x)
#   define      htons(x)        (x)
#   define      htonl(x)        (x)
#  endif /* sparc */
#  define       KMALLOC(a, b, c)  (a) = (b)kmem_alloc((c), KM_NOSLEEP)
#  define       GET_MINOR(x)    getminor(x)
typedef struct  qif     {
	struct  qif     *qf_next;
	ill_t   *qf_ill;
	kmutex_t        qf_lock;
	void    *qf_iptr;
	void    *qf_optr;
	queue_t *qf_in;
	queue_t *qf_out;
	struct  qinit   *qf_wqinfo;
	struct  qinit   *qf_rqinfo;
	struct  qinit   qf_wqinit;
	struct  qinit   qf_rqinit;
	mblk_t  *qf_m;  /* These three fields are for passing data up from */
	queue_t *qf_q;  /* fr_qin and fr_qout to the packet processing. */
	int     qf_off;
	int     qf_len; /* this field is used for in ipfr_fastroute */
	char    qf_name[8];
	/*
	 * in case the ILL has disappeared...
	 */
	int     qf_hl;  /* header length */
} qif_t;
extern  ill_t   *get_unit(char *);
#  define       GETUNIT(n)      get_unit((n))
# else /* SOLARIS */
#  if defined(__sgi)
#   include <sys/ksynch.h>
#   define      IPF_LOCK_PL     plhi
#   include <sys/sema.h>
#undef kmutex_t
typedef struct {
	lock_t *l;
	int pl;
} kmutex_t;
#   define      MUTEX_ENTER(x)  (x)->pl = LOCK((x)->l, IPF_LOCK_PL);
#   define      MUTEX_EXIT(x)   UNLOCK((x)->l, (x)->pl);
#  else /* __sgi */
#   define      MUTEX_ENTER(x)  ;
#   define      MUTEX_EXIT(x)   ;
#  endif /* __sgi */
#  ifndef linux
#   define      FREE_MB_T(m)    m_freem(m)
#   define      MTOD(m, t)       mtod(m,t)
#   define      IRCOPY(a, b, c)   bcopy((a), (b), (c))
#   define      IWCOPY(a, b, c)   bcopy((a), (b), (c))
#  endif /* !linux */
# endif /* SOLARIS */

# ifdef sun
#  if !SOLARIS
#   include     <sys/kmem_alloc.h>
#   define      GETUNIT(n)      ifunit((n), IFNAMSIZ)
#  endif
# else
#  ifndef       linux
#   define      GETUNIT(n)      ifunit((n))
#  endif
# endif /* sun */

# if defined(sun) && !defined(linux) || defined(__sgi)
#  define       UIOMOVE(a, b, c, d)        uiomove((caddr_t)a,b,c,d)
#  define       SLEEP(id, n)    sleep((id), PZERO+1)
#  define       WAKEUP(id)      wakeup(id)
#  define       KFREE(x)        kmem_free((char *)(x), sizeof(*(x)))
#  define       KFREES(x, s)     kmem_free((char *)(x), (s))
#  if !SOLARIS
extern  void    m_copydata(struct mbuf *, int, int, caddr_t);
extern  void    m_copyback(struct mbuf *, int, int, caddr_t);
#  endif
#  ifdef __sgi
#   include <sys/kmem.h>
#   include <sys/ddi.h>
#   define      KMALLOC(a, b, c)  (a) = (b)kmem_alloc((c), KM_NOSLEEP)
#   define      GET_MINOR(x)    getminor(x)
#  else
#   if !SOLARIS
#    define     KMALLOC(a, b, c)  (a) = (b)new_kmem_alloc((c), KMEM_NOSLEEP)
#   endif /* SOLARIS */
#  endif /* __sgi */
# endif /* sun && !linux */
# ifndef        GET_MINOR
#  define       GET_MINOR(x)    minor(x)
# endif
# if (BSD >= 199306) || defined(__FreeBSD__)
#  include <vm/vm.h>
#  if !defined(__FreeBSD__) || (defined (__FreeBSD__) && __FreeBSD__ >= 3)
#   include <vm/vm_extern.h>
#   include <sys/proc.h>
extern  vm_map_t        kmem_map;
#  else /* !__FreeBSD__ || (__FreeBSD__ && __FreeBSD__>=3) */
#   include <vm/vm_kern.h>
#  endif /* !__FreeBSD__ || (__FreeBSD__ && __FreeBSD__>=3) */
#  ifdef        M_PFIL
#   define      KMALLOC(a, b, c)        MALLOC((a), b, (c), M_PFIL, M_NOWAIT)
#   define      KFREE(x)        FREE((x), M_PFIL)
#   define      KFREES(x, s)     FREE((x), M_PFIL)
#  else
#   define      KMALLOC(a, b, c)        MALLOC((a), b, (c), M_TEMP, M_NOWAIT)
#   define      KFREE(x)        FREE((x), M_TEMP)
#   define      KFREES(x, s)     FREE((x), M_TEMP)
#  endif /* M_PFIL */
#  define       UIOMOVE(a, b, c, d)        uiomove(a,b,d)
#  define       SLEEP(id, n)    tsleep((id), PPAUSE|PCATCH, n, 0)
#  define       WAKEUP(id)      wakeup(id)
# endif /* BSD */
# if defined(NetBSD) && NetBSD <= 1991011 && NetBSD >= 199407
#  define       SPL_NET(x)      x = splsoftnet()
#  define       SPL_X(x)        (void) splx(x)
# else
#  if !SOLARIS && !defined(linux)
#   define      SPL_IMP(x)      ;
#   define      SPL_NET(x)      ;
#   define      SPL_X(x)        ;
#  endif
# endif /* NetBSD && NetBSD <= 1991011 && NetBSD >= 199407 */
# define        PANIC(x, y)      if (x) panic y
#else /* KERNEL */
# define        SLEEP(x, y)      ;
# define        WAKEUP(x)       ;
# define        PANIC(x, y)      ;
# define        MUTEX_ENTER(x)  ;
# define        MUTEX_EXIT(x)   ;
# define        SPL_NET(x)      ;
# define        SPL_IMP(x)      ;
# undef         SPL_X
# define        SPL_X(x)        ;
/*# define	KMALLOC(a,b,c)	(a) = (b)malloc(c) */
# define        KFREE(x)        FREE(x)
# define        KFREES(x, s)     FREE(x)
# define        GETUNIT(x)      get_unit(x)
# define        IRCOPY(a, b, c)   bcopy((a), (b), (c))
# define        IWCOPY(a, b, c)   bcopy((a), (b), (c))
#endif /* KERNEL */

#if SOLARIS
typedef mblk_t mb_t;
#else
# ifdef linux
typedef struct sk_buff mb_t;
# else
typedef struct mbuf mb_t;
# endif
#endif /* SOLARIS */

#if defined(linux) || defined(__sgi)
/*
 * These #ifdef's are here mainly for linux, but who knows, they may
 * not be in other places or maybe one day linux will grow up and some
 * of these will turn up there too.
 */
#ifndef ICMP_MINLEN
# define        ICMP_MINLEN     8
#endif
#ifndef ICMP_UNREACH
# define        ICMP_UNREACH    ICMP_DEST_UNREACH
#endif
#ifndef ICMP_SOURCEQUENCH
# define        ICMP_SOURCEQUENCH       ICMP_SOURCE_QUENCH
#endif
#ifndef ICMP_TIMXCEED
# define        ICMP_TIMXCEED   ICMP_TIME_EXCEEDED
#endif
#ifndef ICMP_PARAMPROB
# define        ICMP_PARAMPROB  ICMP_PARAMETERPROB
#endif
#ifndef ICMP_TSTAMP
# define        ICMP_TSTAMP     ICMP_TIMESTAMP
#endif
#ifndef ICMP_TSTAMPREPLY
# define        ICMP_TSTAMPREPLY        ICMP_TIMESTAMPREPLY
#endif
#ifndef ICMP_IREQ
# define        ICMP_IREQ       ICMP_INFO_REQUEST
#endif
#ifndef ICMP_IREQREPLY
# define        ICMP_IREQREPLY  ICMP_INFO_REPLY
#endif
#ifndef ICMP_MASKREQ
# define        ICMP_MASKREQ    ICMP_ADDRESS
#endif
#ifndef ICMP_MASKREPLY
# define        ICMP_MASKREPLY  ICMP_ADDRESSREPLY
#endif
#ifndef IPVERSION
# define        IPVERSION       4
#endif
#ifndef IPOPT_MINOFF
# define        IPOPT_MINOFF    4
#endif
#ifndef IPOPT_COPIED
# define        IPOPT_COPIED(x) ((x)&0x80)
#endif
#ifndef IPOPT_EOL
# define        IPOPT_EOL       0
#endif
#ifndef IPOPT_NOP
# define        IPOPT_NOP       1
#endif
#ifndef IP_MF
# define        IP_MF   ((u_short)0x2000)
#endif
#ifndef ETHERTYPE_IP
# define        ETHERTYPE_IP    ((u_short)0x0800)
#endif
#ifndef TH_FIN
# define        TH_FIN  0x01
#endif
#ifndef TH_SYN
# define        TH_SYN  0x02
#endif
#ifndef TH_RST
# define        TH_RST  0x04
#endif
#ifndef TH_PUSH
# define        TH_PUSH 0x08
#endif
#ifndef TH_ACK
# define        TH_ACK  0x10
#endif
#ifndef TH_URG
# define        TH_URG  0x20
#endif
#ifndef IPOPT_EOL
# define        IPOPT_EOL       0
#endif
#ifndef IPOPT_NOP
# define        IPOPT_NOP       1
#endif
#ifndef IPOPT_RR
# define        IPOPT_RR        7
#endif
#ifndef IPOPT_TS
# define        IPOPT_TS        68
#endif
#ifndef IPOPT_SECURITY
# define        IPOPT_SECURITY  130
#endif
#ifndef IPOPT_LSRR
# define        IPOPT_LSRR      131
#endif
#ifndef IPOPT_SATID
# define        IPOPT_SATID     136
#endif
#ifndef IPOPT_SSRR
# define        IPOPT_SSRR      137
#endif
#ifndef IPOPT_SECUR_UNCLASS
# define        IPOPT_SECUR_UNCLASS     ((u_short)0x0000)
#endif
#ifndef IPOPT_SECUR_CONFID
# define        IPOPT_SECUR_CONFID      ((u_short)0xf135)
#endif
#ifndef IPOPT_SECUR_EFTO
# define        IPOPT_SECUR_EFTO        ((u_short)0x789a)
#endif
#ifndef IPOPT_SECUR_MMMM
# define        IPOPT_SECUR_MMMM        ((u_short)0xbc4d)
#endif
#ifndef IPOPT_SECUR_RESTR
# define        IPOPT_SECUR_RESTR       ((u_short)0xaf13)
#endif
#ifndef IPOPT_SECUR_SECRET
# define        IPOPT_SECUR_SECRET      ((u_short)0xd788)
#endif
#ifndef IPOPT_SECUR_TOPSECRET
# define        IPOPT_SECUR_TOPSECRET   ((u_short)0x6bc5)
#endif
#ifndef IPOPT_OLEN
# define        IPOPT_OLEN      1
#endif
#endif /* linux || __sgi */

#ifdef  linux
/*
 * TCP States
 */
#define TCPS_CLOSED             0       /* closed */
#define TCPS_LISTEN             1       /* listening for connection */
#define TCPS_SYN_SENT           2       /* active, have sent syn */
#define TCPS_SYN_RECEIVED       3       /* have send and received syn */
/* states < TCPS_ESTABLISHED are those where connections not established */
#define TCPS_ESTABLISHED        4       /* established */
#define TCPS_CLOSE_WAIT         5       /* rcvd fin, waiting for close */
/* states > TCPS_CLOSE_WAIT are those where user has closed */
#define TCPS_FIN_WAIT_1         6       /* have closed, sent fin */
#define TCPS_CLOSING            7       /* closed xchd FIN; await FIN ACK */
#define TCPS_LAST_ACK           8       /* had fin and close; await FIN ACK */
/* states > TCPS_CLOSE_WAIT && < TCPS_FIN_WAIT_2 await ACK of FIN */
#define TCPS_FIN_WAIT_2         9       /* have closed, fin is acked */
#define TCPS_TIME_WAIT          10      /* in 2*msl quiet wait after close */

/*
 * file flags.
 */
#define FWRITE  WRITE
#define FREAD   READ
/*
 * mbuf related problems.
 */
#define mtod(m, t)       (t)((m)->data)
#define m_len           len
#define m_next          next

#define IP_DF           0x8000

typedef struct  {
	__u16   th_sport;
	__u16   th_dport;
	__u32   th_seq;
	__u32   th_ack;
# if defined(__i386__) || defined(__MIPSEL__) || defined(__alpha__) || \
	defined(vax)
	__u8    th_res:4;
	__u8    th_off:4;
#else
	__u8    th_off:4;
	__u8    th_res:4;
#endif
	__u8    th_flags;
	__u16   th_win;
	__u16   th_sum;
	__u16   th_urp;
} tcphdr_t;

typedef struct  {
	__u16   uh_sport;
	__u16   uh_dport;
	__u16   uh_ulen;
	__u16   uh_sum;
} udphdr_t;

typedef struct  {
# if defined(__i386__) || defined(__MIPSEL__) || defined(__alpha__) || \
	defined(vax)
	__u8    ip_hl:4;
	__u8    ip_v:4;
# else
	__u8    ip_hl:4;
	__u8    ip_v:4;
# endif
	__u8    ip_tos;
	__u16   ip_len;
	__u16   ip_id;
	__u16   ip_off;
	__u8    ip_ttl;
	__u8    ip_p;
	__u16   ip_sum;
	struct  in_addr ip_src;
	struct  in_addr ip_dst;
} ip_t;

/*
 * Structure of an icmp header.
 */
typedef struct icmp {
	u_char  icmp_type;              /* type of message, see below */
	u_char  icmp_code;              /* type sub code */
	u_short icmp_cksum;             /* ones complement cksum of struct */
	union {
		u_char ih_pptr;                 /* ICMP_PARAMPROB */
		struct in_addr ih_gwaddr;       /* ICMP_REDIRECT */
		struct ih_idseq {
			n_short icd_id;
			n_short icd_seq;
		} ih_idseq;
		int ih_void;
	} icmp_hun;
# define        icmp_pptr       icmp_hun.ih_pptr
# define        icmp_gwaddr     icmp_hun.ih_gwaddr
# define        icmp_id         icmp_hun.ih_idseq.icd_id
# define        icmp_seq        icmp_hun.ih_idseq.icd_seq
# define        icmp_void       icmp_hun.ih_void
	union {
		struct id_ts {
			n_time its_otime;
			n_time its_rtime;
			n_time its_ttime;
		} id_ts;
		struct id_ip  {
			ip_t idi_ip;
			/* options and then 64 bits of data */
		} id_ip;
		u_int32_t       id_mask;
		char    id_data[1];
	} icmp_dun;
# define        icmp_otime      icmp_dun.id_ts.its_otime
# define        icmp_rtime      icmp_dun.id_ts.its_rtime
# define        icmp_ttime      icmp_dun.id_ts.its_ttime
# define        icmp_ip         icmp_dun.id_ip.idi_ip
# define        icmp_mask       icmp_dun.id_mask
# define        icmp_data       icmp_dun.id_data
} icmphdr_t;

# ifndef LINUX_IPOVLY
#  define LINUX_IPOVLY
struct ipovly {
	caddr_t ih_next, ih_prev;       /* for protocol sequence q's */
	u_char  ih_x1;                  /* (unused) */
	u_char  ih_pr;                  /* protocol */
	short   ih_len;                 /* protocol length */
	struct  in_addr ih_src;         /* source internet address */
	struct  in_addr ih_dst;         /* destination internet address */
};
# endif

typedef struct  {
	__u8    ether_dhost[6];
	__u8    ether_shost[6];
	__u16   ether_type;
} ether_header_t;

typedef struct  uio     {
	int     uio_resid;
	int     uio_rw;
	caddr_t uio_buf;
} uio_t;

# define        UIO_READ        0
# define        UIO_WRITE       1
# define        UIOMOVE(a, b, c, d)     uiomove(a,b,c,d)

/*
 * For masking struct ifnet onto struct device
 */
# define        if_name name

# ifdef KERNEL
#  define       GETUNIT(x)      dev_get(x)
#  define       FREE_MB_T(m)    kfree_skb(m, FREE_WRITE)
#  define       uniqtime        do_gettimeofday
#  undef INT_MAX
#  undef UINT_MAX
#  undef LONG_MAX
#  undef ULONG_MAX
#  include <linux/netdevice.h>
#  define       SPL_X(x)
#  define       SPL_NET(x)
#  define       SPL_IMP(x)

#  define       bcmp(a, b, c)     memcmp(a,b,c)
#  define       bcopy(a, b, c)    memcpy(b,a,c)
#  define       bzero(a, c)      memset(a,0,c)

#  define       UNITNAME(n)     dev_get((n))

#  define       KMALLOC(a, b, c)  (a) = (b)kmalloc((c), GFP_ATOMIC)
#  define       KFREE(x)        kfree_s((x), sizeof(*(x)))
#  define       KFREES(x, s)     kfree_s((x), (s))
#  define       IRCOPY(a, b, c)   {\
	                         error = verify_area(VERIFY_READ, (a) ,(c)); \
	                         if (!error) \
	                                memcpy_fromfs((b), (a), (c)); \
	                        }
#  define       IWCOPY(a, b, c)   {\
	                         error = verify_area(VERIFY_WRITE, (b), (c)); \
	                         if (!error) \
	                                memcpy_tofs((b), (a), (c)); \
	                        }
# else
#  define       __KERNEL__
#  undef INT_MAX
#  undef UINT_MAX
#  undef LONG_MAX
#  undef ULONG_MAX
#  define       s8 __s8
#  define       u8 __u8
#  define       s16 __s16
#  define       u16 __u16
#  define       s32 __s32
#  define       u32 __u32
#  include <linux/netdevice.h>
#  undef        __KERNEL__
# endif
# define        ifnet   device
#else
typedef struct  tcphdr  tcphdr_t;
typedef struct  udphdr  udphdr_t;
typedef struct  icmp    icmphdr_t;
typedef struct  ip      ip_t;
typedef struct  ether_header    ether_header_t;
#endif /* linux */
typedef struct  tcpiphdr        tcpiphdr_t;

#if defined(hpux) || defined(linux)
struct  ether_addr      {
	char    ether_addr_octet[6];
};
#endif

/*
 * XXX - This is one of those *awful* hacks which nobody likes
 */
#ifdef  ultrix
#define A_A
#else
#define A_A     &
#endif

#ifndef ICMP_ROUTERADVERT
# define        ICMP_ROUTERADVERT       9
#endif
#ifndef ICMP_ROUTERSOLICIT
# define        ICMP_ROUTERSOLICIT      10
#endif

#endif  /* __IP_COMPAT_H__ */

#endif /* #if 0 */