FD.io VPP  v21.10.1-2-g0a485f517
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, "Can't change the default table");
405  goto done;
406  }
407  else
408  {
409  if (is_add)
410  {
411  if (~0 == table_id)
412  {
413  table_id = ip_table_get_unused_id (fproto);
414  vlib_cli_output (vm, "%u\n", table_id);
415  }
416  ip_table_create (fproto, table_id, 0, name);
417  }
418  else
419  {
420  if (~0 == table_id)
421  {
422  error = clib_error_return (0, "No table id");
423  goto done;
424  }
425  ip_table_delete (fproto, table_id, 0);
426  }
427  }
428 
429 done:
430  unformat_free (line_input);
431  return error;
432 }
433 
434 clib_error_t *
436  unformat_input_t * main_input, vlib_cli_command_t * cmd)
437 {
438  return (vnet_ip_table_cmd (vm, main_input, cmd, FIB_PROTOCOL_IP4));
439 }
440 
441 clib_error_t *
443  unformat_input_t * main_input, vlib_cli_command_t * cmd)
444 {
445  return (vnet_ip_table_cmd (vm, main_input, cmd, FIB_PROTOCOL_IP6));
446 }
447 
448 clib_error_t *
450  vlib_cli_command_t *cmd, fib_protocol_t fproto)
451 {
452  unformat_input_t _line_input, *line_input = &_line_input;
453  fib_table_t *fib, *fibs;
454  clib_error_t *error = NULL;
455  u32 table_id = ~0, fib_index;
456  /* Get a line of input. */
457  if (unformat_user (main_input, unformat_line_input, line_input))
458  {
459  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
460  {
461  if (unformat (line_input, "%d", &table_id))
462  ;
463  else
464  {
465  error = unformat_parse_error (line_input);
466  goto done;
467  }
468  }
469  unformat_free (line_input);
470  }
471 
472  fibs = (fproto == FIB_PROTOCOL_IP4) ? ip4_main.fibs : ip6_main.fibs;
473 
474  if (table_id != (u32) ~0)
475  {
476  fib_index = fib_table_find (fproto, table_id);
477  if (fib_index == (u32) ~0)
478  {
479  error = clib_error_return (0, "Couldn't find table with table_id %u",
480  table_id);
481  goto done;
482  }
483 
484  fib = fib_table_get (fib_index, fproto);
485  vlib_cli_output (vm, "[%3u] table_id:%3u %v", fib->ft_index,
486  fib->ft_table_id, fib->ft_desc);
487  }
488  else
489  {
490  pool_foreach (fib, fibs)
491  vlib_cli_output (vm, "[%3u] table_id:%3u %v", fib->ft_index,
492  fib->ft_table_id, fib->ft_desc);
493  }
494 
495 done:
496  return error;
497 }
498 
499 clib_error_t *
501  vlib_cli_command_t *cmd)
502 {
503  return (vnet_show_ip_table_cmd (vm, main_input, cmd, FIB_PROTOCOL_IP4));
504 }
505 
506 clib_error_t *
508  vlib_cli_command_t *cmd)
509 {
510  return (vnet_show_ip_table_cmd (vm, main_input, cmd, FIB_PROTOCOL_IP6));
511 }
512 
513 /* *INDENT-OFF* */
515  .path = "ip",
516  .short_help = "Internet protocol (IP) commands",
517 };
518 /* *INDENT-ON* */
519 
520 /* *INDENT-OFF* */
522  .path = "ip6",
523  .short_help = "Internet protocol version 6 (IPv6) commands",
524 };
525 /* *INDENT-ON* */
526 
527 /* *INDENT-OFF* */
529  .path = "show ip",
530  .short_help = "Internet protocol (IP) show commands",
531 };
532 /* *INDENT-ON* */
533 
534 /* *INDENT-OFF* */
536  .path = "show ip6",
537  .short_help = "Internet protocol version 6 (IPv6) show commands",
538 };
539 /* *INDENT-ON* */
540 
541 /*?
542  * This command is used to add or delete IPv4 or IPv6 routes. All
543  * IP Addresses ('<em><dst-ip-addr>/<width></em>',
544  * '<em><next-hop-ip-addr></em>' and '<em><adj-hop-ip-addr></em>')
545  * can be IPv4 or IPv6, but all must be of the same form in a single
546  * command. To display the current set of routes, use the commands
547  * '<em>show ip fib</em>' and '<em>show ip6 fib</em>'.
548  *
549  * @cliexpar
550  * Example of how to add a straight forward static route:
551  * @cliexcmd{ip route add 6.0.1.2/32 via 6.0.0.1 GigabitEthernet2/0/0}
552  * Example of how to delete a straight forward static route:
553  * @cliexcmd{ip route del 6.0.1.2/32 via 6.0.0.1 GigabitEthernet2/0/0}
554  * Mainly for route add/del performance testing, one can add or delete
555  * multiple routes by adding 'count N' to the previous item:
556  * @cliexcmd{ip route add count 10 7.0.0.0/24 via 6.0.0.1 GigabitEthernet2/0/0}
557  * Add multiple routes for the same destination to create equal-cost multipath:
558  * @cliexcmd{ip route add 7.0.0.1/32 via 6.0.0.1 GigabitEthernet2/0/0}
559  * @cliexcmd{ip route add 7.0.0.1/32 via 6.0.0.2 GigabitEthernet2/0/0}
560  * For unequal-cost multipath, specify the desired weights. This
561  * combination of weights results in 3/4 of the traffic following the
562  * second path, 1/4 following the first path:
563  * @cliexcmd{ip route add 7.0.0.1/32 via 6.0.0.1 GigabitEthernet2/0/0 weight 1}
564  * @cliexcmd{ip route add 7.0.0.1/32 via 6.0.0.2 GigabitEthernet2/0/0 weight 3}
565  * To add a route to a particular FIB table (VRF), use:
566  * @cliexcmd{ip route add 172.16.24.0/24 table 7 via GigabitEthernet2/0/0}
567  ?*/
568 /* *INDENT-OFF* */
570  .path = "ip route",
571  .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>]",
572  .function = vnet_ip_route_cmd,
573  .is_mp_safe = 1,
574 };
575 
576 /* *INDENT-ON* */
577 /*?
578  * This command is used to add or delete IPv4 Tables. All
579  * Tables must be explicitly added before that can be used. Creating a
580  * table will add both unicast and multicast FIBs
581  *
582  ?*/
583 /* *INDENT-OFF* */
585  .path = "ip table",
586  .short_help = "ip table [add|del] <table-id>",
587  .function = vnet_ip4_table_cmd,
588 };
589 /* *INDENT-ON* */
590 
591 /* *INDENT-ON* */
592 /*?
593  * This command is used to add or delete IPv4 Tables. All
594  * Tables must be explicitly added before that can be used. Creating a
595  * table will add both unicast and multicast FIBs
596  *
597  ?*/
598 /* *INDENT-OFF* */
600  .path = "ip6 table",
601  .short_help = "ip6 table [add|del] <table-id>",
602  .function = vnet_ip6_table_cmd,
603 };
604 
606  .path = "show ip table",
607  .short_help = "show ip table <table-id>",
608  .function = vnet_show_ip4_table_cmd,
609 };
610 
612  .path = "show ip6 table",
613  .short_help = "show ip6 table <table-id>",
614  .function = vnet_show_ip6_table_cmd,
615 };
616 
617 static clib_error_t *
619  unformat_input_t * input,
620  vlib_cli_command_t * cmd,
621  fib_protocol_t fproto)
622 {
623  vnet_main_t *vnm = vnet_get_main ();
624  clib_error_t *error = 0;
626  int rv;
627 
628  sw_if_index = ~0;
629 
631  {
632  error = clib_error_return (0, "unknown interface `%U'",
633  format_unformat_error, input);
634  goto done;
635  }
636 
637  if (unformat (input, "%d", &table_id))
638  ;
639  else
640  {
641  error = clib_error_return (0, "expected table id `%U'",
642  format_unformat_error, input);
643  goto done;
644  }
645 
646  rv = ip_table_bind (fproto, sw_if_index, table_id, 0);
647 
648  if (VNET_API_ERROR_ADDRESS_FOUND_FOR_INTERFACE == rv)
649  {
650  error = clib_error_return (0, "IP addresses are still present on %U",
652  vnet_get_main(),
653  sw_if_index);
654  }
655  else if (VNET_API_ERROR_NO_SUCH_FIB == rv)
656  {
657  error = clib_error_return (0, "no such table %d", table_id);
658  }
659  else if (0 != rv)
660  {
661  error = clib_error_return (0, "unknown error");
662  }
663 
664  done:
665  return error;
666 }
667 
668 static clib_error_t *
670  unformat_input_t * input,
671  vlib_cli_command_t * cmd)
672 {
673  return (ip_table_bind_cmd (vm , input, cmd, FIB_PROTOCOL_IP4));
674 }
675 
676 static clib_error_t *
678  unformat_input_t * input,
679  vlib_cli_command_t * cmd)
680 {
681  return (ip_table_bind_cmd (vm , input, cmd, FIB_PROTOCOL_IP6));
682 }
683 
684 /*?
685  * Place the indicated interface into the supplied IPv4 FIB table (also known
686  * as a VRF). The FIB table must be created using "ip table add" already. To
687  * display the current IPv4 FIB table, use the command '<em>show ip fib</em>'.
688  * FIB table will only be displayed if a route has been added to the table, or
689  * an IP Address is assigned to an interface in the table (which adds a route
690  * automatically).
691  *
692  * @note IP addresses added after setting the interface IP table are added to
693  * the indicated FIB table. If an IP address is added prior to changing the
694  * table then this is an error. The control plane must remove these addresses
695  * first and then change the table. VPP will not automatically move the
696  * addresses from the old to the new table as it does not know the validity
697  * of such a change.
698  *
699  * @cliexpar
700  * Example of how to add an interface to an IPv4 FIB table (where 2 is the table-id):
701  * @cliexcmd{set interface ip table GigabitEthernet2/0/0 2}
702  ?*/
703 /* *INDENT-OFF* */
705 {
706  .path = "set interface ip table",
707  .function = ip4_table_bind_cmd,
708  .short_help = "set interface ip table <interface> <table-id>",
709 };
710 /* *INDENT-ON* */
711 
712 /*?
713  * Place the indicated interface into the supplied IPv6 FIB table (also known
714  * as a VRF). The FIB table must be created using "ip6 table add" already. To
715  * display the current IPv6 FIB table, use the command '<em>show ip6 fib</em>'.
716  * FIB table will only be displayed if a route has been added to the table, or
717  * an IP Address is assigned to an interface in the table (which adds a route
718  * automatically).
719  *
720  * @note IP addresses added after setting the interface IP table are added to
721  * the indicated FIB table. If an IP address is added prior to changing the
722  * table then this is an error. The control plane must remove these addresses
723  * first and then change the table. VPP will not automatically move the
724  * addresses from the old to the new table as it does not know the validity
725  * of such a change.
726  *
727  * @cliexpar
728  * Example of how to add an interface to an IPv6 FIB table (where 2 is the table-id):
729  * @cliexcmd{set interface ip6 table GigabitEthernet2/0/0 2}
730  ?*/
731 /* *INDENT-OFF* */
733 {
734  .path = "set interface ip6 table",
735  .function = ip6_table_bind_cmd,
736  .short_help = "set interface ip6 table <interface> <table-id>"
737 };
738 /* *INDENT-ON* */
739 
740 clib_error_t *
742  unformat_input_t * main_input, vlib_cli_command_t * cmd)
743 {
744  unformat_input_t _line_input, *line_input = &_line_input;
745  fib_route_path_t rpath, *rpaths = NULL;
746  clib_error_t *error = NULL;
747  u32 table_id, is_del, payload_proto;
748  mfib_prefix_t pfx;
749  u32 fib_index;
750  mfib_entry_flags_t eflags = 0;
751  u32 gcount, scount, ss, gg, incr;
752  f64 timet[2];
754 
755  gcount = scount = 1;
756  is_del = 0;
757  table_id = 0;
758  clib_memset (&pfx, 0, sizeof (pfx));
759  clib_memset (&rpath, 0, sizeof (rpath));
760  rpath.frp_sw_if_index = ~0;
761 
762  /* Get a line of input. */
763  if (!unformat_user (main_input, unformat_line_input, line_input))
764  return 0;
765 
766  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
767  {
768  if (unformat (line_input, "table %d", &table_id))
769  ;
770  else if (unformat (line_input, "del"))
771  is_del = 1;
772  else if (unformat (line_input, "add"))
773  is_del = 0;
774  else if (unformat (line_input, "rpf-id %d", &rpf_id))
775  ;
776  else if (unformat (line_input, "scount %d", &scount))
777  ;
778  else if (unformat (line_input, "gcount %d", &gcount))
779  ;
780  else if (unformat (line_input, "%U %U",
782  &pfx.fp_src_addr.ip4,
784  {
785  payload_proto = pfx.fp_proto = FIB_PROTOCOL_IP4;
786  pfx.fp_len = 64;
787  }
788  else if (unformat (line_input, "%U %U",
790  &pfx.fp_src_addr.ip6,
792  {
793  payload_proto = pfx.fp_proto = FIB_PROTOCOL_IP6;
794  pfx.fp_len = 256;
795  }
796  else if (unformat (line_input, "%U/%d",
798  &pfx.fp_grp_addr.ip4, &pfx.fp_len))
799  {
800  clib_memset (&pfx.fp_src_addr.ip4, 0, sizeof (pfx.fp_src_addr.ip4));
801  payload_proto = pfx.fp_proto = FIB_PROTOCOL_IP4;
802  }
803  else if (unformat (line_input, "%U/%d",
805  &pfx.fp_grp_addr.ip6, &pfx.fp_len))
806  {
807  clib_memset (&pfx.fp_src_addr.ip6, 0, sizeof (pfx.fp_src_addr.ip6));
808  payload_proto = pfx.fp_proto = FIB_PROTOCOL_IP6;
809  }
810  else if (unformat (line_input, "%U",
812  {
813  clib_memset (&pfx.fp_src_addr.ip4, 0, sizeof (pfx.fp_src_addr.ip4));
814  payload_proto = pfx.fp_proto = FIB_PROTOCOL_IP4;
815  pfx.fp_len = 32;
816  }
817  else if (unformat (line_input, "%U",
819  {
820  clib_memset (&pfx.fp_src_addr.ip6, 0, sizeof (pfx.fp_src_addr.ip6));
821  payload_proto = pfx.fp_proto = FIB_PROTOCOL_IP6;
822  pfx.fp_len = 128;
823  }
824  else if (unformat (line_input, "via local Forward"))
825  {
826  clib_memset (&rpath.frp_addr, 0, sizeof (rpath.frp_addr));
827  rpath.frp_sw_if_index = ~0;
828  rpath.frp_weight = 1;
830  /*
831  * set the path proto appropriately for the prefix
832  */
833  rpath.frp_proto = fib_proto_to_dpo (pfx.fp_proto);
835 
836  vec_add1 (rpaths, rpath);
837  }
838  else if (unformat (line_input, "via %U",
839  unformat_fib_route_path, &rpath, &payload_proto))
840  {
841  vec_add1 (rpaths, rpath);
842  }
843  else if (unformat (line_input, "%U",
844  unformat_mfib_entry_flags, &eflags))
845  ;
846  else
847  {
848  error = unformat_parse_error (line_input);
849  goto done;
850  }
851  }
852 
853  if (~0 == table_id)
854  {
855  /*
856  * if no table_id is passed we will manipulate the default
857  */
858  fib_index = 0;
859  }
860  else
861  {
862  fib_index = mfib_table_find (pfx.fp_proto, table_id);
863 
864  if (~0 == fib_index)
865  {
866  error = clib_error_return (0, "Nonexistent table id %d", table_id);
867  goto done;
868  }
869  }
870 
871  timet[0] = vlib_time_now (vm);
872 
873  if (FIB_PROTOCOL_IP4 == pfx.fp_proto)
874  {
875  incr = 1 << (32 - (pfx.fp_len % 32));
876  }
877  else
878  {
879  incr = 1 << (128 - (pfx.fp_len % 128));
880  }
881 
882  for (ss = 0; ss < scount; ss++)
883  {
884  for (gg = 0; gg < gcount; gg++)
885  {
886  if (is_del && 0 == vec_len (rpaths))
887  {
888  /* no path provided => route delete */
889  mfib_table_entry_delete (fib_index, &pfx, MFIB_SOURCE_CLI);
890  }
891  else if (eflags || (MFIB_RPF_ID_NONE != rpf_id))
892  {
893  mfib_table_entry_update (fib_index, &pfx, MFIB_SOURCE_CLI,
894  rpf_id, eflags);
895  }
896  else
897  {
898  if (is_del)
899  mfib_table_entry_path_remove (fib_index,
900  &pfx, MFIB_SOURCE_CLI, rpaths);
901  else
902  mfib_table_entry_path_update (fib_index,
903  &pfx, MFIB_SOURCE_CLI, rpaths);
904  }
905 
906  if (FIB_PROTOCOL_IP4 == pfx.fp_proto)
907  {
908  pfx.fp_grp_addr.ip4.as_u32 =
909  clib_host_to_net_u32 (incr +
910  clib_net_to_host_u32 (pfx.
911  fp_grp_addr.ip4.
912  as_u32));
913  }
914  else
915  {
916  int bucket = (incr < 64 ? 0 : 1);
917  pfx.fp_grp_addr.ip6.as_u64[bucket] =
918  clib_host_to_net_u64 (incr +
919  clib_net_to_host_u64 (pfx.
920  fp_grp_addr.ip6.as_u64
921  [bucket]));
922 
923  }
924  }
925  if (FIB_PROTOCOL_IP4 == pfx.fp_proto)
926  {
927  pfx.fp_src_addr.ip4.as_u32 =
928  clib_host_to_net_u32 (1 +
929  clib_net_to_host_u32 (pfx.fp_src_addr.
930  ip4.as_u32));
931  }
932  else
933  {
934  pfx.fp_src_addr.ip6.as_u64[1] =
935  clib_host_to_net_u64 (1 +
936  clib_net_to_host_u64 (pfx.fp_src_addr.
937  ip6.as_u64[1]));
938  }
939  }
940 
941  timet[1] = vlib_time_now (vm);
942 
943  if (scount > 1 || gcount > 1)
944  vlib_cli_output (vm, "%.6e routes/sec",
945  (scount * gcount) / (timet[1] - timet[0]));
946 
947 done:
948  vec_free (rpaths);
949  unformat_free (line_input);
950 
951  return error;
952 }
953 
954 /*?
955  * This command is used to add or delete IPv4 or IPv6 multicast routes. All
956  * IP Addresses ('<em><dst-ip-addr>/<width></em>',
957  * '<em><next-hop-ip-addr></em>' and '<em><adj-hop-ip-addr></em>')
958  * can be IPv4 or IPv6, but all must be of the same form in a single
959  * command. To display the current set of routes, use the commands
960  * '<em>show ip mfib</em>' and '<em>show ip6 mfib</em>'.
961  * The full set of support flags for interfaces and route is shown via;
962  * '<em>show mfib route flags</em>' and '<em>show mfib itf flags</em>'
963  * respectively.
964  * @cliexpar
965  * Example of how to add a forwarding interface to a route (and create the
966  * route if it does not exist)
967  * @cliexcmd{ip mroute add 232.1.1.1 via GigabitEthernet2/0/0 Forward}
968  * Example of how to add an accepting interface to a route (and create the
969  * route if it does not exist)
970  * @cliexcmd{ip mroute add 232.1.1.1 via GigabitEthernet2/0/1 Accept}
971  * Example of changing the route's flags to send signals via the API
972  * @cliexcmd{ip mroute add 232.1.1.1 Signal}
973 
974  ?*/
975 /* *INDENT-OFF* */
977 {
978  .path = "ip mroute",
979  .short_help = "ip mroute [add|del] <dst-ip-addr>/<width> [table <table-id>] [rpf-id <ID>] [via <next-hop-ip-addr> [<interface>],",
980  .function = vnet_ip_mroute_cmd,
981  .is_mp_safe = 1,
982 };
983 /* *INDENT-ON* */
984 
985 /*
986  * fd.io coding-style-patch-verification: ON
987  *
988  * Local Variables:
989  * eval: (c-set-style "gnu")
990  * End:
991  */
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:442
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:565
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:900
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:1104
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:732
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
ip_table_get_unused_id
u32 ip_table_get_unused_id(fib_protocol_t fproto)
Definition: ip_api.c:608
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
fib_table_t_
A protocol Independent FIB table.
Definition: fib_table.h:71
pool_foreach
#define pool_foreach(VAR, POOL)
Iterate through pool.
Definition: pool.h:534
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:677
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:741
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
fib_table_t_::ft_index
fib_node_index_t ft_index
Index into FIB vector.
Definition: fib_table.h:97
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
fib_table_t_::ft_table_id
u32 ft_table_id
Table ID (hash key) for this FIB.
Definition: fib_table.h:92
fib_table_t_::ft_desc
u8 * ft_desc
Table description.
Definition: fib_table.h:122
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:599
unformat_check_input
static uword unformat_check_input(unformat_input_t *i)
Definition: format.h:163
vnet_show_ip6_table_cmd
clib_error_t * vnet_show_ip6_table_cmd(vlib_main_t *vm, unformat_input_t *main_input, vlib_cli_command_t *cmd)
Definition: lookup.c:507
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
vnet_show_ip_table_cmd
clib_error_t * vnet_show_ip_table_cmd(vlib_main_t *vm, unformat_input_t *main_input, vlib_cli_command_t *cmd, fib_protocol_t fproto)
Definition: lookup.c:449
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
if
if(node->flags &VLIB_NODE_FLAG_TRACE) vnet_interface_output_trace(vm
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
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
ip6_main_t::fibs
struct fib_table_t_ * fibs
Definition: ip6.h:115
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:584
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:924
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:618
ip6_main
ip6_main_t ip6_main
Definition: ip6_forward.c:2785
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:704
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:569
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:605
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:458
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:462
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:474
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
fib_table_get
fib_table_t * fib_table_get(fib_node_index_t index, fib_protocol_t proto)
Get a pointer to a FIB table.
Definition: fib_table.c:29
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
ip4_main_t::fibs
struct fib_table_t_ * fibs
Vector of FIBs.
Definition: ip4.h:112
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:654
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:669
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:535
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
show_ip6_table_command
static vlib_cli_command_t show_ip6_table_command
(constructor) VLIB_CLI_COMMAND (show_ip6_table_command)
Definition: lookup.c:611
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:435
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:514
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
i
int i
Definition: flowhash_template.h:376
clib_warning
#define clib_warning(format, args...)
Definition: error.h:59
vnet_show_ip4_table_cmd
clib_error_t * vnet_show_ip4_table_cmd(vlib_main_t *vm, unformat_input_t *main_input, vlib_cli_command_t *cmd)
Definition: lookup.c:500
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:528
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:327
ip_mroute_command
static vlib_cli_command_t ip_mroute_command
(constructor) VLIB_CLI_COMMAND (ip_mroute_command)
Definition: lookup.c:976
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:1111
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:521
show_ip4_table_command
static vlib_cli_command_t show_ip4_table_command
(constructor) VLIB_CLI_COMMAND (show_ip4_table_command)
Definition: lookup.c:605
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