master
 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
10typedef unsigned int u_32_t;
11# define	U_32_T	1
12#endif
13
14typedef 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
21typedef 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
43struct ipf_rdx_head;
44
45typedef	void		(* radix_walk_func_t)(ipf_rdx_node_t *, void *);
46typedef	ipf_rdx_node_t	*(* idx_hamn_func_t)(struct ipf_rdx_head *,
47					     addrfamily_t *, addrfamily_t *,
48					     ipf_rdx_node_t *);
49typedef	ipf_rdx_node_t	*(* idx_ham_func_t)(struct ipf_rdx_head *,
50					    addrfamily_t *, addrfamily_t *);
51typedef	ipf_rdx_node_t	*(* idx_ha_func_t)(struct ipf_rdx_head *,
52					   addrfamily_t *);
53typedef	void		(* idx_walk_func_t)(struct ipf_rdx_head *,
54					    radix_walk_func_t, void *);
55
56typedef 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
67typedef 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
82extern	void	*ipf_rx_create(void);
83extern	int	ipf_rx_init(void *);
84extern	void	ipf_rx_destroy(void *);
85extern	int	ipf_rx_inithead(radix_softc_t *, ipf_rdx_head_t **);
86extern	void	ipf_rx_freehead(ipf_rdx_head_t *);
87extern	ipf_rdx_node_t *ipf_rx_addroute(ipf_rdx_head_t *,
88					     addrfamily_t *, addrfamily_t *,
89					     ipf_rdx_node_t *);
90extern	ipf_rdx_node_t *ipf_rx_delete(ipf_rdx_head_t *, addrfamily_t *,
91					   addrfamily_t *);
92extern	void	ipf_rx_walktree(ipf_rdx_head_t *, radix_walk_func_t,
93				     void *);
94
95#endif /* __RADIX_IPF_H__ */