Clean up dead API client reaper callack scheme
[vpp.git] / src / vpp / api / api.c
index e028fad..673ffe5 100644 (file)
@@ -116,6 +116,7 @@ _(PROXY_ARP_INTFC_ENABLE_DISABLE, proxy_arp_intfc_enable_disable)       \
 _(VNET_GET_SUMMARY_STATS, vnet_get_summary_stats)                      \
 _(RESET_FIB, reset_fib)                                                        \
 _(CREATE_LOOPBACK, create_loopback)                                    \
+_(CREATE_LOOPBACK_INSTANCE, create_loopback_instance)                  \
 _(CONTROL_PING, control_ping)                                           \
 _(CLI_REQUEST, cli_request)                                             \
 _(CLI_INBAND, cli_inband)                                              \
@@ -163,8 +164,8 @@ static int arp_change_delete_callback (u32 pool_index, u8 * notused);
 static int nd_change_delete_callback (u32 pool_index, u8 * notused);
 
 /* Clean up all registrations belonging to the indicated client */
-int
-vl_api_memclnt_delete_callback (u32 client_index)
+static clib_error_t *
+memclnt_delete_callback (u32 client_index)
 {
   vpe_api_main_t *vam = &vpe_api_main;
   vpe_client_registration_t *rp;
@@ -185,6 +186,8 @@ vl_api_memclnt_delete_callback (u32 client_index)
   return 0;
 }
 
+VL_MSG_API_REAPER_FUNCTION (memclnt_delete_callback);
+
 pub_sub_handler (oam_events, OAM_EVENTS);
 
 #define RESOLUTION_EVENT 1
@@ -1026,7 +1029,7 @@ vl_api_create_loopback_t_handler (vl_api_create_loopback_t * mp)
   u32 sw_if_index;
   int rv;
 
-  rv = vnet_create_loopback_interface (&sw_if_index, mp->mac_address);
+  rv = vnet_create_loopback_interface (&sw_if_index, mp->mac_address, 0, 0);
 
   /* *INDENT-OFF* */
   REPLY_MACRO2(VL_API_CREATE_LOOPBACK_REPLY,
@@ -1036,6 +1039,26 @@ vl_api_create_loopback_t_handler (vl_api_create_loopback_t * mp)
   /* *INDENT-ON* */
 }
 
+static void vl_api_create_loopback_instance_t_handler
+  (vl_api_create_loopback_instance_t * mp)
+{
+  vl_api_create_loopback_instance_reply_t *rmp;
+  u32 sw_if_index;
+  u8 is_specified = mp->is_specified;
+  u32 user_instance = ntohl (mp->user_instance);
+  int rv;
+
+  rv = vnet_create_loopback_interface (&sw_if_index, mp->mac_address,
+                                      is_specified, user_instance);
+
+  /* *INDENT-OFF* */
+  REPLY_MACRO2(VL_API_CREATE_LOOPBACK_INSTANCE_REPLY,
+  ({
+    rmp->sw_if_index = ntohl (sw_if_index);
+  }));
+  /* *INDENT-ON* */
+}
+
 static void
 vl_api_delete_loopback_t_handler (vl_api_delete_loopback_t * mp)
 {
@@ -1472,7 +1495,7 @@ arp_change_data_callback (u32 pool_index, u8 * new_mac,
     }
   else
     {                          /* same mac */
-      if (sw_if_index == event->sw_if_index &&
+      if (sw_if_index == ntohl(event->sw_if_index) &&
          (!event->mac_ip ||
           /* for BD case, also check IP address with 10 sec timeout */
           (address == event->address &&
@@ -1482,7 +1505,7 @@ arp_change_data_callback (u32 pool_index, u8 * new_mac,
   /* *INDENT-ON* */
 
   arp_event_last_time = now;
-  event->sw_if_index = sw_if_index;
+  event->sw_if_index = htonl (sw_if_index);
   if (event->mac_ip)
     event->address = address;
   return 0;
@@ -1510,7 +1533,7 @@ nd_change_data_callback (u32 pool_index, u8 * new_mac,
     }
   else
     {                          /* same mac */
-      if (sw_if_index == event->sw_if_index &&
+      if (sw_if_index == ntohl(event->sw_if_index) &&
          (!event->mac_ip ||
           /* for BD case, also check IP address with 10 sec timeout */
           (ip6_address_is_equal (address,
@@ -1521,7 +1544,7 @@ nd_change_data_callback (u32 pool_index, u8 * new_mac,
   /* *INDENT-ON* */
 
   nd_event_last_time = now;
-  event->sw_if_index = sw_if_index;
+  event->sw_if_index = htonl (sw_if_index);
   if (event->mac_ip)
     clib_memcpy (event->address, address, sizeof (event->address));
   return 0;
@@ -2122,7 +2145,6 @@ vpe_api_init (vlib_main_t * vm)
   am->oam_events_registration_hash = hash_create (0, sizeof (uword));
   am->bfd_events_registration_hash = hash_create (0, sizeof (uword));
 
-  vl_api_init (vm);
   vl_set_memory_region_name ("/vpe-api");
   vl_enable_disable_memory_api (vm, 1 /* enable it */ );