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,