udhcpc: account for script run time
authorDenys Vlasenko <vda.linux@googlemail.com>
Sun, 21 Dec 2014 15:10:22 +0000 (16:10 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 21 Dec 2014 15:10:22 +0000 (16:10 +0100)
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 <vda.linux@googlemail.com>
networking/udhcp/dhcpc.c

index 35e7c20706b3eb782332686ad7811d72a5c81517..a34829c3a554ba85623f098e054c3e9a6ac7659b 100644 (file)
@@ -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) {