136211Ssklower /* 263211Sbostic * Copyright (c) 1988, 1989, 1993 363211Sbostic * The Regents of the University of California. All rights reserved. 436211Ssklower * 544465Sbostic * %sccs.include.redist.c% 636211Ssklower * 7*67873Ssklower * @(#)radix.h 8.2 (Berkeley) 10/31/94 836211Ssklower */ 936211Ssklower 1055095Smckusick #ifndef _RADIX_H_ 1155095Smckusick #define _RADIX_H_ 1255095Smckusick 1336211Ssklower /* 1436211Ssklower * Radix search tree node layout. 1536211Ssklower */ 1636211Ssklower 1736211Ssklower struct radix_node { 1867790Ssklower struct radix_mask *rn_mklist; /* list of masks contained in subtree */ 1936211Ssklower struct radix_node *rn_p; /* parent */ 2036211Ssklower short rn_b; /* bit offset; -1-index(netmask) */ 2136211Ssklower char rn_bmask; /* node: mask for bit test*/ 2236211Ssklower u_char rn_flags; /* enumerated next */ 2336211Ssklower #define RNF_NORMAL 1 /* leaf contains normal route */ 2436211Ssklower #define RNF_ROOT 2 /* leaf is root leaf for tree */ 2536211Ssklower #define RNF_ACTIVE 4 /* This node is alive (for rtfree) */ 2636211Ssklower union { 2736211Ssklower struct { /* leaf only data: */ 2836354Ssklower caddr_t rn_Key; /* object of search */ 2936354Ssklower caddr_t rn_Mask; /* netmask, if present */ 3036211Ssklower struct radix_node *rn_Dupedkey; 3136211Ssklower } rn_leaf; 3236211Ssklower struct { /* node only data: */ 3336211Ssklower int rn_Off; /* where to start compare */ 3436211Ssklower struct radix_node *rn_L;/* progeny */ 3536211Ssklower struct radix_node *rn_R;/* progeny */ 3636211Ssklower }rn_node; 3736211Ssklower } rn_u; 3836211Ssklower #ifdef RN_DEBUG 3936211Ssklower int rn_info; 4036211Ssklower struct radix_node *rn_twin; 4136211Ssklower struct radix_node *rn_ybro; 4236211Ssklower #endif 4336211Ssklower }; 4436211Ssklower 4536211Ssklower #define rn_dupedkey rn_u.rn_leaf.rn_Dupedkey 4636211Ssklower #define rn_key rn_u.rn_leaf.rn_Key 4736211Ssklower #define rn_mask rn_u.rn_leaf.rn_Mask 4836211Ssklower #define rn_off rn_u.rn_node.rn_Off 4936211Ssklower #define rn_l rn_u.rn_node.rn_L 5036211Ssklower #define rn_r rn_u.rn_node.rn_R 5136354Ssklower 5267790Ssklower /* 5367790Ssklower * Annotations to tree concerning potential routes applying to subtrees. 5467790Ssklower */ 5567790Ssklower 5667790Ssklower extern struct radix_mask { 5767790Ssklower short rm_b; /* bit offset; -1-index(netmask) */ 5867790Ssklower char rm_unused; /* cf. rn_bmask */ 5967790Ssklower u_char rm_flags; /* cf. rn_flags */ 6067790Ssklower struct radix_mask *rm_mklist; /* more masks to try */ 6167790Ssklower union { 6267790Ssklower caddr_t rmu_mask; /* the mask */ 6367790Ssklower struct radix_node *rmu_leaf; /* for normal routes */ 6467790Ssklower } rm_rmu; 6567790Ssklower int rm_refs; /* # of references to this struct */ 6667790Ssklower } *rn_mkfreelist; 6767790Ssklower 6867790Ssklower #define rm_mask rm_rmu.rmu_mask 6967790Ssklower #define rm_leaf rm_rmu.rmu_leaf /* extra field would make 32 bytes */ 7067790Ssklower 7167790Ssklower #define MKGet(m) {\ 7267790Ssklower if (rn_mkfreelist) {\ 7367790Ssklower m = rn_mkfreelist; \ 7467790Ssklower rn_mkfreelist = (m)->rm_mklist; \ 7567790Ssklower } else \ 7667790Ssklower R_Malloc(m, struct radix_mask *, sizeof (*(m))); }\ 7767790Ssklower 7867790Ssklower #define MKFree(m) { (m)->rm_mklist = rn_mkfreelist; rn_mkfreelist = (m);} 7967790Ssklower 8050688Ssklower struct radix_node_head { 8136354Ssklower struct radix_node *rnh_treetop; 8259007Ssklower int rnh_addrsize; /* permit, but not require fixed keys */ 8359007Ssklower int rnh_pktsize; /* permit, but not require fixed keys */ 8459007Ssklower struct radix_node *(*rnh_addaddr) /* add based on sockaddr */ 8561355Sbostic __P((void *v, void *mask, 8659007Ssklower struct radix_node_head *head, struct radix_node nodes[])); 8759007Ssklower struct radix_node *(*rnh_addpkt) /* add based on packet hdr */ 8861355Sbostic __P((void *v, void *mask, 8959007Ssklower struct radix_node_head *head, struct radix_node nodes[])); 9059007Ssklower struct radix_node *(*rnh_deladdr) /* remove based on sockaddr */ 9161355Sbostic __P((void *v, void *mask, struct radix_node_head *head)); 9259007Ssklower struct radix_node *(*rnh_delpkt) /* remove based on packet hdr */ 9361355Sbostic __P((void *v, void *mask, struct radix_node_head *head)); 9459007Ssklower struct radix_node *(*rnh_matchaddr) /* locate based on sockaddr */ 9561355Sbostic __P((void *v, struct radix_node_head *head)); 9667790Ssklower struct radix_node *(*rnh_lookup) /* locate based on sockaddr */ 9767790Ssklower __P((void *v, void *mask, struct radix_node_head *head)); 9859007Ssklower struct radix_node *(*rnh_matchpkt) /* locate based on packet hdr */ 9961355Sbostic __P((void *v, struct radix_node_head *head)); 10059007Ssklower int (*rnh_walktree) /* traverse tree */ 10159007Ssklower __P((struct radix_node_head *head, int (*f)(), void *w)); 10259007Ssklower struct radix_node rnh_nodes[3]; /* empty tree for common case */ 10350688Ssklower }; 10436354Ssklower 10536354Ssklower 10636211Ssklower #ifndef KERNEL 10736211Ssklower #define Bcmp(a, b, n) bcmp(((char *)(a)), ((char *)(b)), (n)) 10867790Ssklower #define Bcopy(a, b, n) bcopy(((char *)(a)), ((char *)(b)), (unsigned)(n)) 10936211Ssklower #define Bzero(p, n) bzero((char *)(p), (int)(n)); 11036354Ssklower #define R_Malloc(p, t, n) (p = (t) malloc((unsigned int)(n))) 11136211Ssklower #define Free(p) free((char *)p); 11236211Ssklower #else 11337472Ssklower #define Bcmp(a, b, n) bcmp(((caddr_t)(a)), ((caddr_t)(b)), (unsigned)(n)) 11437472Ssklower #define Bcopy(a, b, n) bcopy(((caddr_t)(a)), ((caddr_t)(b)), (unsigned)(n)) 11537472Ssklower #define Bzero(p, n) bzero((caddr_t)(p), (unsigned)(n)); 11637472Ssklower #define R_Malloc(p, t, n) (p = (t) malloc((unsigned long)(n), M_RTABLE, M_DONTWAIT)) 11737472Ssklower #define Free(p) free((caddr_t)p, M_RTABLE); 11867781Ssklower #endif /*KERNEL*/ 11954824Ssklower 12061355Sbostic void rn_init __P((void)); 12161355Sbostic int rn_inithead __P((void **, int)); 12261355Sbostic int rn_refines __P((void *, void *)); 12361355Sbostic int rn_walktree __P((struct radix_node_head *, int (*)(), void *)); 12461355Sbostic struct radix_node 12561355Sbostic *rn_addmask __P((void *, int, int)), 12661355Sbostic *rn_addroute __P((void *, void *, struct radix_node_head *, 12761355Sbostic struct radix_node [2])), 12861355Sbostic *rn_delete __P((void *, void *, struct radix_node_head *)), 12961355Sbostic *rn_insert __P((void *, struct radix_node_head *, int *, 13061355Sbostic struct radix_node [2])), 13161355Sbostic *rn_match __P((void *, struct radix_node_head *)), 13261355Sbostic *rn_newpair __P((void *, int, struct radix_node[2])), 13361355Sbostic *rn_search __P((void *, struct radix_node *)), 13467790Ssklower *rn_search_m __P((void *, struct radix_node *, void *)); 13561355Sbostic 13655095Smckusick #endif /* _RADIX_H_ */ 137