LISP EID virtualization support
[vpp.git] / vpp-api-test / vat / api_format.c
index c342bcd..c992d19 100644 (file)
@@ -474,7 +474,23 @@ u8 * format_ip6_address (u8 * s, va_list * args)
 u8 * format_ip46_address (u8 * s, va_list * args)
 {
   ip46_address_t *ip46 = va_arg (*args, ip46_address_t *);
-  return ip46_address_is_ip4(ip46)?
+  ip46_type_t type = va_arg (*args, ip46_type_t);
+  int is_ip4 = 1;
+
+  switch (type)
+    {
+      case IP46_TYPE_ANY:
+       is_ip4 = ip46_address_is_ip4(ip46);
+       break;
+      case IP46_TYPE_IP4:
+       is_ip4 = 1;
+       break;
+      case IP46_TYPE_IP6:
+       is_ip4 = 0;
+       break;
+    }
+
+  return is_ip4 ?
       format(s, "%U", format_ip4_address, &ip46->ip4):
       format(s, "%U", format_ip6_address, &ip46->ip6);
 }
@@ -517,8 +533,9 @@ static void vl_api_create_loopback_reply_t_handler
     i32 retval = ntohl(mp->retval);
 
     vam->retval = retval;
-    vam->result_ready = 1;
     vam->regenerate_interface_table = 1;
+    vam->sw_if_index = ntohl (mp->sw_if_index);
+    vam->result_ready = 1;
 }
 
 static void vl_api_create_loopback_reply_t_handler_json
@@ -531,6 +548,34 @@ static void vl_api_create_loopback_reply_t_handler_json
     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;
+}
+
+static void vl_api_af_packet_create_reply_t_handler 
+(vl_api_af_packet_create_reply_t * mp)
+{
+    vat_main_t * vam = &vat_main;
+    i32 retval = ntohl(mp->retval);
+
+    vam->retval = retval;
+    vam->regenerate_interface_table = 1;
+    vam->sw_if_index = ntohl (mp->sw_if_index);
+    vam->result_ready = 1;
+}
+
+static void vl_api_af_packet_create_reply_t_handler_json
+(vl_api_af_packet_create_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);
 
@@ -545,8 +590,9 @@ static void vl_api_create_vlan_subif_reply_t_handler
     i32 retval = ntohl(mp->retval);
 
     vam->retval = retval;
-    vam->result_ready = 1;
     vam->regenerate_interface_table = 1;
+    vam->sw_if_index = ntohl (mp->sw_if_index);
+    vam->result_ready = 1;
 }
 
 static void vl_api_create_vlan_subif_reply_t_handler_json
@@ -573,8 +619,9 @@ static void vl_api_create_subif_reply_t_handler
     i32 retval = ntohl(mp->retval);
 
     vam->retval = retval;
-    vam->result_ready = 1;
     vam->regenerate_interface_table = 1;
+    vam->sw_if_index = ntohl (mp->sw_if_index);
+    vam->result_ready = 1;
 }
 
 static void vl_api_create_subif_reply_t_handler_json
@@ -601,8 +648,8 @@ static void vl_api_interface_name_renumber_reply_t_handler
     i32 retval = ntohl(mp->retval);
 
     vam->retval = retval;
-    vam->result_ready = 1;
     vam->regenerate_interface_table = 1;
+    vam->result_ready = 1;
 }
 
 static void vl_api_interface_name_renumber_reply_t_handler_json
@@ -768,7 +815,6 @@ static void vl_api_classify_add_del_table_reply_t_handler
         vam->async_errors += (retval < 0);
     } else {
         vam->retval = retval;
-        vam->result_ready = 1;
         if (retval == 0 && 
             ((mp->new_table_index != 0xFFFFFFFF) ||
              (mp->skip_n_vectors != 0xFFFFFFFF) ||
@@ -780,6 +826,7 @@ static void vl_api_classify_add_del_table_reply_t_handler
             errmsg ("new index %d, skip_n_vectors %d, match_n_vectors %d\n",
                     ntohl(mp->new_table_index),
                     ntohl(mp->skip_n_vectors), ntohl(mp->match_n_vectors));
+       vam->result_ready = 1;
     }
 }
 
@@ -811,9 +858,9 @@ static void vl_api_get_node_index_reply_t_handler
         vam->async_errors += (retval < 0);
     } else {
         vam->retval = retval;
-        vam->result_ready = 1;
         if (retval == 0)
             errmsg ("node index %d\n", ntohl(mp->node_index));
+        vam->result_ready = 1;
     }
 }
 
@@ -843,9 +890,9 @@ static void vl_api_add_node_next_reply_t_handler
         vam->async_errors += (retval < 0);
     } else {
         vam->retval = retval;
-        vam->result_ready = 1;
         if (retval == 0)
             errmsg ("next index %d\n", ntohl(mp->next_index));
+        vam->result_ready = 1;
     }
 }
 
@@ -1143,8 +1190,10 @@ static void vl_api_tap_connect_reply_t_handler
         vam->async_errors += (retval < 0);
     } else {
         vam->retval = retval;
-        vam->result_ready = 1;
+       vam->sw_if_index = ntohl (mp->sw_if_index);
+       vam->result_ready = 1;
     }
+    
 }
 
 static void vl_api_tap_connect_reply_t_handler_json
@@ -1162,6 +1211,7 @@ static void vl_api_tap_connect_reply_t_handler_json
 
     vam->retval = ntohl(mp->retval);
     vam->result_ready = 1;
+    
 }
 
 static void vl_api_tap_modify_reply_t_handler
@@ -1173,6 +1223,7 @@ static void vl_api_tap_modify_reply_t_handler
         vam->async_errors += (retval < 0);
     } else {
         vam->retval = retval;
+       vam->sw_if_index = ntohl (mp->sw_if_index);
         vam->result_ready = 1;
     }
 }
@@ -1262,6 +1313,7 @@ static void vl_api_l2tpv3_create_tunnel_reply_t_handler
         vam->async_errors += (retval < 0);
     } else {
         vam->retval = retval;
+       vam->sw_if_index = ntohl (mp->sw_if_index);
         vam->result_ready = 1;
     }
 }
@@ -1292,6 +1344,7 @@ static void vl_api_vxlan_add_del_tunnel_reply_t_handler
         vam->async_errors += (retval < 0);
     } else {
         vam->retval = retval;
+       vam->sw_if_index = ntohl (mp->sw_if_index);
         vam->result_ready = 1;
     }
 }
@@ -1322,6 +1375,7 @@ static void vl_api_gre_add_del_tunnel_reply_t_handler
         vam->async_errors += (retval < 0);
     } else {
         vam->retval = retval;
+       vam->sw_if_index = ntohl (mp->sw_if_index);
         vam->result_ready = 1;
     }
 }
@@ -1352,6 +1406,7 @@ static void vl_api_create_vhost_user_if_reply_t_handler
         vam->async_errors += (retval < 0);
     } else {
         vam->retval = retval;
+       vam->sw_if_index = ntohl (mp->sw_if_index);
         vam->result_ready = 1;
     }
 }
@@ -1929,7 +1984,8 @@ vl_api_lisp_local_eid_table_details_t_handler (
     vat_main_t *vam = &vat_main;
     u8 *prefix;
 
-    prefix = format(0, "%U/%d",
+    prefix = format(0, "[&d] %U/%d",
+                    clib_net_to_host_u32 (mp->vni),
                     mp->eid_is_ipv6 ? format_ip6_address : format_ip4_address,
                     mp->eid_ip_address,
                     mp->eid_prefix_len);
@@ -1964,6 +2020,7 @@ vl_api_lisp_local_eid_table_details_t_handler_json (
         clib_memcpy(&ip4, mp->eid_ip_address, sizeof(ip4));
         vat_json_object_add_ip4(node, "eid address", ip4);
     }
+    vat_json_object_add_uint(node, "vni", clib_net_to_host_u32 (mp->vni));
     vat_json_object_add_uint(node, "eid prefix len", mp->eid_prefix_len);
 }
 
@@ -2122,6 +2179,8 @@ vl_api_lisp_enable_disable_status_details_t_handler_json
     gpe_status = format (0, "%s", mp->gpe_status ? "enabled" : "disabled");
     feature_status = format (0, "%s",
                             mp->feature_status ? "enabled" : "disabled");
+    vec_add1 (gpe_status, 0);
+    vec_add1 (feature_status, 0);
 
     if (VAT_JSON_ARRAY != vam->json_tree.type) {
         ASSERT(VAT_JSON_NONE == vam->json_tree.type);
@@ -2137,6 +2196,45 @@ vl_api_lisp_enable_disable_status_details_t_handler_json
     vec_free (feature_status);
 }
 
+static void
+vl_api_lisp_get_map_request_itr_rlocs_reply_t_handler (
+    vl_api_lisp_get_map_request_itr_rlocs_reply_t * mp)
+{
+    vat_main_t * vam = &vat_main;
+    i32 retval = ntohl(mp->retval);
+
+    if (retval >= 0) {
+      fformat(vam->ofp, "%=20s\n",
+              mp->locator_set_name);
+    }
+
+    vam->retval = retval;
+    vam->result_ready = 1;
+}
+
+static void
+vl_api_lisp_get_map_request_itr_rlocs_reply_t_handler_json (
+    vl_api_lisp_get_map_request_itr_rlocs_reply_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_string_copy(node, "itr-rlocs", mp->locator_set_name);
+
+    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);
@@ -2352,8 +2450,9 @@ _(lisp_gpe_enable_disable_reply)                        \
 _(lisp_gpe_add_del_iface_reply)                         \
 _(lisp_enable_disable_reply)                            \
 _(lisp_pitr_set_locator_set_reply)                      \
+_(lisp_add_del_map_request_itr_rlocs_reply)             \
+_(lisp_eid_table_add_del_map_reply)                     \
 _(vxlan_gpe_add_del_tunnel_reply)                      \
-_(af_packet_create_reply)                               \
 _(af_packet_delete_reply)                               \
 _(policer_add_del_reply)                                \
 _(netmap_create_reply)                                  \
@@ -2531,6 +2630,7 @@ _(LISP_ADD_DEL_MAP_RESOLVER_REPLY, lisp_add_del_map_resolver_reply)     \
 _(LISP_GPE_ENABLE_DISABLE_REPLY, lisp_gpe_enable_disable_reply)         \
 _(LISP_ENABLE_DISABLE_REPLY, lisp_enable_disable_reply)                 \
 _(LISP_PITR_SET_LOCATOR_SET_REPLY, lisp_pitr_set_locator_set_reply)     \
+_(LISP_EID_TABLE_ADD_DEL_MAP_REPLY, lisp_eid_table_add_del_map_reply)   \
 _(LISP_GPE_ADD_DEL_IFACE_REPLY, lisp_gpe_add_del_iface_reply)           \
 _(LISP_LOCATOR_SET_DETAILS, lisp_locator_set_details)                   \
 _(LISP_LOCAL_EID_TABLE_DETAILS, lisp_local_eid_table_details)           \
@@ -2538,6 +2638,10 @@ _(LISP_GPE_TUNNEL_DETAILS, lisp_gpe_tunnel_details)                     \
 _(LISP_MAP_RESOLVER_DETAILS, lisp_map_resolver_details)                 \
 _(LISP_ENABLE_DISABLE_STATUS_DETAILS,                                   \
   lisp_enable_disable_status_details)                                   \
+_(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)                                 \
 _(AF_PACKET_CREATE_REPLY, af_packet_create_reply)                       \
 _(AF_PACKET_DELETE_REPLY, af_packet_delete_reply)                       \
 _(POLICER_ADD_DEL_REPLY, policer_add_del_reply)                         \
@@ -2582,6 +2686,20 @@ do {                                            \
     return -99;                                 \
 } while(0);
 
+/* W2: wait for results, with timeout */
+#define W2(body)                               \
+do {                                            \
+    timeout = vat_time_now (vam) + 1.0;         \
+                                                \
+    while (vat_time_now (vam) < timeout) {      \
+        if (vam->result_ready == 1) {           \
+         (body);                               \
+         return (vam->retval);                 \
+        }                                       \
+    }                                           \
+    return -99;                                 \
+} while(0);
+
 typedef struct {
     u8 * name;
     u32 value;
@@ -3098,6 +3216,13 @@ int api_sw_interface_dump (vat_main_t * vam)
     strncpy ((char *) mp->name_filter, "lo", sizeof(mp->name_filter)-1);
     S;
 
+
+    /* and vxlan-gpe tunnel interfaces */
+    M(SW_INTERFACE_DUMP, sw_interface_dump);
+    mp->name_filter_valid = 1;
+    strncpy ((char *) mp->name_filter, "vxlan_gpe", sizeof(mp->name_filter)-1);
+    S;
+
     /* and vxlan tunnel interfaces */
     M(SW_INTERFACE_DUMP, sw_interface_dump);
     mp->name_filter_valid = 1;
@@ -7520,7 +7645,9 @@ static void vl_api_vxlan_tunnel_details_t_handler
     fformat(vam->ofp, "%11d%24U%24U%14d%18d%13d\n",
             ntohl(mp->sw_if_index),
             format_ip46_address, &(mp->src_address[0]),
+           IP46_TYPE_ANY,
             format_ip46_address, &(mp->dst_address[0]),
+           IP46_TYPE_ANY,
             ntohl(mp->encap_vrf_id),
             ntohl(mp->decap_next_index),
             ntohl(mp->vni));
@@ -9787,11 +9914,14 @@ api_lisp_add_del_local_eid(vat_main_t * vam)
     u8 eid_lenght = ~0;
     u8 *locator_set_name = NULL;
     u8 locator_set_name_set = 0;
+    u32 vni = 0;
 
     /* Parse args required to build the message */
     while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
         if (unformat(input, "del")) {
             is_add = 0;
+        } else if (unformat(input, "vni &d", &vni)) {
+            ;
         } else if (unformat(input, "eid %U/%d", unformat_ip4_address,
             &eidv4, &tmp_eid_lenght)) {
             eid_lenght = tmp_eid_lenght;
@@ -9854,6 +9984,7 @@ api_lisp_add_del_local_eid(vat_main_t * vam)
         clib_memcpy(mp->ip_address, &eidv4, sizeof(eidv4));
     }
     mp->prefix_len = eid_lenght;
+    mp->vni = clib_host_to_net_u32(vni);
     clib_memcpy(mp->locator_set_name, locator_set_name,
            vec_len(locator_set_name));
     vec_free(locator_set_name);
@@ -10175,6 +10306,53 @@ api_lisp_pitr_set_locator_set (vat_main_t * vam)
   return 0;
 }
 
+/**
+ * Add/delete mapping between vni and vrf
+ */
+static int
+api_lisp_eid_table_add_del_map (vat_main_t * vam)
+{
+  f64 timeout = ~0;
+  unformat_input_t * input = vam->input;
+  vl_api_lisp_eid_table_add_del_map_t *mp;
+  u8 is_add = 1, vni_set = 0, vrf_set = 0;
+  u32 vni, vrf;
+
+  /* Parse args required to build the message */
+  while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (input, "del"))
+        is_add = 0;
+      else if (unformat(input, "vrf %d", &vrf))
+        vrf_set = 1;
+      else if (unformat(input, "vni %d", &vni))
+        vni_set = 1;
+      else
+        break;
+    }
+
+  if (!vni_set || !vrf_set)
+    {
+      errmsg ("missing arguments!");
+      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->vrf = htonl (vrf);
+
+  /* send */
+  S;
+
+  /* wait for reply */
+  W;
+
+  /* notreached*/
+  return 0;
+}
+
 /**
  * Add/del remote mapping from LISP control plane and updates
  * forwarding entries in data-plane accordingly.
@@ -10194,13 +10372,15 @@ api_lisp_add_del_remote_mapping (vat_main_t * vam)
     ip6_address_t seid6, deid6, rloc6;
     u32 seid_len = 0, deid_len = 0, len;
     u8 deid_is_ip4 = 0, seid_is_ip4 = 0;
-    u8 is_add = 1;
+    u8 is_add = 1, del_all = 0;
     u32 action = ~0;
     rloc_t * rlocs = 0, rloc;
 
     /* Parse args required to build the message */
     while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
-        if (unformat(input, "del")) {
+        if (unformat(input, "del-all")) {
+            del_all = 1;
+        } else if (unformat(input, "del")) {
             is_add = 0;
         } else if (unformat(input, "add")) {
             is_add = 1;
@@ -10264,6 +10444,7 @@ api_lisp_add_del_remote_mapping (vat_main_t * vam)
     mp->seid_len = seid_len;
     mp->action = (u8) action;
     mp->deid_len = deid_len;
+    mp->del_all = del_all;
     if (seid_is_ip4) {
         mp->eid_is_ip4 = 1;
         clib_memcpy (mp->seid, &seid4, sizeof (seid4));
@@ -10342,6 +10523,65 @@ api_lisp_gpe_add_del_iface(vat_main_t * vam)
     return 0;
 }
 
+/**
+ * Add/del map request itr rlocs from LISP control plane and updates
+ *
+ * @param vam vpp API test context
+ * @return return code
+ */
+static int
+api_lisp_add_del_map_request_itr_rlocs(vat_main_t * vam)
+{
+    unformat_input_t * input = vam->input;
+    vl_api_lisp_add_del_map_request_itr_rlocs_t *mp;
+    f64 timeout = ~0;
+    u8 *locator_set_name = 0;
+    u8  locator_set_name_set = 0;
+    u8 is_add = 1;
+
+    /* Parse args required to build the message */
+    while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
+        if (unformat(input, "del")) {
+            is_add = 0;
+        } else if (unformat(input, "%_%v%_", &locator_set_name)) {
+            locator_set_name_set = 1;
+        } else {
+            clib_warning ("parse error '%U'", format_unformat_error, input);
+            return -99;
+        }
+    }
+
+    if (is_add && !locator_set_name_set) {
+        errmsg ("itr-rloc is not set!");
+        return -99;
+    }
+
+    if (is_add && vec_len(locator_set_name) > 64) {
+        errmsg ("itr-rloc locator-set name too long\n");
+        vec_free(locator_set_name);
+        return -99;
+    }
+
+    M(LISP_ADD_DEL_MAP_REQUEST_ITR_RLOCS, lisp_add_del_map_request_itr_rlocs);
+    mp->is_add = is_add;
+    if (is_add) {
+      clib_memcpy (mp->locator_set_name , locator_set_name,
+                   vec_len(locator_set_name));
+    } else {
+      memset(mp->locator_set_name, 0, sizeof(mp->locator_set_name));
+    }
+    vec_free (locator_set_name);
+
+    /* send it... */
+    S;
+
+    /* Wait for a reply... */
+    W;
+
+    /* NOTREACHED */
+    return 0;
+}
+
 static int
 api_lisp_locator_set_dump(vat_main_t *vam)
 {
@@ -10486,6 +10726,27 @@ api_lisp_enable_disable_status_dump(vat_main_t *vam)
     return 0;
 }
 
+static int
+api_lisp_get_map_request_itr_rlocs(vat_main_t *vam)
+{
+    vl_api_lisp_get_map_request_itr_rlocs_t *mp;
+    f64 timeout = ~0;
+
+    if (!vam->json_output) {
+        fformat(vam->ofp, "%=20s\n",
+                "itr-rlocs:");
+    }
+
+    M(LISP_GET_MAP_REQUEST_ITR_RLOCS, lisp_get_map_request_itr_rlocs);
+    /* send it... */
+    S;
+    /* Wait for a reply... */
+    W;
+
+    /* NOTREACHED */
+    return 0;
+}
+
 static int
 api_af_packet_create (vat_main_t * vam)
 {
@@ -10524,7 +10785,7 @@ api_af_packet_create (vat_main_t * vam)
     mp->use_random_hw_addr = random_hw_addr;
     vec_free (host_if_name);
 
-    S; W;
+    S; W2(fprintf(vam->ofp," new sw_if_index = %d ", vam->sw_if_index));
     /* NOTREACHED */
     return 0;
 }
@@ -11240,11 +11501,14 @@ _(lisp_add_del_remote_mapping, "add|del vni <vni> table-id <id> "       \
                                " <src-eid> rloc <locator> "             \
                                "[rloc <loc> ... ]")                     \
 _(lisp_pitr_set_locator_set, "locator-set <loc-set-name> | del")        \
+_(lisp_add_del_map_request_itr_rlocs, "<loc-set-name> [del]")           \
+_(lisp_eid_table_add_del_map, "[del] vni <vni> vrf <vrf>")              \
 _(lisp_locator_set_dump, "")                                            \
 _(lisp_local_eid_table_dump, "")                                        \
 _(lisp_gpe_tunnel_dump, "")                                             \
 _(lisp_map_resolver_dump, "")                                           \
 _(lisp_enable_disable_status_dump, "")                                  \
+_(lisp_get_map_request_itr_rlocs, "")                                   \
 _(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]")                \