diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2020-03-02 14:44:00 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-02 14:44:00 +0900 |
commit | a7b74efd1cdf56ed4181aa52524ed2366620e056 (patch) | |
tree | 6dd0f36063e156527d303d08561da4785d628f65 | |
parent | df46dbca92f7197cd3c6c8ae6e67560683b6dc0d (diff) | |
parent | 4c2e1833ec1ad2f5da57d0deebfa7e98bd88bd0d (diff) | |
download | systemd-a7b74efd1cdf56ed4181aa52524ed2366620e056.tar.gz |
Merge pull request #14983 from ssahani/dhcp-use-routes-14982
network: Allow to configure GW even if UseRoutes=false
-rw-r--r-- | src/network/networkd-dhcp4.c | 63 | ||||
-rw-r--r-- | test/test-network/conf/dhcp-client-ipv4-use-routes-no.network | 9 | ||||
-rwxr-xr-x | test/test-network/systemd-networkd-tests.py | 15 |
3 files changed, 55 insertions, 32 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 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"); - - 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 (link->network->dhcp_use_routes) { + for (i = 0; i < n; i++) { + _cleanup_(route_freep) Route *route = NULL; - if (set_contains(link->dhcp_routes, 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 = dhcp_route_configure(&route, link); - if (r < 0) - return log_link_error_errno(link, r, "Could not set 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; + + 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 = sd_dhcp_lease_get_router(link->dhcp_lease, &router); diff --git a/test/test-network/conf/dhcp-client-ipv4-use-routes-no.network b/test/test-network/conf/dhcp-client-ipv4-use-routes-no.network new file mode 100644 index 0000000000..21e21fabb3 --- /dev/null +++ b/test/test-network/conf/dhcp-client-ipv4-use-routes-no.network @@ -0,0 +1,9 @@ +[Match] +Name=veth99 + +[Network] +DHCP=ipv4 +IPv6AcceptRA=false + +[DHCPv4] +UseRoutes=no diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index 6cdc96daf7..6cc09235c6 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -2825,6 +2825,7 @@ class NetworkdDHCPClientTests(unittest.TestCase, Utilities): 'dhcp-client-ipv4-dhcp-settings.network', 'dhcp-client-ipv4-only-ipv6-disabled.network', 'dhcp-client-ipv4-only.network', + 'dhcp-client-ipv4-use-routes-no.network', 'dhcp-client-ipv6-only.network', 'dhcp-client-ipv6-rapid-commit.network', 'dhcp-client-keep-configuration-dhcp-on-stop.network', @@ -2929,6 +2930,20 @@ class NetworkdDHCPClientTests(unittest.TestCase, Utilities): self.assertRegex(output, r'192.168.5.7 proto dhcp scope link src 192.168.5.181 metric 1024') self.assertRegex(output, r'192.168.5.8 proto dhcp scope link src 192.168.5.181 metric 1024') + def test_dhcp_client_ipv4_use_routes_no(self): + copy_unit_to_networkd_unit_path('25-veth.netdev', 'dhcp-server-veth-peer.network', 'dhcp-client-ipv4-use-routes-no.network') + + start_networkd() + self.wait_online(['veth-peer:carrier']) + start_dnsmasq(additional_options='--dhcp-option=option:dns-server,192.168.5.6,192.168.5.7', lease_time='2m') + self.wait_online(['veth99:routable', 'veth-peer:routable']) + + output = check_output('ip route show dev veth99') + print(output) + self.assertNotRegex(output, r'192.168.5.5') + self.assertRegex(output, r'default via 192.168.5.1 proto dhcp src 192.168.5.181 metric 1024') + self.assertRegex(output, r'192.168.5.1 proto dhcp scope link src 192.168.5.181 metric 1024') + def test_dhcp_client_ipv4_ipv6(self): copy_unit_to_networkd_unit_path('25-veth.netdev', 'dhcp-server-veth-peer.network', 'dhcp-client-ipv6-only.network', 'dhcp-client-ipv4-only.network') |