#ifndef __IPF_LINUX_H__
#define __IPF_LINUX_H__

#include <linux/config.h>
#include <linux/version.h>
#ifndef CONFIG_NETFILTER
# define CONFIG_NETFILTER
#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
# define __irq_h	1	/* stop it being included! */
# include <linux/mtd/compatmac.h>
#else
# include <linux/compatmac.h>
# include <linux/version.h>
#endif
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/time.h>
#include <linux/string.h>
#include <linux/slab.h>
#include <linux/socket.h>
#include <linux/netdevice.h>
#include <linux/inetdevice.h>
#include <linux/skbuff.h>
#include <linux/in.h>
#include <linux/ip.h>
#include <linux/icmp.h>
#include <linux/rtnetlink.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <linux/netfilter_ipv6.h>
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
# include <asm/ioctls.h>
#else
# define	ipftcphdr	tcphdr
# define	ipfudphdr	udphdr
#endif

struct	ipftcphdr	{
	__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;
};

typedef	__u32	tcp_seq;

struct	ipfudphdr	{
	__u16	uh_sport;
	__u16	uh_dport;
	__u16	uh_ulen;
	__u16	uh_sum;
};

struct	ip	{
# if defined(__i386__) || defined(__MIPSEL__) || defined(__alpha__) ||\
	defined(__vax__)
	__u8	ip_hl:4;
	__u8	ip_v:4;
# else
	__u8	ip_v:4;
	__u8	ip_hl: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;
};

/*
 * Structure of an icmp header.
 */
struct icmp {
	__u8	icmp_type;		/* type of message, see below */
	__u8	icmp_code;		/* type sub code */
	__u16	icmp_cksum;		/* ones complement cksum of struct */
	union {
		__u8	ih_pptr;		/* ICMP_PARAMPROB */
		struct	in_addr ih_gwaddr;	/* ICMP_REDIRECT */
		struct	ih_idseq {
			__u16	icd_id;
			__u16	icd_seq;
		} ih_idseq;
		__u32	 ih_void;
		struct	ih_pmtu	{
			__u16	ipm_void;
			__u16	ipm_nextmtu;
		} ih_pmtu;
	} 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
# define	icmp_nextmtu	icmp_hun.ih_pmtu.ipm_nextmtu
	union {
		struct id_ts {
			__u32	its_otime;
			__u32	its_rtime;
			__u32	its_ttime;
		} id_ts;
		struct id_ip	{
			struct	ip	idi_ip;
			/* options and then 64 bits of data */
		} id_ip;
		u_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
};

# 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

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

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
typedef	struct	ipftcphdr	tcphdr_t;
typedef	struct	ipfudphdr	udphdr_t;
#endif

#include "ip_compat.h"
#include "ip_fil.h"
#include "ip_auth.h"
#include "ip_state.h"
#include "ip_nat.h"
#include "ip_proxy.h"
#include "ip_frag.h"
#ifdef	IPFILTER_LOOKUP
# include "ip_lookup.h"
# include "ip_pool.h"
# include "ip_htable.h"
#endif
#ifdef  IPFILTER_SYNC
# include "netinet/ip_sync.h"
#endif
#ifdef  IPFILTER_SCAN
# include "netinet/ip_scan.h"
#endif
#ifdef IPFILTER_COMPILED
# include "netinet/ip_rules.h"
#endif
#include "ipl.h"

#endif /* __IPF_LINUX_H__ */
