On 2021/07/17 13:16, Bjorn Ketelaars 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."
That is correct. > Comments? > > > diff --git sbin/dhcpleased/dhcpleased.c sbin/dhcpleased/dhcpleased.c > index 2157406e71a..93df9f55e7f 100644 > --- sbin/dhcpleased/dhcpleased.c > +++ sbin/dhcpleased/dhcpleased.c > @@ -819,7 +819,7 @@ configure_routes(uint8_t rtm_type, struct > imsg_configure_interface *imsg) > { > struct sockaddr_in dst, mask, gw, ifa; > in_addr_t addrnet, gwnet; > - int i; > + int csr = 0, i; > > memset(&ifa, 0, sizeof(ifa)); > ifa.sin_family = AF_INET; > @@ -840,6 +840,13 @@ configure_routes(uint8_t rtm_type, struct > imsg_configure_interface *imsg) > > addrnet = imsg->addr.s_addr & imsg->mask.s_addr; > > + for (i = 0; i < imsg->routes_len; i++) { > + if (imsg->routes[i].dst.s_addr != INADDR_ANY) { > + csr = 1; > + break; > + } > + } > + > for (i = 0; i < imsg->routes_len; i++) { > dst.sin_addr.s_addr = imsg->routes[i].dst.s_addr; > mask.sin_addr.s_addr = imsg->routes[i].mask.s_addr; > @@ -872,6 +879,15 @@ configure_routes(uint8_t rtm_type, struct > imsg_configure_interface *imsg) > /* directly connected default */ > configure_route(rtm_type, imsg->if_index, > imsg->rdomain, &dst, &mask, &gw, NULL, 0); > + } else if (csr) { > + /* > + * 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. > + */ > + log_warnx("%s: ignoring router option", > + __func__); > } else { > /* default route via gateway */ > configure_route(rtm_type, imsg->if_index, >