136211Ssklower /* 237472Ssklower * Copyright (c) 1988, 1989 Regents of the University of California. 336211Ssklower * All rights reserved. 436211Ssklower * 544465Sbostic * %sccs.include.redist.c% 636211Ssklower * 7*54824Ssklower * @(#)radix.h 7.6 (Berkeley) 07/09/92 836211Ssklower */ 936211Ssklower 1036211Ssklower /* 1136211Ssklower * Radix search tree node layout. 1236211Ssklower */ 1336211Ssklower 1436211Ssklower struct radix_node { 1536211Ssklower struct radix_mask *rn_mklist; /* list of masks contained in subtree */ 1636211Ssklower struct radix_node *rn_p; /* parent */ 1736211Ssklower short rn_b; /* bit offset; -1-index(netmask) */ 1836211Ssklower char rn_bmask; /* node: mask for bit test*/ 1936211Ssklower u_char rn_flags; /* enumerated next */ 2036211Ssklower #define RNF_NORMAL 1 /* leaf contains normal route */ 2136211Ssklower #define RNF_ROOT 2 /* leaf is root leaf for tree */ 2236211Ssklower #define RNF_ACTIVE 4 /* This node is alive (for rtfree) */ 2336211Ssklower union { 2436211Ssklower struct { /* leaf only data: */ 2536354Ssklower caddr_t rn_Key; /* object of search */ 2636354Ssklower caddr_t rn_Mask; /* netmask, if present */ 2736211Ssklower struct radix_node *rn_Dupedkey; 2836211Ssklower } rn_leaf; 2936211Ssklower struct { /* node only data: */ 3036211Ssklower int rn_Off; /* where to start compare */ 3136211Ssklower struct radix_node *rn_L;/* progeny */ 3236211Ssklower struct radix_node *rn_R;/* progeny */ 3336211Ssklower }rn_node; 3436211Ssklower } rn_u; 3536211Ssklower #ifdef RN_DEBUG 3636211Ssklower int rn_info; 3736211Ssklower struct radix_node *rn_twin; 3836211Ssklower struct radix_node *rn_ybro; 3936211Ssklower #endif 4036211Ssklower }; 4136211Ssklower 4236211Ssklower #define rn_dupedkey rn_u.rn_leaf.rn_Dupedkey 4336211Ssklower #define rn_key rn_u.rn_leaf.rn_Key 4436211Ssklower #define rn_mask rn_u.rn_leaf.rn_Mask 4536211Ssklower #define rn_off rn_u.rn_node.rn_Off 4636211Ssklower #define rn_l rn_u.rn_node.rn_L 4736211Ssklower #define rn_r rn_u.rn_node.rn_R 4836354Ssklower 4936211Ssklower /* 5036211Ssklower * Annotations to tree concerning potential routes applying to subtrees. 5136211Ssklower */ 5236354Ssklower 5336354Ssklower extern struct radix_mask { 5436211Ssklower short rm_b; /* bit offset; -1-index(netmask) */ 5536211Ssklower char rm_unused; /* cf. rn_bmask */ 5636211Ssklower u_char rm_flags; /* cf. rn_flags */ 5736211Ssklower struct radix_mask *rm_mklist; /* more masks to try */ 5836354Ssklower caddr_t rm_mask; /* the mask */ 5936211Ssklower int rm_refs; /* # of references to this struct */ 6036354Ssklower } *rn_mkfreelist; 6136211Ssklower 6236354Ssklower #define MKGet(m) {\ 6336354Ssklower if (rn_mkfreelist) {\ 6436354Ssklower m = rn_mkfreelist; \ 6536354Ssklower rn_mkfreelist = (m)->rm_mklist; \ 6636354Ssklower } else \ 6736354Ssklower R_Malloc(m, struct radix_mask *, sizeof (*(m))); }\ 6836354Ssklower 6936354Ssklower #define MKFree(m) { (m)->rm_mklist = rn_mkfreelist; rn_mkfreelist = (m);} 7036354Ssklower 7150688Ssklower struct radix_node_head { 7236354Ssklower struct radix_node *rnh_treetop; 7350688Ssklower struct radix_node *(*rnh_add)(); 7450688Ssklower struct radix_node *(*rnh_delete)(); 7550688Ssklower struct radix_node *(*rnh_match)(); 7650688Ssklower int (*rnh_walk)(); 7736354Ssklower struct radix_node rnh_nodes[3]; 7850688Ssklower }; 7936354Ssklower 8036354Ssklower 8136211Ssklower #ifndef KERNEL 8236211Ssklower #define Bcmp(a, b, n) bcmp(((char *)(a)), ((char *)(b)), (n)) 8336211Ssklower #define Bzero(p, n) bzero((char *)(p), (int)(n)); 8436354Ssklower #define R_Malloc(p, t, n) (p = (t) malloc((unsigned int)(n))) 8536211Ssklower #define Free(p) free((char *)p); 8636211Ssklower #else 8737472Ssklower #define Bcmp(a, b, n) bcmp(((caddr_t)(a)), ((caddr_t)(b)), (unsigned)(n)) 8837472Ssklower #define Bcopy(a, b, n) bcopy(((caddr_t)(a)), ((caddr_t)(b)), (unsigned)(n)) 8937472Ssklower #define Bzero(p, n) bzero((caddr_t)(p), (unsigned)(n)); 9037472Ssklower #define R_Malloc(p, t, n) (p = (t) malloc((unsigned long)(n), M_RTABLE, M_DONTWAIT)) 9137472Ssklower #define Free(p) free((caddr_t)p, M_RTABLE); 92*54824Ssklower 93*54824Ssklower int rn_inithead __P((void **, int)); 9437472Ssklower #endif /*KERNEL*/ 95