ONE-11: Fix bugs in LISP API
[vpp.git] / vpp / api / api.c
index 4d7a919..9bf4d3c 100644 (file)
@@ -326,14 +326,14 @@ _(LISP_ADD_DEL_LOCAL_EID, lisp_add_del_local_eid)                       \
 _(LISP_GPE_ADD_DEL_FWD_ENTRY, lisp_gpe_add_del_fwd_entry)               \
 _(LISP_ADD_DEL_MAP_RESOLVER, lisp_add_del_map_resolver)                 \
 _(LISP_GPE_ENABLE_DISABLE, lisp_gpe_enable_disable)                     \
+_(LISP_ENABLE_DISABLE, lisp_enable_disable)                             \
 _(LISP_GPE_ADD_DEL_IFACE, lisp_gpe_add_del_iface)                       \
 _(LISP_LOCATOR_SET_DUMP, lisp_locator_set_dump)                         \
 _(LISP_LOCAL_EID_TABLE_DUMP, lisp_local_eid_table_dump)                 \
 _(LISP_GPE_TUNNEL_DUMP, lisp_gpe_tunnel_dump)                           \
 _(LISP_MAP_RESOLVER_DUMP, lisp_map_resolver_dump)                       \
-_(LISP_GPE_ENABLE_DISABLE_STATUS_DUMP,                                  \
-  lisp_gpe_enable_disable_status_dump)                                  \
-_(SR_MULTICAST_MAP_ADD_DEL, sr_multicast_map_add_del)                   \
+_(LISP_ENABLE_DISABLE_STATUS_DUMP,                                      \
+  lisp_enable_disable_status_dump)                                      \
 _(SR_MULTICAST_MAP_ADD_DEL, sr_multicast_map_add_del)                   \
 _(AF_PACKET_CREATE, af_packet_create)                                   \
 _(AF_PACKET_DELETE, af_packet_delete)
@@ -3454,7 +3454,7 @@ static void vl_api_sr_policy_add_del_t_handler
        goto out;
       }      
 
-    if (!(mp->tunnel_names))
+    if (!(mp->tunnel_names[0]))
       {
         rv = VNET_API_ERROR_NO_SUCH_NODE2;
        goto out;
@@ -4883,6 +4883,17 @@ vl_api_lisp_gpe_enable_disable_t_handler(
     REPLY_MACRO(VL_API_LISP_GPE_ENABLE_DISABLE_REPLY);
 }
 
+static void
+vl_api_lisp_enable_disable_t_handler(
+    vl_api_lisp_enable_disable_t *mp)
+{
+    vl_api_lisp_enable_disable_reply_t *rmp;
+    int rv = 0;
+
+    vnet_lisp_enable_disable (mp->is_en);
+    REPLY_MACRO(VL_API_LISP_ENABLE_DISABLE_REPLY);
+}
+
 static void
 vl_api_lisp_gpe_add_del_iface_t_handler(
     vl_api_lisp_gpe_add_del_iface_t *mp)
@@ -4899,24 +4910,54 @@ vl_api_lisp_gpe_add_del_iface_t_handler(
     REPLY_MACRO(VL_API_LISP_GPE_ADD_DEL_IFACE_REPLY);
 }
 
+static void
+send_lisp_locator_set_details_set_address
+(vl_api_lisp_locator_set_details_t *rmp,
+ gid_address_t *gid_address)
+{
+    ip_prefix_t *ip_addr;
+
+    if (gid_address_type(gid_address) != GID_ADDR_IP_PREFIX) {
+        return;
+    }
+
+    ip_addr = &gid_address_ippref(gid_address);
+    rmp->prefix_len = ip_prefix_len(ip_addr);
+    rmp->is_ipv6 = ip_prefix_version(ip_addr);
+    ip_address_copy_addr(rmp->ip_address, &ip_prefix_addr(ip_addr));
+}
+
 static void
 send_lisp_locator_set_details (lisp_cp_main_t *lcm,
                                locator_set_t *lsit,
                                unix_shared_memory_queue_t *q,
-                               u32 context)
+                               u32 context,
+                               u32 index)
 {
     vl_api_lisp_locator_set_details_t *rmp;
     locator_t *loc = NULL;
     u32 * locit = NULL;
+    u8 * str = NULL;
 
     vec_foreach (locit, lsit->locator_indices) {
         loc = pool_elt_at_index (lcm->locator_pool, locit[0]);
         rmp = vl_msg_api_alloc (sizeof (*rmp));
         memset (rmp, 0, sizeof (*rmp));
         rmp->_vl_msg_id = ntohs(VL_API_LISP_LOCATOR_SET_DETAILS);
-        strncpy((char *) rmp->locator_set_name,
-                (char *) lsit->name, ARRAY_LEN(rmp->locator_set_name) - 1);
-        rmp->sw_if_index = htonl(loc->sw_if_index);
+        rmp->local = lsit->local;
+        if (lsit->local) {
+            ASSERT(lsit->name != NULL);
+            strncpy((char *) rmp->locator_set_name,
+                    (char *) lsit->name, ARRAY_LEN(rmp->locator_set_name) - 1);
+            rmp->sw_if_index = htonl(loc->sw_if_index);
+        } else {
+            str = format(0, "remote-%d", index);
+            strncpy((char *) rmp->locator_set_name, (char *) str,
+                    ARRAY_LEN(rmp->locator_set_name) - 1);
+            send_lisp_locator_set_details_set_address(rmp, &loc->address);
+
+            vec_free(str);
+        }
         rmp->priority = loc->priority;
         rmp->weight = loc->weight;
         rmp->context = context;
@@ -4931,15 +4972,17 @@ vl_api_lisp_locator_set_dump_t_handler (vl_api_lisp_locator_set_dump_t *mp)
     unix_shared_memory_queue_t * q = NULL;
     lisp_cp_main_t * lcm = vnet_lisp_cp_get_main();
     locator_set_t * lsit = NULL;
+    u32 index;
 
     q = vl_api_client_index_to_input_queue (mp->client_index);
     if (q == 0) {
         return;
     }
 
+    index = 0;
     pool_foreach (lsit, lcm->locator_set_pool,
         ({
-            send_lisp_locator_set_details(lcm, lsit, q, mp->context);
+            send_lisp_locator_set_details(lcm, lsit, q, mp->context, index++);
         }));
 }
 
@@ -4953,6 +4996,7 @@ send_lisp_local_eid_table_details (mapping_t *mapit,
     locator_set_t *ls = NULL;
     gid_address_t *gid = NULL;
     ip_prefix_t *ip_prefix = NULL;
+    u8 * str = NULL;
     u8 type = ~0;
 
     ls = pool_elt_at_index (lcm->locator_set_pool,
@@ -4970,8 +5014,16 @@ send_lisp_local_eid_table_details (mapping_t *mapit,
     rmp = vl_msg_api_alloc (sizeof (*rmp));
     memset (rmp, 0, sizeof (*rmp));
     rmp->_vl_msg_id = ntohs(VL_API_LISP_LOCAL_EID_TABLE_DETAILS);
-    strncpy((char *) rmp->locator_set_name,
-            (char *) ls->name, ARRAY_LEN(rmp->locator_set_name) - 1);
+    if (ls->local) {
+        ASSERT(ls->name != NULL);
+        strncpy((char *) rmp->locator_set_name,
+                (char *) ls->name, ARRAY_LEN(rmp->locator_set_name) - 1);
+    } else {
+            str = format(0, "remote-%d", mapit->locator_set_index);
+            strncpy((char *) rmp->locator_set_name, (char *) str,
+                    ARRAY_LEN(rmp->locator_set_name) - 1);
+            vec_free(str);
+    }
 
     switch (ip_prefix_version(ip_prefix)) {
         case IP4:
@@ -5119,26 +5171,25 @@ vl_api_lisp_map_resolver_dump_t_handler (
 }
 
 static void
-send_lisp_gpe_enable_disable_details (unix_shared_memory_queue_t *q,
+send_lisp_enable_disable_details (unix_shared_memory_queue_t *q,
                                       u32 context)
 {
-    vl_api_lisp_gpe_enable_disable_status_details_t *rmp = NULL;
-    u8 is_en;
+    vl_api_lisp_enable_disable_status_details_t *rmp = NULL;
 
     rmp = vl_msg_api_alloc (sizeof (*rmp));
     memset (rmp, 0, sizeof (*rmp));
-    rmp->_vl_msg_id = ntohs(VL_API_LISP_GPE_ENABLE_DISABLE_STATUS_DETAILS);
+    rmp->_vl_msg_id = ntohs(VL_API_LISP_ENABLE_DISABLE_STATUS_DETAILS);
 
-    is_en = vnet_lisp_gpe_enable_disable_status();
-    rmp->is_en = is_en;
+    rmp->gpe_status = vnet_lisp_gpe_enable_disable_status ();
+    rmp->feature_status = vnet_lisp_enable_disable_status ();
     rmp->context = context;
 
     vl_msg_api_send_shmem (q, (u8 *)&rmp);
 }
 
 static void
-vl_api_lisp_gpe_enable_disable_status_dump_t_handler
-(vl_api_lisp_gpe_enable_disable_status_dump_t *mp)
+vl_api_lisp_enable_disable_status_dump_t_handler
+(vl_api_lisp_enable_disable_status_dump_t *mp)
 {
     unix_shared_memory_queue_t * q = NULL;
 
@@ -5147,7 +5198,7 @@ vl_api_lisp_gpe_enable_disable_status_dump_t_handler
         return;
     }
 
-    send_lisp_gpe_enable_disable_details(q, mp->context);
+    send_lisp_enable_disable_details(q, mp->context);
 }
 
 static void