VPP-240: delete subinterface
[vpp.git] / vpp-api-test / vat / api_format.c
index 4ad447c..c1a472a 100644 (file)
@@ -1555,6 +1555,40 @@ static void vl_api_l2tpv3_create_tunnel_reply_t_handler_json
   vam->result_ready = 1;
 }
 
+
+static void vl_api_lisp_add_del_locator_set_reply_t_handler
+  (vl_api_lisp_add_del_locator_set_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;
+    }
+}
+
+static void vl_api_lisp_add_del_locator_set_reply_t_handler_json
+  (vl_api_lisp_add_del_locator_set_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, "locator_set_index", ntohl (mp->ls_index));
+
+  vat_json_print (vam->ofp, &node);
+  vat_json_free (&node);
+
+  vam->retval = ntohl (mp->retval);
+  vam->result_ready = 1;
+}
+
 static void vl_api_vxlan_add_del_tunnel_reply_t_handler
   (vl_api_vxlan_add_del_tunnel_reply_t * mp)
 {
@@ -2327,40 +2361,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
@@ -2371,7 +2402,7 @@ static void
 
   u8 *line = format (0, "%=10d%=10d",
                     clib_net_to_host_u32 (mp->vni),
-                    clib_net_to_host_u32 (mp->vrf));
+                    clib_net_to_host_u32 (mp->dp_table));
   fformat (vam->ofp, "%v\n", line);
   vec_free (line);
 }
@@ -2390,11 +2421,38 @@ static void
     }
   node = vat_json_array_add (&vam->json_tree);
   vat_json_init_object (node);
-  vat_json_object_add_uint (node, "vrf", clib_net_to_host_u32 (mp->vrf));
+  vat_json_object_add_uint (node, "dp_table",
+                           clib_net_to_host_u32 (mp->dp_table));
   vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
 }
 
+static void
+  vl_api_lisp_eid_table_vni_details_t_handler
+  (vl_api_lisp_eid_table_vni_details_t * mp)
+{
+  vat_main_t *vam = &vat_main;
+
+  u8 *line = format (0, "%d", clib_net_to_host_u32 (mp->vni));
+  fformat (vam->ofp, "%v\n", line);
+  vec_free (line);
+}
+
+static void
+  vl_api_lisp_eid_table_vni_details_t_handler_json
+  (vl_api_lisp_eid_table_vni_details_t * mp)
+{
+  vat_main_t *vam = &vat_main;
+  vat_json_node_t *node = NULL;
 
+  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, "vni", clib_net_to_host_u32 (mp->vni));
+}
 
 static u8 *
 format_decap_next (u8 * s, va_list * args)
@@ -3189,6 +3247,39 @@ static void vl_api_policer_classify_details_t_handler_json
   vat_json_object_add_uint (node, "table_index", ntohl (mp->table_index));
 }
 
+static void vl_api_ipsec_gre_add_del_tunnel_reply_t_handler
+  (vl_api_ipsec_gre_add_del_tunnel_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->sw_if_index = ntohl (mp->sw_if_index);
+      vam->result_ready = 1;
+    }
+}
+
+static void vl_api_ipsec_gre_add_del_tunnel_reply_t_handler_json
+  (vl_api_ipsec_gre_add_del_tunnel_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, "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
@@ -3273,7 +3364,6 @@ _(sw_interface_clear_stats_reply)                       \
 _(trace_profile_add_reply)                              \
 _(trace_profile_apply_reply)                            \
 _(trace_profile_del_reply)                              \
-_(lisp_add_del_locator_set_reply)                       \
 _(lisp_add_del_locator_reply)                           \
 _(lisp_add_del_local_eid_reply)                         \
 _(lisp_add_del_remote_mapping_reply)                    \
@@ -3295,7 +3385,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          \
@@ -3478,6 +3569,7 @@ _(LISP_LOCATOR_SET_DETAILS, lisp_locator_set_details)                   \
 _(LISP_LOCATOR_DETAILS, lisp_locator_details)                           \
 _(LISP_EID_TABLE_DETAILS, lisp_eid_table_details)                       \
 _(LISP_EID_TABLE_MAP_DETAILS, lisp_eid_table_map_details)               \
+_(LISP_EID_TABLE_VNI_DETAILS, lisp_eid_table_vni_details)               \
 _(LISP_GPE_TUNNEL_DETAILS, lisp_gpe_tunnel_details)                     \
 _(LISP_MAP_RESOLVER_DETAILS, lisp_map_resolver_details)                 \
 _(SHOW_LISP_STATUS_REPLY, show_lisp_status_reply)                       \
@@ -3511,7 +3603,10 @@ _(PG_ENABLE_DISABLE_REPLY, pg_enable_disable_reply)                     \
 _(IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL_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)
+ 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)                   \
+_(DELETE_SUBIF_REPLY, delete_subif_reply)
 
 /* M: construct, but don't yet send a message */
 
@@ -11095,7 +11190,7 @@ api_map_add_domain (vat_main_t * vam)
     0, psid_length = 0;
   u8 is_translation = 0;
   u32 mtu = 0;
-  u8 ip6_src_len = 128;
+  u32 ip6_src_len = 128;
 
   while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
     {
@@ -11129,7 +11224,7 @@ api_map_add_domain (vat_main_t * vam)
        }
     }
 
-  if (num_m_args != 6)
+  if (num_m_args < 3)
     {
       errmsg ("mandatory argument(s) missing\n");
       return -99;
@@ -11618,7 +11713,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)));
@@ -12238,11 +12333,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 */
@@ -12362,7 +12463,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);
 
@@ -13022,15 +13123,74 @@ api_lisp_locator_set_dump (vat_main_t * vam)
 static int
 api_lisp_eid_table_map_dump (vat_main_t * vam)
 {
+  u8 is_l2 = 0;
+  u8 mode_set = 0;
+  unformat_input_t *input = vam->input;
   vl_api_lisp_eid_table_map_dump_t *mp;
   f64 timeout = ~0;
 
+  /* Parse args required to build the message */
+  while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (input, "l2"))
+       {
+         is_l2 = 1;
+         mode_set = 1;
+       }
+      else if (unformat (input, "l3"))
+       {
+         is_l2 = 0;
+         mode_set = 1;
+       }
+      else
+       {
+         errmsg ("parse error '%U'", format_unformat_error, input);
+         return -99;
+       }
+    }
+
+  if (!mode_set)
+    {
+      errmsg ("expected one of 'l2' or 'l3' parameter!\n");
+      return -99;
+    }
+
   if (!vam->json_output)
     {
-      fformat (vam->ofp, "%=10s%=10s\n", "VNI", "VRF");
+      fformat (vam->ofp, "%=10s%=10s\n", "VNI", is_l2 ? "BD" : "VRF");
     }
 
   M (LISP_EID_TABLE_MAP_DUMP, lisp_eid_table_map_dump);
+  mp->is_l2 = is_l2;
+
+  /* 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_lisp_eid_table_vni_dump (vat_main_t * vam)
+{
+  vl_api_lisp_eid_table_vni_dump_t *mp;
+  f64 timeout = ~0;
+
+  if (!vam->json_output)
+    {
+      fformat (vam->ofp, "VNI\n");
+    }
+
+  M (LISP_EID_TABLE_VNI_DUMP, lisp_eid_table_vni_dump);
 
   /* send it... */
   S;
@@ -13092,13 +13252,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:
@@ -13153,6 +13311,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)
@@ -13211,13 +13374,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);
@@ -14917,6 +15084,163 @@ api_ip_source_and_port_range_check_interface_add_del (vat_main_t * vam)
   W;
 }
 
+static int
+api_ipsec_gre_add_del_tunnel (vat_main_t * vam)
+{
+  unformat_input_t *i = vam->input;
+  vl_api_ipsec_gre_add_del_tunnel_t *mp;
+  f64 timeout;
+  u32 local_sa_id = 0;
+  u32 remote_sa_id = 0;
+  ip4_address_t src_address;
+  ip4_address_t dst_address;
+  u8 is_add = 1;
+
+  while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (i, "local_sa %d", &local_sa_id))
+       ;
+      else if (unformat (i, "remote_sa %d", &remote_sa_id))
+       ;
+      else if (unformat (i, "src %U", unformat_ip4_address, &src_address))
+       ;
+      else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
+       ;
+      else if (unformat (i, "del"))
+       is_add = 0;
+      else
+       {
+         clib_warning ("parse error '%U'", format_unformat_error, i);
+         return -99;
+       }
+    }
+
+  M (IPSEC_GRE_ADD_DEL_TUNNEL, ipsec_gre_add_del_tunnel);
+
+  mp->local_sa_id = ntohl (local_sa_id);
+  mp->remote_sa_id = ntohl (remote_sa_id);
+  clib_memcpy (mp->src_address, &src_address, sizeof (src_address));
+  clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
+  mp->is_add = is_add;
+
+  S;
+  W;
+  /* NOTREACHED */
+  return 0;
+}
+
+static void vl_api_ipsec_gre_tunnel_details_t_handler
+  (vl_api_ipsec_gre_tunnel_details_t * mp)
+{
+  vat_main_t *vam = &vat_main;
+
+  fformat (vam->ofp, "%11d%15U%15U%14d%14d\n",
+          ntohl (mp->sw_if_index),
+          format_ip4_address, &mp->src_address,
+          format_ip4_address, &mp->dst_address,
+          ntohl (mp->local_sa_id), ntohl (mp->remote_sa_id));
+}
+
+static void vl_api_ipsec_gre_tunnel_details_t_handler_json
+  (vl_api_ipsec_gre_tunnel_details_t * mp)
+{
+  vat_main_t *vam = &vat_main;
+  vat_json_node_t *node = NULL;
+  struct in_addr ip4;
+
+  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));
+  clib_memcpy (&ip4, &mp->src_address, sizeof (ip4));
+  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, "local_sa_id", ntohl (mp->local_sa_id));
+  vat_json_object_add_uint (node, "remote_sa_id", ntohl (mp->remote_sa_id));
+}
+
+static int
+api_ipsec_gre_tunnel_dump (vat_main_t * vam)
+{
+  unformat_input_t *i = vam->input;
+  vl_api_ipsec_gre_tunnel_dump_t *mp;
+  f64 timeout;
+  u32 sw_if_index;
+  u8 sw_if_index_set = 0;
+
+  /* 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;
+      else
+       break;
+    }
+
+  if (sw_if_index_set == 0)
+    {
+      sw_if_index = ~0;
+    }
+
+  if (!vam->json_output)
+    {
+      fformat (vam->ofp, "%11s%15s%15s%14s%14s\n",
+              "sw_if_index", "src_address", "dst_address",
+              "local_sa_id", "remote_sa_id");
+    }
+
+  /* Get list of gre-tunnel interfaces */
+  M (IPSEC_GRE_TUNNEL_DUMP, ipsec_gre_tunnel_dump);
+
+  mp->sw_if_index = htonl (sw_if_index);
+
+  S;
+
+  /* Use a control ping for synchronization */
+  {
+    vl_api_control_ping_t *mp;
+    M (CONTROL_PING, control_ping);
+    S;
+  }
+  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)
 {
@@ -15456,7 +15780,8 @@ _(lisp_locator_set_dump, "[locator-set-index <ls-index> | "             \
                          "locator-set <loc-set-name>] [local | remote]")\
 _(lisp_eid_table_dump, "[eid <ipv4|ipv6>/<prefix> | <mac>] [vni] "      \
                        "[local] | [remote]")                            \
-_(lisp_eid_table_map_dump, "")                                          \
+_(lisp_eid_table_vni_dump, "")                                          \
+_(lisp_eid_table_map_dump, "l2|l3")                                     \
 _(lisp_gpe_tunnel_dump, "")                                             \
 _(lisp_map_resolver_dump, "")                                           \
 _(show_lisp_status, "")                                                 \
@@ -15493,7 +15818,11 @@ _(ip_source_and_port_range_check_add_del,                               \
   "<ip-addr>/<mask> range <nn>-<nn> vrf <id>")                          \
 _(ip_source_and_port_range_check_interface_add_del,                     \
   "<intf> | sw_if_index <nn> [tcp-out-vrf <id>] [tcp-in-vrf <id>]"      \
-  "[udp-in-vrf <id>] [udp-out-vrf <id>]")
+  "[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>]")                          \
+_(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                                    \