1145519Sdarrenr/*	$FreeBSD$	*/
2145510Sdarrenr
3145510Sdarrenr/*
4255332Scy * Copyright (C) 2012 by Darren Reed.
5145510Sdarrenr *
6255332Scy * See the IPFILTER.LICENCE file for details on licencing.
7145510Sdarrenr */
8255332Scy#ifndef __RADIX_IPF_H__
9255332Scy#define	__RADIX_IPF_H__
10145510Sdarrenr
11255332Scy#ifndef U_32_T
12255332Scytypedef unsigned int u_32_t;
13255332Scy# define	U_32_T	1
14145510Sdarrenr#endif
15145510Sdarrenr
16255332Scytypedef struct ipf_rdx_mask {
17255332Scy	struct ipf_rdx_mask	*next;
18255332Scy	struct ipf_rdx_node	*node;
19255332Scy	u_32_t			*mask;
20255332Scy	int			maskbitcount;
21255332Scy} ipf_rdx_mask_t;
22145510Sdarrenr
23255332Scytypedef struct ipf_rdx_node {
24255332Scy	struct ipf_rdx_node	*left;
25255332Scy	struct ipf_rdx_node	*right;
26255332Scy	struct ipf_rdx_node	*parent;
27255332Scy	struct ipf_rdx_node	*dupkey;
28255332Scy	struct ipf_rdx_mask	*masks;
29255332Scy	struct ipf_rdx_mask	*mymask;
30255332Scy	u_32_t			*addrkey;
31255332Scy	u_32_t			*maskkey;
32255332Scy	u_32_t			*addroff;
33255332Scy	u_32_t			*maskoff;
34255332Scy	u_32_t			lastmask;
35255332Scy	u_32_t			bitmask;
36255332Scy	int			offset;
37255332Scy	int			index;
38255332Scy	int			maskbitcount;
39255332Scy	int			root;
40255332Scy#ifdef RDX_DEBUG
41255332Scy	char			name[40];
42145510Sdarrenr#endif
43255332Scy} ipf_rdx_node_t;
44145510Sdarrenr
45255332Scystruct ipf_rdx_head;
46145510Sdarrenr
47255332Scytypedef	void		(* radix_walk_func_t)(ipf_rdx_node_t *, void *);
48255332Scytypedef	ipf_rdx_node_t	*(* idx_hamn_func_t)(struct ipf_rdx_head *,
49255332Scy					     addrfamily_t *, addrfamily_t *,
50255332Scy					     ipf_rdx_node_t *);
51255332Scytypedef	ipf_rdx_node_t	*(* idx_ham_func_t)(struct ipf_rdx_head *,
52255332Scy					    addrfamily_t *, addrfamily_t *);
53255332Scytypedef	ipf_rdx_node_t	*(* idx_ha_func_t)(struct ipf_rdx_head *,
54255332Scy					   addrfamily_t *);
55255332Scytypedef	void		(* idx_walk_func_t)(struct ipf_rdx_head *,
56255332Scy					    radix_walk_func_t, void *);
57145510Sdarrenr
58255332Scytypedef struct ipf_rdx_head {
59255332Scy	ipf_rdx_node_t	*root;
60255332Scy	ipf_rdx_node_t	nodes[3];
61255332Scy	ipfmutex_t	lock;
62255332Scy	idx_hamn_func_t	addaddr;	/* add addr/mask to tree */
63255332Scy	idx_ham_func_t	deladdr;	/* delete addr/mask from tree */
64255332Scy	idx_ham_func_t	lookup;		/* look for specific addr/mask */
65255332Scy	idx_ha_func_t	matchaddr;	/* search tree for address match */
66255332Scy	idx_walk_func_t	walktree;	/* walk entire tree */
67255332Scy} ipf_rdx_head_t;
68145510Sdarrenr
69255332Scytypedef struct radix_softc {
70255332Scy	u_char			*zeros;
71255332Scy	u_char			*ones;
72255332Scy} radix_softc_t;
73145510Sdarrenr
74255332Scy#undef	RADIX_NODE_HEAD_LOCK
75255332Scy#undef	RADIX_NODE_HEAD_UNLOCK
76255332Scy#ifdef	_KERNEL
77255332Scy# define	RADIX_NODE_HEAD_LOCK(x)		MUTEX_ENTER(&(x)->lock)
78255332Scy# define	RADIX_NODE_HEAD_UNLOCK(x)	MUTEX_UNLOCK(&(x)->lock)
79145510Sdarrenr#else
80255332Scy# define	RADIX_NODE_HEAD_LOCK(x)
81255332Scy# define	RADIX_NODE_HEAD_UNLOCK(x)
82145510Sdarrenr#endif
83145510Sdarrenr
84255332Scyextern	void	*ipf_rx_create __P((void));
85255332Scyextern	int	ipf_rx_init __P((void *));
86255332Scyextern	void	ipf_rx_destroy __P((void *));
87255332Scyextern	int	ipf_rx_inithead __P((radix_softc_t *, ipf_rdx_head_t **));
88255332Scyextern	void	ipf_rx_freehead __P((ipf_rdx_head_t *));
89255332Scyextern	ipf_rdx_node_t *ipf_rx_addroute __P((ipf_rdx_head_t *,
90255332Scy					     addrfamily_t *, addrfamily_t *,
91255332Scy					     ipf_rdx_node_t *));
92255332Scyextern	ipf_rdx_node_t *ipf_rx_delete __P((ipf_rdx_head_t *, addrfamily_t *,
93255332Scy					   addrfamily_t *));
94255332Scyextern	void	ipf_rx_walktree __P((ipf_rdx_head_t *, radix_walk_func_t,
95255332Scy				     void *));
96145510Sdarrenr
97255332Scy#endif /* __RADIX_IPF_H__ */
98