Add API calls for packet generator
[vpp.git] / vpp-api-test / vat / api_format.c
index 4c96cc1..0ab9b07 100644 (file)
@@ -49,6 +49,8 @@
 
 #include "vat/json_format.h"
 
+#include <sys/stat.h>
+
 #define vl_typedefs             /* define message structures */
 #include <vpp-api/vpe_all_api_h.h> 
 #undef vl_typedefs
@@ -923,6 +925,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)
 {
@@ -2330,6 +2364,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);
@@ -2708,13 +2783,41 @@ 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;
+}
+
 #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
  *
@@ -2809,7 +2912,9 @@ _(af_packet_delete_reply)                               \
 _(policer_add_del_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          \
@@ -2998,6 +3103,7 @@ _(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)                         \
@@ -3013,7 +3119,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 */
 
@@ -7661,6 +7771,49 @@ static int api_get_node_index (vat_main_t * vam)
     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;
+}
+
 static int api_add_node_next (vat_main_t * vam)
 {
     unformat_input_t * i = vam->input;
@@ -10797,6 +10950,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 +11569,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,
@@ -12189,6 +12364,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);
@@ -12684,6 +12980,7 @@ _(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]")                \
@@ -12702,7 +12999,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                                    \