radix_ipf.h revision 1.2 1 /* $NetBSD: radix_ipf.h,v 1.2 2012/03/23 20:39:50 christos Exp $ */
2
3 /*
4 * Copyright (C) 2011 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 int last_zeroed;
73 } radix_softc_t;
74
75 #undef RADIX_NODE_HEAD_LOCK
76 #undef RADIX_NODE_HEAD_UNLOCK
77 #ifdef _KERNEL
78 # define RADIX_NODE_HEAD_LOCK(x) MUTEX_ENTER(&(x)->lock)
79 # define RADIX_NODE_HEAD_UNLOCK(x) MUTEX_UNLOCK(&(x)->lock)
80 #else
81 # define RADIX_NODE_HEAD_LOCK(x)
82 # define RADIX_NODE_HEAD_UNLOCK(x)
83 #endif
84
85 extern void *ipf_rx_create(void);
86 extern int ipf_rx_init(void *);
87 extern void ipf_rx_destroy(void *);
88 extern int ipf_rx_inithead(radix_softc_t *, ipf_rdx_head_t **);
89 extern void ipf_rx_freehead(ipf_rdx_head_t *);
90 extern ipf_rdx_node_t *ipf_rx_addroute(ipf_rdx_head_t *,
91 addrfamily_t *, addrfamily_t *,
92 ipf_rdx_node_t *);
93 extern ipf_rdx_node_t *ipf_rx_delete(ipf_rdx_head_t *, addrfamily_t *,
94 addrfamily_t *);
95 extern void ipf_rx_walktree(ipf_rdx_head_t *, radix_walk_func_t,
96 void *);
97
98 #endif /* __RADIX_IPF_H__ */
99