blob: d7503fbb1b95dffbbd08339aa4d040751b4cf8af [file] [log] [blame]
Neale Rannsad422ed2016-11-02 14:20:04 +00001/*
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#include <vnet/fib/fib_entry_delegate.h>
17#include <vnet/fib/fib_entry.h>
Neale Ranns88fc83e2017-04-05 08:11:14 -070018#include <vnet/fib/fib_attached_export.h>
Neale Rannsad422ed2016-11-02 14:20:04 +000019
Neale Ranns1f50bf82019-07-16 15:28:52 +000020static fib_entry_delegate_t *fib_entry_delegate_pool;
21
22fib_entry_delegate_t *
23fib_entry_delegate_get (index_t fedi)
24{
25 return (pool_elt_at_index(fib_entry_delegate_pool, fedi));
26}
27
28fib_node_index_t
29fib_entry_delegate_get_index (const fib_entry_delegate_t *fed)
30{
31 return (fed - fib_entry_delegate_pool);
32}
33
Neale Rannsad422ed2016-11-02 14:20:04 +000034static fib_entry_delegate_t *
35fib_entry_delegate_find_i (const fib_entry_t *fib_entry,
36 fib_entry_delegate_type_t type,
37 u32 *index)
38{
39 fib_entry_delegate_t *delegate;
Neale Ranns1f50bf82019-07-16 15:28:52 +000040 index_t *fedi;
Neale Rannsad422ed2016-11-02 14:20:04 +000041 int ii;
42
43 ii = 0;
Neale Ranns1f50bf82019-07-16 15:28:52 +000044 vec_foreach(fedi, fib_entry->fe_delegates)
Neale Rannsad422ed2016-11-02 14:20:04 +000045 {
Neale Ranns1f50bf82019-07-16 15:28:52 +000046 delegate = fib_entry_delegate_get(*fedi);
47
Neale Rannsad422ed2016-11-02 14:20:04 +000048 if (delegate->fd_type == type)
49 {
50 if (NULL != index)
51 *index = ii;
52
53 return (delegate);
54 }
55 else
56 {
57 ii++;
58 }
59 }
60
61 return (NULL);
62}
63
64fib_entry_delegate_t *
Neale Ranns1f50bf82019-07-16 15:28:52 +000065fib_entry_delegate_find (const fib_entry_t *fib_entry,
Neale Rannsad422ed2016-11-02 14:20:04 +000066 fib_entry_delegate_type_t type)
67{
68 return (fib_entry_delegate_find_i(fib_entry, type, NULL));
69}
70
71void
72fib_entry_delegate_remove (fib_entry_t *fib_entry,
73 fib_entry_delegate_type_t type)
74{
75 fib_entry_delegate_t *fed;
76 u32 index = ~0;
77
78 fed = fib_entry_delegate_find_i(fib_entry, type, &index);
79
80 ASSERT(NULL != fed);
81
82 vec_del1(fib_entry->fe_delegates, index);
Neale Ranns1f50bf82019-07-16 15:28:52 +000083
84 pool_put(fib_entry_delegate_pool, fed);
Neale Rannsad422ed2016-11-02 14:20:04 +000085}
86
87static int
88fib_entry_delegate_cmp_for_sort (void * v1,
89 void * v2)
90{
Neale Ranns1f50bf82019-07-16 15:28:52 +000091 fib_entry_delegate_t *delegate1, *delegate2;
92 index_t *fedi1 = v1, *fedi2 = v2;
93
94 delegate1 = fib_entry_delegate_get(*fedi1);
95 delegate2 = fib_entry_delegate_get(*fedi2);
Neale Rannsad422ed2016-11-02 14:20:04 +000096
97 return (delegate1->fd_type - delegate2->fd_type);
98}
99
100static void
101fib_entry_delegate_init (fib_entry_t *fib_entry,
102 fib_entry_delegate_type_t type)
103
104{
Neale Ranns1f50bf82019-07-16 15:28:52 +0000105 fib_entry_delegate_t *delegate;
Neale Rannsad422ed2016-11-02 14:20:04 +0000106
Neale Ranns1f50bf82019-07-16 15:28:52 +0000107 pool_get_zero(fib_entry_delegate_pool, delegate);
108
109 delegate->fd_entry_index = fib_entry_get_index(fib_entry);
110 delegate->fd_type = type;
111
112 vec_add1(fib_entry->fe_delegates, delegate - fib_entry_delegate_pool);
Neale Rannsad422ed2016-11-02 14:20:04 +0000113 vec_sort_with_function(fib_entry->fe_delegates,
114 fib_entry_delegate_cmp_for_sort);
115}
116
117fib_entry_delegate_t *
118fib_entry_delegate_find_or_add (fib_entry_t *fib_entry,
119 fib_entry_delegate_type_t fdt)
120{
121 fib_entry_delegate_t *delegate;
122
Neale Ranns1f50bf82019-07-16 15:28:52 +0000123 delegate = fib_entry_delegate_find(fib_entry, fdt);
Neale Rannsad422ed2016-11-02 14:20:04 +0000124
125 if (NULL == delegate)
126 {
127 fib_entry_delegate_init(fib_entry, fdt);
128 }
129
Neale Ranns1f50bf82019-07-16 15:28:52 +0000130 return (fib_entry_delegate_find(fib_entry, fdt));
Neale Rannsad422ed2016-11-02 14:20:04 +0000131}
132
133fib_entry_delegate_type_t
134fib_entry_chain_type_to_delegate_type (fib_forward_chain_type_t fct)
135{
136 switch (fct)
137 {
138 case FIB_FORW_CHAIN_TYPE_UNICAST_IP4:
139 return (FIB_ENTRY_DELEGATE_CHAIN_UNICAST_IP4);
140 case FIB_FORW_CHAIN_TYPE_UNICAST_IP6:
141 return (FIB_ENTRY_DELEGATE_CHAIN_UNICAST_IP6);
142 case FIB_FORW_CHAIN_TYPE_MPLS_EOS:
143 return (FIB_ENTRY_DELEGATE_CHAIN_MPLS_EOS);
144 case FIB_FORW_CHAIN_TYPE_MPLS_NON_EOS:
145 return (FIB_ENTRY_DELEGATE_CHAIN_MPLS_NON_EOS);
146 case FIB_FORW_CHAIN_TYPE_ETHERNET:
147 return (FIB_ENTRY_DELEGATE_CHAIN_ETHERNET);
Neale Ranns32e1c012016-11-22 17:07:28 +0000148 case FIB_FORW_CHAIN_TYPE_MCAST_IP4:
149 case FIB_FORW_CHAIN_TYPE_MCAST_IP6:
Neale Rannsd792d9c2017-10-21 10:53:20 -0700150 case FIB_FORW_CHAIN_TYPE_BIER:
Neale Ranns32e1c012016-11-22 17:07:28 +0000151 break;
Florin Corasce1b4c72017-01-26 14:25:34 -0800152 case FIB_FORW_CHAIN_TYPE_NSH:
153 return (FIB_ENTRY_DELEGATE_CHAIN_NSH);
Neale Rannsad422ed2016-11-02 14:20:04 +0000154 }
155 ASSERT(0);
156 return (FIB_ENTRY_DELEGATE_CHAIN_UNICAST_IP4);
157}
158
159fib_forward_chain_type_t
160fib_entry_delegate_type_to_chain_type (fib_entry_delegate_type_t fdt)
161{
162 switch (fdt)
163 {
164 case FIB_ENTRY_DELEGATE_CHAIN_UNICAST_IP4:
165 return (FIB_FORW_CHAIN_TYPE_UNICAST_IP4);
166 case FIB_ENTRY_DELEGATE_CHAIN_UNICAST_IP6:
167 return (FIB_FORW_CHAIN_TYPE_UNICAST_IP6);
168 case FIB_ENTRY_DELEGATE_CHAIN_MPLS_EOS:
169 return (FIB_FORW_CHAIN_TYPE_MPLS_EOS);
170 case FIB_ENTRY_DELEGATE_CHAIN_MPLS_NON_EOS:
171 return (FIB_FORW_CHAIN_TYPE_MPLS_NON_EOS);
172 case FIB_ENTRY_DELEGATE_CHAIN_ETHERNET:
173 return (FIB_FORW_CHAIN_TYPE_ETHERNET);
Florin Corasce1b4c72017-01-26 14:25:34 -0800174 case FIB_ENTRY_DELEGATE_CHAIN_NSH:
175 return (FIB_FORW_CHAIN_TYPE_NSH);
Neale Rannsad422ed2016-11-02 14:20:04 +0000176 case FIB_ENTRY_DELEGATE_COVERED:
177 case FIB_ENTRY_DELEGATE_ATTACHED_IMPORT:
178 case FIB_ENTRY_DELEGATE_ATTACHED_EXPORT:
Neale Ranns88fc83e2017-04-05 08:11:14 -0700179 case FIB_ENTRY_DELEGATE_BFD:
Neale Ranns1f50bf82019-07-16 15:28:52 +0000180 case FIB_ENTRY_DELEGATE_TRACK:
Neale Rannsad422ed2016-11-02 14:20:04 +0000181 break;
182 }
183 ASSERT(0);
184 return (FIB_FORW_CHAIN_TYPE_UNICAST_IP4);
185}
Neale Ranns88fc83e2017-04-05 08:11:14 -0700186
187/**
188 * typedef for printing a delegate
189 */
190typedef u8 * (*fib_entry_delegate_format_t)(const fib_entry_delegate_t *fed,
191 u8 *s);
192
193/**
194 * Print a delegate that represents a forwarding chain
195 */
196static u8 *
197fib_entry_delegate_fmt_fwd_chain (const fib_entry_delegate_t *fed,
198 u8 *s)
199{
200 s = format(s, "%U-chain\n %U",
201 format_fib_forw_chain_type,
202 fib_entry_delegate_type_to_chain_type(fed->fd_type),
203 format_dpo_id, &fed->fd_dpo, 2);
204
205 return (s);
206}
207
208/**
209 * Print a delegate that represents cover tracking
210 */
211static u8 *
212fib_entry_delegate_fmt_covered (const fib_entry_delegate_t *fed,
213 u8 *s)
214{
215 s = format(s, "covered:[");
216 s = fib_node_children_format(fed->fd_list, s);
217 s = format(s, "]");
218
219 return (s);
220}
221
222/**
223 * Print a delegate that represents attached-import tracking
224 */
225static u8 *
226fib_entry_delegate_fmt_import (const fib_entry_delegate_t *fed,
227 u8 *s)
228{
Neale Ranns1f50bf82019-07-16 15:28:52 +0000229 s = format(s, "import:");
230 s = fib_ae_import_format(fed->fd_index, s);
Neale Ranns88fc83e2017-04-05 08:11:14 -0700231
232 return (s);
233}
234
235/**
236 * Print a delegate that represents attached-export tracking
237 */
238static u8 *
239fib_entry_delegate_fmt_export (const fib_entry_delegate_t *fed,
240 u8 *s)
241{
Neale Ranns1f50bf82019-07-16 15:28:52 +0000242 s = format(s, "export:");
243 s = fib_ae_export_format(fed->fd_index, s);
Neale Ranns88fc83e2017-04-05 08:11:14 -0700244
245 return (s);
246}
247
248/**
249 * Print a delegate that represents BFD tracking
250 */
251static u8 *
252fib_entry_delegate_fmt_bfd (const fib_entry_delegate_t *fed,
253 u8 *s)
254{
255 s = format(s, "BFD:%d", fed->fd_bfd_state);
256
257 return (s);
258}
259
260/**
Neale Ranns1f50bf82019-07-16 15:28:52 +0000261 * Print a delegate that represents tracking
262 */
263static u8 *
264fib_entry_delegate_fmt_track (const fib_entry_delegate_t *fed,
265 u8 *s)
266{
267 u32 indent = format_get_indent (s);
268
269 s = format(s, "track: sibling:%d", fed->fd_track.fedt_sibling);
270
271 s = format(s, "\n%UChildren:", format_white_space, indent);
272 s = fib_node_children_format(fed->fd_track.fedt_node.fn_children, s);
273
274 return (s);
275}
276
277/**
Neale Ranns88fc83e2017-04-05 08:11:14 -0700278 * A delegate type to formatter map
279 */
280static fib_entry_delegate_format_t fed_formatters[] =
281{
282 [FIB_ENTRY_DELEGATE_CHAIN_UNICAST_IP4] = fib_entry_delegate_fmt_fwd_chain,
283 [FIB_ENTRY_DELEGATE_CHAIN_UNICAST_IP6] = fib_entry_delegate_fmt_fwd_chain,
284 [FIB_ENTRY_DELEGATE_CHAIN_MPLS_EOS] = fib_entry_delegate_fmt_fwd_chain,
285 [FIB_ENTRY_DELEGATE_CHAIN_MPLS_NON_EOS] = fib_entry_delegate_fmt_fwd_chain,
286 [FIB_ENTRY_DELEGATE_CHAIN_ETHERNET] = fib_entry_delegate_fmt_fwd_chain,
287 [FIB_ENTRY_DELEGATE_CHAIN_NSH] = fib_entry_delegate_fmt_fwd_chain,
288 [FIB_ENTRY_DELEGATE_COVERED] = fib_entry_delegate_fmt_covered,
289 [FIB_ENTRY_DELEGATE_ATTACHED_IMPORT] = fib_entry_delegate_fmt_import,
290 [FIB_ENTRY_DELEGATE_ATTACHED_EXPORT] = fib_entry_delegate_fmt_export,
291 [FIB_ENTRY_DELEGATE_BFD] = fib_entry_delegate_fmt_bfd,
Neale Ranns1f50bf82019-07-16 15:28:52 +0000292 [FIB_ENTRY_DELEGATE_TRACK] = fib_entry_delegate_fmt_track,
Neale Ranns88fc83e2017-04-05 08:11:14 -0700293};
294
295u8 *
Neale Ranns1f50bf82019-07-16 15:28:52 +0000296format_fib_entry_delegate (u8 * s, va_list * args)
Neale Ranns88fc83e2017-04-05 08:11:14 -0700297{
298 fib_entry_delegate_t *fed;
Neale Ranns1f50bf82019-07-16 15:28:52 +0000299 index_t fedi;
Neale Ranns88fc83e2017-04-05 08:11:14 -0700300
Neale Ranns1f50bf82019-07-16 15:28:52 +0000301 fedi = va_arg (*args, index_t);
302 fed = fib_entry_delegate_get(fedi);
Neale Ranns88fc83e2017-04-05 08:11:14 -0700303
304 return (fed_formatters[fed->fd_type](fed, s));
305}
Neale Ranns1f50bf82019-07-16 15:28:52 +0000306
307static clib_error_t *
308show_fib_entry_delegate_command (vlib_main_t * vm,
309 unformat_input_t * input,
310 vlib_cli_command_t * cmd)
311{
312 fib_node_index_t fedi;
313
314 if (unformat (input, "%d", &fedi))
315 {
316 /*
317 * show one in detail
318 */
319 if (!pool_is_free_index(fib_entry_delegate_pool, fedi))
320 {
321 vlib_cli_output (vm, "%d@%U",
322 fedi,
323 format_fib_entry_delegate, fedi);
324 }
325 else
326 {
327 vlib_cli_output (vm, "entry %d invalid", fedi);
328 }
329 }
330 else
331 {
332 /*
333 * show all
334 */
335 vlib_cli_output (vm, "FIB Entry Delegates:");
336 pool_foreach_index(fedi, fib_entry_delegate_pool,
337 ({
338 vlib_cli_output (vm, "%d@%U",
339 fedi,
340 format_fib_entry_delegate, fedi);
341 }));
342 }
343
344 return (NULL);
345}
346
347VLIB_CLI_COMMAND (show_fib_entry, static) = {
348 .path = "show fib entry-delegate",
349 .function = show_fib_entry_delegate_command,
350 .short_help = "show fib entry delegate",
351};