1254562Scy/*
2254562Scy * Copyright (C) 2012 by Darren Reed.
3254562Scy *
4254562Scy * See the IPFILTER.LICENCE file for details on licencing.
5254562Scy */
6254562Scy#ifndef __RADIX_IPF_H__
7254562Scy#define	__RADIX_IPF_H__
8254562Scy
9254562Scy#ifndef U_32_T
10254562Scytypedef unsigned int u_32_t;
11254562Scy# define	U_32_T	1
12254562Scy#endif
13254562Scy
14254562Scytypedef struct ipf_rdx_mask {
15254562Scy	struct ipf_rdx_mask	*next;
16254562Scy	struct ipf_rdx_node	*node;
17254562Scy	u_32_t			*mask;
18254562Scy	int			maskbitcount;
19254562Scy} ipf_rdx_mask_t;
20254562Scy
21254562Scytypedef struct ipf_rdx_node {
22254562Scy	struct ipf_rdx_node	*left;
23254562Scy	struct ipf_rdx_node	*right;
24254562Scy	struct ipf_rdx_node	*parent;
25254562Scy	struct ipf_rdx_node	*dupkey;
26254562Scy	struct ipf_rdx_mask	*masks;
27254562Scy	struct ipf_rdx_mask	*mymask;
28254562Scy	u_32_t			*addrkey;
29254562Scy	u_32_t			*maskkey;
30254562Scy	u_32_t			*addroff;
31254562Scy	u_32_t			*maskoff;
32254562Scy	u_32_t			lastmask;
33254562Scy	u_32_t			bitmask;
34254562Scy	int			offset;
35254562Scy	int			index;
36254562Scy	int			maskbitcount;
37254562Scy	int			root;
38254562Scy#ifdef RDX_DEBUG
39254562Scy	char			name[40];
40254562Scy#endif
41254562Scy} ipf_rdx_node_t;
42254562Scy
43254562Scystruct ipf_rdx_head;
44254562Scy
45254562Scytypedef	void		(* radix_walk_func_t)(ipf_rdx_node_t *, void *);
46254562Scytypedef	ipf_rdx_node_t	*(* idx_hamn_func_t)(struct ipf_rdx_head *,
47254562Scy					     addrfamily_t *, addrfamily_t *,
48254562Scy					     ipf_rdx_node_t *);
49254562Scytypedef	ipf_rdx_node_t	*(* idx_ham_func_t)(struct ipf_rdx_head *,
50254562Scy					    addrfamily_t *, addrfamily_t *);
51254562Scytypedef	ipf_rdx_node_t	*(* idx_ha_func_t)(struct ipf_rdx_head *,
52254562Scy					   addrfamily_t *);
53254562Scytypedef	void		(* idx_walk_func_t)(struct ipf_rdx_head *,
54254562Scy					    radix_walk_func_t, void *);
55254562Scy
56254562Scytypedef struct ipf_rdx_head {
57254562Scy	ipf_rdx_node_t	*root;
58254562Scy	ipf_rdx_node_t	nodes[3];
59254562Scy	ipfmutex_t	lock;
60254562Scy	idx_hamn_func_t	addaddr;	/* add addr/mask to tree */
61254562Scy	idx_ham_func_t	deladdr;	/* delete addr/mask from tree */
62254562Scy	idx_ham_func_t	lookup;		/* look for specific addr/mask */
63254562Scy	idx_ha_func_t	matchaddr;	/* search tree for address match */
64254562Scy	idx_walk_func_t	walktree;	/* walk entire tree */
65254562Scy} ipf_rdx_head_t;
66254562Scy
67254562Scytypedef struct radix_softc {
68254562Scy	u_char			*zeros;
69254562Scy	u_char			*ones;
70254562Scy} radix_softc_t;
71254562Scy
72254562Scy#undef	RADIX_NODE_HEAD_LOCK
73254562Scy#undef	RADIX_NODE_HEAD_UNLOCK
74254562Scy#ifdef	_KERNEL
75254562Scy# define	RADIX_NODE_HEAD_LOCK(x)		MUTEX_ENTER(&(x)->lock)
76254562Scy# define	RADIX_NODE_HEAD_UNLOCK(x)	MUTEX_UNLOCK(&(x)->lock)
77254562Scy#else
78254562Scy# define	RADIX_NODE_HEAD_LOCK(x)
79254562Scy# define	RADIX_NODE_HEAD_UNLOCK(x)
80254562Scy#endif
81254562Scy
82254562Scyextern	void	*ipf_rx_create __P((void));
83254562Scyextern	int	ipf_rx_init __P((void *));
84254562Scyextern	void	ipf_rx_destroy __P((void *));
85254562Scyextern	int	ipf_rx_inithead __P((radix_softc_t *, ipf_rdx_head_t **));
86254562Scyextern	void	ipf_rx_freehead __P((ipf_rdx_head_t *));
87254562Scyextern	ipf_rdx_node_t *ipf_rx_addroute __P((ipf_rdx_head_t *,
88254562Scy					     addrfamily_t *, addrfamily_t *,
89254562Scy					     ipf_rdx_node_t *));
90254562Scyextern	ipf_rdx_node_t *ipf_rx_delete __P((ipf_rdx_head_t *, addrfamily_t *,
91254562Scy					   addrfamily_t *));
92254562Scyextern	void	ipf_rx_walktree __P((ipf_rdx_head_t *, radix_walk_func_t,
93254562Scy				     void *));
94254562Scy
95254562Scy#endif /* __RADIX_IPF_H__ */
96