FD.io VPP  v21.10.1-2-g0a485f517
Vector Packet Processing
ip6_link.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2019 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/ip/ip6_link.h>
17 #include <vnet/ip/ip6_ll_table.h>
18 
19 #include <vnet/ethernet/ethernet.h>
20 #include <vnet/mfib/ip6_mfib.h>
21 #include <vnet/adj/adj_mcast.h>
22 
23 typedef struct ip6_link_delegate_t_
24 {
29 
31  .ild_sw_if_index = ~0,
32 };
33 
34 typedef struct ip6_link_t_
35 {
36  /** interface ip6 is enabled on */
38 
39  /** link-local address - if unset that IP6 is disabled*/
40  ip6_address_t il_ll_addr;
41 
42  /** list of delegates */
44 
45  /** multicast adjacency for this link */
47 
48  /** number of references to IP6 enabled on this link */
50 } ip6_link_t;
51 
52 #define FOREACH_IP6_LINK_DELEGATE(_ild, _il, body) \
53 { \
54  if (NULL != _il) { \
55  vec_foreach (_ild, _il->il_delegates) { \
56  if (ip6_link_delegate_is_init(_ild)) \
57  body; \
58  } \
59  } \
60 }
61 
62 #define FOREACH_IP6_LINK_DELEGATE_ID(_id) \
63  for (_id = 0; _id < il_delegate_id; _id++)
64 
65 /** last used delegate ID */
67 
68 /** VFT registered per-delegate type */
70 
71 /** Per interface configs */
73 
74 /** Randomizer */
76 
77 /** Logging */
79 
80 #define IP6_LINK_DBG(...) \
81  vlib_log_debug (ip6_link_logger, __VA_ARGS__);
82 
83 #define IP6_LINK_INFO(...) \
84  vlib_log_notice (ip6_link_logger, __VA_ARGS__);
85 
86 static bool
88 {
89  return (~0 != ild->ild_sw_if_index);
90 }
91 
92 static bool
94 {
95  return (!ip6_address_is_zero (&il->il_ll_addr));
96 }
97 
98 static void
99 ip6_link_local_address_from_mac (ip6_address_t * ip, const u8 * mac)
100 {
101  ip->as_u64[0] = clib_host_to_net_u64 (0xFE80000000000000ULL);
102  /* Invert the "u" bit */
103  ip->as_u8[8] = mac[0] ^ (1 << 1);
104  ip->as_u8[9] = mac[1];
105  ip->as_u8[10] = mac[2];
106  ip->as_u8[11] = 0xFF;
107  ip->as_u8[12] = 0xFE;
108  ip->as_u8[13] = mac[3];
109  ip->as_u8[14] = mac[4];
110  ip->as_u8[15] = mac[5];
111 }
112 
113 static void
114 ip6_mac_address_from_link_local (u8 * mac, const ip6_address_t * ip)
115 {
116  /* Invert the previously inverted "u" bit */
117  mac[0] = ip->as_u8[8] ^ (1 << 1);
118  mac[1] = ip->as_u8[9];
119  mac[2] = ip->as_u8[10];
120  mac[3] = ip->as_u8[13];
121  mac[4] = ip->as_u8[14];
122  mac[5] = ip->as_u8[15];
123 }
124 
125 static ip6_link_t *
127 {
128  ip6_link_t *il;
129 
130  if (sw_if_index >= vec_len (ip6_links))
131  return (NULL);
132 
133  il = &ip6_links[sw_if_index];
134 
135  if (!ip6_link_is_enabled_i (il))
136  return (NULL);
137 
138  return (il);
139 }
140 
141 bool
143 {
144  return (NULL != ip6_link_get (sw_if_index));
145 }
146 
147 
148 int
149 ip6_link_enable (u32 sw_if_index, const ip6_address_t * link_local_addr)
150 {
151  ip6_link_t *il;
152  int rv;
153 
154  il = ip6_link_get (sw_if_index);
155 
156  if (NULL == il)
157  {
158  const vnet_sw_interface_t *sw_sup;
159  const ethernet_interface_t *eth;
160  vnet_main_t *vnm;
161 
162  eth = NULL;
163  vnm = vnet_get_main ();
164 
165  IP6_LINK_INFO ("enable: %U",
167 
168  sw_sup = vnet_get_sup_sw_interface (vnm, sw_if_index);
170 
171  il = &ip6_links[sw_if_index];
172  il->il_locks = 0;
175 
176  if (sw_sup->type == VNET_SW_INTERFACE_TYPE_HARDWARE)
178 
179  /* use a user provided LL address if given */
180  if (NULL != link_local_addr)
181  ip6_address_copy (&il->il_ll_addr, link_local_addr);
182 
183  /* generate from ethernet MAC */
184  if (ip6_address_is_zero (&il->il_ll_addr) && NULL != eth)
186  eth->address.mac.bytes);
187 
188  /* choose a random address */
189  if (ip6_address_is_zero (&il->il_ll_addr))
190  {
191  il->il_ll_addr.as_u64[0] =
192  clib_host_to_net_u64 (0xFE80000000000000ULL);
193 
194  /* make up an interface id */
195  il->il_ll_addr.as_u64[1] = random_u64 (&il_randomizer);
196 
197  /* clear u bit */
198  il->il_ll_addr.as_u8[8] &= 0xfd;
199  }
200 
201  {
202  ip6_ll_prefix_t ilp = {
203  .ilp_addr = il->il_ll_addr,
204  .ilp_sw_if_index = sw_if_index,
205  };
206 
208  }
209 
210  /* essentially "enables" ipv6 on this interface */
213 
214  /* only ehternet interfaces support MLD and RA, which use the mcast adj
215  */
216  if (NULL != eth)
217  il->il_mcast_adj =
219 
220  /* inform all register clients */
223  {
224  if (NULL != il_delegate_vfts[id].ildv_enable)
226  }
227 
228  rv = 0;
229  }
230  else
231  {
232  rv = VNET_API_ERROR_VALUE_EXIST;
233  }
234 
235  il->il_locks++;
236 
237  return (rv);
238 }
239 
240 static void
242 {
243  ip6_link_delegate_t *ild;
244 
245  /* *INDENT-OFF* */
246  FOREACH_IP6_LINK_DELEGATE (ild, il,
247  ({
249  }));
250  /* *INDENT-ON* */
251 
252  vec_free (il->il_delegates);
253  il->il_delegates = NULL;
254 }
255 
256 static void
258 {
259  ip6_ll_prefix_t ilp = {
260  .ilp_addr = il->il_ll_addr,
261  .ilp_sw_if_index = il->il_sw_if_index,
262  };
263 
264  IP6_LINK_INFO ("last-lock: %U",
266  vnet_get_main (), il->il_sw_if_index);
267 
270 
273 
275  adj_unlock (il->il_mcast_adj);
277 }
278 
279 static void
281 {
282  if (NULL == il)
283  return;
284 
285  il->il_locks--;
286 
287  if (0 == il->il_locks)
289 }
290 
291 int
293 {
294  ip6_link_t *il;
295 
296  il = ip6_link_get (sw_if_index);
297 
298  if (NULL == il)
299  return (VNET_API_ERROR_IP6_NOT_ENABLED);
300 
301  IP6_LINK_INFO ("disable: %U",
303 
304  ip6_link_unlock (il);
305 
306  return (0);
307 }
308 
309 const ip6_address_t *
311 {
312  const ip6_link_t *il;
313 
314  il = ip6_link_get (sw_if_index);
315 
316  if (NULL == il)
317  return (NULL);
318 
319  return (&il->il_ll_addr);
320 }
321 
324 {
325  const ip6_link_t *il;
326 
327  il = ip6_link_get (sw_if_index);
328 
329  if (NULL == il)
330  return (INDEX_INVALID);
331 
332  return (il->il_mcast_adj);
333 }
334 
335 int
337 {
338  ip6_link_delegate_t *ild;
339  ip6_link_t *il;
340 
341  il = ip6_link_get (sw_if_index);
342 
343  if (NULL == il)
345 
346  ip6_ll_prefix_t ilp = {
347  .ilp_addr = il->il_ll_addr,
348  .ilp_sw_if_index = sw_if_index,
349  };
350 
351  IP6_LINK_INFO ("set-ll: %U -> %U",
354 
359 
360  /* *INDENT-OFF* */
361  FOREACH_IP6_LINK_DELEGATE (ild, il,
362  ({
363  if (NULL != il_delegate_vfts[ild->ild_type].ildv_ll_change)
365  &il->il_ll_addr);
366  }));
367  /* *INDENT-ON* */
368 
369  return (0);
370 }
371 
374 {
376 
377  ASSERT (vft->ildv_disable);
378 
380 
381  il_delegate_vfts[rc] = *vft;
382 
383  return (rc);
384 }
385 
386 index_t
388 {
389  ip6_link_t *il;
390 
391  il = ip6_link_get (sw_if_index);
392 
393  if (NULL == il)
394  return (INDEX_INVALID);
395 
397 
398  if (!ip6_link_delegate_is_init (&il->il_delegates[id]))
399  return (INDEX_INVALID);
400 
401  return (il->il_delegates[id].ild_index);
402 }
403 
404 bool
407 {
408  ip6_link_t *il;
409 
410  il = ip6_link_get (sw_if_index);
411 
412  if (NULL == il)
413  return (false);
414 
416 
418  il->il_delegates[id].ild_type = id;
419  il->il_delegates[id].ild_index = ii;
420 
421  return (true);
422 }
423 
424 void
427 {
428  ip6_link_t *il;
429 
430  il = ip6_link_get (sw_if_index);
431 
432  if (NULL != il)
433  {
434  if (vec_len (il->il_delegates) > id)
435  {
436  clib_memcpy (&il->il_delegates[id],
438  sizeof (il->il_delegates[0]));
439  }
440  }
441 }
442 
443 static void
445  uword opaque,
447  ip6_address_t * address,
448  u32 address_length,
449  u32 if_address_index, u32 is_delete)
450 {
451  const ip6_link_delegate_t *ild;
452  ip6_link_t *il;
453 
455  // only interested in global addresses here
456  return;
457 
458  IP6_LINK_INFO ("addr-%s: %U -> %U",
459  (is_delete ? "del" : "add"),
462 
463  il = ip6_link_get (sw_if_index);
464 
465  if (NULL == il)
466  return;
467 
468  /* *INDENT-OFF* */
469  FOREACH_IP6_LINK_DELEGATE (ild, il,
470  ({
471  if (is_delete)
472  {
473  if (NULL != il_delegate_vfts[ild->ild_type].ildv_addr_del)
475  address, address_length);
476  }
477  else
478  {
479  if (NULL != il_delegate_vfts[ild->ild_type].ildv_addr_add)
481  address, address_length);
482  }
483  }));
484  /* *INDENT-ON* */
485 }
486 
487 static clib_error_t *
489 {
490  if (!is_add)
491  {
492  ip6_link_t *il;
493 
494  il = ip6_link_get (sw_if_index);
495 
496  IP6_LINK_DBG ("link-del: %U",
498  sw_if_index);
499 
500  if (NULL != il)
501  /* force cleanup */
503  }
504 
505  return (NULL);
506 }
507 
509 
510 static clib_error_t *
512 {
514  ip6_link_logger = vlib_log_register_class ("ip6", "link");
515 
516  {
519  };
521  }
522  return (NULL);
523 }
524 
526 
527 
528 static clib_error_t *
530  unformat_input_t * input, vlib_cli_command_t * cmd)
531 {
532  u8 mac[6];
533  ip6_address_t _a, *a = &_a;
534 
535  if (unformat (input, "%U", unformat_ethernet_address, mac))
536  {
538  vlib_cli_output (vm, "Link local address: %U", format_ip6_address, a);
540  vlib_cli_output (vm, "Original MAC address: %U",
542  }
543 
544  return 0;
545 }
546 
547 /*?
548  * This command converts the given MAC Address into an IPv6 link-local
549  * address.
550  *
551  * @cliexpar
552  * Example of how to create an IPv6 link-local address:
553  * @cliexstart{test ip6 link 16:d9:e0:91:79:86}
554  * Link local address: fe80::14d9:e0ff:fe91:7986
555  * Original MAC address: 16:d9:e0:91:79:86
556  * @cliexend
557 ?*/
558 /* *INDENT-OFF* */
560 {
561  .path = "test ip6 link",
562  .function = test_ip6_link_command_fn,
563  .short_help = "test ip6 link <mac-address>",
564 };
565 /* *INDENT-ON* */
566 
567 static u8 *
568 ip6_print_addrs (u8 * s, u32 * addrs)
569 {
571  u32 i;
572 
573  for (i = 0; i < vec_len (addrs); i++)
574  {
576  pool_elt_at_index (lm->if_address_pool, addrs[i]);
577  ip6_address_t *address = ip_interface_address_get_address (lm, a);
578 
579  s = format (s, "%U%U/%d\n",
581  format_ip6_address, address, a->address_length);
582  }
583 
584  return (s);
585 }
586 
587 static u8 *
588 format_ip6_link (u8 * s, va_list * arg)
589 {
590  const ip6_link_t *il = va_arg (*arg, ip6_link_t *);
592  vnet_main_t *vnm = vnet_get_main ();
593 
594  if (!ip6_link_is_enabled_i (il))
595  return (s);
596 
597  s = format (s, "%U is admin %s\n",
601  "up" : "down"));
602 
603  u32 ai;
604  u32 *link_scope = 0, *global_scope = 0;
605  u32 *local_scope = 0, *unknown_scope = 0;
607  const ip6_link_delegate_t *ild;
608 
610  il->il_sw_if_index, ~0);
612 
613  while (ai != (u32) ~ 0)
614  {
615  a = pool_elt_at_index (lm->if_address_pool, ai);
616  ip6_address_t *address = ip_interface_address_get_address (lm, a);
617 
619  vec_add1 (link_scope, ai);
621  vec_add1 (global_scope, ai);
623  vec_add1 (local_scope, ai);
624  else
625  vec_add1 (unknown_scope, ai);
626 
627  ai = a->next_this_sw_interface;
628  }
629 
630  if (vec_len (link_scope))
631  {
632  s = format (s, "%ULink-local address(es):\n", format_white_space, 2);
633  s = ip6_print_addrs (s, link_scope);
634  vec_free (link_scope);
635  }
636 
637  if (vec_len (local_scope))
638  {
639  s = format (s, "%ULocal unicast address(es):\n", format_white_space, 2);
640  s = ip6_print_addrs (s, local_scope);
641  vec_free (local_scope);
642  }
643 
644  if (vec_len (global_scope))
645  {
646  s = format (s, "%UGlobal unicast address(es):\n",
647  format_white_space, 2);
648  s = ip6_print_addrs (s, global_scope);
649  vec_free (global_scope);
650  }
651 
652  if (vec_len (unknown_scope))
653  {
654  s = format (s, "%UOther-scope address(es):\n", format_white_space, 2);
655  s = ip6_print_addrs (s, unknown_scope);
656  vec_free (unknown_scope);
657  }
658 
659  s = format (s, "%ULink-local address(es):\n", format_white_space, 2);
660  s = format (s, "%U%U\n",
662 
663  /* *INDENT-OFF* */
665  ({
666  s = format (s, "%U", il_delegate_vfts[ild->ild_type].ildv_format,
667  ild->ild_index, 2);
668  }));
669  /* *INDENT-ON* */
670 
671  return (s);
672 }
673 
674 static clib_error_t *
676  unformat_input_t * input, vlib_cli_command_t * cmd)
677 {
678  const ip6_link_t *il;
679  vnet_main_t *vnm;
681 
682  vnm = vnet_get_main ();
683  sw_if_index = ~0;
684 
686  {
687  il = ip6_link_get (sw_if_index);
688 
689  if (NULL == il)
690  {
691  vlib_cli_output (vm, "IP6 disabled");
692  return (NULL);
693  }
694  else
695  vlib_cli_output (vm, "%U", format_ip6_link, il);
696  }
697  else
698  {
699  vec_foreach (il, ip6_links)
700  vlib_cli_output (vm, "%U", format_ip6_link, il);
701  }
702 
703  return (NULL);
704 }
705 
706 /*?
707  * This command is used to display various IPv6 attributes on a given
708  * interface.
709  *
710  * @cliexpar
711  * Example of how to display IPv6 settings:
712  * @cliexstart{show ip6 interface GigabitEthernet2/0/0}
713  * GigabitEthernet2/0/0 is admin up
714  * Link-local address(es):
715  * fe80::ab8/64
716  * Joined group address(es):
717  * ff02::1
718  * ff02::2
719  * ff02::16
720  * ff02::1:ff00:ab8
721  * Advertised Prefixes:
722  * prefix fe80::fe:28ff:fe9c:75b3, length 64
723  * MTU is 1500
724  * ICMP error messages are unlimited
725  * ICMP redirects are disabled
726  * ICMP unreachables are not sent
727  * ND DAD is disabled
728  * ND advertised reachable time is 0
729  * ND advertised retransmit interval is 0 (msec)
730  * ND router advertisements are sent every 200 seconds (min interval is 150)
731  * ND router advertisements live for 600 seconds
732  * Hosts use stateless autoconfig for addresses
733  * ND router advertisements sent 19336
734  * ND router solicitations received 0
735  * ND router solicitations dropped 0
736  * @cliexend
737  * Example of output if IPv6 is not enabled on the interface:
738  * @cliexstart{show ip6 interface GigabitEthernet2/0/0}
739  * show ip6 interface: IPv6 not enabled on interface
740  * @cliexend
741 ?*/
742 /* *INDENT-OFF* */
744 {
745  .path = "show ip6 interface",
746  .function = ip6_link_show,
747  .short_help = "show ip6 interface <interface>",
748 };
749 /* *INDENT-ON* */
750 
751 static clib_error_t *
753  unformat_input_t * input, vlib_cli_command_t * cmd)
754 {
755  vnet_main_t *vnm = vnet_get_main ();
756  clib_error_t *error = NULL;
758 
759  sw_if_index = ~0;
760 
762  {
763  if (ip6_link_enable (sw_if_index, NULL))
764  error = clib_error_return (0, "Failed\n");
765  }
766  else
767  {
768  error = clib_error_return (0, "unknown interface\n'",
769  format_unformat_error, input);
770 
771  }
772  return error;
773 }
774 
775 /*?
776  * This command is used to enable IPv6 on a given interface.
777  *
778  * @cliexpar
779  * Example of how enable IPv6 on a given interface:
780  * @cliexcmd{enable ip6 interface GigabitEthernet2/0/0}
781 ?*/
782 /* *INDENT-OFF* */
784 {
785  .path = "enable ip6 interface",
786  .function = enable_ip6_interface_cmd,
787  .short_help = "enable ip6 interface <interface>",
788 };
789 /* *INDENT-ON* */
790 
791 static clib_error_t *
793  unformat_input_t * input, vlib_cli_command_t * cmd)
794 {
795  vnet_main_t *vnm = vnet_get_main ();
796  clib_error_t *error = NULL;
798 
799  sw_if_index = ~0;
800 
802  {
804  error = clib_error_return (0, "Failed\n");
805  }
806  else
807  {
808  error = clib_error_return (0, "unknown interface\n'",
809  format_unformat_error, input);
810 
811  }
812  return error;
813 }
814 
815 /*?
816  * This command is used to disable IPv6 on a given interface.
817  *
818  * @cliexpar
819  * Example of how disable IPv6 on a given interface:
820  * @cliexcmd{disable ip6 interface GigabitEthernet2/0/0}
821 ?*/
822 /* *INDENT-OFF* */
824 {
825  .path = "disable ip6 interface",
826  .function = disable_ip6_interface_cmd,
827  .short_help = "disable ip6 interface <interface>",
828 };
829 /* *INDENT-ON* */
830 
831 /*
832  * fd.io coding-style-patch-verification: ON
833  *
834  * Local Variables:
835  * eval: (c-set-style "gnu")
836  * End:
837  */
ip6_address_is_link_local_unicast
static uword ip6_address_is_link_local_unicast(const ip6_address_t *a)
Definition: ip6_packet.h:253
im
vnet_interface_main_t * im
Definition: interface_output.c:415
unformat_ethernet_address
uword unformat_ethernet_address(unformat_input_t *input, va_list *args)
Definition: format.c:233
ip_interface_address_get_address
static void * ip_interface_address_get_address(ip_lookup_main_t *lm, ip_interface_address_t *a)
Definition: ip_interface.h:43
mac
vl_api_mac_address_t mac
Definition: l2.api:559
unformat_user
uword unformat_user(unformat_input_t *input, unformat_function_t *func,...)
Definition: unformat.c:989
vnet_sw_interface_t::type
vnet_sw_interface_type_t type
Definition: interface.h:871
vnet_sw_interface_t
Definition: interface.h:869
ip6_address_is_global_unicast
static uword ip6_address_is_global_unicast(const ip6_address_t *a)
Definition: ip6_packet.h:267
clib_memcpy
#define clib_memcpy(d, s, n)
Definition: string.h:197
ADJ_INDEX_INVALID
#define ADJ_INDEX_INVALID
Invalid ADJ index - used when no adj is known likewise blazoned capitals INVALID speak volumes where ...
Definition: adj_types.h:36
pool_elt_at_index
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
Definition: pool.h:549
vlib_log_class_t
u32 vlib_log_class_t
Definition: vlib.h:52
format_ethernet_address
u8 * format_ethernet_address(u8 *s, va_list *args)
Definition: format.c:44
ip6_address_is_local_unicast
static uword ip6_address_is_local_unicast(const ip6_address_t *a)
Definition: ip6_packet.h:260
vlib_log_register_class
vlib_log_class_t vlib_log_register_class(char *class, char *subclass)
Definition: log.c:339
adj_mcast_add_or_lock
adj_index_t adj_mcast_add_or_lock(fib_protocol_t proto, vnet_link_t link_type, u32 sw_if_index)
Mcast Adjacency.
Definition: adj_mcast.c:51
adj_mcast.h
clib_error_return
#define clib_error_return(e, args...)
Definition: error.h:99
vlib_cli_command_t::path
char * path
Definition: cli.h:96
adj_unlock
void adj_unlock(adj_index_t adj_index)
Release a reference counting lock on the adjacency.
Definition: adj.c:358
vm
vlib_main_t * vm
X-connect all packets from the HOST to the PHY.
Definition: nat44_ei.c:3047
vnet_get_sw_interface
static vnet_sw_interface_t * vnet_get_sw_interface(vnet_main_t *vnm, u32 sw_if_index)
Definition: interface_funcs.h:58
ip6_ll_table_entry_delete
void ip6_ll_table_entry_delete(const ip6_ll_prefix_t *ilp)
Delete a IP6 link-local entry.
Definition: ip6_ll_table.c:140
ip6_ll_table_entry_update
fib_node_index_t ip6_ll_table_entry_update(const ip6_ll_prefix_t *ilp, fib_route_path_flags_t flags)
Update an entry in the table.
Definition: ip6_ll_table.c:106
unformat_input_t
struct _unformat_input_t unformat_input_t
ip6_ll_table.h
ethernet.h
error
Definition: cJSON.c:88
ip6_mfib.h
unformat
uword unformat(unformat_input_t *i, const char *fmt,...)
Definition: unformat.c:978
ip_lookup_main_t::if_address_pool_index_by_sw_if_index
u32 * if_address_pool_index_by_sw_if_index
Head of doubly linked list of interface addresses for each software interface.
Definition: lookup.h:131
vec_len
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
Definition: vec_bootstrap.h:142
ip6_mfib_interface_enable_disable
void ip6_mfib_interface_enable_disable(u32 sw_if_index, int is_enable)
Add/remove the interface from the accepting list of the special MFIB entries.
Definition: ip6_mfib.c:234
vec_add1
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
Definition: vec.h:606
vnet_get_main
vnet_main_t * vnet_get_main(void)
Definition: pnat_test_stubs.h:56
ip6_add_del_interface_address_callback_t
Definition: ip6.h:94
ip6_main_t::add_del_interface_address_callbacks
ip6_add_del_interface_address_callback_t * add_del_interface_address_callbacks
Definition: ip6.h:148
index_t
u32 index_t
A Data-Path Object is an object that represents actions that are applied to packets are they are swit...
Definition: dpo.h:43
uword
u64 uword
Definition: types.h:112
ethernet_interface
Definition: ethernet.h:146
format_unformat_error
u8 * format_unformat_error(u8 *s, va_list *va)
Definition: unformat.c:91
vec_validate
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment)
Definition: vec.h:523
mac_address_t_::bytes
u8 bytes[6]
Definition: mac_address.h:25
address
manual_print typedef address
Definition: ip_types.api:96
VLIB_CLI_COMMAND
#define VLIB_CLI_COMMAND(x,...)
Definition: cli.h:163
ip6_ll_prefix_t_
Aggregate type for a prefix in the IPv6 Link-local table.
Definition: ip6_ll_types.h:24
ip6_address_copy
static void ip6_address_copy(ip6_address_t *dst, const ip6_address_t *src)
Definition: ip6_packet.h:127
vlib_cli_output
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
Definition: cli.c:716
vnet_sw_interface_is_admin_up
static uword vnet_sw_interface_is_admin_up(vnet_main_t *vnm, u32 sw_if_index)
Definition: interface_funcs.h:265
ethernet_get_interface
ethernet_interface_t * ethernet_get_interface(ethernet_main_t *em, u32 hw_if_index)
Definition: interface.c:982
ip6_main
ip6_main_t ip6_main
Definition: ip6_forward.c:2785
id
u8 id[64]
Definition: dhcp.api:160
ethernet_interface_address::mac
mac_address_t mac
Definition: ethernet.h:139
vnet_main_t
Definition: vnet.h:76
vec_free
#define vec_free(V)
Free vector's memory (no header).
Definition: vec.h:395
ip6_add_del_interface_address_callback_t::function
ip6_add_del_interface_address_function_t * function
Definition: ip6.h:96
ethernet_main
ethernet_main_t ethernet_main
Definition: init.c:45
u64
unsigned long u64
Definition: types.h:89
format_vnet_sw_if_index_name
format_function_t format_vnet_sw_if_index_name
Definition: interface_funcs.h:458
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
ASSERT
#define ASSERT(truth)
Definition: error_bootstrap.h:69
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
u32
unsigned int u32
Definition: types.h:88
VLIB_INIT_FUNCTION
#define VLIB_INIT_FUNCTION(x)
Definition: init.h:172
FIB_PROTOCOL_IP6
@ FIB_PROTOCOL_IP6
Definition: fib_types.h:37
ip6_address_set_zero
static void ip6_address_set_zero(ip6_address_t *a)
Definition: ip6_packet.h:203
vec_foreach
#define vec_foreach(var, vec)
Vector iterator.
Definition: vec_bootstrap.h:213
ip6_sw_interface_enable_disable
void ip6_sw_interface_enable_disable(u32 sw_if_index, u32 is_enable)
Definition: ip6_forward.c:240
ip6_main_t::lookup_main
ip_lookup_main_t lookup_main
Definition: ip6.h:112
random_u64
static u64 random_u64(u64 *seed)
64-bit random number generator Again, constants courtesy of Donald Knuth.
Definition: random.h:126
ip6_main_t
Definition: ip6.h:110
ip_lookup_main_t
Definition: lookup.h:121
ip_lookup_main_t::if_address_pool
ip_interface_address_t * if_address_pool
Pool of addresses that are assigned to interfaces.
Definition: lookup.h:124
adj_index_t
u32 adj_index_t
An index for adjacencies.
Definition: adj_types.h:30
vlib_main_t
Definition: main.h:102
u8
unsigned char u8
Definition: types.h:56
clib_error_t
Definition: clib_error.h:21
a
a
Definition: bitmap.h:525
VNET_LINK_IP6
@ VNET_LINK_IP6
Definition: interface.h:348
ip
vl_api_address_t ip
Definition: l2.api:558
vlib_init_function_t
clib_error_t *() vlib_init_function_t(struct vlib_main_t *vm)
Definition: init.h:51
format_ip6_address
format_function_t format_ip6_address
Definition: format.h:91
i
int i
Definition: flowhash_template.h:376
ip6_ll_prefix_t_::ilp_addr
ip6_address_t ilp_addr
the IP6 address
Definition: ip6_ll_types.h:34
vnet_sw_interface_t::hw_if_index
u32 hw_if_index
Definition: interface.h:887
rv
int __clib_unused rv
Definition: application.c:491
ip6_address_is_zero
static uword ip6_address_is_zero(const ip6_address_t *a)
Definition: ip6_packet.h:226
ip_interface_address_t
Definition: lookup.h:89
VNET_SW_INTERFACE_TYPE_HARDWARE
@ VNET_SW_INTERFACE_TYPE_HARDWARE
Definition: interface.h:764
vnet_get_sup_sw_interface
static vnet_sw_interface_t * vnet_get_sup_sw_interface(vnet_main_t *vnm, u32 sw_if_index)
Definition: interface_funcs.h:81
vlib_cli_command_t
Definition: cli.h:92
clib_cpu_time_now
static u64 clib_cpu_time_now(void)
Definition: time.h:81
INDEX_INVALID
#define INDEX_INVALID
Invalid index - used when no index is known blazoned capitals INVALID speak volumes where ~0 does not...
Definition: dpo.h:49
sw_if_index
vl_api_interface_index_t sw_if_index
Definition: wireguard.api:34
ethernet_interface::address
ethernet_interface_address_t address
Definition: ethernet.h:173
FIB_ROUTE_PATH_LOCAL
@ FIB_ROUTE_PATH_LOCAL
A for-us/local path.
Definition: fib_types.h:344
format_white_space
u8 * format_white_space(u8 *s, va_list *va)
Definition: std-formats.c:129
format_vnet_sw_interface_name
format_function_t format_vnet_sw_interface_name
Definition: interface_funcs.h:456