1/*	$NetBSD: ip_frag.h,v 1.6 2009/08/19 08:36:10 darrenr Exp $	*/
2
3/*
4 * Copyright (C) 1993-2001 by Darren Reed.
5 *
6 * See the IPFILTER.LICENCE file for details on licencing.
7 *
8 * @(#)ip_frag.h	1.5 3/24/96
9 * Id: ip_frag.h,v 2.23.2.7 2009/01/01 03:53:17 darrenr Exp
10 */
11
12#ifndef _NETINET_IP_FRAG_H_
13#define _NETINET_IP_FRAG_H_
14
15#define	IPFT_SIZE	257
16
17typedef	struct	ipfr	{
18	struct	ipfr	*ipfr_hnext, **ipfr_hprev;
19	struct	ipfr	*ipfr_next, **ipfr_prev;
20	void	*ipfr_data;
21	frentry_t *ipfr_rule;
22	u_long	ipfr_ttl;
23	int	ipfr_ref;
24	u_short	ipfr_off;
25	u_short	ipfr_seen0;
26	/*
27	 * All of the fields, from ipfr_ifp to ipfr_pass, are compared
28	 * using bcmp to see if an identical entry is present.  It is
29	 * therefore important for this set to remain together.
30	 */
31	void	*ipfr_ifp;
32	i6addr_t ipfr_src;
33	i6addr_t ipfr_dst;
34	u_32_t	ipfr_optmsk;
35	u_short	ipfr_secmsk;
36	u_short	ipfr_auth;
37	u_32_t	ipfr_id;
38	u_32_t	ipfr_p;
39	u_32_t	ipfr_tos;
40	u_32_t	ipfr_pass;
41} ipfr_t;
42
43
44typedef	struct	ipfrstat {
45	u_long	ifs_exists;	/* add & already exists */
46	u_long	ifs_nomem;
47	u_long	ifs_new;
48	u_long	ifs_hits;
49	u_long	ifs_expire;
50	u_long	ifs_inuse;
51	u_long	ifs_retrans0;
52	u_long	ifs_short;
53	struct	ipfr	**ifs_table;
54	struct	ipfr	**ifs_nattab;
55} ipfrstat_t;
56
57#define	IPFR_CMPSZ	(offsetof(ipfr_t, ipfr_pass) - \
58			 offsetof(ipfr_t, ipfr_ifp))
59
60extern	ipfr_t	*ipfr_list, **ipfr_tail;
61extern	ipfr_t	*ipfr_natlist, **ipfr_nattail;
62extern	int	ipfr_size;
63extern	int	fr_ipfrttl;
64extern	int	fr_frag_lock;
65extern	int	fr_fraginit(void);
66extern	void	fr_fragunload(void);
67extern	ipfrstat_t	*fr_fragstats(void);
68
69extern	int	fr_newfrag(fr_info_t *, u_32_t);
70extern	frentry_t *fr_knownfrag(fr_info_t *, u_32_t *);
71
72extern	int	fr_nat_newfrag(fr_info_t *, u_32_t, struct nat *);
73extern	nat_t	*fr_nat_knownfrag(fr_info_t *);
74
75extern	int	fr_ipid_newfrag(fr_info_t *, u_32_t);
76extern	u_32_t	fr_ipid_knownfrag(fr_info_t *);
77#ifdef USE_MUTEXES
78extern	void	fr_fragderef(ipfr_t **, ipfrwlock_t *);
79extern	int	fr_nextfrag(ipftoken_t *, ipfgeniter_t *, ipfr_t **, \
80				 ipfr_t ***, ipfrwlock_t *);
81#else
82extern	void	fr_fragderef(ipfr_t **);
83extern	int	fr_nextfrag(ipftoken_t *, ipfgeniter_t *, ipfr_t **, \
84				 ipfr_t ***);
85#endif
86
87extern	void	fr_forget(void *);
88extern	void	fr_forgetnat(void *);
89extern	void	fr_fragclear(void);
90extern	void	fr_fragexpire(void);
91
92#if defined(_KERNEL) && ((defined(BSD) && (BSD >= 199306)) || SOLARIS || \
93    defined(__sgi) || defined(__osf__) || (defined(__sgi) && (IRIX >= 60500)))
94# if defined(SOLARIS2) && (SOLARIS2 < 7)
95extern	void	fr_slowtimer(void);
96# else
97extern	void	fr_slowtimer(void *);
98# endif
99#else
100# if defined(linux) && defined(_KERNEL)
101extern	void	fr_slowtimer(long);
102# else
103extern	int	fr_slowtimer(void);
104# endif
105#endif
106
107#endif /* _NETINET_IP_FRAG_H_ */
108