From ee6475d31815fe3e012d48ef7302a5d73e3a8a5d Mon Sep 17 00:00:00 2001 From: Tuetuopay Date: Fri, 27 Jan 2023 15:10:49 +0100 Subject: [PATCH] network/dhcp4: accept local subnet routes from DHCP RFC3442 specifies option 121 (Classless Static Routes) that allow a DHCP server to push arbitrary routes to a client. It has a Local Subnet Routes section expliciting the behavior of routes with a null (0.0.0.0) gateway. Such routes are to be installed on the interface with a Link scope, to mark them as directly available on the link without any gateway. Networkd currently drops those routes, which is against the RFC, as Linux has proper support for such routes. Fixes: 7f20627 ("network: dhcp4: ignore gateway in static routes if destination is link-local or in the same network") (cherry picked from commit 1d84a3c7792a8910b05904937c703307ca19740f) (cherry picked from commit b0f514ba567a1f6321f6b7f1ded038f8090c70f0) --- src/network/networkd-dhcp4.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index 0941ad026c..7b1133ed10 100644 --- a/src/network/networkd-dhcp4.c +++ b/src/network/networkd-dhcp4.c @@ -376,15 +376,18 @@ static int dhcp4_request_route_auto( route->gw = IN_ADDR_NULL; route->prefsrc.in = address; - } else { - if (in4_addr_is_null(gw)) { - log_link_debug(link, "DHCP: requested route destination "IPV4_ADDRESS_FMT_STR"/%u is not in the assigned network " - IPV4_ADDRESS_FMT_STR"/%u, but no gateway is specified, ignoring.", - IPV4_ADDRESS_FMT_VAL(route->dst.in), route->dst_prefixlen, - IPV4_ADDRESS_FMT_VAL(prefix), prefixlen); - return 0; - } + } else if (in4_addr_is_null(gw)) { + log_link_debug(link, "DHCP: requested route destination "IPV4_ADDRESS_FMT_STR"/%u is not in the assigned network " + IPV4_ADDRESS_FMT_STR"/%u, but no gateway is specified, using 'link' scope.", + IPV4_ADDRESS_FMT_VAL(route->dst.in), route->dst_prefixlen, + IPV4_ADDRESS_FMT_VAL(prefix), prefixlen); + route->scope = RT_SCOPE_LINK; + route->gw_family = AF_UNSPEC; + route->gw = IN_ADDR_NULL; + route->prefsrc.in = address; + + } else { r = dhcp4_request_route_to_gateway(link, gw); if (r < 0) return r;