ip: Protocol Independent IP Neighbors
[vpp.git] / src / plugins / dhcp / dhcp6_ia_na_client_cp.c
index 2d4135d..b485599 100644 (file)
@@ -20,6 +20,7 @@
 #include <dhcp/dhcp6_ia_na_client_dp.h>
 #include <vnet/ip/ip.h>
 #include <vnet/ip/ip6.h>
+#include <vnet/ip/ip6_link.h>
 #include <float.h>
 #include <math.h>
 
@@ -144,17 +145,6 @@ send_client_message_start_stop (u32 sw_if_index, u32 server_index,
 
 static void interrupt_process (void);
 
-static u32
-ip6_enable (u32 sw_if_index)
-{
-  dhcp6_client_cp_main_t *rm = &dhcp6_client_cp_main;
-  clib_error_t *rv;
-
-  rv = enable_ip6_interface (rm->vlib_main, sw_if_index);
-
-  return rv != 0;
-}
-
 static u8
 ip6_addresses_equal (ip6_address_t * address1, ip6_address_t * address2)
 {
@@ -302,7 +292,11 @@ dhcp6_reply_event_handler (vl_api_dhcp6_reply_event_t * mp)
        {
          address_info->preferred_lt = preferred_time;
          address_info->valid_lt = valid_time;
-         address_info->due_time = current_time + valid_time;
+         address_info->due_time = current_time;
+         /* Renew the lease at the preferred time, if non-zero */
+         address_info->due_time += (preferred_time > 0) ?
+           preferred_time : valid_time;
+
          if (address_info->due_time > rm->max_valid_due_time)
            rm->max_valid_due_time = address_info->due_time;
          continue;
@@ -316,7 +310,11 @@ dhcp6_reply_event_handler (vl_api_dhcp6_reply_event_t * mp)
       address_info->address = *address;
       address_info->preferred_lt = preferred_time;
       address_info->valid_lt = valid_time;
-      address_info->due_time = current_time + valid_time;
+      address_info->due_time = current_time;
+      /* Renew the lease at the preferred time, if non-zero */
+      address_info->due_time += (preferred_time > 0) ?
+       preferred_time : valid_time;
+
       if (address_info->due_time > rm->max_valid_due_time)
        rm->max_valid_due_time = address_info->due_time;
       rm->client_state_by_sw_if_index[sw_if_index].address_count++;
@@ -414,7 +412,7 @@ dhcp6_client_cp_process (vlib_main_t * vm, vlib_node_runtime_t * rt,
                     clib_warning ("Failed to delete interface address");
                 pool_put (rm->address_pool, address_info);
                 /* make sure ip6 stays enabled */
-                ip6_enable (sw_if_index);
+                ip6_link_enable (sw_if_index);
                 client_state = &rm->client_state_by_sw_if_index[sw_if_index];
                 if (--client_state->address_count == 0)
                   {
@@ -642,7 +640,7 @@ dhcp6_client_enable_disable (u32 sw_if_index, u8 enable)
          dhcp6_clients_enable_disable (1);
        }
 
-      ip6_enable (sw_if_index);
+      ip6_link_enable (sw_if_index);
       send_client_message_start_stop (sw_if_index, ~0, DHCPV6_MSG_SOLICIT,
                                      0, 1);
     }
@@ -758,7 +756,7 @@ dhcp_ia_na_client_cp_init (vlib_main_t * vm)
 
   rm->vlib_main = vm;
   rm->vnet_main = vnet_get_main ();
-  rm->api_main = &api_main;
+  rm->api_main = vlibapi_get_main ();
   rm->node_index = dhcp6_client_cp_process_node.index;
 
   return NULL;