api: missing support for dumping of neighbours (VPP-333)
[vpp.git] / vpp-api-test / vat / api_format.c
index 958f75f..94495de 100644 (file)
@@ -1440,8 +1440,8 @@ static void vl_api_tap_delete_reply_t_handler_json
   vam->result_ready = 1;
 }
 
-static void vl_api_mpls_ethernet_add_del_tunnel_reply_t_handler
-  (vl_api_mpls_ethernet_add_del_tunnel_reply_t * mp)
+static void vl_api_mpls_tunnel_add_del_reply_t_handler
+  (vl_api_mpls_tunnel_add_del_reply_t * mp)
 {
   vat_main_t *vam = &vat_main;
   i32 retval = ntohl (mp->retval);
@@ -1456,8 +1456,8 @@ static void vl_api_mpls_ethernet_add_del_tunnel_reply_t_handler
     }
 }
 
-static void vl_api_mpls_ethernet_add_del_tunnel_reply_t_handler_json
-  (vl_api_mpls_ethernet_add_del_tunnel_reply_t * mp)
+static void vl_api_mpls_tunnel_add_del_reply_t_handler_json
+  (vl_api_mpls_tunnel_add_del_reply_t * mp)
 {
   vat_main_t *vam = &vat_main;
   vat_json_node_t node;
@@ -1465,7 +1465,7 @@ static void vl_api_mpls_ethernet_add_del_tunnel_reply_t_handler_json
   vat_json_init_object (&node);
   vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
   vat_json_object_add_uint (&node, "tunnel_sw_if_index",
-                           ntohl (mp->tunnel_sw_if_index));
+                           ntohl (mp->sw_if_index));
 
   vat_json_print (vam->ofp, &node);
   vat_json_free (&node);
@@ -2337,11 +2337,13 @@ vl_api_lisp_eid_table_details_t_handler (vl_api_lisp_eid_table_details_t * mp)
                mp->seid, mp->seid_prefix_len, mp->is_src_dst);
   vec_add1 (eid, 0);
 
-  fformat (vam->ofp, "[%d] %-35s%-20s%-30s%-20d%-d\n",
+  fformat (vam->ofp, "[%d] %-35s%-20s%-30s%-20d%-20d%-10d%-20s\n",
           clib_net_to_host_u32 (mp->vni),
           eid,
           mp->is_local ? "local" : "remote",
-          s, clib_net_to_host_u32 (mp->ttl), mp->authoritative);
+          s, clib_net_to_host_u32 (mp->ttl), mp->authoritative,
+          clib_net_to_host_u16 (mp->key_id), mp->key);
+
   vec_free (s);
   vec_free (eid);
 }
@@ -2379,6 +2381,13 @@ vl_api_lisp_eid_table_details_t_handler_json (vl_api_lisp_eid_table_details_t
   vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
   vat_json_object_add_uint (node, "ttl", clib_net_to_host_u32 (mp->ttl));
   vat_json_object_add_uint (node, "authoritative", (mp->authoritative));
+
+  if (mp->key_id)
+    {
+      vat_json_object_add_uint (node, "key_id",
+                               clib_net_to_host_u16 (mp->key_id));
+      vat_json_object_add_string_copy (node, "key", mp->key);
+    }
   vec_free (eid);
 }
 
@@ -2539,6 +2548,76 @@ static void
   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)
+{
+  vat_main_t *vam = &vat_main;
+  int retval = clib_net_to_host_u32 (mp->retval);
+
+  fformat (vam->ofp, "%s\n", mp->is_enabled ? "enabled" : "disabled");
+
+  vam->retval = retval;
+  vam->result_ready = 1;
+}
+
+static void
+  vl_api_show_lisp_map_register_state_reply_t_handler_json
+  (vl_api_show_lisp_map_register_state_reply_t * mp)
+{
+  vat_main_t *vam = &vat_main;
+  vat_json_node_t _node, *node = &_node;
+  int retval = clib_net_to_host_u32 (mp->retval);
+
+  u8 *s = format (0, "%s", mp->is_enabled ? "enabled" : "disabled");
+
+  vat_json_init_object (node);
+  vat_json_object_add_string_copy (node, "state", s);
+
+  vat_json_print (vam->ofp, node);
+  vat_json_free (node);
+
+  vam->retval = retval;
+  vam->result_ready = 1;
+  vec_free (s);
+}
+
+static void
+  vl_api_show_lisp_rloc_probe_state_reply_t_handler
+  (vl_api_show_lisp_rloc_probe_state_reply_t * mp)
+{
+  vat_main_t *vam = &vat_main;
+  int retval = clib_net_to_host_u32 (mp->retval);
+
+  if (retval)
+    goto end;
+
+  fformat (vam->ofp, "%s\n", mp->is_enabled ? "enabled" : "disabled");
+end:
+  vam->retval = retval;
+  vam->result_ready = 1;
+}
+
+static void
+  vl_api_show_lisp_rloc_probe_state_reply_t_handler_json
+  (vl_api_show_lisp_rloc_probe_state_reply_t * mp)
+{
+  vat_main_t *vam = &vat_main;
+  vat_json_node_t _node, *node = &_node;
+  int retval = clib_net_to_host_u32 (mp->retval);
+
+  u8 *s = format (0, "%s", mp->is_enabled ? "enabled" : "disabled");
+  vat_json_init_object (node);
+  vat_json_object_add_string_copy (node, "state", s);
+
+  vat_json_print (vam->ofp, node);
+  vat_json_free (node);
+
+  vam->retval = retval;
+  vam->result_ready = 1;
+  vec_free (s);
+}
+
 static void
   vl_api_lisp_adjacencies_get_reply_t_handler
   (vl_api_lisp_adjacencies_get_reply_t * mp)
@@ -2611,6 +2690,46 @@ end:
   vam->result_ready = 1;
 }
 
+static void
+vl_api_lisp_map_server_details_t_handler (vl_api_lisp_map_server_details_t
+                                         * mp)
+{
+  vat_main_t *vam = &vat_main;
+
+  fformat (vam->ofp, "%=20U\n",
+          mp->is_ipv6 ? format_ip6_address : format_ip4_address,
+          mp->ip_address);
+}
+
+static void
+  vl_api_lisp_map_server_details_t_handler_json
+  (vl_api_lisp_map_server_details_t * mp)
+{
+  vat_main_t *vam = &vat_main;
+  vat_json_node_t *node = NULL;
+  struct in6_addr ip6;
+  struct in_addr ip4;
+
+  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);
+  if (mp->is_ipv6)
+    {
+      clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
+      vat_json_object_add_ip6 (node, "map-server", ip6);
+    }
+  else
+    {
+      clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
+      vat_json_object_add_ip4 (node, "map-server", ip4);
+    }
+}
+
 static void
 vl_api_lisp_map_resolver_details_t_handler (vl_api_lisp_map_resolver_details_t
                                            * mp)
@@ -3461,8 +3580,6 @@ _(mpls_route_add_del_reply)                             \
 _(mpls_ip_bind_unbind_reply)                            \
 _(proxy_arp_add_del_reply)                              \
 _(proxy_arp_intfc_enable_disable_reply)                 \
-_(mpls_add_del_encap_reply)                             \
-_(mpls_ethernet_add_del_tunnel_2_reply)                 \
 _(sw_interface_set_unnumbered_reply)                    \
 _(ip_neighbor_add_del_reply)                            \
 _(reset_vrf_reply)                                      \
@@ -3523,9 +3640,12 @@ _(lisp_add_del_remote_mapping_reply)                    \
 _(lisp_add_del_adjacency_reply)                         \
 _(lisp_gpe_add_del_fwd_entry_reply)                     \
 _(lisp_add_del_map_resolver_reply)                      \
+_(lisp_add_del_map_server_reply)                        \
 _(lisp_gpe_enable_disable_reply)                        \
 _(lisp_gpe_add_del_iface_reply)                         \
 _(lisp_enable_disable_reply)                            \
+_(lisp_rloc_probe_enable_disable_reply)                 \
+_(lisp_map_register_enable_disable_reply)               \
 _(lisp_pitr_set_locator_set_reply)                      \
 _(lisp_map_request_mode_reply)                          \
 _(lisp_add_del_map_request_itr_rlocs_reply)             \
@@ -3548,7 +3668,8 @@ _(delete_subif_reply)                                   \
 _(l2_interface_pbb_tag_rewrite_reply)                   \
 _(punt_reply)                                           \
 _(feature_enable_disable_reply)                                \
-_(sw_interface_tag_add_del_reply)
+_(sw_interface_tag_add_del_reply)                      \
+_(sw_interface_set_mtu_reply)
 
 #define _(n)                                    \
     static void vl_api_##n##_t_handler          \
@@ -3626,11 +3747,7 @@ _(MPLS_IP_BIND_UNBIND_REPLY, mpls_ip_bind_unbind_reply)                  \
 _(PROXY_ARP_ADD_DEL_REPLY, proxy_arp_add_del_reply)                     \
 _(PROXY_ARP_INTFC_ENABLE_DISABLE_REPLY,                                 \
   proxy_arp_intfc_enable_disable_reply)                                 \
-_(MPLS_ADD_DEL_ENCAP_REPLY, mpls_add_del_encap_reply)                   \
-_(MPLS_ETHERNET_ADD_DEL_TUNNEL_REPLY,                                   \
-  mpls_ethernet_add_del_tunnel_reply)                                   \
-_(MPLS_ETHERNET_ADD_DEL_TUNNEL_2_REPLY,                                 \
-  mpls_ethernet_add_del_tunnel_2_reply)                                 \
+_(MPLS_TUNNEL_ADD_DEL_REPLY, mpls_tunnel_add_del_reply)                 \
 _(SW_INTERFACE_SET_UNNUMBERED_REPLY,                                    \
   sw_interface_set_unnumbered_reply)                                    \
 _(IP_NEIGHBOR_ADD_DEL_REPLY, ip_neighbor_add_del_reply)                 \
@@ -3731,8 +3848,13 @@ _(LISP_ADD_DEL_REMOTE_MAPPING_REPLY, lisp_add_del_remote_mapping_reply) \
 _(LISP_ADD_DEL_ADJACENCY_REPLY, lisp_add_del_adjacency_reply)           \
 _(LISP_GPE_ADD_DEL_FWD_ENTRY_REPLY, lisp_gpe_add_del_fwd_entry_reply)   \
 _(LISP_ADD_DEL_MAP_RESOLVER_REPLY, lisp_add_del_map_resolver_reply)     \
+_(LISP_ADD_DEL_MAP_SERVER_REPLY, lisp_add_del_map_server_reply)         \
 _(LISP_GPE_ENABLE_DISABLE_REPLY, lisp_gpe_enable_disable_reply)         \
 _(LISP_ENABLE_DISABLE_REPLY, lisp_enable_disable_reply)                 \
+_(LISP_MAP_REGISTER_ENABLE_DISABLE_REPLY,                               \
+  lisp_map_register_enable_disable_reply)                               \
+_(LISP_RLOC_PROBE_ENABLE_DISABLE_REPLY,                                 \
+  lisp_rloc_probe_enable_disable_reply)                                 \
 _(LISP_PITR_SET_LOCATOR_SET_REPLY, lisp_pitr_set_locator_set_reply)     \
 _(LISP_MAP_REQUEST_MODE_REPLY, lisp_map_request_mode_reply)             \
 _(LISP_EID_TABLE_ADD_DEL_MAP_REPLY, lisp_eid_table_add_del_map_reply)   \
@@ -3744,6 +3866,7 @@ _(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)               \
 _(SHOW_LISP_STATUS_REPLY, show_lisp_status_reply)                       \
 _(LISP_ADD_DEL_MAP_REQUEST_ITR_RLOCS_REPLY,                             \
@@ -3752,6 +3875,9 @@ _(LISP_GET_MAP_REQUEST_ITR_RLOCS_REPLY,                                 \
   lisp_get_map_request_itr_rlocs_reply)                                 \
 _(SHOW_LISP_PITR_REPLY, show_lisp_pitr_reply)                           \
 _(SHOW_LISP_MAP_REQUEST_MODE_REPLY, show_lisp_map_request_mode_reply)   \
+_(SHOW_LISP_RLOC_PROBE_STATE_REPLY, show_lisp_rloc_probe_state_reply)   \
+_(SHOW_LISP_MAP_REGISTER_STATE_REPLY,                                   \
+  show_lisp_map_register_state_reply)                                   \
 _(AF_PACKET_CREATE_REPLY, af_packet_create_reply)                       \
 _(AF_PACKET_DELETE_REPLY, af_packet_delete_reply)                       \
 _(POLICER_ADD_DEL_REPLY, policer_add_del_reply)                         \
@@ -3760,8 +3886,7 @@ _(POLICER_CLASSIFY_SET_INTERFACE_REPLY, policer_classify_set_interface_reply) \
 _(POLICER_CLASSIFY_DETAILS, policer_classify_details)                   \
 _(NETMAP_CREATE_REPLY, netmap_create_reply)                             \
 _(NETMAP_DELETE_REPLY, netmap_delete_reply)                             \
-_(MPLS_ETH_TUNNEL_DETAILS, mpls_eth_tunnel_details)                     \
-_(MPLS_FIB_ENCAP_DETAILS, mpls_fib_encap_details)                       \
+_(MPLS_TUNNEL_DETAILS, mpls_tunnel_details)                             \
 _(MPLS_FIB_DETAILS, mpls_fib_details)                                   \
 _(CLASSIFY_TABLE_IDS_REPLY, classify_table_ids_reply)                   \
 _(CLASSIFY_TABLE_BY_INTERFACE_REPLY, classify_table_by_interface_reply) \
@@ -3792,8 +3917,11 @@ _(L2_INTERFACE_PBB_TAG_REWRITE_REPLY, l2_interface_pbb_tag_rewrite_reply) \
 _(PUNT_REPLY, punt_reply)                                               \
 _(IP_FIB_DETAILS, ip_fib_details)                                       \
 _(IP6_FIB_DETAILS, ip6_fib_details)                                     \
-_(FEATURE_ENABLE_DISABLE_REPLY, feature_enable_disable_reply)          \
-_(SW_INTERFACE_TAG_ADD_DEL_REPLY, sw_interface_tag_add_del_reply)
+_(FEATURE_ENABLE_DISABLE_REPLY, feature_enable_disable_reply)           \
+_(SW_INTERFACE_TAG_ADD_DEL_REPLY, sw_interface_tag_add_del_reply)      \
+_(L2_XCONNECT_DETAILS, l2_xconnect_details)                             \
+_(SW_INTERFACE_SET_MTU_REPLY, sw_interface_set_mtu_reply)               \
+_(IP_NEIGHBOR_DETAILS, ip_neighbor_details)
 
 /* M: construct, but don't yet send a message */
 
@@ -5304,7 +5432,7 @@ api_l2fib_add_del (vat_main_t * vam)
   u8 mac_set = 0;
   u32 bd_id;
   u8 bd_id_set = 0;
-  u32 sw_if_index;
+  u32 sw_if_index = ~0;
   u8 sw_if_index_set = 0;
   u8 is_add = 1;
   u8 static_mac = 0;
@@ -5365,7 +5493,7 @@ api_l2fib_add_del (vat_main_t * vam)
       return -99;
     }
 
-  if (is_add && (sw_if_index_set == 0))
+  if (is_add && sw_if_index_set == 0 && filter_mac == 0)
     {
       errmsg ("missing interface name or sw_if_index\n");
       return -99;
@@ -5646,7 +5774,8 @@ api_tap_connect (vat_main_t * vam)
        random_mac = 1;
       else if (unformat (i, "tapname %s", &tap_name))
        name_set = 1;
-      else if (unformat (i, "tag %s", &tag));
+      else if (unformat (i, "tag %s", &tag))
+       ;
       else
        break;
     }
@@ -5668,7 +5797,6 @@ api_tap_connect (vat_main_t * vam)
       errmsg ("tag too long\n");
       return -99;
     }
-  vec_add1 (tag, 0);
 
   /* Construct the API message */
   M (TAP_CONNECT, tap_connect);
@@ -5800,7 +5928,6 @@ api_ip_add_del_route (vat_main_t * vam)
   vl_api_ip_add_del_route_t *mp;
   f64 timeout;
   u32 sw_if_index = ~0, vrf_id = 0;
-  u8 sw_if_index_set = 0;
   u8 is_ipv6 = 0;
   u8 is_local = 0, is_drop = 0;
   u8 is_unreach = 0, is_prohibit = 0;
@@ -5827,15 +5954,17 @@ api_ip_add_del_route (vat_main_t * vam)
   u32 classify_table_index = ~0;
   u8 is_classify = 0;
   u8 resolve_host = 0, resolve_attached = 0;
+  mpls_label_t *next_hop_out_label_stack = NULL;
   mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
+  mpls_label_t next_hop_via_label = MPLS_LABEL_INVALID;
 
   /* Parse args required to build the message */
   while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
     {
       if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
-       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", unformat_ip4_address, &v4_dst_address))
        {
          address_set = 1;
@@ -5908,6 +6037,8 @@ api_ip_add_del_route (vat_main_t * vam)
       else if (unformat (i, "next-hop-table %d", &next_hop_table_id))
        ;
       else if (unformat (i, "out-label %d", &next_hop_out_label))
+       vec_add1 (next_hop_out_label_stack, ntohl (next_hop_out_label));
+      else if (unformat (i, "via-label %d", &next_hop_via_label))
        ;
       else if (unformat (i, "random"))
        random_add_del = 1;
@@ -5920,20 +6051,20 @@ api_ip_add_del_route (vat_main_t * vam)
        }
     }
 
-  if (resolve_attempts > 0 && sw_if_index_set == 0)
-    {
-      errmsg ("ARP resolution needs explicit interface or sw_if_index\n");
-      return -99;
-    }
-
   if (!next_hop_set && !is_drop && !is_local &&
-      !is_classify && !is_unreach && !is_prohibit)
+      !is_classify && !is_unreach && !is_prohibit &&
+      MPLS_LABEL_INVALID == next_hop_via_label)
     {
       errmsg
        ("next hop / local / drop / unreach / prohibit / classify not set\n");
       return -99;
     }
 
+  if (next_hop_set && MPLS_LABEL_INVALID != next_hop_via_label)
+    {
+      errmsg ("next hop and next-hop via label set\n");
+      return -99;
+    }
   if (address_set == 0)
     {
       errmsg ("missing addresses\n");
@@ -5980,15 +6111,11 @@ api_ip_add_del_route (vat_main_t * vam)
   for (j = 0; j < count; j++)
     {
       /* Construct the API message */
-      M (IP_ADD_DEL_ROUTE, ip_add_del_route);
+      M2 (IP_ADD_DEL_ROUTE, ip_add_del_route,
+         sizeof (mpls_label_t) * vec_len (next_hop_out_label_stack));
 
       mp->next_hop_sw_if_index = ntohl (sw_if_index);
       mp->table_id = ntohl (vrf_id);
-      if (resolve_attempts > 0)
-       {
-         mp->resolve_attempts = ntohl (resolve_attempts);
-         mp->resolve_if_needed = 1;
-       }
       mp->create_vrf_if_needed = create_vrf_if_needed;
 
       mp->is_add = is_add;
@@ -6006,7 +6133,15 @@ api_ip_add_del_route (vat_main_t * vam)
       mp->dst_address_length = dst_address_length;
       mp->next_hop_table_id = ntohl (next_hop_table_id);
       mp->classify_table_index = ntohl (classify_table_index);
-      mp->next_hop_out_label = ntohl (next_hop_out_label);
+      mp->next_hop_via_label = ntohl (next_hop_via_label);
+      mp->next_hop_n_out_labels = vec_len (next_hop_out_label_stack);
+      if (0 != mp->next_hop_n_out_labels)
+       {
+         memcpy (mp->next_hop_out_label_stack,
+                 next_hop_out_label_stack,
+                 vec_len (next_hop_out_label_stack) * sizeof (mpls_label_t));
+         vec_free (next_hop_out_label_stack);
+       }
 
       if (is_ipv6)
        {
@@ -6106,9 +6241,11 @@ api_mpls_route_add_del (vat_main_t * vam)
   u32 classify_table_index = ~0;
   u8 is_classify = 0;
   u8 resolve_host = 0, resolve_attached = 0;
+  mpls_label_t next_hop_via_label = MPLS_LABEL_INVALID;
   mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
+  mpls_label_t *next_hop_out_label_stack = NULL;
   mpls_label_t local_label = MPLS_LABEL_INVALID;
-  u8 is_eos = 1;
+  u8 is_eos = 0;
   u8 next_hop_proto_is_ip4 = 1;
 
   /* Parse args required to build the message */
@@ -6168,8 +6305,10 @@ api_mpls_route_add_del (vat_main_t * vam)
        }
       else if (unformat (i, "next-hop-table %d", &next_hop_table_id))
        ;
-      else if (unformat (i, "out-label %d", &next_hop_out_label))
+      else if (unformat (i, "via-label %d", &next_hop_via_label))
        ;
+      else if (unformat (i, "out-label %d", &next_hop_out_label))
+       vec_add1 (next_hop_out_label_stack, ntohl (next_hop_out_label));
       else
        {
          clib_warning ("parse error '%U'", format_unformat_error, i);
@@ -6200,7 +6339,8 @@ api_mpls_route_add_del (vat_main_t * vam)
   for (j = 0; j < count; j++)
     {
       /* Construct the API message */
-      M (MPLS_ROUTE_ADD_DEL, mpls_route_add_del);
+      M2 (MPLS_ROUTE_ADD_DEL, mpls_route_add_del,
+         sizeof (mpls_label_t) * vec_len (next_hop_out_label_stack));
 
       mp->mr_next_hop_sw_if_index = ntohl (sw_if_index);
       mp->mr_table_id = ntohl (table_id);
@@ -6215,10 +6355,19 @@ api_mpls_route_add_del (vat_main_t * vam)
       mp->mr_next_hop_weight = next_hop_weight;
       mp->mr_next_hop_table_id = ntohl (next_hop_table_id);
       mp->mr_classify_table_index = ntohl (classify_table_index);
-      mp->mr_next_hop_out_label = ntohl (next_hop_out_label);
+      mp->mr_next_hop_via_label = ntohl (next_hop_via_label);
       mp->mr_label = ntohl (local_label);
       mp->mr_eos = is_eos;
 
+      mp->mr_next_hop_n_out_labels = vec_len (next_hop_out_label_stack);
+      if (0 != mp->mr_next_hop_n_out_labels)
+       {
+         memcpy (mp->mr_next_hop_out_label_stack,
+                 next_hop_out_label_stack,
+                 vec_len (next_hop_out_label_stack) * sizeof (mpls_label_t));
+         vec_free (next_hop_out_label_stack);
+       }
+
       if (next_hop_set)
        {
          if (next_hop_proto_is_ip4)
@@ -6464,95 +6613,49 @@ api_proxy_arp_intfc_enable_disable (vat_main_t * vam)
 }
 
 static int
-api_mpls_add_del_encap (vat_main_t * vam)
+api_mpls_tunnel_add_del (vat_main_t * vam)
 {
   unformat_input_t *i = vam->input;
-  vl_api_mpls_add_del_encap_t *mp;
+  vl_api_mpls_tunnel_add_del_t *mp;
   f64 timeout;
-  u32 vrf_id = 0;
-  u32 *labels = 0;
-  u32 label;
-  ip4_address_t dst_address;
-  u8 is_add = 1;
-
-  while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
-    {
-      if (unformat (i, "vrf %d", &vrf_id))
-       ;
-      else if (unformat (i, "label %d", &label))
-       vec_add1 (labels, ntohl (label));
-      else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
-       ;
-      else if (unformat (i, "del"))
-       is_add = 0;
-      else
-       {
-         clib_warning ("parse error '%U'", format_unformat_error, i);
-         return -99;
-       }
-    }
-
-  if (vec_len (labels) == 0)
-    {
-      errmsg ("missing encap label stack\n");
-      return -99;
-    }
-
-  M2 (MPLS_ADD_DEL_ENCAP, mpls_add_del_encap,
-      sizeof (u32) * vec_len (labels));
-
-  mp->vrf_id = ntohl (vrf_id);
-  clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
-  mp->is_add = is_add;
-  mp->nlabels = vec_len (labels);
-  clib_memcpy (mp->labels, labels, sizeof (u32) * mp->nlabels);
 
-  vec_free (labels);
-
-  S;
-  W;
-  /* NOTREACHED */
-  return 0;
-}
-
-static int
-api_mpls_ethernet_add_del_tunnel (vat_main_t * vam)
-{
-  unformat_input_t *i = vam->input;
-  vl_api_mpls_ethernet_add_del_tunnel_t *mp;
-  f64 timeout;
-  u32 inner_vrf_id = 0;
-  ip4_address_t intfc_address;
-  u8 dst_mac_address[6];
-  int dst_set = 1;
-  u32 tmp;
-  u8 intfc_address_length = 0;
   u8 is_add = 1;
   u8 l2_only = 0;
-  u32 tx_sw_if_index;
-  int tx_sw_if_index_set = 0;
+  u32 sw_if_index = ~0;
+  u32 next_hop_sw_if_index = ~0;
+  u32 next_hop_proto_is_ip4 = 1;
 
-  /* Shut up coverity */
-  memset (dst_mac_address, 0, sizeof (dst_mac_address));
+  u32 next_hop_table_id = 0;
+  ip4_address_t v4_next_hop_address = {
+    .as_u32 = 0,
+  };
+  ip6_address_t v6_next_hop_address = { {0} };
+  mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID, *labels = NULL;
 
   while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
     {
-      if (unformat (i, "vrf %d", &inner_vrf_id))
+      if (unformat (i, "add"))
+       is_add = 1;
+      else if (unformat (i, "del sw_if_index %d", &sw_if_index))
+       is_add = 0;
+      else if (unformat (i, "sw_if_index %d", &next_hop_sw_if_index))
        ;
-      else if (unformat (i, "adj %U/%d", unformat_ip4_address,
-                        &intfc_address, &tmp))
-       intfc_address_length = tmp;
-      else if (unformat (i, "%U", unformat_sw_if_index, vam, &tx_sw_if_index))
-       tx_sw_if_index_set = 1;
-      else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
-       tx_sw_if_index_set = 1;
-      else if (unformat (i, "dst %U", unformat_ethernet_address,
-                        dst_mac_address))
-       dst_set = 1;
+      else if (unformat (i, "via %U",
+                        unformat_ip4_address, &v4_next_hop_address))
+       {
+         next_hop_proto_is_ip4 = 1;
+       }
+      else if (unformat (i, "via %U",
+                        unformat_ip6_address, &v6_next_hop_address))
+       {
+         next_hop_proto_is_ip4 = 0;
+       }
       else if (unformat (i, "l2-only"))
        l2_only = 1;
-      else if (unformat (i, "del"))
-       is_add = 0;
+      else if (unformat (i, "next-hop-table %d", &next_hop_table_id))
+       ;
+      else if (unformat (i, "out-label %d", &next_hop_out_label))
+       vec_add1 (labels, ntohl (next_hop_out_label));
       else
        {
          clib_warning ("parse error '%U'", format_unformat_error, i);
@@ -6560,107 +6663,36 @@ api_mpls_ethernet_add_del_tunnel (vat_main_t * vam)
        }
     }
 
-  if (!dst_set)
-    {
-      errmsg ("dst (mac address) not set\n");
-      return -99;
-    }
-  if (!tx_sw_if_index_set)
-    {
-      errmsg ("tx-intfc not set\n");
-      return -99;
-    }
-
-  M (MPLS_ETHERNET_ADD_DEL_TUNNEL, mpls_ethernet_add_del_tunnel);
-
-  mp->vrf_id = ntohl (inner_vrf_id);
-  clib_memcpy (mp->adj_address, &intfc_address, sizeof (intfc_address));
-  mp->adj_address_length = intfc_address_length;
-  clib_memcpy (mp->dst_mac_address, dst_mac_address,
-              sizeof (dst_mac_address));
-  mp->tx_sw_if_index = ntohl (tx_sw_if_index);
-  mp->l2_only = l2_only;
-  mp->is_add = is_add;
+  M2 (MPLS_TUNNEL_ADD_DEL, mpls_tunnel_add_del,
+      sizeof (mpls_label_t) * vec_len (labels));
 
-  S;
-  W;
-  /* NOTREACHED */
-  return 0;
-}
+  mp->mt_next_hop_sw_if_index = ntohl (next_hop_sw_if_index);
+  mp->mt_sw_if_index = ntohl (sw_if_index);
+  mp->mt_is_add = is_add;
+  mp->mt_l2_only = l2_only;
+  mp->mt_next_hop_table_id = ntohl (next_hop_table_id);
+  mp->mt_next_hop_proto_is_ip4 = next_hop_proto_is_ip4;
 
-static int
-api_mpls_ethernet_add_del_tunnel_2 (vat_main_t * vam)
-{
-  unformat_input_t *i = vam->input;
-  vl_api_mpls_ethernet_add_del_tunnel_2_t *mp;
-  f64 timeout;
-  u32 inner_vrf_id = 0;
-  u32 outer_vrf_id = 0;
-  ip4_address_t adj_address;
-  int adj_address_set = 0;
-  ip4_address_t next_hop_address;
-  int next_hop_address_set = 0;
-  u32 tmp;
-  u8 adj_address_length = 0;
-  u8 l2_only = 0;
-  u8 is_add = 1;
-  u32 resolve_attempts = 5;
-  u8 resolve_if_needed = 1;
+  mp->mt_next_hop_n_out_labels = vec_len (labels);
 
-  while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+  if (0 != mp->mt_next_hop_n_out_labels)
     {
-      if (unformat (i, "inner_vrf_id %d", &inner_vrf_id))
-       ;
-      else if (unformat (i, "outer_vrf_id %d", &outer_vrf_id))
-       ;
-      else if (unformat (i, "adj %U/%d", unformat_ip4_address,
-                        &adj_address, &tmp))
-       {
-         adj_address_length = tmp;
-         adj_address_set = 1;
-       }
-      else if (unformat (i, "next-hop %U", unformat_ip4_address,
-                        &next_hop_address))
-       next_hop_address_set = 1;
-      else if (unformat (i, "resolve-attempts %d", &resolve_attempts))
-       ;
-      else if (unformat (i, "resolve-if-needed %d", &tmp))
-       resolve_if_needed = tmp;
-      else if (unformat (i, "l2-only"))
-       l2_only = 1;
-      else if (unformat (i, "del"))
-       is_add = 0;
-      else
-       {
-         clib_warning ("parse error '%U'", format_unformat_error, i);
-         return -99;
-       }
+      clib_memcpy (mp->mt_next_hop_out_label_stack, labels,
+                  sizeof (mpls_label_t) * mp->mt_next_hop_n_out_labels);
+      vec_free (labels);
     }
 
-  if (!adj_address_set)
+  if (next_hop_proto_is_ip4)
     {
-      errmsg ("adjacency address/mask not set\n");
-      return -99;
+      clib_memcpy (mp->mt_next_hop,
+                  &v4_next_hop_address, sizeof (v4_next_hop_address));
     }
-  if (!next_hop_address_set)
+  else
     {
-      errmsg ("ip4 next hop address (in outer fib) not set\n");
-      return -99;
+      clib_memcpy (mp->mt_next_hop,
+                  &v6_next_hop_address, sizeof (v6_next_hop_address));
     }
 
-  M (MPLS_ETHERNET_ADD_DEL_TUNNEL_2, mpls_ethernet_add_del_tunnel_2);
-
-  mp->inner_vrf_id = ntohl (inner_vrf_id);
-  mp->outer_vrf_id = ntohl (outer_vrf_id);
-  mp->resolve_attempts = ntohl (resolve_attempts);
-  mp->resolve_if_needed = resolve_if_needed;
-  mp->is_add = is_add;
-  mp->l2_only = l2_only;
-  clib_memcpy (mp->adj_address, &adj_address, sizeof (adj_address));
-  mp->adj_address_length = adj_address_length;
-  clib_memcpy (mp->next_hop_ip4_address_in_outer_vrf, &next_hop_address,
-              sizeof (next_hop_address));
-
   S;
   W;
   /* NOTREACHED */
@@ -12949,6 +12981,31 @@ api_lisp_add_del_locator (vat_main_t * vam)
   return 0;
 }
 
+uword
+unformat_hmac_key_id (unformat_input_t * input, va_list * args)
+{
+  u32 *key_id = va_arg (*args, u32 *);
+  u8 *s = 0;
+
+  if (unformat (input, "%s", &s))
+    {
+      if (!strcmp ((char *) s, "sha1"))
+       key_id[0] = HMAC_SHA_1_96;
+      else if (!strcmp ((char *) s, "sha256"))
+       key_id[0] = HMAC_SHA_256_128;
+      else
+       {
+         clib_warning ("invalid key_id: '%s'", s);
+         key_id[0] = HMAC_NO_KEY;
+       }
+    }
+  else
+    return 0;
+
+  vec_free (s);
+  return 1;
+}
+
 static int
 api_lisp_add_del_local_eid (vat_main_t * vam)
 {
@@ -12961,6 +13018,8 @@ api_lisp_add_del_local_eid (vat_main_t * vam)
   u8 *locator_set_name = 0;
   u8 locator_set_name_set = 0;
   u32 vni = 0;
+  u16 key_id = 0;
+  u8 *key = 0;
 
   /* Parse args required to build the message */
   while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
@@ -12981,6 +13040,10 @@ api_lisp_add_del_local_eid (vat_main_t * vam)
        {
          locator_set_name_set = 1;
        }
+      else if (unformat (input, "key-id %U", unformat_hmac_key_id, &key_id))
+       ;
+      else if (unformat (input, "secret-key %_%v%_", &key))
+       ;
       else
        break;
     }
@@ -12998,6 +13061,19 @@ api_lisp_add_del_local_eid (vat_main_t * vam)
       return -99;
     }
 
+  if (key && (0 == key_id))
+    {
+      errmsg ("invalid key_id!");
+      return -99;
+    }
+
+  if (vec_len (key) > 64)
+    {
+      errmsg ("key too long");
+      vec_free (key);
+      return -99;
+    }
+
   if (vec_len (locator_set_name) > 64)
     {
       errmsg ("locator-set name too long\n");
@@ -13014,10 +13090,13 @@ api_lisp_add_del_local_eid (vat_main_t * vam)
   mp->eid_type = eid->type;
   mp->prefix_len = eid->len;
   mp->vni = clib_host_to_net_u32 (vni);
+  mp->key_id = clib_host_to_net_u16 (key_id);
   clib_memcpy (mp->locator_set_name, locator_set_name,
               vec_len (locator_set_name));
+  clib_memcpy (mp->key, key, vec_len (key));
 
   vec_free (locator_set_name);
+  vec_free (key);
 
   /* send it... */
   S;
@@ -13171,10 +13250,10 @@ api_lisp_gpe_add_del_fwd_entry (vat_main_t * vam)
 }
 
 static int
-api_lisp_add_del_map_resolver (vat_main_t * vam)
+api_lisp_add_del_map_server (vat_main_t * vam)
 {
   unformat_input_t *input = vam->input;
-  vl_api_lisp_add_del_map_resolver_t *mp;
+  vl_api_lisp_add_del_map_server_t *mp;
   f64 timeout = ~0;
   u8 is_add = 1;
   u8 ipv4_set = 0;
@@ -13214,7 +13293,75 @@ api_lisp_add_del_map_resolver (vat_main_t * vam)
     }
 
   /* Construct the API message */
-  M (LISP_ADD_DEL_MAP_RESOLVER, lisp_add_del_map_resolver);
+  M (LISP_ADD_DEL_MAP_SERVER, lisp_add_del_map_server);
+
+  mp->is_add = is_add;
+  if (ipv6_set)
+    {
+      mp->is_ipv6 = 1;
+      clib_memcpy (mp->ip_address, &ipv6, sizeof (ipv6));
+    }
+  else
+    {
+      mp->is_ipv6 = 0;
+      clib_memcpy (mp->ip_address, &ipv4, sizeof (ipv4));
+    }
+
+  /* send it... */
+  S;
+
+  /* Wait for a reply... */
+  W;
+
+  /* NOTREACHED */
+  return 0;
+}
+
+static int
+api_lisp_add_del_map_resolver (vat_main_t * vam)
+{
+  unformat_input_t *input = vam->input;
+  vl_api_lisp_add_del_map_resolver_t *mp;
+  f64 timeout = ~0;
+  u8 is_add = 1;
+  u8 ipv4_set = 0;
+  u8 ipv6_set = 0;
+  ip4_address_t ipv4;
+  ip6_address_t ipv6;
+
+  /* Parse args required to build the message */
+  while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (input, "del"))
+       {
+         is_add = 0;
+       }
+      else if (unformat (input, "%U", unformat_ip4_address, &ipv4))
+       {
+         ipv4_set = 1;
+       }
+      else if (unformat (input, "%U", unformat_ip6_address, &ipv6))
+       {
+         ipv6_set = 1;
+       }
+      else
+       break;
+    }
+
+  if (ipv4_set && ipv6_set)
+    {
+      errmsg ("both eid v4 and v6 addresses set\n");
+      return -99;
+    }
+
+  if (!ipv4_set && !ipv6_set)
+    {
+      errmsg ("eid addresses not set\n");
+      return -99;
+    }
+
+  /* Construct the API message */
+  M (LISP_ADD_DEL_MAP_RESOLVER, lisp_add_del_map_resolver);
 
   mp->is_add = is_add;
   if (ipv6_set)
@@ -13285,6 +13432,94 @@ api_lisp_gpe_enable_disable (vat_main_t * vam)
   return 0;
 }
 
+static int
+api_lisp_rloc_probe_enable_disable (vat_main_t * vam)
+{
+  unformat_input_t *input = vam->input;
+  vl_api_lisp_rloc_probe_enable_disable_t *mp;
+  f64 timeout = ~0;
+  u8 is_set = 0;
+  u8 is_en = 0;
+
+  /* Parse args required to build the message */
+  while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (input, "enable"))
+       {
+         is_set = 1;
+         is_en = 1;
+       }
+      else if (unformat (input, "disable"))
+       is_set = 1;
+      else
+       break;
+    }
+
+  if (!is_set)
+    {
+      errmsg ("Value not set\n");
+      return -99;
+    }
+
+  /* Construct the API message */
+  M (LISP_RLOC_PROBE_ENABLE_DISABLE, lisp_rloc_probe_enable_disable);
+
+  mp->is_enabled = is_en;
+
+  /* send it... */
+  S;
+
+  /* Wait for a reply... */
+  W;
+
+  /* NOTREACHED */
+  return 0;
+}
+
+static int
+api_lisp_map_register_enable_disable (vat_main_t * vam)
+{
+  unformat_input_t *input = vam->input;
+  vl_api_lisp_map_register_enable_disable_t *mp;
+  f64 timeout = ~0;
+  u8 is_set = 0;
+  u8 is_en = 0;
+
+  /* Parse args required to build the message */
+  while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (input, "enable"))
+       {
+         is_set = 1;
+         is_en = 1;
+       }
+      else if (unformat (input, "disable"))
+       is_set = 1;
+      else
+       break;
+    }
+
+  if (!is_set)
+    {
+      errmsg ("Value not set\n");
+      return -99;
+    }
+
+  /* Construct the API message */
+  M (LISP_MAP_REGISTER_ENABLE_DISABLE, lisp_map_register_enable_disable);
+
+  mp->is_enabled = is_en;
+
+  /* send it... */
+  S;
+
+  /* Wait for a reply... */
+  W;
+
+  /* NOTREACHED */
+  return 0;
+}
+
 static int
 api_lisp_enable_disable (vat_main_t * vam)
 {
@@ -13331,6 +13566,40 @@ api_lisp_enable_disable (vat_main_t * vam)
   return 0;
 }
 
+static int
+api_show_lisp_map_register_state (vat_main_t * vam)
+{
+  f64 timeout = ~0;
+  vl_api_show_lisp_map_register_state_t *mp;
+
+  M (SHOW_LISP_MAP_REGISTER_STATE, show_lisp_map_register_state);
+
+  /* send */
+  S;
+
+  /* wait for reply */
+  W;
+
+  return 0;
+}
+
+static int
+api_show_lisp_rloc_probe_state (vat_main_t * vam)
+{
+  f64 timeout = ~0;
+  vl_api_show_lisp_rloc_probe_state_t *mp;
+
+  M (SHOW_LISP_RLOC_PROBE_STATE, show_lisp_rloc_probe_state);
+
+  /* send */
+  S;
+
+  /* wait for reply */
+  W;
+
+  return 0;
+}
+
 static int
 api_show_lisp_map_request_mode (vat_main_t * vam)
 {
@@ -14207,8 +14476,8 @@ api_lisp_eid_table_dump (vat_main_t * vam)
 
   if (!vam->json_output)
     {
-      fformat (vam->ofp, "%-35s%-20s%-30s%-20s%-s\n", "EID", "type",
-              "ls_index", "ttl", "authoritative");
+      fformat (vam->ofp, "%-35s%-20s%-30s%-20s%-20s%-10s%-20s\n", "EID",
+              "type", "ls_index", "ttl", "authoritative", "key_id", "key");
     }
 
   M (LISP_EID_TABLE_DUMP, lisp_eid_table_dump);
@@ -14333,6 +14602,34 @@ api_lisp_adjacencies_get (vat_main_t * vam)
   return 0;
 }
 
+static int
+api_lisp_map_server_dump (vat_main_t * vam)
+{
+  vl_api_lisp_map_server_dump_t *mp;
+  f64 timeout = ~0;
+
+  if (!vam->json_output)
+    {
+      fformat (vam->ofp, "%=20s\n", "Map server");
+    }
+
+  M (LISP_MAP_SERVER_DUMP, lisp_map_server_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_map_resolver_dump (vat_main_t * vam)
 {
@@ -14818,34 +15115,32 @@ api_netmap_delete (vat_main_t * vam)
   return 0;
 }
 
-static void vl_api_mpls_eth_tunnel_details_t_handler
-  (vl_api_mpls_eth_tunnel_details_t * mp)
+static void vl_api_mpls_tunnel_details_t_handler
+  (vl_api_mpls_tunnel_details_t * mp)
 {
   vat_main_t *vam = &vat_main;
+  i32 len = mp->mt_next_hop_n_labels;
   i32 i;
-  i32 len = ntohl (mp->nlabels);
 
-  fformat (vam->ofp, "[%d]: dst %U, adj %U/%d, labels ",
-          ntohl (mp->tunnel_index),
-          format_ethernet_address, &mp->tunnel_dst_mac,
-          format_ip4_address, &mp->intfc_address, ntohl (mp->mask_width));
+  fformat (vam->ofp, "[%d]: via %U %d labels ",
+          mp->tunnel_index,
+          format_ip4_address, mp->mt_next_hop,
+          ntohl (mp->mt_next_hop_sw_if_index));
   for (i = 0; i < len; i++)
     {
-      fformat (vam->ofp, "%u ", ntohl (mp->labels[i]));
+      fformat (vam->ofp, "%u ", ntohl (mp->mt_next_hop_out_labels[i]));
     }
   fformat (vam->ofp, "\n");
-  fformat (vam->ofp, "      tx on %d, rx fib index %d\n",
-          ntohl (mp->tx_sw_if_index), ntohl (mp->inner_fib_index));
 }
 
-static void vl_api_mpls_eth_tunnel_details_t_handler_json
-  (vl_api_mpls_eth_tunnel_details_t * mp)
+static void vl_api_mpls_tunnel_details_t_handler_json
+  (vl_api_mpls_tunnel_details_t * mp)
 {
   vat_main_t *vam = &vat_main;
   vat_json_node_t *node = NULL;
   struct in_addr ip4;
   i32 i;
-  i32 len = ntohl (mp->nlabels);
+  i32 len = mp->mt_next_hop_n_labels;
 
   if (VAT_JSON_ARRAY != vam->json_tree.type)
     {
@@ -14856,30 +15151,23 @@ static void vl_api_mpls_eth_tunnel_details_t_handler_json
 
   vat_json_init_object (node);
   vat_json_object_add_uint (node, "tunnel_index", ntohl (mp->tunnel_index));
-  clib_memcpy (&ip4, &(mp->intfc_address), sizeof (ip4));
-  vat_json_object_add_ip4 (node, "intfc_address", ip4);
-  vat_json_object_add_uint (node, "inner_fib_index",
-                           ntohl (mp->inner_fib_index));
-  vat_json_object_add_uint (node, "mask_width", ntohl (mp->mask_width));
-  vat_json_object_add_uint (node, "encap_index", ntohl (mp->encap_index));
-  vat_json_object_add_uint (node, "hw_if_index", ntohl (mp->hw_if_index));
-  vat_json_object_add_uint (node, "l2_only", ntohl (mp->l2_only));
-  vat_json_object_add_string_copy (node, "tunnel_dst_mac",
-                                  format (0, "%U", format_ethernet_address,
-                                          &mp->tunnel_dst_mac));
-  vat_json_object_add_uint (node, "tx_sw_if_index",
-                           ntohl (mp->tx_sw_if_index));
+  clib_memcpy (&ip4, &(mp->mt_next_hop), sizeof (ip4));
+  vat_json_object_add_ip4 (node, "next_hop", ip4);
+  vat_json_object_add_uint (node, "next_hop_sw_if_index",
+                           ntohl (mp->mt_next_hop_sw_if_index));
+  vat_json_object_add_uint (node, "l2_only", ntohl (mp->mt_l2_only));
   vat_json_object_add_uint (node, "label_count", len);
   for (i = 0; i < len; i++)
     {
-      vat_json_object_add_uint (node, "label", ntohl (mp->labels[i]));
+      vat_json_object_add_uint (node, "label",
+                               ntohl (mp->mt_next_hop_out_labels[i]));
     }
 }
 
 static int
-api_mpls_eth_tunnel_dump (vat_main_t * vam)
+api_mpls_tunnel_dump (vat_main_t * vam)
 {
-  vl_api_mpls_eth_tunnel_dump_t *mp;
+  vl_api_mpls_tunnel_dump_t *mp;
   f64 timeout;
   i32 index = -1;
 
@@ -14895,7 +15183,7 @@ api_mpls_eth_tunnel_dump (vat_main_t * vam)
 
   fformat (vam->ofp, "  tunnel_index %d\n", index);
 
-  M (MPLS_ETH_TUNNEL_DUMP, mpls_eth_tunnel_dump);
+  M (MPLS_TUNNEL_DUMP, mpls_tunnel_dump);
   mp->tunnel_index = htonl (index);
   S;
 
@@ -14908,69 +15196,6 @@ api_mpls_eth_tunnel_dump (vat_main_t * vam)
   W;
 }
 
-static void vl_api_mpls_fib_encap_details_t_handler
-  (vl_api_mpls_fib_encap_details_t * mp)
-{
-  vat_main_t *vam = &vat_main;
-  i32 i;
-  i32 len = ntohl (mp->nlabels);
-
-  fformat (vam->ofp, "table %d, dest %U, label ",
-          ntohl (mp->fib_index), format_ip4_address, &mp->dest, len);
-  for (i = 0; i < len; i++)
-    {
-      fformat (vam->ofp, "%u ", ntohl (mp->labels[i]));
-    }
-  fformat (vam->ofp, "\n");
-}
-
-static void vl_api_mpls_fib_encap_details_t_handler_json
-  (vl_api_mpls_fib_encap_details_t * mp)
-{
-  vat_main_t *vam = &vat_main;
-  vat_json_node_t *node = NULL;
-  i32 i;
-  i32 len = ntohl (mp->nlabels);
-  struct in_addr ip4;
-
-  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, "table", ntohl (mp->fib_index));
-  vat_json_object_add_uint (node, "entry_index", ntohl (mp->entry_index));
-  clib_memcpy (&ip4, &(mp->dest), sizeof (ip4));
-  vat_json_object_add_ip4 (node, "dest", ip4);
-  vat_json_object_add_uint (node, "s_bit", ntohl (mp->s_bit));
-  vat_json_object_add_uint (node, "label_count", len);
-  for (i = 0; i < len; i++)
-    {
-      vat_json_object_add_uint (node, "label", ntohl (mp->labels[i]));
-    }
-}
-
-static int
-api_mpls_fib_encap_dump (vat_main_t * vam)
-{
-  vl_api_mpls_fib_encap_dump_t *mp;
-  f64 timeout;
-
-  M (MPLS_FIB_ENCAP_DUMP, mpls_fib_encap_dump);
-  S;
-
-  /* Use a control ping for synchronization */
-  {
-    vl_api_control_ping_t *mp;
-    M (CONTROL_PING, control_ping);
-    S;
-  }
-  W;
-}
-
 #define vl_api_mpls_fib_details_t_endian vl_noop_handler
 #define vl_api_mpls_fib_details_t_print vl_noop_handler
 
@@ -15171,6 +15396,97 @@ api_ip_fib_dump (vat_main_t * vam)
   W;
 }
 
+static void vl_api_ip_neighbor_details_t_handler
+  (vl_api_ip_neighbor_details_t * mp)
+{
+  vat_main_t *vam = &vat_main;
+
+  fformat (vam->ofp, "%c %U %U\n",
+          (mp->is_static) ? 'S' : 'D',
+          format_ethernet_address, &mp->mac_address,
+          (mp->is_ipv6) ? format_ip6_address : format_ip4_address,
+          &mp->ip_address);
+}
+
+static void vl_api_ip_neighbor_details_t_handler_json
+  (vl_api_ip_neighbor_details_t * mp)
+{
+
+  vat_main_t *vam = &vat_main;
+  vat_json_node_t *node;
+  struct in_addr ip4;
+  struct in6_addr ip6;
+
+  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_string_copy (node, "flag",
+                                  (mp->is_static) ? (u8 *) "static" : (u8 *)
+                                  "dynamic");
+
+  vat_json_object_add_string_copy (node, "link_layer",
+                                  format (0, "%U", format_ethernet_address,
+                                          &mp->mac_address));
+
+  if (mp->is_ipv6)
+    {
+      clib_memcpy (&ip6, &mp->ip_address, sizeof (ip6));
+      vat_json_object_add_ip6 (node, "ip_address", ip6);
+    }
+  else
+    {
+      clib_memcpy (&ip4, &mp->ip_address, sizeof (ip4));
+      vat_json_object_add_ip4 (node, "ip_address", ip4);
+    }
+}
+
+static int
+api_ip_neighbor_dump (vat_main_t * vam)
+{
+  unformat_input_t *i = vam->input;
+  vl_api_ip_neighbor_dump_t *mp;
+  f64 timeout;
+  u8 is_ipv6 = 0;
+  u32 sw_if_index = ~0;
+
+  /* Parse args required to build the message */
+  while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
+       ;
+      else if (unformat (i, "sw_if_index %d", &sw_if_index))
+       ;
+      else if (unformat (i, "ip6"))
+       is_ipv6 = 1;
+      else
+       break;
+    }
+
+  if (sw_if_index == ~0)
+    {
+      errmsg ("missing interface name or sw_if_index\n");
+      return -99;
+    }
+
+  M (IP_NEIGHBOR_DUMP, ip_neighbor_dump);
+  mp->is_ipv6 = (u8) is_ipv6;
+  mp->sw_if_index = ntohl (sw_if_index);
+  S;
+
+  /* Use a control ping for synchronization */
+  {
+    vl_api_control_ping_t *mp;
+    M (CONTROL_PING, control_ping);
+    S;
+  }
+  W;
+}
+
 #define vl_api_ip6_fib_details_t_endian vl_noop_handler
 #define vl_api_ip6_fib_details_t_print vl_noop_handler
 
@@ -16479,6 +16795,102 @@ api_sw_interface_tag_add_del (vat_main_t * vam)
   W;
 }
 
+static void vl_api_l2_xconnect_details_t_handler
+  (vl_api_l2_xconnect_details_t * mp)
+{
+  vat_main_t *vam = &vat_main;
+
+  fformat (vam->ofp, "%15d%15d\n",
+          ntohl (mp->rx_sw_if_index), ntohl (mp->tx_sw_if_index));
+}
+
+static void vl_api_l2_xconnect_details_t_handler_json
+  (vl_api_l2_xconnect_details_t * mp)
+{
+  vat_main_t *vam = &vat_main;
+  vat_json_node_t *node = NULL;
+
+  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, "rx_sw_if_index",
+                           ntohl (mp->rx_sw_if_index));
+  vat_json_object_add_uint (node, "tx_sw_if_index",
+                           ntohl (mp->tx_sw_if_index));
+}
+
+static int
+api_l2_xconnect_dump (vat_main_t * vam)
+{
+  vl_api_l2_xconnect_dump_t *mp;
+  f64 timeout;
+
+  if (!vam->json_output)
+    {
+      fformat (vam->ofp, "%15s%15s\n", "rx_sw_if_index", "tx_sw_if_index");
+    }
+
+  M (L2_XCONNECT_DUMP, l2_xconnect_dump);
+
+  S;
+
+  /* Use a control ping for synchronization */
+  {
+    vl_api_control_ping_t *mp;
+    M (CONTROL_PING, control_ping);
+    S;
+  }
+  W;
+}
+
+static int
+api_sw_interface_set_mtu (vat_main_t * vam)
+{
+  unformat_input_t *i = vam->input;
+  vl_api_sw_interface_set_mtu_t *mp;
+  f64 timeout;
+  u32 sw_if_index = ~0;
+  u32 mtu = 0;
+
+  while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (i, "mtu %d", &mtu))
+       ;
+      if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
+       ;
+      else if (unformat (i, "sw_if_index %d", &sw_if_index))
+       ;
+      else
+       break;
+    }
+
+  if (sw_if_index == ~0)
+    {
+      errmsg ("missing interface name or sw_if_index\n");
+      return -99;
+    }
+
+  if (mtu == 0)
+    {
+      errmsg ("no mtu specified\n");
+      return -99;
+    }
+
+  /* Construct the API message */
+  M (SW_INTERFACE_SET_MTU, sw_interface_set_mtu);
+  mp->sw_if_index = ntohl (sw_if_index);
+  mp->mtu = ntohs ((u16) mtu);
+
+  S;
+  W;
+}
+
+
 static int
 q_or_quit (vat_main_t * vam)
 {
@@ -16895,12 +17307,13 @@ _(mpls_route_add_del,                                                   \
   "[multipath] [count <n>]")                                            \
 _(mpls_ip_bind_unbind,                                                  \
   "<label> <addr/len>")                                                 \
+_(mpls_tunnel_add_del,                                                  \
+  " via <addr> [table-id <n>]\n"                                        \
+  "sw_if_index <id>] [l2]  [del]")                                      \
 _(proxy_arp_add_del,                                                    \
   "<lo-ip4-addr> - <hi-ip4-addr> [vrf <n>] [del]")                      \
 _(proxy_arp_intfc_enable_disable,                                       \
   "<intfc> | sw_if_index <id> enable | disable")                        \
-_(mpls_add_del_encap,                                                   \
-  "label <n> dst <ip4-addr> [vrf <n>] [del]")                           \
 _(sw_interface_set_unnumbered,                                          \
   "<intfc> | sw_if_index <id> unnum_if_index <id> [del]")               \
 _(ip_neighbor_add_del,                                                  \
@@ -16942,12 +17355,6 @@ _(set_arp_neighbor_limit, "arp_nbr_limit <n> [ipv6]")                   \
 _(l2_patch_add_del,                                                     \
   "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
   "enable | disable")                                                   \
-_(mpls_ethernet_add_del_tunnel,                                         \
-  "tx <intfc> | tx_sw_if_index <n> dst <mac-addr>\n"                    \
-  "adj <ip4-addr>/<mw> dst <mac-addr> [del]")                           \
-_(mpls_ethernet_add_del_tunnel_2,                                       \
-  "inner_vrf_id <n> outer_vrf_id <n> next-hop <ip4-addr>\n"             \
-  "resolve-attempts <n> resolve-if-needed 0 | 1 [del]")                 \
 _(sr_tunnel_add_del,                                                    \
   "[name <name>] src <ip6-addr> dst <ip6-addr>/<mw> \n"                 \
   "(next <ip6-addr>)+ [tag <ip6-addr>]* [clean] [reroute] \n"           \
@@ -16988,7 +17395,7 @@ _(sw_if_l2tpv3_tunnel_dump, "")                                         \
 _(vxlan_add_del_tunnel,                                                 \
   "src <ip-addr> { dst <ip-addr> | group <mcast-ip-addr>\n"             \
   "{ <intfc> | mcast_sw_if_index <nn> } }\n"                            \
-  "vni <vni> [encap-vrf-id <nn>] [decap-next l2|ip4|ip6] [del]")        \
+  "vni <vni> [encap-vrf-id <nn>] [decap-next <l2|nn>] [del]")           \
 _(vxlan_tunnel_dump, "[<intfc> | sw_if_index <nn>]")                    \
 _(gre_add_del_tunnel,                                                   \
   "src <ip4-addr> dst <ip4-addr> [outer-fib-id <nn>] [teb] [del]\n")    \
@@ -17072,12 +17479,16 @@ _(lisp_add_del_locator, "locator-set <locator_name> "                   \
                         "p <priority> w <weight> [del]")                \
 _(lisp_add_del_local_eid,"vni <vni> eid "                               \
                          "<ipv4|ipv6>/<prefix> | <L2 address> "         \
-                          "locator-set <locator_name> [del]")           \
+                         "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_add_del_map_resolver, "<ip4|6-addr> [del]")                      \
+_(lisp_add_del_map_server, "<ip4|6-addr> [del]")                        \
 _(lisp_gpe_enable_disable, "enable|disable")                            \
 _(lisp_enable_disable, "enable|disable")                                \
+_(lisp_map_register_enable_disable, "enable|disable")                   \
+_(lisp_rloc_probe_enable_disable, "enable|disable")                     \
 _(lisp_gpe_add_del_iface, "up|down")                                    \
 _(lisp_add_del_remote_mapping, "add|del vni <vni> eid <dest-eid> "      \
                                "[seid <seid>] "                         \
@@ -17098,7 +17509,10 @@ _(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>")                                    \
+_(show_lisp_rloc_probe_state, "")                                       \
+_(show_lisp_map_register_state, "")                                     \
 _(show_lisp_status, "")                                                 \
 _(lisp_get_map_request_itr_rlocs, "")                                   \
 _(show_lisp_pitr, "")                                                   \
@@ -17114,8 +17528,7 @@ _(policer_classify_dump, "type [ip4|ip6|l2]")                           \
 _(netmap_create, "name <interface name> [hw-addr <mac>] [pipe] "        \
     "[master|slave]")                                                   \
 _(netmap_delete, "name <interface name>")                               \
-_(mpls_eth_tunnel_dump, "tunnel_index <tunnel-id>")                     \
-_(mpls_fib_encap_dump, "")                                              \
+_(mpls_tunnel_dump, "tunnel_index <tunnel-id>")                         \
 _(mpls_fib_dump, "")                                                    \
 _(classify_table_ids, "")                                               \
 _(classify_table_by_interface, "sw_if_index <sw_if_index>")             \
@@ -17157,7 +17570,10 @@ _(ip6_fib_dump, "")                                                     \
 _(feature_enable_disable, "arc_name <arc_name> "                        \
   "feature_name <feature_name> <intfc> | sw_if_index <nn> [disable]")  \
 _(sw_interface_tag_add_del, "<intfc> | sw_if_index <nn> tag <text>"    \
-"[disable]")
+"[disable]")                                                           \
+_(l2_xconnect_dump, "")                                                \
+_(sw_interface_set_mtu, "<intfc> | sw_if_index <nn> mtu <nn>")        \
+_(ip_neighbor_dump, "[ip6] <intfc> | sw_if_index <nn>")
 
 /* List of command functions, CLI names map directly to functions */
 #define foreach_cli_function                                    \