fib: Always install all routers mcast addresses
[vpp.git] / src / vnet / mfib / mfib_types.h
1  /*
2  * Copyright (c) 2016 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15
16 #ifndef __MFIB_TYPES_H__
17 #define __MFIB_TYPES_H__
18
19 #include <vnet/fib/fib_types.h>
20
21 /**
22  * Aggregate type for a prefix
23  */
24 typedef struct mfib_prefix_t_ {
25     /**
26      * The mask length
27      */
28     u16 fp_len;
29
30     /**
31      * protocol type
32      */
33     fib_protocol_t fp_proto;
34
35     /**
36      * Pad to keep the address 4 byte aligned
37      */
38     u8 ___fp___pad;
39
40     /**
41      * The address type is not deriveable from the fp_addr member.
42      * If it's v4, then the first 3 u32s of the address will be 0.
43      * v6 addresses (even v4 mapped ones) have at least 2 u32s assigned
44      * to non-zero values. true. but when it's all zero, one cannot decide.
45      */
46     ip46_address_t fp_grp_addr;
47     ip46_address_t fp_src_addr;
48 } mfib_prefix_t;
49
50 typedef enum mfib_entry_attribute_t_
51 {
52     MFIB_ENTRY_ATTRIBUTE_FIRST = 0,
53     /**
54      * The control planes needs packets mathing this entry to generate
55      * a signal.
56      */
57     MFIB_ENTRY_SIGNAL =  MFIB_ENTRY_ATTRIBUTE_FIRST,
58     /**
59      * Drop all traffic to this route
60      */
61     MFIB_ENTRY_DROP,
62     /**
63      * The control plane needs to be informed of coneected sources
64      */
65     MFIB_ENTRY_CONNECTED,
66     /**
67      * Accept packets from any incpoming interface
68      *        Use with extreme caution
69      */
70     MFIB_ENTRY_ACCEPT_ALL_ITF,
71     /**
72      * Exclusive - like its unicast counterpart. the source has provided
73      * the forwarding DPO directly. The entry therefore does not resolve
74      * paths via a path-list
75      */
76     MFIB_ENTRY_EXCLUSIVE,
77
78     MFIB_ENTRY_INHERIT_ACCEPT,
79     MFIB_ENTRY_ATTRIBUTE_LAST = MFIB_ENTRY_INHERIT_ACCEPT,
80 } mfib_entry_attribute_t;
81
82 #define FOR_EACH_MFIB_ATTRIBUTE(_item)                  \
83     for (_item = MFIB_ENTRY_ATTRIBUTE_FIRST;            \
84          _item <= MFIB_ENTRY_ATTRIBUTE_LAST;            \
85          _item++)
86
87 #define MFIB_ENTRY_NAMES_SHORT  {          \
88     [MFIB_ENTRY_SIGNAL]         = "S",     \
89     [MFIB_ENTRY_CONNECTED]      = "C",     \
90     [MFIB_ENTRY_DROP]           = "D",     \
91     [MFIB_ENTRY_ACCEPT_ALL_ITF] = "AA",    \
92     [MFIB_ENTRY_INHERIT_ACCEPT] = "IA",    \
93     [MFIB_ENTRY_EXCLUSIVE]      = "E",     \
94 }
95
96 #define MFIB_ENTRY_NAMES_LONG  {                    \
97     [MFIB_ENTRY_SIGNAL]         = "Signal",         \
98     [MFIB_ENTRY_CONNECTED]      = "Connected",      \
99     [MFIB_ENTRY_DROP]           = "Drop",           \
100     [MFIB_ENTRY_ACCEPT_ALL_ITF] = "Accept-all-itf", \
101     [MFIB_ENTRY_INHERIT_ACCEPT] = "Inherit-Accept", \
102     [MFIB_ENTRY_EXCLUSIVE]      = "Exclusive",      \
103 }
104
105 typedef enum mfib_entry_flags_t_
106 {
107     MFIB_ENTRY_FLAG_NONE,
108     MFIB_ENTRY_FLAG_SIGNAL = (1 << MFIB_ENTRY_SIGNAL),
109     MFIB_ENTRY_FLAG_DROP = (1 << MFIB_ENTRY_DROP),
110     MFIB_ENTRY_FLAG_CONNECTED = (1 << MFIB_ENTRY_CONNECTED),
111     MFIB_ENTRY_FLAG_ACCEPT_ALL_ITF = (1 << MFIB_ENTRY_ACCEPT_ALL_ITF),
112     MFIB_ENTRY_FLAG_EXCLUSIVE = (1 << MFIB_ENTRY_EXCLUSIVE),
113     MFIB_ENTRY_FLAG_INHERIT_ACCEPT = (1 << MFIB_ENTRY_INHERIT_ACCEPT),
114 } mfib_entry_flags_t;
115
116 typedef enum mfib_itf_attribute_t_
117 {
118     MFIB_ITF_ATTRIBUTE_FIRST,
119     MFIB_ITF_NEGATE_SIGNAL = MFIB_ITF_ATTRIBUTE_FIRST,
120     MFIB_ITF_ACCEPT,
121     MFIB_ITF_FORWARD,
122     MFIB_ITF_SIGNAL_PRESENT,
123     MFIB_ITF_DONT_PRESERVE,
124     MFIB_ITF_ATTRIBUTE_LAST = MFIB_ITF_DONT_PRESERVE,
125 } mfib_itf_attribute_t;
126
127 #define FOR_EACH_MFIB_ITF_ATTRIBUTE(_item)              \
128     for (_item = MFIB_ITF_ATTRIBUTE_FIRST;              \
129          _item <= MFIB_ITF_ATTRIBUTE_LAST;              \
130          _item++)
131
132 #define MFIB_ITF_NAMES_SHORT  {             \
133     [MFIB_ITF_NEGATE_SIGNAL] = "NS",        \
134     [MFIB_ITF_ACCEPT] = "A",                \
135     [MFIB_ITF_FORWARD] = "F",               \
136     [MFIB_ITF_SIGNAL_PRESENT] = "SP",       \
137     [MFIB_ITF_DONT_PRESERVE] = "DP",        \
138 }
139
140 #define MFIB_ITF_NAMES_LONG  {                    \
141     [MFIB_ITF_NEGATE_SIGNAL] = "Negate-Signal",   \
142     [MFIB_ITF_ACCEPT] = "Accept",                 \
143     [MFIB_ITF_FORWARD] = "Forward",               \
144     [MFIB_ITF_SIGNAL_PRESENT] = "Signal-Present", \
145     [MFIB_ITF_DONT_PRESERVE] = "Don't-Preserve", \
146 }
147
148 typedef enum mfib_itf_flags_t_
149 {
150     MFIB_ITF_FLAG_NONE,
151     MFIB_ITF_FLAG_NEGATE_SIGNAL = (1 << MFIB_ITF_NEGATE_SIGNAL),
152     MFIB_ITF_FLAG_ACCEPT = (1 << MFIB_ITF_ACCEPT),
153     MFIB_ITF_FLAG_FORWARD = (1 << MFIB_ITF_FORWARD),
154     MFIB_ITF_FLAG_SIGNAL_PRESENT = (1 << MFIB_ITF_SIGNAL_PRESENT),
155     MFIB_ITF_FLAG_DONT_PRESERVE = (1 << MFIB_ITF_DONT_PRESERVE),
156 } mfib_itf_flags_t;
157
158 /**
159  * Possible [control plane] sources of MFIB entries
160  */
161 typedef enum mfib_source_t_
162 {
163     MFIB_SOURCE_SPECIAL,
164     MFIB_SOURCE_6RD,
165     MFIB_SOURCE_API,
166     MFIB_SOURCE_CLI,
167     MFIB_SOURCE_VXLAN,
168     MFIB_SOURCE_DHCP,
169     MFIB_SOURCE_SRv6,
170     MFIB_SOURCE_GTPU,
171     MFIB_SOURCE_VXLAN_GPE,
172     MFIB_SOURCE_GENEVE,
173     MFIB_SOURCE_IGMP,
174     MFIB_SOURCE_VXLAN_GBP,
175     MFIB_SOURCE_PLUGIN_LOW,
176     MFIB_SOURCE_RR,
177     MFIB_SOURCE_DEFAULT_ROUTE,
178 } mfib_source_t;
179
180 #define MFIB_SOURCE_NAMES {                        \
181     [MFIB_SOURCE_SPECIAL] = "Special",             \
182     [MFIB_SOURCE_6RD] = "6RD",                     \
183     [MFIB_SOURCE_API] = "API",                     \
184     [MFIB_SOURCE_CLI] = "CLI",                     \
185     [MFIB_SOURCE_DHCP] = "DHCP",                   \
186     [MFIB_SOURCE_VXLAN] = "VXLAN",                 \
187     [MFIB_SOURCE_SRv6] = "SRv6",                   \
188     [MFIB_SOURCE_GTPU] = "GTPU",                   \
189     [MFIB_SOURCE_VXLAN_GPE] = "VXLAN-GPE",         \
190     [MFIB_SOURCE_GENEVE] = "Geneve",               \
191     [MFIB_SOURCE_IGMP] = "IGMP",                   \
192     [MFIB_SOURCE_VXLAN_GBP] = "VXLAN-GBP",         \
193     [MFIB_SOURCE_PLUGIN_LOW] = "plugin-low",       \
194     [MFIB_SOURCE_RR] = "Recursive-resolution",     \
195     [MFIB_SOURCE_DEFAULT_ROUTE] = "Default Route", \
196 }
197
198 #define FOREACH_MFIB_SOURCE(_ms)                \
199     for (_ms = MFIB_SOURCE_SPECIAL;             \
200          _ms <= MFIB_SOURCE_DEFAULT_ROUTE;      \
201          _ms++)
202
203 #define MFIB_N_SOURCES (MFIB_SOURCE_DEFAULT_ROUTE + 1)
204 #define MFIB_SOURCE_NONE (MFIB_SOURCE_DEFAULT_ROUTE + 1)
205
206 /**
207  * \brief Compare two prefixes for equality
208  */
209 extern int mfib_prefix_cmp(const mfib_prefix_t *p1,
210                            const mfib_prefix_t *p2);
211
212 extern u8 * format_mfib_prefix(u8 * s, va_list * args);
213
214 extern u8 *format_mfib_entry_flags(u8 * s, va_list * args);
215 extern u8 *format_mfib_itf_flags(u8 * s, va_list * args);
216 extern uword unformat_mfib_itf_flags(unformat_input_t * input,
217                                      va_list * args);
218 extern uword unformat_mfib_entry_flags(unformat_input_t * input,
219                                        va_list * args);
220 /**
221  * \brief Compare two prefixes for covering relationship
222  *
223  * \return non-zero if the first prefix is a cover for the second
224  */
225 extern int mfib_prefix_is_cover(const mfib_prefix_t *p1,
226                                 const mfib_prefix_t *p2);
227
228 /**
229  * \brief Return true is the prefix is a host prefix
230  */
231 extern int mfib_prefix_is_host(const mfib_prefix_t *p);
232
233 extern fib_forward_chain_type_t mfib_forw_chain_type_from_dpo_proto(dpo_proto_t proto);
234 extern fib_forward_chain_type_t mfib_forw_chain_type_from_fib_proto(fib_protocol_t proto);
235
236 #endif