1145519Sdarrenr/* $FreeBSD$ */ 2145510Sdarrenr 3145510Sdarrenr/* 4255332Scy * Copyright (C) 2012 by Darren Reed. 5145510Sdarrenr * 6255332Scy * See the IPFILTER.LICENCE file for details on licencing. 7145510Sdarrenr */ 8255332Scy#ifndef __RADIX_IPF_H__ 9255332Scy#define __RADIX_IPF_H__ 10145510Sdarrenr 11255332Scy#ifndef U_32_T 12255332Scytypedef unsigned int u_32_t; 13255332Scy# define U_32_T 1 14145510Sdarrenr#endif 15145510Sdarrenr 16255332Scytypedef struct ipf_rdx_mask { 17255332Scy struct ipf_rdx_mask *next; 18255332Scy struct ipf_rdx_node *node; 19255332Scy u_32_t *mask; 20255332Scy int maskbitcount; 21255332Scy} ipf_rdx_mask_t; 22145510Sdarrenr 23255332Scytypedef struct ipf_rdx_node { 24255332Scy struct ipf_rdx_node *left; 25255332Scy struct ipf_rdx_node *right; 26255332Scy struct ipf_rdx_node *parent; 27255332Scy struct ipf_rdx_node *dupkey; 28255332Scy struct ipf_rdx_mask *masks; 29255332Scy struct ipf_rdx_mask *mymask; 30255332Scy u_32_t *addrkey; 31255332Scy u_32_t *maskkey; 32255332Scy u_32_t *addroff; 33255332Scy u_32_t *maskoff; 34255332Scy u_32_t lastmask; 35255332Scy u_32_t bitmask; 36255332Scy int offset; 37255332Scy int index; 38255332Scy int maskbitcount; 39255332Scy int root; 40255332Scy#ifdef RDX_DEBUG 41255332Scy char name[40]; 42145510Sdarrenr#endif 43255332Scy} ipf_rdx_node_t; 44145510Sdarrenr 45255332Scystruct ipf_rdx_head; 46145510Sdarrenr 47255332Scytypedef void (* radix_walk_func_t)(ipf_rdx_node_t *, void *); 48255332Scytypedef ipf_rdx_node_t *(* idx_hamn_func_t)(struct ipf_rdx_head *, 49255332Scy addrfamily_t *, addrfamily_t *, 50255332Scy ipf_rdx_node_t *); 51255332Scytypedef ipf_rdx_node_t *(* idx_ham_func_t)(struct ipf_rdx_head *, 52255332Scy addrfamily_t *, addrfamily_t *); 53255332Scytypedef ipf_rdx_node_t *(* idx_ha_func_t)(struct ipf_rdx_head *, 54255332Scy addrfamily_t *); 55255332Scytypedef void (* idx_walk_func_t)(struct ipf_rdx_head *, 56255332Scy radix_walk_func_t, void *); 57145510Sdarrenr 58255332Scytypedef struct ipf_rdx_head { 59255332Scy ipf_rdx_node_t *root; 60255332Scy ipf_rdx_node_t nodes[3]; 61255332Scy ipfmutex_t lock; 62255332Scy idx_hamn_func_t addaddr; /* add addr/mask to tree */ 63255332Scy idx_ham_func_t deladdr; /* delete addr/mask from tree */ 64255332Scy idx_ham_func_t lookup; /* look for specific addr/mask */ 65255332Scy idx_ha_func_t matchaddr; /* search tree for address match */ 66255332Scy idx_walk_func_t walktree; /* walk entire tree */ 67255332Scy} ipf_rdx_head_t; 68145510Sdarrenr 69255332Scytypedef struct radix_softc { 70255332Scy u_char *zeros; 71255332Scy u_char *ones; 72255332Scy} radix_softc_t; 73145510Sdarrenr 74255332Scy#undef RADIX_NODE_HEAD_LOCK 75255332Scy#undef RADIX_NODE_HEAD_UNLOCK 76255332Scy#ifdef _KERNEL 77255332Scy# define RADIX_NODE_HEAD_LOCK(x) MUTEX_ENTER(&(x)->lock) 78255332Scy# define RADIX_NODE_HEAD_UNLOCK(x) MUTEX_UNLOCK(&(x)->lock) 79145510Sdarrenr#else 80255332Scy# define RADIX_NODE_HEAD_LOCK(x) 81255332Scy# define RADIX_NODE_HEAD_UNLOCK(x) 82145510Sdarrenr#endif 83145510Sdarrenr 84255332Scyextern void *ipf_rx_create __P((void)); 85255332Scyextern int ipf_rx_init __P((void *)); 86255332Scyextern void ipf_rx_destroy __P((void *)); 87255332Scyextern int ipf_rx_inithead __P((radix_softc_t *, ipf_rdx_head_t **)); 88255332Scyextern void ipf_rx_freehead __P((ipf_rdx_head_t *)); 89255332Scyextern ipf_rdx_node_t *ipf_rx_addroute __P((ipf_rdx_head_t *, 90255332Scy addrfamily_t *, addrfamily_t *, 91255332Scy ipf_rdx_node_t *)); 92255332Scyextern ipf_rdx_node_t *ipf_rx_delete __P((ipf_rdx_head_t *, addrfamily_t *, 93255332Scy addrfamily_t *)); 94255332Scyextern void ipf_rx_walktree __P((ipf_rdx_head_t *, radix_walk_func_t, 95255332Scy void *)); 96145510Sdarrenr 97255332Scy#endif /* __RADIX_IPF_H__ */ 98