radix_ipf.h revision 254562
1215976Sjmallett/*
2215976Sjmallett * Copyright (C) 2012 by Darren Reed.
3215976Sjmallett *
4215976Sjmallett * See the IPFILTER.LICENCE file for details on licencing.
5215976Sjmallett */
6215976Sjmallett#ifndef __RADIX_IPF_H__
7215976Sjmallett#define	__RADIX_IPF_H__
8215976Sjmallett
9215976Sjmallett#ifndef U_32_T
10215976Sjmalletttypedef unsigned int u_32_t;
11215976Sjmallett# define	U_32_T	1
12215976Sjmallett#endif
13215976Sjmallett
14215976Sjmalletttypedef struct ipf_rdx_mask {
15215976Sjmallett	struct ipf_rdx_mask	*next;
16215976Sjmallett	struct ipf_rdx_node	*node;
17215976Sjmallett	u_32_t			*mask;
18215976Sjmallett	int			maskbitcount;
19215976Sjmallett} ipf_rdx_mask_t;
20215976Sjmallett
21215976Sjmalletttypedef struct ipf_rdx_node {
22215976Sjmallett	struct ipf_rdx_node	*left;
23215976Sjmallett	struct ipf_rdx_node	*right;
24215976Sjmallett	struct ipf_rdx_node	*parent;
25215976Sjmallett	struct ipf_rdx_node	*dupkey;
26215976Sjmallett	struct ipf_rdx_mask	*masks;
27215976Sjmallett	struct ipf_rdx_mask	*mymask;
28215976Sjmallett	u_32_t			*addrkey;
29215976Sjmallett	u_32_t			*maskkey;
30215976Sjmallett	u_32_t			*addroff;
31215976Sjmallett	u_32_t			*maskoff;
32215976Sjmallett	u_32_t			lastmask;
33215976Sjmallett	u_32_t			bitmask;
34215976Sjmallett	int			offset;
35215976Sjmallett	int			index;
36215976Sjmallett	int			maskbitcount;
37215976Sjmallett	int			root;
38215976Sjmallett#ifdef RDX_DEBUG
39215976Sjmallett	char			name[40];
40215976Sjmallett#endif
41215976Sjmallett} ipf_rdx_node_t;
42215976Sjmallett
43215976Sjmallettstruct ipf_rdx_head;
44215976Sjmallett
45215976Sjmalletttypedef	void		(* radix_walk_func_t)(ipf_rdx_node_t *, void *);
46215976Sjmalletttypedef	ipf_rdx_node_t	*(* idx_hamn_func_t)(struct ipf_rdx_head *,
47215976Sjmallett					     addrfamily_t *, addrfamily_t *,
48215976Sjmallett					     ipf_rdx_node_t *);
49215976Sjmalletttypedef	ipf_rdx_node_t	*(* idx_ham_func_t)(struct ipf_rdx_head *,
50215976Sjmallett					    addrfamily_t *, addrfamily_t *);
51215976Sjmalletttypedef	ipf_rdx_node_t	*(* idx_ha_func_t)(struct ipf_rdx_head *,
52215976Sjmallett					   addrfamily_t *);
53215976Sjmalletttypedef	void		(* idx_walk_func_t)(struct ipf_rdx_head *,
54215976Sjmallett					    radix_walk_func_t, void *);
55215976Sjmallett
56215976Sjmalletttypedef struct ipf_rdx_head {
57215976Sjmallett	ipf_rdx_node_t	*root;
58215976Sjmallett	ipf_rdx_node_t	nodes[3];
59215976Sjmallett	ipfmutex_t	lock;
60215976Sjmallett	idx_hamn_func_t	addaddr;	/* add addr/mask to tree */
61215976Sjmallett	idx_ham_func_t	deladdr;	/* delete addr/mask from tree */
62215976Sjmallett	idx_ham_func_t	lookup;		/* look for specific addr/mask */
63215976Sjmallett	idx_ha_func_t	matchaddr;	/* search tree for address match */
64215976Sjmallett	idx_walk_func_t	walktree;	/* walk entire tree */
65215976Sjmallett} ipf_rdx_head_t;
66215976Sjmallett
67215976Sjmalletttypedef struct radix_softc {
68215976Sjmallett	u_char			*zeros;
69215976Sjmallett	u_char			*ones;
70215976Sjmallett} radix_softc_t;
71215976Sjmallett
72215976Sjmallett#undef	RADIX_NODE_HEAD_LOCK
73215976Sjmallett#undef	RADIX_NODE_HEAD_UNLOCK
74215976Sjmallett#ifdef	_KERNEL
75215976Sjmallett# define	RADIX_NODE_HEAD_LOCK(x)		MUTEX_ENTER(&(x)->lock)
76215976Sjmallett# define	RADIX_NODE_HEAD_UNLOCK(x)	MUTEX_UNLOCK(&(x)->lock)
77215976Sjmallett#else
78215976Sjmallett# define	RADIX_NODE_HEAD_LOCK(x)
79215976Sjmallett# define	RADIX_NODE_HEAD_UNLOCK(x)
80215976Sjmallett#endif
81215976Sjmallett
82215976Sjmallettextern	void	*ipf_rx_create __P((void));
83215976Sjmallettextern	int	ipf_rx_init __P((void *));
84215976Sjmallettextern	void	ipf_rx_destroy __P((void *));
85215976Sjmallettextern	int	ipf_rx_inithead __P((radix_softc_t *, ipf_rdx_head_t **));
86215976Sjmallettextern	void	ipf_rx_freehead __P((ipf_rdx_head_t *));
87215976Sjmallettextern	ipf_rdx_node_t *ipf_rx_addroute __P((ipf_rdx_head_t *,
88215976Sjmallett					     addrfamily_t *, addrfamily_t *,
89215976Sjmallett					     ipf_rdx_node_t *));
90215976Sjmallettextern	ipf_rdx_node_t *ipf_rx_delete __P((ipf_rdx_head_t *, addrfamily_t *,
91215976Sjmallett					   addrfamily_t *));
92215976Sjmallettextern	void	ipf_rx_walktree __P((ipf_rdx_head_t *, radix_walk_func_t,
93215976Sjmallett				     void *));
94215976Sjmallett
95215976Sjmallett#endif /* __RADIX_IPF_H__ */
96215976Sjmallett