Keep trying even if the interface in question is not "admin-up,
link-up." In real life, it's normal for link autonegotiation to take a
good fraction of a second. The driver layer takes care of packets sent
to an interface which can't transmit at the moment.
Renew address leases at the preferred renewal time, not at the
expiration time.
Type: fix
Signed-off-by: Dave Barach <dave@barachs.net>
Change-Id: I68ec1c52cc1f4a8aa256185820748b845e92f7c1
{
address_info->preferred_lt = preferred_time;
address_info->valid_lt = valid_time;
{
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;
if (address_info->due_time > rm->max_valid_due_time)
rm->max_valid_due_time = address_info->due_time;
continue;
address_info->address = *address;
address_info->preferred_lt = preferred_time;
address_info->valid_lt = valid_time;
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++;
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++;
u32 type)
{
dhcp6_client_common_main_t *ccm = &dhcp6_client_common_main;
u32 type)
{
dhcp6_client_common_main_t *ccm = &dhcp6_client_common_main;
- vnet_main_t *vnm = vnet_get_main ();
-
vlib_buffer_t *b;
u32 bi;
ip6_header_t *ip;
vlib_buffer_t *b;
u32 bi;
ip6_header_t *ip;
- vnet_hw_interface_t *hw = vnet_get_sup_hw_interface (vnm, sw_if_index);
- vnet_sw_interface_t *sup_sw = vnet_get_sup_sw_interface (vnm, sw_if_index);
- vnet_sw_interface_t *sw = vnet_get_sw_interface (vnm, sw_if_index);
-
- /* Interface(s) down? */
- if ((hw->flags & VNET_HW_INTERFACE_FLAG_LINK_UP) == 0)
- return NULL;
- if ((sup_sw->flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP) == 0)
- return NULL;
- if ((sw->flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP) == 0)
- return NULL;
-
/* Get a link-local address */
src_addr = ip6_neighbor_get_link_local_address (sw_if_index);
/* Get a link-local address */
src_addr = ip6_neighbor_get_link_local_address (sw_if_index);
* client_state, u32 type)
{
dhcp6_client_common_main_t *ccm = &dhcp6_client_common_main;
* client_state, u32 type)
{
dhcp6_client_common_main_t *ccm = &dhcp6_client_common_main;
- vnet_main_t *vnm = vnet_get_main ();
-
vlib_buffer_t *b;
u32 bi;
ip6_header_t *ip;
vlib_buffer_t *b;
u32 bi;
ip6_header_t *ip;
- vnet_hw_interface_t *hw = vnet_get_sup_hw_interface (vnm, sw_if_index);
- vnet_sw_interface_t *sup_sw = vnet_get_sup_sw_interface (vnm, sw_if_index);
- vnet_sw_interface_t *sw = vnet_get_sw_interface (vnm, sw_if_index);
-
- /* Interface(s) down? */
- if ((hw->flags & VNET_HW_INTERFACE_FLAG_LINK_UP) == 0)
- return NULL;
- if ((sup_sw->flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP) == 0)
- return NULL;
- if ((sw->flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP) == 0)
- return NULL;
+ /*
+ * Note: do NOT psychoanalyze link-state here.
+ * If the interface is down, let the driver turf the packet.
+ */
/* Get a link-local address */
src_addr = ip6_neighbor_get_link_local_address (sw_if_index);
/* Get a link-local address */
src_addr = ip6_neighbor_get_link_local_address (sw_if_index);
else
{
client_state->sleep_interval =
else
{
client_state->sleep_interval =
- (2 + random_f64_from_to (-0.1, 0.1)) * client_state->sleep_interval;
+ (2.0 + random_f64_from_to (-0.1, 0.1)) * client_state->sleep_interval;
if (client_state->sleep_interval > params->mrt)
client_state->sleep_interval =
if (client_state->sleep_interval > params->mrt)
client_state->sleep_interval =
- (1 + random_f64_from_to (-0.1, 0.1)) * params->mrt;
+ (1.0 + random_f64_from_to (-0.1, 0.1)) * params->mrt;
client_state->due_time = current_time + client_state->sleep_interval;
client_state->due_time = current_time + client_state->sleep_interval;
client_state->buffer =
create_buffer_for_client_message (vm, sw_if_index, client_state,
params->msg_type);
client_state->buffer =
create_buffer_for_client_message (vm, sw_if_index, client_state,
params->msg_type);
- if (!client_state->buffer)
- client_state->keep_sending_client_message = 0;
- else
- vlib_process_signal_event (vm,
- send_dhcp6_pd_client_message_process_node.index,
- 1, 0);
+ if (client_state->buffer)
+ vlib_process_signal_event
+ (vm, send_dhcp6_pd_client_message_process_node.index, 1, 0);