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,
>