Add sw_if_index to af_packet_create and various clean ups
[vpp.git] / vpp-api-test / vat / api_format.c
index ceda982..d4e5392 100644 (file)
@@ -474,7 +474,23 @@ u8 * format_ip6_address (u8 * s, va_list * args)
 u8 * format_ip46_address (u8 * s, va_list * args)
 {
   ip46_address_t *ip46 = va_arg (*args, ip46_address_t *);
-  return ip46_address_is_ip4(ip46)?
+  ip46_type_t type = va_arg (*args, ip46_type_t);
+  int is_ip4 = 1;
+
+  switch (type)
+    {
+      case IP46_TYPE_ANY:
+       is_ip4 = ip46_address_is_ip4(ip46);
+       break;
+      case IP46_TYPE_IP4:
+       is_ip4 = 1;
+       break;
+      case IP46_TYPE_IP6:
+       is_ip4 = 0;
+       break;
+    }
+
+  return is_ip4 ?
       format(s, "%U", format_ip4_address, &ip46->ip4):
       format(s, "%U", format_ip6_address, &ip46->ip6);
 }
@@ -517,8 +533,9 @@ static void vl_api_create_loopback_reply_t_handler
     i32 retval = ntohl(mp->retval);
 
     vam->retval = retval;
-    vam->result_ready = 1;
     vam->regenerate_interface_table = 1;
+    vam->sw_if_index = ntohl (mp->sw_if_index);
+    vam->result_ready = 1;
 }
 
 static void vl_api_create_loopback_reply_t_handler_json
@@ -531,6 +548,34 @@ static void vl_api_create_loopback_reply_t_handler_json
     vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
     vat_json_object_add_uint(&node, "sw_if_index", ntohl(mp->sw_if_index));
 
+    vat_json_print(vam->ofp, &node);
+    vat_json_free(&node);
+    vam->retval = ntohl(mp->retval);
+    vam->result_ready = 1;
+}
+
+static void vl_api_af_packet_create_reply_t_handler 
+(vl_api_af_packet_create_reply_t * mp)
+{
+    vat_main_t * vam = &vat_main;
+    i32 retval = ntohl(mp->retval);
+
+    vam->retval = retval;
+    vam->regenerate_interface_table = 1;
+    vam->sw_if_index = ntohl (mp->sw_if_index);
+    vam->result_ready = 1;
+}
+
+static void vl_api_af_packet_create_reply_t_handler_json
+(vl_api_af_packet_create_reply_t * mp)
+{
+    vat_main_t * vam = &vat_main;
+    vat_json_node_t node;
+
+    vat_json_init_object(&node);
+    vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
+    vat_json_object_add_uint(&node, "sw_if_index", ntohl(mp->sw_if_index));
+
     vat_json_print(vam->ofp, &node);
     vat_json_free(&node);
 
@@ -545,8 +590,9 @@ static void vl_api_create_vlan_subif_reply_t_handler
     i32 retval = ntohl(mp->retval);
 
     vam->retval = retval;
-    vam->result_ready = 1;
     vam->regenerate_interface_table = 1;
+    vam->sw_if_index = ntohl (mp->sw_if_index);
+    vam->result_ready = 1;
 }
 
 static void vl_api_create_vlan_subif_reply_t_handler_json
@@ -573,8 +619,9 @@ static void vl_api_create_subif_reply_t_handler
     i32 retval = ntohl(mp->retval);
 
     vam->retval = retval;
-    vam->result_ready = 1;
     vam->regenerate_interface_table = 1;
+    vam->sw_if_index = ntohl (mp->sw_if_index);
+    vam->result_ready = 1;
 }
 
 static void vl_api_create_subif_reply_t_handler_json
@@ -601,8 +648,8 @@ static void vl_api_interface_name_renumber_reply_t_handler
     i32 retval = ntohl(mp->retval);
 
     vam->retval = retval;
-    vam->result_ready = 1;
     vam->regenerate_interface_table = 1;
+    vam->result_ready = 1;
 }
 
 static void vl_api_interface_name_renumber_reply_t_handler_json
@@ -768,7 +815,6 @@ static void vl_api_classify_add_del_table_reply_t_handler
         vam->async_errors += (retval < 0);
     } else {
         vam->retval = retval;
-        vam->result_ready = 1;
         if (retval == 0 && 
             ((mp->new_table_index != 0xFFFFFFFF) ||
              (mp->skip_n_vectors != 0xFFFFFFFF) ||
@@ -780,6 +826,7 @@ static void vl_api_classify_add_del_table_reply_t_handler
             errmsg ("new index %d, skip_n_vectors %d, match_n_vectors %d\n",
                     ntohl(mp->new_table_index),
                     ntohl(mp->skip_n_vectors), ntohl(mp->match_n_vectors));
+       vam->result_ready = 1;
     }
 }
 
@@ -811,9 +858,9 @@ static void vl_api_get_node_index_reply_t_handler
         vam->async_errors += (retval < 0);
     } else {
         vam->retval = retval;
-        vam->result_ready = 1;
         if (retval == 0)
             errmsg ("node index %d\n", ntohl(mp->node_index));
+        vam->result_ready = 1;
     }
 }
 
@@ -843,9 +890,9 @@ static void vl_api_add_node_next_reply_t_handler
         vam->async_errors += (retval < 0);
     } else {
         vam->retval = retval;
-        vam->result_ready = 1;
         if (retval == 0)
             errmsg ("next index %d\n", ntohl(mp->next_index));
+        vam->result_ready = 1;
     }
 }
 
@@ -1143,8 +1190,10 @@ static void vl_api_tap_connect_reply_t_handler
         vam->async_errors += (retval < 0);
     } else {
         vam->retval = retval;
-        vam->result_ready = 1;
+       vam->sw_if_index = ntohl (mp->sw_if_index);
+       vam->result_ready = 1;
     }
+    
 }
 
 static void vl_api_tap_connect_reply_t_handler_json
@@ -1162,6 +1211,7 @@ static void vl_api_tap_connect_reply_t_handler_json
 
     vam->retval = ntohl(mp->retval);
     vam->result_ready = 1;
+    
 }
 
 static void vl_api_tap_modify_reply_t_handler
@@ -1173,6 +1223,7 @@ static void vl_api_tap_modify_reply_t_handler
         vam->async_errors += (retval < 0);
     } else {
         vam->retval = retval;
+       vam->sw_if_index = ntohl (mp->sw_if_index);
         vam->result_ready = 1;
     }
 }
@@ -1262,6 +1313,7 @@ static void vl_api_l2tpv3_create_tunnel_reply_t_handler
         vam->async_errors += (retval < 0);
     } else {
         vam->retval = retval;
+       vam->sw_if_index = ntohl (mp->sw_if_index);
         vam->result_ready = 1;
     }
 }
@@ -1292,6 +1344,7 @@ static void vl_api_vxlan_add_del_tunnel_reply_t_handler
         vam->async_errors += (retval < 0);
     } else {
         vam->retval = retval;
+       vam->sw_if_index = ntohl (mp->sw_if_index);
         vam->result_ready = 1;
     }
 }
@@ -1322,6 +1375,7 @@ static void vl_api_gre_add_del_tunnel_reply_t_handler
         vam->async_errors += (retval < 0);
     } else {
         vam->retval = retval;
+       vam->sw_if_index = ntohl (mp->sw_if_index);
         vam->result_ready = 1;
     }
 }
@@ -1352,6 +1406,7 @@ static void vl_api_create_vhost_user_if_reply_t_handler
         vam->async_errors += (retval < 0);
     } else {
         vam->retval = retval;
+       vam->sw_if_index = ntohl (mp->sw_if_index);
         vam->result_ready = 1;
     }
 }
@@ -2122,6 +2177,8 @@ vl_api_lisp_enable_disable_status_details_t_handler_json
     gpe_status = format (0, "%s", mp->gpe_status ? "enabled" : "disabled");
     feature_status = format (0, "%s",
                             mp->feature_status ? "enabled" : "disabled");
+    vec_add1 (gpe_status, 0);
+    vec_add1 (feature_status, 0);
 
     if (VAT_JSON_ARRAY != vam->json_tree.type) {
         ASSERT(VAT_JSON_NONE == vam->json_tree.type);
@@ -2137,6 +2194,129 @@ vl_api_lisp_enable_disable_status_details_t_handler_json
     vec_free (feature_status);
 }
 
+static u8 * format_policer_type (u8 * s, va_list * va)
+{
+    u32 i = va_arg (*va, u32);
+
+    if (i == SSE2_QOS_POLICER_TYPE_1R2C)
+        s = format (s, "1r2c");
+    else if (i == SSE2_QOS_POLICER_TYPE_1R3C_RFC_2697)
+        s = format (s, "1r3c");
+    else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_2698)
+        s = format (s, "2r3c-2698");
+    else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_4115)
+        s = format (s, "2r3c-4115");
+    else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_MEF5CF1)
+        s = format (s, "2r3c-mef5cf1");
+    else
+        s = format (s, "ILLEGAL");
+    return s;
+}
+
+static u8 * format_policer_rate_type (u8 * s, va_list * va)
+{
+    u32 i = va_arg (*va, u32);
+
+    if (i == SSE2_QOS_RATE_KBPS)
+        s = format (s, "kbps");
+    else if (i == SSE2_QOS_RATE_PPS)
+        s = format(s, "pps");
+    else
+        s = format (s, "ILLEGAL");
+    return s;
+}
+
+static u8 * format_policer_round_type (u8 * s, va_list * va)
+{
+    u32 i = va_arg (*va, u32);
+
+    if (i == SSE2_QOS_ROUND_TO_CLOSEST)
+        s = format(s, "closest");
+    else if (i == SSE2_QOS_ROUND_TO_UP)
+        s = format (s, "up");
+    else if (i == SSE2_QOS_ROUND_TO_DOWN)
+        s = format (s, "down");
+    else
+        s = format (s, "ILLEGAL");
+  return s;
+}
+
+static void vl_api_policer_details_t_handler
+(vl_api_policer_details_t * mp)
+{
+    vat_main_t * vam = &vat_main;
+
+    fformat (vam->ofp, "Name \"%s\", type %U, cir %u, eir %u, cb %u, eb %u, "
+             "rate type %U, round type %U, %s rate, %s color-aware, "
+             "cir %u tok/period, pir %u tok/period, scale %u, cur lim %u, "
+             "cur bkt %u, ext lim %u, ext bkt %u, last update %llu\n",
+             mp->name,
+             format_policer_type, mp->type,
+             ntohl(mp->cir),
+             ntohl(mp->eir),
+             ntohl(mp->cb),
+             ntohl(mp->eb),
+             format_policer_rate_type, mp->rate_type,
+             format_policer_round_type, mp->round_type,
+             mp->single_rate ? "single" : "dual",
+             mp->color_aware ? "is" : "not",
+             ntohl(mp->cir_tokens_per_period),
+             ntohl(mp->pir_tokens_per_period),
+             ntohl(mp->scale),
+             ntohl(mp->current_limit),
+             ntohl(mp->current_bucket),
+             ntohl(mp->extended_limit),
+             ntohl(mp->extended_bucket),
+             clib_net_to_host_u64(mp->last_update_time));
+}
+
+static void vl_api_policer_details_t_handler_json
+(vl_api_policer_details_t * mp)
+{
+    vat_main_t * vam = &vat_main;
+    vat_json_node_t *node;
+    u8 *rate_type_str, *round_type_str, *type_str;
+
+    rate_type_str = format(0, "%U", format_policer_rate_type, mp->rate_type);
+    round_type_str = format(0, "%U", format_policer_round_type, mp->round_type);
+    type_str = format(0, "%U", format_policer_type, mp->type);
+
+    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, "name", mp->name);
+    vat_json_object_add_uint(node, "cir", ntohl(mp->cir));
+    vat_json_object_add_uint(node, "eir", ntohl(mp->eir));
+    vat_json_object_add_uint(node, "cb", ntohl(mp->cb));
+    vat_json_object_add_uint(node, "eb", ntohl(mp->eb));
+    vat_json_object_add_string_copy(node, "rate_type", rate_type_str);
+    vat_json_object_add_string_copy(node, "round_type", round_type_str);
+    vat_json_object_add_string_copy(node, "type", type_str);
+    vat_json_object_add_uint(node, "single_rate", mp->single_rate);
+    vat_json_object_add_uint(node, "color_aware", mp->color_aware);
+    vat_json_object_add_uint(node, "scale", ntohl(mp->scale));
+    vat_json_object_add_uint(node, "cir_tokens_per_period",
+                             ntohl(mp->cir_tokens_per_period));
+    vat_json_object_add_uint(node, "eir_tokens_per_period",
+                             ntohl(mp->pir_tokens_per_period));
+    vat_json_object_add_uint(node, "current_limit", ntohl(mp->current_limit));
+    vat_json_object_add_uint(node, "current_bucket", ntohl(mp->current_bucket));
+    vat_json_object_add_uint(node, "extended_limit", ntohl(mp->extended_limit));
+    vat_json_object_add_uint(node, "extended_bucket",
+                             ntohl(mp->extended_bucket));
+    vat_json_object_add_uint(node, "last_update_time",
+                             ntohl(mp->last_update_time));
+
+    vec_free(rate_type_str);
+    vec_free(round_type_str);
+    vec_free(type_str);
+}
+
+
 #define vl_api_vnet_ip4_fib_counters_t_endian vl_noop_handler
 #define vl_api_vnet_ip4_fib_counters_t_print vl_noop_handler
 #define vl_api_vnet_ip6_fib_counters_t_endian vl_noop_handler
@@ -2228,8 +2408,8 @@ _(lisp_add_del_map_resolver_reply)                      \
 _(lisp_gpe_enable_disable_reply)                        \
 _(lisp_gpe_add_del_iface_reply)                         \
 _(lisp_enable_disable_reply)                            \
+_(lisp_pitr_set_locator_set_reply)                      \
 _(vxlan_gpe_add_del_tunnel_reply)                      \
-_(af_packet_create_reply)                               \
 _(af_packet_delete_reply)                               \
 _(policer_add_del_reply)                                \
 _(netmap_create_reply)                                  \
@@ -2360,7 +2540,8 @@ _(MODIFY_VHOST_USER_IF_REPLY, modify_vhost_user_if_reply)               \
 _(DELETE_VHOST_USER_IF_REPLY, delete_vhost_user_if_reply)               \
 _(SHOW_VERSION_REPLY, show_version_reply)                               \
 _(L2_FIB_TABLE_ENTRY, l2_fib_table_entry)                              \
-_(VXLAN_GPE_ADD_DEL_TUNNEL_REPLY, vxlan_gpe_add_del_tunnel_reply)      \
+_(VXLAN_GPE_ADD_DEL_TUNNEL_REPLY, vxlan_gpe_add_del_tunnel_reply)          \
+_(VXLAN_GPE_TUNNEL_DETAILS, vxlan_gpe_tunnel_details)                   \
 _(INTERFACE_NAME_RENUMBER_REPLY, interface_name_renumber_reply)                \
 _(WANT_IP4_ARP_EVENTS_REPLY, want_ip4_arp_events_reply)                        \
 _(IP4_ARP_EVENT, ip4_arp_event)                                         \
@@ -2405,6 +2586,7 @@ _(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_GPE_ENABLE_DISABLE_REPLY, lisp_gpe_enable_disable_reply)         \
 _(LISP_ENABLE_DISABLE_REPLY, lisp_enable_disable_reply)                 \
+_(LISP_PITR_SET_LOCATOR_SET_REPLY, lisp_pitr_set_locator_set_reply)     \
 _(LISP_GPE_ADD_DEL_IFACE_REPLY, lisp_gpe_add_del_iface_reply)           \
 _(LISP_LOCATOR_SET_DETAILS, lisp_locator_set_details)                   \
 _(LISP_LOCAL_EID_TABLE_DETAILS, lisp_local_eid_table_details)           \
@@ -2415,6 +2597,7 @@ _(LISP_ENABLE_DISABLE_STATUS_DETAILS,                                   \
 _(AF_PACKET_CREATE_REPLY, af_packet_create_reply)                       \
 _(AF_PACKET_DELETE_REPLY, af_packet_delete_reply)                       \
 _(POLICER_ADD_DEL_REPLY, policer_add_del_reply)                         \
+_(POLICER_DETAILS, policer_details)                                     \
 _(NETMAP_CREATE_REPLY, netmap_create_reply)                             \
 _(NETMAP_DELETE_REPLY, netmap_delete_reply)
 
@@ -2455,6 +2638,20 @@ do {                                            \
     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);                 \
+        }                                       \
+    }                                           \
+    return -99;                                 \
+} while(0);
+
 typedef struct {
     u8 * name;
     u32 value;
@@ -2971,6 +3168,13 @@ int api_sw_interface_dump (vat_main_t * vam)
     strncpy ((char *) mp->name_filter, "lo", sizeof(mp->name_filter)-1);
     S;
 
+
+    /* and vxlan-gpe tunnel interfaces */
+    M(SW_INTERFACE_DUMP, sw_interface_dump);
+    mp->name_filter_valid = 1;
+    strncpy ((char *) mp->name_filter, "vxlan_gpe", sizeof(mp->name_filter)-1);
+    S;
+
     /* and vxlan tunnel interfaces */
     M(SW_INTERFACE_DUMP, sw_interface_dump);
     mp->name_filter_valid = 1;
@@ -7368,8 +7572,8 @@ static int api_vxlan_add_del_tunnel (vat_main_t * vam)
     M (VXLAN_ADD_DEL_TUNNEL, vxlan_add_del_tunnel);
 
     if (ipv6_set) {
-        clib_memcpy(&mp->dst_address, &src6, sizeof(src6));
-        clib_memcpy(&mp->dst_address, &src6, sizeof(dst6));
+        clib_memcpy(&mp->src_address, &src6, sizeof(src6));
+        clib_memcpy(&mp->dst_address, &dst6, sizeof(dst6));
     } else { 
         clib_memcpy(&mp->src_address, &src4, sizeof(src4));
         clib_memcpy(&mp->dst_address, &dst4, sizeof(dst4));
@@ -7393,7 +7597,9 @@ static void vl_api_vxlan_tunnel_details_t_handler
     fformat(vam->ofp, "%11d%24U%24U%14d%18d%13d\n",
             ntohl(mp->sw_if_index),
             format_ip46_address, &(mp->src_address[0]),
+           IP46_TYPE_ANY,
             format_ip46_address, &(mp->dst_address[0]),
+           IP46_TYPE_ANY,
             ntohl(mp->encap_vrf_id),
             ntohl(mp->decap_next_index),
             ntohl(mp->vni));
@@ -7936,8 +8142,10 @@ static int api_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
     unformat_input_t * line_input = vam->input;
     vl_api_vxlan_gpe_add_del_tunnel_t *mp;
     f64 timeout;
-    ip4_address_t local, remote;
+    ip4_address_t local4, remote4;
+    ip6_address_t local6, remote6;
     u8 is_add = 1;
+    u8 ipv4_set = 0, ipv6_set = 0;
     u8 local_set = 0;
     u8 remote_set = 0;
     u32 encap_vrf_id = 0;
@@ -7950,11 +8158,29 @@ static int api_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
         if (unformat (line_input, "del"))
             is_add = 0;
         else if (unformat (line_input, "local %U", 
-                           unformat_ip4_address, &local))
+                           unformat_ip4_address, &local4))
+        {
+            local_set = 1;
+            ipv4_set = 1;
+        }
+        else if (unformat (line_input, "remote %U",
+                           unformat_ip4_address, &remote4))
+        {
+            remote_set = 1;
+            ipv4_set = 1;
+        }
+        else if (unformat (line_input, "local %U",
+                           unformat_ip6_address, &local6))
+        {
             local_set = 1;
+            ipv6_set = 1;
+        }
         else if (unformat (line_input, "remote %U",
-                           unformat_ip4_address, &remote))
+                           unformat_ip6_address, &remote6))
+        {
             remote_set = 1;
+            ipv6_set = 1;
+        }
         else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
             ;
         else if (unformat (line_input, "decap-vrf-id %d", &decap_vrf_id))
@@ -7983,6 +8209,10 @@ static int api_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
         errmsg ("tunnel remote address not specified\n");
         return -99;
     }
+    if (ipv4_set && ipv6_set) {
+        errmsg ("both IPv4 and IPv6 addresses specified");
+        return -99;
+    }
 
     if (vni_set == 0) {
         errmsg ("vni not specified\n");
@@ -7991,20 +8221,118 @@ static int api_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
 
     M(VXLAN_GPE_ADD_DEL_TUNNEL, vxlan_gpe_add_del_tunnel);
     
-    mp->local = local.as_u32;
-    mp->remote = remote.as_u32;
+
+    if (ipv6_set) {
+        clib_memcpy(&mp->local, &local6, sizeof(local6));
+        clib_memcpy(&mp->remote, &remote6, sizeof(remote6));
+    } else {
+        clib_memcpy(&mp->local, &local4, sizeof(local4));
+        clib_memcpy(&mp->remote, &remote4, sizeof(remote4));
+    }
+
     mp->encap_vrf_id = ntohl(encap_vrf_id);
     mp->decap_vrf_id = ntohl(decap_vrf_id);
     mp->protocol = ntohl(protocol);
     mp->vni = ntohl(vni);
     mp->is_add = is_add;
-
+    mp->is_ipv6 = ipv6_set;
 
     S; W;
     /* NOTREACHED */
     return 0;
 }
 
+static void vl_api_vxlan_gpe_tunnel_details_t_handler
+(vl_api_vxlan_gpe_tunnel_details_t * mp)
+{
+    vat_main_t * vam = &vat_main;
+
+    fformat(vam->ofp, "%11d%24U%24U%13d%12d%14d%14d\n",
+            ntohl(mp->sw_if_index),
+            format_ip46_address, &(mp->local[0]),
+            format_ip46_address, &(mp->remote[0]),
+                       ntohl(mp->vni),
+            ntohl(mp->protocol),
+            ntohl(mp->encap_vrf_id),
+            ntohl(mp->decap_vrf_id));
+}
+
+static void vl_api_vxlan_gpe_tunnel_details_t_handler_json
+(vl_api_vxlan_gpe_tunnel_details_t * mp)
+{
+    vat_main_t * vam = &vat_main;
+    vat_json_node_t *node = NULL;
+    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_uint(node, "sw_if_index", ntohl(mp->sw_if_index));
+    if (mp->is_ipv6) {
+        clib_memcpy(&ip6, &(mp->local[0]), sizeof(ip6));
+        vat_json_object_add_ip6(node, "local", ip6);
+        clib_memcpy(&ip6, &(mp->remote[0]), sizeof(ip6));
+        vat_json_object_add_ip6(node, "remote", ip6);
+    } else {
+        clib_memcpy(&ip4, &(mp->local[0]), sizeof(ip4));
+        vat_json_object_add_ip4(node, "local", ip4);
+        clib_memcpy(&ip4, &(mp->remote[0]), sizeof(ip4));
+        vat_json_object_add_ip4(node, "remote", ip4);
+    }
+    vat_json_object_add_uint(node, "vni", ntohl(mp->vni));
+    vat_json_object_add_uint(node, "protocol", ntohl(mp->protocol));
+    vat_json_object_add_uint(node, "encap_vrf_id", ntohl(mp->encap_vrf_id));
+    vat_json_object_add_uint(node, "decap_vrf_id", ntohl(mp->decap_vrf_id));
+    vat_json_object_add_uint(node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
+}
+
+static int api_vxlan_gpe_tunnel_dump (vat_main_t * vam)
+{
+    unformat_input_t * i = vam->input;
+    vl_api_vxlan_gpe_tunnel_dump_t *mp;
+    f64 timeout;
+    u32 sw_if_index;
+    u8 sw_if_index_set = 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))
+            sw_if_index_set = 1;
+        else
+            break;
+    }
+
+    if (sw_if_index_set == 0) {
+        sw_if_index = ~0;
+    }
+
+    if (!vam->json_output) {
+        fformat(vam->ofp, "%11s%24s%24s%13s%15s%14s%14s\n",
+                "sw_if_index", "local", "remote", "vni",
+                               "protocol","encap_vrf_id", "decap_vrf_id");
+    }
+
+    /* Get list of vxlan-tunnel interfaces */
+    M(VXLAN_GPE_TUNNEL_DUMP, vxlan_gpe_tunnel_dump);
+
+    mp->sw_if_index = htonl(sw_if_index);
+
+    S;
+
+    /* Use a control ping for synchronization */
+    {
+        vl_api_control_ping_t * mp;
+        M(CONTROL_PING, control_ping);
+        S;
+    }
+    W;
+}
+
 u8 * format_l2_fib_mac_address (u8 * s, va_list * args)
 {
   u8 * a = va_arg (*args, u8 *);
@@ -9874,6 +10202,58 @@ typedef CLIB_PACKED(struct
     u8 addr[16]; /**< IPv4/IPv6 address */
 }) rloc_t;
 
+/**
+ * Enable/disable LISP proxy ITR.
+ *
+ * @param vam vpp API test context
+ * @return return code
+ */
+static int
+api_lisp_pitr_set_locator_set (vat_main_t * vam)
+{
+  f64 timeout = ~0;
+  u8 ls_name_set = 0;
+  unformat_input_t * input = vam->input;
+  vl_api_lisp_pitr_set_locator_set_t * mp;
+  u8 is_add = 1;
+  u8 * ls_name = 0;
+
+  /* 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, "locator-set %s", &ls_name))
+        ls_name_set = 1;
+      else
+        {
+          errmsg ("parse error '%U'", format_unformat_error, input);
+          return -99;
+        }
+    }
+
+  if (!ls_name_set)
+    {
+      errmsg ("locator-set name not set!");
+      return -99;
+    }
+
+  M(LISP_PITR_SET_LOCATOR_SET, lisp_pitr_set_locator_set);
+
+  mp->is_add = is_add;
+  clib_memcpy (mp->ls_name, ls_name, vec_len (ls_name));
+  vec_free (ls_name);
+
+  /* send */
+  S;
+
+  /* wait for reply */
+  W;
+
+  /* notreached*/
+  return 0;
+}
+
 /**
  * Add/del remote mapping from LISP control plane and updates
  * forwarding entries in data-plane accordingly.
@@ -9893,13 +10273,15 @@ api_lisp_add_del_remote_mapping (vat_main_t * vam)
     ip6_address_t seid6, deid6, rloc6;
     u32 seid_len = 0, deid_len = 0, len;
     u8 deid_is_ip4 = 0, seid_is_ip4 = 0;
-    u8 is_add = 1;
+    u8 is_add = 1, del_all = 0;
     u32 action = ~0;
     rloc_t * rlocs = 0, rloc;
 
     /* Parse args required to build the message */
     while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
-        if (unformat(input, "del")) {
+        if (unformat(input, "del-all")) {
+            del_all = 1;
+        } else if (unformat(input, "del")) {
             is_add = 0;
         } else if (unformat(input, "add")) {
             is_add = 1;
@@ -9963,6 +10345,7 @@ api_lisp_add_del_remote_mapping (vat_main_t * vam)
     mp->seid_len = seid_len;
     mp->action = (u8) action;
     mp->deid_len = deid_len;
+    mp->del_all = del_all;
     if (seid_is_ip4) {
         mp->eid_is_ip4 = 1;
         clib_memcpy (mp->seid, &seid4, sizeof (seid4));
@@ -10223,7 +10606,7 @@ api_af_packet_create (vat_main_t * vam)
     mp->use_random_hw_addr = random_hw_addr;
     vec_free (host_if_name);
 
-    S; W;
+    S; W2(fprintf(vam->ofp," new sw_if_index = %d ", vam->sw_if_index));
     /* NOTREACHED */
     return 0;
 }
@@ -10332,6 +10715,43 @@ api_policer_add_del (vat_main_t * vam)
     return 0;
 }
 
+static int
+api_policer_dump(vat_main_t *vam)
+{
+    unformat_input_t * i = vam->input;
+    vl_api_policer_dump_t *mp;
+    f64 timeout = ~0;
+    u8 *match_name = 0;
+    u8 match_name_valid = 0;
+
+    while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
+        if (unformat (i, "name %s", &match_name)) {
+            vec_add1 (match_name, 0);
+            match_name_valid = 1;
+        } else
+            break;
+    }
+
+    M(POLICER_DUMP, policer_dump);
+    mp->match_name_valid = match_name_valid;
+    clib_memcpy (mp->match_name, match_name, vec_len (match_name));
+    vec_free (match_name);
+    /* 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_netmap_create (vat_main_t * vam)
 {
@@ -10373,7 +10793,7 @@ api_netmap_create (vat_main_t * vam)
 
     M(NETMAP_CREATE, netmap_create);
 
-    clib_memcpy (mp->if_name, if_name, vec_len (if_name));
+    clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
     clib_memcpy (mp->hw_addr, hw_addr, 6);
     mp->use_random_hw_addr = random_hw_addr;
     mp->is_pipe = is_pipe;
@@ -10412,7 +10832,7 @@ api_netmap_delete (vat_main_t * vam)
 
     M(NETMAP_DELETE, netmap_delete);
 
-    clib_memcpy (mp->if_name, if_name, vec_len (if_name));
+    clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
     vec_free (if_name);
 
     S; W;
@@ -10805,7 +11225,7 @@ _(l2tpv3_set_lookup_key,                                                \
   "lookup_v6_src | lookup_v6_dst | lookup_session_id")                  \
 _(sw_if_l2tpv3_tunnel_dump, "")                                         \
 _(vxlan_add_del_tunnel,                                                 \
-  "src <ip4-addr> dst <ip4-addr> vni <vni> [encap-vrf-id <nn>]\n"       \
+  "src <ip-addr> dst <ip-addr> vni <vni> [encap-vrf-id <nn>]\n"         \
   " [decap-next l2|ip4|ip6] [del]")                                     \
 _(vxlan_tunnel_dump, "[<intfc> | sw_if_index <nn>]")                    \
 _(gre_add_del_tunnel,                                                   \
@@ -10826,10 +11246,11 @@ _(modify_vhost_user_if,                                                 \
 _(delete_vhost_user_if, "<intfc> | sw_if_index <nn>")                   \
 _(sw_interface_vhost_user_dump, "")                                     \
 _(show_version, "")                                                     \
-_(vxlan_gpe_add_del_tunnel,                                            \
-  "local <ip4-addr> remote <ip4-addr> vni <nn>\n"                       \
-    "[encap-vrf-id <nn>] [decap-vrf-id <nn>] [next-ip4][next-ip6]"     \
-  "[next-ethernet] [next-nsh]\n")                                      \
+_(vxlan_gpe_add_del_tunnel,                                             \
+  "local <addr> remote <addr> vni <nn>\n"                               \
+    "[encap-vrf-id <nn>] [decap-vrf-id <nn>] [next-ip4][next-ip6]"      \
+  "[next-ethernet] [next-nsh]\n")                                       \
+_(vxlan_gpe_tunnel_dump, "[<intfc> | sw_if_index <nn>]")                \
 _(l2_fib_table_dump, "bd_id <bridge-domain-id>")                       \
 _(interface_name_renumber,                                              \
   "<intfc> | sw_if_index <nn> new_show_dev_instance <nn>")             \
@@ -10896,9 +11317,11 @@ _(lisp_add_del_map_resolver, "<ip4|6-addr> [del]")                      \
 _(lisp_gpe_enable_disable, "enable|disable")                            \
 _(lisp_enable_disable, "enable|disable")                                \
 _(lisp_gpe_add_del_iface, "up|down")                                    \
-_(lisp_add_del_remote_mapping, "add|del vni <vni> deid <dest-eid> seid" \
+_(lisp_add_del_remote_mapping, "add|del vni <vni> table-id <id> "       \
+                               "deid <dest-eid> seid"                   \
                                " <src-eid> rloc <locator> "             \
                                "[rloc <loc> ... ]")                     \
+_(lisp_pitr_set_locator_set, "locator-set <loc-set-name> | del")        \
 _(lisp_locator_set_dump, "")                                            \
 _(lisp_local_eid_table_dump, "")                                        \
 _(lisp_gpe_tunnel_dump, "")                                             \
@@ -10907,6 +11330,7 @@ _(lisp_enable_disable_status_dump, "")                                  \
 _(af_packet_create, "name <host interface name> [hw_addr <mac>]")       \
 _(af_packet_delete, "name <host interface name>")                       \
 _(policer_add_del, "name <policer name> <params> [del]")                \
+_(policer_dump, "[name <policer name>]")                                \
 _(netmap_create, "name <interface name> [hw-addr <mac>] [pipe] "        \
     "[master|slave]")                                                   \
 _(netmap_delete, "name <interface name>")