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:
7 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 #ifndef __MFIB_TYPES_H__
17 #define __MFIB_TYPES_H__
19 #include <vnet/fib/fib_types.h>
22 * Aggregate type for a prefix
24 typedef struct mfib_prefix_t_ {
33 fib_protocol_t fp_proto;
36 * Pad to keep the address 4 byte aligned
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.
46 ip46_address_t fp_grp_addr;
47 ip46_address_t fp_src_addr;
50 typedef enum mfib_entry_attribute_t_
52 MFIB_ENTRY_ATTRIBUTE_FIRST = 0,
54 * The control planes needs packets mathing this entry to generate
57 MFIB_ENTRY_SIGNAL = MFIB_ENTRY_ATTRIBUTE_FIRST,
59 * Drop all traffic to this route
63 * The control plane needs to be informed of coneected sources
67 * Accept packets from any incpoming interface
68 * Use with extreme caution
70 MFIB_ENTRY_ACCEPT_ALL_ITF,
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
78 MFIB_ENTRY_INHERIT_ACCEPT,
79 MFIB_ENTRY_ATTRIBUTE_LAST = MFIB_ENTRY_INHERIT_ACCEPT,
80 } mfib_entry_attribute_t;
82 #define FOR_EACH_MFIB_ATTRIBUTE(_item) \
83 for (_item = MFIB_ENTRY_ATTRIBUTE_FIRST; \
84 _item <= MFIB_ENTRY_ATTRIBUTE_LAST; \
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", \
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", \
105 typedef enum mfib_entry_flags_t_
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;
116 typedef enum mfib_itf_attribute_t_
118 MFIB_ITF_ATTRIBUTE_FIRST,
119 MFIB_ITF_NEGATE_SIGNAL = MFIB_ITF_ATTRIBUTE_FIRST,
122 MFIB_ITF_SIGNAL_PRESENT,
123 MFIB_ITF_DONT_PRESERVE,
124 MFIB_ITF_ATTRIBUTE_LAST = MFIB_ITF_DONT_PRESERVE,
125 } mfib_itf_attribute_t;
127 #define FOR_EACH_MFIB_ITF_ATTRIBUTE(_item) \
128 for (_item = MFIB_ITF_ATTRIBUTE_FIRST; \
129 _item <= MFIB_ITF_ATTRIBUTE_LAST; \
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", \
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", \
148 typedef enum mfib_itf_flags_t_
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),
159 * Possible [control plane] sources of MFIB entries
161 typedef enum mfib_source_t_
171 MFIB_SOURCE_VXLAN_GPE,
174 MFIB_SOURCE_VXLAN_GBP,
176 MFIB_SOURCE_DEFAULT_ROUTE,
179 #define MFIB_SOURCE_NAMES { \
180 [MFIB_SOURCE_SPECIAL] = "Special", \
181 [MFIB_SOURCE_6RD] = "6RD", \
182 [MFIB_SOURCE_API] = "API", \
183 [MFIB_SOURCE_CLI] = "CLI", \
184 [MFIB_SOURCE_DHCP] = "DHCP", \
185 [MFIB_SOURCE_VXLAN] = "VXLAN", \
186 [MFIB_SOURCE_SRv6] = "SRv6", \
187 [MFIB_SOURCE_GTPU] = "GTPU", \
188 [MFIB_SOURCE_VXLAN_GPE] = "VXLAN-GPE", \
189 [MFIB_SOURCE_GENEVE] = "Geneve", \
190 [MFIB_SOURCE_IGMP] = "IGMP", \
191 [MFIB_SOURCE_VXLAN_GBP] = "VXLAN-GBP", \
192 [MFIB_SOURCE_RR] = "Recursive-resolution", \
193 [MFIB_SOURCE_DEFAULT_ROUTE] = "Default Route", \
196 #define FOREACH_MFIB_SOURCE(_ms) \
197 for (_ms = MFIB_SOURCE_SPECIAL; \
198 _ms <= MFIB_SOURCE_DEFAULT_ROUTE; \
201 #define MFIB_N_SOURCES (MFIB_SOURCE_DEFAULT_ROUTE + 1)
202 #define MFIB_SOURCE_NONE (MFIB_SOURCE_DEFAULT_ROUTE + 1)
205 * \brief Compare two prefixes for equality
207 extern int mfib_prefix_cmp(const mfib_prefix_t *p1,
208 const mfib_prefix_t *p2);
210 extern u8 * format_mfib_prefix(u8 * s, va_list * args);
212 extern u8 *format_mfib_entry_flags(u8 * s, va_list * args);
213 extern u8 *format_mfib_itf_flags(u8 * s, va_list * args);
214 extern uword unformat_mfib_itf_flags(unformat_input_t * input,
216 extern uword unformat_mfib_entry_flags(unformat_input_t * input,
219 * \brief Compare two prefixes for covering relationship
221 * \return non-zero if the first prefix is a cover for the second
223 extern int mfib_prefix_is_cover(const mfib_prefix_t *p1,
224 const mfib_prefix_t *p2);
227 * \brief Return true is the prefix is a host prefix
229 extern int mfib_prefix_is_host(const mfib_prefix_t *p);
231 extern fib_forward_chain_type_t mfib_forw_chain_type_from_dpo_proto(dpo_proto_t proto);
232 extern fib_forward_chain_type_t mfib_forw_chain_type_from_fib_proto(fib_protocol_t proto);