/*
** Special compatibility definitions for linux.
**
**	On the linux platform, several IP-related structures may have
**	different names. Also some of the structure fields may have
**	other names, although the layout is (obviously) fixed.
**	Several constants may not be defined in the standard files.
**
**	@(#)linux.h             e07@nikhef.nl (Eric Wassenaar) 980826
*/

#if defined(linux)

/*
 * The definitions below are necessary for those versions that do not
 * have the real BSD netinet include files, probably all pre-glibc.
 *
 * If IPVERSION is defined, there is a struct ip, otherwise there is
 * only a struct iphdr.
 *
 * If there is a struct ip, the checksum field is usually defined by
 * ip_csum, but sometimes by ip_sum. It remains unclear when.
 *
 * In case no special compile flags are given, the <features.h> file
 * sets _BSD_SOURCE and __USE_BSD but not __FAVOR_BSD, so that the
 * definitions below are applied.
 *
 * If _BSD_SOURCE is defined in advance, __FAVOR_BSD is set as well,
 * and the definitions below are skipped.
 */

#if !defined(__FAVOR_BSD)

#include <linux/version.h>	/* to get the proper LINUX_VERSION_CODE */

#include <endian.h>		/* to get the proper BYTE_ORDER */

#if !defined(BYTE_ORDER) || (BYTE_ORDER != BIG_ENDIAN && \
     BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != PDP_ENDIAN)
error "Undefined or invalid BYTE_ORDER";
#endif

/*
 * Structure of an ip header, without options.
 */

#if !defined(IPVERSION)

#define	IPVERSION	4

struct ip {
#if (BYTE_ORDER == LITTLE_ENDIAN || BYTE_ORDER == PDP_ENDIAN)
	u_char	ip_hl:4,		/* header length */
		ip_v:4;			/* version */
#else
	u_char	ip_v:4,			/* version */
		ip_hl:4;		/* header length */
#endif
	u_char	ip_tos;			/* type of service */
	short	ip_len;			/* total length */
	u_short	ip_id;			/* identification */
	short	ip_off;			/* fragment offset field */
#define	IP_DF 0x4000			/* dont fragment flag */
#define	IP_MF 0x2000			/* more fragments flag */
	u_char	ip_ttl;			/* time to live */
	u_char	ip_p;			/* protocol */
	u_short	ip_sum;			/* checksum */
	struct	in_addr ip_src,ip_dst;	/* source and dest address */
};

#else /* IPVERSION */

#if !defined(LINUX_IPSUM)
#define ip_sum ip_csum			/* struct ip defines ip_csum */
#endif

#endif /* IPVERSION */

#define	IP_MAXPACKET	65535		/* maximum packet size */

/*
 * Structure of an icmp header.
 */

#define n_short u_short			/* normally defined in in_systm.h */
#define n_long  u_int			/* redefine for 64-bit machines */
#define n_time  u_int			/* redefine for 64-bit machines */

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  {
			struct ip idi_ip;
			/* options and then 64 bits of data */
		} id_ip;
		n_long	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
};

#define	ICMP_MINLEN	8		/* abs minimum */

/*
 * Definition of icmp type and code field values.
 */

#define	ICMP_ECHOREPLY		0		/* echo reply */
#define	ICMP_UNREACH		3		/* dest unreachable, codes: */
#define		ICMP_UNREACH_NET	0		/* bad net */
#define		ICMP_UNREACH_HOST	1		/* bad host */
#define		ICMP_UNREACH_PROTOCOL	2		/* bad protocol */
#define		ICMP_UNREACH_PORT	3		/* bad port */
#define		ICMP_UNREACH_NEEDFRAG	4		/* IP_DF caused drop */
#define		ICMP_UNREACH_SRCFAIL	5		/* src route failed */
#define	ICMP_SOURCEQUENCH	4		/* packet lost, slow down */
#define	ICMP_REDIRECT		5		/* shorter route, codes: */
#define		ICMP_REDIRECT_NET	0		/* for network */
#define		ICMP_REDIRECT_HOST	1		/* for host */
#define		ICMP_REDIRECT_TOSNET	2		/* for tos and net */
#define		ICMP_REDIRECT_TOSHOST	3		/* for tos and host */
#define	ICMP_ECHO		8		/* echo service */
#define	ICMP_TIMXCEED		11		/* time exceeded, code: */
#define		ICMP_TIMXCEED_INTRANS	0		/* ttl==0 in transit */
#define		ICMP_TIMXCEED_REASS	1		/* ttl==0 in reass */
#define	ICMP_PARAMPROB		12		/* ip header bad */
#define	ICMP_TSTAMP		13		/* timestamp request */
#define	ICMP_TSTAMPREPLY	14		/* timestamp reply */
#define	ICMP_IREQ		15		/* information request */
#define	ICMP_IREQREPLY		16		/* information reply */
#define	ICMP_MASKREQ		17		/* address mask request */
#define	ICMP_MASKREPLY		18		/* address mask reply */

/*
 * Definitions needed for the udp header structure.
 */

#define uh_sport	source
#define uh_dport	dest
#define uh_ulen		len
#define uh_sum		check

/*
 * Definitions needed for the tcp header structure.
 */

#if 0
#define th_sport	source
#define th_dport	dest
#endif

/*
 * Some IP options have different names as well.
 */

#ifndef IPOPT_SECURITY
#define IPOPT_SECURITY	IPOPT_SEC
#endif

#ifndef IPOPT_SATID
#define IPOPT_SATID	IPOPT_SID
#endif

#endif /* __FAVOR_BSD */

#endif /* linux */


syntax highlighted by Code2HTML, v. 0.9.1