dpdk: rework cryptodev ipsec build and setup
[vpp.git] / src / vat / api_format.c
index c00104d..6b8c5fb 100644 (file)
@@ -48,6 +48,7 @@
 #include <vnet/span/span.h>
 #include <vnet/policer/policer.h>
 #include <vnet/policer/police.h>
+#include <vnet/mfib/mfib_types.h>
 
 #include "vat/json_format.h"
 
 #include <vpp/api/vpe_all_api_h.h>
 #undef vl_printfun
 
+#define __plugin_msg_base 0
+#include <vlibapi/vat_helper_macros.h>
+
+f64
+vat_time_now (vat_main_t * vam)
+{
+#if VPP_API_TEST_BUILTIN
+  return vlib_time_now (vam->vlib_main);
+#else
+  return clib_time_now (&vam->clib_time);
+#endif
+}
+
+void
+errmsg (char *fmt, ...)
+{
+  vat_main_t *vam = &vat_main;
+  va_list va;
+  u8 *s;
+
+  va_start (va, fmt);
+  s = va_format (0, fmt, &va);
+  va_end (va);
+
+  vec_add1 (s, 0);
+
+#if VPP_API_TEST_BUILTIN
+  vlib_cli_output (vam->vlib_main, (char *) s);
+#else
+  {
+    if (vam->ifp != stdin)
+      fformat (vam->ofp, "%s(%d): \n", vam->current_file,
+              vam->input_line_number);
+    fformat (vam->ofp, (char *) s);
+    fflush (vam->ofp);
+  }
+#endif
+
+  vec_free (s);
+}
+
 static uword
 api_unformat_sw_if_index (unformat_input_t * input, va_list * args)
 {
@@ -88,8 +130,6 @@ api_unformat_sw_if_index (unformat_input_t * input, va_list * args)
   return 1;
 }
 
-void vat_suspend (vlib_main_t * vm, f64 interval);
-
 #if VPP_API_TEST_BUILTIN == 0
 /* Parse an IP4 address %d.%d.%d.%d. */
 uword
@@ -466,6 +506,53 @@ unformat_flow_classify_table_type (unformat_input_t * input, va_list * va)
   return 1;
 }
 
+static const char *mfib_flag_names[] = MFIB_ENTRY_NAMES_SHORT;
+static const char *mfib_flag_long_names[] = MFIB_ENTRY_NAMES_LONG;
+static const char *mfib_itf_flag_long_names[] = MFIB_ITF_NAMES_LONG;
+static const char *mfib_itf_flag_names[] = MFIB_ITF_NAMES_SHORT;
+
+uword
+unformat_mfib_itf_flags (unformat_input_t * input, va_list * args)
+{
+  mfib_itf_flags_t old, *iflags = va_arg (*args, mfib_itf_flags_t *);
+  mfib_itf_attribute_t attr;
+
+  old = *iflags;
+  FOR_EACH_MFIB_ITF_ATTRIBUTE (attr)
+  {
+    if (unformat (input, mfib_itf_flag_long_names[attr]))
+      *iflags |= (1 << attr);
+  }
+  FOR_EACH_MFIB_ITF_ATTRIBUTE (attr)
+  {
+    if (unformat (input, mfib_itf_flag_names[attr]))
+      *iflags |= (1 << attr);
+  }
+
+  return (old == *iflags ? 0 : 1);
+}
+
+uword
+unformat_mfib_entry_flags (unformat_input_t * input, va_list * args)
+{
+  mfib_entry_flags_t old, *eflags = va_arg (*args, mfib_entry_flags_t *);
+  mfib_entry_attribute_t attr;
+
+  old = *eflags;
+  FOR_EACH_MFIB_ATTRIBUTE (attr)
+  {
+    if (unformat (input, mfib_flag_long_names[attr]))
+      *eflags |= (1 << attr);
+  }
+  FOR_EACH_MFIB_ATTRIBUTE (attr)
+  {
+    if (unformat (input, mfib_flag_names[attr]))
+      *eflags |= (1 << attr);
+  }
+
+  return (old == *eflags ? 0 : 1);
+}
+
 #if (VPP_API_TEST_BUILTIN==0)
 u8 *
 format_ip4_address (u8 * s, va_list * args)
@@ -2004,6 +2091,42 @@ static void vl_api_vnet_ip4_fib_counters_t_handler_json
     }
 }
 
+static void vl_api_vnet_ip4_nbr_counters_t_handler
+  (vl_api_vnet_ip4_nbr_counters_t * mp)
+{
+  /* not supported */
+}
+
+static void vl_api_vnet_ip4_nbr_counters_t_handler_json
+  (vl_api_vnet_ip4_nbr_counters_t * mp)
+{
+  vat_main_t *vam = &vat_main;
+  vl_api_ip4_nbr_counter_t *v;
+  ip4_nbr_counter_t *counter;
+  u32 sw_if_index;
+  u32 count;
+  int i;
+
+  sw_if_index = ntohl (mp->sw_if_index);
+  count = ntohl (mp->count);
+  vec_validate (vam->ip4_nbr_counters, sw_if_index);
+
+  if (mp->begin)
+    vec_free (vam->ip4_nbr_counters[sw_if_index]);
+
+  v = (vl_api_ip4_nbr_counter_t *) & mp->c;
+  for (i = 0; i < count; i++)
+    {
+      vec_validate (vam->ip4_nbr_counters[sw_if_index], i);
+      counter = &vam->ip4_nbr_counters[sw_if_index][i];
+      counter->address.s_addr = v->address;
+      counter->packets = clib_net_to_host_u64 (v->packets);
+      counter->bytes = clib_net_to_host_u64 (v->bytes);
+      counter->linkt = v->link_type;
+      v++;
+    }
+}
+
 static void vl_api_vnet_ip6_fib_counters_t_handler
   (vl_api_vnet_ip6_fib_counters_t * mp)
 {
@@ -2049,6 +2172,43 @@ static void vl_api_vnet_ip6_fib_counters_t_handler_json
     }
 }
 
+static void vl_api_vnet_ip6_nbr_counters_t_handler
+  (vl_api_vnet_ip6_nbr_counters_t * mp)
+{
+  /* not supported */
+}
+
+static void vl_api_vnet_ip6_nbr_counters_t_handler_json
+  (vl_api_vnet_ip6_nbr_counters_t * mp)
+{
+  vat_main_t *vam = &vat_main;
+  vl_api_ip6_nbr_counter_t *v;
+  ip6_nbr_counter_t *counter;
+  struct in6_addr ip6;
+  u32 sw_if_index;
+  u32 count;
+  int i;
+
+  sw_if_index = ntohl (mp->sw_if_index);
+  count = ntohl (mp->count);
+  vec_validate (vam->ip6_nbr_counters, sw_if_index);
+
+  if (mp->begin)
+    vec_free (vam->ip6_nbr_counters[sw_if_index]);
+
+  v = (vl_api_ip6_nbr_counter_t *) & mp->c;
+  for (i = 0; i < count; i++)
+    {
+      vec_validate (vam->ip6_nbr_counters[sw_if_index], i);
+      counter = &vam->ip6_nbr_counters[sw_if_index][i];
+      clib_memcpy (&ip6, &v->address, sizeof (ip6));
+      counter->address = ip6;
+      counter->packets = clib_net_to_host_u64 (v->packets);
+      counter->bytes = clib_net_to_host_u64 (v->bytes);
+      v++;
+    }
+}
+
 static void vl_api_get_first_msg_id_reply_t_handler
   (vl_api_get_first_msg_id_reply_t * mp)
 {
@@ -2452,103 +2612,6 @@ static void
   vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
 }
 
-static u8 *
-format_decap_next (u8 * s, va_list * args)
-{
-  u32 next_index = va_arg (*args, u32);
-
-  switch (next_index)
-    {
-    case LISP_GPE_INPUT_NEXT_DROP:
-      return format (s, "drop");
-    case LISP_GPE_INPUT_NEXT_IP4_INPUT:
-      return format (s, "ip4");
-    case LISP_GPE_INPUT_NEXT_IP6_INPUT:
-      return format (s, "ip6");
-    default:
-      return format (s, "unknown %d", next_index);
-    }
-  return s;
-}
-
-static void
-vl_api_lisp_gpe_tunnel_details_t_handler (vl_api_lisp_gpe_tunnel_details_t *
-                                         mp)
-{
-  vat_main_t *vam = &vat_main;
-  u8 *iid_str;
-  u8 *flag_str = NULL;
-
-  iid_str = format (0, "%d (0x%x)", ntohl (mp->iid), ntohl (mp->iid));
-
-#define _(n,v) if (mp->flags & v) flag_str = format (flag_str, "%s-bit ", #n);
-  foreach_lisp_gpe_flag_bit;
-#undef _
-
-  print (vam->ofp, "%=20d%=30U%=16U%=16d%=16d%=16U"
-        "%=16d%=16d%=16sd=16d%=16s%=16s",
-        mp->tunnels,
-        mp->is_ipv6 ? format_ip6_address : format_ip4_address,
-        mp->source_ip,
-        mp->is_ipv6 ? format_ip6_address : format_ip4_address,
-        mp->destination_ip,
-        ntohl (mp->encap_fib_id),
-        ntohl (mp->decap_fib_id),
-        format_decap_next, ntohl (mp->dcap_next),
-        mp->ver_res >> 6,
-        flag_str, mp->next_protocol, mp->ver_res, mp->res, iid_str);
-
-  vec_free (iid_str);
-}
-
-static void
-  vl_api_lisp_gpe_tunnel_details_t_handler_json
-  (vl_api_lisp_gpe_tunnel_details_t * mp)
-{
-  vat_main_t *vam = &vat_main;
-  vat_json_node_t *node = NULL;
-  struct in6_addr ip6;
-  struct in_addr ip4;
-  u8 *next_decap_str;
-
-  next_decap_str = format (0, "%U", format_decap_next, htonl (mp->dcap_next));
-
-  if (VAT_JSON_ARRAY != vam->json_tree.type)
-    {
-      ASSERT (VAT_JSON_NONE == vam->json_tree.type);
-      vat_json_init_array (&vam->json_tree);
-    }
-  node = vat_json_array_add (&vam->json_tree);
-
-  vat_json_init_object (node);
-  vat_json_object_add_uint (node, "tunel", mp->tunnels);
-  if (mp->is_ipv6)
-    {
-      clib_memcpy (&ip6, mp->source_ip, sizeof (ip6));
-      vat_json_object_add_ip6 (node, "source address", ip6);
-      clib_memcpy (&ip6, mp->destination_ip, sizeof (ip6));
-      vat_json_object_add_ip6 (node, "destination address", ip6);
-    }
-  else
-    {
-      clib_memcpy (&ip4, mp->source_ip, sizeof (ip4));
-      vat_json_object_add_ip4 (node, "source address", ip4);
-      clib_memcpy (&ip4, mp->destination_ip, sizeof (ip4));
-      vat_json_object_add_ip4 (node, "destination address", ip4);
-    }
-  vat_json_object_add_uint (node, "fib encap", ntohl (mp->encap_fib_id));
-  vat_json_object_add_uint (node, "fib decap", ntohl (mp->decap_fib_id));
-  vat_json_object_add_string_copy (node, "decap next", next_decap_str);
-  vat_json_object_add_uint (node, "lisp version", mp->ver_res >> 6);
-  vat_json_object_add_uint (node, "flags", mp->flags);
-  vat_json_object_add_uint (node, "next protocol", mp->next_protocol);
-  vat_json_object_add_uint (node, "ver_res", mp->ver_res);
-  vat_json_object_add_uint (node, "res", mp->res);
-  vat_json_object_add_uint (node, "iid", ntohl (mp->iid));
-
-  vec_free (next_decap_str);
-}
-
 static void
   vl_api_show_lisp_map_register_state_reply_t_handler
   (vl_api_show_lisp_map_register_state_reply_t * mp)
@@ -3549,6 +3612,10 @@ static void vl_api_flow_classify_details_t_handler_json
 #define vl_api_vnet_ip4_fib_counters_t_print vl_noop_handler
 #define vl_api_vnet_ip6_fib_counters_t_endian vl_noop_handler
 #define vl_api_vnet_ip6_fib_counters_t_print vl_noop_handler
+#define vl_api_vnet_ip4_nbr_counters_t_endian vl_noop_handler
+#define vl_api_vnet_ip4_nbr_counters_t_print vl_noop_handler
+#define vl_api_vnet_ip6_nbr_counters_t_endian vl_noop_handler
+#define vl_api_vnet_ip6_nbr_counters_t_print vl_noop_handler
 #define vl_api_lisp_adjacencies_get_reply_t_endian vl_noop_handler
 #define vl_api_lisp_adjacencies_get_reply_t_print vl_noop_handler
 
@@ -3573,6 +3640,7 @@ _(bridge_domain_add_del_reply)                          \
 _(sw_interface_set_l2_xconnect_reply)                   \
 _(l2fib_add_del_reply)                                  \
 _(ip_add_del_route_reply)                               \
+_(ip_mroute_add_del_reply)                              \
 _(mpls_route_add_del_reply)                             \
 _(mpls_ip_bind_unbind_reply)                            \
 _(proxy_arp_add_del_reply)                              \
@@ -3773,6 +3841,7 @@ _(TAP_MODIFY_REPLY, tap_modify_reply)                                     \
 _(TAP_DELETE_REPLY, tap_delete_reply)                                  \
 _(SW_INTERFACE_TAP_DETAILS, sw_interface_tap_details)                   \
 _(IP_ADD_DEL_ROUTE_REPLY, ip_add_del_route_reply)                      \
+_(IP_MROUTE_ADD_DEL_REPLY, ip_mroute_add_del_reply)                    \
 _(MPLS_ROUTE_ADD_DEL_REPLY, mpls_route_add_del_reply)                  \
 _(MPLS_IP_BIND_UNBIND_REPLY, mpls_ip_bind_unbind_reply)                        \
 _(PROXY_ARP_ADD_DEL_REPLY, proxy_arp_add_del_reply)                     \
@@ -3858,6 +3927,8 @@ _(DHCP_COMPL_EVENT, dhcp_compl_event)                                   \
 _(VNET_INTERFACE_COUNTERS, vnet_interface_counters)                     \
 _(VNET_IP4_FIB_COUNTERS, vnet_ip4_fib_counters)                         \
 _(VNET_IP6_FIB_COUNTERS, vnet_ip6_fib_counters)                         \
+_(VNET_IP4_NBR_COUNTERS, vnet_ip4_nbr_counters)                         \
+_(VNET_IP6_NBR_COUNTERS, vnet_ip6_nbr_counters)                         \
 _(MAP_ADD_DOMAIN_REPLY, map_add_domain_reply)                           \
 _(MAP_DEL_DOMAIN_REPLY, map_del_domain_reply)                           \
 _(MAP_ADD_DEL_RULE_REPLY, map_add_del_rule_reply)                      \
@@ -3895,7 +3966,6 @@ _(LISP_LOCATOR_DETAILS, lisp_locator_details)                           \
 _(LISP_EID_TABLE_DETAILS, lisp_eid_table_details)                       \
 _(LISP_EID_TABLE_MAP_DETAILS, lisp_eid_table_map_details)               \
 _(LISP_EID_TABLE_VNI_DETAILS, lisp_eid_table_vni_details)               \
-_(LISP_GPE_TUNNEL_DETAILS, lisp_gpe_tunnel_details)                     \
 _(LISP_MAP_RESOLVER_DETAILS, lisp_map_resolver_details)                 \
 _(LISP_MAP_SERVER_DETAILS, lisp_map_server_details)                     \
 _(LISP_ADJACENCIES_GET_REPLY, lisp_adjacencies_get_reply)               \
@@ -3965,59 +4035,6 @@ _(SW_INTERFACE_SET_DPDK_HQOS_TCTBL_REPLY,                               \
   sw_interface_set_dpdk_hqos_tctbl_reply)
 #endif
 
-/* M: construct, but don't yet send a message */
-
-#define M(T,t)                                          \
-do {                                                    \
-    vam->result_ready = 0;                              \
-    mp = vl_msg_api_alloc_as_if_client(sizeof(*mp));    \
-    memset (mp, 0, sizeof (*mp));                       \
-    mp->_vl_msg_id = ntohs (VL_API_##T);                \
-    mp->client_index = vam->my_client_index;            \
-} while(0);
-
-#define M2(T,t,n)                                               \
-do {                                                            \
-    vam->result_ready = 0;                                      \
-    mp = vl_msg_api_alloc_as_if_client(sizeof(*mp)+(n));        \
-    memset (mp, 0, sizeof (*mp));                               \
-    mp->_vl_msg_id = ntohs (VL_API_##T);                        \
-    mp->client_index = vam->my_client_index;                    \
-} while(0);
-
-
-/* S: send a message */
-#define S (vl_msg_api_send_shmem (vam->vl_input_queue, (u8 *)&mp))
-
-/* W: wait for results, with timeout */
-#define W                                       \
-do {                                            \
-    timeout = vat_time_now (vam) + 1.0;         \
-                                                \
-    while (vat_time_now (vam) < timeout) {      \
-        if (vam->result_ready == 1) {           \
-            return (vam->retval);               \
-        }                                       \
-        vat_suspend (vam->vlib_main, 1e-3);     \
-    }                                           \
-    return -99;                                 \
-} while(0);
-
-/* W2: wait for results, with timeout */
-#define W2(body)                                \
-do {                                            \
-    timeout = vat_time_now (vam) + 1.0;         \
-                                                \
-    while (vat_time_now (vam) < timeout) {      \
-        if (vam->result_ready == 1) {           \
-         (body);                               \
-         return (vam->retval);                 \
-        }                                       \
-        vat_suspend (vam->vlib_main, 1e-3);     \
-    }                                           \
-    return -99;                                 \
-} while(0);
-
 typedef struct
 {
   u8 *name;
@@ -4244,6 +4261,8 @@ dump_stats_table (vat_main_t * vam)
   u64 packets;
   ip4_fib_counter_t *c4;
   ip6_fib_counter_t *c6;
+  ip4_nbr_counter_t *n4;
+  ip6_nbr_counter_t *n6;
   int i, j;
 
   if (!vam->json_output)
@@ -4339,6 +4358,49 @@ dump_stats_table (vat_main_t * vam)
        }
     }
 
+  /* ip4 nbr counters */
+  msg_array = vat_json_object_add (&node, "ip4_nbr_counters");
+  vat_json_init_array (msg_array);
+  for (i = 0; i < vec_len (vam->ip4_nbr_counters); i++)
+    {
+      msg = vat_json_array_add (msg_array);
+      vat_json_init_object (msg);
+      vat_json_object_add_uint (msg, "sw_if_index", i);
+      counter_array = vat_json_object_add (msg, "c");
+      vat_json_init_array (counter_array);
+      for (j = 0; j < vec_len (vam->ip4_nbr_counters[i]); j++)
+       {
+         counter = vat_json_array_add (counter_array);
+         vat_json_init_object (counter);
+         n4 = &vam->ip4_nbr_counters[i][j];
+         vat_json_object_add_ip4 (counter, "address", n4->address);
+         vat_json_object_add_uint (counter, "link-type", n4->linkt);
+         vat_json_object_add_uint (counter, "packets", n4->packets);
+         vat_json_object_add_uint (counter, "bytes", n4->bytes);
+       }
+    }
+
+  /* ip6 nbr counters */
+  msg_array = vat_json_object_add (&node, "ip6_nbr_counters");
+  vat_json_init_array (msg_array);
+  for (i = 0; i < vec_len (vam->ip6_nbr_counters); i++)
+    {
+      msg = vat_json_array_add (msg_array);
+      vat_json_init_object (msg);
+      vat_json_object_add_uint (msg, "sw_if_index", i);
+      counter_array = vat_json_object_add (msg, "c");
+      vat_json_init_array (counter_array);
+      for (j = 0; j < vec_len (vam->ip6_nbr_counters[i]); j++)
+       {
+         counter = vat_json_array_add (counter_array);
+         vat_json_init_object (counter);
+         n6 = &vam->ip6_nbr_counters[i][j];
+         vat_json_object_add_ip6 (counter, "address", n6->address);
+         vat_json_object_add_uint (counter, "packets", n6->packets);
+         vat_json_object_add_uint (counter, "bytes", n6->bytes);
+       }
+    }
+
   vat_json_print (vam->ofp, &node);
   vat_json_free (&node);
 
@@ -5888,6 +5950,12 @@ api_tap_connect (vat_main_t * vam)
   u8 name_set = 0;
   u8 *tap_name;
   u8 *tag = 0;
+  ip4_address_t ip4_address;
+  u32 ip4_mask_width;
+  int ip4_address_set = 0;
+  ip6_address_t ip6_address;
+  u32 ip6_mask_width;
+  int ip6_address_set = 0;
 
   memset (mac_address, 0, sizeof (mac_address));
 
@@ -5904,6 +5972,12 @@ api_tap_connect (vat_main_t * vam)
        name_set = 1;
       else if (unformat (i, "tag %s", &tag))
        ;
+      else if (unformat (i, "address %U/%d",
+                        unformat_ip4_address, &ip4_address, &ip4_mask_width))
+       ip4_address_set = 1;
+      else if (unformat (i, "address %U/%d",
+                        unformat_ip6_address, &ip6_address, &ip6_mask_width))
+       ip6_address_set = 1;
       else
        break;
     }
@@ -5935,6 +6009,19 @@ api_tap_connect (vat_main_t * vam)
   if (tag)
     clib_memcpy (mp->tag, tag, vec_len (tag));
 
+  if (ip4_address_set)
+    {
+      mp->ip4_address_set = 1;
+      clib_memcpy (mp->ip4_address, &ip4_address, sizeof (mp->ip4_address));
+      mp->ip4_mask_width = ip4_mask_width;
+    }
+  if (ip6_address_set)
+    {
+      mp->ip6_address_set = 1;
+      clib_memcpy (mp->ip6_address, &ip6_address, sizeof (mp->ip6_address));
+      mp->ip6_mask_width = ip6_mask_width;
+    }
+
   vec_free (tap_name);
   vec_free (tag);
 
@@ -6346,6 +6433,126 @@ api_ip_add_del_route (vat_main_t * vam)
   return (vam->retval);
 }
 
+static int
+api_ip_mroute_add_del (vat_main_t * vam)
+{
+  unformat_input_t *i = vam->input;
+  vl_api_ip_mroute_add_del_t *mp;
+  f64 timeout;
+  u32 sw_if_index = ~0, vrf_id = 0;
+  u8 is_ipv6 = 0;
+  u8 is_local = 0;
+  u8 create_vrf_if_needed = 0;
+  u8 is_add = 1;
+  u8 address_set = 0;
+  u32 grp_address_length = 0;
+  ip4_address_t v4_grp_address, v4_src_address;
+  ip6_address_t v6_grp_address, v6_src_address;
+  mfib_itf_flags_t iflags = 0;
+  mfib_entry_flags_t eflags = 0;
+
+  /* Parse args required to build the message */
+  while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (i, "sw_if_index %d", &sw_if_index))
+       ;
+      else if (unformat (i, "%U %U",
+                        unformat_ip4_address, &v4_src_address,
+                        unformat_ip4_address, &v4_grp_address))
+       {
+         grp_address_length = 64;
+         address_set = 1;
+         is_ipv6 = 0;
+       }
+      else if (unformat (i, "%U %U",
+                        unformat_ip6_address, &v6_src_address,
+                        unformat_ip6_address, &v6_grp_address))
+       {
+         grp_address_length = 256;
+         address_set = 1;
+         is_ipv6 = 1;
+       }
+      else if (unformat (i, "%U", unformat_ip4_address, &v4_grp_address))
+       {
+         memset (&v4_src_address, 0, sizeof (v4_src_address));
+         grp_address_length = 32;
+         address_set = 1;
+         is_ipv6 = 0;
+       }
+      else if (unformat (i, "%U", unformat_ip6_address, &v6_grp_address))
+       {
+         memset (&v6_src_address, 0, sizeof (v6_src_address));
+         grp_address_length = 128;
+         address_set = 1;
+         is_ipv6 = 1;
+       }
+      else if (unformat (i, "/%d", &grp_address_length))
+       ;
+      else if (unformat (i, "local"))
+       {
+         is_local = 1;
+       }
+      else if (unformat (i, "del"))
+       is_add = 0;
+      else if (unformat (i, "add"))
+       is_add = 1;
+      else if (unformat (i, "vrf %d", &vrf_id))
+       ;
+      else if (unformat (i, "create-vrf"))
+       create_vrf_if_needed = 1;
+      else if (unformat (i, "%U", unformat_mfib_itf_flags, &iflags))
+       ;
+      else if (unformat (i, "%U", unformat_mfib_entry_flags, &eflags))
+       ;
+      else
+       {
+         clib_warning ("parse error '%U'", format_unformat_error, i);
+         return -99;
+       }
+    }
+
+  if (address_set == 0)
+    {
+      errmsg ("missing addresses\n");
+      return -99;
+    }
+
+  /* Construct the API message */
+  M (IP_MROUTE_ADD_DEL, ip_mroute_add_del);
+
+  mp->next_hop_sw_if_index = ntohl (sw_if_index);
+  mp->table_id = ntohl (vrf_id);
+  mp->create_vrf_if_needed = create_vrf_if_needed;
+
+  mp->is_add = is_add;
+  mp->is_ipv6 = is_ipv6;
+  mp->is_local = is_local;
+  mp->itf_flags = ntohl (iflags);
+  mp->entry_flags = ntohl (eflags);
+  mp->grp_address_length = grp_address_length;
+  mp->grp_address_length = ntohs (mp->grp_address_length);
+
+  if (is_ipv6)
+    {
+      clib_memcpy (mp->grp_address, &v6_grp_address, sizeof (v6_grp_address));
+      clib_memcpy (mp->src_address, &v6_src_address, sizeof (v6_src_address));
+    }
+  else
+    {
+      clib_memcpy (mp->grp_address, &v4_grp_address, sizeof (v4_grp_address));
+      clib_memcpy (mp->src_address, &v4_src_address, sizeof (v4_src_address));
+
+    }
+
+  /* send it... */
+  S;
+  /* Wait for a reply... */
+  W;
+
+  /* Return the good/bad news */
+  return (vam->retval);
+}
+
 static int
 api_mpls_route_add_del (vat_main_t * vam)
 {
@@ -7671,7 +7878,6 @@ api_sw_interface_ip6_set_link_local_address (vat_main_t * vam)
   f64 timeout;
   u32 sw_if_index;
   u8 sw_if_index_set = 0;
-  u32 address_length = 0;
   u8 v6_address_set = 0;
   ip6_address_t v6address;
 
@@ -7682,8 +7888,7 @@ api_sw_interface_ip6_set_link_local_address (vat_main_t * vam)
        sw_if_index_set = 1;
       else if (unformat (i, "sw_if_index %d", &sw_if_index))
        sw_if_index_set = 1;
-      else if (unformat (i, "%U/%d",
-                        unformat_ip6_address, &v6address, &address_length))
+      else if (unformat (i, "%U", unformat_ip6_address, &v6address))
        v6_address_set = 1;
       else
        break;
@@ -7706,7 +7911,6 @@ api_sw_interface_ip6_set_link_local_address (vat_main_t * vam)
 
   mp->sw_if_index = ntohl (sw_if_index);
   clib_memcpy (mp->address, &v6address, sizeof (v6address));
-  mp->address_length = address_length;
 
   /* send it... */
   S;
@@ -11995,11 +12199,7 @@ api_ipsec_sad_add_del_entry (vat_main_t * vam)
        if (unformat
            (i, "integ_alg %U", unformat_ipsec_integ_alg, &integ_alg))
        {
-#if DPDK_CRYPTO==1
-         if (integ_alg < IPSEC_INTEG_ALG_NONE ||
-#else
          if (integ_alg < IPSEC_INTEG_ALG_SHA1_96 ||
-#endif
              integ_alg >= IPSEC_INTEG_N_ALG)
            {
              clib_warning ("unsupported integ-alg: '%U'",
@@ -12017,33 +12217,6 @@ api_ipsec_sad_add_del_entry (vat_main_t * vam)
 
     }
 
-#if DPDK_CRYPTO==1
-  /*Special cases, aes-gcm-128 encryption */
-  if (crypto_alg == IPSEC_CRYPTO_ALG_AES_GCM_128)
-    {
-      if (integ_alg != IPSEC_INTEG_ALG_NONE
-         && integ_alg != IPSEC_INTEG_ALG_AES_GCM_128)
-       {
-         clib_warning
-           ("unsupported: aes-gcm-128 crypto-alg needs none as integ-alg");
-         return -99;
-       }
-      else                     /*set integ-alg internally to aes-gcm-128 */
-       integ_alg = IPSEC_INTEG_ALG_AES_GCM_128;
-    }
-  else if (integ_alg == IPSEC_INTEG_ALG_AES_GCM_128)
-    {
-      clib_warning ("unsupported integ-alg: aes-gcm-128");
-      return -99;
-    }
-  else if (integ_alg == IPSEC_INTEG_ALG_NONE)
-    {
-      clib_warning ("unsupported integ-alg: none");
-      return -99;
-    }
-#endif
-
-
   M (IPSEC_SAD_ADD_DEL_ENTRY, ipsec_sad_add_del_entry);
 
   mp->sad_id = ntohl (sad_id);
@@ -13268,6 +13441,7 @@ typedef CLIB_PACKED(struct
 static int
 api_lisp_gpe_add_del_fwd_entry (vat_main_t * vam)
 {
+  u32 dp_table = 0, vni = 0;;
   unformat_input_t *input = vam->input;
   vl_api_lisp_gpe_add_del_fwd_entry_t *mp;
   f64 timeout = ~0;
@@ -13275,10 +13449,11 @@ api_lisp_gpe_add_del_fwd_entry (vat_main_t * vam)
   lisp_eid_vat_t _rmt_eid, *rmt_eid = &_rmt_eid;
   lisp_eid_vat_t _lcl_eid, *lcl_eid = &_lcl_eid;
   u8 rmt_eid_set = 0, lcl_eid_set = 0;
-  u32 action = ~0, p, w;
+  u32 action = ~0, w;
   ip4_address_t rmt_rloc4, lcl_rloc4;
   ip6_address_t rmt_rloc6, lcl_rloc6;
-  rloc_t *rmt_locs = 0, *lcl_locs = 0, rloc, *curr_rloc = 0;
+  vl_api_lisp_gpe_locator_t *rmt_locs = 0, *lcl_locs = 0, rloc, *curr_rloc =
+    0;
 
   memset (&rloc, 0, sizeof (rloc));
 
@@ -13286,25 +13461,30 @@ api_lisp_gpe_add_del_fwd_entry (vat_main_t * vam)
   while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
     {
       if (unformat (input, "del"))
-       {
-         is_add = 0;
-       }
-      else if (unformat (input, "rmt_eid %U", unformat_lisp_eid_vat, rmt_eid))
+       is_add = 0;
+      else if (unformat (input, "add"))
+       is_add = 1;
+      else if (unformat (input, "reid %U", unformat_lisp_eid_vat, rmt_eid))
        {
          rmt_eid_set = 1;
        }
-      else if (unformat (input, "lcl_eid %U", unformat_lisp_eid_vat, lcl_eid))
+      else if (unformat (input, "leid %U", unformat_lisp_eid_vat, lcl_eid))
        {
          lcl_eid_set = 1;
        }
-      else if (unformat (input, "p %d w %d", &p, &w))
+      else if (unformat (input, "vrf %d", &dp_table))
+       ;
+      else if (unformat (input, "bd %d", &dp_table))
+       ;
+      else if (unformat (input, "vni %d", &vni))
+       ;
+      else if (unformat (input, "w %d", &w))
        {
          if (!curr_rloc)
            {
              errmsg ("No RLOC configured for setting priority/weight!");
              return -99;
            }
-         curr_rloc->priority = p;
          curr_rloc->weight = w;
        }
       else if (unformat (input, "loc-pair %U %U", unformat_ip4_address,
@@ -13313,12 +13493,12 @@ api_lisp_gpe_add_del_fwd_entry (vat_main_t * vam)
          rloc.is_ip4 = 1;
 
          clib_memcpy (&rloc.addr, &lcl_rloc4, sizeof (lcl_rloc4));
-         rloc.priority = rloc.weight = 0;
+         rloc.weight = 0;
          vec_add1 (lcl_locs, rloc);
 
          clib_memcpy (&rloc.addr, &rmt_rloc4, sizeof (rmt_rloc4));
          vec_add1 (rmt_locs, rloc);
-         /* priority and weight saved in rmt loc */
+         /* weight saved in rmt loc */
          curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
        }
       else if (unformat (input, "loc-pair %U %U", unformat_ip6_address,
@@ -13326,12 +13506,12 @@ api_lisp_gpe_add_del_fwd_entry (vat_main_t * vam)
        {
          rloc.is_ip4 = 0;
          clib_memcpy (&rloc.addr, &lcl_rloc6, sizeof (lcl_rloc6));
-         rloc.priority = rloc.weight = 0;
+         rloc.weight = 0;
          vec_add1 (lcl_locs, rloc);
 
          clib_memcpy (&rloc.addr, &rmt_rloc6, sizeof (rmt_rloc6));
          vec_add1 (rmt_locs, rloc);
-         /* priority and weight saved in rmt loc */
+         /* weight saved in rmt loc */
          curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
        }
       else if (unformat (input, "action %d", &action))
@@ -13364,23 +13544,28 @@ api_lisp_gpe_add_del_fwd_entry (vat_main_t * vam)
     }
 
   /* Construct the API message */
-  M (LISP_GPE_ADD_DEL_FWD_ENTRY, lisp_gpe_add_del_fwd_entry);
+  M2 (LISP_GPE_ADD_DEL_FWD_ENTRY, lisp_gpe_add_del_fwd_entry,
+      sizeof (vl_api_lisp_gpe_locator_t) * vec_len (rmt_locs) * 2);
 
   mp->is_add = is_add;
   lisp_eid_put_vat (mp->rmt_eid, rmt_eid->addr, rmt_eid->type);
   lisp_eid_put_vat (mp->lcl_eid, lcl_eid->addr, lcl_eid->type);
   mp->eid_type = rmt_eid->type;
+  mp->dp_table = clib_host_to_net_u32 (dp_table);
+  mp->vni = clib_host_to_net_u32 (vni);
   mp->rmt_len = rmt_eid->len;
   mp->lcl_len = lcl_eid->len;
   mp->action = action;
 
   if (0 != rmt_locs && 0 != lcl_locs)
     {
-      mp->loc_num = vec_len (rmt_locs);
-      clib_memcpy (mp->lcl_locs, lcl_locs,
-                  (sizeof (rloc_t) * vec_len (lcl_locs)));
-      clib_memcpy (mp->rmt_locs, rmt_locs,
-                  (sizeof (rloc_t) * vec_len (rmt_locs)));
+      mp->loc_num = clib_host_to_net_u32 (vec_len (rmt_locs) * 2);
+      clib_memcpy (mp->locs, lcl_locs,
+                  (sizeof (vl_api_lisp_gpe_locator_t) * vec_len (lcl_locs)));
+
+      u32 offset = sizeof (vl_api_lisp_gpe_locator_t) * vec_len (lcl_locs);
+      clib_memcpy (((u8 *) mp->locs) + offset, rmt_locs,
+                  (sizeof (vl_api_lisp_gpe_locator_t) * vec_len (rmt_locs)));
     }
   vec_free (lcl_locs);
   vec_free (rmt_locs);
@@ -14669,38 +14854,6 @@ api_lisp_eid_table_dump (vat_main_t * vam)
   return 0;
 }
 
-static int
-api_lisp_gpe_tunnel_dump (vat_main_t * vam)
-{
-  vl_api_lisp_gpe_tunnel_dump_t *mp;
-  f64 timeout = ~0;
-
-  if (!vam->json_output)
-    {
-      print (vam->ofp, "%=20s%=30s%=16s%=16s%=16s%=16s"
-            "%=16s%=16s%=16s%=16s%=16s",
-            "Tunel", "Source", "Destination", "Fib encap", "Fib decap",
-            "Decap next", "Lisp version", "Flags", "Next protocol",
-            "ver_res", "res", "iid");
-    }
-
-  M (LISP_GPE_TUNNEL_DUMP, lisp_gpe_tunnel_dump);
-  /* send it... */
-  S;
-
-  /* Use a control ping for synchronization */
-  {
-    vl_api_control_ping_t *mp;
-    M (CONTROL_PING, control_ping);
-    S;
-  }
-  /* Wait for a reply... */
-  W;
-
-  /* NOTREACHED */
-  return 0;
-}
-
 static int
 api_lisp_adjacencies_get (vat_main_t * vam)
 {
@@ -17498,6 +17651,9 @@ _(ip_add_del_route,                                                     \
   "[<intfc> | sw_if_index <id>] [resolve-attempts <n>]\n"               \
   "[weight <n>] [drop] [local] [classify <n>] [del]\n"                  \
   "[multipath] [count <n>]")                                            \
+_(ip_mroute_add_del,                                                    \
+  "<src> <grp>/<mask> [table-id <n>]\n"                                 \
+  "[<intfc> | sw_if_index <id>] [local] [del]")                         \
 _(mpls_route_add_del,                                                   \
   "<label> <eos> via <addr> [table-id <n>]\n"                           \
   "[<intfc> | sw_if_index <id>] [resolve-attempts <n>]\n"               \
@@ -17679,8 +17835,8 @@ _(lisp_add_del_local_eid,"vni <vni> eid "                               \
                          "<ipv4|ipv6>/<prefix> | <L2 address> "         \
                          "locator-set <locator_name> [del]"             \
                          "[key-id sha1|sha256 secret-key <secret-key>]") \
-_(lisp_gpe_add_del_fwd_entry, "rmt_eid <eid> [lcl_eid <eid>] vni <vni>" \
-  "dp_table <table> loc-pair <lcl_loc> <rmt_loc> ... [del]")            \
+_(lisp_gpe_add_del_fwd_entry, "reid <eid> [leid <eid>] vni <vni>"       \
+  "vrf/bd <dp_table> loc-pair <lcl_loc> <rmt_loc> w <weight>... [del]") \
 _(lisp_add_del_map_resolver, "<ip4|6-addr> [del]")                      \
 _(lisp_add_del_map_server, "<ip4|6-addr> [del]")                        \
 _(lisp_gpe_enable_disable, "enable|disable")                            \
@@ -17705,7 +17861,6 @@ _(lisp_eid_table_dump, "[eid <ipv4|ipv6>/<prefix> | <mac>] [vni] "      \
                        "[local] | [remote]")                            \
 _(lisp_eid_table_vni_dump, "")                                          \
 _(lisp_eid_table_map_dump, "l2|l3")                                     \
-_(lisp_gpe_tunnel_dump, "")                                             \
 _(lisp_map_resolver_dump, "")                                           \
 _(lisp_map_server_dump, "")                                             \
 _(lisp_adjacencies_get, "vni <vni>")                                    \