ARP proxy dumps
[vpp.git] / src / vat / api_format.c
index ceb074c..c3ba701 100644 (file)
@@ -22,6 +22,7 @@
 #include <vlibapi/api.h>
 #include <vlibmemory/api.h>
 #include <vnet/ip/ip.h>
+#include <vnet/ip/ip_neighbor.h>
 #include <vnet/l2/l2_input.h>
 #include <vnet/l2tp/l2tp.h>
 #include <vnet/vxlan/vxlan.h>
@@ -51,6 +52,7 @@
 #include <vnet/mfib/mfib_types.h>
 #include <vnet/dhcp/dhcp_proxy.h>
 #include <vnet/bonding/node.h>
+#include <vnet/qos/qos_types.h>
 #include "vat/json_format.h"
 
 #include <inttypes.h>
@@ -2410,127 +2412,6 @@ static void vl_api_create_vhost_user_if_reply_t_handler_json
   vam->result_ready = 1;
 }
 
-static clib_error_t *
-receive_fd_msg (int socket_fd, int *my_fd)
-{
-  char msgbuf[16];
-  char ctl[CMSG_SPACE (sizeof (int)) + CMSG_SPACE (sizeof (struct ucred))];
-  struct msghdr mh = { 0 };
-  struct iovec iov[1];
-  ssize_t size;
-  struct ucred *cr = 0;
-  struct cmsghdr *cmsg;
-  pid_t pid __attribute__ ((unused));
-  uid_t uid __attribute__ ((unused));
-  gid_t gid __attribute__ ((unused));
-
-  iov[0].iov_base = msgbuf;
-  iov[0].iov_len = 5;
-  mh.msg_iov = iov;
-  mh.msg_iovlen = 1;
-  mh.msg_control = ctl;
-  mh.msg_controllen = sizeof (ctl);
-
-  memset (ctl, 0, sizeof (ctl));
-
-  /* receive the incoming message */
-  size = recvmsg (socket_fd, &mh, 0);
-  if (size != 5)
-    {
-      return (size == 0) ? clib_error_return (0, "disconnected") :
-       clib_error_return_unix (0, "recvmsg: malformed message (fd %d)",
-                               socket_fd);
-    }
-
-  cmsg = CMSG_FIRSTHDR (&mh);
-  while (cmsg)
-    {
-      if (cmsg->cmsg_level == SOL_SOCKET)
-       {
-         if (cmsg->cmsg_type == SCM_CREDENTIALS)
-           {
-             cr = (struct ucred *) CMSG_DATA (cmsg);
-             uid = cr->uid;
-             gid = cr->gid;
-             pid = cr->pid;
-           }
-         else if (cmsg->cmsg_type == SCM_RIGHTS)
-           {
-             clib_memcpy (my_fd, CMSG_DATA (cmsg), sizeof (int));
-           }
-       }
-      cmsg = CMSG_NXTHDR (&mh, cmsg);
-    }
-  return 0;
-}
-
-static void vl_api_memfd_segment_create_reply_t_handler
-  (vl_api_memfd_segment_create_reply_t * mp)
-{
-  /* Dont bother in the builtin version */
-#if VPP_API_TEST_BUILTIN == 0
-  vat_main_t *vam = &vat_main;
-  api_main_t *am = &api_main;
-  socket_client_main_t *scm = vam->socket_client_main;
-  int my_fd = -1;
-  clib_error_t *error;
-  ssvm_private_t memfd;
-  i32 retval = ntohl (mp->retval);
-
-  if (retval == 0)
-    {
-      error = receive_fd_msg (scm->socket_fd, &my_fd);
-      if (error)
-       {
-         retval = -99;
-         goto out;
-       }
-
-      memset (&memfd, 0, sizeof (memfd));
-      memfd.fd = my_fd;
-
-      vam->client_index_invalid = 1;
-
-      /* Note: this closes memfd.fd */
-      retval = ssvm_slave_init_memfd (&memfd);
-      if (retval)
-       clib_warning ("WARNING: segment map returned %d", retval);
-
-      /* Pivot to the memory client segment that vpp just created */
-
-      am->vlib_rp = (void *) (memfd.requested_va + MMAP_PAGESIZE);
-
-      am->shmem_hdr = (void *) am->vlib_rp->user_ctx;
-
-      vl_client_install_client_message_handlers ();
-
-      vl_client_connect_to_vlib_no_map ("pvt",
-                                       "vpp_api_test(p)",
-                                       32 /* input_queue_length */ );
-      vam->vl_input_queue = am->shmem_hdr->vl_input_queue;
-
-      vl_socket_client_enable_disable (0 /* disable socket */ );
-    }
-
-out:
-  if (vam->async_mode)
-    {
-      vam->async_errors += (retval < 0);
-    }
-  else
-    {
-      vam->retval = retval;
-      vam->result_ready = 1;
-    }
-#endif
-}
-
-static void vl_api_memfd_segment_create_reply_t_handler_json
-  (vl_api_memfd_segment_create_reply_t * mp)
-{
-  clib_warning ("no");
-}
-
 static void vl_api_dns_resolve_name_reply_t_handler
   (vl_api_dns_resolve_name_reply_t * mp)
 {
@@ -5570,6 +5451,7 @@ _(l2_interface_vlan_tag_rewrite_reply)                  \
 _(modify_vhost_user_if_reply)                           \
 _(delete_vhost_user_if_reply)                           \
 _(ip_probe_neighbor_reply)                              \
+_(ip_scan_neighbor_enable_disable_reply)                \
 _(want_ip4_arp_events_reply)                            \
 _(want_ip6_nd_events_reply)                             \
 _(want_l2_macs_events_reply)                            \
@@ -5662,7 +5544,8 @@ _(dns_enable_disable_reply)                             \
 _(dns_name_server_add_del_reply)                       \
 _(session_rule_add_del_reply)                          \
 _(ip_container_proxy_add_del_reply)                     \
-_(output_acl_set_interface_reply)
+_(output_acl_set_interface_reply)                       \
+_(qos_record_enable_disable_reply)
 
 #define _(n)                                    \
     static void vl_api_##n##_t_handler          \
@@ -5816,6 +5699,7 @@ _(VXLAN_GPE_ADD_DEL_TUNNEL_REPLY, vxlan_gpe_add_del_tunnel_reply) \
 _(VXLAN_GPE_TUNNEL_DETAILS, vxlan_gpe_tunnel_details)                   \
 _(INTERFACE_NAME_RENUMBER_REPLY, interface_name_renumber_reply)                \
 _(IP_PROBE_NEIGHBOR_REPLY, ip_probe_neighbor_reply)                    \
+_(IP_SCAN_NEIGHBOR_ENABLE_DISABLE_REPLY, ip_scan_neighbor_enable_disable_reply) \
 _(WANT_IP4_ARP_EVENTS_REPLY, want_ip4_arp_events_reply)                        \
 _(IP4_ARP_EVENT, ip4_arp_event)                                         \
 _(WANT_IP6_ND_EVENTS_REPLY, want_ip6_nd_events_reply)                  \
@@ -5998,6 +5882,7 @@ _(SESSION_RULE_ADD_DEL_REPLY, session_rule_add_del_reply)         \
 _(SESSION_RULES_DETAILS, session_rules_details)                                \
 _(IP_CONTAINER_PROXY_ADD_DEL_REPLY, ip_container_proxy_add_del_reply)  \
 _(OUTPUT_ACL_SET_INTERFACE_REPLY, output_acl_set_interface_reply)       \
+_(QOS_RECORD_ENABLE_DISABLE_REPLY, qos_record_enable_disable_reply)
 
 #define foreach_standalone_reply_msg                                   \
 _(SW_INTERFACE_EVENT, sw_interface_event)                               \
@@ -6006,8 +5891,7 @@ _(VNET_INTERFACE_COMBINED_COUNTERS, vnet_interface_combined_counters)   \
 _(VNET_IP4_FIB_COUNTERS, vnet_ip4_fib_counters)                         \
 _(VNET_IP6_FIB_COUNTERS, vnet_ip6_fib_counters)                         \
 _(VNET_IP4_NBR_COUNTERS, vnet_ip4_nbr_counters)                         \
-_(VNET_IP6_NBR_COUNTERS, vnet_ip6_nbr_counters)                                \
-_(MEMFD_SEGMENT_CREATE_REPLY, memfd_segment_create_reply)               \
+_(VNET_IP6_NBR_COUNTERS, vnet_ip6_nbr_counters)
 
 typedef struct
 {
@@ -6015,7 +5899,6 @@ typedef struct
   u32 value;
 } name_sort_t;
 
-
 #define STR_VTR_OP_CASE(op)     \
     case L2_VTR_ ## op:         \
         return "" # op;
@@ -9404,10 +9287,10 @@ api_proxy_arp_add_del (vat_main_t * vam)
 
   M (PROXY_ARP_ADD_DEL, mp);
 
-  mp->vrf_id = ntohl (vrf_id);
+  mp->proxy.vrf_id = ntohl (vrf_id);
   mp->is_add = is_add;
-  clib_memcpy (mp->low_address, &lo, sizeof (mp->low_address));
-  clib_memcpy (mp->hi_address, &hi, sizeof (mp->hi_address));
+  clib_memcpy (mp->proxy.low_address, &lo, sizeof (mp->proxy.low_address));
+  clib_memcpy (mp->proxy.hi_address, &hi, sizeof (mp->proxy.hi_address));
 
   S (mp);
   W (ret);
@@ -11996,6 +11879,25 @@ unformat_l2_match (unformat_input_t * input, va_list * args)
   *matchp = match;
   return 1;
 }
+
+uword
+unformat_qos_source (unformat_input_t * input, va_list * args)
+{
+  int *qs = va_arg (*args, int *);
+
+  if (unformat (input, "ip"))
+    *qs = QOS_SOURCE_IP;
+  else if (unformat (input, "mpls"))
+    *qs = QOS_SOURCE_MPLS;
+  else if (unformat (input, "ext"))
+    *qs = QOS_SOURCE_EXT;
+  else if (unformat (input, "vlan"))
+    *qs = QOS_SOURCE_VLAN;
+  else
+    return 0;
+
+  return 1;
+}
 #endif
 
 uword
@@ -14516,6 +14418,78 @@ api_ip_probe_neighbor (vat_main_t * vam)
   return ret;
 }
 
+static int
+api_ip_scan_neighbor_enable_disable (vat_main_t * vam)
+{
+  unformat_input_t *i = vam->input;
+  vl_api_ip_scan_neighbor_enable_disable_t *mp;
+  u8 mode = IP_SCAN_V46_NEIGHBORS;
+  u32 interval = 0, time = 0, update = 0, delay = 0, stale = 0;
+  int ret;
+
+  while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (i, "ip4"))
+       mode = IP_SCAN_V4_NEIGHBORS;
+      else if (unformat (i, "ip6"))
+       mode = IP_SCAN_V6_NEIGHBORS;
+      if (unformat (i, "both"))
+       mode = IP_SCAN_V46_NEIGHBORS;
+      else if (unformat (i, "disable"))
+       mode = IP_SCAN_DISABLED;
+      else if (unformat (i, "interval %d", &interval))
+       ;
+      else if (unformat (i, "max-time %d", &time))
+       ;
+      else if (unformat (i, "max-update %d", &update))
+       ;
+      else if (unformat (i, "delay %d", &delay))
+       ;
+      else if (unformat (i, "stale %d", &stale))
+       ;
+      else
+       break;
+    }
+
+  if (interval > 255)
+    {
+      errmsg ("interval cannot exceed 255 minutes.");
+      return -99;
+    }
+  if (time > 255)
+    {
+      errmsg ("max-time cannot exceed 255 usec.");
+      return -99;
+    }
+  if (update > 255)
+    {
+      errmsg ("max-update cannot exceed 255.");
+      return -99;
+    }
+  if (delay > 255)
+    {
+      errmsg ("delay cannot exceed 255 msec.");
+      return -99;
+    }
+  if (stale > 255)
+    {
+      errmsg ("stale cannot exceed 255 minutes.");
+      return -99;
+    }
+
+  M (IP_SCAN_NEIGHBOR_ENABLE_DISABLE, mp);
+  mp->mode = mode;
+  mp->scan_interval = interval;
+  mp->max_proc_time = time;
+  mp->max_update = update;
+  mp->scan_int_delay = delay;
+  mp->stale_threshold = stale;
+
+  S (mp);
+  W (ret);
+  return ret;
+}
+
 static int
 api_want_ip4_arp_events (vat_main_t * vam)
 {
@@ -15146,7 +15120,7 @@ api_ipsec_sad_add_del_entry (vat_main_t * vam)
        if (unformat
            (i, "crypto_alg %U", unformat_ipsec_crypto_alg, &crypto_alg))
        {
-         if (crypto_alg < IPSEC_CRYPTO_ALG_AES_CBC_128 ||
+         if (crypto_alg < IPSEC_CRYPTO_ALG_NONE ||
              crypto_alg >= IPSEC_CRYPTO_N_ALG)
            {
              clib_warning ("unsupported crypto-alg: '%U'",
@@ -15160,7 +15134,7 @@ api_ipsec_sad_add_del_entry (vat_main_t * vam)
        if (unformat
            (i, "integ_alg %U", unformat_ipsec_integ_alg, &integ_alg))
        {
-         if (integ_alg < IPSEC_INTEG_ALG_SHA1_96 ||
+         if (integ_alg < IPSEC_INTEG_ALG_NONE ||
              integ_alg >= IPSEC_INTEG_N_ALG)
            {
              clib_warning ("unsupported integ-alg: '%U'",
@@ -15285,6 +15259,8 @@ api_ipsec_tunnel_if_add_del (vat_main_t * vam)
   u8 is_add = 1;
   u8 esn = 0;
   u8 anti_replay = 0;
+  u8 renumber = 0;
+  u32 instance = ~0;
   int ret;
 
   while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
@@ -15316,7 +15292,7 @@ api_ipsec_tunnel_if_add_del (vat_main_t * vam)
        if (unformat
            (i, "crypto_alg %U", unformat_ipsec_crypto_alg, &crypto_alg))
        {
-         if (crypto_alg < IPSEC_CRYPTO_ALG_AES_CBC_128 ||
+         if (crypto_alg < IPSEC_CRYPTO_ALG_NONE ||
              crypto_alg >= IPSEC_CRYPTO_N_ALG)
            {
              errmsg ("unsupported crypto-alg: '%U'\n",
@@ -15328,7 +15304,7 @@ api_ipsec_tunnel_if_add_del (vat_main_t * vam)
        if (unformat
            (i, "integ_alg %U", unformat_ipsec_integ_alg, &integ_alg))
        {
-         if (integ_alg < IPSEC_INTEG_ALG_SHA1_96 ||
+         if (integ_alg < IPSEC_INTEG_ALG_NONE ||
              integ_alg >= IPSEC_INTEG_N_ALG)
            {
              errmsg ("unsupported integ-alg: '%U'\n",
@@ -15336,6 +15312,8 @@ api_ipsec_tunnel_if_add_del (vat_main_t * vam)
              return -99;
            }
        }
+      else if (unformat (i, "instance %u", &instance))
+       renumber = 1;
       else
        {
          errmsg ("parse error '%U'\n", format_unformat_error, i);
@@ -15394,6 +15372,12 @@ api_ipsec_tunnel_if_add_del (vat_main_t * vam)
       clib_memcpy (mp->remote_integ_key, rik, mp->remote_integ_key_len);
     }
 
+  if (renumber)
+    {
+      mp->renumber = renumber;
+      mp->show_instance = ntohl (instance);
+    }
+
   S (mp);
   W (ret);
   return ret;
@@ -22398,35 +22382,6 @@ api_app_namespace_add_del (vat_main_t * vam)
   return ret;
 }
 
-static int
-api_memfd_segment_create (vat_main_t * vam)
-{
-#if VPP_API_TEST_BUILTIN == 0
-  unformat_input_t *i = vam->input;
-  vl_api_memfd_segment_create_t *mp;
-  u64 size = 64 << 20;
-  int ret;
-
-  while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
-    {
-      if (unformat (i, "size %U", unformat_memory_size, &size))
-       ;
-      else
-       break;
-    }
-
-  M (MEMFD_SEGMENT_CREATE, mp);
-  mp->requested_size = size;
-  S (mp);
-  W (ret);
-  return ret;
-
-#else
-  errmsg ("memfd_segment_create (builtin) not supported");
-  return -99;
-#endif
-}
-
 static int
 api_sock_init_shm (vat_main_t * vam)
 {
@@ -22444,20 +22399,39 @@ api_sock_init_shm (vat_main_t * vam)
        break;
     }
 
-  /* Try customized config to see if it works */
-  vec_validate (config, 3);
+  /*
+   * Canned custom ring allocator config.
+   * Should probably parse all of this
+   */
+  vec_validate (config, 6);
   config[0].type = VL_API_VLIB_RING;
-  config[0].count = 256;
   config[0].size = 256;
-  config[1].type = VL_API_CLIENT_RING;
-  config[1].count = 256;
+  config[0].count = 32;
+
+  config[1].type = VL_API_VLIB_RING;
   config[1].size = 1024;
-  config[2].type = VL_API_CLIENT_RING;
-  config[2].count = 8;
+  config[1].count = 16;
+
+  config[2].type = VL_API_VLIB_RING;
   config[2].size = 4096;
-  config[3].type = VL_API_QUEUE;
-  config[3].count = 256;
-  config[3].size = sizeof (uword);
+  config[2].count = 2;
+
+  config[3].type = VL_API_CLIENT_RING;
+  config[3].size = 256;
+  config[3].count = 32;
+
+  config[4].type = VL_API_CLIENT_RING;
+  config[4].size = 1024;
+  config[4].count = 16;
+
+  config[5].type = VL_API_CLIENT_RING;
+  config[5].size = 4096;
+  config[5].count = 2;
+
+  config[6].type = VL_API_QUEUE;
+  config[6].count = 128;
+  config[6].size = sizeof (uword);
+
   rv = vl_socket_client_init_shm (config);
   if (!rv)
     vam->client_index_invalid = 1;
@@ -22884,6 +22858,55 @@ api_ip_container_proxy_add_del (vat_main_t * vam)
   return ret;
 }
 
+static int
+api_qos_record_enable_disable (vat_main_t * vam)
+{
+  unformat_input_t *i = vam->input;
+  vl_api_qos_record_enable_disable_t *mp;
+  u32 sw_if_index, qs = 0xff;
+  u8 sw_if_index_set = 0;
+  u8 enable = 1;
+  int ret;
+
+  while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
+       sw_if_index_set = 1;
+      else if (unformat (i, "sw_if_index %d", &sw_if_index))
+       sw_if_index_set = 1;
+      else if (unformat (i, "%U", unformat_qos_source, &qs))
+       ;
+      else if (unformat (i, "disable"))
+       enable = 0;
+      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");
+      return -99;
+    }
+  if (qs == 0xff)
+    {
+      errmsg ("input location must be specified");
+      return -99;
+    }
+
+  M (QOS_RECORD_ENABLE_DISABLE, mp);
+
+  mp->sw_if_index = ntohl (sw_if_index);
+  mp->input_source = qs;
+  mp->enable = enable;
+
+  S (mp);
+  W (ret);
+  return ret;
+}
+
 static int
 q_or_quit (vat_main_t * vam)
 {
@@ -23458,6 +23481,8 @@ _(input_acl_set_interface,                                              \
   "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n"      \
   "  [l2-table <nn>] [del]")                                            \
 _(ip_probe_neighbor, "(<intc> | sw_if_index <nn>) address <ip4|ip6-addr>") \
+_(ip_scan_neighbor_enable_disable, "[ip4|ip6|both|disable] [interval <n-min>]\n" \
+  "  [max-time <n-usec>] [max-update <n>] [delay <n-msec>] [stale <n-min>]") \
 _(want_ip4_arp_events, "address <ip4-address> [del]")                   \
 _(want_ip6_nd_events, "address <ip6-address> [del]")                    \
 _(want_l2_macs_events, "[disable] [learn-limit <n>] [scan-delay <n>] [max-entries <n>]") \
@@ -23477,7 +23502,8 @@ _(ipsec_sa_set_key, "sa_id <n> crypto_key <hex> integ_key <hex>")       \
 _(ipsec_tunnel_if_add_del, "local_spi <n> remote_spi <n>\n"             \
   "  crypto_alg <alg> local_crypto_key <hex> remote_crypto_key <hex>\n" \
   "  integ_alg <alg> local_integ_key <hex> remote_integ_key <hex>\n"    \
-  "  local_ip <addr> remote_ip <addr> [esn] [anti_replay] [del]\n")     \
+  "  local_ip <addr> remote_ip <addr> [esn] [anti_replay] [del]\n"      \
+  "  [instance <n>]")     \
 _(ipsec_sa_dump, "[sa_id <n>]")                                         \
 _(ipsec_tunnel_if_set_key, "<intfc> <local|remote> <crypto|integ>\n"    \
   "  <alg> <hex>\n")                                                    \
@@ -23708,7 +23734,6 @@ _(lldp_config, "system-name <name> tx-hold <nn> tx-interval <nn>") \
 _(sw_interface_set_lldp, "<intfc> | sw_if_index <nn> [port-desc <description>]\n" \
   " [mgmt-ip4 <ip4>] [mgmt-ip6 <ip6>] [mgmt-oid <object id>] [disable]") \
 _(tcp_configure_src_addresses, "<ip4|6>first-<ip4|6>last [vrf <id>]")  \
-_(memfd_segment_create,"size <nnn>")                                   \
 _(sock_init_shm, "size <nnn>")                                         \
 _(app_namespace_add_del, "[add] id <ns-id> secret <nn> sw_if_index <nn>")\
 _(dns_enable_disable, "[enable][disable]")                             \
@@ -23724,6 +23749,7 @@ _(ip_container_proxy_add_del, "[add|del] <address> <sw_if_index>")      \
 _(output_acl_set_interface,                                             \
   "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n"      \
   "  [l2-table <nn>] [del]")                                            \
+_(qos_record_enable_disable, "<record-source> <intfc> | sw_if_index <id> [disable]")
 
 /* List of command functions, CLI names map directly to functions */
 #define foreach_cli_function                                    \