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