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 <[email protected]>

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 <[email protected]> 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
> [email protected]
> http://lists.busybox.net/mailman/listinfo/busybox
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to