udhcpc: udhcpc skips RENEWING state when lease time is short

Tomas Tonhauser t.tonhauser at pobox.sk
Wed Oct 3 19:56:10 UTC 2018


Hello all,
 
busybox 1.28.3-4 (OpenWrt 18.06.1) running on a WiFi router, requesting IP address from 4G router (Huawei B2338-168) running in IPv4 passtrough mode. In this mode, 4G router is assigning the the same IP address it got from ISP (mobile network operator), lease time is 120 seconds. Because first renew request is sent after 60 seconds, it is broadcasted (= REBINDING state); RENEWING state is skipped:
 
...
            case RENEWING:
                if (timeout > 60) {
                    /* send an unicast renew request */
...
 
4G router drops broadcasted renew request and after lease is expired, WiFi router releases the IP address and enters init state:
 
Wed Oct  3 19:02:39 2018 user.notice firewall: Reloading firewall due to ifup of wan (eth1)
Wed Oct  3 19:03:37 2018 daemon.notice netifd: wan (1166): udhcpc: sending renew to 0.0.0.0
Wed Oct  3 19:04:07 2018 daemon.notice netifd: wan (1166): udhcpc: sending renew to 0.0.0.0
Wed Oct  3 19:04:22 2018 daemon.notice netifd: wan (1166): udhcpc: sending renew to 0.0.0.0
Wed Oct  3 19:04:29 2018 daemon.notice netifd: wan (1166): udhcpc: sending renew to 0.0.0.0
Wed Oct  3 19:04:32 2018 daemon.notice netifd: wan (1166): udhcpc: sending renew to 0.0.0.0
Wed Oct  3 19:04:33 2018 daemon.notice netifd: wan (1166): udhcpc: sending renew to 0.0.0.0
Wed Oct  3 19:04:33 2018 daemon.notice netifd: wan (1166): udhcpc: lease lost, entering init state
Wed Oct  3 19:04:34 2018 daemon.notice netifd: Interface 'wan' has lost the connection
Wed Oct  3 19:04:34 2018 daemon.notice netifd: wan (1166): udhcpc: sending select for 10.98.21.140
Wed Oct  3 19:04:34 2018 daemon.notice netifd: wan (1166): udhcpc: lease of 10.98.21.140 obtained, lease time 120
Wed Oct  3 19:04:34 2018 daemon.err openvpn(******)[1539]: write UDP: Network unreachable (code=128)
Wed Oct  3 19:04:34 2018 daemon.warn dnsmasq[1511]: no servers found in /tmp/resolv.conf.auto, will retry
Wed Oct  3 19:04:35 2018 daemon.notice netifd: Interface 'wan' is now up
Wed Oct  3 19:04:35 2018 daemon.info dnsmasq[1511]: reading /tmp/resolv.conf.auto
Wed Oct  3 19:04:35 2018 daemon.info dnsmasq[1511]: using local addresses only for domain test
Wed Oct  3 19:04:35 2018 daemon.info dnsmasq[1511]: using local addresses only for domain onion
Wed Oct  3 19:04:35 2018 daemon.info dnsmasq[1511]: using local addresses only for domain localhost
Wed Oct  3 19:04:35 2018 daemon.info dnsmasq[1511]: using local addresses only for domain local
Wed Oct  3 19:04:35 2018 daemon.info dnsmasq[1511]: using local addresses only for domain invalid
Wed Oct  3 19:04:35 2018 daemon.info dnsmasq[1511]: using local addresses only for domain bind
Wed Oct  3 19:04:35 2018 daemon.info dnsmasq[1511]: using nameserver 192.168.11.254#53 for domain ***
Wed Oct  3 19:04:35 2018 daemon.info dnsmasq[1511]: using local addresses only for domain *****
Wed Oct  3 19:04:35 2018 daemon.info dnsmasq[1511]: using nameserver 160.218.161.60#53
Wed Oct  3 19:04:35 2018 daemon.info dnsmasq[1511]: using nameserver 160.218.167.5#53
Wed Oct  3 19:04:36 2018 user.notice firewall: Reloading firewall due to ifup of wan (eth1)
 
So each 2 minutes wan connectivity is lost for a fraction of second.
I'd propose to perform at least one unicast renew reques irrespective of lease time, proposed patch:
 
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c
index fd18325..01241ca 100644
--- a/networking/udhcp/dhcpc.c
+++ b/networking/udhcp/dhcpc.c
@@ -1414,6 +1414,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
                struct dhcp_packet packet;
                /* silence "uninitialized!" warning */
                unsigned timestamp_before_wait = timestamp_before_wait;
+               uint32_t unicast_renew_attempt = 0;
 
                //bb_error_msg("sockfd:%d, listen_mode:%d", sockfd, listen_mode);
 
@@ -1468,6 +1469,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
 
                        switch (state) {
                        case INIT_SELECTING:
+                               unicast_renew_attempt = 0;
                                if (!discover_retries || packet_num < discover_retries) {
                                        if (packet_num == 0)
                                                xid = random_xid();
@@ -1521,8 +1523,10 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
                        case RENEW_REQUESTED: /* manual (SIGUSR1) renew */
                        case_RENEW_REQUESTED:
                        case RENEWING:
-                               if (timeout > 60) {
+                               /* we should try to send at least one unicast renew request */
+                               if (timeout > 60 || !unicast_renew_attempt) {
                                        /* send an unicast renew request */
+                                       unicast_renew_attempt = 1;
                        /* Sometimes observed to fail (EADDRNOTAVAIL) to bind
                         * a new UDP socket for sending inside send_renew.
                         * I hazard to guess existing listening socket


 
After applying patch, unicast renew request towards Huawei 4G router works as expected:
Wed Oct  3 20:12:58 2018 daemon.notice netifd: wan (3610): udhcpc: sending renew to 192.168.22.1
Wed Oct  3 20:12:58 2018 daemon.notice netifd: wan (3610): udhcpc: lease of 10.98.21.140 obtained, lease time 120
Wed Oct  3 20:13:58 2018 daemon.notice netifd: wan (3610): udhcpc: sending renew to 192.168.22.1
Wed Oct  3 20:13:59 2018 daemon.notice netifd: wan (3610): udhcpc: lease of 10.98.21.140 obtained, lease time 120
Wed Oct  3 20:14:59 2018 daemon.notice netifd: wan (3610): udhcpc: sending renew to 192.168.22.1
Wed Oct  3 20:14:59 2018 daemon.notice netifd: wan (3610): udhcpc: lease of 10.98.21.140 obtained, lease time 120
Wed Oct  3 20:16:00 2018 daemon.notice netifd: wan (3610): udhcpc: sending renew to 192.168.22.1
Wed Oct  3 20:16:00 2018 daemon.notice netifd: wan (3610): udhcpc: lease of 10.98.21.140 obtained, lease time 120
Wed Oct  3 20:17:00 2018 daemon.notice netifd: wan (3610): udhcpc: sending renew to 192.168.22.1
Wed Oct  3 20:17:00 2018 daemon.notice netifd: wan (3610): udhcpc: lease of 10.98.21.140 obtained, lease time 120
 
 
Thanks,
Tomas
 
 
 
 
 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.busybox.net/pipermail/busybox/attachments/20181003/c0aedaca/attachment.html>


More information about the busybox mailing list