1145516Sdarrenr#ifndef __IP_HTABLE_H__
2145516Sdarrenr#define __IP_HTABLE_H__
3145516Sdarrenr
4145516Sdarrenr#include "netinet/ip_lookup.h"
5145516Sdarrenr
6145516Sdarrenrtypedef	struct	iphtent_s	{
7145516Sdarrenr	struct	iphtent_s	*ipe_next, **ipe_pnext;
8170263Sdarrenr	struct	iphtent_s	*ipe_hnext, **ipe_phnext;
9145516Sdarrenr	void		*ipe_ptr;
10145516Sdarrenr	i6addr_t	ipe_addr;
11145516Sdarrenr	i6addr_t	ipe_mask;
12145516Sdarrenr	int		ipe_ref;
13170263Sdarrenr	int		ipe_unit;
14145516Sdarrenr	union	{
15145516Sdarrenr		char	ipeu_char[16];
16145516Sdarrenr		u_long	ipeu_long;
17145516Sdarrenr		u_int	ipeu_int;
18145516Sdarrenr	}ipe_un;
19145516Sdarrenr} iphtent_t;
20145516Sdarrenr
21145516Sdarrenr#define	ipe_value	ipe_un.ipeu_int
22145516Sdarrenr#define	ipe_group	ipe_un.ipeu_char
23145516Sdarrenr
24145516Sdarrenr#define	IPE_HASH_FN(a, m, s)	(((a) * (m)) % (s))
25145516Sdarrenr
26145516Sdarrenr
27145516Sdarrenrtypedef	struct	iphtable_s	{
28145516Sdarrenr	ipfrwlock_t	iph_rwlock;
29145516Sdarrenr	struct	iphtable_s	*iph_next, **iph_pnext;
30145516Sdarrenr	struct	iphtent_s	**iph_table;
31170263Sdarrenr	struct	iphtent_s	*iph_list;
32145516Sdarrenr	size_t	iph_size;		/* size of hash table */
33145516Sdarrenr	u_long	iph_seed;		/* hashing seed */
34145516Sdarrenr	u_32_t	iph_flags;
35145516Sdarrenr	u_int	iph_unit;		/* IPL_LOG* */
36145516Sdarrenr	u_int	iph_ref;
37145516Sdarrenr	u_int	iph_type;		/* lookup or group map  - IPHASH_* */
38145516Sdarrenr	u_int	iph_masks;		/* IPv4 netmasks in use */
39145516Sdarrenr	char	iph_name[FR_GROUPLEN];	/* hash table number */
40145516Sdarrenr} iphtable_t;
41145516Sdarrenr
42145516Sdarrenr/* iph_type */
43145516Sdarrenr#define	IPHASH_LOOKUP	0
44145516Sdarrenr#define	IPHASH_GROUPMAP	1
45170263Sdarrenr#define	IPHASH_DELETE	2
46145516Sdarrenr#define	IPHASH_ANON	0x80000000
47145516Sdarrenr
48145516Sdarrenr
49145516Sdarrenrtypedef	struct	iphtstat_s	{
50145516Sdarrenr	iphtable_t	*iphs_tables;
51145516Sdarrenr	u_long		iphs_numtables;
52145516Sdarrenr	u_long		iphs_numnodes;
53145516Sdarrenr	u_long		iphs_nomem;
54145516Sdarrenr	u_long		iphs_pad[16];
55145516Sdarrenr} iphtstat_t;
56145516Sdarrenr
57145516Sdarrenr
58145516Sdarrenrextern iphtable_t *ipf_htables[IPL_LOGSIZE];
59145516Sdarrenr
60170263Sdarrenrextern iphtable_t *fr_existshtable __P((int, char *));
61170263Sdarrenrextern int fr_clearhtable __P((iphtable_t *));
62145516Sdarrenrextern void fr_htable_unload __P((void));
63145516Sdarrenrextern int fr_newhtable __P((iplookupop_t *));
64145516Sdarrenrextern iphtable_t *fr_findhtable __P((int, char *));
65170263Sdarrenrextern int fr_removehtable __P((int, char *));
66145516Sdarrenrextern size_t fr_flushhtable __P((iplookupflush_t *));
67145516Sdarrenrextern int fr_addhtent __P((iphtable_t *, iphtent_t *));
68145516Sdarrenrextern int fr_delhtent __P((iphtable_t *, iphtent_t *));
69170263Sdarrenrextern int fr_derefhtable __P((iphtable_t *));
70170263Sdarrenrextern int fr_derefhtent __P((iphtent_t *));
71170263Sdarrenrextern int fr_delhtable __P((iphtable_t *));
72145516Sdarrenrextern void *fr_iphmfindgroup __P((void *, void *));
73145516Sdarrenrextern int fr_iphmfindip __P((void *, int, void *));
74145516Sdarrenrextern int fr_gethtablestat __P((iplookupop_t *));
75170263Sdarrenrextern int fr_htable_getnext __P((ipftoken_t *, ipflookupiter_t *));
76170263Sdarrenrextern void fr_htable_iterderef __P((u_int, int, void *));
77145516Sdarrenr
78145516Sdarrenr#endif /* __IP_HTABLE_H__ */
79