xref: /csrg-svn/sys/net/radix.h (revision 37472)
136211Ssklower /*
2*37472Ssklower  * Copyright (c) 1988, 1989 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*37472Ssklower  *	@(#)radix.h	7.3 (Berkeley) 04/22/89
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: */
3536354Ssklower 			caddr_t	rn_Key;	/* object of search */
3636354Ssklower 			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 
5236354Ssklower #define MAXKEYLEN 32
5336354Ssklower 
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
6036354Ssklower 
6136211Ssklower /*
6236211Ssklower  * Annotations to tree concerning potential routes applying to subtrees.
6336211Ssklower  */
6436354Ssklower 
6536354Ssklower 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 */
7036354Ssklower 	caddr_t	rm_mask;		/* the mask */
7136211Ssklower 	int	rm_refs;		/* # of references to this struct */
7236354Ssklower } *rn_mkfreelist;
7336211Ssklower 
7436354Ssklower #define MKGet(m) {\
7536354Ssklower 	if (rn_mkfreelist) {\
7636354Ssklower 		m = rn_mkfreelist; \
7736354Ssklower 		rn_mkfreelist = (m)->rm_mklist; \
7836354Ssklower 	} else \
7936354Ssklower 		R_Malloc(m, struct radix_mask *, sizeof (*(m))); }\
8036354Ssklower 
8136354Ssklower #define MKFree(m) { (m)->rm_mklist = rn_mkfreelist; rn_mkfreelist = (m);}
8236354Ssklower 
8336354Ssklower extern struct radix_node_head {
8436354Ssklower 	struct	radix_node_head *rnh_next;
8536354Ssklower 	struct	radix_node *rnh_treetop;
8636354Ssklower 	int	rnh_af;
8736354Ssklower 	struct	radix_node rnh_nodes[3];
8836354Ssklower } *radix_node_head;
8936354Ssklower 
9036354Ssklower 
9136211Ssklower #ifndef KERNEL
9236211Ssklower #define Bcmp(a, b, n) bcmp(((char *)(a)), ((char *)(b)), (n))
9336211Ssklower #define Bzero(p, n) bzero((char *)(p), (int)(n));
9436354Ssklower #define R_Malloc(p, t, n) (p = (t) malloc((unsigned int)(n)))
9536211Ssklower #define Free(p) free((char *)p);
9636211Ssklower #else
97*37472Ssklower #define Bcmp(a, b, n) bcmp(((caddr_t)(a)), ((caddr_t)(b)), (unsigned)(n))
98*37472Ssklower #define Bcopy(a, b, n) bcopy(((caddr_t)(a)), ((caddr_t)(b)), (unsigned)(n))
99*37472Ssklower #define Bzero(p, n) bzero((caddr_t)(p), (unsigned)(n));
100*37472Ssklower #define R_Malloc(p, t, n) (p = (t) malloc((unsigned long)(n), M_RTABLE, M_DONTWAIT))
101*37472Ssklower #define Free(p) free((caddr_t)p, M_RTABLE);
102*37472Ssklower #endif /*KERNEL*/
103