api: improve api string safety
[vpp.git] / src / vat / api_format.c
index 2f8218e..f85e94a 100644 (file)
@@ -1127,18 +1127,12 @@ vl_api_cli_inband_reply_t_handler (vl_api_cli_inband_reply_t * mp)
 {
   vat_main_t *vam = &vat_main;
   i32 retval = ntohl (mp->retval);
-  u32 length = vl_api_string_len (&mp->reply);
 
   vec_reset_length (vam->cmd_reply);
 
   vam->retval = retval;
   if (retval == 0)
-    {
-      vec_validate (vam->cmd_reply, length);
-      clib_memcpy ((char *) (vam->cmd_reply),
-                  vl_api_from_api_string (&mp->reply), length);
-      vam->cmd_reply[length] = 0;
-    }
+    vam->cmd_reply = vl_api_from_api_to_new_vec (&mp->reply);
   vam->result_ready = 1;
 }
 
@@ -1147,16 +1141,18 @@ vl_api_cli_inband_reply_t_handler_json (vl_api_cli_inband_reply_t * mp)
 {
   vat_main_t *vam = &vat_main;
   vat_json_node_t node;
+  u8 *reply = 0;               /* reply vector */
 
+  reply = vl_api_from_api_to_new_vec (&mp->reply);
   vec_reset_length (vam->cmd_reply);
 
   vat_json_init_object (&node);
   vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
-  vat_json_object_add_string_copy (&node, "reply",
-                                  vl_api_from_api_string (&mp->reply));
+  vat_json_object_add_string_copy (&node, "reply", reply);
 
   vat_json_print (vam->ofp, &node);
   vat_json_free (&node);
+  vec_free (reply);
 
   vam->retval = ntohl (mp->retval);
   vam->result_ready = 1;
@@ -5109,8 +5105,6 @@ _(gpe_add_del_iface_reply)                              \
 _(gpe_add_del_native_fwd_rpath_reply)                   \
 _(af_packet_delete_reply)                               \
 _(policer_classify_set_interface_reply)                 \
-_(netmap_create_reply)                                  \
-_(netmap_delete_reply)                                  \
 _(set_ipfix_exporter_reply)                             \
 _(set_ipfix_classify_stream_reply)                      \
 _(ipfix_classify_table_add_del_reply)                   \
@@ -5386,8 +5380,6 @@ _(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_TUNNEL_DETAILS, mpls_tunnel_details)                             \
 _(MPLS_TABLE_DETAILS, mpls_table_details)                               \
 _(MPLS_ROUTE_DETAILS, mpls_route_details)                               \
@@ -5642,9 +5634,8 @@ exec_inband (vat_main_t * vam)
    * must be a vector ending in \n, not a C-string ending
    * in \n\0.
    */
-  u32 len = vec_len (vam->input->buffer);
-  M2 (CLI_INBAND, mp, len);
-  vl_api_to_api_string (len - 1, (const char *) vam->input->buffer, &mp->cmd);
+  M2 (CLI_INBAND, mp, vec_len (vam->input->buffer));
+  vl_api_vec_to_api_string (vam->input->buffer, &mp->cmd);
 
   S (mp);
   W (ret);
@@ -7276,15 +7267,20 @@ api_tap_create_v2 (vat_main_t * vam)
 {
   unformat_input_t *i = vam->input;
   vl_api_tap_create_v2_t *mp;
-#define TAP_FLAG_GSO (1 << 0)
   u8 mac_address[6];
   u8 random_mac = 1;
   u32 id = ~0;
+  u32 num_rx_queues = 0;
   u8 *host_if_name = 0;
+  u8 host_if_name_set = 0;
   u8 *host_ns = 0;
+  u8 host_ns_set = 0;
   u8 host_mac_addr[6];
   u8 host_mac_addr_set = 0;
   u8 *host_bridge = 0;
+  u8 host_bridge_set = 0;
+  u8 host_ip4_prefix_set = 0;
+  u8 host_ip6_prefix_set = 0;
   ip4_address_t host_ip4_addr;
   ip4_address_t host_ip4_gw;
   u8 host_ip4_gw_set = 0;
@@ -7293,8 +7289,8 @@ api_tap_create_v2 (vat_main_t * vam)
   ip6_address_t host_ip6_gw;
   u8 host_ip6_gw_set = 0;
   u32 host_ip6_prefix_len = 0;
-  u8 host_mtu_set = 0;
   u32 host_mtu_size = 0;
+  u8 host_mtu_set = 0;
   u32 tap_flags = 0;
   int ret;
   u32 rx_ring_sz = 0, tx_ring_sz = 0;
@@ -7304,43 +7300,47 @@ api_tap_create_v2 (vat_main_t * vam)
   /* Parse args required to build the message */
   while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
     {
-      if (unformat (i, "hw-addr %U", unformat_ethernet_address, mac_address))
-       {
-         random_mac = 0;
-       }
-      else if (unformat (i, "id %u", &id))
+      if (unformat (i, "id %u", &id))
        ;
+      else
+       if (unformat
+           (i, "hw-addr %U", unformat_ethernet_address, mac_address))
+       random_mac = 0;
       else if (unformat (i, "host-if-name %s", &host_if_name))
+       host_if_name_set = 1;
+      else if (unformat (i, "num-rx-queues %u", &num_rx_queues))
        ;
       else if (unformat (i, "host-ns %s", &host_ns))
-       ;
+       host_ns_set = 1;
       else if (unformat (i, "host-mac-addr %U", unformat_ethernet_address,
                         host_mac_addr))
        host_mac_addr_set = 1;
       else if (unformat (i, "host-bridge %s", &host_bridge))
-       ;
-      else if (unformat (i, "host-ip4-addr %U/%d", unformat_ip4_address,
+       host_bridge_set = 1;
+      else if (unformat (i, "host-ip4-addr %U/%u", unformat_ip4_address,
                         &host_ip4_addr, &host_ip4_prefix_len))
-       ;
-      else if (unformat (i, "host-ip6-addr %U/%d", unformat_ip6_address,
+       host_ip4_prefix_set = 1;
+      else if (unformat (i, "host-ip6-addr %U/%u", unformat_ip6_address,
                         &host_ip6_addr, &host_ip6_prefix_len))
-       ;
+       host_ip6_prefix_set = 1;
       else if (unformat (i, "host-ip4-gw %U", unformat_ip4_address,
                         &host_ip4_gw))
        host_ip4_gw_set = 1;
       else if (unformat (i, "host-ip6-gw %U", unformat_ip6_address,
                         &host_ip6_gw))
        host_ip6_gw_set = 1;
-      else if (unformat (i, "rx-ring-size %d", &rx_ring_sz))
+      else if (unformat (i, "rx-ring-size %u", &rx_ring_sz))
        ;
-      else if (unformat (i, "tx-ring-size %d", &tx_ring_sz))
+      else if (unformat (i, "tx-ring-size %u", &tx_ring_sz))
        ;
-      else if (unformat (i, "host-mtu-size %d", &host_mtu_size))
+      else if (unformat (i, "host-mtu-size %u", &host_mtu_size))
        host_mtu_set = 1;
       else if (unformat (i, "no-gso"))
        tap_flags &= ~TAP_FLAG_GSO;
       else if (unformat (i, "gso"))
        tap_flags |= TAP_FLAG_GSO;
+      else if (unformat (i, "csum-offload"))
+       tap_flags |= TAP_FLAG_CSUM_OFFLOAD;
       else
        break;
     }
@@ -7399,33 +7399,43 @@ api_tap_create_v2 (vat_main_t * vam)
   /* Construct the API message */
   M (TAP_CREATE_V2, mp);
 
-  mp->use_random_mac = random_mac;
-
   mp->id = ntohl (id);
-  mp->host_namespace_set = host_ns != 0;
-  mp->host_bridge_set = host_bridge != 0;
-  mp->host_ip4_prefix_set = host_ip4_prefix_len != 0;
-  mp->host_ip6_prefix_set = host_ip6_prefix_len != 0;
-  mp->rx_ring_sz = ntohs (rx_ring_sz);
+  mp->use_random_mac = random_mac;
+  mp->num_rx_queues = (u8) num_rx_queues;
   mp->tx_ring_sz = ntohs (tx_ring_sz);
+  mp->rx_ring_sz = ntohs (rx_ring_sz);
   mp->host_mtu_set = host_mtu_set;
   mp->host_mtu_size = ntohl (host_mtu_size);
+  mp->host_mac_addr_set = host_mac_addr_set;
+  mp->host_ip4_prefix_set = host_ip4_prefix_set;
+  mp->host_ip6_prefix_set = host_ip6_prefix_set;
+  mp->host_ip4_gw_set = host_ip4_gw_set;
+  mp->host_ip6_gw_set = host_ip6_gw_set;
   mp->tap_flags = ntohl (tap_flags);
+  mp->host_namespace_set = host_ns_set;
+  mp->host_if_name_set = host_if_name_set;
+  mp->host_bridge_set = host_bridge_set;
 
   if (random_mac == 0)
     clib_memcpy (mp->mac_address, mac_address, 6);
   if (host_mac_addr_set)
     clib_memcpy (mp->host_mac_addr, host_mac_addr, 6);
-  if (host_if_name)
+  if (host_if_name_set)
     clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
-  if (host_ns)
+  if (host_ns_set)
     clib_memcpy (mp->host_namespace, host_ns, vec_len (host_ns));
-  if (host_bridge)
+  if (host_bridge_set)
     clib_memcpy (mp->host_bridge, host_bridge, vec_len (host_bridge));
-  if (host_ip4_prefix_len)
-    clib_memcpy (mp->host_ip4_prefix.address, &host_ip4_addr, 4);
-  if (host_ip6_prefix_len)
-    clib_memcpy (mp->host_ip6_prefix.address, &host_ip6_addr, 16);
+  if (host_ip4_prefix_set)
+    {
+      clib_memcpy (mp->host_ip4_prefix.address, &host_ip4_addr, 4);
+      mp->host_ip4_prefix.len = (u8) host_ip4_prefix_len;
+    }
+  if (host_ip6_prefix_set)
+    {
+      clib_memcpy (mp->host_ip6_prefix.address, &host_ip6_addr, 16);
+      mp->host_ip6_prefix.len = (u8) host_ip6_prefix_len;
+    }
   if (host_ip4_gw_set)
     clib_memcpy (mp->host_ip4_gw, &host_ip4_gw, 4);
   if (host_ip6_gw_set)
@@ -12636,6 +12646,7 @@ api_sw_interface_vhost_user_dump (vat_main_t * vam)
 
   /* Get list of vhost-user interfaces */
   M (SW_INTERFACE_VHOST_USER_DUMP, mp);
+  mp->sw_if_index = ntohl (~0);
   S (mp);
 
   /* Use a control ping for synchronization */
@@ -17513,100 +17524,6 @@ api_policer_classify_dump (vat_main_t * vam)
   return ret;
 }
 
-static int
-api_netmap_create (vat_main_t * vam)
-{
-  unformat_input_t *i = vam->input;
-  vl_api_netmap_create_t *mp;
-  u8 *if_name = 0;
-  u8 hw_addr[6];
-  u8 random_hw_addr = 1;
-  u8 is_pipe = 0;
-  u8 is_master = 0;
-  int ret;
-
-  clib_memset (hw_addr, 0, sizeof (hw_addr));
-
-  while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
-    {
-      if (unformat (i, "name %s", &if_name))
-       vec_add1 (if_name, 0);
-      else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
-       random_hw_addr = 0;
-      else if (unformat (i, "pipe"))
-       is_pipe = 1;
-      else if (unformat (i, "master"))
-       is_master = 1;
-      else if (unformat (i, "slave"))
-       is_master = 0;
-      else
-       break;
-    }
-
-  if (!vec_len (if_name))
-    {
-      errmsg ("interface name must be specified");
-      return -99;
-    }
-
-  if (vec_len (if_name) > 64)
-    {
-      errmsg ("interface name too long");
-      return -99;
-    }
-
-  M (NETMAP_CREATE, mp);
-
-  clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
-  clib_memcpy (mp->hw_addr, hw_addr, 6);
-  mp->use_random_hw_addr = random_hw_addr;
-  mp->is_pipe = is_pipe;
-  mp->is_master = is_master;
-  vec_free (if_name);
-
-  S (mp);
-  W (ret);
-  return ret;
-}
-
-static int
-api_netmap_delete (vat_main_t * vam)
-{
-  unformat_input_t *i = vam->input;
-  vl_api_netmap_delete_t *mp;
-  u8 *if_name = 0;
-  int ret;
-
-  while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
-    {
-      if (unformat (i, "name %s", &if_name))
-       vec_add1 (if_name, 0);
-      else
-       break;
-    }
-
-  if (!vec_len (if_name))
-    {
-      errmsg ("interface name must be specified");
-      return -99;
-    }
-
-  if (vec_len (if_name) > 64)
-    {
-      errmsg ("interface name too long");
-      return -99;
-    }
-
-  M (NETMAP_DELETE, mp);
-
-  clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
-  vec_free (if_name);
-
-  S (mp);
-  W (ret);
-  return ret;
-}
-
 static u8 *
 format_fib_api_path_nh_proto (u8 * s, va_list * args)
 {
@@ -20720,7 +20637,7 @@ _(l2_flags,                                                             \
 _(bridge_flags,                                                         \
   "bd_id <bridge-domain-id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
 _(tap_create_v2,                                                        \
-  "id <num> [hw-addr <mac-addr>] [host-ns <name>] [rx-ring-size <num> [tx-ring-size <num>] [host-mtu-size <mtu>] [gso | no-gso]") \
+  "id <num> [hw-addr <mac-addr>] [host-if-name <name>] [host-ns <name>] [num-rx-queues <num>] [rx-ring-size <num>] [tx-ring-size <num>] [host-bridge <name>] [host-mac-addr <mac-addr>] [host-ip4-addr <ip4addr/mask>] [host-ip6-addr <ip6addr/mask>] [host-mtu-size <mtu>] [gso | no-gso | csum-offload]") \
 _(tap_delete_v2,                                                        \
   "<vpp-if-name> | sw_if_index <id>")                                   \
 _(sw_interface_tap_v2_dump, "")                                         \
@@ -21037,9 +20954,6 @@ _(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>")                               \
 _(mpls_tunnel_dump, "tunnel_index <tunnel-id>")                         \
 _(mpls_table_dump, "")                                                  \
 _(mpls_route_dump, "table-id <ID>")                                     \