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."

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