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