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

Reply via email to