radix_ipf.h revision 254562
1215976Sjmallett/* 2215976Sjmallett * Copyright (C) 2012 by Darren Reed. 3215976Sjmallett * 4215976Sjmallett * See the IPFILTER.LICENCE file for details on licencing. 5215976Sjmallett */ 6215976Sjmallett#ifndef __RADIX_IPF_H__ 7215976Sjmallett#define __RADIX_IPF_H__ 8215976Sjmallett 9215976Sjmallett#ifndef U_32_T 10215976Sjmalletttypedef unsigned int u_32_t; 11215976Sjmallett# define U_32_T 1 12215976Sjmallett#endif 13215976Sjmallett 14215976Sjmalletttypedef struct ipf_rdx_mask { 15215976Sjmallett struct ipf_rdx_mask *next; 16215976Sjmallett struct ipf_rdx_node *node; 17215976Sjmallett u_32_t *mask; 18215976Sjmallett int maskbitcount; 19215976Sjmallett} ipf_rdx_mask_t; 20215976Sjmallett 21215976Sjmalletttypedef struct ipf_rdx_node { 22215976Sjmallett struct ipf_rdx_node *left; 23215976Sjmallett struct ipf_rdx_node *right; 24215976Sjmallett struct ipf_rdx_node *parent; 25215976Sjmallett struct ipf_rdx_node *dupkey; 26215976Sjmallett struct ipf_rdx_mask *masks; 27215976Sjmallett struct ipf_rdx_mask *mymask; 28215976Sjmallett u_32_t *addrkey; 29215976Sjmallett u_32_t *maskkey; 30215976Sjmallett u_32_t *addroff; 31215976Sjmallett u_32_t *maskoff; 32215976Sjmallett u_32_t lastmask; 33215976Sjmallett u_32_t bitmask; 34215976Sjmallett int offset; 35215976Sjmallett int index; 36215976Sjmallett int maskbitcount; 37215976Sjmallett int root; 38215976Sjmallett#ifdef RDX_DEBUG 39215976Sjmallett char name[40]; 40215976Sjmallett#endif 41215976Sjmallett} ipf_rdx_node_t; 42215976Sjmallett 43215976Sjmallettstruct ipf_rdx_head; 44215976Sjmallett 45215976Sjmalletttypedef void (* radix_walk_func_t)(ipf_rdx_node_t *, void *); 46215976Sjmalletttypedef ipf_rdx_node_t *(* idx_hamn_func_t)(struct ipf_rdx_head *, 47215976Sjmallett addrfamily_t *, addrfamily_t *, 48215976Sjmallett ipf_rdx_node_t *); 49215976Sjmalletttypedef ipf_rdx_node_t *(* idx_ham_func_t)(struct ipf_rdx_head *, 50215976Sjmallett addrfamily_t *, addrfamily_t *); 51215976Sjmalletttypedef ipf_rdx_node_t *(* idx_ha_func_t)(struct ipf_rdx_head *, 52215976Sjmallett addrfamily_t *); 53215976Sjmalletttypedef void (* idx_walk_func_t)(struct ipf_rdx_head *, 54215976Sjmallett radix_walk_func_t, void *); 55215976Sjmallett 56215976Sjmalletttypedef struct ipf_rdx_head { 57215976Sjmallett ipf_rdx_node_t *root; 58215976Sjmallett ipf_rdx_node_t nodes[3]; 59215976Sjmallett ipfmutex_t lock; 60215976Sjmallett idx_hamn_func_t addaddr; /* add addr/mask to tree */ 61215976Sjmallett idx_ham_func_t deladdr; /* delete addr/mask from tree */ 62215976Sjmallett idx_ham_func_t lookup; /* look for specific addr/mask */ 63215976Sjmallett idx_ha_func_t matchaddr; /* search tree for address match */ 64215976Sjmallett idx_walk_func_t walktree; /* walk entire tree */ 65215976Sjmallett} ipf_rdx_head_t; 66215976Sjmallett 67215976Sjmalletttypedef struct radix_softc { 68215976Sjmallett u_char *zeros; 69215976Sjmallett u_char *ones; 70215976Sjmallett} radix_softc_t; 71215976Sjmallett 72215976Sjmallett#undef RADIX_NODE_HEAD_LOCK 73215976Sjmallett#undef RADIX_NODE_HEAD_UNLOCK 74215976Sjmallett#ifdef _KERNEL 75215976Sjmallett# define RADIX_NODE_HEAD_LOCK(x) MUTEX_ENTER(&(x)->lock) 76215976Sjmallett# define RADIX_NODE_HEAD_UNLOCK(x) MUTEX_UNLOCK(&(x)->lock) 77215976Sjmallett#else 78215976Sjmallett# define RADIX_NODE_HEAD_LOCK(x) 79215976Sjmallett# define RADIX_NODE_HEAD_UNLOCK(x) 80215976Sjmallett#endif 81215976Sjmallett 82215976Sjmallettextern void *ipf_rx_create __P((void)); 83215976Sjmallettextern int ipf_rx_init __P((void *)); 84215976Sjmallettextern void ipf_rx_destroy __P((void *)); 85215976Sjmallettextern int ipf_rx_inithead __P((radix_softc_t *, ipf_rdx_head_t **)); 86215976Sjmallettextern void ipf_rx_freehead __P((ipf_rdx_head_t *)); 87215976Sjmallettextern ipf_rdx_node_t *ipf_rx_addroute __P((ipf_rdx_head_t *, 88215976Sjmallett addrfamily_t *, addrfamily_t *, 89215976Sjmallett ipf_rdx_node_t *)); 90215976Sjmallettextern ipf_rdx_node_t *ipf_rx_delete __P((ipf_rdx_head_t *, addrfamily_t *, 91215976Sjmallett addrfamily_t *)); 92215976Sjmallettextern void ipf_rx_walktree __P((ipf_rdx_head_t *, radix_walk_func_t, 93215976Sjmallett void *)); 94215976Sjmallett 95215976Sjmallett#endif /* __RADIX_IPF_H__ */ 96215976Sjmallett