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.