On Fri, Apr 09, 2021 at 09:23:50AM +0200, Martijn van Duren wrote:
> Hello tech@,
> 
> I´m currently faced with a Comtrend VI-3223u router, which sends out
> dhcp leases with:
> DHO_DHCP_LEASE_TIME 86400s
> DHO_DHCP_RENEWAL_TIME 43200s
> DHO_DHCP_REBINDING_TIME 86400s
> 
> This trips up dhcpleased and I´m stuck without an IP-address
> (unless I move back to dhclient). I know that RFC2131 states that
> T2 MUST be smaller than lease expire, but chances this device gets
> fixed is small.
> 
> The diff below fixes the issue for me by rescaling both T1 and T2
> if they are invalid. This would also help if there is some dhcp
> server which sets T1 to 0 and T2 to < lease_time / 2.
> 
> Is something like this acceptable or should I scream at the
> wall^Wmanufacturer?

Yeah, no. dhcpleased has to be increadibly lenient in what it's
willing to accept. This stuff is around for nearly 3 decades.
Shit is not going to get fixed server side.

I think it would be better (and less ugly) to treat invalid values as
if they had not been set. Could you pull the two checks up before
if(renewal_time == 0) and do something like this:

        if (renewal_time >= rebinding_time) {
                log_warn(...)
                renewal_time = 0;
        }
        if (rebinding_time >= lease_time) {
                log_warn(...)
                rebinding_time = 0;
        }

> 
> martijn@
> 
> Index: engine.c
> ===================================================================
> RCS file: /cvs/src/sbin/dhcpleased/engine.c,v
> retrieving revision 1.11
> diff -u -p -r1.11 engine.c
> --- engine.c  22 Mar 2021 15:34:07 -0000      1.11
> +++ engine.c  9 Apr 2021 07:20:29 -0000
> @@ -977,17 +977,19 @@ parse_dhcp(struct dhcpleased_iface *ifac
>               if (rebinding_time == 0)
>                       rebinding_time = lease_time - (lease_time / 8);
>  
> -             if (renewal_time >= rebinding_time) {
> -                     log_warnx("%s: renewal_time >= rebinding_time "
> -                         "(%u >= %u) from %s", __func__, renewal_time,
> -                         rebinding_time, from);
> -                     return;
> -             }
>               if (rebinding_time >= lease_time) {
>                       log_warnx("%s: rebinding_time >= lease_time"
> -                         "(%u >= %u) from %s", __func__, rebinding_time,
> -                         lease_time, from);
> -                     return;
> +                         "(%u >= %u) from %s: adjusted to %u", __func__,
> +                         rebinding_time, lease_time, from,
> +                         lease_time - (lease_time / 8));
> +                     rebinding_time = lease_time - (lease_time / 8);
> +             }
> +             if (renewal_time >= rebinding_time) {
> +                     log_warnx("%s: renewal_time >= rebinding_time "
> +                         "(%u >= %u) from %s: adjusted to %u", __func__,
> +                         renewal_time, rebinding_time, from,
> +                         rebinding_time / 7 * 8 / 2);
> +                     renewal_time = rebinding_time / 7 * 8 / 2;
>               }
>               clock_gettime(CLOCK_MONOTONIC, &iface->request_time);
>               iface->server_identifier.s_addr = server_identifier.s_addr;
> 
> 

-- 
I'm not entirely sure you are real.

Reply via email to