Add in-message cli_request/cli_reply API
[vpp.git] / vpp-api-test / vat / api_format.c
index 7369714..b9cfd75 100644 (file)
@@ -893,6 +893,34 @@ vl_api_cli_reply_t_handler_json (vl_api_cli_reply_t * mp)
   vam->result_ready = 1;
 }
 
+static void
+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);
+
+  vam->retval = retval;
+  vam->cmd_reply = mp->reply;
+  vam->result_ready = 1;
+}
+
+static void
+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;
+
+  vat_json_init_object (&node);
+  vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
+  vat_json_object_add_string_copy (&node, "reply", mp->reply);
+
+  vat_json_print (vam->ofp, &node);
+  vat_json_free (&node);
+
+  vam->retval = ntohl (mp->retval);
+  vam->result_ready = 1;
+}
+
 static void vl_api_classify_add_del_table_reply_t_handler
   (vl_api_classify_add_del_table_reply_t * mp)
 {
@@ -1134,6 +1162,21 @@ vl_api_ip4_arp_event_t_handler_json (vl_api_ip4_arp_event_t * mp)
   /* JSON output not supported */
 }
 
+static void
+vl_api_ip6_nd_event_t_handler (vl_api_ip6_nd_event_t * mp)
+{
+  vat_main_t *vam = &vat_main;
+  errmsg ("ip6 nd event: address %U new mac %U sw_if_index %d\n",
+         format_ip6_address, mp->address,
+         format_ethernet_address, mp->new_mac, mp->sw_if_index);
+}
+
+static void
+vl_api_ip6_nd_event_t_handler_json (vl_api_ip6_nd_event_t * mp)
+{
+  /* JSON output not supported */
+}
+
 /*
  * Special-case: build the bridge domain table, maintain
  * the next bd id vbl.
@@ -2361,40 +2404,37 @@ static void
 }
 
 static void
-vl_api_lisp_eid_table_details_t_handler (vl_api_lisp_eid_table_details_t * mp)
+add_lisp_eid_table_entry (vat_main_t * vam,
+                         vl_api_lisp_eid_table_details_t * mp)
 {
-  vat_main_t *vam = &vat_main;
   eid_table_t eid_table;
 
   memset (&eid_table, 0, sizeof (eid_table));
   eid_table.is_local = mp->is_local;
-  eid_table.locator_set_index = mp->locator_set_index;
+  eid_table.locator_set_index = clib_net_to_host_u32 (mp->locator_set_index);
   eid_table.eid_type = mp->eid_type;
-  eid_table.vni = mp->vni;
+  eid_table.vni = clib_net_to_host_u32 (mp->vni);
   eid_table.eid_prefix_len = mp->eid_prefix_len;
-  eid_table.ttl = mp->ttl;
+  eid_table.ttl = clib_net_to_host_u32 (mp->ttl);
+  eid_table.action = mp->action;
   eid_table.authoritative = mp->authoritative;
   clib_memcpy (eid_table.eid, mp->eid, sizeof (eid_table.eid));
   vec_add1 (vam->eid_tables, eid_table);
 }
 
+static void
+vl_api_lisp_eid_table_details_t_handler (vl_api_lisp_eid_table_details_t * mp)
+{
+  vat_main_t *vam = &vat_main;
+  add_lisp_eid_table_entry (vam, mp);
+}
+
 static void
 vl_api_lisp_eid_table_details_t_handler_json (vl_api_lisp_eid_table_details_t
                                              * mp)
 {
   vat_main_t *vam = &vat_main;
-  eid_table_t eid_table;
-
-  memset (&eid_table, 0, sizeof (eid_table));
-  eid_table.is_local = mp->is_local;
-  eid_table.locator_set_index = mp->locator_set_index;
-  eid_table.eid_type = mp->eid_type;
-  eid_table.vni = mp->vni;
-  eid_table.eid_prefix_len = mp->eid_prefix_len;
-  eid_table.ttl = mp->ttl;
-  eid_table.authoritative = mp->authoritative;
-  clib_memcpy (eid_table.eid, mp->eid, sizeof (eid_table.eid));
-  vec_add1 (vam->eid_tables, eid_table);
+  add_lisp_eid_table_entry (vam, mp);
 }
 
 static void
@@ -3344,6 +3384,7 @@ _(l2_interface_vlan_tag_rewrite_reply)                  \
 _(modify_vhost_user_if_reply)                           \
 _(delete_vhost_user_if_reply)                           \
 _(want_ip4_arp_events_reply)                            \
+_(want_ip6_nd_events_reply)                             \
 _(input_acl_set_interface_reply)                        \
 _(ipsec_spd_add_del_reply)                              \
 _(ipsec_interface_add_del_spd_reply)                    \
@@ -3388,7 +3429,8 @@ _(ipfix_enable_reply)                                   \
 _(pg_capture_reply)                                     \
 _(pg_enable_disable_reply)                              \
 _(ip_source_and_port_range_check_add_del_reply)         \
-_(ip_source_and_port_range_check_interface_add_del_reply)
+_(ip_source_and_port_range_check_interface_add_del_reply)\
+_(delete_subif_reply)
 
 #define _(n)                                    \
     static void vl_api_##n##_t_handler          \
@@ -3434,6 +3476,7 @@ _(SW_INTERFACE_SET_FLAGS_REPLY, sw_interface_set_flags_reply)           \
 _(CONTROL_PING_REPLY, control_ping_reply)                               \
 _(NOPRINT_CONTROL_PING_REPLY, noprint_control_ping_reply)               \
 _(CLI_REPLY, cli_reply)                                                 \
+_(CLI_INBAND_REPLY, cli_inband_reply)                                   \
 _(SW_INTERFACE_ADD_DEL_ADDRESS_REPLY,                                   \
   sw_interface_add_del_address_reply)                                   \
 _(SW_INTERFACE_SET_TABLE_REPLY, sw_interface_set_table_reply)          \
@@ -3521,6 +3564,8 @@ _(VXLAN_GPE_TUNNEL_DETAILS, vxlan_gpe_tunnel_details)                   \
 _(INTERFACE_NAME_RENUMBER_REPLY, interface_name_renumber_reply)                \
 _(WANT_IP4_ARP_EVENTS_REPLY, want_ip4_arp_events_reply)                        \
 _(IP4_ARP_EVENT, ip4_arp_event)                                         \
+_(WANT_IP6_ND_EVENTS_REPLY, want_ip6_nd_events_reply)                  \
+_(IP6_ND_EVENT, ip6_nd_event)                                          \
 _(INPUT_ACL_SET_INTERFACE_REPLY, input_acl_set_interface_reply)         \
 _(IP_ADDRESS_DETAILS, ip_address_details)                               \
 _(IP_DETAILS, ip_details)                                               \
@@ -3607,7 +3652,8 @@ _(IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL_REPLY,                         \
 _(IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL_REPLY,               \
  ip_source_and_port_range_check_interface_add_del_reply)                \
 _(IPSEC_GRE_ADD_DEL_TUNNEL_REPLY, ipsec_gre_add_del_tunnel_reply)       \
-_(IPSEC_GRE_TUNNEL_DETAILS, ipsec_gre_tunnel_details)
+_(IPSEC_GRE_TUNNEL_DETAILS, ipsec_gre_tunnel_details)                   \
+_(DELETE_SUBIF_REPLY, delete_subif_reply)
 
 /* M: construct, but don't yet send a message */
 
@@ -4070,6 +4116,45 @@ exec (vat_main_t * vam)
   return -99;
 }
 
+/*
+ * Future replacement of exec() that passes CLI buffers directly in
+ * the API messages instead of an additional shared memory area.
+ */
+static int
+exec_inband (vat_main_t * vam)
+{
+  vl_api_cli_inband_t *mp;
+  f64 timeout;
+  unformat_input_t *i = vam->input;
+
+  if (vec_len (i->buffer) == 0)
+    return -1;
+
+  if (vam->exec_mode == 0 && unformat (i, "mode"))
+    {
+      vam->exec_mode = 1;
+      return 0;
+    }
+  if (vam->exec_mode == 1 && (unformat (i, "exit") || unformat (i, "quit")))
+    {
+      vam->exec_mode = 0;
+      return 0;
+    }
+
+  /*
+   * In order for the CLI command to work, it
+   * 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, cli_inband, len);
+  clib_memcpy (mp->cmd, vam->input->buffer, len);
+  mp->length = htonl (len);
+
+  S;
+  W2 (fformat (vam->ofp, "%s", vam->cmd_reply));
+}
+
 static int
 api_create_loopback (vat_main_t * vam)
 {
@@ -7838,7 +7923,7 @@ unformat_l2_next_index (unformat_input_t * input, va_list * args)
   u32 tmp;
 
 #define _(n,N) \
-  if (unformat (input, #n)) { next_index = L2_CLASSIFY_NEXT_##N; goto out;}
+  if (unformat (input, #n)) { next_index = L2_INPUT_CLASSIFY_NEXT_##N; goto out;}
   foreach_l2_next;
 #undef _
 
@@ -8553,6 +8638,7 @@ api_classify_set_interface_l2_tables (vat_main_t * vam)
   u32 ip4_table_index = ~0;
   u32 ip6_table_index = ~0;
   u32 other_table_index = ~0;
+  u32 is_input = 1;
 
   while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
     {
@@ -8566,6 +8652,8 @@ api_classify_set_interface_l2_tables (vat_main_t * vam)
        ;
       else if (unformat (i, "other-table %d", &other_table_index))
        ;
+      else if (unformat (i, "is-input %d", &is_input))
+       ;
       else
        {
          clib_warning ("parse error '%U'", format_unformat_error, i);
@@ -8586,7 +8674,7 @@ api_classify_set_interface_l2_tables (vat_main_t * vam)
   mp->ip4_table_index = ntohl (ip4_table_index);
   mp->ip6_table_index = ntohl (ip6_table_index);
   mp->other_table_index = ntohl (other_table_index);
-
+  mp->is_input = (u8) is_input;
 
   S;
   W;
@@ -10213,6 +10301,41 @@ api_want_ip4_arp_events (vat_main_t * vam)
   W;
 }
 
+static int
+api_want_ip6_nd_events (vat_main_t * vam)
+{
+  unformat_input_t *line_input = vam->input;
+  vl_api_want_ip6_nd_events_t *mp;
+  f64 timeout;
+  ip6_address_t address;
+  int address_set = 0;
+  u32 enable_disable = 1;
+
+  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (line_input, "address %U", unformat_ip6_address, &address))
+       address_set = 1;
+      else if (unformat (line_input, "del"))
+       enable_disable = 0;
+      else
+       break;
+    }
+
+  if (address_set == 0)
+    {
+      errmsg ("missing addresses\n");
+      return -99;
+    }
+
+  M (WANT_IP6_ND_EVENTS, want_ip6_nd_events);
+  mp->enable_disable = enable_disable;
+  mp->pid = getpid ();
+  clib_memcpy (mp->address, &address, sizeof (ip6_address_t));
+
+  S;
+  W;
+}
+
 static int
 api_input_acl_set_interface (vat_main_t * vam)
 {
@@ -11714,7 +11837,7 @@ 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);
+  mp->locator_num = clib_host_to_net_u32 (vec_len (locators));
   if (locators)
     clib_memcpy (mp->locators, locators,
                 (sizeof (ls_locator_t) * vec_len (locators)));
@@ -12334,11 +12457,17 @@ api_lisp_eid_table_add_del_map (vat_main_t * vam)
       return -99;
     }
 
+  if (vrf_set && bd_index_set)
+    {
+      errmsg ("error: both vrf and bd entered!");
+      return -99;
+    }
+
   M (LISP_EID_TABLE_ADD_DEL_MAP, lisp_eid_table_add_del_map);
 
   mp->is_add = is_add;
   mp->vni = htonl (vni);
-  mp->dp_table = htonl (vrf);
+  mp->dp_table = vrf_set ? htonl (vrf) : htonl (bd_index);
   mp->is_l2 = bd_index_set;
 
   /* send */
@@ -12458,7 +12587,7 @@ api_lisp_add_del_remote_mapping (vat_main_t * vam)
   mp->eid_type = eid->type;
   lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
 
-  mp->rloc_num = vec_len (rlocs);
+  mp->rloc_num = clib_host_to_net_u32 (vec_len (rlocs));
   clib_memcpy (mp->rlocs, rlocs, (sizeof (rloc_t) * vec_len (rlocs)));
   vec_free (rlocs);
 
@@ -13247,13 +13376,11 @@ format_eid_for_eid_table (vat_main_t * vam, u8 * str, eid_table_t * eid_table,
     case 1:
       format_eid = (eid_table->eid_type ? format_ip6_address :
                    format_ip4_address);
-      str = format (0, "[%d] %U/%d",
-                   clib_net_to_host_u32 (eid_table->vni),
+      str = format (0, "[%d] %U/%d", eid_table->vni,
                    format_eid, eid_table->eid, eid_table->eid_prefix_len);
       break;
     case 2:
-      str = format (0, "[%d] %U",
-                   clib_net_to_host_u32 (eid_table->vni),
+      str = format (0, "[%d] %U", eid_table->vni,
                    format_ethernet_address, eid_table->eid);
       break;
     default:
@@ -13308,6 +13435,11 @@ format_locator_for_eid_table (vat_main_t * vam, u8 * str,
   ASSERT (vam != NULL);
   ASSERT (eid_table != NULL);
 
+  if (~0 == eid_table->locator_set_index)
+    {
+      return format (0, "action: %d\n", eid_table->action);
+    }
+
   vec_foreach (loc, vam->locator_msg)
   {
     if (!first_line)
@@ -13366,13 +13498,17 @@ print_lisp_eid_table_dump (vat_main_t * vam)
 
   vec_foreach (eid_table, vam->eid_tables)
   {
-    ret = lisp_locator_dump_send_msg (vam, eid_table->locator_set_index, 0);
-    if (ret)
+    if (~0 != eid_table->locator_set_index)
       {
-       vec_free (vam->locator_msg);
-       clean_locator_set_message (vam);
-       vec_free (vam->eid_tables);
-       return ret;
+       ret = lisp_locator_dump_send_msg (vam, eid_table->locator_set_index,
+                                         0);
+       if (ret)
+         {
+           vec_free (vam->locator_msg);
+           clean_locator_set_message (vam);
+           vec_free (vam->eid_tables);
+           return ret;
+         }
       }
 
     tmp_str2 = format_eid_for_eid_table (vam, tmp_str2, eid_table, &ret);
@@ -15199,6 +15335,36 @@ api_ipsec_gre_tunnel_dump (vat_main_t * vam)
   W;
 }
 
+static int
+api_delete_subif (vat_main_t * vam)
+{
+  unformat_input_t *i = vam->input;
+  vl_api_delete_subif_t *mp;
+  f64 timeout;
+  u32 sw_if_index = ~0;
+
+  while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (i, "sw_if_index %d", &sw_if_index))
+       ;
+      else
+       break;
+    }
+
+  if (sw_if_index == ~0)
+    {
+      errmsg ("missing sw_if_index\n");
+      return -99;
+    }
+
+  /* Construct the API message */
+  M (DELETE_SUBIF, delete_subif);
+  mp->sw_if_index = ntohl (sw_if_index);
+
+  S;
+  W;
+}
+
 static int
 q_or_quit (vat_main_t * vam)
 {
@@ -15662,6 +15828,7 @@ _(input_acl_set_interface,                                              \
   "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n"      \
   "  [l2-table <nn>] [del]")                                            \
 _(want_ip4_arp_events, "address <ip4-address> [del]")                   \
+_(want_ip6_nd_events, "address <ip6-address> [del]")                    \
 _(ip_address_dump, "(ipv4 | ipv6) (<intfc> | sw_if_index <id>)")        \
 _(ip_dump, "ipv4 | ipv6")                                               \
 _(ipsec_spd_add_del, "spd_id <n> [del]")                                \
@@ -15779,7 +15946,8 @@ _(ip_source_and_port_range_check_interface_add_del,                     \
   "[udp-in-vrf <id>] [udp-out-vrf <id>]")                               \
 _(ipsec_gre_add_del_tunnel,                                             \
   "src <addr> dst <addr> local_sa <sa-id> remote_sa <sa-id> [del]")     \
-_(ipsec_gre_tunnel_dump, "[sw_if_index <nn>]")
+_(ipsec_gre_tunnel_dump, "[sw_if_index <nn>]")                          \
+_(delete_subif,"sub_sw_if_index <nn> sub_if_id <nn>")
 
 /* List of command functions, CLI names map directly to functions */
 #define foreach_cli_function                                    \
@@ -15793,6 +15961,7 @@ _(dump_macro_table, "usage: dump_macro_table ")                 \
 _(dump_node_table, "usage: dump_node_table")                   \
 _(echo, "usage: echo <message>")                               \
 _(exec, "usage: exec <vpe-debug-CLI-command>")                  \
+_(exec_inband, "usage: exec_inband <vpe-debug-CLI-command>")    \
 _(help, "usage: help")                                          \
 _(q, "usage: quit")                                             \
 _(quit, "usage: quit")                                          \