FD.io VPP  v17.07-30-g839fa73
Vector Packet Processing
ip_api.c
Go to the documentation of this file.
1 /*
2  *------------------------------------------------------------------
3  * ip_api.c - vnet ip api
4  *
5  * Copyright (c) 2016 Cisco and/or its affiliates.
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at:
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *------------------------------------------------------------------
18  */
19 
20 #include <vnet/vnet.h>
21 #include <vlibmemory/api.h>
22 
23 #include <vnet/interface.h>
24 #include <vnet/api_errno.h>
25 #include <vnet/ethernet/ethernet.h>
26 #include <vnet/ip/ip.h>
27 #include <vnet/ip/ip6_neighbor.h>
28 #include <vnet/fib/fib_table.h>
29 #include <vnet/fib/fib_api.h>
30 #include <vnet/dpo/drop_dpo.h>
31 #include <vnet/dpo/receive_dpo.h>
32 #include <vnet/dpo/lookup_dpo.h>
33 #include <vnet/dpo/classify_dpo.h>
34 #include <vnet/dpo/ip_null_dpo.h>
36 #include <vnet/mfib/ip6_mfib.h>
37 #include <vnet/mfib/ip4_mfib.h>
38 #include <vnet/mfib/mfib_signal.h>
39 #include <vnet/mfib/mfib_entry.h>
40 
41 #include <vnet/vnet_msg_enum.h>
42 
43 #define vl_typedefs /* define message structures */
44 #include <vnet/vnet_all_api_h.h>
45 #undef vl_typedefs
46 
47 #define vl_endianfun /* define message structures */
48 #include <vnet/vnet_all_api_h.h>
49 #undef vl_endianfun
50 
51 /* instantiate all the print functions we know about */
52 #define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__)
53 #define vl_printfun
54 #include <vnet/vnet_all_api_h.h>
55 #undef vl_printfun
56 
58 
59 
60 #define foreach_ip_api_msg \
61 _(IP_FIB_DUMP, ip_fib_dump) \
62 _(IP6_FIB_DUMP, ip6_fib_dump) \
63 _(IP_MFIB_DUMP, ip_mfib_dump) \
64 _(IP6_MFIB_DUMP, ip6_mfib_dump) \
65 _(IP_NEIGHBOR_DUMP, ip_neighbor_dump) \
66 _(IP_MROUTE_ADD_DEL, ip_mroute_add_del) \
67 _(MFIB_SIGNAL_DUMP, mfib_signal_dump) \
68 _(IP_ADDRESS_DUMP, ip_address_dump) \
69 _(IP_DUMP, ip_dump) \
70 _(IP_NEIGHBOR_ADD_DEL, ip_neighbor_add_del) \
71 _(IP_ADD_DEL_ROUTE, ip_add_del_route) \
72 _(SET_IP_FLOW_HASH,set_ip_flow_hash) \
73 _(SW_INTERFACE_IP6ND_RA_CONFIG, sw_interface_ip6nd_ra_config) \
74 _(SW_INTERFACE_IP6ND_RA_PREFIX, sw_interface_ip6nd_ra_prefix) \
75 _(IP6ND_PROXY_ADD_DEL, ip6nd_proxy_add_del) \
76 _(IP6ND_PROXY_DUMP, ip6nd_proxy_dump) \
77 _(SW_INTERFACE_IP6_ENABLE_DISABLE, sw_interface_ip6_enable_disable ) \
78 _(SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS, \
79  sw_interface_ip6_set_link_local_address)
80 
81 extern void stats_dslock_with_hint (int hint, int tag);
82 extern void stats_dsunlock (void);
83 
84 static void
86  u8 is_static,
87  u8 * mac_address,
88  u8 * ip_address,
89  unix_shared_memory_queue_t * q, u32 context)
90 {
92 
93  mp = vl_msg_api_alloc (sizeof (*mp));
94  memset (mp, 0, sizeof (*mp));
95  mp->_vl_msg_id = ntohs (VL_API_IP_NEIGHBOR_DETAILS);
96  mp->context = context;
97  mp->is_ipv6 = is_ipv6;
98  mp->is_static = is_static;
99  memcpy (mp->mac_address, mac_address, 6);
100  memcpy (mp->ip_address, ip_address, (is_ipv6) ? 16 : 4);
101 
102  vl_msg_api_send_shmem (q, (u8 *) & mp);
103 }
104 
105 static void
107 {
109 
111  if (q == 0)
112  return;
113 
114  u32 sw_if_index = ntohl (mp->sw_if_index);
115 
116  if (mp->is_ipv6)
117  {
118  ip6_neighbor_t *n, *ns;
119 
120  ns = ip6_neighbors_entries (sw_if_index);
121  /* *INDENT-OFF* */
122  vec_foreach (n, ns)
123  {
125  (mp->is_ipv6, ((n->flags & IP6_NEIGHBOR_FLAG_STATIC) ? 1 : 0),
126  (u8 *) n->link_layer_address,
127  (u8 *) & (n->key.ip6_address.as_u8),
128  q, mp->context);
129  }
130  /* *INDENT-ON* */
131  vec_free (ns);
132  }
133  else
134  {
135  ethernet_arp_ip4_entry_t *n, *ns;
136 
137  ns = ip4_neighbor_entries (sw_if_index);
138  /* *INDENT-OFF* */
139  vec_foreach (n, ns)
140  {
142  ((n->flags & ETHERNET_ARP_IP4_ENTRY_FLAG_STATIC) ? 1 : 0),
143  (u8*) n->ethernet_address,
144  (u8*) & (n->ip4_address.as_u8),
145  q, mp->context);
146  }
147  /* *INDENT-ON* */
148  vec_free (ns);
149  }
150 }
151 
152 
153 void
154 copy_fib_next_hop (fib_route_path_encode_t * api_rpath, void *fp_arg)
155 {
156  int is_ip4;
157  vl_api_fib_path_t *fp = (vl_api_fib_path_t *) fp_arg;
158 
159  if (api_rpath->rpath.frp_proto == FIB_PROTOCOL_IP4)
160  fp->afi = IP46_TYPE_IP4;
161  else if (api_rpath->rpath.frp_proto == FIB_PROTOCOL_IP6)
162  fp->afi = IP46_TYPE_IP6;
163  else
164  {
165  is_ip4 = ip46_address_is_ip4 (&api_rpath->rpath.frp_addr);
166  if (is_ip4)
167  fp->afi = IP46_TYPE_IP4;
168  else
169  fp->afi = IP46_TYPE_IP6;
170  }
171  if (fp->afi == IP46_TYPE_IP4)
172  memcpy (fp->next_hop, &api_rpath->rpath.frp_addr.ip4,
173  sizeof (api_rpath->rpath.frp_addr.ip4));
174  else
175  memcpy (fp->next_hop, &api_rpath->rpath.frp_addr.ip6,
176  sizeof (api_rpath->rpath.frp_addr.ip6));
177 }
178 
179 static void
182  u32 table_id, fib_prefix_t * pfx,
183  fib_route_path_encode_t * api_rpaths, u32 context)
184 {
186  fib_route_path_encode_t *api_rpath;
187  vl_api_fib_path_t *fp;
188  int path_count;
189 
190  path_count = vec_len (api_rpaths);
191  mp = vl_msg_api_alloc (sizeof (*mp) + path_count * sizeof (*fp));
192  if (!mp)
193  return;
194  memset (mp, 0, sizeof (*mp));
195  mp->_vl_msg_id = ntohs (VL_API_IP_FIB_DETAILS);
196  mp->context = context;
197 
198  mp->table_id = htonl (table_id);
199  mp->address_length = pfx->fp_len;
200  memcpy (mp->address, &pfx->fp_addr.ip4, sizeof (pfx->fp_addr.ip4));
201 
202  mp->count = htonl (path_count);
203  fp = mp->path;
204  vec_foreach (api_rpath, api_rpaths)
205  {
206  memset (fp, 0, sizeof (*fp));
207  switch (api_rpath->dpo.dpoi_type)
208  {
209  case DPO_RECEIVE:
210  fp->is_local = true;
211  break;
212  case DPO_DROP:
213  fp->is_drop = true;
214  break;
215  case DPO_IP_NULL:
216  switch (api_rpath->dpo.dpoi_index)
217  {
218  case IP_NULL_ACTION_NONE:
219  fp->is_drop = true;
220  break;
222  fp->is_unreach = true;
223  break;
225  fp->is_prohibit = true;
226  break;
227  default:
228  break;
229  }
230  break;
231  default:
232  break;
233  }
234  fp->weight = htonl (api_rpath->rpath.frp_weight);
235  fp->sw_if_index = htonl (api_rpath->rpath.frp_sw_if_index);
236  copy_fib_next_hop (api_rpath, fp);
237  fp++;
238  }
239 
240  vl_msg_api_send_shmem (q, (u8 *) & mp);
241 }
242 
244 {
247 
248 static int
250 {
252 
253  vec_add1 (ctx->feis, fei);
254 
255  return (1);
256 }
257 
258 static void
260 {
263  ip4_main_t *im = &ip4_main;
264  fib_table_t *fib_table;
265  fib_node_index_t *lfeip;
266  fib_prefix_t pfx;
267  u32 fib_index;
268  fib_route_path_encode_t *api_rpaths;
270  .feis = NULL,
271  };
272 
274  if (q == 0)
275  return;
276 
277  /* *INDENT-OFF* */
278  pool_foreach (fib_table, im->fibs,
279  ({
280  fib_table_walk(fib_table->ft_index,
281  FIB_PROTOCOL_IP4,
282  vl_api_ip_fib_dump_walk,
283  &ctx);
284  }));
285  /* *INDENT-ON* */
286 
288 
289  vec_foreach (lfeip, ctx.feis)
290  {
291  fib_entry_get_prefix (*lfeip, &pfx);
292  fib_index = fib_entry_get_fib_index (*lfeip);
293  fib_table = fib_table_get (fib_index, pfx.fp_proto);
294  api_rpaths = NULL;
295  fib_entry_encode (*lfeip, &api_rpaths);
296  send_ip_fib_details (am, q,
297  fib_table->ft_table_id, &pfx, api_rpaths,
298  mp->context);
299  vec_free (api_rpaths);
300  }
301 
302  vec_free (ctx.feis);
303 }
304 
305 static void
308  u32 table_id, fib_prefix_t * pfx,
309  fib_route_path_encode_t * api_rpaths, u32 context)
310 {
312  fib_route_path_encode_t *api_rpath;
313  vl_api_fib_path_t *fp;
314  int path_count;
315 
316  path_count = vec_len (api_rpaths);
317  mp = vl_msg_api_alloc (sizeof (*mp) + path_count * sizeof (*fp));
318  if (!mp)
319  return;
320  memset (mp, 0, sizeof (*mp));
321  mp->_vl_msg_id = ntohs (VL_API_IP6_FIB_DETAILS);
322  mp->context = context;
323 
324  mp->table_id = htonl (table_id);
325  mp->address_length = pfx->fp_len;
326  memcpy (mp->address, &pfx->fp_addr.ip6, sizeof (pfx->fp_addr.ip6));
327 
328  mp->count = htonl (path_count);
329  fp = mp->path;
330  vec_foreach (api_rpath, api_rpaths)
331  {
332  memset (fp, 0, sizeof (*fp));
333  switch (api_rpath->dpo.dpoi_type)
334  {
335  case DPO_RECEIVE:
336  fp->is_local = true;
337  break;
338  case DPO_DROP:
339  fp->is_drop = true;
340  break;
341  case DPO_IP_NULL:
342  switch (api_rpath->dpo.dpoi_index)
343  {
345  fp->is_drop = true;
346  break;
348  fp->is_unreach = true;
349  break;
351  fp->is_prohibit = true;
352  break;
353  default:
354  break;
355  }
356  break;
357  default:
358  break;
359  }
360  fp->weight = htonl (api_rpath->rpath.frp_weight);
361  fp->sw_if_index = htonl (api_rpath->rpath.frp_sw_if_index);
362  copy_fib_next_hop (api_rpath, fp);
363  fp++;
364  }
365 
366  vl_msg_api_send_shmem (q, (u8 *) & mp);
367 }
368 
370 {
374 
375 static void
377 {
378  api_ip6_fib_show_ctx_t *ctx = arg;
379 
380  if ((kvp->key[2] >> 32) == ctx->fib_index)
381  {
382  vec_add1 (ctx->entries, kvp->value);
383  }
384 }
385 
386 static void
389  fib_table_t * fib_table)
390 {
392  ip6_main_t *im6 = &ip6_main;
393  fib_node_index_t *fib_entry_index;
394  api_ip6_fib_show_ctx_t ctx = {
395  .fib_index = fib_table->ft_index,
396  .entries = NULL,
397  };
398  fib_route_path_encode_t *api_rpaths;
399  fib_prefix_t pfx;
400 
402  ((BVT (clib_bihash) *) & im6->ip6_table[IP6_FIB_TABLE_NON_FWDING].
403  ip6_hash, api_ip6_fib_table_put_entries, &ctx);
404 
406 
407  vec_foreach (fib_entry_index, ctx.entries)
408  {
409  fib_entry_get_prefix (*fib_entry_index, &pfx);
410  api_rpaths = NULL;
411  fib_entry_encode (*fib_entry_index, &api_rpaths);
412  send_ip6_fib_details (am, q,
413  fib_table->ft_table_id,
414  &pfx, api_rpaths, mp->context);
415  vec_free (api_rpaths);
416  }
417 
418  vec_free (ctx.entries);
419 }
420 
421 static void
423 {
425  ip6_main_t *im6 = &ip6_main;
426  fib_table_t *fib_table;
427 
429  if (q == 0)
430  return;
431 
432  /* *INDENT-OFF* */
433  pool_foreach (fib_table, im6->fibs,
434  ({
435  api_ip6_fib_table_get_all(q, mp, fib_table);
436  }));
437  /* *INDENT-ON* */
438 }
439 
440 static void
442  u32 context, u32 table_id, fib_node_index_t mfei)
443 {
444  fib_route_path_encode_t *api_rpath, *api_rpaths = NULL;
446  mfib_entry_t *mfib_entry;
447  vl_api_fib_path_t *fp;
448  mfib_prefix_t pfx;
449  int path_count;
450 
451  mfib_entry = mfib_entry_get (mfei);
452  mfib_entry_get_prefix (mfei, &pfx);
453  mfib_entry_encode (mfei, &api_rpaths);
454 
455  path_count = vec_len (api_rpaths);
456  mp = vl_msg_api_alloc (sizeof (*mp) + path_count * sizeof (*fp));
457  if (!mp)
458  return;
459  memset (mp, 0, sizeof (*mp));
460  mp->_vl_msg_id = ntohs (VL_API_IP_FIB_DETAILS);
461  mp->context = context;
462 
463  mp->rpf_id = mfib_entry->mfe_rpf_id;
464  mp->entry_flags = mfib_entry->mfe_flags;
465  mp->table_id = htonl (table_id);
466  mp->address_length = pfx.fp_len;
467  memcpy (mp->grp_address, &pfx.fp_grp_addr.ip4,
468  sizeof (pfx.fp_grp_addr.ip4));
469  memcpy (mp->src_address, &pfx.fp_src_addr.ip4,
470  sizeof (pfx.fp_src_addr.ip4));
471 
472  mp->count = htonl (path_count);
473  fp = mp->path;
474  vec_foreach (api_rpath, api_rpaths)
475  {
476  memset (fp, 0, sizeof (*fp));
477 
478  fp->weight = 0;
479  fp->sw_if_index = htonl (api_rpath->rpath.frp_sw_if_index);
480  copy_fib_next_hop (api_rpath, fp);
481  fp++;
482  }
483  vec_free (api_rpaths);
484 
485  vl_msg_api_send_shmem (q, (u8 *) & mp);
486 }
487 
489 {
492 
493 static int
495 {
496  vl_api_ip_mfib_dump_ctc_t *ctx = arg;
497 
498  vec_add1 (ctx->entries, fei);
499 
500  return (0);
501 }
502 
503 static void
505 {
507  ip4_main_t *im = &ip4_main;
508  mfib_table_t *mfib_table;
509  fib_node_index_t *mfeip;
511  .entries = NULL,
512  };
513 
515  if (q == 0)
516  return;
517 
518 
519  /* *INDENT-OFF* */
520  pool_foreach (mfib_table, im->mfibs,
521  ({
522  ip4_mfib_table_walk(&mfib_table->v4,
523  vl_api_ip_mfib_table_dump_walk,
524  &ctx);
525 
526  vec_sort_with_function (ctx.entries, mfib_entry_cmp_for_sort);
527 
528  vec_foreach (mfeip, ctx.entries)
529  {
530  send_ip_mfib_details (q, mp->context,
531  mfib_table->mft_table_id,
532  *mfeip);
533  }
535 
536  }));
537  /* *INDENT-ON* */
538 
539  vec_free (ctx.entries);
540 }
541 
542 static void
545  u32 table_id,
546  mfib_prefix_t * pfx,
547  fib_route_path_encode_t * api_rpaths, u32 context)
548 {
550  fib_route_path_encode_t *api_rpath;
551  vl_api_fib_path_t *fp;
552  int path_count;
553 
554  path_count = vec_len (api_rpaths);
555  mp = vl_msg_api_alloc (sizeof (*mp) + path_count * sizeof (*fp));
556  if (!mp)
557  return;
558  memset (mp, 0, sizeof (*mp));
559  mp->_vl_msg_id = ntohs (VL_API_IP6_FIB_DETAILS);
560  mp->context = context;
561 
562  mp->table_id = htonl (table_id);
563  mp->address_length = pfx->fp_len;
564  memcpy (mp->grp_address, &pfx->fp_grp_addr.ip6,
565  sizeof (pfx->fp_grp_addr.ip6));
566  memcpy (mp->src_address, &pfx->fp_src_addr.ip6,
567  sizeof (pfx->fp_src_addr.ip6));
568 
569  mp->count = htonl (path_count);
570  fp = mp->path;
571  vec_foreach (api_rpath, api_rpaths)
572  {
573  memset (fp, 0, sizeof (*fp));
574 
575  fp->weight = 0;
576  fp->sw_if_index = htonl (api_rpath->rpath.frp_sw_if_index);
577  copy_fib_next_hop (api_rpath, fp);
578  fp++;
579  }
580 
581  vl_msg_api_send_shmem (q, (u8 *) & mp);
582 }
583 
585 {
588 
589 static int
591 {
592  vl_api_ip6_mfib_dump_ctc_t *ctx = arg;
593 
594  vec_add1 (ctx->entries, fei);
595 
596  return (0);
597 }
598 
599 static void
601 {
604  ip6_main_t *im = &ip6_main;
605  mfib_table_t *mfib_table;
606  fib_node_index_t *mfeip;
607  mfib_prefix_t pfx;
608  fib_route_path_encode_t *api_rpaths = NULL;
610  .entries = NULL,
611  };
612 
614  if (q == 0)
615  return;
616 
617 
618  /* *INDENT-OFF* */
619  pool_foreach (mfib_table, im->mfibs,
620  ({
621  ip6_mfib_table_walk(&mfib_table->v6,
622  vl_api_ip6_mfib_table_dump_walk,
623  &ctx);
624 
625  vec_sort_with_function (ctx.entries, mfib_entry_cmp_for_sort);
626 
627  vec_foreach(mfeip, ctx.entries)
628  {
629  mfib_entry_get_prefix (*mfeip, &pfx);
630  mfib_entry_encode (*mfeip, &api_rpaths);
631  send_ip6_mfib_details (am, q,
632  mfib_table->mft_table_id,
633  &pfx, api_rpaths,
634  mp->context);
635  }
636  vec_reset_length (api_rpaths);
638 
639  }));
640  /* *INDENT-ON* */
641 
642  vec_free (ctx.entries);
643  vec_free (api_rpaths);
644 }
645 
646 static void
648  vlib_main_t * vm)
649 {
650  vl_api_ip_neighbor_add_del_reply_t *rmp;
651  vnet_main_t *vnm = vnet_get_main ();
652  int rv = 0;
653 
655 
656  stats_dslock_with_hint (1 /* release hint */ , 7 /* tag */ );
657 
658  /*
659  * there's no validation here of the ND/ARP entry being added.
660  * The expectation is that the FIB will ensure that nothing bad
661  * will come of adding bogus entries.
662  */
663  if (mp->is_ipv6)
664  {
665  if (mp->is_add)
667  (vm, ntohl (mp->sw_if_index),
668  (ip6_address_t *) (mp->dst_address),
669  mp->mac_address, sizeof (mp->mac_address), mp->is_static,
670  mp->is_no_adj_fib);
671  else
673  (vm, ntohl (mp->sw_if_index),
674  (ip6_address_t *) (mp->dst_address),
675  mp->mac_address, sizeof (mp->mac_address));
676  }
677  else
678  {
679  ethernet_arp_ip4_over_ethernet_address_t a;
680 
681  clib_memcpy (&a.ethernet, mp->mac_address, 6);
682  clib_memcpy (&a.ip4, mp->dst_address, 4);
683 
684  if (mp->is_add)
685  rv = vnet_arp_set_ip4_over_ethernet (vnm, ntohl (mp->sw_if_index),
686  &a, mp->is_static,
687  mp->is_no_adj_fib);
688  else
689  rv =
690  vnet_arp_unset_ip4_over_ethernet (vnm, ntohl (mp->sw_if_index), &a);
691  }
692 
694 
695  stats_dsunlock ();
696  REPLY_MACRO (VL_API_IP_NEIGHBOR_ADD_DEL_REPLY);
697 }
698 
699 int
701  u8 is_add,
702  u8 is_drop,
703  u8 is_unreach,
704  u8 is_prohibit,
705  u8 is_local,
706  u8 is_multicast,
707  u8 is_classify,
708  u32 classify_table_index,
709  u8 is_resolve_host,
710  u8 is_resolve_attached,
711  u8 is_interface_rx,
712  u8 is_rpf_id,
713  u32 fib_index,
714  const fib_prefix_t * prefix,
715  u8 next_hop_proto_is_ip4,
716  const ip46_address_t * next_hop,
717  u32 next_hop_sw_if_index,
718  u8 next_hop_fib_index,
719  u32 next_hop_weight,
720  mpls_label_t next_hop_via_label,
721  mpls_label_t * next_hop_out_label_stack)
722 {
725  fib_route_path_t path = {
726  .frp_proto = (next_hop_proto_is_ip4 ?
728  .frp_addr = (NULL == next_hop ? zero_addr : *next_hop),
729  .frp_sw_if_index = next_hop_sw_if_index,
730  .frp_fib_index = next_hop_fib_index,
731  .frp_weight = next_hop_weight,
732  .frp_label_stack = next_hop_out_label_stack,
733  };
734  fib_route_path_t *paths = NULL;
736 
737  if (MPLS_LABEL_INVALID != next_hop_via_label)
738  {
740  path.frp_local_label = next_hop_via_label;
741  path.frp_eos = MPLS_NON_EOS;
742  }
743  if (is_resolve_host)
744  path_flags |= FIB_ROUTE_PATH_RESOLVE_VIA_HOST;
745  if (is_resolve_attached)
747  if (is_interface_rx)
748  path_flags |= FIB_ROUTE_PATH_INTF_RX;
749  if (is_rpf_id)
750  path_flags |= FIB_ROUTE_PATH_RPF_ID;
751  if (is_multicast)
752  entry_flags |= FIB_ENTRY_FLAG_MULTICAST;
753 
754  path.frp_flags = path_flags;
755 
756  if (is_multipath)
757  {
758  stats_dslock_with_hint (1 /* release hint */ , 10 /* tag */ );
759 
760 
761  vec_add1 (paths, path);
762 
763  if (is_add)
764  fib_table_entry_path_add2 (fib_index,
765  prefix,
766  FIB_SOURCE_API, entry_flags, paths);
767  else
768  fib_table_entry_path_remove2 (fib_index,
769  prefix, FIB_SOURCE_API, paths);
770 
771  vec_free (paths);
772  stats_dsunlock ();
773  return 0;
774  }
775 
776  stats_dslock_with_hint (1 /* release hint */ , 2 /* tag */ );
777 
778  if (is_drop || is_local || is_classify || is_unreach || is_prohibit)
779  {
780  /*
781  * special route types that link directly to the adj
782  */
783  if (is_add)
784  {
785  dpo_id_t dpo = DPO_INVALID;
786  dpo_proto_t dproto;
787 
788  dproto = fib_proto_to_dpo (prefix->fp_proto);
789 
790  if (is_drop)
792  else if (is_local)
793  receive_dpo_add_or_lock (dproto, ~0, NULL, &dpo);
794  else if (is_unreach)
795  ip_null_dpo_add_and_lock (dproto,
797  else if (is_prohibit)
798  ip_null_dpo_add_and_lock (dproto,
800  &dpo);
801  else if (is_classify)
802  {
803  if (pool_is_free_index (cm->tables,
804  ntohl (classify_table_index)))
805  {
806  stats_dsunlock ();
807  return VNET_API_ERROR_NO_SUCH_TABLE;
808  }
809 
810  dpo_set (&dpo, DPO_CLASSIFY, dproto,
811  classify_dpo_create (dproto,
812  ntohl (classify_table_index)));
813  }
814  else
815  {
816  stats_dsunlock ();
817  return VNET_API_ERROR_NO_SUCH_TABLE;
818  }
819 
821  prefix,
824  dpo_reset (&dpo);
825  }
826  else
827  {
828  fib_table_entry_special_remove (fib_index, prefix, FIB_SOURCE_API);
829  }
830  }
831  else
832  {
833  if (is_add)
834  {
835  vec_add1 (paths, path);
836  fib_table_entry_update (fib_index,
837  prefix, FIB_SOURCE_API, entry_flags, paths);
838  vec_free (paths);
839  }
840  else
841  {
842  fib_table_entry_delete (fib_index, prefix, FIB_SOURCE_API);
843  }
844  }
845 
846  stats_dsunlock ();
847  return (0);
848 }
849 
850 int
852  u32 table_id,
853  u32 next_hop_sw_if_index,
854  fib_protocol_t next_hop_table_proto,
855  u32 next_hop_table_id,
856  u8 create_missing_tables,
857  u8 is_rpf_id, u32 * fib_index, u32 * next_hop_fib_index)
858 {
859  vnet_main_t *vnm = vnet_get_main ();
860 
861  *fib_index = fib_table_find (table_proto, ntohl (table_id));
862  if (~0 == *fib_index)
863  {
864  if (create_missing_tables)
865  {
866  *fib_index = fib_table_find_or_create_and_lock (table_proto,
867  ntohl (table_id));
868  }
869  else
870  {
871  /* No such VRF, and we weren't asked to create one */
872  return VNET_API_ERROR_NO_SUCH_FIB;
873  }
874  }
875 
876  if (!is_rpf_id && ~0 != ntohl (next_hop_sw_if_index))
877  {
879  ntohl (next_hop_sw_if_index)))
880  {
881  return VNET_API_ERROR_NO_MATCHING_INTERFACE;
882  }
883  }
884  else
885  {
886  if (is_rpf_id)
887  *next_hop_fib_index = mfib_table_find (next_hop_table_proto,
888  ntohl (next_hop_table_id));
889  else
890  *next_hop_fib_index = fib_table_find (next_hop_table_proto,
891  ntohl (next_hop_table_id));
892 
893  if (~0 == *next_hop_fib_index)
894  {
895  if (create_missing_tables)
896  {
897  if (is_rpf_id)
898  *next_hop_fib_index =
899  mfib_table_find_or_create_and_lock (next_hop_table_proto,
900  ntohl
901  (next_hop_table_id));
902  else
903  *next_hop_fib_index =
904  fib_table_find_or_create_and_lock (next_hop_table_proto,
905  ntohl
906  (next_hop_table_id));
907  }
908  else
909  {
910  /* No such VRF, and we weren't asked to create one */
911  return VNET_API_ERROR_NO_SUCH_FIB;
912  }
913  }
914  }
915 
916  return (0);
917 }
918 
919 static int
921 {
922  u32 fib_index, next_hop_fib_index;
923  mpls_label_t *label_stack = NULL;
924  int rv, ii, n_labels;;
925 
927  mp->table_id,
930  mp->next_hop_table_id,
931  mp->create_vrf_if_needed, 0,
932  &fib_index, &next_hop_fib_index);
933 
934  if (0 != rv)
935  return (rv);
936 
937  fib_prefix_t pfx = {
938  .fp_len = mp->dst_address_length,
939  .fp_proto = FIB_PROTOCOL_IP4,
940  };
941  clib_memcpy (&pfx.fp_addr.ip4, mp->dst_address, sizeof (pfx.fp_addr.ip4));
942 
943  ip46_address_t nh;
944  memset (&nh, 0, sizeof (nh));
945  memcpy (&nh.ip4, mp->next_hop_address, sizeof (nh.ip4));
946 
947  n_labels = mp->next_hop_n_out_labels;
948  if (n_labels == 0)
949  ;
950  else if (1 == n_labels)
951  vec_add1 (label_stack, ntohl (mp->next_hop_out_label_stack[0]));
952  else
953  {
954  vec_validate (label_stack, n_labels - 1);
955  for (ii = 0; ii < n_labels; ii++)
956  label_stack[ii] = ntohl (mp->next_hop_out_label_stack[ii]);
957  }
958 
960  mp->is_add,
961  mp->is_drop,
962  mp->is_unreach,
963  mp->is_prohibit,
964  mp->is_local, 0,
965  mp->is_classify,
967  mp->is_resolve_host,
968  mp->is_resolve_attached, 0, 0,
969  fib_index, &pfx, 1,
970  &nh,
971  ntohl (mp->next_hop_sw_if_index),
972  next_hop_fib_index,
973  mp->next_hop_weight,
974  ntohl (mp->next_hop_via_label),
975  label_stack));
976 }
977 
978 static int
980 {
981  u32 fib_index, next_hop_fib_index;
982  mpls_label_t *label_stack = NULL;
983  int rv, ii, n_labels;;
984 
986  mp->table_id,
989  mp->next_hop_table_id,
990  mp->create_vrf_if_needed, 0,
991  &fib_index, &next_hop_fib_index);
992 
993  if (0 != rv)
994  return (rv);
995 
996  fib_prefix_t pfx = {
997  .fp_len = mp->dst_address_length,
998  .fp_proto = FIB_PROTOCOL_IP6,
999  };
1000  clib_memcpy (&pfx.fp_addr.ip6, mp->dst_address, sizeof (pfx.fp_addr.ip6));
1001 
1002  ip46_address_t nh;
1003  memset (&nh, 0, sizeof (nh));
1004  memcpy (&nh.ip6, mp->next_hop_address, sizeof (nh.ip6));
1005 
1006  n_labels = mp->next_hop_n_out_labels;
1007  if (n_labels == 0)
1008  ;
1009  else if (1 == n_labels)
1010  vec_add1 (label_stack, ntohl (mp->next_hop_out_label_stack[0]));
1011  else
1012  {
1013  vec_validate (label_stack, n_labels - 1);
1014  for (ii = 0; ii < n_labels; ii++)
1015  label_stack[ii] = ntohl (mp->next_hop_out_label_stack[ii]);
1016  }
1017 
1019  mp->is_add,
1020  mp->is_drop,
1021  mp->is_unreach,
1022  mp->is_prohibit,
1023  mp->is_local, 0,
1024  mp->is_classify,
1026  mp->is_resolve_host,
1027  mp->is_resolve_attached, 0, 0,
1028  fib_index, &pfx, 0,
1029  &nh, ntohl (mp->next_hop_sw_if_index),
1030  next_hop_fib_index,
1031  mp->next_hop_weight,
1032  ntohl (mp->next_hop_via_label),
1033  label_stack));
1034 }
1035 
1036 void
1038 {
1039  vl_api_ip_add_del_route_reply_t *rmp;
1040  int rv;
1041  vnet_main_t *vnm = vnet_get_main ();
1042 
1043  vnm->api_errno = 0;
1044 
1045  if (mp->is_ipv6)
1046  rv = ip6_add_del_route_t_handler (mp);
1047  else
1048  rv = ip4_add_del_route_t_handler (mp);
1049 
1050  rv = (rv == 0) ? vnm->api_errno : rv;
1051 
1052  REPLY_MACRO (VL_API_IP_ADD_DEL_ROUTE_REPLY);
1053 }
1054 
1055 static int
1057  u32 table_id,
1058  u32 next_hop_sw_if_index,
1059  u8 is_local, u8 create_missing_tables, u32 * fib_index)
1060 {
1061  vnet_main_t *vnm = vnet_get_main ();
1062 
1063  *fib_index = mfib_table_find (table_proto, ntohl (table_id));
1064  if (~0 == *fib_index)
1065  {
1066  if (create_missing_tables)
1067  {
1068  *fib_index = mfib_table_find_or_create_and_lock (table_proto,
1069  ntohl (table_id));
1070  }
1071  else
1072  {
1073  /* No such VRF, and we weren't asked to create one */
1074  return VNET_API_ERROR_NO_SUCH_FIB;
1075  }
1076  }
1077 
1078  if (~0 != ntohl (next_hop_sw_if_index))
1079  {
1081  ntohl (next_hop_sw_if_index)))
1082  {
1083  return VNET_API_ERROR_NO_MATCHING_INTERFACE;
1084  }
1085  }
1086 
1087  return (0);
1088 }
1089 
1090 static int
1092  u8 is_local,
1093  u32 fib_index,
1094  const mfib_prefix_t * prefix,
1095  u32 entry_flags,
1096  fib_rpf_id_t rpf_id,
1097  u32 next_hop_sw_if_index, u32 itf_flags)
1098 {
1099  stats_dslock_with_hint (1 /* release hint */ , 2 /* tag */ );
1100 
1101  fib_route_path_t path = {
1102  .frp_sw_if_index = next_hop_sw_if_index,
1103  .frp_proto = prefix->fp_proto,
1104  };
1105 
1106  if (is_local)
1108 
1109 
1110  if (!is_local && ~0 == next_hop_sw_if_index)
1111  {
1112  mfib_table_entry_update (fib_index, prefix,
1113  MFIB_SOURCE_API, rpf_id, entry_flags);
1114  }
1115  else
1116  {
1117  if (is_add)
1118  {
1119  mfib_table_entry_path_update (fib_index, prefix,
1120  MFIB_SOURCE_API, &path, itf_flags);
1121  }
1122  else
1123  {
1124  mfib_table_entry_path_remove (fib_index, prefix,
1125  MFIB_SOURCE_API, &path);
1126  }
1127  }
1128 
1129  stats_dsunlock ();
1130  return (0);
1131 }
1132 
1133 static int
1135 {
1136  fib_protocol_t fproto;
1137  u32 fib_index;
1138  int rv;
1139 
1140  fproto = (mp->is_ipv6 ? FIB_PROTOCOL_IP6 : FIB_PROTOCOL_IP4);
1141  rv = add_del_mroute_check (fproto,
1142  mp->table_id,
1144  mp->is_local,
1145  mp->create_vrf_if_needed, &fib_index);
1146 
1147  if (0 != rv)
1148  return (rv);
1149 
1150  mfib_prefix_t pfx = {
1151  .fp_len = ntohs (mp->grp_address_length),
1152  .fp_proto = fproto,
1153  };
1154 
1155  if (FIB_PROTOCOL_IP4 == fproto)
1156  {
1157  clib_memcpy (&pfx.fp_grp_addr.ip4, mp->grp_address,
1158  sizeof (pfx.fp_grp_addr.ip4));
1159  clib_memcpy (&pfx.fp_src_addr.ip4, mp->src_address,
1160  sizeof (pfx.fp_src_addr.ip4));
1161  }
1162  else
1163  {
1164  clib_memcpy (&pfx.fp_grp_addr.ip6, mp->grp_address,
1165  sizeof (pfx.fp_grp_addr.ip6));
1166  clib_memcpy (&pfx.fp_src_addr.ip6, mp->src_address,
1167  sizeof (pfx.fp_src_addr.ip6));
1168  }
1169 
1170  return (mroute_add_del_handler (mp->is_add,
1171  mp->is_local,
1172  fib_index, &pfx,
1173  ntohl (mp->entry_flags),
1174  ntohl (mp->rpf_id),
1175  ntohl (mp->next_hop_sw_if_index),
1176  ntohl (mp->itf_flags)));
1177 }
1178 
1179 void
1181 {
1182  vl_api_ip_mroute_add_del_reply_t *rmp;
1183  int rv;
1184  vnet_main_t *vnm = vnet_get_main ();
1185 
1186  vnm->api_errno = 0;
1187 
1188  rv = api_mroute_add_del_t_handler (mp);
1189 
1190  rv = (rv == 0) ? vnm->api_errno : rv;
1191 
1192  REPLY_MACRO (VL_API_IP_MROUTE_ADD_DEL_REPLY);
1193 }
1194 
1195 static void
1197  unix_shared_memory_queue_t * q, u32 sw_if_index,
1198  u8 is_ipv6, u32 context)
1199 {
1200  vl_api_ip_details_t *mp;
1201 
1202  mp = vl_msg_api_alloc (sizeof (*mp));
1203  memset (mp, 0, sizeof (*mp));
1204  mp->_vl_msg_id = ntohs (VL_API_IP_DETAILS);
1205 
1206  mp->sw_if_index = ntohl (sw_if_index);
1207  mp->is_ipv6 = is_ipv6;
1208  mp->context = context;
1209 
1210  vl_msg_api_send_shmem (q, (u8 *) & mp);
1211 }
1212 
1213 static void
1216  u8 * ip, u16 prefix_length,
1217  u32 sw_if_index, u8 is_ipv6, u32 context)
1218 {
1220 
1221  mp = vl_msg_api_alloc (sizeof (*mp));
1222  memset (mp, 0, sizeof (*mp));
1223  mp->_vl_msg_id = ntohs (VL_API_IP_ADDRESS_DETAILS);
1224 
1225  if (is_ipv6)
1226  {
1227  clib_memcpy (&mp->ip, ip, sizeof (mp->ip));
1228  }
1229  else
1230  {
1231  u32 *tp = (u32 *) mp->ip;
1232  *tp = *(u32 *) ip;
1233  }
1234  mp->prefix_length = prefix_length;
1235  mp->context = context;
1236  mp->sw_if_index = htonl (sw_if_index);
1237  mp->is_ipv6 = is_ipv6;
1238 
1239  vl_msg_api_send_shmem (q, (u8 *) & mp);
1240 }
1241 
1242 static void
1244 {
1247  ip6_address_t *r6;
1248  ip4_address_t *r4;
1249  ip6_main_t *im6 = &ip6_main;
1250  ip4_main_t *im4 = &ip4_main;
1251  ip_lookup_main_t *lm6 = &im6->lookup_main;
1252  ip_lookup_main_t *lm4 = &im4->lookup_main;
1253  ip_interface_address_t *ia = 0;
1254  u32 sw_if_index = ~0;
1255  int rv __attribute__ ((unused)) = 0;
1256 
1257  VALIDATE_SW_IF_INDEX (mp);
1258 
1259  sw_if_index = ntohl (mp->sw_if_index);
1260 
1262  if (q == 0)
1263  return;
1264 
1265  if (mp->is_ipv6)
1266  {
1267  /* *INDENT-OFF* */
1268  foreach_ip_interface_address (lm6, ia, sw_if_index,
1269  1 /* honor unnumbered */,
1270  ({
1271  r6 = ip_interface_address_get_address (lm6, ia);
1272  u16 prefix_length = ia->address_length;
1273  send_ip_address_details(am, q, (u8*)r6, prefix_length,
1274  sw_if_index, 1, mp->context);
1275  }));
1276  /* *INDENT-ON* */
1277  }
1278  else
1279  {
1280  /* *INDENT-OFF* */
1281  foreach_ip_interface_address (lm4, ia, sw_if_index,
1282  1 /* honor unnumbered */,
1283  ({
1284  r4 = ip_interface_address_get_address (lm4, ia);
1285  u16 prefix_length = ia->address_length;
1286  send_ip_address_details(am, q, (u8*)r4, prefix_length,
1287  sw_if_index, 0, mp->context);
1288  }));
1289  /* *INDENT-ON* */
1290  }
1292 }
1293 
1294 static void
1296 {
1298  vnet_main_t *vnm = vnet_get_main ();
1299  vlib_main_t *vm = vlib_get_main ();
1302  vnet_sw_interface_t *si, *sorted_sis;
1303  u32 sw_if_index = ~0;
1304 
1306  if (q == 0)
1307  {
1308  return;
1309  }
1310 
1311  /* Gather interfaces. */
1312  sorted_sis = vec_new (vnet_sw_interface_t, pool_elts (im->sw_interfaces));
1313  _vec_len (sorted_sis) = 0;
1314  /* *INDENT-OFF* */
1315  pool_foreach (si, im->sw_interfaces,
1316  ({
1317  vec_add1 (sorted_sis, si[0]);
1318  }));
1319  /* *INDENT-ON* */
1320 
1321  vec_foreach (si, sorted_sis)
1322  {
1324  {
1325  if (mp->is_ipv6 && !ip6_interface_enabled (vm, si->sw_if_index))
1326  {
1327  continue;
1328  }
1329  sw_if_index = si->sw_if_index;
1330  send_ip_details (am, q, sw_if_index, mp->is_ipv6, mp->context);
1331  }
1332  }
1333 }
1334 
1335 static void
1337 {
1338  vl_api_set_ip_flow_hash_reply_t *rmp;
1339  int rv;
1340  u32 table_id;
1341  flow_hash_config_t flow_hash_config = 0;
1342 
1343  table_id = ntohl (mp->vrf_id);
1344 
1345 #define _(a,b) if (mp->a) flow_hash_config |= b;
1347 #undef _
1348 
1349  rv = vnet_set_ip6_flow_hash (table_id, flow_hash_config);
1350 
1351  REPLY_MACRO (VL_API_SET_IP_FLOW_HASH_REPLY);
1352 }
1353 
1354 static void
1356 {
1357  vl_api_set_ip_flow_hash_reply_t *rmp;
1358  int rv;
1359  u32 table_id;
1360  flow_hash_config_t flow_hash_config = 0;
1361 
1362  table_id = ntohl (mp->vrf_id);
1363 
1364 #define _(a,b) if (mp->a) flow_hash_config |= b;
1366 #undef _
1367 
1368  rv = vnet_set_ip4_flow_hash (table_id, flow_hash_config);
1369 
1370  REPLY_MACRO (VL_API_SET_IP_FLOW_HASH_REPLY);
1371 }
1372 
1373 
1374 static void
1376 {
1377  if (mp->is_ipv6 == 0)
1378  set_ip4_flow_hash (mp);
1379  else
1380  set_ip6_flow_hash (mp);
1381 }
1382 
1383 static void
1386 {
1387  vl_api_sw_interface_ip6nd_ra_config_reply_t *rmp;
1388  vlib_main_t *vm = vlib_get_main ();
1389  int rv = 0;
1390  u8 is_no, suppress, managed, other, ll_option, send_unicast, cease,
1391  default_router;
1392 
1393  is_no = mp->is_no == 1;
1394  suppress = mp->suppress == 1;
1395  managed = mp->managed == 1;
1396  other = mp->other == 1;
1397  ll_option = mp->ll_option == 1;
1398  send_unicast = mp->send_unicast == 1;
1399  cease = mp->cease == 1;
1400  default_router = mp->default_router == 1;
1401 
1402  VALIDATE_SW_IF_INDEX (mp);
1403 
1404  rv = ip6_neighbor_ra_config (vm, ntohl (mp->sw_if_index),
1405  suppress, managed, other,
1406  ll_option, send_unicast, cease,
1407  default_router, ntohl (mp->lifetime),
1408  ntohl (mp->initial_count),
1409  ntohl (mp->initial_interval),
1410  ntohl (mp->max_interval),
1411  ntohl (mp->min_interval), is_no);
1412 
1414 
1415  REPLY_MACRO (VL_API_SW_INTERFACE_IP6ND_RA_CONFIG_REPLY);
1416 }
1417 
1418 static void
1421 {
1422  vlib_main_t *vm = vlib_get_main ();
1423  vl_api_sw_interface_ip6nd_ra_prefix_reply_t *rmp;
1424  int rv = 0;
1425  u8 is_no, use_default, no_advertise, off_link, no_autoconfig, no_onlink;
1426 
1427  VALIDATE_SW_IF_INDEX (mp);
1428 
1429  is_no = mp->is_no == 1;
1430  use_default = mp->use_default == 1;
1431  no_advertise = mp->no_advertise == 1;
1432  off_link = mp->off_link == 1;
1433  no_autoconfig = mp->no_autoconfig == 1;
1434  no_onlink = mp->no_onlink == 1;
1435 
1436  rv = ip6_neighbor_ra_prefix (vm, ntohl (mp->sw_if_index),
1437  (ip6_address_t *) mp->address,
1438  mp->address_length, use_default,
1439  ntohl (mp->val_lifetime),
1440  ntohl (mp->pref_lifetime), no_advertise,
1441  off_link, no_autoconfig, no_onlink, is_no);
1442 
1444  REPLY_MACRO (VL_API_SW_INTERFACE_IP6ND_RA_PREFIX_REPLY);
1445 }
1446 
1447 static void
1449  u32 context,
1450  const ip46_address_t * addr, u32 sw_if_index)
1451 {
1453 
1454  mp = vl_msg_api_alloc (sizeof (*mp));
1455  memset (mp, 0, sizeof (*mp));
1456  mp->_vl_msg_id = ntohs (VL_API_IP6ND_PROXY_DETAILS);
1457  mp->context = context;
1458  mp->sw_if_index = htonl (sw_if_index);
1459  memcpy (mp->address, addr, 16);
1460 
1461  vl_msg_api_send_shmem (q, (u8 *) & mp);
1462 }
1463 
1465 {
1468 
1469 static int
1471 {
1473 
1475  {
1476  vec_add1 (ctx->indices, fei);
1477  }
1478 
1479  return (1);
1480 }
1481 
1482 static void
1484 {
1485  ip6_main_t *im6 = &ip6_main;
1486  fib_table_t *fib_table;
1488  .indices = NULL,
1489  };
1490  fib_node_index_t *feip;
1491  fib_prefix_t pfx;
1493 
1495  if (q == 0)
1496  {
1497  return;
1498  }
1499 
1500  /* *INDENT-OFF* */
1501  pool_foreach (fib_table, im6->fibs,
1502  ({
1503  fib_table_walk(fib_table->ft_index,
1504  FIB_PROTOCOL_IP6,
1505  api_ip6nd_proxy_fib_table_walk,
1506  &ctx);
1507  }));
1508  /* *INDENT-ON* */
1509 
1511 
1512  vec_foreach (feip, ctx.indices)
1513  {
1514  fib_entry_get_prefix (*feip, &pfx);
1515 
1517  mp->context,
1518  &pfx.fp_addr,
1520  }
1521 
1522  vec_free (ctx.indices);
1523 }
1524 
1525 static void
1527 {
1528  vl_api_ip6nd_proxy_add_del_reply_t *rmp;
1529  int rv = 0;
1530 
1531  VALIDATE_SW_IF_INDEX (mp);
1532 
1533  rv = ip6_neighbor_proxy_add_del (ntohl (mp->sw_if_index),
1534  (ip6_address_t *) mp->address, mp->is_del);
1535 
1537  REPLY_MACRO (VL_API_IP6ND_PROXY_ADD_DEL_REPLY);
1538 }
1539 
1540 static void
1543 {
1544  vlib_main_t *vm = vlib_get_main ();
1545  vl_api_sw_interface_ip6_enable_disable_reply_t *rmp;
1546  vnet_main_t *vnm = vnet_get_main ();
1547  int rv = 0;
1548  clib_error_t *error;
1549 
1550  vnm->api_errno = 0;
1551 
1552  VALIDATE_SW_IF_INDEX (mp);
1553 
1554  error =
1555  (mp->enable == 1) ? enable_ip6_interface (vm,
1556  ntohl (mp->sw_if_index)) :
1557  disable_ip6_interface (vm, ntohl (mp->sw_if_index));
1558 
1559  if (error)
1560  {
1561  clib_error_report (error);
1562  rv = VNET_API_ERROR_UNSPECIFIED;
1563  }
1564  else
1565  {
1566  rv = vnm->api_errno;
1567  }
1568 
1570 
1571  REPLY_MACRO (VL_API_SW_INTERFACE_IP6_ENABLE_DISABLE_REPLY);
1572 }
1573 
1574 static void
1577 {
1578  vlib_main_t *vm = vlib_get_main ();
1579  vl_api_sw_interface_ip6_set_link_local_address_reply_t *rmp;
1580  int rv = 0;
1581  clib_error_t *error;
1582  vnet_main_t *vnm = vnet_get_main ();
1583 
1584  vnm->api_errno = 0;
1585 
1586  VALIDATE_SW_IF_INDEX (mp);
1587 
1588  error = set_ip6_link_local_address (vm,
1589  ntohl (mp->sw_if_index),
1590  (ip6_address_t *) mp->address);
1591  if (error)
1592  {
1593  clib_error_report (error);
1594  rv = VNET_API_ERROR_UNSPECIFIED;
1595  }
1596  else
1597  {
1598  rv = vnm->api_errno;
1599  }
1600 
1602 
1603  REPLY_MACRO (VL_API_SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS_REPLY);
1604 }
1605 
1606 void
1608  u32 context, const mfib_signal_t * mfs)
1609 {
1611  mfib_prefix_t prefix;
1612  mfib_table_t *mfib;
1613  mfib_itf_t *mfi;
1614 
1615  mp = vl_msg_api_alloc (sizeof (*mp));
1616 
1617  memset (mp, 0, sizeof (*mp));
1618  mp->_vl_msg_id = ntohs (VL_API_MFIB_SIGNAL_DETAILS);
1619  mp->context = context;
1620 
1621  mfi = mfib_itf_get (mfs->mfs_itf);
1622  mfib_entry_get_prefix (mfs->mfs_entry, &prefix);
1624  prefix.fp_proto);
1625  mp->table_id = ntohl (mfib->mft_table_id);
1626  mp->sw_if_index = ntohl (mfi->mfi_sw_if_index);
1627 
1628  if (FIB_PROTOCOL_IP4 == prefix.fp_proto)
1629  {
1630  mp->grp_address_len = ntohs (prefix.fp_len);
1631 
1632  memcpy (mp->grp_address, &prefix.fp_grp_addr.ip4, 4);
1633  if (prefix.fp_len > 32)
1634  {
1635  memcpy (mp->src_address, &prefix.fp_src_addr.ip4, 4);
1636  }
1637  }
1638  else
1639  {
1640  mp->grp_address_len = ntohs (prefix.fp_len);
1641 
1642  ASSERT (0);
1643  }
1644 
1645  if (0 != mfs->mfs_buffer_len)
1646  {
1647  mp->ip_packet_len = ntohs (mfs->mfs_buffer_len);
1648 
1649  memcpy (mp->ip_packet_data, mfs->mfs_buffer, mfs->mfs_buffer_len);
1650  }
1651  else
1652  {
1653  mp->ip_packet_len = 0;
1654  }
1655 
1656  vl_msg_api_send_shmem (q, (u8 *) & mp);
1657 }
1658 
1659 static void
1661 {
1663 
1665  if (q == 0)
1666  {
1667  return;
1668  }
1669 
1670  while (q->cursize < q->maxsize && mfib_signal_send_one (q, mp->context))
1671  ;
1672 }
1673 
1674 #define vl_msg_name_crc_list
1675 #include <vnet/ip/ip.api.h>
1676 #undef vl_msg_name_crc_list
1677 
1678 static void
1680 {
1681 #define _(id,n,crc) vl_msg_api_add_msg_name_crc (am, #n "_" #crc, id);
1682  foreach_vl_msg_name_crc_ip;
1683 #undef _
1684 }
1685 
1686 static clib_error_t *
1688 {
1689  api_main_t *am = &api_main;
1690 
1691 #define _(N,n) \
1692  vl_msg_api_set_handlers(VL_API_##N, #n, \
1693  vl_api_##n##_t_handler, \
1694  vl_noop_handler, \
1695  vl_api_##n##_t_endian, \
1696  vl_api_##n##_t_print, \
1697  sizeof(vl_api_##n##_t), 1);
1699 #undef _
1700 
1701  /*
1702  * Set up the (msg_name, crc, message-id) table
1703  */
1705 
1706  return 0;
1707 }
1708 
1710 
1711 /*
1712  * fd.io coding-style-patch-verification: ON
1713  *
1714  * Local Variables:
1715  * eval: (c-set-style "gnu")
1716  * End:
1717  */
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
Definition: vec.h:436
#define foreach_ip_interface_address(lm, a, sw_if_index, loop, body)
Definition: lookup.h:179
fib_protocol_t fp_proto
protocol type
Definition: fib_types.h:169
#define VNET_SW_INTERFACE_FLAG_UNNUMBERED
Definition: interface.h:567
u32 fib_entry_get_fib_index(fib_node_index_t fib_entry_index)
Definition: fib_entry.c:1542
fib_protocol_t frp_proto
The protocol of the address below.
Definition: fib_types.h:341
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
ip46_address_t frp_addr
The next-hop address.
Definition: fib_types.h:350
ip46_address_t fp_src_addr
Definition: mfib_types.h:47
static void vl_api_ip6nd_proxy_add_del_t_handler(vl_api_ip6nd_proxy_add_del_t *mp)
Definition: ip_api.c:1526
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:56
static int vl_api_ip_fib_dump_walk(fib_node_index_t fei, void *arg)
Definition: ip_api.c:249
A representation of a fib path for fib_path_encode to convey the information to the caller...
Definition: fib_types.h:398
mpls_eos_bit_t frp_eos
EOS bit for the resolving label.
Definition: fib_types.h:361
int vnet_set_ip4_flow_hash(u32 table_id, flow_hash_config_t flow_hash_config)
Definition: ip4_forward.c:3039
u8 next_hop[16]
Definition: ip.api:52
Dump IP neighboors.
Definition: ip.api:104
Dump IP fib table.
Definition: ip.api:25
a
Definition: bitmap.h:516
vl_api_fib_path_t path[count]
Definition: ip.api:438
vl_api_fib_path_t path[count]
Definition: ip.api:69
int ip6_neighbor_ra_prefix(vlib_main_t *vm, u32 sw_if_index, ip6_address_t *prefix_addr, u8 prefix_len, u8 use_default, u32 val_lifetime, u32 pref_lifetime, u8 no_advertise, u8 off_link, u8 no_autoconfig, u8 no_onlink, u8 is_no)
A representation of a path as described by a route producer.
Definition: fib_types.h:336
static void vl_api_ip_neighbor_add_del_t_handler(vl_api_ip_neighbor_add_del_t *mp, vlib_main_t *vm)
Definition: ip_api.c:647
static void send_ip6_mfib_details(vpe_api_main_t *am, unix_shared_memory_queue_t *q, u32 table_id, mfib_prefix_t *pfx, fib_route_path_encode_t *api_rpaths, u32 context)
Definition: ip_api.c:543
vnet_main_t * vnet_get_main(void)
Definition: misc.c:46
vnet_interface_main_t interface_main
Definition: vnet.h:56
IP FIB table response.
Definition: ip.api:62
The table that stores ALL routes learned by the DP.
Definition: ip6.h:122
static int mroute_add_del_handler(u8 is_add, u8 is_local, u32 fib_index, const mfib_prefix_t *prefix, u32 entry_flags, fib_rpf_id_t rpf_id, u32 next_hop_sw_if_index, u32 itf_flags)
Definition: ip_api.c:1091
u8 as_u8[16]
Definition: ip6_packet.h:48
A pair of indicies, for the entry and interface resp.
Definition: mfib_signal.h:29
void fib_entry_get_prefix(fib_node_index_t fib_entry_index, fib_prefix_t *pfx)
Definition: fib_entry.c:1532
Dump IP multicast fib table.
Definition: ip.api:414
fib_node_index_t fib_table_entry_update(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source, fib_entry_flag_t flags, fib_route_path_t *paths)
Update an entry to have a new set of paths.
Definition: fib_table.c:705
#define NULL
Definition: clib.h:55
An entry in a FIB table.
Definition: mfib_entry.h:31
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 *rpath)
Add n paths to an entry (aka route) in the FIB.
Definition: fib_table.c:538
ip6_neighbor_t * ip6_neighbors_entries(u32 sw_if_index)
Definition: ip6_neighbor.c:815
u32 mpls_label_t
A label value only, i.e.
Definition: packet.h:24
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
Definition: vec.h:522
#define IP_NULL_DPO_ACTION_NUM
Definition: ip_null_dpo.h:48
int ip6_neighbor_proxy_add_del(u32 sw_if_index, ip6_address_t *addr, u8 is_del)
ip_lookup_main_t lookup_main
Definition: ip4.h:85
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:165
IPv6 router advertisement config request.
Definition: ip.api:196
static void send_ip6nd_proxy_details(unix_shared_memory_queue_t *q, u32 context, const ip46_address_t *addr, u32 sw_if_index)
Definition: ip_api.c:1448
int add_del_route_t_handler(u8 is_multipath, u8 is_add, u8 is_drop, u8 is_unreach, u8 is_prohibit, u8 is_local, u8 is_multicast, u8 is_classify, u32 classify_table_index, u8 is_resolve_host, u8 is_resolve_attached, u8 is_interface_rx, u8 is_rpf_id, u32 fib_index, const fib_prefix_t *prefix, u8 next_hop_proto_is_ip4, const ip46_address_t *next_hop, u32 next_hop_sw_if_index, u8 next_hop_fib_index, u32 next_hop_weight, mpls_label_t next_hop_via_label, mpls_label_t *next_hop_out_label_stack)
Definition: ip_api.c:700
Definition: fib_entry.h:241
struct api_ip6nd_proxy_fib_table_walk_ctx_t_ api_ip6nd_proxy_fib_table_walk_ctx_t
A path that result in received traffic being recieved/recirculated so that it appears to have arrived...
Definition: fib_types.h:301
static void vl_api_ip6nd_proxy_dump_t_handler(vl_api_ip6nd_proxy_dump_t *mp)
Definition: ip_api.c:1483
static void api_ip6_fib_table_put_entries(clib_bihash_kv_24_8_t *kvp, void *arg)
Definition: ip_api.c:376
Dump IP6 fib table.
Definition: ip.api:75
int mfib_signal_send_one(struct _unix_shared_memory_queue *q, u32 context)
Definition: mfib_signal.c:94
enum fib_protocol_t_ fib_protocol_t
Protocol Type.
#define vec_reset_length(v)
Reset vector length to zero NULL-pointer tolerant.
static int add_del_mroute_check(fib_protocol_t table_proto, u32 table_id, u32 next_hop_sw_if_index, u8 is_local, u8 create_missing_tables, u32 *fib_index)
Definition: ip_api.c:1056
static void vl_api_ip_mfib_dump_t_handler(vl_api_ip_mfib_dump_t *mp)
Definition: ip_api.c:504
A local path with a RPF-ID => multicast traffic.
Definition: fib_types.h:305
ip6_neighbor_flags_t flags
Definition: ip6_neighbor.h:42
#define pool_foreach(VAR, POOL, BODY)
Iterate through pool.
Definition: pool.h:376
u32 frp_sw_if_index
The interface.
Definition: fib_types.h:369
Dump IP6 multicast fib table.
Definition: ip.api:444
void fib_table_entry_special_remove(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source)
Remove a &#39;special&#39; entry from the FIB.
Definition: fib_table.c:390
vl_api_fib_path_t path[count]
Definition: ip.api:466
#define vec_new(T, N)
Create new vector of given type and length (unspecified alignment, no header).
Definition: vec.h:310
static BVT(clib_bihash)
Definition: adj_nbr.c:26
Recursion constraint of via a host prefix.
Definition: fib_types.h:276
static void vl_api_ip6_mfib_dump_t_handler(vl_api_ip6_mfib_dump_t *mp)
Definition: ip_api.c:600
int vnet_set_ip6_ethernet_neighbor(vlib_main_t *vm, u32 sw_if_index, ip6_address_t *a, u8 *link_layer_address, uword n_bytes_link_layer_address, int is_static, int is_no_fib_entry)
Definition: ip6_neighbor.c:583
Aggregrate type for a prefix.
Definition: fib_types.h:160
int ip6_interface_enabled(vlib_main_t *vm, u32 sw_if_index)
static void vl_api_ip_dump_t_handler(vl_api_ip_dump_t *mp)
Definition: ip_api.c:1295
struct vl_api_ip_mfib_dump_ctc_t_ vl_api_ip_mfib_dump_ctc_t
static int ip6_add_del_route_t_handler(vl_api_ip_add_del_route_t *mp)
Definition: ip_api.c:979
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, mfib_itf_flags_t itf_flags)
Add n paths to an entry (aka route) in the FIB.
Definition: mfib_table.c:219
IPv6 interface enable / disable request.
Definition: ip.api:308
enum fib_route_path_flags_t_ fib_route_path_flags_t
Path flags from the control plane.
static void send_ip_address_details(vpe_api_main_t *am, unix_shared_memory_queue_t *q, u8 *ip, u16 prefix_length, u32 sw_if_index, u8 is_ipv6, u32 context)
Definition: ip_api.c:1214
struct mfib_table_t_ * mfibs
Vector of MFIBs.
Definition: ip4.h:94
enum dpo_proto_t_ dpo_proto_t
Data path protocol.
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:1025
static void send_ip_details(vpe_api_main_t *am, unix_shared_memory_queue_t *q, u32 sw_if_index, u8 is_ipv6, u32 context)
Definition: ip_api.c:1196
u16 fp_len
The mask length.
Definition: fib_types.h:164
static void vl_api_mfib_signal_dump_t_handler(vl_api_mfib_signal_dump_t *mp)
Definition: ip_api.c:1660
int fib_entry_cmp_for_sort(void *i1, void *i2)
Definition: fib_entry.c:1484
int vnet_arp_unset_ip4_over_ethernet(vnet_main_t *vnm, u32 sw_if_index, void *a_arg)
Control Plane hook to remove an ARP entry.
Definition: arp.c:1436
void * vl_msg_api_alloc(int nbytes)
u32 mfib_entry_get_fib_index(fib_node_index_t mfib_entry_index)
Definition: mfib_entry.c:1212
Definition: fib_entry.h:233
vnet_api_error_t api_errno
Definition: vnet.h:76
The identity of a DPO is a combination of its type and its instance number/index of objects of that t...
Definition: dpo.h:152
static int vl_api_ip6_mfib_table_dump_walk(fib_node_index_t fei, void *arg)
Definition: ip_api.c:590
Definition: fib_entry.h:237
static mfib_itf_t * mfib_itf_get(index_t mi)
Definition: mfib_itf.h:53
ip46_address_t fp_addr
The address type is not deriveable from the fp_addr member.
Definition: fib_types.h:183
index_t classify_dpo_create(dpo_proto_t proto, u32 classify_table_index)
Definition: classify_dpo.c:43
dpo_type_t dpoi_type
the type
Definition: dpo.h:156
ip4_address_t ip4_address
Definition: arp_packet.h:153
int vnet_unset_ip6_ethernet_neighbor(vlib_main_t *vm, u32 sw_if_index, ip6_address_t *a, u8 *link_layer_address, uword n_bytes_link_layer_address)
Definition: ip6_neighbor.c:731
u8 ethernet_address[6]
Definition: arp_packet.h:155
static void vl_api_sw_interface_ip6nd_ra_prefix_t_handler(vl_api_sw_interface_ip6nd_ra_prefix_t *mp)
Definition: ip_api.c:1420
IP6 Multicast FIB table response.
Definition: ip.api:458
void fib_table_entry_path_remove2(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source, fib_route_path_t *rpath)
Remove n paths to an entry (aka route) in the FIB.
Definition: fib_table.c:582
vl_api_fib_path_t path[count]
Definition: ip.api:95
#define REPLY_MACRO(t)
static int api_ip6nd_proxy_fib_table_walk(fib_node_index_t fei, void *arg)
Definition: ip_api.c:1470
Recursion constraint of via an attahced prefix.
Definition: fib_types.h:280
fib_node_index_t * entries
Definition: ip_api.c:372
VLIB_API_INIT_FUNCTION(ip_api_hookup)
static void vl_api_sw_interface_ip6_enable_disable_t_handler(vl_api_sw_interface_ip6_enable_disable_t *mp)
Definition: ip_api.c:1542
static void vl_api_set_ip_flow_hash_t_handler(vl_api_set_ip_flow_hash_t *mp)
Definition: ip_api.c:1375
static mfib_entry_t * mfib_entry_get(fib_node_index_t index)
Definition: mfib_entry.h:148
void stats_dsunlock(void)
u32 fib_entry_get_resolving_interface(fib_node_index_t entry_index)
Definition: fib_entry.c:1338
#define ip46_address_is_ip4(ip46)
Definition: ip6_packet.h:76
void clib_bihash_foreach_key_value_pair(clib_bihash *h, void *callback, void *arg)
Visit active (key,value) pairs in a bi-hash table.
#define BAD_SW_IF_INDEX_LABEL
static void send_ip_mfib_details(unix_shared_memory_queue_t *q, u32 context, u32 table_id, fib_node_index_t mfei)
Definition: ip_api.c:441
struct vl_api_ip6_mfib_dump_ctc_t_ vl_api_ip6_mfib_dump_ctc_t
fib_node_index_t ft_index
Index into FIB vector.
Definition: fib_table.h:49
int fib_entry_is_sourced(fib_node_index_t fib_entry_index, fib_source_t source)
api_main_t api_main
Definition: api_shared.c:35
Set the ip flow hash config for a fib request.
Definition: ip.api:165
fib_node_index_t fib_table_entry_special_dpo_update(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source, fib_entry_flag_t flags, const dpo_id_t *dpo)
Update a &#39;special&#39; entry to the FIB that links to the DPO passed A special entry is an entry that the...
Definition: fib_table.c:329
u32 ft_table_id
Table ID (hash key) for this FIB.
Definition: fib_table.h:44
#define MPLS_LABEL_INVALID
Definition: mpls_types.h:48
#define vec_free(V)
Free vector&#39;s memory (no header).
Definition: vec.h:340
void copy_fib_next_hop(fib_route_path_encode_t *api_rpath, void *fp_arg)
Definition: ip_api.c:154
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:835
struct vl_api_ip_fib_dump_walk_ctx_t_ vl_api_ip_fib_dump_walk_ctx_t
u32 frp_weight
[un]equal cost path weight
Definition: fib_types.h:383
fib_node_index_t * entries
Definition: ip_api.c:586
#define clib_memcpy(a, b, c)
Definition: string.h:69
static void send_ip_fib_details(vpe_api_main_t *am, unix_shared_memory_queue_t *q, u32 table_id, fib_prefix_t *pfx, fib_route_path_encode_t *api_rpaths, u32 context)
Definition: ip_api.c:180
unix_shared_memory_queue_t * vl_api_client_index_to_input_queue(u32 index)
u32 fib_node_index_t
A typedef of a node index.
Definition: fib_types.h:28
mfib_entry_flags_t mfe_flags
Route flags.
Definition: mfib_entry.h:74
static void set_ip6_flow_hash(vl_api_set_ip_flow_hash_t *mp)
Definition: ip_api.c:1336
#define pool_is_free_index(P, I)
Use free bitmap to query whether given index is free.
Definition: pool.h:238
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:159
u32 sw_if_index
Definition: ip.api:45
clib_error_t * enable_ip6_interface(vlib_main_t *vm, u32 sw_if_index)
Aggregrate type for a prefix.
Definition: mfib_types.h:24
enum fib_entry_flag_t_ fib_entry_flag_t
u32 fib_rpf_id_t
An RPF-ID is numerical value that is used RPF validate.
Definition: fib_types.h:315
struct _vnet_classify_main vnet_classify_main_t
Definition: vnet_classify.h:72
#define foreach_flow_hash_bit
Definition: lookup.h:71
void vl_api_ip_mroute_add_del_t_handler(vl_api_ip_mroute_add_del_t *mp)
Definition: ip_api.c:1180
void vl_msg_api_send_shmem(unix_shared_memory_queue_t *q, u8 *elem)
IP neighbor add / del request.
Definition: ip.api:139
void mfib_entry_get_prefix(fib_node_index_t mfib_entry_index, mfib_prefix_t *pfx)
Definition: mfib_entry.c:1202
#define ASSERT(truth)
unsigned int u32
Definition: types.h:88
static int api_mroute_add_del_t_handler(vl_api_ip_mroute_add_del_t *mp)
Definition: ip_api.c:1134
IP Multicast FIB table response.
Definition: ip.api:428
ip6_address_t ip6_address
Definition: ip6_neighbor.h:26
ip6_main_t ip6_main
Definition: ip6_forward.c:2926
ip_lookup_main_t lookup_main
Definition: ip6.h:148
index_t mfs_itf
Definition: mfib_signal.h:32
fib_node_index_t * entries
Definition: ip_api.c:490
static int vl_api_ip_mfib_table_dump_walk(fib_node_index_t fei, void *arg)
Definition: ip_api.c:494
static int ip4_add_del_route_t_handler(vl_api_ip_add_del_route_t *mp)
Definition: ip_api.c:920
FIB path.
Definition: ip.api:43
IPv6 router advertisement prefix config request.
Definition: ip.api:245
IPv6 ND proxy details returned after request.
Definition: ip.api:282
IPv4 main type.
Definition: ip4.h:83
static void set_ip4_flow_hash(vl_api_set_ip_flow_hash_t *mp)
Definition: ip_api.c:1355
An interface associated with a particular MFIB entry.
Definition: mfib_itf.h:25
IPv6 ND proxy dump request.
Definition: ip.api:296
fib_route_path_flags_t frp_flags
flags on the path
Definition: fib_types.h:387
struct mfib_table_t_ * mfibs
Vector of MFIBs.
Definition: ip6.h:157
#define clib_error_report(e)
Definition: error.h:113
u32 fib_table_find_or_create_and_lock(fib_protocol_t proto, u32 table_id)
Get the index of the FIB for a Table-ID.
Definition: fib_table.c:1041
vnet_classify_main_t vnet_classify_main
Definition: vnet_classify.c:22
dpo_proto_t fib_proto_to_dpo(fib_protocol_t fib_proto)
Definition: fib_types.c:211
u32 mft_table_id
Table ID (hash key) for this FIB.
Definition: mfib_table.h:55
From the control plane API.
Definition: fib_entry.h:62
static void send_ip6_fib_details(vpe_api_main_t *am, unix_shared_memory_queue_t *q, u32 table_id, fib_prefix_t *pfx, fib_route_path_encode_t *api_rpaths, u32 context)
Definition: ip_api.c:306
void stats_dslock_with_hint(int hint, int tag)
fib_rpf_id_t mfe_rpf_id
RPF-ID used when the packets ingress not from an interface.
Definition: mfib_entry.h:79
ethernet_arp_entry_flags_t flags
Definition: arp_packet.h:157
static clib_error_t * ip_api_hookup(vlib_main_t *vm)
Definition: ip_api.c:1687
u32 flow_hash_config_t
A flow hash configuration is a mask of the flow hash options.
Definition: lookup.h:82
static void vl_api_ip_fib_dump_t_handler(vl_api_ip_fib_dump_t *mp)
Definition: ip_api.c:259
int vnet_set_ip6_flow_hash(u32 table_id, flow_hash_config_t flow_hash_config)
Definition: ip6_forward.c:3183
ip6_fib_table_instance_t ip6_table[IP6_FIB_NUM_TABLES]
The two FIB tables; fwding and non-fwding.
Definition: ip6.h:146
IP neighboors dump response.
Definition: ip.api:117
int add_del_route_check(fib_protocol_t table_proto, u32 table_id, u32 next_hop_sw_if_index, fib_protocol_t next_hop_table_proto, u32 next_hop_table_id, u8 create_missing_tables, u8 is_rpf_id, u32 *fib_index, u32 *next_hop_fib_index)
Definition: ip_api.c:851
static vlib_main_t * vlib_get_main(void)
Definition: global_funcs.h:23
void fib_entry_encode(fib_node_index_t fib_entry_index, fib_route_path_encode_t **api_rpaths)
Definition: fib_entry.c:1519
void mfib_entry_encode(fib_node_index_t mfib_entry_index, fib_route_path_encode_t **api_rpaths)
Definition: mfib_entry.c:1183
mpls_label_t frp_local_label
The MPLS local Label to reursively resolve through.
Definition: fib_types.h:357
Add / del route request.
Definition: ip.api:355
fib_protocol_t fp_proto
protocol type
Definition: mfib_types.h:33
static void setup_message_id_table(api_main_t *am)
Definition: ip_api.c:1679
unsigned short u16
Definition: types.h:57
u32 mfib_table_find_or_create_and_lock(fib_protocol_t proto, u32 table_id)
Get the index of the FIB for a Table-ID.
Definition: mfib_table.c:426
index_t dpoi_index
the index of objects of that type
Definition: dpo.h:168
mfib_table_t * mfib_table_get(fib_node_index_t index, fib_protocol_t proto)
Get a pointer to a FIB table.
Definition: mfib_table.c:26
ip6_neighbor_key_t key
Definition: ip6_neighbor.h:40
A for-us/local path.
Definition: fib_types.h:284
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
unsigned char u8
Definition: types.h:56
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:409
IPv6 ND proxy config.
Definition: ip.api:269
#define vec_sort_with_function(vec, f)
Sort a vector using the supplied element comparison function.
Definition: vec.h:960
int ip6_neighbor_ra_config(vlib_main_t *vm, u32 sw_if_index, u8 suppress, u8 managed, u8 other, u8 ll_option, u8 send_unicast, u8 cease, u8 use_lifetime, u32 lifetime, u32 initial_count, u32 initial_interval, u32 max_interval, u32 min_interval, u8 is_no)
vnet_sw_interface_t * sw_interfaces
Definition: interface.h:644
#define DPO_INVALID
An initialiser for DPOs declared on the stack.
Definition: dpo.h:179
u32 next_hop_out_label_stack[next_hop_n_out_labels]
Definition: ip.api:382
u8 mfs_buffer[MFIB_SIGNAL_BUFFER_SIZE]
A buffer copied from the DP plane that triggered the signal.
Definition: mfib_signal.h:37
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:27
clib_error_t * set_ip6_link_local_address(vlib_main_t *vm, u32 sw_if_index, ip6_address_t *address)
static void vl_api_sw_interface_ip6nd_ra_config_t_handler(vl_api_sw_interface_ip6nd_ra_config_t *mp)
Definition: ip_api.c:1385
u32 client_index
Definition: ip.api:496
u32 mfi_sw_if_index
The SW IF index that this MFIB interface represents.
Definition: mfib_itf.h:35
A protocol Independent IP multicast FIB table.
Definition: mfib_table.h:29
ip4_main_t ip4_main
Global ip4 main structure.
Definition: ip4_forward.c:1168
IP6 FIB table response.
Definition: ip.api:88
struct fib_table_t_ * fibs
Vector of FIBs.
Definition: ip4.h:88
void dpo_reset(dpo_id_t *dpo)
reset a DPO ID The DPO will be unlocked.
Definition: dpo.c:205
#define vec_foreach(var, vec)
Vector iterator.
fib_route_path_t rpath
Definition: fib_types.h:399
static void vl_api_sw_interface_ip6_set_link_local_address_t_handler(vl_api_sw_interface_ip6_set_link_local_address_t *mp)
Definition: ip_api.c:1576
static void vl_api_ip_address_dump_t_handler(vl_api_ip_address_dump_t *mp)
Definition: ip_api.c:1243
ethernet_arp_ip4_entry_t * ip4_neighbor_entries(u32 sw_if_index)
Definition: arp.c:1277
vhost_vring_addr_t addr
Definition: vhost-user.h:82
int vnet_arp_set_ip4_over_ethernet(vnet_main_t *vnm, u32 sw_if_index, void *a_arg, int is_static, int is_no_fib_entry)
Definition: arp.c:1797
static void * ip_interface_address_get_address(ip_lookup_main_t *lm, ip_interface_address_t *a)
Definition: lookup.h:172
static void send_ip_neighbor_details(u8 is_ipv6, u8 is_static, u8 *mac_address, u8 *ip_address, unix_shared_memory_queue_t *q, u32 context)
Definition: ip_api.c:85
static void api_ip6_fib_table_get_all(unix_shared_memory_queue_t *q, vl_api_ip6_fib_dump_t *mp, fib_table_t *fib_table)
Definition: ip_api.c:387
struct apt_ip6_fib_show_ctx_t_ api_ip6_fib_show_ctx_t
u16 fp_len
The mask length.
Definition: mfib_types.h:28
void vl_mfib_signal_send_one(unix_shared_memory_queue_t *q, u32 context, const mfib_signal_t *mfs)
Definition: ip_api.c:1607
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:251
clib_error_t * disable_ip6_interface(vlib_main_t *vm, u32 sw_if_index)
fib_node_index_t mfs_entry
Definition: mfib_signal.h:31
Add / del route request.
Definition: ip.api:393
vpe_api_main_t vpe_api_main
Definition: interface_api.c:49
void vl_api_ip_add_del_route_t_handler(vl_api_ip_add_del_route_t *mp)
Definition: ip_api.c:1037
struct fib_table_t_ * fibs
Definition: ip6.h:151
Definition: dpo.h:98
u8 link_layer_address[8]
Definition: ip6_neighbor.h:41
#define foreach_ip_api_msg
Definition: ip_api.c:60
const ip46_address_t zero_addr
Definition: lookup.c:348
ip46_address_t fp_grp_addr
The address type is not deriveable from the fp_addr member.
Definition: mfib_types.h:46
u8 is_prohibit
Definition: ip.api:50
static void vl_api_ip6_fib_dump_t_handler(vl_api_ip6_fib_dump_t *mp)
Definition: ip_api.c:422
#define VALIDATE_SW_IF_INDEX(mp)
A protocol Independent FIB table.
Definition: fib_table.h:29
Definition: arp_packet.h:150
fib_node_index_t * feis
Definition: ip_api.c:245
IPv6 Proxy ND.
Definition: fib_entry.h:86
struct _unix_shared_memory_queue unix_shared_memory_queue_t
static void vl_api_ip_neighbor_dump_t_handler(vl_api_ip_neighbor_dump_t *mp)
Definition: ip_api.c:106
static uword pool_elts(void *v)
Number of active elements in a pool.
Definition: pool.h:109