Changeset View
Changeset View
Standalone View
Standalone View
sys/net/radix.h
Show All 32 Lines | |||||
*/ | */ | ||||
#ifndef _RADIX_H_ | #ifndef _RADIX_H_ | ||||
#define _RADIX_H_ | #define _RADIX_H_ | ||||
#ifdef _KERNEL | #ifdef _KERNEL | ||||
#include <sys/_lock.h> | #include <sys/_lock.h> | ||||
#include <sys/_mutex.h> | #include <sys/_mutex.h> | ||||
#include <sys/_rwlock.h> | #include <sys/_rmlock.h> | ||||
#endif | #endif | ||||
#ifdef MALLOC_DECLARE | #ifdef MALLOC_DECLARE | ||||
MALLOC_DECLARE(M_RTABLE); | MALLOC_DECLARE(M_RTABLE); | ||||
#endif | #endif | ||||
/* | /* | ||||
* Radix search tree node layout. | * Radix search tree node layout. | ||||
▲ Show 20 Lines • Show All 83 Lines • ▼ Show 20 Lines | struct radix_node_head { | ||||
rn_addaddr_f_t *rnh_addaddr; /* add based on sockaddr*/ | rn_addaddr_f_t *rnh_addaddr; /* add based on sockaddr*/ | ||||
rn_deladdr_f_t *rnh_deladdr; /* remove based on sockaddr */ | rn_deladdr_f_t *rnh_deladdr; /* remove based on sockaddr */ | ||||
rn_lookup_f_t *rnh_lookup; /* exact match for sockaddr */ | rn_lookup_f_t *rnh_lookup; /* exact match for sockaddr */ | ||||
rn_walktree_t *rnh_walktree; /* traverse tree */ | rn_walktree_t *rnh_walktree; /* traverse tree */ | ||||
rn_walktree_from_t *rnh_walktree_from; /* traverse tree below a */ | rn_walktree_from_t *rnh_walktree_from; /* traverse tree below a */ | ||||
rn_close_t *rnh_close; /*do something when the last ref drops*/ | rn_close_t *rnh_close; /*do something when the last ref drops*/ | ||||
struct radix_node rnh_nodes[3]; /* empty tree for common case */ | struct radix_node rnh_nodes[3]; /* empty tree for common case */ | ||||
#ifdef _KERNEL | #ifdef _KERNEL | ||||
struct rwlock rnh_lock; /* locks entire radix tree */ | struct rmlock rnh_lock; /* locks entire radix tree */ | ||||
#endif | #endif | ||||
}; | }; | ||||
struct radix_mask_head { | struct radix_mask_head { | ||||
struct radix_head head; | struct radix_head head; | ||||
struct radix_node mask_nodes[3]; | struct radix_node mask_nodes[3]; | ||||
}; | }; | ||||
void rn_inithead_internal(struct radix_head *rh, struct radix_node *base_nodes, | void rn_inithead_internal(struct radix_head *rh, struct radix_node *base_nodes, | ||||
int off); | int off); | ||||
#ifndef _KERNEL | #ifndef _KERNEL | ||||
#define R_Malloc(p, t, n) (p = (t) malloc((unsigned int)(n))) | #define R_Malloc(p, t, n) (p = (t) malloc((unsigned int)(n))) | ||||
#define R_Zalloc(p, t, n) (p = (t) calloc(1,(unsigned int)(n))) | #define R_Zalloc(p, t, n) (p = (t) calloc(1,(unsigned int)(n))) | ||||
#define R_Free(p) free((char *)p); | #define R_Free(p) free((char *)p); | ||||
#else | #else | ||||
#define R_Malloc(p, t, n) (p = (t) malloc((unsigned long)(n), M_RTABLE, M_NOWAIT)) | #define R_Malloc(p, t, n) (p = (t) malloc((unsigned long)(n), M_RTABLE, M_NOWAIT)) | ||||
#define R_Zalloc(p, t, n) (p = (t) malloc((unsigned long)(n), M_RTABLE, M_NOWAIT | M_ZERO)) | #define R_Zalloc(p, t, n) (p = (t) malloc((unsigned long)(n), M_RTABLE, M_NOWAIT | M_ZERO)) | ||||
#define R_Free(p) free((caddr_t)p, M_RTABLE); | #define R_Free(p) free((caddr_t)p, M_RTABLE); | ||||
#define RADIX_NODE_HEAD_RLOCK_TRACKER struct rm_priotracker _rhn_tracker | |||||
#define RADIX_NODE_HEAD_LOCK_INIT(rnh) \ | #define RADIX_NODE_HEAD_LOCK_INIT(rnh) \ | ||||
rw_init_flags(&(rnh)->rnh_lock, "radix node head", 0) | rm_init(&(rnh)->rnh_lock, "radix node head") | ||||
#define RADIX_NODE_HEAD_LOCK(rnh) rw_wlock(&(rnh)->rnh_lock) | #define RADIX_NODE_HEAD_LOCK(rnh) rm_wlock(&(rnh)->rnh_lock) | ||||
#define RADIX_NODE_HEAD_UNLOCK(rnh) rw_wunlock(&(rnh)->rnh_lock) | #define RADIX_NODE_HEAD_UNLOCK(rnh) rm_wunlock(&(rnh)->rnh_lock) | ||||
#define RADIX_NODE_HEAD_RLOCK(rnh) rw_rlock(&(rnh)->rnh_lock) | #define RADIX_NODE_HEAD_RLOCK(rnh) rm_rlock(&(rnh)->rnh_lock,\ | ||||
#define RADIX_NODE_HEAD_RUNLOCK(rnh) rw_runlock(&(rnh)->rnh_lock) | &_rhn_tracker) | ||||
#define RADIX_NODE_HEAD_LOCK_TRY_UPGRADE(rnh) rw_try_upgrade(&(rnh)->rnh_lock) | #define RADIX_NODE_HEAD_RUNLOCK(rnh) rm_runlock(&(rnh)->rnh_lock,\ | ||||
&_rhn_tracker) | |||||
#define RADIX_NODE_HEAD_DESTROY(rnh) rm_destroy(&(rnh)->rnh_lock) | |||||
#define RADIX_NODE_HEAD_DESTROY(rnh) rw_destroy(&(rnh)->rnh_lock) | #define RADIX_NODE_HEAD_LOCK_ASSERT(rnh) rm_assert(&(rnh)->rnh_lock, RA_LOCKED) | ||||
#define RADIX_NODE_HEAD_LOCK_ASSERT(rnh) rw_assert(&(rnh)->rnh_lock, RA_LOCKED) | #define RADIX_NODE_HEAD_WLOCK_ASSERT(rnh) rm_assert(&(rnh)->rnh_lock, RA_WLOCKED) | ||||
#define RADIX_NODE_HEAD_WLOCK_ASSERT(rnh) rw_assert(&(rnh)->rnh_lock, RA_WLOCKED) | |||||
#endif /* _KERNEL */ | #endif /* _KERNEL */ | ||||
int rn_inithead(void **, int); | int rn_inithead(void **, int); | ||||
int rn_detachhead(void **); | int rn_detachhead(void **); | ||||
int rn_refines(void *, void *); | int rn_refines(void *, void *); | ||||
struct radix_node *rn_addroute(void *, void *, struct radix_head *, | struct radix_node *rn_addroute(void *, void *, struct radix_head *, | ||||
struct radix_node[2]); | struct radix_node[2]); | ||||
struct radix_node *rn_delete(void *, void *, struct radix_head *); | struct radix_node *rn_delete(void *, void *, struct radix_head *); | ||||
struct radix_node *rn_lookup (void *v_arg, void *m_arg, | struct radix_node *rn_lookup (void *v_arg, void *m_arg, | ||||
struct radix_head *head); | struct radix_head *head); | ||||
struct radix_node *rn_match(void *, struct radix_head *); | struct radix_node *rn_match(void *, struct radix_head *); | ||||
int rn_walktree_from(struct radix_head *h, void *a, void *m, | int rn_walktree_from(struct radix_head *h, void *a, void *m, | ||||
walktree_f_t *f, void *w); | walktree_f_t *f, void *w); | ||||
int rn_walktree(struct radix_head *, walktree_f_t *, void *); | int rn_walktree(struct radix_head *, walktree_f_t *, void *); | ||||
#endif /* _RADIX_H_ */ | #endif /* _RADIX_H_ */ |