1254562Scy/* 2254562Scy * Copyright (C) 2012 by Darren Reed. 3254562Scy * 4254562Scy * See the IPFILTER.LICENCE file for details on licencing. 5254562Scy */ 6254562Scy#ifndef __RADIX_IPF_H__ 7254562Scy#define __RADIX_IPF_H__ 8254562Scy 9254562Scy#ifndef U_32_T 10254562Scytypedef unsigned int u_32_t; 11254562Scy# define U_32_T 1 12254562Scy#endif 13254562Scy 14254562Scytypedef struct ipf_rdx_mask { 15254562Scy struct ipf_rdx_mask *next; 16254562Scy struct ipf_rdx_node *node; 17254562Scy u_32_t *mask; 18254562Scy int maskbitcount; 19254562Scy} ipf_rdx_mask_t; 20254562Scy 21254562Scytypedef struct ipf_rdx_node { 22254562Scy struct ipf_rdx_node *left; 23254562Scy struct ipf_rdx_node *right; 24254562Scy struct ipf_rdx_node *parent; 25254562Scy struct ipf_rdx_node *dupkey; 26254562Scy struct ipf_rdx_mask *masks; 27254562Scy struct ipf_rdx_mask *mymask; 28254562Scy u_32_t *addrkey; 29254562Scy u_32_t *maskkey; 30254562Scy u_32_t *addroff; 31254562Scy u_32_t *maskoff; 32254562Scy u_32_t lastmask; 33254562Scy u_32_t bitmask; 34254562Scy int offset; 35254562Scy int index; 36254562Scy int maskbitcount; 37254562Scy int root; 38254562Scy#ifdef RDX_DEBUG 39254562Scy char name[40]; 40254562Scy#endif 41254562Scy} ipf_rdx_node_t; 42254562Scy 43254562Scystruct ipf_rdx_head; 44254562Scy 45254562Scytypedef void (* radix_walk_func_t)(ipf_rdx_node_t *, void *); 46254562Scytypedef ipf_rdx_node_t *(* idx_hamn_func_t)(struct ipf_rdx_head *, 47254562Scy addrfamily_t *, addrfamily_t *, 48254562Scy ipf_rdx_node_t *); 49254562Scytypedef ipf_rdx_node_t *(* idx_ham_func_t)(struct ipf_rdx_head *, 50254562Scy addrfamily_t *, addrfamily_t *); 51254562Scytypedef ipf_rdx_node_t *(* idx_ha_func_t)(struct ipf_rdx_head *, 52254562Scy addrfamily_t *); 53254562Scytypedef void (* idx_walk_func_t)(struct ipf_rdx_head *, 54254562Scy radix_walk_func_t, void *); 55254562Scy 56254562Scytypedef struct ipf_rdx_head { 57254562Scy ipf_rdx_node_t *root; 58254562Scy ipf_rdx_node_t nodes[3]; 59254562Scy ipfmutex_t lock; 60254562Scy idx_hamn_func_t addaddr; /* add addr/mask to tree */ 61254562Scy idx_ham_func_t deladdr; /* delete addr/mask from tree */ 62254562Scy idx_ham_func_t lookup; /* look for specific addr/mask */ 63254562Scy idx_ha_func_t matchaddr; /* search tree for address match */ 64254562Scy idx_walk_func_t walktree; /* walk entire tree */ 65254562Scy} ipf_rdx_head_t; 66254562Scy 67254562Scytypedef struct radix_softc { 68254562Scy u_char *zeros; 69254562Scy u_char *ones; 70254562Scy} radix_softc_t; 71254562Scy 72254562Scy#undef RADIX_NODE_HEAD_LOCK 73254562Scy#undef RADIX_NODE_HEAD_UNLOCK 74254562Scy#ifdef _KERNEL 75254562Scy# define RADIX_NODE_HEAD_LOCK(x) MUTEX_ENTER(&(x)->lock) 76254562Scy# define RADIX_NODE_HEAD_UNLOCK(x) MUTEX_UNLOCK(&(x)->lock) 77254562Scy#else 78254562Scy# define RADIX_NODE_HEAD_LOCK(x) 79254562Scy# define RADIX_NODE_HEAD_UNLOCK(x) 80254562Scy#endif 81254562Scy 82254562Scyextern void *ipf_rx_create __P((void)); 83254562Scyextern int ipf_rx_init __P((void *)); 84254562Scyextern void ipf_rx_destroy __P((void *)); 85254562Scyextern int ipf_rx_inithead __P((radix_softc_t *, ipf_rdx_head_t **)); 86254562Scyextern void ipf_rx_freehead __P((ipf_rdx_head_t *)); 87254562Scyextern ipf_rdx_node_t *ipf_rx_addroute __P((ipf_rdx_head_t *, 88254562Scy addrfamily_t *, addrfamily_t *, 89254562Scy ipf_rdx_node_t *)); 90254562Scyextern ipf_rdx_node_t *ipf_rx_delete __P((ipf_rdx_head_t *, addrfamily_t *, 91254562Scy addrfamily_t *)); 92254562Scyextern void ipf_rx_walktree __P((ipf_rdx_head_t *, radix_walk_func_t, 93254562Scy void *)); 94254562Scy 95254562Scy#endif /* __RADIX_IPF_H__ */ 96