FD.io VPP  v21.06-3-gbb25fbf28
Vector Packet Processing
lookup.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 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  * ip/ip_lookup.c: ip4/6 adjacency and lookup table management
17  *
18  * Copyright (c) 2008 Eliot Dresselhaus
19  *
20  * Permission is hereby granted, free of charge, to any person obtaining
21  * a copy of this software and associated documentation files (the
22  * "Software"), to deal in the Software without restriction, including
23  * without limitation the rights to use, copy, modify, merge, publish,
24  * distribute, sublicense, and/or sell copies of the Software, and to
25  * permit persons to whom the Software is furnished to do so, subject to
26  * the following conditions:
27  *
28  * The above copyright notice and this permission notice shall be
29  * included in all copies or substantial portions of the Software.
30  *
31  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
32  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
33  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
34  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
35  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
36  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
37  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
38  */
39 
40 #include <vnet/ip/ip.h>
41 #include <vnet/adj/adj.h>
42 #include <vnet/fib/fib_table.h>
43 #include <vnet/fib/ip4_fib.h>
44 #include <vnet/fib/ip6_fib.h>
45 #include <vnet/mpls/mpls.h>
46 #include <vnet/mfib/mfib_table.h>
47 #include <vnet/dpo/drop_dpo.h>
48 #include <vnet/dpo/classify_dpo.h>
49 #include <vnet/dpo/punt_dpo.h>
50 #include <vnet/dpo/receive_dpo.h>
51 #include <vnet/dpo/ip_null_dpo.h>
52 
53 /**
54  * @file
55  * @brief IPv4 and IPv6 adjacency and lookup table management.
56  *
57  */
58 
59 static clib_error_t *
61 {
63  lookup_main.if_address_pool_index_by_sw_if_index,
64  sw_if_index, ~0);
66  lookup_main.if_address_pool_index_by_sw_if_index,
67  sw_if_index, ~0);
68 
69  return (NULL);
70 }
71 
73 
74 void
76 {
77  if (!lm->fib_result_n_bytes)
78  lm->fib_result_n_bytes = sizeof (uword);
79 
80  lm->is_ip6 = is_ip6;
82  sizeof (ip_interface_prefix_key_t));
83  if (is_ip6)
84  {
87  sizeof (ip6_address_fib_t));
88  }
89  else
90  {
93  sizeof (ip4_address_fib_t));
94  }
95 
96  {
97  int i;
98 
99  /* Setup all IP protocols to be punted and builtin-unknown. */
100  for (i = 0; i < 256; i++)
101  {
104  }
105 
107  lm->local_next_by_ip_protocol[is_ip6 ? IP_PROTOCOL_ICMP6 :
108  IP_PROTOCOL_ICMP] = IP_LOCAL_NEXT_ICMP;
109  lm->builtin_protocol_by_ip_protocol[IP_PROTOCOL_UDP] =
111  lm->builtin_protocol_by_ip_protocol[is_ip6 ? IP_PROTOCOL_ICMP6 :
112  IP_PROTOCOL_ICMP] =
114  }
115 }
116 
117 u8 *
118 format_ip_flow_hash_config (u8 * s, va_list * args)
119 {
120  flow_hash_config_t flow_hash_config = va_arg (*args, u32);
121 
122 #define _(n, b, v) \
123  if (flow_hash_config & v) \
124  s = format (s, "%s ", #n);
126 #undef _
127 
128  return s;
129 }
130 
131 u8 *
132 format_ip_adjacency_packet_data (u8 * s, va_list * args)
133 {
134  u8 *packet_data = va_arg (*args, u8 *);
135  u32 n_packet_data_bytes = va_arg (*args, u32);
136 
137  s = format (s, "%U", format_hex_bytes, packet_data, n_packet_data_bytes);
138 
139  return s;
140 }
141 
142 static uword
143 unformat_dpo (unformat_input_t * input, va_list * args)
144 {
145  dpo_id_t *dpo = va_arg (*args, dpo_id_t *);
146  fib_protocol_t fp = va_arg (*args, int);
148 
149  proto = fib_proto_to_dpo (fp);
150 
151  if (unformat (input, "drop"))
152  dpo_copy (dpo, drop_dpo_get (proto));
153  else if (unformat (input, "punt"))
154  dpo_copy (dpo, punt_dpo_get (proto));
155  else if (unformat (input, "local"))
156  receive_dpo_add_or_lock (proto, ~0, NULL, dpo);
157  else if (unformat (input, "null-send-unreach"))
159  else if (unformat (input, "null-send-prohibit"))
161  else if (unformat (input, "null"))
163  else if (unformat (input, "classify"))
164  {
166 
167  if (!unformat (input, "%d", &classify_table_index))
168  {
169  clib_warning ("classify adj must specify table index");
170  return 0;
171  }
172 
173  dpo_set (dpo, DPO_CLASSIFY, proto,
175  }
176  else
177  return 0;
178 
179  return 1;
180 }
181 
182 const ip46_address_t zero_addr = {
183  .as_u64 = {
184  0, 0},
185 };
186 
187 static clib_error_t *
189  unformat_input_t * main_input, vlib_cli_command_t * cmd)
190 {
191  unformat_input_t _line_input, *line_input = &_line_input;
192  u32 table_id, is_del, fib_index, payload_proto;
193  dpo_id_t dpo = DPO_INVALID, *dpos = NULL;
194  fib_route_path_t *rpaths = NULL, rpath;
195  fib_prefix_t *prefixs = NULL, pfx;
196  clib_error_t *error = NULL;
197  f64 count;
198  int i;
199 
200  is_del = 0;
201  table_id = 0;
202  count = 1;
203  clib_memset (&pfx, 0, sizeof (pfx));
204 
205  /* Get a line of input. */
206  if (!unformat_user (main_input, unformat_line_input, line_input))
207  return 0;
208 
209  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
210  {
211  clib_memset (&rpath, 0, sizeof (rpath));
212 
213  if (unformat (line_input, "table %d", &table_id))
214  ;
215  else if (unformat (line_input, "count %f", &count))
216  ;
217 
218  else if (unformat (line_input, "%U/%d",
219  unformat_ip4_address, &pfx.fp_addr.ip4, &pfx.fp_len))
220  {
221  payload_proto = pfx.fp_proto = FIB_PROTOCOL_IP4;
222  vec_add1 (prefixs, pfx);
223  }
224  else if (unformat (line_input, "%U/%d",
225  unformat_ip6_address, &pfx.fp_addr.ip6, &pfx.fp_len))
226  {
227  payload_proto = pfx.fp_proto = FIB_PROTOCOL_IP6;
228  vec_add1 (prefixs, pfx);
229  }
230  else if (unformat (line_input, "via %U",
231  unformat_fib_route_path, &rpath, &payload_proto))
232  {
233  vec_add1 (rpaths, rpath);
234  }
235  else if (vec_len (prefixs) > 0 &&
236  unformat (line_input, "via %U",
237  unformat_dpo, &dpo, prefixs[0].fp_proto))
238  {
239  vec_add1 (dpos, dpo);
240  }
241  else if (unformat (line_input, "del"))
242  is_del = 1;
243  else if (unformat (line_input, "add"))
244  is_del = 0;
245  else
246  {
247  error = unformat_parse_error (line_input);
248  goto done;
249  }
250  }
251 
252  if (vec_len (prefixs) == 0)
253  {
254  error =
255  clib_error_return (0, "expected ip4/ip6 destination address/length.");
256  goto done;
257  }
258 
259  if (!is_del && vec_len (rpaths) + vec_len (dpos) == 0)
260  {
261  error = clib_error_return (0, "expected paths.");
262  goto done;
263  }
264 
265  if (~0 == table_id)
266  {
267  /*
268  * if no table_id is passed we will manipulate the default
269  */
270  fib_index = 0;
271  }
272  else
273  {
274  fib_index = fib_table_find (prefixs[0].fp_proto, table_id);
275 
276  if (~0 == fib_index)
277  {
278  error = clib_error_return (0, "Nonexistent table id %d", table_id);
279  goto done;
280  }
281  }
282 
283  for (i = 0; i < vec_len (prefixs); i++)
284  {
285  if (is_del && 0 == vec_len (rpaths))
286  {
287  fib_table_entry_delete (fib_index, &prefixs[i], FIB_SOURCE_CLI);
288  }
289  else if (!is_del && 1 == vec_len (dpos))
290  {
292  &prefixs[i],
295  &dpos[0]);
296  dpo_reset (&dpos[0]);
297  }
298  else if (vec_len (dpos) > 0)
299  {
300  error =
302  "Load-balancing over multiple special adjacencies is unsupported");
303  goto done;
304  }
305  else if (0 < vec_len (rpaths))
306  {
307  u32 k, n, incr;
308  ip46_address_t dst = prefixs[i].fp_addr;
309  f64 t[2];
310  n = count;
311  t[0] = vlib_time_now (vm);
312  incr = 1 << ((FIB_PROTOCOL_IP4 == prefixs[0].fp_proto ? 32 : 128) -
313  prefixs[i].fp_len);
314 
315  for (k = 0; k < n; k++)
316  {
317  fib_prefix_t rpfx = {
318  .fp_len = prefixs[i].fp_len,
319  .fp_proto = prefixs[i].fp_proto,
320  .fp_addr = dst,
321  };
322 
323  if (is_del)
324  fib_table_entry_path_remove2 (fib_index,
325  &rpfx, FIB_SOURCE_CLI, rpaths);
326  else
327  fib_table_entry_path_add2 (fib_index,
328  &rpfx,
330  FIB_ENTRY_FLAG_NONE, rpaths);
331 
332  if (FIB_PROTOCOL_IP4 == prefixs[0].fp_proto)
333  {
334  dst.ip4.as_u32 =
335  clib_host_to_net_u32 (incr +
336  clib_net_to_host_u32 (dst.
337  ip4.as_u32));
338  }
339  else
340  {
341  int bucket = (incr < 64 ? 0 : 1);
342  dst.ip6.as_u64[bucket] =
343  clib_host_to_net_u64 (incr +
344  clib_net_to_host_u64 (dst.ip6.as_u64
345  [bucket]));
346  }
347  }
348 
349  t[1] = vlib_time_now (vm);
350  if (count > 1)
351  vlib_cli_output (vm, "%.6e routes/sec", count / (t[1] - t[0]));
352  }
353  else
354  {
355  error = clib_error_return (0, "Don't understand what you want...");
356  goto done;
357  }
358  }
359 
360 done:
361  vec_free (dpos);
362  vec_free (prefixs);
363  vec_free (rpaths);
364  unformat_free (line_input);
365  return error;
366 }
367 
368 clib_error_t *
370  unformat_input_t * main_input,
371  vlib_cli_command_t * cmd, fib_protocol_t fproto)
372 {
373  unformat_input_t _line_input, *line_input = &_line_input;
374  clib_error_t *error = NULL;
375  u32 table_id, is_add;
376  u8 *name = NULL;
377 
378  is_add = 1;
379  table_id = ~0;
380 
381  /* Get a line of input. */
382  if (!unformat_user (main_input, unformat_line_input, line_input))
383  return 0;
384 
385  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
386  {
387  if (unformat (line_input, "%d", &table_id))
388  ;
389  else if (unformat (line_input, "del"))
390  is_add = 0;
391  else if (unformat (line_input, "add"))
392  is_add = 1;
393  else if (unformat (line_input, "name %s", &name))
394  ;
395  else
396  {
397  error = unformat_parse_error (line_input);
398  goto done;
399  }
400  }
401 
402  if (~0 == table_id)
403  {
404  error = clib_error_return (0, "No table id");
405  goto done;
406  }
407  else if (0 == table_id)
408  {
409  error = clib_error_return (0, "Can't change the default table");
410  goto done;
411  }
412  else
413  {
414  if (is_add)
415  {
416  ip_table_create (fproto, table_id, 0, name);
417  }
418  else
419  {
420  ip_table_delete (fproto, table_id, 0);
421  }
422  }
423 
424 done:
425  unformat_free (line_input);
426  return error;
427 }
428 
429 clib_error_t *
431  unformat_input_t * main_input, vlib_cli_command_t * cmd)
432 {
433  return (vnet_ip_table_cmd (vm, main_input, cmd, FIB_PROTOCOL_IP4));
434 }
435 
436 clib_error_t *
438  unformat_input_t * main_input, vlib_cli_command_t * cmd)
439 {
440  return (vnet_ip_table_cmd (vm, main_input, cmd, FIB_PROTOCOL_IP6));
441 }
442 
443 /* *INDENT-OFF* */
445  .path = "ip",
446  .short_help = "Internet protocol (IP) commands",
447 };
448 /* *INDENT-ON* */
449 
450 /* *INDENT-OFF* */
452  .path = "ip6",
453  .short_help = "Internet protocol version 6 (IPv6) commands",
454 };
455 /* *INDENT-ON* */
456 
457 /* *INDENT-OFF* */
459  .path = "show ip",
460  .short_help = "Internet protocol (IP) show commands",
461 };
462 /* *INDENT-ON* */
463 
464 /* *INDENT-OFF* */
466  .path = "show ip6",
467  .short_help = "Internet protocol version 6 (IPv6) show commands",
468 };
469 /* *INDENT-ON* */
470 
471 /*?
472  * This command is used to add or delete IPv4 or IPv6 routes. All
473  * IP Addresses ('<em><dst-ip-addr>/<width></em>',
474  * '<em><next-hop-ip-addr></em>' and '<em><adj-hop-ip-addr></em>')
475  * can be IPv4 or IPv6, but all must be of the same form in a single
476  * command. To display the current set of routes, use the commands
477  * '<em>show ip fib</em>' and '<em>show ip6 fib</em>'.
478  *
479  * @cliexpar
480  * Example of how to add a straight forward static route:
481  * @cliexcmd{ip route add 6.0.1.2/32 via 6.0.0.1 GigabitEthernet2/0/0}
482  * Example of how to delete a straight forward static route:
483  * @cliexcmd{ip route del 6.0.1.2/32 via 6.0.0.1 GigabitEthernet2/0/0}
484  * Mainly for route add/del performance testing, one can add or delete
485  * multiple routes by adding 'count N' to the previous item:
486  * @cliexcmd{ip route add count 10 7.0.0.0/24 via 6.0.0.1 GigabitEthernet2/0/0}
487  * Add multiple routes for the same destination to create equal-cost multipath:
488  * @cliexcmd{ip route add 7.0.0.1/32 via 6.0.0.1 GigabitEthernet2/0/0}
489  * @cliexcmd{ip route add 7.0.0.1/32 via 6.0.0.2 GigabitEthernet2/0/0}
490  * For unequal-cost multipath, specify the desired weights. This
491  * combination of weights results in 3/4 of the traffic following the
492  * second path, 1/4 following the first path:
493  * @cliexcmd{ip route add 7.0.0.1/32 via 6.0.0.1 GigabitEthernet2/0/0 weight 1}
494  * @cliexcmd{ip route add 7.0.0.1/32 via 6.0.0.2 GigabitEthernet2/0/0 weight 3}
495  * To add a route to a particular FIB table (VRF), use:
496  * @cliexcmd{ip route add 172.16.24.0/24 table 7 via GigabitEthernet2/0/0}
497  ?*/
498 /* *INDENT-OFF* */
500  .path = "ip route",
501  .short_help = "ip route [add|del] [count <n>] <dst-ip-addr>/<width> [table <table-id>] via [next-hop-address] [next-hop-interface] [next-hop-table <value>] [weight <value>] [preference <value>] [udp-encap-id <value>] [ip4-lookup-in-table <value>] [ip6-lookup-in-table <value>] [mpls-lookup-in-table <value>] [resolve-via-host] [resolve-via-connected] [rx-ip4 <interface>] [out-labels <value value value>]",
502  .function = vnet_ip_route_cmd,
503  .is_mp_safe = 1,
504 };
505 
506 /* *INDENT-ON* */
507 /*?
508  * This command is used to add or delete IPv4 Tables. All
509  * Tables must be explicitly added before that can be used. Creating a
510  * table will add both unicast and multicast FIBs
511  *
512  ?*/
513 /* *INDENT-OFF* */
515  .path = "ip table",
516  .short_help = "ip table [add|del] <table-id>",
517  .function = vnet_ip4_table_cmd,
518 };
519 /* *INDENT-ON* */
520 
521 /* *INDENT-ON* */
522 /*?
523  * This command is used to add or delete IPv4 Tables. All
524  * Tables must be explicitly added before that can be used. Creating a
525  * table will add both unicast and multicast FIBs
526  *
527  ?*/
528 /* *INDENT-OFF* */
530  .path = "ip6 table",
531  .short_help = "ip6 table [add|del] <table-id>",
532  .function = vnet_ip6_table_cmd,
533 };
534 
535 static clib_error_t *
537  unformat_input_t * input,
538  vlib_cli_command_t * cmd,
539  fib_protocol_t fproto)
540 {
541  vnet_main_t *vnm = vnet_get_main ();
542  clib_error_t *error = 0;
544  int rv;
545 
546  sw_if_index = ~0;
547 
549  {
550  error = clib_error_return (0, "unknown interface `%U'",
551  format_unformat_error, input);
552  goto done;
553  }
554 
555  if (unformat (input, "%d", &table_id))
556  ;
557  else
558  {
559  error = clib_error_return (0, "expected table id `%U'",
560  format_unformat_error, input);
561  goto done;
562  }
563 
564  rv = ip_table_bind (fproto, sw_if_index, table_id, 0);
565 
566  if (VNET_API_ERROR_ADDRESS_FOUND_FOR_INTERFACE == rv)
567  {
568  error = clib_error_return (0, "IP addresses are still present on %U",
570  vnet_get_main(),
571  sw_if_index);
572  }
573  else if (VNET_API_ERROR_NO_SUCH_FIB == rv)
574  {
575  error = clib_error_return (0, "no such table %d", table_id);
576  }
577  else if (0 != rv)
578  {
579  error = clib_error_return (0, "unknown error");
580  }
581 
582  done:
583  return error;
584 }
585 
586 static clib_error_t *
588  unformat_input_t * input,
589  vlib_cli_command_t * cmd)
590 {
591  return (ip_table_bind_cmd (vm , input, cmd, FIB_PROTOCOL_IP4));
592 }
593 
594 static clib_error_t *
596  unformat_input_t * input,
597  vlib_cli_command_t * cmd)
598 {
599  return (ip_table_bind_cmd (vm , input, cmd, FIB_PROTOCOL_IP6));
600 }
601 
602 /*?
603  * Place the indicated interface into the supplied IPv4 FIB table (also known
604  * as a VRF). The FIB table must be created using "ip table add" already. To
605  * display the current IPv4 FIB table, use the command '<em>show ip fib</em>'.
606  * FIB table will only be displayed if a route has been added to the table, or
607  * an IP Address is assigned to an interface in the table (which adds a route
608  * automatically).
609  *
610  * @note IP addresses added after setting the interface IP table are added to
611  * the indicated FIB table. If an IP address is added prior to changing the
612  * table then this is an error. The control plane must remove these addresses
613  * first and then change the table. VPP will not automatically move the
614  * addresses from the old to the new table as it does not know the validity
615  * of such a change.
616  *
617  * @cliexpar
618  * Example of how to add an interface to an IPv4 FIB table (where 2 is the table-id):
619  * @cliexcmd{set interface ip table GigabitEthernet2/0/0 2}
620  ?*/
621 /* *INDENT-OFF* */
623 {
624  .path = "set interface ip table",
625  .function = ip4_table_bind_cmd,
626  .short_help = "set interface ip table <interface> <table-id>",
627 };
628 /* *INDENT-ON* */
629 
630 /*?
631  * Place the indicated interface into the supplied IPv6 FIB table (also known
632  * as a VRF). The FIB table must be created using "ip6 table add" already. To
633  * display the current IPv6 FIB table, use the command '<em>show ip6 fib</em>'.
634  * FIB table will only be displayed if a route has been added to the table, or
635  * an IP Address is assigned to an interface in the table (which adds a route
636  * automatically).
637  *
638  * @note IP addresses added after setting the interface IP table are added to
639  * the indicated FIB table. If an IP address is added prior to changing the
640  * table then this is an error. The control plane must remove these addresses
641  * first and then change the table. VPP will not automatically move the
642  * addresses from the old to the new table as it does not know the validity
643  * of such a change.
644  *
645  * @cliexpar
646  * Example of how to add an interface to an IPv6 FIB table (where 2 is the table-id):
647  * @cliexcmd{set interface ip6 table GigabitEthernet2/0/0 2}
648  ?*/
649 /* *INDENT-OFF* */
651 {
652  .path = "set interface ip6 table",
653  .function = ip6_table_bind_cmd,
654  .short_help = "set interface ip6 table <interface> <table-id>"
655 };
656 /* *INDENT-ON* */
657 
658 clib_error_t *
660  unformat_input_t * main_input, vlib_cli_command_t * cmd)
661 {
662  unformat_input_t _line_input, *line_input = &_line_input;
663  fib_route_path_t rpath, *rpaths = NULL;
664  clib_error_t *error = NULL;
665  u32 table_id, is_del, payload_proto;
666  mfib_prefix_t pfx;
667  u32 fib_index;
668  mfib_entry_flags_t eflags = 0;
669  u32 gcount, scount, ss, gg, incr;
670  f64 timet[2];
672 
673  gcount = scount = 1;
674  is_del = 0;
675  table_id = 0;
676  clib_memset (&pfx, 0, sizeof (pfx));
677  clib_memset (&rpath, 0, sizeof (rpath));
678  rpath.frp_sw_if_index = ~0;
679 
680  /* Get a line of input. */
681  if (!unformat_user (main_input, unformat_line_input, line_input))
682  return 0;
683 
684  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
685  {
686  if (unformat (line_input, "table %d", &table_id))
687  ;
688  else if (unformat (line_input, "del"))
689  is_del = 1;
690  else if (unformat (line_input, "add"))
691  is_del = 0;
692  else if (unformat (line_input, "rpf-id %d", &rpf_id))
693  ;
694  else if (unformat (line_input, "scount %d", &scount))
695  ;
696  else if (unformat (line_input, "gcount %d", &gcount))
697  ;
698  else if (unformat (line_input, "%U %U",
700  &pfx.fp_src_addr.ip4,
702  {
703  payload_proto = pfx.fp_proto = FIB_PROTOCOL_IP4;
704  pfx.fp_len = 64;
705  }
706  else if (unformat (line_input, "%U %U",
708  &pfx.fp_src_addr.ip6,
710  {
711  payload_proto = pfx.fp_proto = FIB_PROTOCOL_IP6;
712  pfx.fp_len = 256;
713  }
714  else if (unformat (line_input, "%U/%d",
716  &pfx.fp_grp_addr.ip4, &pfx.fp_len))
717  {
718  clib_memset (&pfx.fp_src_addr.ip4, 0, sizeof (pfx.fp_src_addr.ip4));
719  payload_proto = pfx.fp_proto = FIB_PROTOCOL_IP4;
720  }
721  else if (unformat (line_input, "%U/%d",
723  &pfx.fp_grp_addr.ip6, &pfx.fp_len))
724  {
725  clib_memset (&pfx.fp_src_addr.ip6, 0, sizeof (pfx.fp_src_addr.ip6));
726  payload_proto = pfx.fp_proto = FIB_PROTOCOL_IP6;
727  }
728  else if (unformat (line_input, "%U",
730  {
731  clib_memset (&pfx.fp_src_addr.ip4, 0, sizeof (pfx.fp_src_addr.ip4));
732  payload_proto = pfx.fp_proto = FIB_PROTOCOL_IP4;
733  pfx.fp_len = 32;
734  }
735  else if (unformat (line_input, "%U",
737  {
738  clib_memset (&pfx.fp_src_addr.ip6, 0, sizeof (pfx.fp_src_addr.ip6));
739  payload_proto = pfx.fp_proto = FIB_PROTOCOL_IP6;
740  pfx.fp_len = 128;
741  }
742  else if (unformat (line_input, "via local Forward"))
743  {
744  clib_memset (&rpath.frp_addr, 0, sizeof (rpath.frp_addr));
745  rpath.frp_sw_if_index = ~0;
746  rpath.frp_weight = 1;
748  /*
749  * set the path proto appropriately for the prefix
750  */
751  rpath.frp_proto = fib_proto_to_dpo (pfx.fp_proto);
753 
754  vec_add1 (rpaths, rpath);
755  }
756  else if (unformat (line_input, "via %U",
757  unformat_fib_route_path, &rpath, &payload_proto))
758  {
759  vec_add1 (rpaths, rpath);
760  }
761  else if (unformat (line_input, "%U",
762  unformat_mfib_entry_flags, &eflags))
763  ;
764  else
765  {
766  error = unformat_parse_error (line_input);
767  goto done;
768  }
769  }
770 
771  if (~0 == table_id)
772  {
773  /*
774  * if no table_id is passed we will manipulate the default
775  */
776  fib_index = 0;
777  }
778  else
779  {
780  fib_index = mfib_table_find (pfx.fp_proto, table_id);
781 
782  if (~0 == fib_index)
783  {
784  error = clib_error_return (0, "Nonexistent table id %d", table_id);
785  goto done;
786  }
787  }
788 
789  timet[0] = vlib_time_now (vm);
790 
791  if (FIB_PROTOCOL_IP4 == pfx.fp_proto)
792  {
793  incr = 1 << (32 - (pfx.fp_len % 32));
794  }
795  else
796  {
797  incr = 1 << (128 - (pfx.fp_len % 128));
798  }
799 
800  for (ss = 0; ss < scount; ss++)
801  {
802  for (gg = 0; gg < gcount; gg++)
803  {
804  if (is_del && 0 == vec_len (rpaths))
805  {
806  /* no path provided => route delete */
807  mfib_table_entry_delete (fib_index, &pfx, MFIB_SOURCE_CLI);
808  }
809  else if (eflags || (MFIB_RPF_ID_NONE != rpf_id))
810  {
811  mfib_table_entry_update (fib_index, &pfx, MFIB_SOURCE_CLI,
812  rpf_id, eflags);
813  }
814  else
815  {
816  if (is_del)
817  mfib_table_entry_path_remove (fib_index,
818  &pfx, MFIB_SOURCE_CLI, rpaths);
819  else
820  mfib_table_entry_path_update (fib_index,
821  &pfx, MFIB_SOURCE_CLI, rpaths);
822  }
823 
824  if (FIB_PROTOCOL_IP4 == pfx.fp_proto)
825  {
826  pfx.fp_grp_addr.ip4.as_u32 =
827  clib_host_to_net_u32 (incr +
828  clib_net_to_host_u32 (pfx.
829  fp_grp_addr.ip4.
830  as_u32));
831  }
832  else
833  {
834  int bucket = (incr < 64 ? 0 : 1);
835  pfx.fp_grp_addr.ip6.as_u64[bucket] =
836  clib_host_to_net_u64 (incr +
837  clib_net_to_host_u64 (pfx.
838  fp_grp_addr.ip6.as_u64
839  [bucket]));
840 
841  }
842  }
843  if (FIB_PROTOCOL_IP4 == pfx.fp_proto)
844  {
845  pfx.fp_src_addr.ip4.as_u32 =
846  clib_host_to_net_u32 (1 +
847  clib_net_to_host_u32 (pfx.fp_src_addr.
848  ip4.as_u32));
849  }
850  else
851  {
852  pfx.fp_src_addr.ip6.as_u64[1] =
853  clib_host_to_net_u64 (1 +
854  clib_net_to_host_u64 (pfx.fp_src_addr.
855  ip6.as_u64[1]));
856  }
857  }
858 
859  timet[1] = vlib_time_now (vm);
860 
861  if (scount > 1 || gcount > 1)
862  vlib_cli_output (vm, "%.6e routes/sec",
863  (scount * gcount) / (timet[1] - timet[0]));
864 
865 done:
866  vec_free (rpaths);
867  unformat_free (line_input);
868 
869  return error;
870 }
871 
872 /*?
873  * This command is used to add or delete IPv4 or IPv6 multicast routes. All
874  * IP Addresses ('<em><dst-ip-addr>/<width></em>',
875  * '<em><next-hop-ip-addr></em>' and '<em><adj-hop-ip-addr></em>')
876  * can be IPv4 or IPv6, but all must be of the same form in a single
877  * command. To display the current set of routes, use the commands
878  * '<em>show ip mfib</em>' and '<em>show ip6 mfib</em>'.
879  * The full set of support flags for interfaces and route is shown via;
880  * '<em>show mfib route flags</em>' and '<em>show mfib itf flags</em>'
881  * respectively.
882  * @cliexpar
883  * Example of how to add a forwarding interface to a route (and create the
884  * route if it does not exist)
885  * @cliexcmd{ip mroute add 232.1.1.1 via GigabitEthernet2/0/0 Forward}
886  * Example of how to add an accepting interface to a route (and create the
887  * route if it does not exist)
888  * @cliexcmd{ip mroute add 232.1.1.1 via GigabitEthernet2/0/1 Accept}
889  * Example of changing the route's flags to send signals via the API
890  * @cliexcmd{ip mroute add 232.1.1.1 Signal}
891 
892  ?*/
893 /* *INDENT-OFF* */
895 {
896  .path = "ip mroute",
897  .short_help = "ip mroute [add|del] <dst-ip-addr>/<width> [table <table-id>] [rpf-id <ID>] [via <next-hop-ip-addr> [<interface>],",
898  .function = vnet_ip_mroute_cmd,
899  .is_mp_safe = 1,
900 };
901 /* *INDENT-ON* */
902 
903 /*
904  * fd.io coding-style-patch-verification: ON
905  *
906  * Local Variables:
907  * eval: (c-set-style "gnu")
908  * End:
909  */
ip_sw_interface_add_del
static clib_error_t * ip_sw_interface_add_del(vnet_main_t *vnm, u32 sw_if_index, u32 is_add)
Definition: lookup.c:60
adj.h
ip_lookup_main_t::prefix_to_if_prefix_index
mhash_t prefix_to_if_prefix_index
Hash table mapping prefix to index in interface prefix pool.
Definition: lookup.h:137
ip_lookup_main_t::is_ip6
u32 is_ip6
1 for ip6; 0 for ip4.
Definition: lookup.h:152
DPO_INVALID
#define DPO_INVALID
An initialiser for DPOs declared on the stack.
Definition: dpo.h:204
fib_route_path_t_::frp_mitf_flags
u32 frp_mitf_flags
MFIB interface flags.
Definition: fib_types.h:568
unformat_user
uword unformat_user(unformat_input_t *input, unformat_function_t *func,...)
Definition: unformat.c:989
fib_table_entry_special_dpo_add
fib_node_index_t fib_table_entry_special_dpo_add(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source, fib_entry_flag_t flags, const dpo_id_t *dpo)
Add a 'special' entry to the FIB that links to the DPO passed A special entry is an entry that the FI...
Definition: fib_table.c:324
vnet_ip6_table_cmd
clib_error_t * vnet_ip6_table_cmd(vlib_main_t *vm, unformat_input_t *main_input, vlib_cli_command_t *cmd)
Definition: lookup.c:437
IP_NULL_ACTION_SEND_ICMP_PROHIBIT
@ IP_NULL_ACTION_SEND_ICMP_PROHIBIT
Definition: ip_null_dpo.h:39
ip_table_delete
void ip_table_delete(fib_protocol_t fproto, u32 table_id, u8 is_api)
Definition: ip_api.c:574
zero_addr
const ip46_address_t zero_addr
#include <vnet/feature/feature.h>
Definition: lookup.c:182
ip4
vl_api_ip4_address_t ip4
Definition: one.api:376
fib_table_entry_delete
void fib_table_entry_delete(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source)
Delete a FIB entry.
Definition: fib_table.c:895
fib_route_path_t_::frp_weight
u8 frp_weight
[un]equal cost path weight
Definition: fib_types.h:599
ip4_main
ip4_main_t ip4_main
Global ip4 main structure.
Definition: ip4_forward.c:1105
dpo_proto_t
enum dpo_proto_t_ dpo_proto_t
Data path protocol.
unformat_line_input
unformat_function_t unformat_line_input
Definition: format.h:275
name
string name[64]
Definition: fib.api:25
set_interface_ip6_table_command
static vlib_cli_command_t set_interface_ip6_table_command
(constructor) VLIB_CLI_COMMAND (set_interface_ip6_table_command)
Definition: lookup.c:650
mfib_prefix_t_
Aggregate type for a prefix.
Definition: mfib_types.h:24
ip_lookup_main_t::fib_result_n_bytes
u32 fib_result_n_bytes
Number of bytes in a fib result.
Definition: lookup.h:149
MFIB_SOURCE_CLI
@ MFIB_SOURCE_CLI
Definition: mfib_types.h:166
format_hex_bytes
u8 * format_hex_bytes(u8 *s, va_list *va)
Definition: std-formats.c:84
format_ip_flow_hash_config
u8 * format_ip_flow_hash_config(u8 *s, va_list *args)
Definition: lookup.c:118
clib_error_return
#define clib_error_return(e, args...)
Definition: error.h:99
ip4_address_fib_t
Definition: ip4_packet.h:60
vlib_cli_command_t::path
char * path
Definition: cli.h:96
IP_BUILTIN_PROTOCOL_UNKNOWN
@ IP_BUILTIN_PROTOCOL_UNKNOWN
Definition: ip_packet.h:67
mfib_prefix_t_::fp_len
u16 fp_len
The mask length.
Definition: mfib_types.h:28
fib_table.h
fib_route_path_t_::frp_addr
ip46_address_t frp_addr
The next-hop address.
Definition: fib_types.h:516
fib_prefix_t_::fp_len
u16 fp_len
The mask length.
Definition: fib_types.h:206
unformat_parse_error
#define unformat_parse_error(input)
Definition: format.h:261
vm
vlib_main_t * vm
X-connect all packets from the HOST to the PHY.
Definition: nat44_ei.c:3047
fib_route_path_t_::frp_sw_if_index
u32 frp_sw_if_index
The interface.
Definition: fib_types.h:545
mfib_entry_flags_t
enum mfib_entry_flags_t_ mfib_entry_flags_t
mpls.h
FIB_ENTRY_FLAG_EXCLUSIVE
@ FIB_ENTRY_FLAG_EXCLUSIVE
Definition: fib_entry.h:116
unformat_input_t
struct _unformat_input_t unformat_input_t
classify_dpo_create
index_t classify_dpo_create(dpo_proto_t proto, u32 classify_table_index)
Definition: classify_dpo.c:48
fib_route_path_t_::frp_proto
dpo_proto_t frp_proto
The protocol of the address below.
Definition: fib_types.h:505
mhash_init
__clib_export void mhash_init(mhash_t *h, uword n_value_bytes, uword n_key_bytes)
Definition: mhash.c:168
drop_dpo.h
error
Definition: cJSON.c:88
unformat
uword unformat(unformat_input_t *i, const char *fmt,...)
Definition: unformat.c:978
mfib_prefix_t_::fp_src_addr
ip46_address_t fp_src_addr
Definition: mfib_types.h:47
count
u8 count
Definition: dhcp.api:208
IP_LOCAL_NEXT_ICMP
@ IP_LOCAL_NEXT_ICMP
Definition: lookup.h:114
ip6_table_bind_cmd
static clib_error_t * ip6_table_bind_cmd(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: lookup.c:595
vec_len
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
Definition: vec_bootstrap.h:142
vnet_ip_mroute_cmd
clib_error_t * vnet_ip_mroute_cmd(vlib_main_t *vm, unformat_input_t *main_input, vlib_cli_command_t *cmd)
Definition: lookup.c:659
unformat_free
static void unformat_free(unformat_input_t *i)
Definition: format.h:155
receive_dpo.h
format_ip6_address_and_length
format_function_t format_ip6_address_and_length
Definition: format.h:92
vec_add1
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
Definition: vec.h:606
ip_lookup_init
void ip_lookup_init(ip_lookup_main_t *lm, u32 is_ip6)
Definition: lookup.c:75
ip_lookup_main_t::address_to_if_address_index
mhash_t address_to_if_address_index
Hash table mapping address to index in interface address pool.
Definition: lookup.h:127
vnet_get_main
vnet_main_t * vnet_get_main(void)
Definition: pnat_test_stubs.h:56
foreach_flow_hash_bit
@ foreach_flow_hash_bit
Definition: ip_flow_hash.h:49
ip6_table_command
static vlib_cli_command_t ip6_table_command
(constructor) VLIB_CLI_COMMAND (ip6_table_command)
Definition: lookup.c:529
unformat_check_input
static uword unformat_check_input(unformat_input_t *i)
Definition: format.h:163
flow_hash_config_t
enum flow_hash_config_t_ flow_hash_config_t
A flow hash configuration is a mask of the flow hash options.
FIB_ENTRY_FLAG_NONE
@ FIB_ENTRY_FLAG_NONE
Definition: fib_entry.h:112
uword
u64 uword
Definition: types.h:112
unformat_mfib_entry_flags
uword unformat_mfib_entry_flags(unformat_input_t *input, va_list *args)
Definition: mfib_types.c:218
vnet_ip_table_cmd
clib_error_t * vnet_ip_table_cmd(vlib_main_t *vm, unformat_input_t *main_input, vlib_cli_command_t *cmd, fib_protocol_t fproto)
Definition: lookup.c:369
ip_null_dpo.h
i
sll srl srl sll sra u16x4 i
Definition: vector_sse42.h:261
f64
double f64
Definition: types.h:142
IP_BUILTIN_PROTOCOL_UDP
@ IP_BUILTIN_PROTOCOL_UDP
Definition: ip_packet.h:65
format_unformat_error
u8 * format_unformat_error(u8 *s, va_list *va)
Definition: unformat.c:91
unformat_dpo
static uword unformat_dpo(unformat_input_t *input, va_list *args)
Definition: lookup.c:143
VLIB_CLI_COMMAND
#define VLIB_CLI_COMMAND(x,...)
Definition: cli.h:163
fib_protocol_t
enum fib_protocol_t_ fib_protocol_t
Protocol Type.
FIB_PROTOCOL_IP4
@ FIB_PROTOCOL_IP4
Definition: fib_types.h:36
ip_interface_prefix_key_t
Definition: lookup.h:70
mfib_table.h
ip4_table_command
static vlib_cli_command_t ip4_table_command
(constructor) VLIB_CLI_COMMAND (ip4_table_command)
Definition: lookup.c:514
mfib_prefix_t_::fp_proto
fib_protocol_t fp_proto
protocol type
Definition: mfib_types.h:33
vlib_cli_output
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
Definition: cli.c:716
fib_proto_to_dpo
dpo_proto_t fib_proto_to_dpo(fib_protocol_t fib_proto)
Definition: fib_types.c:343
fib_prefix_t_::fp_addr
ip46_address_t fp_addr
The address type is not deriveable from the fp_addr member.
Definition: fib_types.h:225
ip_table_create
void ip_table_create(fib_protocol_t fproto, u32 table_id, u8 is_api, const u8 *name)
Definition: ip_api.c:884
ip_table_bind_cmd
static clib_error_t * ip_table_bind_cmd(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd, fib_protocol_t fproto)
Definition: lookup.c:536
ip6_main
ip6_main_t ip6_main
Definition: ip6_forward.c:2787
set_interface_ip_table_command
static vlib_cli_command_t set_interface_ip_table_command
(constructor) VLIB_CLI_COMMAND (set_interface_ip_table_command)
Definition: lookup.c:622
is_ip6
bool is_ip6
Definition: ip.api:43
ip_route_command
static vlib_cli_command_t ip_route_command
(constructor) VLIB_CLI_COMMAND (ip_route_command)
Definition: lookup.c:499
IP_NULL_ACTION_SEND_ICMP_UNREACH
@ IP_NULL_ACTION_SEND_ICMP_UNREACH
Definition: ip_null_dpo.h:38
vnet_main_t
Definition: vnet.h:76
vec_free
#define vec_free(V)
Free vector's memory (no header).
Definition: vec.h:395
dpo_copy
void dpo_copy(dpo_id_t *dst, const dpo_id_t *src)
atomic copy a data-plane object.
Definition: dpo.c:264
fib_route_path_t_::frp_flags
fib_route_path_flags_t frp_flags
flags on the path
Definition: fib_types.h:609
fib_table_entry_path_add2
fib_node_index_t fib_table_entry_path_add2(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source, fib_entry_flag_t flags, fib_route_path_t *rpaths)
Add n paths to an entry (aka route) in the FIB.
Definition: fib_table.c:600
mfib_table_find
u32 mfib_table_find(fib_protocol_t proto, u32 table_id)
Get the index of the FIB for a Table-ID.
Definition: mfib_table.c:555
format_vnet_sw_if_index_name
format_function_t format_vnet_sw_if_index_name
Definition: interface_funcs.h:455
mfib_prefix_t_::fp_grp_addr
ip46_address_t fp_grp_addr
The address type is not deriveable from the fp_addr member.
Definition: mfib_types.h:46
unformat_vnet_sw_interface
unformat_function_t unformat_vnet_sw_interface
Definition: interface_funcs.h:459
format
description fragment has unexpected format
Definition: map.api:433
ip_table_bind
int ip_table_bind(fib_protocol_t fproto, u32 sw_if_index, u32 table_id, u8 is_api)
Definition: interface_api.c:482
vec_validate_init_empty
#define vec_validate_init_empty(V, I, INIT)
Make sure vector is long enough for given index and initialize empty space (no header,...
Definition: vec.h:570
IP_NULL_ACTION_NONE
@ IP_NULL_ACTION_NONE
Definition: ip_null_dpo.h:37
ip.h
VNET_SW_INTERFACE_ADD_DEL_FUNCTION
VNET_SW_INTERFACE_ADD_DEL_FUNCTION(ip_sw_interface_add_del)
u32
unsigned int u32
Definition: types.h:88
MFIB_RPF_ID_NONE
#define MFIB_RPF_ID_NONE
Definition: fib_types.h:423
ip6
vl_api_ip6_address_t ip6
Definition: one.api:424
table_id
u32 table_id
Definition: wireguard.api:102
IP_BUILTIN_PROTOCOL_ICMP
@ IP_BUILTIN_PROTOCOL_ICMP
Definition: ip_packet.h:66
FIB_PROTOCOL_IP6
@ FIB_PROTOCOL_IP6
Definition: fib_types.h:37
dst
vl_api_ip4_address_t dst
Definition: pnat.api:41
fib_table_entry_path_remove2
void fib_table_entry_path_remove2(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source, fib_route_path_t *rpaths)
Remove n paths to an entry (aka route) in the FIB.
Definition: fib_table.c:649
fib_route_path_t_
A representation of a path as described by a route producer.
Definition: fib_types.h:500
punt_dpo_get
const dpo_id_t * punt_dpo_get(dpo_proto_t proto)
Definition: punt_dpo.c:25
ip4_table_bind_cmd
static clib_error_t * ip4_table_bind_cmd(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: lookup.c:587
punt_dpo.h
FIB_SOURCE_CLI
@ FIB_SOURCE_CLI
From the CLI.
Definition: fib_source.h:79
vlib_cli_show_ip6_command
static vlib_cli_command_t vlib_cli_show_ip6_command
(constructor) VLIB_CLI_COMMAND (vlib_cli_show_ip6_command)
Definition: lookup.c:465
IP_LOCAL_NEXT_UDP_LOOKUP
@ IP_LOCAL_NEXT_UDP_LOOKUP
Definition: lookup.h:113
fib_prefix_t_::fp_proto
fib_protocol_t fp_proto
protocol type
Definition: fib_types.h:211
ip4_fib.h
ip6_fib.h
ip_lookup_main_t
Definition: lookup.h:121
mfib_table_entry_path_remove
void mfib_table_entry_path_remove(u32 fib_index, const mfib_prefix_t *prefix, mfib_source_t source, const fib_route_path_t *rpath)
Remove n paths to an entry (aka route) in the FIB.
Definition: mfib_table.c:407
clib_memset
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
vlib_main_t
Definition: main.h:102
drop_dpo_get
const dpo_id_t * drop_dpo_get(dpo_proto_t proto)
Definition: drop_dpo.c:25
receive_dpo_add_or_lock
void receive_dpo_add_or_lock(dpo_proto_t proto, u32 sw_if_index, const ip46_address_t *nh_addr, dpo_id_t *dpo)
Definition: receive_dpo.c:67
ip_lookup_main_t::local_next_by_ip_protocol
u8 local_next_by_ip_protocol[256]
Table mapping ip protocol to ip[46]-local node next index.
Definition: lookup.h:158
u8
unsigned char u8
Definition: types.h:56
clib_error_t
Definition: clib_error.h:21
vnet_ip4_table_cmd
clib_error_t * vnet_ip4_table_cmd(vlib_main_t *vm, unformat_input_t *main_input, vlib_cli_command_t *cmd)
Definition: lookup.c:430
ip_lookup_main_t::format_address_and_length
format_function_t * format_address_and_length
Either format_ip4_address_and_length or format_ip6_address_and_length.
Definition: lookup.h:155
vlib_cli_ip_command
static vlib_cli_command_t vlib_cli_ip_command
(constructor) VLIB_CLI_COMMAND (vlib_cli_ip_command)
Definition: lookup.c:444
mfib_table_entry_update
fib_node_index_t mfib_table_entry_update(u32 fib_index, const mfib_prefix_t *prefix, mfib_source_t source, fib_rpf_id_t rpf_id, mfib_entry_flags_t entry_flags)
Add a new (with no replication) or lock an existing entry.
Definition: mfib_table.c:237
mfib_table_entry_path_update
fib_node_index_t mfib_table_entry_path_update(u32 fib_index, const mfib_prefix_t *prefix, mfib_source_t source, const fib_route_path_t *rpath)
Add n paths to an entry (aka route) in the FIB.
Definition: mfib_table.c:325
ip_lookup_main_t::builtin_protocol_by_ip_protocol
u8 builtin_protocol_by_ip_protocol[256]
IP_BUILTIN_PROTOCOL_{TCP,UDP,ICMP,OTHER} by protocol in IP header.
Definition: lookup.h:161
clib_warning
#define clib_warning(format, args...)
Definition: error.h:59
ip_null_dpo_add_and_lock
void ip_null_dpo_add_and_lock(dpo_proto_t proto, ip_null_dpo_action_t action, dpo_id_t *dpo)
Definition: ip_null_dpo.c:78
MFIB_ITF_FLAG_FORWARD
@ MFIB_ITF_FLAG_FORWARD
Definition: mfib_types.h:153
vlib_cli_show_ip_command
static vlib_cli_command_t vlib_cli_show_ip_command
(constructor) VLIB_CLI_COMMAND (vlib_cli_show_ip_command)
Definition: lookup.c:458
dpo_id_t_
The identity of a DPO is a combination of its type and its instance number/index of objects of that t...
Definition: dpo.h:172
unformat_ip6_address
unformat_function_t unformat_ip6_address
Definition: format.h:89
rv
int __clib_unused rv
Definition: application.c:491
DPO_CLASSIFY
@ DPO_CLASSIFY
Definition: dpo.h:115
unformat_ip4_address
unformat_function_t unformat_ip4_address
Definition: format.h:68
format_ip4_address_and_length
format_function_t format_ip4_address_and_length
Definition: format.h:74
vlib_time_now
static f64 vlib_time_now(vlib_main_t *vm)
Definition: main.h:325
ip_mroute_command
static vlib_cli_command_t ip_mroute_command
(constructor) VLIB_CLI_COMMAND (ip_mroute_command)
Definition: lookup.c:894
dpo_set
void dpo_set(dpo_id_t *dpo, dpo_type_t type, dpo_proto_t proto, index_t index)
Set/create a DPO ID The DPO will be locked.
Definition: dpo.c:188
format_ip_adjacency_packet_data
u8 * format_ip_adjacency_packet_data(u8 *s, va_list *args)
Definition: lookup.c:132
proto
vl_api_ip_proto_t proto
Definition: acl_types.api:51
vlib_cli_command_t
Definition: cli.h:92
fib_table_find
u32 fib_table_find(fib_protocol_t proto, u32 table_id)
Get the index of the FIB for a Table-ID.
Definition: fib_table.c:1106
sw_if_index
vl_api_interface_index_t sw_if_index
Definition: wireguard.api:34
dpo_reset
void dpo_reset(dpo_id_t *dpo)
reset a DPO ID The DPO will be unlocked.
Definition: dpo.c:234
rpf_id
u32 rpf_id
Definition: fib_types.api:119
classify_dpo.h
IP_LOCAL_NEXT_PUNT
@ IP_LOCAL_NEXT_PUNT
Definition: lookup.h:112
unformat_fib_route_path
uword unformat_fib_route_path(unformat_input_t *input, va_list *args)
Unformat a fib_route_path_t from CLI input.
Definition: fib_types.c:540
fib_prefix_t_
Aggregate type for a prefix.
Definition: fib_types.h:202
FIB_ROUTE_PATH_LOCAL
@ FIB_ROUTE_PATH_LOCAL
A for-us/local path.
Definition: fib_types.h:344
mfib_table_entry_delete
void mfib_table_entry_delete(u32 fib_index, const mfib_prefix_t *prefix, mfib_source_t source)
Delete a FIB entry.
Definition: mfib_table.c:493
vlib_cli_ip6_command
static vlib_cli_command_t vlib_cli_ip6_command
(constructor) VLIB_CLI_COMMAND (vlib_cli_ip6_command)
Definition: lookup.c:451
vnet_ip_route_cmd
static clib_error_t * vnet_ip_route_cmd(vlib_main_t *vm, unformat_input_t *main_input, vlib_cli_command_t *cmd)
Definition: lookup.c:188
UNFORMAT_END_OF_INPUT
#define UNFORMAT_END_OF_INPUT
Definition: format.h:137
classify_table_index
u32 classify_table_index
Definition: fib_types.api:68