radix_ipf.h revision 1.3 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