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