From ad098b14c5ecb13ea591732d09b3e3869d97ff92 Mon Sep 17 00:00:00 2001 From: Susant Sahani Date: Sun, 1 Mar 2020 05:12:39 +0100 Subject: [PATCH] network: Allow to configure GW even UseRoutes=false When use UseRoutes=False so the DHCP request itself does not request for Classless Static Routes option. As a result, the DHCP server will only respond with a Router option. In this case since we are using the UseRoutes=False option the gateway that comes in via the router option does not get configured. This patch fixes theis behaviour. --- src/network/networkd-dhcp4.c | 57 ++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index 5f5a21a59f..34770f6f2b 100644 --- a/src/network/networkd-dhcp4.c +++ b/src/network/networkd-dhcp4.c @@ -240,9 +240,6 @@ static int link_set_dhcp_routes(Link *link) { if (!link->network) /* link went down while we configured the IP addresses? */ return 0; - if (!link->network->dhcp_use_routes) - return 0; - if (!link_has_carrier(link) && !link->network->configure_without_carrier) /* During configuring addresses, the link lost its carrier. As networkd is dropping * the addresses now, let's not configure the routes either. */ @@ -290,37 +287,39 @@ static int link_set_dhcp_routes(Link *link) { } } - for (i = 0; i < n; i++) { - _cleanup_(route_freep) Route *route = NULL; + if (link->network->dhcp_use_routes) { + for (i = 0; i < n; i++) { + _cleanup_(route_freep) Route *route = NULL; - /* if the DHCP server returns both a Classless Static Routes option and a Static Routes option, - the DHCP client MUST ignore the Static Routes option. */ - if (classless_route && - sd_dhcp_route_get_option(static_routes[i]) != SD_DHCP_OPTION_CLASSLESS_STATIC_ROUTE) - continue; + /* if the DHCP server returns both a Classless Static Routes option and a Static Routes option, + the DHCP client MUST ignore the Static Routes option. */ + if (classless_route && + sd_dhcp_route_get_option(static_routes[i]) != SD_DHCP_OPTION_CLASSLESS_STATIC_ROUTE) + continue; - r = route_new(&route); - if (r < 0) - return log_link_error_errno(link, r, "Could not allocate route: %m"); + r = route_new(&route); + if (r < 0) + return log_link_error_errno(link, r, "Could not allocate route: %m"); - route->family = AF_INET; - route->protocol = RTPROT_DHCP; - assert_se(sd_dhcp_route_get_gateway(static_routes[i], &route->gw.in) >= 0); - assert_se(sd_dhcp_route_get_destination(static_routes[i], &route->dst.in) >= 0); - assert_se(sd_dhcp_route_get_destination_prefix_length(static_routes[i], &route->dst_prefixlen) >= 0); - route->priority = link->network->dhcp_route_metric; - route->table = table; - route->mtu = link->network->dhcp_route_mtu; - route->scope = route_scope_from_address(route, &address); - if (IN_SET(route->scope, RT_SCOPE_LINK, RT_SCOPE_UNIVERSE)) - route->prefsrc.in = address; + route->family = AF_INET; + route->protocol = RTPROT_DHCP; + assert_se(sd_dhcp_route_get_gateway(static_routes[i], &route->gw.in) >= 0); + assert_se(sd_dhcp_route_get_destination(static_routes[i], &route->dst.in) >= 0); + assert_se(sd_dhcp_route_get_destination_prefix_length(static_routes[i], &route->dst_prefixlen) >= 0); + route->priority = link->network->dhcp_route_metric; + route->table = table; + route->mtu = link->network->dhcp_route_mtu; + route->scope = route_scope_from_address(route, &address); + if (IN_SET(route->scope, RT_SCOPE_LINK, RT_SCOPE_UNIVERSE)) + route->prefsrc.in = address; - if (set_contains(link->dhcp_routes, route)) - continue; + if (set_contains(link->dhcp_routes, route)) + continue; - r = dhcp_route_configure(&route, link); - if (r < 0) - return log_link_error_errno(link, r, "Could not set route: %m"); + r = dhcp_route_configure(&route, link); + if (r < 0) + return log_link_error_errno(link, r, "Could not set route: %m"); + } } r = sd_dhcp_lease_get_router(link->dhcp_lease, &router);