vcl: RX event may lost when accept session repeatedly
[vpp.git] / src / vnet / ip / rd_cp.c
index 21e4551..c9c387e 100644 (file)
@@ -71,6 +71,9 @@ typedef struct
   svm_queue_t *vl_input_queue;
   u32 my_client_index;
 
+  /* logging */
+  vlib_log_class_t log_class;
+
   /* convenience */
   vlib_main_t *vlib_main;
   vnet_main_t *vnet_main;
@@ -210,7 +213,7 @@ get_interface_mac_address (u32 sw_if_index, u8 mac[])
 
   if (!vnet_sw_interface_is_api_valid (rm->vnet_main, sw_if_index))
     {
-      clib_warning ("Invalid sw_if_index");
+      vlib_log_warn (rm->log_class, "Invalid sw_if_index");
       return 1;
     }
 
@@ -218,7 +221,13 @@ get_interface_mac_address (u32 sw_if_index, u8 mac[])
   if (si->type == VNET_SW_INTERFACE_TYPE_HARDWARE)
     eth_if = ethernet_get_interface (&ethernet_main, si->hw_if_index);
 
-  clib_memcpy (mac, eth_if->address, 6);
+  if (!eth_if)
+    {
+      vlib_log_warn (rm->log_class, "Failed to get hardware interface");
+      return 1;
+    }
+
+  clib_memcpy_fast (mac, eth_if->address, 6);
 
   return 0;
 }
@@ -288,7 +297,7 @@ ip6_ra_report_handler (void *data)
         if (default_route->sw_if_index != sw_if_index)
           ;
         else if (0 != memcmp (&default_route->router_address,
-                              r->router_address, 16))
+                              &r->router_address, 16))
           ;
         else
           {
@@ -302,7 +311,7 @@ ip6_ra_report_handler (void *data)
       if (!route_already_present)
        {
          if (router_lifetime_in_sec != 0)
-           add_default_route (vm, sw_if_index, (void *) r->router_address,
+           add_default_route (vm, sw_if_index, &r->router_address,
                               current_time + router_lifetime_in_sec);
        }
       else
@@ -316,7 +325,7 @@ ip6_ra_report_handler (void *data)
 
   if (get_interface_mac_address (sw_if_index, mac) != 0)
     {
-      clib_warning ("Error getting MAC address");
+      vlib_log_warn (rm->log_class, "Error getting MAC address");
       return clib_error_return (0, "Error getting MAC address");
     }
 
@@ -337,8 +346,8 @@ ip6_ra_report_handler (void *data)
       if (!(prefix->flags & PREFIX_FLAG_A))
        continue;
 
-      dst_address = &prefix->dst_address;
-      prefix_length = prefix->dst_address_length;
+      dst_address = &prefix->prefix.fp_addr.ip6;
+      prefix_length = prefix->prefix.fp_len;
 
       if (ip6_address_is_link_local_unicast (dst_address))
        continue;
@@ -431,9 +440,15 @@ rd_cp_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f)
       do
        {
          due_time = current_time + 1e9;
+         u32 index;
+         /*
+          * we do not use pool_foreach() to iterate over pool elements here
+          * as we are removing elements inside the loop body
+          */
           /* *INDENT-OFF* */
-          pool_foreach (slaac_address, rm->slaac_address_pool,
+          pool_foreach_index (index, rm->slaac_address_pool,
           ({
+            slaac_address = pool_elt_at_index(rm->slaac_address_pool, index);
             if (slaac_address->due_time > current_time)
               {
                 if (slaac_address->due_time < due_time)
@@ -441,13 +456,15 @@ rd_cp_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f)
               }
             else
               {
+                u32 sw_if_index = slaac_address->sw_if_index;
                 remove_slaac_address (vm, slaac_address);
                 /* make sure ip6 stays enabled */
-                ip6_enable (slaac_address->sw_if_index);
+                ip6_enable (sw_if_index);
               }
           }));
-          pool_foreach (default_route, rm->default_route_pool,
+          pool_foreach_index (index, rm->default_route_pool,
           ({
+            default_route = pool_elt_at_index(rm->default_route_pool, index);
             if (default_route->due_time > current_time)
               {
                 if (default_route->due_time < due_time)
@@ -501,7 +518,7 @@ set_address_autoconfig (u32 sw_if_index, u8 enable, u8 install_default_routes)
 
   if (!vnet_sw_interface_is_api_valid (vnm, sw_if_index))
     {
-      clib_warning ("Invalid sw_if_index");
+      vlib_log_warn (rm->log_class, "Invalid sw_if_index");
       return 1;
     }
 
@@ -626,7 +643,7 @@ vl_api_ip6_nd_address_autoconfig_t_handler (vl_api_ip6_nd_address_autoconfig_t
 
   BAD_SW_IF_INDEX_LABEL;
 
-  REPLY_MACRO (VL_API_SW_INTERFACE_SET_TABLE_REPLY);
+  REPLY_MACRO (VL_API_IP6_ND_ADDRESS_AUTOCONFIG_REPLY);
 }
 
 #define vl_msg_name_crc_list
@@ -645,13 +662,15 @@ static clib_error_t *
 rd_cp_init (vlib_main_t * vm)
 {
   rd_cp_main_t *rm = &rd_cp_main;
-  api_main_t *am = &api_main;
+  api_main_t *am = vlibapi_get_main ();
 
   rm->vlib_main = vm;
   rm->vnet_main = vnet_get_main ();
   rm->api_main = am;
   rm->node_index = rd_cp_process_node.index;
 
+  rm->log_class = vlib_log_register_class ("rd_cp", 0);
+
 #define _(N,n)                                                  \
     vl_msg_api_set_handlers(VL_API_##N, #n,                     \
                            vl_api_##n##_t_handler,              \