xref: /csrg-svn/sys/net/radix.h (revision 36211)
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