xref: /onnv-gate/usr/src/uts/common/inet/ipf/radix_ipf.h (revision 2393:76e0289ce525)
1*2393Syz155240 /*
2*2393Syz155240  * Copyright (c) 1988, 1989, 1993
3*2393Syz155240  *	The Regents of the University of California.  All rights reserved.
4*2393Syz155240  *
5*2393Syz155240  * Redistribution and use in source and binary forms, with or without
6*2393Syz155240  * modification, are permitted provided that the following conditions
7*2393Syz155240  * are met:
8*2393Syz155240  * 1. Redistributions of source code must retain the above copyright
9*2393Syz155240  *    notice, this list of conditions and the following disclaimer.
10*2393Syz155240  * 2. Redistributions in binary form must reproduce the above copyright
11*2393Syz155240  *    notice, this list of conditions and the following disclaimer in the
12*2393Syz155240  *    documentation and/or other materials provided with the distribution.
13*2393Syz155240  *
14*2393Syz155240  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
15*2393Syz155240  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16*2393Syz155240  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*2393Syz155240  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
18*2393Syz155240  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*2393Syz155240  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20*2393Syz155240  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21*2393Syz155240  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22*2393Syz155240  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23*2393Syz155240  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24*2393Syz155240  * SUCH DAMAGE.
25*2393Syz155240  *
26*2393Syz155240  *	@(#)radix.h	8.2 (Berkeley) 10/31/94
27*2393Syz155240  */
28*2393Syz155240 
29*2393Syz155240 #if !defined(_NET_RADIX_H_) && !defined(_RADIX_H_)
30*2393Syz155240 #define	_NET_RADIX_H_
31*2393Syz155240 #ifndef _RADIX_H_
32*2393Syz155240 #define	_RADIX_H_
33*2393Syz155240 #endif /* _RADIX_H_ */
34*2393Syz155240 
35*2393Syz155240 #ifndef __P
36*2393Syz155240 # ifdef __STDC__
37*2393Syz155240 #  define	__P(x)  x
38*2393Syz155240 # else
39*2393Syz155240 #  define	__P(x)  ()
40*2393Syz155240 # endif
41*2393Syz155240 #endif
42*2393Syz155240 
43*2393Syz155240 #if defined(__sgi)
44*2393Syz155240 # define	radix_mask	ipf_radix_mask
45*2393Syz155240 # define	radix_node	ipf_radix_node
46*2393Syz155240 # define	radix_node_head	ipf_radix_node_head
47*2393Syz155240 #endif
48*2393Syz155240 
49*2393Syz155240 /*
50*2393Syz155240  * Radix search tree node layout.
51*2393Syz155240  */
52*2393Syz155240 
53*2393Syz155240 struct radix_node {
54*2393Syz155240 	struct	radix_mask *rn_mklist;	/* list of masks contained in subtree */
55*2393Syz155240 	struct	radix_node *rn_p;	/* parent */
56*2393Syz155240 	short	rn_b;			/* bit offset; -1-index(netmask) */
57*2393Syz155240 	char	rn_bmask;		/* node: mask for bit test*/
58*2393Syz155240 	u_char	rn_flags;		/* enumerated next */
59*2393Syz155240 #define RNF_NORMAL	1		/* leaf contains normal route */
60*2393Syz155240 #define RNF_ROOT	2		/* leaf is root leaf for tree */
61*2393Syz155240 #define RNF_ACTIVE	4		/* This node is alive (for rtfree) */
62*2393Syz155240 	union {
63*2393Syz155240 		struct {			/* leaf only data: */
64*2393Syz155240 			caddr_t rn_Key;		/* object of search */
65*2393Syz155240 			caddr_t rn_Mask;	/* netmask, if present */
66*2393Syz155240 			struct	radix_node *rn_Dupedkey;
67*2393Syz155240 		} rn_leaf;
68*2393Syz155240 		struct {			/* node only data: */
69*2393Syz155240 			int	rn_Off;		/* where to start compare */
70*2393Syz155240 			struct	radix_node *rn_L;/* progeny */
71*2393Syz155240 			struct	radix_node *rn_R;/* progeny */
72*2393Syz155240 		} rn_node;
73*2393Syz155240 	} rn_u;
74*2393Syz155240 #ifdef RN_DEBUG
75*2393Syz155240 	int rn_info;
76*2393Syz155240 	struct radix_node *rn_twin;
77*2393Syz155240 	struct radix_node *rn_ybro;
78*2393Syz155240 #endif
79*2393Syz155240 };
80*2393Syz155240 
81*2393Syz155240 #define rn_dupedkey rn_u.rn_leaf.rn_Dupedkey
82*2393Syz155240 #define rn_key rn_u.rn_leaf.rn_Key
83*2393Syz155240 #define rn_mask rn_u.rn_leaf.rn_Mask
84*2393Syz155240 #define rn_off rn_u.rn_node.rn_Off
85*2393Syz155240 #define rn_l rn_u.rn_node.rn_L
86*2393Syz155240 #define rn_r rn_u.rn_node.rn_R
87*2393Syz155240 
88*2393Syz155240 /*
89*2393Syz155240  * Annotations to tree concerning potential routes applying to subtrees.
90*2393Syz155240  */
91*2393Syz155240 
92*2393Syz155240 struct radix_mask {
93*2393Syz155240 	short	rm_b;			/* bit offset; -1-index(netmask) */
94*2393Syz155240 	char	rm_unused;		/* cf. rn_bmask */
95*2393Syz155240 	u_char	rm_flags;		/* cf. rn_flags */
96*2393Syz155240 	struct	radix_mask *rm_mklist;	/* more masks to try */
97*2393Syz155240 	union	{
98*2393Syz155240 		caddr_t	rmu_mask;		/* the mask */
99*2393Syz155240 		struct	radix_node *rmu_leaf;	/* for normal routes */
100*2393Syz155240 	}	rm_rmu;
101*2393Syz155240 	int	rm_refs;		/* # of references to this struct */
102*2393Syz155240 };
103*2393Syz155240 
104*2393Syz155240 #define rm_mask rm_rmu.rmu_mask
105*2393Syz155240 #define rm_leaf rm_rmu.rmu_leaf		/* extra field would make 32 bytes */
106*2393Syz155240 
107*2393Syz155240 #define MKGet(m) {\
108*2393Syz155240 	if (rn_mkfreelist) {\
109*2393Syz155240 		m = rn_mkfreelist; \
110*2393Syz155240 		rn_mkfreelist = (m)->rm_mklist; \
111*2393Syz155240 	} else \
112*2393Syz155240 		R_Malloc(m, struct radix_mask *, sizeof (*(m))); }\
113*2393Syz155240 
114*2393Syz155240 #define MKFree(m) { (m)->rm_mklist = rn_mkfreelist; rn_mkfreelist = (m);}
115*2393Syz155240 
116*2393Syz155240 struct radix_node_head {
117*2393Syz155240 	struct	radix_node *rnh_treetop;
118*2393Syz155240 	struct	radix_node *rnh_leaflist;
119*2393Syz155240 	u_long	rnh_hits;
120*2393Syz155240 	u_int	rnh_number;
121*2393Syz155240 	u_int	rnh_ref;
122*2393Syz155240 	int	rnh_addrsize;		/* permit, but not require fixed keys */
123*2393Syz155240 	int	rnh_pktsize;		/* permit, but not require fixed keys */
124*2393Syz155240 	struct	radix_node *(*rnh_addaddr)	/* add based on sockaddr */
125*2393Syz155240 		__P((void *v, void *mask,
126*2393Syz155240 		     struct radix_node_head *head, struct radix_node nodes[]));
127*2393Syz155240 	struct	radix_node *(*rnh_addpkt)	/* add based on packet hdr */
128*2393Syz155240 		__P((void *v, void *mask,
129*2393Syz155240 		     struct radix_node_head *head, struct radix_node nodes[]));
130*2393Syz155240 	struct	radix_node *(*rnh_deladdr)	/* remove based on sockaddr */
131*2393Syz155240 		__P((void *v, void *mask, struct radix_node_head *head));
132*2393Syz155240 	struct	radix_node *(*rnh_delpkt)	/* remove based on packet hdr */
133*2393Syz155240 		__P((void *v, void *mask, struct radix_node_head *head));
134*2393Syz155240 	struct	radix_node *(*rnh_matchaddr)	/* locate based on sockaddr */
135*2393Syz155240 		__P((void *v, struct radix_node_head *head));
136*2393Syz155240 	struct	radix_node *(*rnh_lookup)	/* locate based on sockaddr */
137*2393Syz155240 		__P((void *v, void *mask, struct radix_node_head *head));
138*2393Syz155240 	struct	radix_node *(*rnh_matchpkt)	/* locate based on packet hdr */
139*2393Syz155240 		__P((void *v, struct radix_node_head *head));
140*2393Syz155240 	int	(*rnh_walktree)			/* traverse tree */
141*2393Syz155240 		__P((struct radix_node_head *,
142*2393Syz155240 		     int (*)(struct radix_node *, void *), void *));
143*2393Syz155240 	struct	radix_node rnh_nodes[3];	/* empty tree for common case */
144*2393Syz155240 };
145*2393Syz155240 
146*2393Syz155240 
147*2393Syz155240 #if defined(AIX)
148*2393Syz155240 # undef Bcmp
149*2393Syz155240 # undef Bzero
150*2393Syz155240 # undef R_Malloc
151*2393Syz155240 # undef Free
152*2393Syz155240 #endif
153*2393Syz155240 #define Bcmp(a, b, n)	bcmp(((caddr_t)(a)), ((caddr_t)(b)), (unsigned)(n))
154*2393Syz155240 #if defined(linux) && defined(_KERNEL)
155*2393Syz155240 # define Bcopy(a, b, n)	memmove(((caddr_t)(b)), ((caddr_t)(a)), (unsigned)(n))
156*2393Syz155240 #else
157*2393Syz155240 # define Bcopy(a, b, n)	bcopy(((caddr_t)(a)), ((caddr_t)(b)), (unsigned)(n))
158*2393Syz155240 #endif
159*2393Syz155240 #define Bzero(p, n)		bzero((caddr_t)(p), (unsigned)(n));
160*2393Syz155240 #define R_Malloc(p, t, n)	KMALLOCS(p, t, n)
161*2393Syz155240 #define FreeS(p, z)		KFREES(p, z)
162*2393Syz155240 #define Free(p)			KFREE(p)
163*2393Syz155240 
164*2393Syz155240 #if (defined(__osf__) || defined(AIX) || (IRIX >= 60516)) && defined(_KERNEL)
165*2393Syz155240 # define	rn_init		ipf_rn_init
166*2393Syz155240 # define	rn_fini		ipf_rn_fini
167*2393Syz155240 # define	rn_inithead	ipf_rn_inithead
168*2393Syz155240 # define	rn_freehead	ipf_rn_freehead
169*2393Syz155240 # define	rn_inithead0	ipf_rn_inithead0
170*2393Syz155240 # define	rn_refines	ipf_rn_refines
171*2393Syz155240 # define	rn_walktree	ipf_rn_walktree
172*2393Syz155240 # define	rn_addmask	ipf_rn_addmask
173*2393Syz155240 # define	rn_addroute	ipf_rn_addroute
174*2393Syz155240 # define	rn_delete	ipf_rn_delete
175*2393Syz155240 # define	rn_insert	ipf_rn_insert
176*2393Syz155240 # define	rn_lookup	ipf_rn_lookup
177*2393Syz155240 # define	rn_match	ipf_rn_match
178*2393Syz155240 # define	rn_newpair	ipf_rn_newpair
179*2393Syz155240 # define	rn_search	ipf_rn_search
180*2393Syz155240 # define	rn_search_m	ipf_rn_search_m
181*2393Syz155240 # define	max_keylen	ipf_maxkeylen
182*2393Syz155240 # define	rn_mkfreelist	ipf_rn_mkfreelist
183*2393Syz155240 # define	rn_zeros	ipf_rn_zeros
184*2393Syz155240 # define	rn_ones		ipf_rn_ones
185*2393Syz155240 # define	rn_satisfies_leaf	ipf_rn_satisfies_leaf
186*2393Syz155240 # define	rn_lexobetter	ipf_rn_lexobetter
187*2393Syz155240 # define	rn_new_radix_mask	ipf_rn_new_radix_mask
188*2393Syz155240 # define	rn_freenode	ipf_rn_freenode
189*2393Syz155240 #endif
190*2393Syz155240 
191*2393Syz155240 void	 rn_init __P((void));
192*2393Syz155240 void	 rn_fini __P((void));
193*2393Syz155240 int	 rn_inithead __P((void **, int));
194*2393Syz155240 void	 rn_freehead __P((struct radix_node_head *));
195*2393Syz155240 int	 rn_inithead0 __P((struct radix_node_head *, int));
196*2393Syz155240 int	 rn_refines __P((void *, void *));
197*2393Syz155240 int	 rn_walktree __P((struct radix_node_head *,
198*2393Syz155240 			  int (*)(struct radix_node *, void *), void *));
199*2393Syz155240 struct radix_node
200*2393Syz155240 	 *rn_addmask __P((void *, int, int)),
201*2393Syz155240 	 *rn_addroute __P((void *, void *, struct radix_node_head *,
202*2393Syz155240 			struct radix_node [2])),
203*2393Syz155240 	 *rn_delete __P((void *, void *, struct radix_node_head *)),
204*2393Syz155240 	 *rn_insert __P((void *, struct radix_node_head *, int *,
205*2393Syz155240 			struct radix_node [2])),
206*2393Syz155240 	 *rn_lookup __P((void *, void *, struct radix_node_head *)),
207*2393Syz155240 	 *rn_match __P((void *, struct radix_node_head *)),
208*2393Syz155240 	 *rn_newpair __P((void *, int, struct radix_node[2])),
209*2393Syz155240 	 *rn_search __P((void *, struct radix_node *)),
210*2393Syz155240 	 *rn_search_m __P((void *, struct radix_node *, void *));
211*2393Syz155240 
212*2393Syz155240 #endif /* _NET_RADIX_H_ */
213