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
12typedef unsigned int u_32_t;
13# define U_32_T 1
14#endif
15
16typedef 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
23typedef 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
45struct ipf_rdx_head;
46
47typedef void (* radix_walk_func_t)(ipf_rdx_node_t *, void *);
48typedef ipf_rdx_node_t *(* idx_hamn_func_t)(struct ipf_rdx_head *,
49 addrfamily_t *, addrfamily_t *,
50 ipf_rdx_node_t *);
51typedef ipf_rdx_node_t *(* idx_ham_func_t)(struct ipf_rdx_head *,
52 addrfamily_t *, addrfamily_t *);
53typedef ipf_rdx_node_t *(* idx_ha_func_t)(struct ipf_rdx_head *,
54 addrfamily_t *);
55typedef void (* idx_walk_func_t)(struct ipf_rdx_head *,
56 radix_walk_func_t, void *);
57
58typedef 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
69typedef 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
84extern void *ipf_rx_create(void);
85extern int ipf_rx_init(void *);
86extern void ipf_rx_destroy(void *);
87extern int ipf_rx_inithead(radix_softc_t *, ipf_rdx_head_t **);
88extern void ipf_rx_freehead(ipf_rdx_head_t *);
89extern ipf_rdx_node_t *ipf_rx_addroute(ipf_rdx_head_t *,
90 addrfamily_t *, addrfamily_t *,
91 ipf_rdx_node_t *);
92extern ipf_rdx_node_t *ipf_rx_delete(ipf_rdx_head_t *, addrfamily_t *,
93 addrfamily_t *);
94extern void ipf_rx_walktree(ipf_rdx_head_t *, radix_walk_func_t,
95 void *);
96
97#endif /* __RADIX_IPF_H__ */
98