[prev in list] [next in list] [prev in thread] [next in thread] 

List:       busybox
Subject:    Re: udhcpc: udhcpc skips RENEWING state when lease time is short
From:       Denys Vlasenko <vda.linux () googlemail ! com>
Date:       2018-10-30 10:57:07
Message-ID: CAK1hOcMbKv0h4Pd6jzfm69aR33HmPOhXXM_=i7USZ8d63neBZg () mail ! gmail ! com
[Download RAW message or body]

Should be fixed by:

commit c05aa6a776ab2420a42c041a3b5d45db587fd9ef
Date:   Tue Oct 30 11:56:18 2018 +0100

    udhcpc: ensure at least one unicast renew attempt

    Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>

diff --git a/networking/udhcp/d6_dhcpc.c b/networking/udhcp/d6_dhcpc.c
index 66e4b6c6a..e2f8a6a9c 100644
--- a/networking/udhcp/d6_dhcpc.c
+++ b/networking/udhcp/d6_dhcpc.c
@@ -1738,8 +1738,9 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
                                /* note: "int timeout" will not
overflow even with 0xffffffff inputs here: */
                                timeout = (prefix_timeout <
address_timeout ? prefix_timeout : address_timeout) / 2;
                                /* paranoia: must not be too small */
-                               if (timeout < 0x10)
-                                       timeout = 0x10;
+                               /* timeout > 60 - ensures at least one
unicast renew attempt */
+                               if (timeout < 61)
+                                       timeout = 61;
                                /* enter bound state */
                                d6_run_script(packet.d6_options, packet_end,
                                        (state == REQUESTING ? "bound"
> "renew"));
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c
index ab3e5a463..d2f165904 100644
--- a/networking/udhcp/dhcpc.c
+++ b/networking/udhcp/dhcpc.c
@@ -1725,8 +1725,9 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)

move_from_unaligned32(lease_seconds, temp);
                                        lease_seconds = ntohl(lease_seconds);
                                        /* paranoia: must not be too
small and not prone to overflows */
-                                       if (lease_seconds < 0x10)
-                                               lease_seconds = 0x10;
+                                       /* timeout > 60 - ensures at
least one unicast renew attempt */
+                                       if (lease_seconds < 2 * 61)
+                                               lease_seconds = 2 * 61;
                                        //if (lease_seconds > 0x7fffffff)
                                        //      lease_seconds = 0x7fffffff;
                                        //^^^not necessary since
"timeout = lease_seconds / 2"
On Wed, Oct 3, 2018 at 10:06 PM Tomas Tonhauser <t.tonhauser@pobox.sk> wrote:
> 
> 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
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> _______________________________________________
> busybox mailing list
> busybox@busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic