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