1 /*
2  * Copyright (C) 2012 by Darren Reed.
3  *
4  * See the IPFILTER.LICENCE file for details on licencing.
5  */
6 #ifndef __RADIX_IPF_H__
7 #define	__RADIX_IPF_H__
8 
9 #ifndef U_32_T
10 typedef unsigned int u_32_t;
11 # define	U_32_T	1
12 #endif
13 
14 typedef struct ipf_rdx_mask {
15 	struct ipf_rdx_mask	*next;
16 	struct ipf_rdx_node	*node;
17 	u_32_t			*mask;
18 	int			maskbitcount;
19 } ipf_rdx_mask_t;
20 
21 typedef struct ipf_rdx_node {
22 	struct ipf_rdx_node	*left;
23 	struct ipf_rdx_node	*right;
24 	struct ipf_rdx_node	*parent;
25 	struct ipf_rdx_node	*dupkey;
26 	struct ipf_rdx_mask	*masks;
27 	struct ipf_rdx_mask	*mymask;
28 	u_32_t			*addrkey;
29 	u_32_t			*maskkey;
30 	u_32_t			*addroff;
31 	u_32_t			*maskoff;
32 	u_32_t			lastmask;
33 	u_32_t			bitmask;
34 	int			offset;
35 	int			index;
36 	int			maskbitcount;
37 	int			root;
38 #ifdef RDX_DEBUG
39 	char			name[40];
40 #endif
41 } ipf_rdx_node_t;
42 
43 struct ipf_rdx_head;
44 
45 typedef	void		(* radix_walk_func_t)(ipf_rdx_node_t *, void *);
46 typedef	ipf_rdx_node_t	*(* idx_hamn_func_t)(struct ipf_rdx_head *,
47 					     addrfamily_t *, addrfamily_t *,
48 					     ipf_rdx_node_t *);
49 typedef	ipf_rdx_node_t	*(* idx_ham_func_t)(struct ipf_rdx_head *,
50 					    addrfamily_t *, addrfamily_t *);
51 typedef	ipf_rdx_node_t	*(* idx_ha_func_t)(struct ipf_rdx_head *,
52 					   addrfamily_t *);
53 typedef	void		(* idx_walk_func_t)(struct ipf_rdx_head *,
54 					    radix_walk_func_t, void *);
55 
56 typedef struct ipf_rdx_head {
57 	ipf_rdx_node_t	*root;
58 	ipf_rdx_node_t	nodes[3];
59 	ipfmutex_t	lock;
60 	idx_hamn_func_t	addaddr;	/* add addr/mask to tree */
61 	idx_ham_func_t	deladdr;	/* delete addr/mask from tree */
62 	idx_ham_func_t	lookup;		/* look for specific addr/mask */
63 	idx_ha_func_t	matchaddr;	/* search tree for address match */
64 	idx_walk_func_t	walktree;	/* walk entire tree */
65 } ipf_rdx_head_t;
66 
67 typedef struct radix_softc {
68 	u_char			*zeros;
69 	u_char			*ones;
70 } radix_softc_t;
71 
72 #undef	RADIX_NODE_HEAD_LOCK
73 #undef	RADIX_NODE_HEAD_UNLOCK
74 #ifdef	_KERNEL
75 # define	RADIX_NODE_HEAD_LOCK(x)		MUTEX_ENTER(&(x)->lock)
76 # define	RADIX_NODE_HEAD_UNLOCK(x)	MUTEX_UNLOCK(&(x)->lock)
77 #else
78 # define	RADIX_NODE_HEAD_LOCK(x)
79 # define	RADIX_NODE_HEAD_UNLOCK(x)
80 #endif
81 
82 extern	void	*ipf_rx_create(void);
83 extern	int	ipf_rx_init(void *);
84 extern	void	ipf_rx_destroy(void *);
85 extern	int	ipf_rx_inithead(radix_softc_t *, ipf_rdx_head_t **);
86 extern	void	ipf_rx_freehead(ipf_rdx_head_t *);
87 extern	ipf_rdx_node_t *ipf_rx_addroute(ipf_rdx_head_t *,
88 					     addrfamily_t *, addrfamily_t *,
89 					     ipf_rdx_node_t *);
90 extern	ipf_rdx_node_t *ipf_rx_delete(ipf_rdx_head_t *, addrfamily_t *,
91 					   addrfamily_t *);
92 extern	void	ipf_rx_walktree(ipf_rdx_head_t *, radix_walk_func_t,
93 				     void *);
94 
95 #endif /* __RADIX_IPF_H__ */
96