diff options
author | Kenneth R Westerback <krw@cvs.openbsd.org> | 2021-02-22 02:19:04 +0000 |
---|---|---|
committer | Kenneth R Westerback <krw@cvs.openbsd.org> | 2021-02-22 02:19:04 +0000 |
commit | c2c8ee67a7ae6fa797a32490ae45f546097b3c09 (patch) | |
tree | 1810cccbdfcf0db827d1c1b5b11e50cb74a40a99 | |
parent | fee24073de9535877ad792dd68c92ab14e850609 (diff) |
Switch reboot timing to timespec, the better to handle the
default reboot interval of 1 sec. Gives the DHCP server a
fairer shot at replying before the timeout expires.
ok millert@
-rw-r--r-- | sbin/dhclient/dhclient.c | 16 | ||||
-rw-r--r-- | sbin/dhclient/dhcpd.h | 3 |
2 files changed, 13 insertions, 6 deletions
diff --git a/sbin/dhclient/dhclient.c b/sbin/dhclient/dhclient.c index e621494ed81..cc84a8bebe2 100644 --- a/sbin/dhclient/dhclient.c +++ b/sbin/dhclient/dhclient.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dhclient.c,v 1.697 2021/02/21 18:16:59 krw Exp $ */ +/* $OpenBSD: dhclient.c,v 1.698 2021/02/22 02:19:03 krw Exp $ */ /* * Copyright 2004 Henning Brauer <henning@openbsd.org> @@ -813,7 +813,9 @@ state_preboot(struct interface_info *ifi) void state_reboot(struct interface_info *ifi) { - struct client_lease *lease; + const struct timespec reboot_intvl = {config->reboot_interval, 0}; + struct timespec now; + struct client_lease *lease; cancel_timeout(ifi); @@ -836,7 +838,9 @@ state_reboot(struct interface_info *ifi) make_request(ifi, ifi->active); ifi->destination.s_addr = INADDR_BROADCAST; - time(&ifi->first_sending); + clock_gettime(CLOCK_REALTIME, &now); + ifi->first_sending = now.tv_sec; + timespecadd(&now, &reboot_intvl, &ifi->reboot_timeout); ifi->interval = 0; send_request(ifi); @@ -1529,11 +1533,13 @@ send_request(struct interface_info *ifi) { struct sockaddr_in destination; struct in_addr from; + struct timespec now; ssize_t rslt; time_t cur_time, interval; cancel_timeout(ifi); - time(&cur_time); + clock_gettime(CLOCK_REALTIME, &now); + cur_time = now.tv_sec; if (log_getverbose()) tick_msg("lease", TICK_WAIT); @@ -1542,7 +1548,7 @@ send_request(struct interface_info *ifi) switch (ifi->state) { case S_REBOOTING: - if (interval > config->reboot_interval) + if (timespeccmp(&now, &ifi->reboot_timeout, >=)) ifi->state = S_INIT; else { destination.sin_addr.s_addr = INADDR_BROADCAST; diff --git a/sbin/dhclient/dhcpd.h b/sbin/dhclient/dhcpd.h index 9660de954af..e874d04c33c 100644 --- a/sbin/dhclient/dhcpd.h +++ b/sbin/dhclient/dhcpd.h @@ -1,4 +1,4 @@ -/* $OpenBSD: dhcpd.h,v 1.292 2021/02/21 18:16:59 krw Exp $ */ +/* $OpenBSD: dhcpd.h,v 1.293 2021/02/22 02:19:03 krw Exp $ */ /* * Copyright (c) 2004 Henning Brauer <henning@openbsd.org> @@ -136,6 +136,7 @@ struct interface_info { int sent_packet_length; uint32_t xid; struct timespec timeout; + struct timespec reboot_timeout; time_t expiry, rebind; void (*timeout_func)(struct interface_info *); uint16_t secs; |