IP Multicast FIB (mfib)
[vpp.git] / src / vnet / util / radix.h
1 /*      $NetBSD: radix.h,v 1.23 2016/11/15 01:50:06 ozaki-r Exp $       */
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  * 3. Neither the name of the University nor the names of its contributors
16  *    may be used to endorse or promote products derived from this software
17  *    without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  *
31  *      @(#)radix.h     8.2 (Berkeley) 10/31/94
32  */
33
34 #ifndef _NET_RADIX_H_
35 #define _NET_RADIX_H_
36
37 #include <vlib/vlib.h>
38
39 /*
40  * Radix search tree node layout.
41  */
42
43 struct radix_node {
44         struct  radix_mask *rn_mklist;  /* list of masks contained in subtree */
45         struct  radix_node *rn_p;       /* parent */
46         i16     rn_b;                   /* bit offset; -1-index(netmask) */
47         u8      rn_bmask;               /* node: mask for bit test*/
48         u8      rn_flags;               /* enumerated next */
49 #define RNF_NORMAL      1               /* leaf contains normal route */
50 #define RNF_ROOT        2               /* leaf is root leaf for tree */
51 #define RNF_ACTIVE      4               /* This node is alive (for rtfree) */
52         union {
53                 struct {                        /* leaf only data: */
54                         const char *rn_Key;     /* object of search */
55                         const char *rn_Mask;    /* netmask, if present */
56                         struct  radix_node *rn_Dupedkey;
57                 } rn_leaf;
58                 struct {                        /* node only data: */
59                         int     rn_Off;         /* where to start compare */
60                         struct  radix_node *rn_L;/* progeny */
61                         struct  radix_node *rn_R;/* progeny */
62                 } rn_node;
63         } rn_u;
64 #ifdef RN_DEBUG
65         i32 rn_info;
66         struct radix_node *rn_twin;
67         struct radix_node *rn_ybro;
68 #endif
69 };
70
71 #define rn_dupedkey rn_u.rn_leaf.rn_Dupedkey
72 #define rn_key rn_u.rn_leaf.rn_Key
73 #define rn_mask rn_u.rn_leaf.rn_Mask
74 #define rn_off rn_u.rn_node.rn_Off
75 #define rn_l rn_u.rn_node.rn_L
76 #define rn_r rn_u.rn_node.rn_R
77
78 /*
79  * Annotations to tree concerning potential routes applying to subtrees.
80  */
81
82 struct radix_mask {
83         i16     rm_b;                   /* bit offset; -1-index(netmask) */
84         i8      rm_unused;              /* cf. rn_bmask */
85         u8      rm_flags;               /* cf. rn_flags */
86         struct  radix_mask *rm_mklist;  /* more masks to try */
87         union   {
88                 const char *rmu_mask;           /* the mask */
89                 struct  radix_node *rmu_leaf;   /* for normal routes */
90         }       rm_rmu;
91         i32     rm_refs;                /* # of references to this struct */
92 };
93
94 #define rm_mask rm_rmu.rmu_mask
95 #define rm_leaf rm_rmu.rmu_leaf         /* extra field would make 32 bytes */
96
97 struct radix_node_head {
98         struct  radix_node *rnh_treetop;
99         i32     rnh_addrsize;           /* permit, but not require fixed keys */
100         i32     rnh_pktsize;            /* permit, but not require fixed keys */
101         struct  radix_node *(*rnh_addaddr)      /* add based on sockaddr */
102                 (const void *v, const void *mask,
103                      struct radix_node_head *head, struct radix_node nodes[]);
104         struct  radix_node *(*rnh_addpkt)       /* add based on packet hdr */
105                 (const void *v, const void *mask,
106                      struct radix_node_head *head, struct radix_node nodes[]);
107         struct  radix_node *(*rnh_deladdr)      /* remove based on sockaddr */
108                 (const void *v, const void *mask, struct radix_node_head *head);
109         struct  radix_node *(*rnh_delpkt)       /* remove based on packet hdr */
110                 (const void *v, const void *mask, struct radix_node_head *head);
111         struct  radix_node *(*rnh_matchaddr)    /* locate based on sockaddr */
112                 (const void *v, struct radix_node_head *head);
113         struct  radix_node *(*rnh_lookup)       /* locate based on sockaddr */
114                 (const void *v, const void *mask, struct radix_node_head *head);
115         struct  radix_node *(*rnh_matchpkt)     /* locate based on packet hdr */
116                 (const void *v, struct radix_node_head *head);
117         struct  radix_node rnh_nodes[3];        /* empty tree for common case */
118 };
119
120 void    rn_init(void);
121 int     rn_inithead(void **, int);
122 void    rn_delayedinit(void **, int);
123 int     rn_inithead0(struct radix_node_head *, int);
124 int     rn_refines(const void *, const void *);
125 int     rn_walktree(struct radix_node_head *,
126                     int (*)(struct radix_node *, void *),
127                     void *);
128 struct radix_node *
129         rn_search_matched(struct radix_node_head *,
130                           int (*)(struct radix_node *, void *),
131                           void *);
132 struct radix_node
133          *rn_addmask(const void *, int, int),
134          *rn_addroute(const void *, const void *, struct radix_node_head *,
135                         struct radix_node [2]),
136          *rn_delete1(const void *, const void *, struct radix_node_head *,
137                         struct radix_node *),
138          *rn_delete(const void *, const void *, struct radix_node_head *),
139          *rn_insert(const void *, struct radix_node_head *, int *,
140                         struct radix_node [2]),
141          *rn_lookup(const void *, const void *, struct radix_node_head *),
142          *rn_match(const void *, struct radix_node_head *),
143          *rn_newpair(const void *, int, struct radix_node[2]),
144          *rn_search(const void *, struct radix_node *),
145          *rn_search_m(const void *, struct radix_node *, const void *);
146
147 #endif /* !_NET_RADIX_H_ */