From 5539fc0f73402add1f60298e75c91a454aa3a05c Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 16 Sep 2019 06:07:38 +0900 Subject: [PATCH 1/2] network: drop IPv6LL address when LinkLocalAddressing=no|ipv4 C.f. disscussion in #13533. Hopefully fixes #12886. --- src/network/networkd-link.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index a05971c8d4..f1aeb7287e 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -2389,7 +2389,7 @@ static int link_drop_foreign_config(Link *link) { SET_FOREACH(address, link->addresses_foreign, i) { /* we consider IPv6LL addresses to be managed by the kernel */ - if (address->family == AF_INET6 && in_addr_is_link_local(AF_INET6, &address->in_addr) == 1) + if (address->family == AF_INET6 && in_addr_is_link_local(AF_INET6, &address->in_addr) == 1 && link_ipv6ll_enabled(link)) continue; if (link_address_is_dynamic(link, address)) { @@ -2466,7 +2466,7 @@ static int link_drop_config(Link *link) { SET_FOREACH(address, link->addresses, i) { /* we consider IPv6LL addresses to be managed by the kernel */ - if (address->family == AF_INET6 && in_addr_is_link_local(AF_INET6, &address->in_addr) == 1) + if (address->family == AF_INET6 && in_addr_is_link_local(AF_INET6, &address->in_addr) == 1 && link_ipv6ll_enabled(link)) continue; r = address_remove(address, link, NULL); From 7b3770a75f3c2999cd415f8b7d0160e6c92800e7 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 16 Sep 2019 06:16:48 +0900 Subject: [PATCH 2/2] test-network: add one more test case for LinkLocalAddressing= --- .../conf/26-link-local-addressing-ipv6.network | 6 ++++++ test/test-network/systemd-networkd-tests.py | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 test/test-network/conf/26-link-local-addressing-ipv6.network diff --git a/test/test-network/conf/26-link-local-addressing-ipv6.network b/test/test-network/conf/26-link-local-addressing-ipv6.network new file mode 100644 index 0000000000..b4b5362a4a --- /dev/null +++ b/test/test-network/conf/26-link-local-addressing-ipv6.network @@ -0,0 +1,6 @@ +[Match] +Name=dummy98 + +[Network] +LinkLocalAddressing=ipv6 +IPv6AcceptRA=no diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index dd031de383..f1a58158e1 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -1435,6 +1435,7 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities): '25-gateway-next-static.network', '25-sysctl-disable-ipv6.network', '25-sysctl.network', + '26-link-local-addressing-ipv6.network', 'configure-without-carrier.network', 'routing-policy-rule-dummy98.network', 'routing-policy-rule-test1.network'] @@ -1814,6 +1815,23 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities): if os.path.exists(os.path.join(os.path.join(network_sysctl_ipv6_path, 'dummy98'), 'addr_gen_mode')): self.assertEqual(read_ipv6_sysctl_attr('dummy98', 'addr_gen_mode'), '1') + def test_link_local_addressing_remove_ipv6ll(self): + copy_unit_to_networkd_unit_path('26-link-local-addressing-ipv6.network', '12-dummy.netdev') + start_networkd() + self.wait_online(['dummy98:degraded']) + + output = check_output('ip address show dev dummy98') + print(output) + self.assertRegex(output, 'inet6 .* scope link') + + copy_unit_to_networkd_unit_path('25-link-local-addressing-no.network') + restart_networkd(1) + self.wait_online(['dummy98:carrier']) + + output = check_output('ip address show dev dummy98') + print(output) + self.assertNotRegex(output, 'inet6* .* scope link') + def test_sysctl(self): copy_unit_to_networkd_unit_path('25-sysctl.network', '12-dummy.netdev') start_networkd()