summaryrefslogtreecommitdiffstats
path: root/sbin/dhclient
diff options
context:
space:
mode:
authorn_hibma <n_hibma@FreeBSD.org>2017-04-07 09:13:26 +0000
committern_hibma <n_hibma@FreeBSD.org>2017-04-07 09:13:26 +0000
commit8acfb7695965324b270562d67781bcbb4f2be2da (patch)
tree3e5b1dd99f076e079f34231c6f42c690149cdf5c /sbin/dhclient
parent11ac0fc26ac23e16776d84b8d27eee593b527f8f (diff)
downloadFreeBSD-src-8acfb7695965324b270562d67781bcbb4f2be2da.zip
FreeBSD-src-8acfb7695965324b270562d67781bcbb4f2be2da.tar.gz
MFC 316283:
Allow superseding the lease renewal and rebind times. Also make sure that the renewal is never more than 1/2 * expiry and rebind never more than 7/4 * renewal (the default values in the spec). This should allow adjusting high values from the server as well as making sure the values from the server make sense. Renewal and rebind times will be adjusted down if the expiry time is set very high in a server, not the other way around. This change just makes sure the values keep making sense. and 316285: Make dhcp-lease-time option supersedable as well. Note: It is not recommended to set this value to above the value that the server provided, unless that value is bogus.
Diffstat (limited to 'sbin/dhclient')
-rw-r--r--sbin/dhclient/dhclient.c31
1 files changed, 24 insertions, 7 deletions
diff --git a/sbin/dhclient/dhclient.c b/sbin/dhclient/dhclient.c
index 65f0eb5..2a43082 100644
--- a/sbin/dhclient/dhclient.c
+++ b/sbin/dhclient/dhclient.c
@@ -752,7 +752,11 @@ dhcpack(struct packet *packet)
cancel_timeout(send_request, ip);
/* Figure out the lease time. */
- if (ip->client->new->options[DHO_DHCP_LEASE_TIME].data)
+ if (ip->client->config->default_actions[DHO_DHCP_LEASE_TIME] ==
+ ACTION_SUPERSEDE)
+ ip->client->new->expiry = getULong(
+ ip->client->config->defaults[DHO_DHCP_LEASE_TIME].data);
+ else if (ip->client->new->options[DHO_DHCP_LEASE_TIME].data)
ip->client->new->expiry = getULong(
ip->client->new->options[DHO_DHCP_LEASE_TIME].data);
else
@@ -765,21 +769,34 @@ dhcpack(struct packet *packet)
if (ip->client->new->expiry < 60)
ip->client->new->expiry = 60;
- /* Take the server-provided renewal time if there is one;
- otherwise figure it out according to the spec. */
- if (ip->client->new->options[DHO_DHCP_RENEWAL_TIME].len)
+ /* Unless overridden in the config, take the server-provided renewal
+ * time if there is one; otherwise figure it out according to the spec.
+ * Also make sure the renewal time does not exceed the expiry time.
+ */
+ if (ip->client->config->default_actions[DHO_DHCP_RENEWAL_TIME] ==
+ ACTION_SUPERSEDE)
+ ip->client->new->renewal = getULong(
+ ip->client->config->defaults[DHO_DHCP_RENEWAL_TIME].data);
+ else if (ip->client->new->options[DHO_DHCP_RENEWAL_TIME].len)
ip->client->new->renewal = getULong(
ip->client->new->options[DHO_DHCP_RENEWAL_TIME].data);
else
ip->client->new->renewal = ip->client->new->expiry / 2;
+ if (ip->client->new->renewal > ip->client->new->expiry / 2)
+ ip->client->new->renewal = ip->client->new->expiry / 2;
/* Same deal with the rebind time. */
- if (ip->client->new->options[DHO_DHCP_REBINDING_TIME].len)
+ if (ip->client->config->default_actions[DHO_DHCP_REBINDING_TIME] ==
+ ACTION_SUPERSEDE)
+ ip->client->new->rebind = getULong(
+ ip->client->config->defaults[DHO_DHCP_REBINDING_TIME].data);
+ else if (ip->client->new->options[DHO_DHCP_REBINDING_TIME].len)
ip->client->new->rebind = getULong(
ip->client->new->options[DHO_DHCP_REBINDING_TIME].data);
else
- ip->client->new->rebind = ip->client->new->renewal +
- ip->client->new->renewal / 2 + ip->client->new->renewal / 4;
+ ip->client->new->rebind = ip->client->new->renewal * 7 / 4;
+ if (ip->client->new->rebind > ip->client->new->renewal * 7 / 4)
+ ip->client->new->rebind = ip->client->new->renewal * 7 / 4;
ip->client->new->expiry += cur_time;
/* Lease lengths can never be negative. */
OpenPOWER on IntegriCloud