summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2022-01-13 21:42:28 +0900
committerLuca Boccassi <luca.boccassi@gmail.com>2022-01-13 22:46:52 +0000
commit902bbdc4b60269f456a1cea81f4c0f1c0f7a6d8a (patch)
treee2354391e8c4da91ea8009d34579418b67fb4979
parentfad7ad2b8b28d0e4595697a36f654c936ca4ad4d (diff)
downloadsystemd-902bbdc4b60269f456a1cea81f4c0f1c0f7a6d8a.tar.gz
network: use scope link for direct unicast routes by default
Strictly speaking, this breaks the backward compatibility, but I guess in most cases people already sets Scope=link for such routes. This behavior matches with how 'ip route' command adds such route by default. Prompted by https://twitter.com/jplitza/status/1480500562391179270.
-rw-r--r--man/systemd.network.xml6
-rw-r--r--src/network/networkd-route.c6
-rw-r--r--test/test-network/conf/25-route-static.network1
-rwxr-xr-xtest/test-network/systemd-networkd-tests.py6
4 files changed, 12 insertions, 7 deletions
diff --git a/man/systemd.network.xml b/man/systemd.network.xml
index 197e0dad1d..93c10b7755 100644
--- a/man/systemd.network.xml
+++ b/man/systemd.network.xml
@@ -1547,9 +1547,9 @@ Table=1234</programlisting></para>
<para>For IPv4 route, defaults to <literal>host</literal> if <varname>Type=</varname> is
<literal>local</literal> or <literal>nat</literal>, and <literal>link</literal> if
- <varname>Type=</varname> is <literal>broadcast</literal>, <literal>multicast</literal>, or
- <literal>anycast</literal>. In other cases, defaults to <literal>global</literal>. The value
- is not used for IPv6.</para>
+ <varname>Type=</varname> is <literal>broadcast</literal>, <literal>multicast</literal>,
+ <literal>anycast</literal>, or direct <literal>unicast</literal> routes. In other cases,
+ defaults to <literal>global</literal>. The value is not used for IPv6.</para>
</listitem>
</varlistentry>
diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c
index f0697a66af..00e64978d4 100644
--- a/src/network/networkd-route.c
+++ b/src/network/networkd-route.c
@@ -2846,6 +2846,12 @@ static int route_section_verify(Route *route, Network *network) {
route->scope = RT_SCOPE_HOST;
else if (IN_SET(route->type, RTN_BROADCAST, RTN_ANYCAST, RTN_MULTICAST))
route->scope = RT_SCOPE_LINK;
+ else if (IN_SET(route->type, RTN_UNICAST, RTN_UNSPEC) &&
+ !route->gateway_from_dhcp_or_ra &&
+ !in_addr_is_set(route->gw_family, &route->gw) &&
+ ordered_set_isempty(route->multipath_routes) &&
+ route->nexthop_id == 0)
+ route->scope = RT_SCOPE_LINK;
}
if (route->scope != RT_SCOPE_UNIVERSE && route->family == AF_INET6) {
diff --git a/test/test-network/conf/25-route-static.network b/test/test-network/conf/25-route-static.network
index 8f242bd1fe..6aa3ec66dc 100644
--- a/test/test-network/conf/25-route-static.network
+++ b/test/test-network/conf/25-route-static.network
@@ -24,7 +24,6 @@ Gateway=fe80::222:4dff:ff:ff:ff:ff
[Route]
Destination=149.10.124.64
-Scope=link
[Route]
Gateway=149.10.124.64
diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py
index 5613398757..2207f36245 100755
--- a/test/test-network/systemd-networkd-tests.py
+++ b/test/test-network/systemd-networkd-tests.py
@@ -2542,9 +2542,9 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities):
self.assertIn('149.10.124.48/28 proto kernel scope link src 149.10.124.58', output)
self.assertIn('149.10.124.64 proto static scope link', output)
self.assertIn('169.254.0.0/16 proto static scope link metric 2048', output)
- self.assertIn('192.168.1.1 proto static initcwnd 20', output)
- self.assertIn('192.168.1.2 proto static initrwnd 30', output)
- self.assertIn('192.168.1.3 proto static advmss 30', output)
+ self.assertIn('192.168.1.1 proto static scope link initcwnd 20', output)
+ self.assertIn('192.168.1.2 proto static scope link initrwnd 30', output)
+ self.assertIn('192.168.1.3 proto static scope link advmss 30', output)
self.assertIn('multicast 149.10.123.4 proto static', output)
print('### ip -4 route show dev dummy98 default')