136211Ssklower /* 236211Ssklower * Copyright (c) 1988 Regents of the University of California. 336211Ssklower * All rights reserved. 436211Ssklower * 536211Ssklower * Redistribution and use in source and binary forms are permitted 636211Ssklower * provided that the above copyright notice and this paragraph are 736211Ssklower * duplicated in all such forms and that any documentation, 836211Ssklower * advertising materials, and other materials related to such 936211Ssklower * distribution and use acknowledge that the software was developed 1036211Ssklower * by the University of California, Berkeley. The name of the 1136211Ssklower * University may not be used to endorse or promote products derived 1236211Ssklower * from this software without specific prior written permission. 1336211Ssklower * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 1436211Ssklower * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 1536211Ssklower * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 1636211Ssklower * 17*36354Ssklower * @(#)radix.h 7.2 (Berkeley) 12/13/88 1836211Ssklower */ 1936211Ssklower 2036211Ssklower /* 2136211Ssklower * Radix search tree node layout. 2236211Ssklower */ 2336211Ssklower 2436211Ssklower struct radix_node { 2536211Ssklower struct radix_mask *rn_mklist; /* list of masks contained in subtree */ 2636211Ssklower struct radix_node *rn_p; /* parent */ 2736211Ssklower short rn_b; /* bit offset; -1-index(netmask) */ 2836211Ssklower char rn_bmask; /* node: mask for bit test*/ 2936211Ssklower u_char rn_flags; /* enumerated next */ 3036211Ssklower #define RNF_NORMAL 1 /* leaf contains normal route */ 3136211Ssklower #define RNF_ROOT 2 /* leaf is root leaf for tree */ 3236211Ssklower #define RNF_ACTIVE 4 /* This node is alive (for rtfree) */ 3336211Ssklower union { 3436211Ssklower struct { /* leaf only data: */ 35*36354Ssklower caddr_t rn_Key; /* object of search */ 36*36354Ssklower caddr_t rn_Mask; /* netmask, if present */ 3736211Ssklower struct radix_node *rn_Dupedkey; 3836211Ssklower } rn_leaf; 3936211Ssklower struct { /* node only data: */ 4036211Ssklower int rn_Off; /* where to start compare */ 4136211Ssklower struct radix_node *rn_L;/* progeny */ 4236211Ssklower struct radix_node *rn_R;/* progeny */ 4336211Ssklower }rn_node; 4436211Ssklower } rn_u; 4536211Ssklower #ifdef RN_DEBUG 4636211Ssklower int rn_info; 4736211Ssklower struct radix_node *rn_twin; 4836211Ssklower struct radix_node *rn_ybro; 4936211Ssklower #endif 5036211Ssklower }; 5136211Ssklower 52*36354Ssklower #define MAXKEYLEN 32 53*36354Ssklower 5436211Ssklower #define rn_dupedkey rn_u.rn_leaf.rn_Dupedkey 5536211Ssklower #define rn_key rn_u.rn_leaf.rn_Key 5636211Ssklower #define rn_mask rn_u.rn_leaf.rn_Mask 5736211Ssklower #define rn_off rn_u.rn_node.rn_Off 5836211Ssklower #define rn_l rn_u.rn_node.rn_L 5936211Ssklower #define rn_r rn_u.rn_node.rn_R 60*36354Ssklower 6136211Ssklower /* 6236211Ssklower * Annotations to tree concerning potential routes applying to subtrees. 6336211Ssklower */ 64*36354Ssklower 65*36354Ssklower extern struct radix_mask { 6636211Ssklower short rm_b; /* bit offset; -1-index(netmask) */ 6736211Ssklower char rm_unused; /* cf. rn_bmask */ 6836211Ssklower u_char rm_flags; /* cf. rn_flags */ 6936211Ssklower struct radix_mask *rm_mklist; /* more masks to try */ 70*36354Ssklower caddr_t rm_mask; /* the mask */ 7136211Ssklower int rm_refs; /* # of references to this struct */ 72*36354Ssklower } *rn_mkfreelist; 7336211Ssklower 74*36354Ssklower #define MKGet(m) {\ 75*36354Ssklower if (rn_mkfreelist) {\ 76*36354Ssklower m = rn_mkfreelist; \ 77*36354Ssklower rn_mkfreelist = (m)->rm_mklist; \ 78*36354Ssklower } else \ 79*36354Ssklower R_Malloc(m, struct radix_mask *, sizeof (*(m))); }\ 80*36354Ssklower 81*36354Ssklower #define MKFree(m) { (m)->rm_mklist = rn_mkfreelist; rn_mkfreelist = (m);} 82*36354Ssklower 83*36354Ssklower extern struct radix_node_head { 84*36354Ssklower struct radix_node_head *rnh_next; 85*36354Ssklower struct radix_node *rnh_treetop; 86*36354Ssklower int rnh_af; 87*36354Ssklower struct radix_node rnh_nodes[3]; 88*36354Ssklower } *radix_node_head; 89*36354Ssklower 90*36354Ssklower 9136211Ssklower #ifndef KERNEL 9236211Ssklower char *malloc(); 9336211Ssklower #define Bcmp(a, b, n) bcmp(((char *)(a)), ((char *)(b)), (n)) 9436211Ssklower #define Bzero(p, n) bzero((char *)(p), (int)(n)); 95*36354Ssklower #define R_Malloc(p, t, n) (p = (t) malloc((unsigned int)(n))) 9636211Ssklower #define Free(p) free((char *)p); 9736211Ssklower #define min(a, b) ((a) < (b) ? (a) : (b)) 9836211Ssklower #else 9936211Ssklower #define Bcmp(a, b, n) bcmp(((caddr_t)(a)), ((caddr_t)(b)), (n)) 100*36354Ssklower #define Bcopy(a, b, n) bcopy(((caddr_t)(a)), ((caddr_t)(b)), (n)) 10136211Ssklower #define Bzero(p, n) bzero((caddr_t)(p), (int)(n)); 102*36354Ssklower #define R_Malloc(p, t, n) (p = (t) malloc((n), M_RTABLE, M_DONTWAIT)) 10336211Ssklower #define Free(p) free((caddr_t)p); 10436211Ssklower #endif KERNEL 105