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