]> git.proxmox.com Git - mirror_edk2.git/blame - StdLib/Include/net/radix.h
Add Socket Libraries.
[mirror_edk2.git] / StdLib / Include / net / radix.h
CommitLineData
d7ce7006 1/*\r
2 * Copyright (c) 1988, 1989, 1993\r
3 * The Regents of the University of California. All rights reserved.\r
4 *\r
5 * Redistribution and use in source and binary forms, with or without\r
6 * modification, are permitted provided that the following conditions\r
7 * are met:\r
8 * 1. Redistributions of source code must retain the above copyright\r
9 * notice, this list of conditions and the following disclaimer.\r
10 * 2. Redistributions in binary form must reproduce the above copyright\r
11 * notice, this list of conditions and the following disclaimer in the\r
12 * documentation and/or other materials provided with the distribution.\r
13 * 3. All advertising materials mentioning features or use of this software\r
14 * must display the following acknowledgement:\r
15 * This product includes software developed by the University of\r
16 * California, Berkeley and its contributors.\r
17 * 4. Neither the name of the University nor the names of its contributors\r
18 * may be used to endorse or promote products derived from this software\r
19 * without specific prior written permission.\r
20 *\r
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND\r
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE\r
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
31 * SUCH DAMAGE.\r
32 *\r
33 * @(#)radix.h 8.2 (Berkeley) 10/31/94\r
34 * $Id: radix.h,v 1.1.1.1 2006/05/30 06:12:46 hhzhou Exp $\r
35 */\r
36\r
37#ifndef _RADIX_H_\r
38#define _RADIX_H_\r
39\r
40#ifdef MALLOC_DECLARE\r
41MALLOC_DECLARE(M_RTABLE);\r
42#endif\r
43\r
44/*\r
45 * Radix search tree node layout.\r
46 */\r
47\r
48struct radix_node {\r
49 struct radix_mask *rn_mklist; /* list of masks contained in subtree */\r
50 struct radix_node *rn_p; /* parent */\r
51 short rn_b; /* bit offset; -1-index(netmask) */\r
52 char rn_bmask; /* node: mask for bit test*/\r
53 u_char rn_flags; /* enumerated next */\r
54#define RNF_NORMAL 1 /* leaf contains normal route */\r
55#define RNF_ROOT 2 /* leaf is root leaf for tree */\r
56#define RNF_ACTIVE 4 /* This node is alive (for rtfree) */\r
57 union {\r
58 struct { /* leaf only data: */\r
59 caddr_t rn_Key; /* object of search */\r
60 caddr_t rn_Mask; /* netmask, if present */\r
61 struct radix_node *rn_Dupedkey;\r
62 } rn_leaf;\r
63 struct { /* node only data: */\r
64 int rn_Off; /* where to start compare */\r
65 struct radix_node *rn_L;/* progeny */\r
66 struct radix_node *rn_R;/* progeny */\r
67 } rn_node;\r
68 } rn_u;\r
69#ifdef RN_DEBUG\r
70 int rn_info;\r
71 struct radix_node *rn_twin;\r
72 struct radix_node *rn_ybro;\r
73#endif\r
74};\r
75\r
76#define rn_dupedkey rn_u.rn_leaf.rn_Dupedkey\r
77#define rn_key rn_u.rn_leaf.rn_Key\r
78#define rn_mask rn_u.rn_leaf.rn_Mask\r
79#define rn_off rn_u.rn_node.rn_Off\r
80#define rn_l rn_u.rn_node.rn_L\r
81#define rn_r rn_u.rn_node.rn_R\r
82\r
83/*\r
84 * Annotations to tree concerning potential routes applying to subtrees.\r
85 */\r
86\r
87struct radix_mask {\r
88 short rm_b; /* bit offset; -1-index(netmask) */\r
89 char rm_unused; /* cf. rn_bmask */\r
90 u_char rm_flags; /* cf. rn_flags */\r
91 struct radix_mask *rm_mklist; /* more masks to try */\r
92 union {\r
93 caddr_t rmu_mask; /* the mask */\r
94 struct radix_node *rmu_leaf; /* for normal routes */\r
95 } rm_rmu;\r
96 int rm_refs; /* # of references to this struct */\r
97};\r
98\r
99#define rm_mask rm_rmu.rmu_mask\r
100#define rm_leaf rm_rmu.rmu_leaf /* extra field would make 32 bytes */\r
101\r
102#define MKGet(m) {\\r
103 if (rn_mkfreelist) {\\r
104 m = rn_mkfreelist; \\r
105 rn_mkfreelist = (m)->rm_mklist; \\r
106 } else \\r
107 R_Malloc(m, struct radix_mask *, sizeof (*(m))); }\\r
108\r
109#define MKFree(m) { (m)->rm_mklist = rn_mkfreelist; rn_mkfreelist = (m);}\r
110\r
111typedef int walktree_f_t __P((struct radix_node *, void *));\r
112\r
113struct radix_node_head {\r
114 struct radix_node *rnh_treetop;\r
115 int rnh_addrsize; /* permit, but not require fixed keys */\r
116 int rnh_pktsize; /* permit, but not require fixed keys */\r
117 struct radix_node *(*rnh_addaddr) /* add based on sockaddr */\r
118 __P((void *v, void *mask,\r
119 struct radix_node_head *head, struct radix_node nodes[]));\r
120 struct radix_node *(*rnh_addpkt) /* add based on packet hdr */\r
121 __P((void *v, void *mask,\r
122 struct radix_node_head *head, struct radix_node nodes[]));\r
123 struct radix_node *(*rnh_deladdr) /* remove based on sockaddr */\r
124 __P((void *v, void *mask, struct radix_node_head *head));\r
125 struct radix_node *(*rnh_delpkt) /* remove based on packet hdr */\r
126 __P((void *v, void *mask, struct radix_node_head *head));\r
127 struct radix_node *(*rnh_matchaddr) /* locate based on sockaddr */\r
128 __P((void *v, struct radix_node_head *head));\r
129 struct radix_node *(*rnh_lookup) /* locate based on sockaddr */\r
130 __P((void *v, void *mask, struct radix_node_head *head));\r
131 struct radix_node *(*rnh_matchpkt) /* locate based on packet hdr */\r
132 __P((void *v, struct radix_node_head *head));\r
133 int (*rnh_walktree) /* traverse tree */\r
134 __P((struct radix_node_head *head, walktree_f_t *f, void *w));\r
135 int (*rnh_walktree_from) /* traverse tree below a */\r
136 __P((struct radix_node_head *head, void *a, void *m,\r
137 walktree_f_t *f, void *w));\r
138 void (*rnh_close) /* do something when the last ref drops */\r
139 __P((struct radix_node *rn, struct radix_node_head *head));\r
140 struct radix_node rnh_nodes[3]; /* empty tree for common case */\r
141};\r
142\r
143#ifndef KERNEL\r
144#define Bcmp(a, b, n) bcmp(((char *)(a)), ((char *)(b)), (n))\r
145#define Bcopy(a, b, n) bcopy(((char *)(a)), ((char *)(b)), (unsigned)(n))\r
146#define Bzero(p, n) bzero((char *)(p), (int)(n));\r
147#define R_Malloc(p, t, n) (p = (t) malloc((unsigned int)(n)))\r
148#define Free(p) free((char *)p);\r
149#else\r
150#define Bcmp(a, b, n) bcmp(((caddr_t)(a)), ((caddr_t)(b)), (unsigned)(n))\r
151#define Bcopy(a, b, n) bcopy(((caddr_t)(a)), ((caddr_t)(b)), (unsigned)(n))\r
152#define Bzero(p, n) bzero((caddr_t)(p), (unsigned)(n));\r
153#define R_Malloc(p, t, n) (p = (t) malloc((unsigned long)(n), M_RTABLE, M_DONTWAIT))\r
154#define Free(p) free((caddr_t)p, M_RTABLE);\r
155#endif /*KERNEL*/\r
156\r
157void rn_init __P((void));\r
158int rn_inithead __P((void **, int));\r
159int rn_refines __P((void *, void *));\r
160struct radix_node\r
161 *rn_addmask __P((void *, int, int)),\r
162 *rn_addroute __P((void *, void *, struct radix_node_head *,\r
163 struct radix_node [2])),\r
164 *rn_delete __P((void *, void *, struct radix_node_head *)),\r
165 *rn_lookup __P((void *v_arg, void *m_arg,\r
166 struct radix_node_head *head)),\r
167 *rn_match __P((void *, struct radix_node_head *));\r
168\r
169\r
170#endif /* _RADIX_H_ */\r