Skip to content

Commit

Permalink
Retry DHCP4 rebind until lease_time is reached
Browse files Browse the repository at this point in the history
Signed-off-by: Olaf Hering <olaf@aepfle.de>
  • Loading branch information
olafhering committed Sep 2, 2014
1 parent 532b93a commit 22a5a48
Showing 1 changed file with 34 additions and 23 deletions.
57 changes: 34 additions & 23 deletions dhcp4/fsm.c
Expand Up @@ -394,6 +394,37 @@ ni_dhcp4_fsm_renewal_init(ni_dhcp4_device_t *dev)
ni_dhcp4_fsm_renewal(dev, TRUE);
}

static ni_bool_t
ni_dhcp4_fsm_rebind(ni_dhcp4_device_t *dev, ni_bool_t oneshot)
{
time_t expire_time, now = time(NULL);
ni_bool_t retry = FALSE;

ni_info("%s: Initiating rebind of DHCPv4 lease", dev->ifname);

expire_time = dev->lease->time_acquired + dev->lease->dhcp4.lease_time;
if (expire_time > now || oneshot) {
dev->config->capture_timeout = dev->config->capture_max_timeout;
if (expire_time - now < dev->config->capture_timeout)
dev->config->capture_timeout = expire_time - now;
ni_dhcp4_fsm_set_timeout(dev, dev->config->capture_timeout);
ni_dhcp4_device_send_message(dev, DHCP4_REQUEST, dev->lease);
if (!oneshot)
retry = TRUE;
}
return retry;
}

static void
ni_dhcp4_fsm_rebind_init(ni_dhcp4_device_t *dev)
{
dev->fsm.state = NI_DHCP4_STATE_REBINDING;
dev->start_time = time(NULL);
dev->lease->dhcp4.server_id.s_addr = 0;
/* Send rebind request at least once */
ni_dhcp4_fsm_rebind(dev, TRUE);
}

static void
ni_dhcp4_fsm_reboot(ni_dhcp4_device_t *dev)
{
Expand All @@ -416,28 +447,6 @@ ni_dhcp4_fsm_reboot(ni_dhcp4_device_t *dev)
ni_dhcp4_device_send_message(dev, DHCP4_REQUEST, dev->lease);
}

static void
ni_dhcp4_fsm_rebind(ni_dhcp4_device_t *dev)
{
time_t expire_time, now = time(NULL);

ni_info("%s: Initiating rebind of DHCPv4 lease",
dev->ifname);

dev->start_time = time(NULL);
dev->fsm.state = NI_DHCP4_STATE_REBINDING;
dev->lease->dhcp4.server_id.s_addr = 0;
expire_time = dev->lease->time_acquired + dev->lease->dhcp4.lease_time;
dev->config->capture_timeout = dev->config->capture_max_timeout;
if (expire_time > now) {
if (expire_time - now < dev->config->capture_max_timeout)
dev->config->capture_timeout = expire_time - now;
ni_dhcp4_fsm_set_deadline(dev, expire_time);
} else
ni_dhcp4_fsm_set_timeout(dev, dev->config->capture_timeout);
ni_dhcp4_device_send_message(dev, DHCP4_REQUEST, dev->lease);
}

static void
ni_dhcp4_fsm_decline(ni_dhcp4_device_t *dev)
{
Expand Down Expand Up @@ -551,10 +560,12 @@ ni_dhcp4_fsm_timeout(ni_dhcp4_device_t *dev)
if (ni_dhcp4_fsm_renewal(dev, FALSE) == TRUE)
return;
ni_error("unable to renew lease within renewal period; trying to rebind");
ni_dhcp4_fsm_rebind(dev);
ni_dhcp4_fsm_rebind_init(dev);
break;

case NI_DHCP4_STATE_REBINDING:
if (ni_dhcp4_fsm_rebind(dev, FALSE) == TRUE)
return;
ni_error("unable to rebind lease");
ni_dhcp4_fsm_restart(dev);
ni_dhcp4_fsm_set_timeout(dev, 10);
Expand Down

0 comments on commit 22a5a48

Please sign in to comment.