On Sat 17/07/2021 17:12, Florian Obser wrote:
>
>
> On 17 July 2021 13:16:59 CEST, Bjorn Ketelaars <[email protected]> wrote:
> >An inconsistency exists between dhclient(8) and dhcpleased(8) when
> >receiving the Classless Static Routes option: dhcpleased creates a
> >default route, while dhclient does not.
> >
> >If I'm not mistaken, the behaviour of dhclient is correct. From
> >rfc3442:
> >"If the DHCP server returns both a Classless Static Routes option and a
> >Router option, the DHCP client MUST ignore the Router option."
> >
>
> Correct. But you are fixing it in the wrong place. It doesn't say to ignore a
> default route, which can be transmitted via classless static routes option
> (it's 0/0).
That makes sense. New diff...
diff --git sbin/dhcpleased/engine.c sbin/dhcpleased/engine.c
index ad8202c9a33..b3a86e68398 100644
--- sbin/dhcpleased/engine.c
+++ sbin/dhcpleased/engine.c
@@ -613,7 +613,7 @@ parse_dhcp(struct dhcpleased_iface *iface, struct imsg_dhcp
*dhcp)
uint32_t rebinding_time = 0;
uint8_t *p, dho = DHO_PAD, dho_len;
uint8_t dhcp_message_type = 0;
- int routes_len = 0;
+ int routes_len = 0, csr_len = 0, n;
char from[sizeof("xx:xx:xx:xx:xx:xx")];
char to[sizeof("xx:xx:xx:xx:xx:xx")];
char hbuf_src[INET_ADDRSTRLEN];
@@ -979,6 +979,7 @@ parse_dhcp(struct dhcpleased_iface *iface, struct imsg_dhcp
*dhcp)
dho_len -= sizeof(routes[routes_len].gw);
routes_len++;
+ csr_len++;
}
if (dho_len != 0) {
@@ -996,6 +997,20 @@ parse_dhcp(struct dhcpleased_iface *iface, struct
imsg_dhcp *dhcp)
}
}
+
+ /*
+ * RFC3442 states that if the DHCP server returns both a Classless Static
+ * Routes option and a Router option, the DHCP client MUST ignore the
+ * Router option.
+ */
+ if (csr_len > 0) {
+ log_warnx("%s: ignoring router option", __func__);
+ for (n = 0; n < routes_len - csr_len; n++) {
+ routes[n] = routes[n + 1];
+ routes_len--;
+ }
+ }
+
while (rem != 0) {
if (*p != DHO_PAD)
break;