VAT add_locator_set api support multiple locators
[vpp.git] / vpp-api-test / vat / api_format.c
index 84e9c4f..a220066 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *------------------------------------------------------------------
- * api_format.c 
- * 
+ * api_format.c
+ *
  * Copyright (c) 2014 Cisco and/or its affiliates.
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,7 +13,7 @@
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
- * limitations under the License. 
+ * limitations under the License.
  *------------------------------------------------------------------
  */
 
 #include <vnet/lisp-gpe/lisp_gpe.h>
 
 #include <vpp-api/vpe_msg_enum.h>
-#include <vnet/l2/l2_classify.h> 
+#include <vnet/l2/l2_classify.h>
 #include <vnet/l2/l2_vtr.h>
 #include <vnet/classify/input_acl.h>
+#include <vnet/classify/policer_classify.h>
 #include <vnet/mpls-gre/mpls.h>
 #if DPDK > 0
 #include <vnet/ipsec/ipsec.h>
 #include <vnet/ip/ip6_hop_by_hop.h>
 #include <vnet/policer/xlate.h>
 #include <vnet/policer/policer.h>
+#include <vnet/policer/police.h>
 
 #include "vat/json_format.h"
 
+#include <sys/stat.h>
+
 #define vl_typedefs             /* define message structures */
-#include <vpp-api/vpe_all_api_h.h> 
+#include <vpp-api/vpe_all_api_h.h>
 #undef vl_typedefs
 
 /* declare message handlers for each api */
 
 #define vl_endianfun             /* define message structures */
-#include <vpp-api/vpe_all_api_h.h> 
+#include <vpp-api/vpe_all_api_h.h>
 #undef vl_endianfun
 
 /* instantiate all the print functions we know about */
@@ -186,7 +190,7 @@ uword unformat_ip6_address (unformat_input_t * input, va_list * args)
          n_colon = 0;
          n_hex_digits++;
        }
-      
+
       /* Save position of :: */
       if (n_colon == 2)
        {
@@ -448,6 +452,25 @@ unformat_policer_action_type (unformat_input_t * input, va_list * va)
   return 1;
 }
 
+uword
+unformat_classify_table_type (unformat_input_t * input, va_list * va)
+{
+  u32 * r = va_arg (*va, u32 *);
+  u32 tid;
+
+  if (unformat (input, "ip4"))
+    tid = POLICER_CLASSIFY_TABLE_IP4;
+  else if (unformat (input, "ip6"))
+    tid = POLICER_CLASSIFY_TABLE_IP6;
+  else if (unformat (input, "l2"))
+    tid = POLICER_CLASSIFY_TABLE_L2;
+  else
+    return 0;
+
+  *r = tid;
+  return 1;
+}
+
 u8 * format_ip4_address (u8 * s, va_list * args)
 {
   u8 * a = va_arg (*args, u8 *);
@@ -568,7 +591,7 @@ void increment_mac_address (u64 *mac)
     *mac = tmp;
 }
 
-static void vl_api_create_loopback_reply_t_handler 
+static void vl_api_create_loopback_reply_t_handler
 (vl_api_create_loopback_reply_t * mp)
 {
     vat_main_t * vam = &vat_main;
@@ -596,7 +619,7 @@ static void vl_api_create_loopback_reply_t_handler_json
     vam->result_ready = 1;
 }
 
-static void vl_api_af_packet_create_reply_t_handler 
+static void vl_api_af_packet_create_reply_t_handler
 (vl_api_af_packet_create_reply_t * mp)
 {
     vat_main_t * vam = &vat_main;
@@ -625,7 +648,7 @@ static void vl_api_af_packet_create_reply_t_handler_json
     vam->result_ready = 1;
 }
 
-static void vl_api_create_vlan_subif_reply_t_handler 
+static void vl_api_create_vlan_subif_reply_t_handler
 (vl_api_create_vlan_subif_reply_t * mp)
 {
     vat_main_t * vam = &vat_main;
@@ -654,7 +677,7 @@ static void vl_api_create_vlan_subif_reply_t_handler_json
     vam->result_ready = 1;
 }
 
-static void vl_api_create_subif_reply_t_handler 
+static void vl_api_create_subif_reply_t_handler
 (vl_api_create_subif_reply_t * mp)
 {
     vat_main_t * vam = &vat_main;
@@ -683,7 +706,7 @@ static void vl_api_create_subif_reply_t_handler_json
     vam->result_ready = 1;
 }
 
-static void vl_api_interface_name_renumber_reply_t_handler 
+static void vl_api_interface_name_renumber_reply_t_handler
 (vl_api_interface_name_renumber_reply_t * mp)
 {
     vat_main_t * vam = &vat_main;
@@ -710,7 +733,7 @@ static void vl_api_interface_name_renumber_reply_t_handler_json
     vam->result_ready = 1;
 }
 
-/* 
+/*
  * Special-case: build the interface table, maintain
  * the next loopback sw_if_index vbl.
  */
@@ -720,7 +743,7 @@ static void vl_api_sw_interface_details_t_handler
     vat_main_t * vam = &vat_main;
     u8 * s = format (0, "%s%c", mp->interface_name, 0);
 
-    hash_set_mem (vam->sw_if_index_by_interface_name, s, 
+    hash_set_mem (vam->sw_if_index_by_interface_name, s,
                   ntohl(mp->sw_if_index));
 
     /* In sub interface case, fill the sub interface table entry */
@@ -829,7 +852,7 @@ static void vl_api_cli_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, "reply_in_shmem", 
+    vat_json_object_add_uint(&node, "reply_in_shmem",
                              ntohl(mp->reply_in_shmem));
     /* Toss the shared-memory original... */
     pthread_mutex_lock (&am->vlib_rp->mutex);
@@ -837,7 +860,7 @@ static void vl_api_cli_reply_t_handler_json
 
     reply = (u8 *)(mp->reply_in_shmem);
     vec_free (reply);
-    
+
     svm_pop_heap (oldheap);
     pthread_mutex_unlock (&am->vlib_rp->mutex);
 
@@ -857,11 +880,11 @@ static void vl_api_classify_add_del_table_reply_t_handler
         vam->async_errors += (retval < 0);
     } else {
         vam->retval = retval;
-        if (retval == 0 && 
+        if (retval == 0 &&
             ((mp->new_table_index != 0xFFFFFFFF) ||
              (mp->skip_n_vectors != 0xFFFFFFFF) ||
              (mp->match_n_vectors != 0xFFFFFFFF)))
-            /* 
+            /*
              * Note: this is just barely thread-safe, depends on
              * the main thread spinning waiting for an answer...
              */
@@ -923,6 +946,38 @@ static void vl_api_get_node_index_reply_t_handler_json
     vam->result_ready = 1;
 }
 
+static void vl_api_get_next_index_reply_t_handler
+(vl_api_get_next_index_reply_t * mp)
+{
+    vat_main_t * vam = &vat_main;
+    i32 retval = ntohl(mp->retval);
+    if (vam->async_mode) {
+        vam->async_errors += (retval < 0);
+    } else {
+        vam->retval = retval;
+        if (retval == 0)
+            errmsg ("next node index %d\n", ntohl(mp->next_index));
+        vam->result_ready = 1;
+    }
+}
+
+static void vl_api_get_next_index_reply_t_handler_json
+(vl_api_get_next_index_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, "next_index", ntohl(mp->next_index));
+
+    vat_json_print(vam->ofp, &node);
+    vat_json_free(&node);
+
+    vam->retval = ntohl(mp->retval);
+    vam->result_ready = 1;
+}
+
 static void vl_api_add_node_next_reply_t_handler
 (vl_api_add_node_next_reply_t * mp)
 {
@@ -955,7 +1010,7 @@ static void vl_api_add_node_next_reply_t_handler_json
     vam->result_ready = 1;
 }
 
-static void vl_api_mpls_gre_add_del_tunnel_reply_t_handler 
+static void vl_api_mpls_gre_add_del_tunnel_reply_t_handler
 (vl_api_mpls_gre_add_del_tunnel_reply_t * mp)
 {
     vat_main_t * vam = &vat_main;
@@ -987,7 +1042,7 @@ static void vl_api_mpls_gre_add_del_tunnel_reply_t_handler_json
 }
 
 
-static void vl_api_show_version_reply_t_handler 
+static void vl_api_show_version_reply_t_handler
 (vl_api_show_version_reply_t * mp)
 {
     vat_main_t * vam = &vat_main;
@@ -1023,7 +1078,7 @@ static void vl_api_show_version_reply_t_handler_json
     vam->result_ready = 1;
 }
 
-static void vl_api_ip4_arp_event_t_handler 
+static void vl_api_ip4_arp_event_t_handler
 (vl_api_ip4_arp_event_t * mp)
 {
     vat_main_t * vam = &vat_main;
@@ -1038,7 +1093,7 @@ static void vl_api_ip4_arp_event_t_handler_json
     /* JSON output not supported */
 }
 
-/* 
+/*
  * Special-case: build the bridge domain table, maintain
  * the next bd id vbl.
  */
@@ -1083,7 +1138,7 @@ static void vl_api_bridge_domain_details_t_handler_json
     vat_json_init_array(array);
 }
 
-/* 
+/*
  * Special-case: build the bridge domain sw if table.
  */
 static void vl_api_bridge_domain_sw_if_details_t_handler
@@ -1095,16 +1150,16 @@ static void vl_api_bridge_domain_sw_if_details_t_handler
     u32 sw_if_index;
 
     sw_if_index = ntohl (mp->sw_if_index);
-    hash_foreach_pair (p, vam->sw_if_index_by_interface_name, 
+    hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
     ({
         if ((u32) p->value[0] == sw_if_index) {
             sw_if_name = (u8 *)(p->key);
             break;
         }
     }));
-   
-    fformat (vam->ofp, "%7d     %3d  %s", sw_if_index, 
-             mp->shg, sw_if_name ? (char *)sw_if_name : 
+
+    fformat (vam->ofp, "%7d     %3d  %s", sw_if_index,
+             mp->shg, sw_if_name ? (char *)sw_if_name :
              "sw_if_index not found!");
 }
 
@@ -1235,7 +1290,7 @@ static void vl_api_tap_connect_reply_t_handler
        vam->sw_if_index = ntohl (mp->sw_if_index);
        vam->result_ready = 1;
     }
-    
+
 }
 
 static void vl_api_tap_connect_reply_t_handler_json
@@ -1253,7 +1308,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
@@ -1840,7 +1895,7 @@ static void vl_api_get_first_msg_id_reply_t_handler
 {
     vat_main_t * vam = &vat_main;
     i32 retval = ntohl(mp->retval);
-    
+
     if (vam->async_mode) {
         vam->async_errors += (retval < 0);
     } else {
@@ -1860,7 +1915,7 @@ static void vl_api_get_first_msg_id_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, "first_msg_id", 
+    vat_json_object_add_uint(&node, "first_msg_id",
                              (uint) ntohs(mp->first_msg_id));
 
     vat_json_print(vam->ofp, &node);
@@ -1880,7 +1935,7 @@ static void vl_api_get_node_graph_reply_t_handler
     void * oldheap;
     vlib_node_t * node;
     int i;
-    
+
     if (vam->async_mode) {
         vam->async_errors += (retval < 0);
     } else {
@@ -1900,7 +1955,7 @@ static void vl_api_get_node_graph_reply_t_handler
     oldheap = svm_push_data_heap (am->vlib_rp);
 
     vec_free (reply);
-    
+
     svm_pop_heap (oldheap);
     pthread_mutex_unlock (&am->vlib_rp->mutex);
 
@@ -1947,7 +2002,7 @@ static void vl_api_get_node_graph_reply_t_handler_json
     oldheap = svm_push_data_heap (am->vlib_rp);
 
     vec_free (reply);
-    
+
     svm_pop_heap (oldheap);
     pthread_mutex_unlock (&am->vlib_rp->mutex);
 
@@ -2330,6 +2385,47 @@ vl_api_lisp_get_map_request_itr_rlocs_reply_t_handler_json (
     vam->result_ready = 1;
 }
 
+static void
+vl_api_show_lisp_pitr_reply_t_handler (vl_api_show_lisp_pitr_reply_t * mp)
+{
+    vat_main_t *vam = &vat_main;
+    i32 retval = ntohl(mp->retval);
+
+    if (0 <= retval) {
+      fformat(vam->ofp, "%-20s%-16s\n",
+              mp->status ? "enabled" : "disabled",
+              mp->status ? (char *) mp->locator_set_name : "");
+    }
+
+    vam->retval = retval;
+    vam->result_ready = 1;
+}
+
+static void
+vl_api_show_lisp_pitr_reply_t_handler_json (vl_api_show_lisp_pitr_reply_t * mp)
+{
+    vat_main_t *vam = &vat_main;
+    vat_json_node_t node;
+    u8 * status = 0;
+
+    status = format (0, "%s", mp->status ? "enabled" : "disabled");
+    vec_add1 (status, 0);
+
+    vat_json_init_object(&node);
+    vat_json_object_add_string_copy(&node, "status", status);
+    if (mp->status) {
+      vat_json_object_add_string_copy(&node, "locator_set", mp->locator_set_name);
+    }
+
+    vec_free (status);
+
+    vat_json_print(vam->ofp, &node);
+    vat_json_free(&node);
+
+    vam->retval = ntohl(mp->retval);
+    vam->result_ready = 1;
+}
+
 static u8 * format_policer_type (u8 * s, va_list * va)
 {
     u32 i = va_arg (*va, u32);
@@ -2438,8 +2534,8 @@ static void vl_api_policer_details_t_handler
              format_policer_type, mp->type,
              ntohl(mp->cir),
              ntohl(mp->eir),
-             ntohl(mp->cb),
-             ntohl(mp->eb),
+             clib_net_to_host_u64(mp->cb),
+             clib_net_to_host_u64(mp->eb),
              format_policer_rate_type, mp->rate_type,
              format_policer_round_type, mp->round_type,
              mp->single_rate ? "single" : "dual",
@@ -2616,6 +2712,42 @@ static void vl_api_classify_table_by_interface_reply_t_handler_json (vl_api_clas
     vam->result_ready = 1;
 }
 
+static void vl_api_policer_add_del_reply_t_handler
+(vl_api_policer_add_del_reply_t * mp)
+{
+    vat_main_t * vam = &vat_main;
+    i32 retval = ntohl(mp->retval);
+    if (vam->async_mode) {
+        vam->async_errors += (retval < 0);
+    } else {
+        vam->retval = retval;
+        vam->result_ready = 1;
+        if (retval == 0 && mp->policer_index != 0xFFFFFFFF)
+            /*
+             * Note: this is just barely thread-safe, depends on
+             * the main thread spinning waiting for an answer...
+             */
+            errmsg ("policer index %d\n", ntohl(mp->policer_index));
+    }
+}
+
+static void vl_api_policer_add_del_reply_t_handler_json
+(vl_api_policer_add_del_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, "policer_index", ntohl(mp->policer_index));
+
+    vat_json_print(vam->ofp, &node);
+    vat_json_free(&node);
+
+    vam->retval = ntohl(mp->retval);
+    vam->result_ready = 1;
+}
+
 /* Format hex dump. */
 u8 * format_hex_bytes (u8 * s, va_list * va)
 {
@@ -2708,13 +2840,68 @@ static void vl_api_classify_session_details_t_handler_json (vl_api_classify_sess
     vat_json_object_add_string_copy(node, "match", s);
 }
 
+static void vl_api_pg_create_interface_reply_t_handler
+(vl_api_pg_create_interface_reply_t * mp)
+{
+    vat_main_t * vam = &vat_main;
+
+    vam->retval = ntohl(mp->retval);
+    vam->result_ready = 1;
+}
+
+static void vl_api_pg_create_interface_reply_t_handler_json
+(vl_api_pg_create_interface_reply_t * mp)
+{
+    vat_main_t * vam = &vat_main;
+    vat_json_node_t node;
+
+    i32 retval = ntohl(mp->retval);
+    if (retval == 0) {
+        vat_json_init_object(&node);
+
+        vat_json_object_add_int(&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_policer_classify_details_t_handler
+(vl_api_policer_classify_details_t * mp)
+{
+    vat_main_t * vam = &vat_main;
+
+    fformat (vam->ofp, "%10d%20d\n", ntohl(mp->sw_if_index),
+             ntohl(mp->table_index));
+}
+
+static void vl_api_policer_classify_details_t_handler_json
+(vl_api_policer_classify_details_t * mp)
+{
+    vat_main_t * vam = &vat_main;
+    vat_json_node_t * node;
+
+    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));
+    vat_json_object_add_uint(node, "table_index", ntohl(mp->table_index));
+}
+
+
 #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
 #define vl_api_vnet_ip6_fib_counters_t_print vl_noop_handler
 
-/* 
- * Generate boilerplate reply handlers, which 
+/*
+ * Generate boilerplate reply handlers, which
  * dig the return value out of the xxx_reply_t API message,
  * stick it into vam->retval, and set vam->result_ready
  *
@@ -2806,10 +2993,12 @@ _(lisp_add_del_map_request_itr_rlocs_reply)             \
 _(lisp_eid_table_add_del_map_reply)                     \
 _(vxlan_gpe_add_del_tunnel_reply)                      \
 _(af_packet_delete_reply)                               \
-_(policer_add_del_reply)                                \
+_(policer_classify_set_interface_reply)                 \
 _(netmap_create_reply)                                  \
 _(netmap_delete_reply)                                  \
-_(ipfix_enable_reply)
+_(ipfix_enable_reply)                                   \
+_(pg_capture_reply)                                     \
+_(pg_enable_disable_reply)
 
 #define _(n)                                    \
     static void vl_api_##n##_t_handler          \
@@ -2842,7 +3031,7 @@ foreach_standard_reply_retval_handler;
 foreach_standard_reply_retval_handler;
 #undef _
 
-/* 
+/*
  * Table of message reply handlers, must include boilerplate handlers
  * we just generated
  */
@@ -2998,10 +3187,13 @@ _(LISP_ADD_DEL_MAP_REQUEST_ITR_RLOCS_REPLY,                             \
   lisp_add_del_map_request_itr_rlocs_reply)                             \
 _(LISP_GET_MAP_REQUEST_ITR_RLOCS_REPLY,                                 \
   lisp_get_map_request_itr_rlocs_reply)                                 \
+_(SHOW_LISP_PITR_REPLY, show_lisp_pitr_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)                         \
 _(POLICER_DETAILS, policer_details)                                     \
+_(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_GRE_TUNNEL_DETAILS, mpls_gre_tunnel_details)                     \
@@ -3013,7 +3205,11 @@ _(CLASSIFY_TABLE_BY_INTERFACE_REPLY, classify_table_by_interface_reply) \
 _(CLASSIFY_TABLE_INFO_REPLY, classify_table_info_reply)                 \
 _(CLASSIFY_SESSION_DETAILS, classify_session_details)                   \
 _(IPFIX_ENABLE_REPLY, ipfix_enable_reply)                               \
-_(IPFIX_DETAILS, ipfix_details)
+_(IPFIX_DETAILS, ipfix_details)                                         \
+_(GET_NEXT_INDEX_REPLY, get_next_index_reply)                           \
+_(PG_CREATE_INTERFACE_REPLY, pg_create_interface_reply)                 \
+_(PG_CAPTURE_REPLY, pg_capture_reply)                                   \
+_(PG_ENABLE_DISABLE_REPLY, pg_enable_disable_reply)
 
 /* M: construct, but don't yet send a message */
 
@@ -3122,7 +3318,7 @@ static int dump_sub_interface_table (vat_main_t * vam)
             fformat (vam->ofp,
                      "  vlan-tag-rewrite - op: %-14s [ dot1q: %d "
                      "tag1: %d tag2: %d ]\n",
-                     str_vtr_op(sub->vtr_op), sub->vtr_push_dot1q, 
+                     str_vtr_op(sub->vtr_op), sub->vtr_push_dot1q,
                      sub->vtr_tag1, sub->vtr_tag2);
         }
     }
@@ -3148,7 +3344,7 @@ static int dump_interface_table (vat_main_t * vam)
         return -99;
     }
 
-    hash_foreach_pair (p, vam->sw_if_index_by_interface_name, 
+    hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
     ({
         vec_add2 (nses, ns, 1);
         ns->name = (u8 *)(p->key);
@@ -3371,20 +3567,20 @@ int exec (vat_main_t * vam)
     if (vec_len(i->buffer) == 0)
         return -1;
 
-    if (vam->exec_mode == 0 && unformat (i, "mode")) {        
+    if (vam->exec_mode == 0 && unformat (i, "mode")) {
         vam->exec_mode = 1;
         return 0;
     }
-    if (vam->exec_mode == 1 && 
+    if (vam->exec_mode == 1 &&
         (unformat (i, "exit") || unformat (i, "quit"))) {
         vam->exec_mode = 0;
         return 0;
     }
-    
+
 
     M(CLI_REQUEST, cli_request);
 
-    /* 
+    /*
      * Copy cmd into shared memory.
      * In order for the CLI command to work, it
      * must be a vector ending in \n, not a C-string ending
@@ -3410,7 +3606,7 @@ int exec (vat_main_t * vam)
                 fformat (vam->ofp, "%s", vam->shmem_result);
             pthread_mutex_lock (&am->vlib_rp->mutex);
             oldheap = svm_push_data_heap (am->vlib_rp);
-            
+
             free_me = (u8 *)vam->shmem_result;
             vec_free (free_me);
 
@@ -3547,7 +3743,7 @@ int api_sw_interface_dump (vat_main_t * vam)
     sw_interface_subif_t * sub = NULL;
 
     /* Toss the old name table */
-    hash_foreach_pair (p, vam->sw_if_index_by_interface_name, 
+    hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
     ({
         vec_add2 (nses, ns, 1);
         ns->name = (u8 *)(p->key);
@@ -3567,7 +3763,7 @@ int api_sw_interface_dump (vat_main_t * vam)
     vec_free (vam->sw_if_subif_table);
 
     /* recreate the interface name hash table */
-    vam->sw_if_index_by_interface_name 
+    vam->sw_if_index_by_interface_name
         = hash_create_string (0, sizeof(uword));
 
     /* Get list of ethernets */
@@ -3630,7 +3826,7 @@ static int api_sw_interface_set_flags (vat_main_t * vam)
     u32 sw_if_index;
     u8 sw_if_index_set = 0;
     u8 admin_up = 0, link_up = 0;
-    
+
     /* Parse args required to build the message */
     while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
         if (unformat (i, "admin-up"))
@@ -3713,7 +3909,7 @@ static int api_sw_interface_add_del_address (vat_main_t * vam)
     u8 v6_address_set = 0;
     ip4_address_t v4address;
     ip6_address_t v6address;
-    
+
     /* Parse args required to build the message */
     while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
         if (unformat (i, "del-all"))
@@ -3724,12 +3920,12 @@ static int api_sw_interface_add_del_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_ip4_address, &v4address, 
+        else if (unformat (i, "%U/%d",
+                           unformat_ip4_address, &v4address,
                            &address_length))
             v4_address_set = 1;
-        else if (unformat (i, "%U/%d", 
-                           unformat_ip6_address, &v6address, 
+        else if (unformat (i, "%U/%d",
+                           unformat_ip6_address, &v6address,
                            &address_length))
             v6_address_set = 1;
         else
@@ -3778,7 +3974,7 @@ static int api_sw_interface_set_table (vat_main_t * vam)
     u32 sw_if_index, vrf_id = 0;
     u8 sw_if_index_set = 0;
     u8 is_ipv6 = 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))
@@ -3820,7 +4016,7 @@ static int api_sw_interface_set_vpath (vat_main_t * vam)
     u32 sw_if_index = 0;
     u8 sw_if_index_set = 0;
     u8 is_enable = 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))
@@ -3863,11 +4059,11 @@ static int api_sw_interface_set_l2_xconnect (vat_main_t * vam)
     u32 tx_sw_if_index;
     u8 tx_sw_if_index_set = 0;
     u8 enable = 1;
-    
+
     /* Parse args required to build the message */
     while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
        if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
-            rx_sw_if_index_set = 1;    
+            rx_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, "rx")) {
@@ -3886,7 +4082,7 @@ static int api_sw_interface_set_l2_xconnect (vat_main_t * vam)
                break;
        } else if (unformat (i, "enable"))
            enable = 1;
-       else if (unformat (i, "disable")) 
+       else if (unformat (i, "disable"))
            enable = 0;
        else
             break;
@@ -3901,7 +4097,7 @@ static int api_sw_interface_set_l2_xconnect (vat_main_t * vam)
         errmsg ("missing tx interface name or tx_sw_if_index\n");
         return -99;
     }
-    
+
     M(SW_INTERFACE_SET_L2_XCONNECT, sw_interface_set_l2_xconnect);
 
     mp->rx_sw_if_index = ntohl(rx_sw_if_index);
@@ -3925,23 +4121,23 @@ static int api_sw_interface_set_l2_bridge (vat_main_t * vam)
     u8 bvi = 0;
     u32 shg = 0;
     u8 enable = 1;
-    
+
     /* Parse args required to build the message */
     while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
        if (unformat (i, "sw_if_index %d", &rx_sw_if_index))
-            rx_sw_if_index_set = 1;    
+            rx_sw_if_index_set = 1;
        else if (unformat (i, "bd_id %d", &bd_id))
             bd_id_set = 1;
        else if (unformat (i, "%U", unformat_sw_if_index, vam,
                            &rx_sw_if_index))
             rx_sw_if_index_set = 1;
-       else if (unformat (i, "shg %d", &shg)) 
+       else if (unformat (i, "shg %d", &shg))
             ;
         else if (unformat (i, "bvi"))
             bvi = 1;
        else if (unformat (i, "enable"))
            enable = 1;
-       else if (unformat (i, "disable")) 
+       else if (unformat (i, "disable"))
            enable = 0;
        else
             break;
@@ -3956,7 +4152,7 @@ static int api_sw_interface_set_l2_bridge (vat_main_t * vam)
         errmsg ("missing bridge domain\n");
         return -99;
     }
-    
+
     M(SW_INTERFACE_SET_L2_BRIDGE, sw_interface_set_l2_bridge);
 
     mp->rx_sw_if_index = ntohl(rx_sw_if_index);
@@ -4078,7 +4274,7 @@ static int api_l2fib_add_del (vat_main_t * vam)
        else if (unformat (i, "bd_id %d", &bd_id))
             bd_id_set = 1;
        else if (unformat (i, "sw_if_index %d", &sw_if_index))
-            sw_if_index_set = 1;       
+            sw_if_index_set = 1;
        else if (unformat (i, "sw_if")) {
            if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
                if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
@@ -4125,11 +4321,11 @@ static int api_l2fib_add_del (vat_main_t * vam)
 
     for (j = 0; j < count; j++) {
        M(L2FIB_ADD_DEL, l2fib_add_del);
-       
+
        mp->mac = mac;
        mp->bd_id = ntohl(bd_id);
        mp->is_add = is_add;
-       
+
        if (is_add) {
            mp->sw_if_index = ntohl(sw_if_index);
            mp->static_mac = static_mac;
@@ -4190,7 +4386,7 @@ static int api_l2_flags (vat_main_t * vam)
     /* 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;       
+            sw_if_index_set = 1;
         else if (unformat (i, "sw_if")) {
             if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
                 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
@@ -4286,7 +4482,7 @@ static int api_bd_ip_mac_add_del (vat_main_t * vam)
     ip4_address_t v4addr;
     ip6_address_t v6addr;
     u8 macaddr[6];
-    
+
 
     /* Parse args required to build the message */
     while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
@@ -4341,7 +4537,7 @@ static int api_tap_connect (vat_main_t * vam)
     u8 * tap_name;
 
     memset (mac_address, 0, sizeof (mac_address));
-    
+
     /* Parse args required to build the message */
     while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
        if (unformat (i, "mac %U", unformat_ethernet_address, mac_address)) {
@@ -4363,7 +4559,7 @@ static int api_tap_connect (vat_main_t * vam)
         errmsg ("tap name too long\n");
     }
     vec_add1 (tap_name, 0);
-        
+
     /* Construct the API message */
     M(TAP_CONNECT, tap_connect);
 
@@ -4392,7 +4588,7 @@ static int api_tap_modify (vat_main_t * vam)
     u8 sw_if_index_set = 0;
 
     memset (mac_address, 0, sizeof (mac_address));
-    
+
     /* 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))
@@ -4422,7 +4618,7 @@ static int api_tap_modify (vat_main_t * vam)
         errmsg ("tap name too long\n");
     }
     vec_add1 (tap_name, 0);
-        
+
     /* Construct the API message */
     M(TAP_MODIFY, tap_modify);
 
@@ -4461,7 +4657,7 @@ static int api_tap_delete (vat_main_t * vam)
         errmsg ("missing vpp interface name");
         return -99;
     }
-        
+
     /* Construct the API message */
     M(TAP_DELETE, tap_delete);
 
@@ -4505,7 +4701,7 @@ static int api_ip_add_del_route (vat_main_t * vam)
     u32 random_seed = 0xdeaddabe;
     u32 classify_table_index = ~0;
     u8 is_classify = 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))
@@ -4524,12 +4720,12 @@ static int api_ip_add_del_route (vat_main_t * vam)
         else if (unformat (i, "/%d", &dst_address_length)) {
             address_length_set = 1;
         }
-        
-        else if (is_ipv6 == 0 && unformat (i, "via %U", unformat_ip4_address, 
+
+        else if (is_ipv6 == 0 && unformat (i, "via %U", unformat_ip4_address,
                                            &v4_next_hop_address)) {
             next_hop_set = 1;
         }
-        else if (is_ipv6 == 1 && unformat (i, "via %U", unformat_ip6_address, 
+        else if (is_ipv6 == 1 && unformat (i, "via %U", unformat_ip6_address,
                                            &v6_next_hop_address)) {
             next_hop_set = 1;
         }
@@ -4573,7 +4769,7 @@ static int api_ip_add_del_route (vat_main_t * vam)
         errmsg ("ARP resolution needs explicit interface or sw_if_index\n");
         return -99;
     }
-    
+
     if (!next_hop_set && !is_drop && !is_local && !is_classify) {
         errmsg ("next hop / local / drop / classify not set\n");
         return -99;
@@ -4588,7 +4784,7 @@ static int api_ip_add_del_route (vat_main_t * vam)
         errmsg ("missing address length\n");
         return -99;
     }
-    
+
     /* Generate a pile of unique, random routes */
     if (random_add_del) {
         u32 this_random_address;
@@ -4598,7 +4794,7 @@ static int api_ip_add_del_route (vat_main_t * vam)
         for (j = 0; j <= count; j++) {
             do {
                 this_random_address = random_u32 (&random_seed);
-                this_random_address = 
+                this_random_address =
                     clib_host_to_net_u32 (this_random_address);
             } while (hash_get (random_hash, this_random_address));
             vec_add1 (random_vector, this_random_address);
@@ -4618,7 +4814,7 @@ static int 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);
-    
+
         mp->next_hop_sw_if_index = ntohl (sw_if_index);
         mp->vrf_id = ntohl (vrf_id);
         if (resolve_attempts > 0) {
@@ -4626,7 +4822,7 @@ static int api_ip_add_del_route (vat_main_t * vam)
             mp->resolve_if_needed = 1;
         }
         mp->create_vrf_if_needed = create_vrf_if_needed;
-    
+
         mp->is_add = is_add;
         mp->is_drop = is_drop;
         mp->is_ipv6 = is_ipv6;
@@ -4642,13 +4838,13 @@ static int api_ip_add_del_route (vat_main_t * vam)
         if (is_ipv6){
             clib_memcpy (mp->dst_address, &v6_dst_address, sizeof (v6_dst_address));
             if (next_hop_set)
-                clib_memcpy (mp->next_hop_address, &v6_next_hop_address, 
+                clib_memcpy (mp->next_hop_address, &v6_next_hop_address,
                         sizeof (v6_next_hop_address));
             increment_v6_address (&v6_dst_address);
         } else {
             clib_memcpy (mp->dst_address, &v4_dst_address, sizeof (v4_dst_address));
             if (next_hop_set)
-                clib_memcpy (mp->next_hop_address, &v4_next_hop_address, 
+                clib_memcpy (mp->next_hop_address, &v4_next_hop_address,
                         sizeof (v4_next_hop_address));
             if (random_add_del)
                 v4_dst_address.as_u32 = random_vector[j+1];
@@ -4711,7 +4907,7 @@ static int api_proxy_arp_add_del (vat_main_t * vam)
     while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
        if (unformat (i, "vrf %d", &vrf_id))
            ;
-       else if (unformat (i, "%U - %U", unformat_ip4_address, &lo, 
+       else if (unformat (i, "%U - %U", unformat_ip4_address, &lo,
                           unformat_ip4_address, &hi))
            range_set = 1;
        else if (unformat (i, "del"))
@@ -4721,7 +4917,7 @@ static int api_proxy_arp_add_del (vat_main_t * vam)
             return -99;
         }
     }
-    
+
     if (range_set == 0) {
         errmsg ("address range not set\n");
         return -99;
@@ -4762,7 +4958,7 @@ static int api_proxy_arp_intfc_enable_disable (vat_main_t * vam)
             return -99;
         }
     }
-    
+
     if (sw_if_index_set == 0) {
         errmsg ("missing interface name or sw_if_index\n");
         return -99;
@@ -4808,7 +5004,7 @@ static int api_mpls_add_del_decap (vat_main_t * vam)
             return -99;
         }
     }
-    
+
     M(MPLS_ADD_DEL_DECAP, mpls_add_del_decap);
 
     mp->rx_vrf_id = ntohl(rx_vrf_id);
@@ -4853,8 +5049,8 @@ static int api_mpls_add_del_encap (vat_main_t * vam)
         errmsg ("missing encap label stack\n");
         return -99;
     }
-    
-    M2(MPLS_ADD_DEL_ENCAP, mpls_add_del_encap, 
+
+    M2(MPLS_ADD_DEL_ENCAP, mpls_add_del_encap,
        sizeof (u32) * vec_len (labels));
 
     mp->vrf_id = ntohl(vrf_id);
@@ -4884,7 +5080,7 @@ static int api_mpls_gre_add_del_tunnel (vat_main_t * vam)
     u8 intfc_address_length = 0;
     u8 is_add = 1;
     u8 l2_only = 0;
-    
+
     while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
        if (unformat (i, "inner_vrf_id %d", &inner_vrf_id))
            ;
@@ -4906,7 +5102,7 @@ static int api_mpls_gre_add_del_tunnel (vat_main_t * vam)
             return -99;
         }
     }
-    
+
     M(MPLS_GRE_ADD_DEL_TUNNEL, mpls_gre_add_del_tunnel);
 
     mp->inner_vrf_id = ntohl(inner_vrf_id);
@@ -4938,19 +5134,19 @@ static int api_mpls_ethernet_add_del_tunnel (vat_main_t * vam)
     u8 l2_only = 0;
     u32 tx_sw_if_index;
     int tx_sw_if_index_set = 0;
-    
+
     while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
        if (unformat (i, "vrf %d", &inner_vrf_id))
            ;
         else if (unformat (i, "adj %U/%d", unformat_ip4_address,
                            &intfc_address, &tmp))
             intfc_address_length = tmp;
-        else if (unformat (i, "%U", 
+        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, 
+        else if (unformat (i, "dst %U", unformat_ethernet_address,
                            dst_mac_address))
             dst_set = 1;
        else if (unformat (i, "l2-only"))
@@ -4971,7 +5167,7 @@ static int api_mpls_ethernet_add_del_tunnel (vat_main_t * vam)
         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);
@@ -5004,7 +5200,7 @@ static int api_mpls_ethernet_add_del_tunnel_2 (vat_main_t * vam)
     u8 is_add = 1;
     u32 resolve_attempts = 5;
     u8 resolve_if_needed = 1;
-    
+
     while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
        if (unformat (i, "inner_vrf_id %d", &inner_vrf_id))
            ;
@@ -5031,7 +5227,7 @@ static int api_mpls_ethernet_add_del_tunnel_2 (vat_main_t * vam)
             return -99;
         }
     }
-    
+
     if (!adj_address_set) {
         errmsg ("adjacency address/mask not set\n");
         return -99;
@@ -5040,9 +5236,9 @@ static int api_mpls_ethernet_add_del_tunnel_2 (vat_main_t * vam)
         errmsg ("ip4 next hop address (in outer fib) not set\n");
         return -99;
     }
-    
+
     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);
@@ -5051,7 +5247,7 @@ static int api_mpls_ethernet_add_del_tunnel_2 (vat_main_t * vam)
     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, 
+    clib_memcpy (mp->next_hop_ip4_address_in_outer_vrf, &next_hop_address,
             sizeof (next_hop_address));
 
     S; W;
@@ -5083,7 +5279,7 @@ static int api_sw_interface_set_unnumbered (vat_main_t * vam)
             return -99;
         }
     }
-    
+
     if (sw_if_index_set == 0) {
         errmsg ("missing interface name or sw_if_index\n");
         return -99;
@@ -5116,9 +5312,9 @@ static int api_ip_neighbor_add_del (vat_main_t * vam)
     u8 v6_address_set = 0;
     ip4_address_t v4address;
     ip6_address_t v6address;
-    
+
     memset (mac_address, 0, sizeof (mac_address));
-    
+
     /* Parse args required to build the message */
     while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
         if (unformat (i, "mac %U", unformat_ethernet_address, mac_address)) {
@@ -5134,10 +5330,10 @@ static int api_ip_neighbor_add_del (vat_main_t * vam)
             is_static = 1;
         else if (unformat (i, "vrf %d", &vrf_id))
             ;
-        else if (unformat (i, "dst %U", 
+        else if (unformat (i, "dst %U",
                            unformat_ip4_address, &v4address))
                 v4_address_set = 1;
-        else if (unformat (i, "dst %U", 
+        else if (unformat (i, "dst %U",
                            unformat_ip6_address, &v6address))
                 v6_address_set = 1;
         else {
@@ -5210,7 +5406,7 @@ static int api_reset_vrf (vat_main_t * vam)
         errmsg ("missing vrf id\n");
         return -99;
     }
-    
+
     M(RESET_VRF, reset_vrf);
 
     mp->vrf_id = ntohl(vrf_id);
@@ -5243,7 +5439,7 @@ static int api_create_vlan_subif (vat_main_t * vam)
             return -99;
         }
     }
-    
+
     if (sw_if_index_set == 0) {
         errmsg ("missing interface name or sw_if_index\n");
         return -99;
@@ -5315,7 +5511,7 @@ static int api_create_subif (vat_main_t * vam)
             return -99;
         }
     }
-    
+
     if (sw_if_index_set == 0) {
         errmsg ("missing interface name or sw_if_index\n");
         return -99;
@@ -5329,11 +5525,11 @@ static int api_create_subif (vat_main_t * vam)
 
     mp->sw_if_index = ntohl(sw_if_index);
     mp->sub_id = ntohl(sub_id);
-    
+
 #define _(a) mp->a = a;
     foreach_create_subif_bit;
 #undef _
-        
+
     mp->outer_vlan_id = ntohs (outer_vlan_id);
     mp->inner_vlan_id = ntohs (inner_vlan_id);
 
@@ -5352,7 +5548,7 @@ static int api_oam_add_del (vat_main_t * vam)
     ip4_address_t src, dst;
     u8 src_set = 0;
     u8 dst_set = 0;
-    
+
     while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
        if (unformat (i, "vrf %d", &vrf_id))
            ;
@@ -5367,7 +5563,7 @@ static int api_oam_add_del (vat_main_t * vam)
             return -99;
         }
     }
-    
+
     if (src_set == 0) {
         errmsg ("missing src addr\n");
         return -99;
@@ -5414,7 +5610,7 @@ static int api_reset_fib (vat_main_t * vam)
         errmsg ("missing vrf id\n");
         return -99;
     }
-    
+
     M(RESET_FIB, reset_fib);
 
     mp->vrf_id = ntohl(vrf_id);
@@ -5441,7 +5637,7 @@ static int api_dhcp_proxy_config (vat_main_t * vam)
     u8 v6_src_address_set = 0;
     ip4_address_t v4srcaddress;
     ip6_address_t v6srcaddress;
-    
+
     /* Parse args required to build the message */
     while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
         if (unformat (i, "del"))
@@ -5450,16 +5646,16 @@ static int api_dhcp_proxy_config (vat_main_t * vam)
             ;
         else if (unformat (i, "insert-cid %d", &insert_cid))
             ;
-        else if (unformat (i, "svr %U", 
+        else if (unformat (i, "svr %U",
                            unformat_ip4_address, &v4address))
                 v4_address_set = 1;
-        else if (unformat (i, "svr %U", 
+        else if (unformat (i, "svr %U",
                            unformat_ip6_address, &v6address))
                 v6_address_set = 1;
-        else if (unformat (i, "src %U", 
+        else if (unformat (i, "src %U",
                            unformat_ip4_address, &v4srcaddress))
                 v4_src_address_set = 1;
-        else if (unformat (i, "src %U", 
+        else if (unformat (i, "src %U",
                            unformat_ip6_address, &v6srcaddress))
                 v6_src_address_set = 1;
         else
@@ -5531,7 +5727,7 @@ static int api_dhcp_proxy_config_2 (vat_main_t * vam)
     u8 v6_src_address_set = 0;
     ip4_address_t v4srcaddress;
     ip6_address_t v6srcaddress;
-    
+
     /* Parse args required to build the message */
     while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
         if (unformat (i, "del"))
@@ -5542,16 +5738,16 @@ static int api_dhcp_proxy_config_2 (vat_main_t * vam)
             ;
         else if (unformat (i, "insert-cid %d", &insert_cid))
             ;
-        else if (unformat (i, "svr %U", 
+        else if (unformat (i, "svr %U",
                            unformat_ip4_address, &v4address))
                 v4_address_set = 1;
-        else if (unformat (i, "svr %U", 
+        else if (unformat (i, "svr %U",
                            unformat_ip6_address, &v6address))
                 v6_address_set = 1;
-        else if (unformat (i, "src %U", 
+        else if (unformat (i, "src %U",
                            unformat_ip4_address, &v4srcaddress))
                 v4_src_address_set = 1;
-        else if (unformat (i, "src %U", 
+        else if (unformat (i, "src %U",
                            unformat_ip6_address, &v6srcaddress))
                 v6_src_address_set = 1;
         else
@@ -5651,7 +5847,7 @@ static int api_dhcp_proxy_set_vss (vat_main_t * vam)
         errmsg ("missing oui\n");
         return -99;
     }
-    
+
     M(DHCP_PROXY_SET_VSS, dhcp_proxy_set_vss);
     mp->tbl_id = ntohl(tbl_id);
     mp->fib_id = ntohl(fib_id);
@@ -5710,7 +5906,7 @@ static int api_dhcp_client_config (vat_main_t * vam)
     mp->is_add = is_add;
     mp->want_dhcp_event = disable_event ? 0 : 1;
     mp->pid = getpid();
-   
+
     /* send it... */
     S;
 
@@ -5763,7 +5959,7 @@ static int api_set_ip_flow_hash (vat_main_t * vam)
         errmsg ("missing vrf id\n");
         return -99;
     }
-    
+
     M(SET_IP_FLOW_HASH, set_ip_flow_hash);
     mp->src = src;
     mp->dst = dst;
@@ -5807,7 +6003,7 @@ static int api_sw_interface_ip6_enable_disable (vat_main_t * vam)
         errmsg ("missing interface name or sw_if_index\n");
         return -99;
     }
-    
+
     M(SW_INTERFACE_IP6_ENABLE_DISABLE, sw_interface_ip6_enable_disable);
 
     mp->sw_if_index = ntohl(sw_if_index);
@@ -5828,15 +6024,15 @@ static int api_sw_interface_ip6_set_link_local_address (vat_main_t * vam)
     u32 address_length = 0;
     u8 v6_address_set = 0;
     ip6_address_t v6address;
-    
+
     /* 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/%d", 
-                           unformat_ip6_address, &v6address, 
+        else if (unformat (i, "%U/%d",
+                           unformat_ip6_address, &v6address,
                            &address_length))
             v6_address_set = 1;
         else
@@ -5889,15 +6085,15 @@ static int api_sw_interface_ip6nd_ra_prefix (vat_main_t * vam)
     u8 is_no = 0;
     u32 val_lifetime = 0;
     u32 pref_lifetime = 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))
             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, 
+        else if (unformat (i, "%U/%d",
+                           unformat_ip6_address, &v6address,
                            &address_length))
             v6_address_set = 1;
         else if (unformat (i, "val_life %d", &val_lifetime))
@@ -5919,7 +6115,7 @@ static int api_sw_interface_ip6nd_ra_prefix (vat_main_t * vam)
         else {
             clib_warning ("parse error '%U'", format_unformat_error, i);
             return -99;
-        }        
+        }
     }
 
     if (sw_if_index_set == 0) {
@@ -5977,7 +6173,7 @@ static int api_sw_interface_ip6nd_ra_config (vat_main_t * vam)
     u32 initial_count = 0;
     u32 initial_interval = 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))
@@ -6013,7 +6209,7 @@ static int api_sw_interface_ip6nd_ra_config (vat_main_t * vam)
         else {
             clib_warning ("parse error '%U'", format_unformat_error, i);
             return -99;
-        }        
+        }
     }
 
     if (sw_if_index_set == 0) {
@@ -6073,7 +6269,7 @@ static int api_set_arp_neighbor_limit (vat_main_t * vam)
         errmsg ("missing limit value\n");
         return -99;
     }
-    
+
     M(SET_ARP_NEIGHBOR_LIMIT, set_arp_neighbor_limit);
 
     mp->arp_neighbor_limit = ntohl(arp_nbr_limit);
@@ -6094,11 +6290,11 @@ static int api_l2_patch_add_del (vat_main_t * vam)
     u32 tx_sw_if_index;
     u8 tx_sw_if_index_set = 0;
     u8 is_add = 1;
-    
+
     /* Parse args required to build the message */
     while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
        if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
-            rx_sw_if_index_set = 1;    
+            rx_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, "rx")) {
@@ -6130,7 +6326,7 @@ static int api_l2_patch_add_del (vat_main_t * vam)
         errmsg ("missing tx interface name or tx_sw_if_index\n");
         return -99;
     }
-    
+
     M(L2_PATCH_ADD_DEL, l2_patch_add_del);
 
     mp->rx_sw_if_index = ntohl(rx_sw_if_index);
@@ -6151,11 +6347,11 @@ static int api_trace_profile_add (vat_main_t *vam)
    u32 trace_type = 0, node_id = 0, app_data = 0, trace_tsp = 2;
    int has_pow_option = 0;
    int has_ppc_option = 0;
-  
+
   while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
     {
       if (unformat (input, "id %d trace-type 0x%x trace-elts %d "
-                           "trace-tsp %d node-id 0x%x app-data 0x%x", 
+                           "trace-tsp %d node-id 0x%x app-data 0x%x",
                    &id, &trace_type, &trace_option_elts, &trace_tsp,
                       &node_id, &app_data))
             ;
@@ -6179,11 +6375,11 @@ static int api_trace_profile_add (vat_main_t *vam)
   mp->pow_enable = has_pow_option;
   mp->trace_tsp = trace_tsp;
   mp->node_id = htonl(node_id);
-  
+
   S; W;
-  
+
   return(0);
-   
+
 }
 static int api_trace_profile_apply (vat_main_t *vam)
 {
@@ -6197,7 +6393,7 @@ static int api_trace_profile_apply (vat_main_t *vam)
   int is_none = 0;
   u32 vrf_id = 0;
   u32 id = 0;
-  
+
   while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
     {
       if (unformat (input, "%U/%d",
@@ -6241,7 +6437,7 @@ static int api_trace_profile_apply (vat_main_t *vam)
     mp->enable = 0;
   else
     mp->enable = 1;
-  
+
   S; W;
 
   return 0;
@@ -6251,7 +6447,7 @@ static int api_trace_profile_del (vat_main_t *vam)
 {
    vl_api_trace_profile_del_t *mp;
    f64 timeout;
-   
+
    M(TRACE_PROFILE_DEL, trace_profile_del);
    S; W;
    return 0;
@@ -6294,7 +6490,7 @@ static int api_sr_tunnel_add_del (vat_main_t * vam)
         ;
       else if (unformat (i, "src %U", unformat_ip6_address, &src_address))
         src_address_set = 1;
-      else if (unformat (i, "dst %U/%d", 
+      else if (unformat (i, "dst %U/%d",
                          unformat_ip6_address, &dst_address,
                          &dst_mask_width))
         dst_address_set = 1;
@@ -6336,7 +6532,7 @@ static int api_sr_tunnel_add_del (vat_main_t * vam)
             goto pl_index_range_error;
           flags |= IP6_SR_HEADER_FLAG_PL_ELT_ORIG_SRC_ADDR << (3*(pl_index - 1));
         }
-      else 
+      else
         break;
     }
 
@@ -6358,8 +6554,8 @@ static int api_sr_tunnel_add_del (vat_main_t * vam)
       return -99;
     }
 
-  M2(SR_TUNNEL_ADD_DEL, sr_tunnel_add_del, 
-     vec_len(segments) * sizeof (ip6_address_t) 
+  M2(SR_TUNNEL_ADD_DEL, sr_tunnel_add_del,
+     vec_len(segments) * sizeof (ip6_address_t)
      + vec_len(tags) * sizeof (ip6_address_t));
 
   clib_memcpy (mp->src_address, &src_address, sizeof (mp->src_address));
@@ -6369,7 +6565,7 @@ static int api_sr_tunnel_add_del (vat_main_t * vam)
   mp->n_segments = vec_len (segments);
   mp->n_tags = vec_len (tags);
   mp->is_add = is_del == 0;
-  clib_memcpy (mp->segs_and_tags, segments, 
+  clib_memcpy (mp->segs_and_tags, segments,
           vec_len(segments)* sizeof (ip6_address_t));
   clib_memcpy (mp->segs_and_tags + vec_len(segments)*sizeof (ip6_address_t),
           tags, vec_len(tags)* sizeof (ip6_address_t));
@@ -6381,7 +6577,7 @@ static int api_sr_tunnel_add_del (vat_main_t * vam)
 
   vec_free (segments);
   vec_free (tags);
-  
+
   S; W;
   /* NOTREACHED */
 }
@@ -6395,7 +6591,7 @@ static int api_sr_policy_add_del (vat_main_t * vam)
   u8 * name = 0;
   u8 * tunnel_name = 0;
   u8 ** tunnel_names = 0;
-  
+
   int name_set = 0 ;
   int tunnel_set = 0;
   int j = 0;
@@ -6413,16 +6609,16 @@ static int api_sr_policy_add_del (vat_main_t * vam)
          if (tunnel_name)
            {
              vec_add1 (tunnel_names, tunnel_name);
-             /* For serializer: 
+             /* For serializer:
                 - length = #bytes to store in serial vector
                 - +1 = byte to store that length
              */
-             tunnel_names_length += (vec_len (tunnel_name) + 1); 
+             tunnel_names_length += (vec_len (tunnel_name) + 1);
              tunnel_set = 1;
              tunnel_name = 0;
            }
         }
-      else 
+      else
         break;
     }
 
@@ -6440,7 +6636,7 @@ static int api_sr_policy_add_del (vat_main_t * vam)
 
   M2(SR_POLICY_ADD_DEL, sr_policy_add_del, tunnel_names_length);
 
-  
+
 
   mp->is_add = !is_del;
 
@@ -6463,7 +6659,7 @@ static int api_sr_policy_add_del (vat_main_t * vam)
 
   vec_free (tunnel_names);
   vec_free (tunnel_name);
-  
+
   S; W;
   /* NOTREACHED */
 }
@@ -6486,7 +6682,7 @@ static int api_sr_multicast_map_add_del (vat_main_t * vam)
        multicast_address_set = 1;
       else if (unformat (input, "sr-policy %s", &policy_name))
         ;
-      else 
+      else
         break;
     }
 
@@ -6511,7 +6707,7 @@ static int api_sr_multicast_map_add_del (vat_main_t * vam)
 
 
   vec_free (policy_name);
-  
+
   S; W;
   /* NOTREACHED */
 }
@@ -6533,17 +6729,17 @@ uword unformat_ip4_mask (unformat_input_t * input, va_list * args)
   u8 * mask = 0;
   u8 found_something = 0;
   ip4_header_t * ip;
-  
+
 #define _(a) u8 a=0;
   foreach_ip4_proto_field;
 #undef _
   u8 version = 0;
   u8 hdr_length = 0;
-  
-  
-  while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) 
+
+
+  while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
     {
-      if (unformat (input, "version")) 
+      if (unformat (input, "version"))
         version = 1;
       else if (unformat (input, "hdr_length"))
         hdr_length = 1;
@@ -6553,37 +6749,37 @@ uword unformat_ip4_mask (unformat_input_t * input, va_list * args)
         dst_address = 1;
       else if (unformat (input, "proto"))
         protocol = 1;
-      
+
 #define _(a) else if (unformat (input, #a)) a=1;
       foreach_ip4_proto_field
 #undef _
       else
         break;
     }
-  
+
 #define _(a) found_something += a;
   foreach_ip4_proto_field;
 #undef _
-  
+
   if (found_something == 0)
     return 0;
-  
+
   vec_validate (mask, sizeof (*ip) - 1);
-  
+
   ip = (ip4_header_t *) mask;
-  
+
 #define _(a) if (a) memset (&ip->a, 0xff, sizeof (ip->a));
   foreach_ip4_proto_field;
 #undef _
-  
+
   ip->ip_version_and_header_length = 0;
-  
+
   if (version)
     ip->ip_version_and_header_length |= 0xF0;
-  
+
   if (hdr_length)
     ip->ip_version_and_header_length |= 0x0F;
-  
+
   *maskp = mask;
   return 1;
 }
@@ -6602,17 +6798,17 @@ uword unformat_ip6_mask (unformat_input_t * input, va_list * args)
   u8 found_something = 0;
   ip6_header_t * ip;
   u32 ip_version_traffic_class_and_flow_label;
-  
+
 #define _(a) u8 a=0;
   foreach_ip6_proto_field;
 #undef _
   u8 version = 0;
   u8 traffic_class = 0;
   u8 flow_label = 0;
-  
-  while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) 
+
+  while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
     {
-      if (unformat (input, "version")) 
+      if (unformat (input, "version"))
         version = 1;
       else if (unformat (input, "traffic-class"))
         traffic_class = 1;
@@ -6624,31 +6820,31 @@ uword unformat_ip6_mask (unformat_input_t * input, va_list * args)
         dst_address = 1;
       else if (unformat (input, "proto"))
         protocol = 1;
-      
+
 #define _(a) else if (unformat (input, #a)) a=1;
       foreach_ip6_proto_field
 #undef _
       else
         break;
     }
-  
+
 #define _(a) found_something += a;
   foreach_ip6_proto_field;
 #undef _
-  
+
   if (found_something == 0)
     return 0;
-  
+
   vec_validate (mask, sizeof (*ip) - 1);
-  
+
   ip = (ip6_header_t *) mask;
-  
+
 #define _(a) if (a) memset (&ip->a, 0xff, sizeof (ip->a));
   foreach_ip6_proto_field;
 #undef _
-  
+
   ip_version_traffic_class_and_flow_label = 0;
-  
+
   if (version)
     ip_version_traffic_class_and_flow_label |= 0xF0000000;
 
@@ -6658,9 +6854,9 @@ uword unformat_ip6_mask (unformat_input_t * input, va_list * args)
   if (flow_label)
     ip_version_traffic_class_and_flow_label |= 0x000FFFFF;
 
-  ip->ip_version_traffic_class_and_flow_label = 
+  ip->ip_version_traffic_class_and_flow_label =
     clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
-  
+
   *maskp = mask;
   return 1;
 }
@@ -6739,7 +6935,7 @@ uword unformat_l2_mask (unformat_input_t * input, va_list * args)
 
   if (src)
     memset (mask + 6, 0xff, 6);
-  
+
   if (tag2 || dot1ad)
     {
       /* inner vlan tag */
@@ -6783,7 +6979,7 @@ uword unformat_l2_mask (unformat_input_t * input, va_list * args)
     mask[14] |= 0xe0;
   if (proto)
     mask[12] = mask [13] = 0xff;
-    
+
   *maskp = mask;
   return 1;
 }
@@ -6798,7 +6994,7 @@ uword unformat_classify_mask (unformat_input_t * input, va_list * args)
   u8 * l2 = 0;
   u8 * l3 = 0;
   int i;
-  
+
   while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
     if (unformat (input, "hex %U", unformat_hex_string, &mask))
       ;
@@ -6869,18 +7065,18 @@ uword unformat_l2_next_index (unformat_input_t * input, va_list * args)
   u32 * miss_next_indexp = va_arg (*args, u32 *);
   u32 next_index = 0;
   u32 tmp;
-  
+
 #define _(n,N) \
   if (unformat (input, #n)) { next_index = L2_CLASSIFY_NEXT_##N; goto out;}
   foreach_l2_next;
 #undef _
-  
+
   if (unformat (input, "%d", &tmp))
-    { 
-      next_index = tmp; 
-      goto out; 
+    {
+      next_index = tmp;
+      goto out;
     }
-  
+
   return 0;
 
  out:
@@ -6899,18 +7095,18 @@ uword unformat_ip_next_index (unformat_input_t * input, va_list * args)
   u32 * miss_next_indexp = va_arg (*args, u32 *);
   u32 next_index = 0;
   u32 tmp;
-  
+
 #define _(n,N) \
   if (unformat (input, #n)) { next_index = IP_LOOKUP_NEXT_##N; goto out;}
   foreach_ip_next;
 #undef _
-  
+
   if (unformat (input, "%d", &tmp))
-    { 
-      next_index = tmp; 
-      goto out; 
+    {
+      next_index = tmp;
+      goto out;
     }
-  
+
   return 0;
 
  out:
@@ -6950,6 +7146,20 @@ uword unformat_acl_next_index (unformat_input_t * input, va_list * args)
   return 1;
 }
 
+uword unformat_policer_precolor (unformat_input_t * input, va_list * args)
+{
+  u32 * r = va_arg (*args, u32 *);
+
+  if (unformat (input, "conform-color"))
+    *r = POLICE_CONFORM;
+  else if (unformat (input, "exceed-color"))
+    *r = POLICE_EXCEED;
+  else
+    return 0;
+
+  return 1;
+}
+
 static int api_classify_add_del_table (vat_main_t * vam)
 {
   unformat_input_t * i = vam->input;
@@ -6979,7 +7189,7 @@ static int api_classify_add_del_table (vat_main_t * vam)
       ;
     else if (unformat (i, "table %d", &table_index))
       ;
-    else if (unformat (i, "mask %U", unformat_classify_mask, 
+    else if (unformat (i, "mask %U", unformat_classify_mask,
                        &mask, &skip, &match))
       ;
     else if (unformat (i, "next-table %d", &next_table_index))
@@ -6996,7 +7206,7 @@ static int api_classify_add_del_table (vat_main_t * vam)
     else
       break;
   }
-  
+
   if (is_add && mask == 0) {
       errmsg ("Mask required\n");
       return -99;
@@ -7011,7 +7221,7 @@ static int api_classify_add_del_table (vat_main_t * vam)
       errmsg ("match count required\n");
       return -99;
   }
-      
+
   if (!is_add && table_index == ~0) {
       errmsg ("table index required for delete\n");
       return -99;
@@ -7060,9 +7270,9 @@ uword unformat_ip4_match (unformat_input_t * input, va_list * args)
   int checksum = 0;
   u32 checksum_val;
 
-  while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) 
+  while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
     {
-      if (unformat (input, "version %d", &version_val)) 
+      if (unformat (input, "version %d", &version_val))
         version = 1;
       else if (unformat (input, "hdr_length %d", &hdr_length_val))
         hdr_length = 1;
@@ -7085,28 +7295,28 @@ uword unformat_ip4_match (unformat_input_t * input, va_list * args)
       else
         break;
     }
-  
+
   if (version + hdr_length + src + dst + proto + tos + length + fragment_id
       + ttl + checksum == 0)
     return 0;
 
-  /* 
+  /*
    * Aligned because we use the real comparison functions
    */
   vec_validate_aligned (match, sizeof (*ip) - 1, sizeof(u32x4));
-  
+
   ip = (ip4_header_t *) match;
-  
+
   /* These are realistically matched in practice */
   if (src)
     ip->src_address.as_u32 = src_val.as_u32;
 
   if (dst)
     ip->dst_address.as_u32 = dst_val.as_u32;
-  
+
   if (proto)
     ip->protocol = proto_val;
-    
+
 
   /* These are not, but they're included for completeness */
   if (version)
@@ -7114,13 +7324,13 @@ uword unformat_ip4_match (unformat_input_t * input, va_list * args)
 
   if (hdr_length)
     ip->ip_version_and_header_length |= (hdr_length_val & 0xF);
-    
+
   if (tos)
     ip->tos = tos_val;
-  
+
   if (length)
     ip->length = length_val;
-  
+
   if (ttl)
     ip->ttl = ttl_val;
 
@@ -7152,9 +7362,9 @@ uword unformat_ip6_match (unformat_input_t * input, va_list * args)
   int hop_limit_val;
   u32 ip_version_traffic_class_and_flow_label;
 
-  while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) 
+  while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
     {
-      if (unformat (input, "version %d", &version_val)) 
+      if (unformat (input, "version %d", &version_val))
         version = 1;
       else if (unformat (input, "traffic_class %d", &traffic_class_val))
         traffic_class = 1;
@@ -7173,27 +7383,27 @@ uword unformat_ip6_match (unformat_input_t * input, va_list * args)
       else
         break;
     }
-  
+
   if (version + traffic_class + flow_label + src + dst + proto +
       payload_length + hop_limit == 0)
     return 0;
 
-  /* 
+  /*
    * Aligned because we use the real comparison functions
    */
   vec_validate_aligned (match, sizeof (*ip) - 1, sizeof(u32x4));
-  
+
   ip = (ip6_header_t *) match;
-  
+
   if (src)
     clib_memcpy (&ip->src_address, &src_val, sizeof (ip->src_address));
 
   if (dst)
     clib_memcpy (&ip->dst_address, &dst_val, sizeof (ip->dst_address));
-  
+
   if (proto)
     ip->protocol = proto_val;
-    
+
   ip_version_traffic_class_and_flow_label = 0;
 
   if (version)
@@ -7204,13 +7414,13 @@ uword unformat_ip6_match (unformat_input_t * input, va_list * args)
 
   if (flow_label)
     ip_version_traffic_class_and_flow_label |= (flow_label_val & 0xFFFFF);
-    
-  ip->ip_version_traffic_class_and_flow_label = 
+
+  ip->ip_version_traffic_class_and_flow_label =
     clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
 
   if (payload_length)
     ip->payload_length = clib_host_to_net_u16 (payload_length_val);
-  
+
   if (hop_limit)
     ip->hop_limit = hop_limit_val;
 
@@ -7275,7 +7485,7 @@ uword unformat_l2_match (unformat_input_t * input, va_list * args)
       src = 1;
     else if (unformat (input, "dst %U", unformat_ethernet_address, &dst_val))
       dst = 1;
-    else if (unformat (input, "proto %U", 
+    else if (unformat (input, "proto %U",
                        unformat_ethernet_type_host_byte_order, &proto_val))
       proto = 1;
     else if (unformat (input, "tag1 %U", unformat_vlan_tag, tag1_val))
@@ -7309,7 +7519,7 @@ uword unformat_l2_match (unformat_input_t * input, va_list * args)
 
   if (src)
     clib_memcpy (match + 6, src_val, 6);
-  
+
   if (tag2)
     {
       /* inner vlan tag */
@@ -7356,7 +7566,7 @@ uword unformat_l2_match (unformat_input_t * input, va_list * args)
       match[13] = proto_val & 0xff;
       match[12] = proto_val >> 8;
     }
-  
+
   *matchp = match;
   return 1;
 }
@@ -7367,7 +7577,7 @@ uword unformat_classify_match (unformat_input_t * input, va_list * args)
   u8 ** matchp = va_arg (*args, u8 **);
   u32 skip_n_vectors = va_arg (*args, u32);
   u32 match_n_vectors = va_arg (*args, u32);
-  
+
   u8 * match = 0;
   u8 * l2 = 0;
   u8 * l3 = 0;
@@ -7396,10 +7606,10 @@ uword unformat_classify_match (unformat_input_t * input, va_list * args)
         }
 
       /* Make sure the vector is big enough even if key is all 0's */
-      vec_validate_aligned 
+      vec_validate_aligned
           (match, ((match_n_vectors + skip_n_vectors) * sizeof(u32x4)) - 1,
            sizeof(u32x4));
-      
+
       /* Set size, include skipped vectors*/
       _vec_len (match) = (match_n_vectors+skip_n_vectors) * sizeof(u32x4);
 
@@ -7425,7 +7635,7 @@ static int api_classify_add_del_session (vat_main_t * vam)
     u32 skip_n_vectors = 0;
     u32 match_n_vectors = 0;
 
-    /* 
+    /*
      * Warning: you have to supply skip_n and match_n
      * because the API client cant simply look at the classify
      * table object.
@@ -7443,6 +7653,10 @@ static int api_classify_add_del_session (vat_main_t * vam)
         else if (unformat (i, "acl-hit-next %U", unformat_acl_next_index,
                            &hit_next_index))
             ;
+        else if (unformat (i, "policer-hit-next %d", &hit_next_index))
+            ;
+        else if (unformat (i, "%U", unformat_policer_precolor, &opaque_index))
+            ;
         else if (unformat (i, "opaque-index %d", &opaque_index))
             ;
         else if (unformat (i, "skip_n %d", &skip_n_vectors))
@@ -7507,7 +7721,7 @@ static int api_classify_set_interface_ip_table (vat_main_t * vam)
             return -99;
         }
     }
-    
+
     if (sw_if_index_set == 0) {
         errmsg ("missing interface name or sw_if_index\n");
         return -99;
@@ -7552,7 +7766,7 @@ static int api_classify_set_interface_l2_tables (vat_main_t * vam)
             return -99;
         }
     }
-    
+
     if (sw_if_index_set == 0) {
         errmsg ("missing interface name or sw_if_index\n");
         return -99;
@@ -7636,7 +7850,7 @@ static int api_get_node_index (vat_main_t * vam)
     vl_api_get_node_index_t * mp;
     f64 timeout;
     u8 * name = 0;
-    
+
     while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
         if (unformat (i, "node %s", &name))
             ;
@@ -7655,7 +7869,50 @@ static int api_get_node_index (vat_main_t * vam)
     M(GET_NODE_INDEX, get_node_index);
     clib_memcpy (mp->node_name, name, vec_len(name));
     vec_free(name);
-    
+
+    S; W;
+    /* NOTREACHED */
+    return 0;
+}
+
+static int api_get_next_index (vat_main_t * vam)
+{
+    unformat_input_t * i = vam->input;
+    vl_api_get_next_index_t * mp;
+    f64 timeout;
+    u8 * node_name = 0, * next_node_name = 0;
+
+    while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
+        if (unformat (i, "node-name %s", &node_name))
+            ;
+        else if (unformat (i, "next-node-name %s", &next_node_name))
+            break;
+    }
+
+    if (node_name == 0) {
+        errmsg ("node name required\n");
+        return -99;
+    }
+    if (vec_len (node_name) >= ARRAY_LEN(mp->node_name)) {
+        errmsg ("node name too long, max %d\n", ARRAY_LEN(mp->node_name));
+        return -99;
+    }
+
+    if (next_node_name == 0) {
+        errmsg ("next node name required\n");
+        return -99;
+    }
+    if (vec_len (next_node_name) >= ARRAY_LEN(mp->next_name)) {
+        errmsg ("next node name too long, max %d\n", ARRAY_LEN(mp->next_name));
+        return -99;
+    }
+
+    M(GET_NEXT_INDEX, get_next_index);
+    clib_memcpy (mp->node_name, node_name, vec_len(node_name));
+    clib_memcpy (mp->next_name, next_node_name, vec_len(next_node_name));
+    vec_free(node_name);
+    vec_free(next_node_name);
+
     S; W;
     /* NOTREACHED */
     return 0;
@@ -7693,13 +7950,13 @@ static int api_add_node_next (vat_main_t * vam)
         errmsg ("next name too long, max %d\n", ARRAY_LEN(mp->next_name));
         return -99;
     }
-    
+
     M(ADD_NODE_NEXT, add_node_next);
     clib_memcpy (mp->node_name, name, vec_len(name));
     clib_memcpy (mp->next_name, next, vec_len(next));
     vec_free(name);
     vec_free(next);
-    
+
     S; W;
     /* NOTREACHED */
     return 0;
@@ -7720,10 +7977,10 @@ static int api_l2tpv3_create_tunnel (vat_main_t * vam)
     f64 timeout;
 
     while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
-        if (unformat (i, "client_address %U", unformat_ip6_address, 
+        if (unformat (i, "client_address %U", unformat_ip6_address,
                       &client_address))
             client_address_set = 1;
-        else if (unformat (i, "our_address %U", unformat_ip6_address, 
+        else if (unformat (i, "our_address %U", unformat_ip6_address,
                            &our_address))
             our_address_set = 1;
         else if (unformat (i, "local_session_id %d", &local_session_id))
@@ -7752,12 +8009,12 @@ static int api_l2tpv3_create_tunnel (vat_main_t * vam)
 
     M(L2TPV3_CREATE_TUNNEL, l2tpv3_create_tunnel);
 
-    clib_memcpy (mp->client_address, client_address.as_u8, 
+    clib_memcpy (mp->client_address, client_address.as_u8,
             sizeof (mp->client_address));
 
-    clib_memcpy (mp->our_address, our_address.as_u8, 
+    clib_memcpy (mp->our_address, our_address.as_u8,
             sizeof (mp->our_address));
-    
+
     mp->local_session_id = ntohl (local_session_id);
     mp->remote_session_id = ntohl (remote_session_id);
     mp->local_cookie = clib_host_to_net_u64 (local_cookie);
@@ -7835,7 +8092,7 @@ static int api_l2tpv3_interface_enable_disable (vat_main_t * vam)
         errmsg ("missing interface name or sw_if_index\n");
         return -99;
     }
-    
+
     M(L2TPV3_INTERFACE_ENABLE_DISABLE, l2tpv3_interface_enable_disable);
 
     mp->sw_if_index = ntohl(sw_if_index);
@@ -7868,7 +8125,7 @@ static int api_l2tpv3_set_lookup_key (vat_main_t * vam)
         errmsg ("l2tp session lookup key unset\n");
         return -99;
     }
-    
+
     M(L2TPV3_SET_LOOKUP_KEY, l2tpv3_set_lookup_key);
 
     mp->key = key;
@@ -8000,12 +8257,12 @@ static int api_sw_interface_tap_dump (vat_main_t * vam)
     W;
 }
 
-static uword unformat_vxlan_decap_next 
+static uword unformat_vxlan_decap_next
 (unformat_input_t * input, va_list * args)
 {
   u32 * result = va_arg (*args, u32 *);
   u32 tmp;
-  
+
   if (unformat (input, "drop"))
     *result = VXLAN_INPUT_NEXT_DROP;
   else if (unformat (input, "ip4"))
@@ -8039,7 +8296,7 @@ static int api_vxlan_add_del_tunnel (vat_main_t * vam)
     while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) {
         if (unformat (line_input, "del"))
             is_add = 0;
-        else if (unformat (line_input, "src %U", 
+        else if (unformat (line_input, "src %U",
                            unformat_ip4_address, &src4))
           {
             ipv4_set = 1;
@@ -8051,7 +8308,7 @@ static int api_vxlan_add_del_tunnel (vat_main_t * vam)
             ipv4_set = 1;
             dst_set = 1;
           }
-        else if (unformat (line_input, "src %U", 
+        else if (unformat (line_input, "src %U",
                            unformat_ip6_address, &src6))
           {
             ipv6_set = 1;
@@ -8065,7 +8322,7 @@ static int api_vxlan_add_del_tunnel (vat_main_t * vam)
           }
         else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
             ;
-        else if (unformat (line_input, "decap-next %U", 
+        else if (unformat (line_input, "decap-next %U",
                            unformat_vxlan_decap_next, &decap_next_index))
             ;
         else if (unformat (line_input, "vni %d", &vni))
@@ -8100,7 +8357,7 @@ static int api_vxlan_add_del_tunnel (vat_main_t * vam)
     if (ipv6_set) {
         clib_memcpy(&mp->src_address, &src6, sizeof(src6));
         clib_memcpy(&mp->dst_address, &dst6, sizeof(dst6));
-    } else { 
+    } else {
         clib_memcpy(&mp->src_address, &src4, sizeof(src4));
         clib_memcpy(&mp->dst_address, &dst4, sizeof(dst4));
     }
@@ -8248,7 +8505,7 @@ static int api_gre_add_del_tunnel (vat_main_t * vam)
 
     clib_memcpy(&mp->src_address, &src4, sizeof(src4));
     clib_memcpy(&mp->dst_address, &dst4, sizeof(dst4));
-    mp->outer_table_id = ntohl(outer_fib_id);
+    mp->outer_fib_id = ntohl(outer_fib_id);
     mp->is_add = is_add;
 
     S; W;
@@ -8265,7 +8522,7 @@ static void vl_api_gre_tunnel_details_t_handler
             ntohl(mp->sw_if_index),
             format_ip4_address, &mp->src_address,
             format_ip4_address, &mp->dst_address,
-            ntohl(mp->outer_table_id));
+            ntohl(mp->outer_fib_id));
 }
 
 static void vl_api_gre_tunnel_details_t_handler_json
@@ -8287,7 +8544,7 @@ static void vl_api_gre_tunnel_details_t_handler_json
     vat_json_object_add_ip4(node, "src_address", ip4);
     clib_memcpy(&ip4, &mp->dst_address, sizeof(ip4));
     vat_json_object_add_ip4(node, "dst_address", ip4);
-    vat_json_object_add_uint(node, "outer_fib_id", ntohl(mp->outer_table_id));
+    vat_json_object_add_uint(node, "outer_fib_id", ntohl(mp->outer_fib_id));
 }
 
 static int api_gre_tunnel_dump (vat_main_t * vam)
@@ -8368,7 +8625,7 @@ static int api_l2_interface_efp_filter (vat_main_t * vam)
             return -99;
         }
     }
-    
+
     if (sw_if_index_set == 0) {
         errmsg ("missing sw_if_index\n");
         return -99;
@@ -8418,7 +8675,7 @@ static int api_l2_interface_vlan_tag_rewrite (vat_main_t * vam)
 #define _(n,v) else if (unformat(i, n)) {vtr_op = v; vtr_op_set = 1;}
         foreach_vtr_op
 #undef _
-        
+
         else if (unformat (i, "push_dot1q %d", &push_dot1q))
             ;
         else if (unformat (i, "tag1 %d", &tag1))
@@ -8430,7 +8687,7 @@ static int api_l2_interface_vlan_tag_rewrite (vat_main_t * vam)
             return -99;
         }
     }
-    
+
     if ((sw_if_index_set == 0)||(vtr_op_set == 0)) {
         errmsg ("missing vtr operation or sw_if_index\n");
         return -99;
@@ -8683,7 +8940,7 @@ static int api_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
     while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) {
         if (unformat (line_input, "del"))
             is_add = 0;
-        else if (unformat (line_input, "local %U", 
+        else if (unformat (line_input, "local %U",
                            unformat_ip4_address, &local4))
         {
             local_set = 1;
@@ -8746,7 +9003,7 @@ static int api_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
     }
 
     M(VXLAN_GPE_ADD_DEL_TUNNEL, vxlan_gpe_add_del_tunnel);
-    
+
 
     if (ipv6_set) {
         clib_memcpy(&mp->local, &local6, sizeof(local6));
@@ -8949,12 +9206,12 @@ api_interface_name_renumber (vat_main_t * vam)
     u32 new_show_dev_instance = ~0;
 
     while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) {
-        if (unformat (line_input, "%U", unformat_sw_if_index, vam, 
+        if (unformat (line_input, "%U", unformat_sw_if_index, vam,
                       &sw_if_index))
             ;
         else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
             ;
-        else if (unformat (line_input, "new_show_dev_instance %d", 
+        else if (unformat (line_input, "new_show_dev_instance %d",
                            &new_show_dev_instance))
             ;
         else
@@ -8990,7 +9247,7 @@ api_want_ip4_arp_events (vat_main_t * vam)
     u32 enable_disable = 1;
 
     while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) {
-        if (unformat (line_input, "address %U", 
+        if (unformat (line_input, "address %U",
                       unformat_ip4_address, &address))
             address_set = 1;
         else if (unformat (line_input, "del"))
@@ -8998,18 +9255,18 @@ api_want_ip4_arp_events (vat_main_t * vam)
         else
             break;
     }
-    
+
     if (address_set == 0) {
         errmsg ("missing addresses\n");
         return -99;
     }
-        
+
     M(WANT_IP4_ARP_EVENTS, want_ip4_arp_events);
     mp->enable_disable = enable_disable;
     mp->pid = getpid();
     mp->address = address.as_u32;
 
-    S; W; 
+    S; W;
 }
 
 static int api_input_acl_set_interface (vat_main_t * vam)
@@ -9404,7 +9661,7 @@ api_ipsec_sad_add_del_entry (vat_main_t * vam)
     vl_api_ipsec_sad_add_del_entry_t *mp;
     f64 timeout;
     u32 sad_id, spi;
-    u8 * ck, * ik;
+    u8 * ck = 0, * ik = 0;
     u8 is_add = 1;
 
     u8 protocol = IPSEC_PROTOCOL_AH;
@@ -9516,7 +9773,7 @@ api_ipsec_sa_set_key (vat_main_t * vam)
     vl_api_ipsec_sa_set_key_t *mp;
     f64 timeout;
     u32 sa_id;
-    u8 * ck, * ik;
+    u8 * ck = 0, * ik = 0;
 
     while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
         if (unformat (i, "sa_id %d", &sa_id))
@@ -10108,11 +10365,11 @@ api_get_first_msg_id (vat_main_t * vam)
     unformat_input_t * i = vam->input;
     u8 * name;
     u8 name_set = 0;
-    
+
     while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
         if (unformat (i, "client %s", &name))
             name_set = 1;
-        else 
+        else
             break;
     }
 
@@ -10155,7 +10412,7 @@ static int api_cop_interface_enable_disable (vat_main_t * vam)
         else
             break;
     }
-        
+
     if (sw_if_index == ~0) {
         errmsg ("missing interface name or sw_if_index\n");
         return -99;
@@ -10198,7 +10455,7 @@ static int api_cop_whitelist_enable_disable (vat_main_t * vam)
         else
             break;
     }
-        
+
     if (sw_if_index == ~0) {
         errmsg ("missing interface name or sw_if_index\n");
         return -99;
@@ -10231,6 +10488,14 @@ static int api_get_node_graph (vat_main_t * vam)
     W;
 }
 
+/** Used for transferring locators via VPP API */
+typedef CLIB_PACKED(struct
+{
+    u32 sw_if_index; /**< locator sw_if_index */
+    u8 priority; /**< locator priority */
+    u8 weight;   /**< locator weight */
+}) ls_locator_t;
+
 static int
 api_lisp_add_del_locator_set(vat_main_t * vam)
 {
@@ -10240,6 +10505,8 @@ api_lisp_add_del_locator_set(vat_main_t * vam)
     u8  is_add = 1;
     u8 *locator_set_name = NULL;
     u8  locator_set_name_set = 0;
+    ls_locator_t locator, * locators = 0;
+    u32 sw_if_index, priority, weight;
 
     /* Parse args required to build the message */
     while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
@@ -10247,18 +10514,32 @@ api_lisp_add_del_locator_set(vat_main_t * vam)
             is_add = 0;
         } else if (unformat(input, "locator-set %s", &locator_set_name)) {
             locator_set_name_set = 1;
+        } else if (unformat(input, "sw_if_index %u p %u w %u",
+                            &sw_if_index, &priority, &weight)) {
+            locator.sw_if_index = htonl(sw_if_index);
+            locator.priority = priority;
+            locator.weight = weight;
+            vec_add1(locators, locator);
+        } else if (unformat(input, "iface %U p %u w %u", unformat_sw_if_index,
+                            vam, &sw_if_index, &priority, &weight)) {
+            locator.sw_if_index = htonl(sw_if_index);
+            locator.priority = priority;
+            locator.weight = weight;
+            vec_add1(locators, locator);
         } else
             break;
     }
 
     if (locator_set_name_set == 0) {
         errmsg ("missing locator-set name");
+        vec_free(locators);
         return -99;
     }
 
     if (vec_len(locator_set_name) > 64) {
         errmsg ("locator-set name too long\n");
         vec_free(locator_set_name);
+        vec_free(locators);
         return -99;
     }
     vec_add1(locator_set_name, 0);
@@ -10271,6 +10552,11 @@ api_lisp_add_del_locator_set(vat_main_t * vam)
            vec_len(locator_set_name));
     vec_free(locator_set_name);
 
+    mp->locator_num = vec_len (locators);
+    clib_memcpy (mp->locators, locators,
+                 (sizeof (ls_locator_t) * vec_len (locators)));
+    vec_free (locators);
+
     /* send it... */
     S;
 
@@ -10400,7 +10686,7 @@ api_lisp_add_del_local_eid(vat_main_t * vam)
     while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
         if (unformat(input, "del")) {
             is_add = 0;
-        } else if (unformat(input, "vni &d", &vni)) {
+        } else if (unformat(input, "vni %d", &vni)) {
             ;
         } else if (unformat(input, "eid %U/%d", unformat_ip4_address,
             &eidv4, &tmp_eid_lenght)) {
@@ -10797,6 +11083,28 @@ api_lisp_pitr_set_locator_set (vat_main_t * vam)
   return 0;
 }
 
+static int
+api_show_lisp_pitr (vat_main_t * vam)
+{
+    vl_api_show_lisp_pitr_t *mp;
+    f64 timeout = ~0;
+
+    if (!vam->json_output) {
+        fformat(vam->ofp, "%=20s\n",
+                "lisp status:");
+    }
+
+    M(SHOW_LISP_PITR, show_lisp_pitr);
+    /* send it... */
+    S;
+
+    /* Wait for a reply... */
+    W;
+
+    /* NOTREACHED */
+    return 0;
+}
+
 /**
  * Add/delete mapping between vni and vrf
  */
@@ -11394,8 +11702,8 @@ api_lisp_enable_disable_status_dump(vat_main_t *vam)
     f64 timeout = ~0;
 
     if (!vam->json_output) {
-        fformat(vam->ofp, "%=20s\n",
-                "lisp status:");
+        fformat(vam->ofp, "%-20s%-16s\n",
+                "lisp status", "locator-set");
     }
 
     M(LISP_ENABLE_DISABLE_STATUS_DUMP,
@@ -11530,6 +11838,7 @@ api_policer_add_del (vat_main_t * vam)
     u8 rate_type = 0;
     u8 round_type = 0;
     u8 type = 0;
+    u8 color_aware = 0;
     sse2_qos_pol_action_params_st conform_action, exceed_action, violate_action;
 
     while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
@@ -11562,6 +11871,8 @@ api_policer_add_del (vat_main_t * vam)
         else if (unformat (i, "violate_action %U", unformat_policer_action_type,
                            &violate_action))
             ;
+        else if (unformat (i, "color-aware"))
+            color_aware = 1;
         else
           break;
     }
@@ -11594,6 +11905,7 @@ api_policer_add_del (vat_main_t * vam)
     mp->exceed_dscp = exceed_action.dscp;
     mp->violate_action_type = violate_action.action_type;
     mp->violate_dscp = violate_action.dscp;
+    mp->color_aware = color_aware;
 
     S; W;
     /* NOTREACHED */
@@ -11637,6 +11949,93 @@ api_policer_dump(vat_main_t *vam)
     return 0;
 }
 
+static int
+api_policer_classify_set_interface (vat_main_t * vam)
+{
+    unformat_input_t * i = vam->input;
+    vl_api_policer_classify_set_interface_t *mp;
+    f64 timeout;
+    u32 sw_if_index;
+    int sw_if_index_set;
+    u32 ip4_table_index = ~0;
+    u32 ip6_table_index = ~0;
+    u32 l2_table_index = ~0;
+    u8 is_add = 1;
+
+    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, "del"))
+            is_add = 0;
+       else if (unformat (i, "ip4-table %d", &ip4_table_index))
+           ;
+       else if (unformat (i, "ip6-table %d", &ip6_table_index))
+           ;
+       else if (unformat (i, "l2-table %d", &l2_table_index))
+           ;
+        else {
+            clib_warning ("parse error '%U'", format_unformat_error, i);
+            return -99;
+        }
+    }
+
+    if (sw_if_index_set == 0) {
+        errmsg ("missing interface name or sw_if_index\n");
+        return -99;
+    }
+
+    M(POLICER_CLASSIFY_SET_INTERFACE, policer_classify_set_interface);
+
+    mp->sw_if_index = ntohl(sw_if_index);
+    mp->ip4_table_index = ntohl(ip4_table_index);
+    mp->ip6_table_index = ntohl(ip6_table_index);
+    mp->l2_table_index = ntohl(l2_table_index);
+    mp->is_add = is_add;
+
+    S; W;
+    /* NOTREACHED */
+    return 0;
+}
+
+static int
+api_policer_classify_dump(vat_main_t *vam)
+{
+    unformat_input_t * i = vam->input;
+    vl_api_policer_classify_dump_t *mp;
+    f64 timeout = ~0;
+    u8 type = POLICER_CLASSIFY_N_TABLES;
+
+    if (unformat (i, "type %U", unformat_classify_table_type, &type))
+        ;
+    else {
+        errmsg ("classify table type must be specified\n");
+        return -99;
+    }
+
+    if (!vam->json_output) {
+        fformat(vam->ofp, "%10s%20s\n", "Intfc idx", "Classify table");
+    }
+
+    M(POLICER_CLASSIFY_DUMP, policer_classify_dump);
+    mp->type = type;
+    /* 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)
 {
@@ -12189,6 +12588,127 @@ int api_ipfix_dump (vat_main_t *vam)
     return 0;
 }
 
+int api_pg_create_interface (vat_main_t *vam)
+{
+    unformat_input_t * input = vam->input;
+    vl_api_pg_create_interface_t *mp;
+    f64 timeout;
+
+    u32 if_id = ~0;
+    while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
+        if (unformat (input, "if_id %d", &if_id))
+            ;
+        else
+            break;
+    }
+    if (if_id == ~0) {
+        errmsg ("missing pg interface index\n");
+        return -99;
+    }
+
+    /* Construct the API message */
+    M(PG_CREATE_INTERFACE, pg_create_interface);
+    mp->context = 0;
+    mp->interface_id = ntohl(if_id);
+
+    S; W;
+    /* NOTREACHED */
+    return 0;
+}
+
+int api_pg_capture (vat_main_t *vam)
+{
+    unformat_input_t * input = vam->input;
+    vl_api_pg_capture_t *mp;
+    f64 timeout;
+
+    u32 if_id = ~0;
+    u8 enable = 1;
+    u32 count = 1;
+    u8 pcap_file_set = 0;
+    u8 * pcap_file = 0;
+    while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
+        if (unformat (input, "if_id %d", &if_id))
+            ;
+        else if (unformat (input, "pcap %s", &pcap_file))
+            pcap_file_set = 1;
+        else if (unformat (input, "count %d", &count))
+            ;
+        else if (unformat (input, "disable"))
+            enable = 0;
+        else
+            break;
+    }
+    if (if_id == ~0) {
+        errmsg ("missing pg interface index\n");
+        return -99;
+    }
+    if (pcap_file_set>0) {
+       if (vec_len (pcap_file) > 255) {
+           errmsg ("pcap file name is too long\n");
+           return -99;
+       }
+    }
+
+    u32 name_len = vec_len(pcap_file);
+    /* Construct the API message */
+    M(PG_CAPTURE, pg_capture);
+    mp->context = 0;
+    mp->interface_id = ntohl(if_id);
+    mp->is_enabled = enable;
+    mp->count = ntohl(count);
+    mp->pcap_name_length = ntohl(name_len);
+    if (pcap_file_set != 0) {
+        clib_memcpy(mp->pcap_file_name, pcap_file, name_len);
+    }
+    vec_free(pcap_file);
+
+    S; W;
+    /* NOTREACHED */
+    return 0;
+}
+
+int api_pg_enable_disable (vat_main_t *vam)
+{
+    unformat_input_t * input = vam->input;
+    vl_api_pg_enable_disable_t *mp;
+    f64 timeout;
+
+    u8 enable = 1;
+    u8 stream_name_set = 0;
+    u8 * stream_name = 0;
+    while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
+        if (unformat (input, "stream %s", &stream_name))
+            stream_name_set = 1;
+       else if (unformat (input, "disable"))
+            enable = 0;
+        else
+            break;
+    }
+
+    if (stream_name_set>0) {
+       if (vec_len (stream_name) > 255) {
+            errmsg ("stream name too long\n");
+            return -99;
+       }
+    }
+
+    u32 name_len = vec_len(stream_name);
+    /* Construct the API message */
+    M(PG_ENABLE_DISABLE, pg_enable_disable);
+    mp->context = 0;
+    mp->is_enabled = enable;
+    if (stream_name_set != 0) {
+        mp->stream_name_length = ntohl(name_len);
+        clib_memcpy(mp->stream_name, stream_name, name_len);
+    }
+    vec_free(stream_name);
+
+    S; W;
+    /* NOTREACHED */
+    return 0;
+}
+
 static int q_or_quit (vat_main_t * vam)
 {
     longjmp (vam->jump_buf, 1);
@@ -12234,7 +12754,7 @@ static int help (vat_main_t * vam)
 
     fformat(vam->ofp, "Help is available for the following:\n");
 
-    hash_foreach_pair (p, vam->function_by_name, 
+    hash_foreach_pair (p, vam->function_by_name,
     ({
         vec_add1 (cmds, (u8 *)(p->key));
     }));
@@ -12262,7 +12782,7 @@ static int set (vat_main_t * vam)
             value[vec_len(value)-1] = 0;
         /* Make sure it's a proper string, one way or the other */
         vec_add1 (value, 0);
-        (void) clib_macro_set_value (&vam->macro_main, 
+        (void) clib_macro_set_value (&vam->macro_main,
                                      (char *)name, (char *)value);
     }
     else
@@ -12300,17 +12820,17 @@ static int macro_sort_cmp (void * a1, void * a2)
 
 static int dump_macro_table (vat_main_t * vam)
 {
-    macro_sort_t * sort_me = 0, * sm;    
+    macro_sort_t * sort_me = 0, * sm;
     int i;
     hash_pair_t * p;
 
-    hash_foreach_pair (p, vam->macro_main.the_value_table_hash, 
+    hash_foreach_pair (p, vam->macro_main.the_value_table_hash,
     ({
         vec_add2 (sort_me, sm, 1);
         sm->name = (u8 *)(p->key);
         sm->value = (u8 *) (p->value[0]);
     }));
-    
+
     vec_sort_with_function (sort_me, macro_sort_cmp);
 
     if (vec_len(sort_me))
@@ -12377,19 +12897,19 @@ static int search_node_table (vat_main_t * vam)
                 }
             }
         }
-            
+
         else {
-            clib_warning ("parse error '%U'", format_unformat_error, 
+            clib_warning ("parse error '%U'", format_unformat_error,
                           line_input);
             return -99;
         }
 
     out:
         vec_free(node_to_find);
-        
+
     }
 
-    return 0;        
+    return 0;
 }
 
 
@@ -12553,8 +13073,9 @@ _(classify_add_del_table,                                               \
   "[del] mask <mask-value>\n"                                          \
   " [l2-miss-next | miss-next | acl-miss-next] <name|nn>")             \
 _(classify_add_del_session,                                             \
-  "[hit-next|l2-hit-next|acl-hit-next] <name|nn> table-index <nn>\n"    \
-  "skip_n <nn> match_n <nn> match [hex] [l2] [l3 [ip4|ip6]]")          \
+  "[hit-next|l2-hit-next|acl-hit-next|policer-hit-next] <name|nn>\n"    \
+  "  table-index <nn> skip_n <nn> match_n <nn> match [hex] [l2]\n"      \
+  "  [l3 [ip4|ip6]]")                                                  \
 _(classify_set_interface_ip_table,                                      \
   "<intfc> | sw_if_index <nn> table <nn>")                             \
 _(classify_set_interface_l2_tables,                                     \
@@ -12655,7 +13176,9 @@ _(trace_profile_add, "id <nn> trace-type <0x1f|0x3|0x9|0x11|0x19> "     \
 _(trace_profile_apply, "id <nn> <ip6-address>/<width>"                  \
   " vrf_id <nn>  add | pop | none")                                     \
 _(trace_profile_del, "")                                                \
-_(lisp_add_del_locator_set, "locator-set <locator_name> [del]")         \
+_(lisp_add_del_locator_set, "locator-set <locator_name> [iface <intf> |"\
+                            " sw_if_index <sw_if_index> p <priority> "  \
+                            "w <weight>] [del]")                        \
 _(lisp_add_del_locator, "locator-set <locator_name> "                   \
                         "iface <intf> | sw_if_index <sw_if_index> "     \
                         "p <priority> w <weight> [del]")                \
@@ -12684,10 +13207,15 @@ _(lisp_gpe_tunnel_dump, "")                                             \
 _(lisp_map_resolver_dump, "")                                           \
 _(lisp_enable_disable_status_dump, "")                                  \
 _(lisp_get_map_request_itr_rlocs, "")                                   \
+_(show_lisp_pitr, "")                                                   \
 _(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>]")                                \
+_(policer_classify_set_interface,                                       \
+  "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n"      \
+  "  [l2-table <nn>] [del]")                                            \
+_(policer_classify_dump, "type [ip4|ip6|l2]")                           \
 _(netmap_create, "name <interface name> [hw-addr <mac>] [pipe] "        \
     "[master|slave]")                                                   \
 _(netmap_delete, "name <interface name>")                               \
@@ -12702,7 +13230,11 @@ _(classify_session_dump, "table_id <nn>")                               \
 _(ipfix_enable, "collector_address <ip4> [collector_port <nn>] "        \
                 "src_address <ip4> [fib_id <nn>] [path_mtu <nn>] "      \
                 "[template_interval <nn>]")                             \
-_(ipfix_dump, "")
+_(ipfix_dump, "")                                                       \
+_(get_next_index, "node-name <node-name> next-node-name <node-name>")   \
+_(pg_create_interface, "if_id <nn>")                                    \
+_(pg_capture, "if_id <nnn> pcap <file_name> count <nnn> [disable]")     \
+_(pg_enable_disable, "[stream <id>] disable")
 
 /* List of command functions, CLI names map directly to functions */
 #define foreach_cli_function                                    \
@@ -12746,19 +13278,19 @@ void vat_api_hookup (vat_main_t *vam)
                            vl_noop_handler,                     \
                            vl_api_##n##_t_endian,               \
                            vl_api_##n##_t_print,                \
-                           sizeof(vl_api_##n##_t), 1); 
+                           sizeof(vl_api_##n##_t), 1);
     foreach_vpe_api_reply_msg;
 #undef _
 
     vl_msg_api_set_first_available_msg_id (VL_MSG_FIRST_AVAILABLE);
 
-    vam->sw_if_index_by_interface_name = 
+    vam->sw_if_index_by_interface_name =
         hash_create_string (0, sizeof (uword));
 
-    vam->function_by_name = 
+    vam->function_by_name =
         hash_create_string (0, sizeof(uword));
 
-    vam->help_by_name = 
+    vam->help_by_name =
         hash_create_string (0, sizeof(uword));
 
     /* API messages we can send */
@@ -12787,9 +13319,9 @@ void vat_api_hookup (vat_main_t *vam)
 #include <vpp-api/vpe.api.h>
 #undef vl_api_version
 
-void vl_client_add_api_signatures (vl_api_memclnt_create_t *mp) 
+void vl_client_add_api_signatures (vl_api_memclnt_create_t *mp)
 {
-    /* 
+    /*
      * Send the main API signature in slot 0. This bit of code must
      * match the checks in ../vpe/api/api.c: vl_msg_api_version_check().
      */