1*36211Ssklower /* 2*36211Ssklower * Copyright (c) 1988 Regents of the University of California. 3*36211Ssklower * All rights reserved. 4*36211Ssklower * 5*36211Ssklower * Redistribution and use in source and binary forms are permitted 6*36211Ssklower * provided that the above copyright notice and this paragraph are 7*36211Ssklower * duplicated in all such forms and that any documentation, 8*36211Ssklower * advertising materials, and other materials related to such 9*36211Ssklower * distribution and use acknowledge that the software was developed 10*36211Ssklower * by the University of California, Berkeley. The name of the 11*36211Ssklower * University may not be used to endorse or promote products derived 12*36211Ssklower * from this software without specific prior written permission. 13*36211Ssklower * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 14*36211Ssklower * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 15*36211Ssklower * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 16*36211Ssklower * 17*36211Ssklower * @(#)radix.h 7.1 (Berkeley) 11/09/88 18*36211Ssklower */ 19*36211Ssklower 20*36211Ssklower /* 21*36211Ssklower * Radix search tree node layout. 22*36211Ssklower */ 23*36211Ssklower 24*36211Ssklower struct radix_node { 25*36211Ssklower struct radix_mask *rn_mklist; /* list of masks contained in subtree */ 26*36211Ssklower struct radix_node *rn_p; /* parent */ 27*36211Ssklower short rn_b; /* bit offset; -1-index(netmask) */ 28*36211Ssklower char rn_bmask; /* node: mask for bit test*/ 29*36211Ssklower u_char rn_flags; /* enumerated next */ 30*36211Ssklower #define RNF_NORMAL 1 /* leaf contains normal route */ 31*36211Ssklower #define RNF_ROOT 2 /* leaf is root leaf for tree */ 32*36211Ssklower #define RNF_ACTIVE 4 /* This node is alive (for rtfree) */ 33*36211Ssklower union { 34*36211Ssklower struct { /* leaf only data: */ 35*36211Ssklower char *rn_Key; /* object of search */ 36*36211Ssklower char *rn_Mask; /* netmask, if present */ 37*36211Ssklower struct radix_node *rn_Dupedkey; 38*36211Ssklower } rn_leaf; 39*36211Ssklower struct { /* node only data: */ 40*36211Ssklower int rn_Off; /* where to start compare */ 41*36211Ssklower struct radix_node *rn_L;/* progeny */ 42*36211Ssklower struct radix_node *rn_R;/* progeny */ 43*36211Ssklower }rn_node; 44*36211Ssklower } rn_u; 45*36211Ssklower #ifdef RN_DEBUG 46*36211Ssklower int rn_info; 47*36211Ssklower struct radix_node *rn_twin; 48*36211Ssklower struct radix_node *rn_ybro; 49*36211Ssklower #endif 50*36211Ssklower }; 51*36211Ssklower 52*36211Ssklower #define rn_dupedkey rn_u.rn_leaf.rn_Dupedkey 53*36211Ssklower #define rn_key rn_u.rn_leaf.rn_Key 54*36211Ssklower #define rn_mask rn_u.rn_leaf.rn_Mask 55*36211Ssklower #define rn_off rn_u.rn_node.rn_Off 56*36211Ssklower #define rn_l rn_u.rn_node.rn_L 57*36211Ssklower #define rn_r rn_u.rn_node.rn_R 58*36211Ssklower /* 59*36211Ssklower * Annotations to tree concerning potential routes applying to subtrees. 60*36211Ssklower */ 61*36211Ssklower struct radix_mask { 62*36211Ssklower short rm_b; /* bit offset; -1-index(netmask) */ 63*36211Ssklower char rm_unused; /* cf. rn_bmask */ 64*36211Ssklower u_char rm_flags; /* cf. rn_flags */ 65*36211Ssklower struct radix_mask *rm_mklist; /* more masks to try */ 66*36211Ssklower char *rm_mask; /* the mask */ 67*36211Ssklower int rm_refs; /* # of references to this struct */ 68*36211Ssklower }; 69*36211Ssklower 70*36211Ssklower #ifndef KERNEL 71*36211Ssklower char *malloc(); 72*36211Ssklower #define Bcmp(a, b, n) bcmp(((char *)(a)), ((char *)(b)), (n)) 73*36211Ssklower #define Malloc(p, t, n) (p = (t) malloc((unsigned int)(n))) 74*36211Ssklower #define Bzero(p, n) bzero((char *)(p), (int)(n)); 75*36211Ssklower #define Free(p) free((char *)p); 76*36211Ssklower #define min(a, b) ((a) < (b) ? (a) : (b)) 77*36211Ssklower #ifndef RTF_UP 78*36211Ssklower /* 79*36211Ssklower * probably just testing here . . . 80*36211Ssklower */ 81*36211Ssklower struct rtentry { 82*36211Ssklower int rt_unused; 83*36211Ssklower }; 84*36211Ssklower #endif 85*36211Ssklower #else 86*36211Ssklower #define Bcmp(a, b, n) bcmp(((caddr_t)(a)), ((caddr_t)(b)), (n)) 87*36211Ssklower #define Malloc(p, t, n) (p = (t) malloc((n), M_RTABLE, M_DONTWAIT)) 88*36211Ssklower #define Bzero(p, n) bzero((caddr_t)(p), (int)(n)); 89*36211Ssklower #define Free(p) free((caddr_t)p); 90*36211Ssklower #endif KERNEL 91*36211Ssklower 92*36211Ssklower struct nrtentry { 93*36211Ssklower struct radix_node nrt_nodes[2]; 94*36211Ssklower struct rtentry nrt_rt; 95*36211Ssklower }; 96*36211Ssklower 97*36211Ssklower #define MAXKEYLEN 32 98*36211Ssklower 99*36211Ssklower extern struct radix_node_head { 100*36211Ssklower struct radix_node_head *rnh_next; 101*36211Ssklower struct radix_node *rnh_treetop; 102*36211Ssklower int rnh_af; 103*36211Ssklower struct radix_node rnh_upper; 104*36211Ssklower struct nrtentry rnh_nrt; 105*36211Ssklower } *radix_node_head; 106*36211Ssklower 107*36211Ssklower extern struct radix_mask *rn_mkfreelist; 108*36211Ssklower 109*36211Ssklower #define MKGet(m) {\ 110*36211Ssklower if (rn_mkfreelist) {\ 111*36211Ssklower m = rn_mkfreelist; \ 112*36211Ssklower rn_mkfreelist = (m)->rm_mklist; \ 113*36211Ssklower } else \ 114*36211Ssklower Malloc(m, struct radix_mask *, sizeof (*(m))); }\ 115*36211Ssklower 116*36211Ssklower #define MKFree(m) { (m)->rm_mklist = rn_mkfreelist; rn_mkfreelist = (m);} 117