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