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 | |