diff options
author | Lennart Poettering <lennart@poettering.net> | 2019-01-26 15:41:06 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-26 15:41:06 +0100 |
commit | 7c45deb20d4b28a928e0af089b1b18c2118db1e0 (patch) | |
tree | 078fe8aa35e10332221827ceeace29d661370a87 | |
parent | 064605ef5646a455a4272850b5f648abb9754a40 (diff) | |
parent | 30d3b54ebad41082e99cabbee815cb113aa0b5c4 (diff) | |
download | systemd-7c45deb20d4b28a928e0af089b1b18c2118db1e0.tar.gz |
Merge pull request #11460 from yuwata/fix-11458
network: update address when static address was already configured by DHCP
-rw-r--r-- | src/network/networkd-link.c | 6 | ||||
-rwxr-xr-x | test/test-network/systemd-networkd-tests.py | 41 |
2 files changed, 45 insertions, 2 deletions
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 555e90f5ce..736373ae34 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -1101,7 +1101,11 @@ static int link_request_set_addresses(Link *link) { return r; LIST_FOREACH(addresses, ad, link->network->static_addresses) { - r = address_configure(ad, link, address_handler, false); + bool update; + + update = address_get(link, ad->family, &ad->in_addr, ad->prefixlen, NULL) > 0; + + r = address_configure(ad, link, address_handler, update); if (r < 0) { log_link_warning_errno(link, r, "Could not set addresses: %m"); link_enter_failed(link); diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index 33ec40b012..9e72d35a54 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -1039,8 +1039,10 @@ class NetworkdNetworkDHCPClientTests(unittest.TestCase, Utilities): 'dhcp-client-listen-port.network', 'dhcp-client-route-metric.network', 'dhcp-client-route-table.network', + 'dhcp-client.network' 'dhcp-server-veth-peer.network', - 'dhcp-v4-server-veth-peer.network'] + 'dhcp-v4-server-veth-peer.network', + 'static.network'] def setUp(self): self.link_remove(self.links) @@ -1219,6 +1221,43 @@ class NetworkdNetworkDHCPClientTests(unittest.TestCase, Utilities): print(output) self.assertRegex(output, '192.168.5.*') + def test_dhcp_client_reuse_address_as_static(self): + self.copy_unit_to_networkd_unit_path('25-veth.netdev', 'dhcp-server-veth-peer.network', 'dhcp-client.network') + self.start_networkd() + + self.assertTrue(self.link_exits('veth99')) + + self.start_dnsmasq() + + output = subprocess.check_output(['ip', 'address', 'show', 'dev', 'veth99', 'scope', 'global']).rstrip().decode('utf-8') + print(output) + self.assertRegex(output, '192.168.5') + self.assertRegex(output, '2600::') + + ipv4_address = re.search('192\.168\.5\.[0-9]*/24', output) + ipv6_address = re.search('2600::[0-9a-f:]*/128', output) + static_network = '\n'.join(['[Match]', 'Name=veth99', '[Network]', 'IPv6AcceptRA=no', 'Address=' + ipv4_address.group(), 'Address=' + ipv6_address.group()]) + print(static_network) + + self.remove_unit_from_networkd_path(['dhcp-client.network']) + + with open(os.path.join(network_unit_file_path, 'static.network'), mode='w') as f: + f.write(static_network) + + self.start_networkd() + + self.assertTrue(self.link_exits('veth99')) + + output = subprocess.check_output(['ip', '-4', 'address', 'show', 'dev', 'veth99', 'scope', 'global']).rstrip().decode('utf-8') + print(output) + self.assertRegex(output, '192.168.5') + self.assertRegex(output, 'valid_lft forever preferred_lft forever') + + output = subprocess.check_output(['ip', '-6', 'address', 'show', 'dev', 'veth99', 'scope', 'global']).rstrip().decode('utf-8') + print(output) + self.assertRegex(output, '2600::') + self.assertRegex(output, 'valid_lft forever preferred_lft forever') + if __name__ == '__main__': unittest.main(testRunner=unittest.TextTestRunner(stream=sys.stdout, verbosity=3)) |