From 28634924f0950f1938ea74a7808d412dc1063fd0 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Sun, 21 Dec 2014 16:10:22 +0100 Subject: [PATCH] udhcpc: account for script run time Based on the following user report: I ran into an issue where I was seeing a long delay in the scripts called in udhcp_run_script. I was using an old version of OpenWrt (kamikaze) and a satellite modem. An NTP script was being called and the modem would sometimes take a long time to respond to the DNS lookup when it was offline. This delay started affecting my lease time. The lease that I would get from my satellite modem before it was online would be short: only 60 seconds. The delay with NTP and the modem would typically be about 18 seconds. This would cause the first DHCP renew request from dhcpc to be a little late. Under certain circumstances, I could even see the first DHCP renew to occur after the lease had expired! function old new delta udhcpc_main 2816 2837 +21 Signed-off-by: Denys Vlasenko --- networking/udhcp/dhcpc.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c index 35e7c2070..a34829c3a 100644 --- a/networking/udhcp/dhcpc.c +++ b/networking/udhcp/dhcpc.c @@ -1697,6 +1697,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv) case RENEW_REQUESTED: case REBINDING: if (*message == DHCPACK) { + unsigned start; uint32_t lease_seconds; struct in_addr temp_addr; uint8_t *temp; @@ -1756,7 +1757,10 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv) bb_info_msg("Lease of %s obtained, lease time %u", inet_ntoa(temp_addr), (unsigned)lease_seconds); requested_ip = packet.yiaddr; + + start = monotonic_sec(); udhcp_run_script(&packet, state == REQUESTING ? "bound" : "renew"); + already_waited_sec = (unsigned)monotonic_sec() - start; state = BOUND; change_listen_mode(LISTEN_NONE); @@ -1774,7 +1778,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv) #endif /* make future renew packets use different xid */ /* xid = random_xid(); ...but why bother? */ - already_waited_sec = 0; + continue; /* back to main loop */ } if (*message == DHCPNAK) {