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