diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index 7ed91cebd1..5ada9f0d01 100644 --- a/src/network/networkd-dhcp4.c +++ b/src/network/networkd-dhcp4.c @@ -1041,6 +1041,12 @@ int dhcp4_configure(Link *link) { return log_link_error_errno(link, r, "DHCP4 CLIENT: Failed to set request flag for classless static route: %m"); } + if (link->network->dhcp_use_domains != DHCP_USE_DOMAINS_NO && !link->network->dhcp_anonymize) { + r = sd_dhcp_client_set_request_option(link->dhcp_client, SD_DHCP_OPTION_DOMAIN_SEARCH_LIST); + if (r < 0) + return log_link_error_errno(link, r, "DHCP4 CLIENT: Failed to set request flag for domain search list: %m"); + } + if (link->network->dhcp_use_ntp) { r = sd_dhcp_client_set_request_option(link->dhcp_client, SD_DHCP_OPTION_NTP_SERVER); if (r < 0) diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 5565e08578..d7c2d393cd 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -3557,14 +3557,16 @@ int link_save(Link *link) { fputs_with_space(f, p, NULL, &space); if (link->network->dhcp_use_domains == DHCP_USE_DOMAINS_YES) { - NDiscDNSSL *dd; - if (dhcp_domainname) fputs_with_space(f, dhcp_domainname, NULL, &space); if (dhcp_domains) fputstrv(f, dhcp_domains, NULL, &space); if (dhcp6_domains) fputstrv(f, dhcp6_domains, NULL, &space); + } + + if (link->network->ipv6_accept_ra_use_domains == DHCP_USE_DOMAINS_YES) { + NDiscDNSSL *dd; SET_FOREACH(dd, link->ndisc_dnssl, i) fputs_with_space(f, NDISC_DNSSL_DOMAIN(dd), NULL, &space); @@ -3578,14 +3580,16 @@ int link_save(Link *link) { fputs_with_space(f, p, NULL, &space); if (link->network->dhcp_use_domains == DHCP_USE_DOMAINS_ROUTE) { - NDiscDNSSL *dd; - if (dhcp_domainname) fputs_with_space(f, dhcp_domainname, NULL, &space); if (dhcp_domains) fputstrv(f, dhcp_domains, NULL, &space); if (dhcp6_domains) fputstrv(f, dhcp6_domains, NULL, &space); + } + + if (link->network->ipv6_accept_ra_use_domains == DHCP_USE_DOMAINS_ROUTE) { + NDiscDNSSL *dd; SET_FOREACH(dd, link->ndisc_dnssl, i) fputs_with_space(f, NDISC_DNSSL_DOMAIN(dd), NULL, &space); diff --git a/test/test-network/conf/dhcp-client-use-domains.network b/test/test-network/conf/dhcp-client-use-domains.network new file mode 100644 index 0000000000..0d0e2dd7b6 --- /dev/null +++ b/test/test-network/conf/dhcp-client-use-domains.network @@ -0,0 +1,9 @@ +[Match] +Name=veth99 + +[Network] +DHCP=ipv4 +IPv6AcceptRA=no + +[DHCPv4] +UseDomains=yes diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index e396af05da..901171e899 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -2233,6 +2233,7 @@ class NetworkdDHCPClientTests(unittest.TestCase, Utilities): 'dhcp-client-use-dns-ipv4.network', 'dhcp-client-use-dns-no.network', 'dhcp-client-use-dns-yes.network', + 'dhcp-client-use-domains.network', 'dhcp-client-use-routes-no.network', 'dhcp-client-vrf.network', 'dhcp-client-with-ipv4ll-fallback-with-dhcp-server.network', @@ -2241,6 +2242,7 @@ class NetworkdDHCPClientTests(unittest.TestCase, Utilities): 'dhcp-client.network', 'dhcp-server-veth-peer.network', 'dhcp-v4-server-veth-peer.network', + 'dhcp-client-use-domains.network', 'static.network'] def setUp(self): @@ -2860,6 +2862,23 @@ class NetworkdDHCPClientTests(unittest.TestCase, Utilities): self.assertRegex(output, '192.168.5.1') self.assertRegex(output, '2600::1') + def test_dhcp_client_use_domains(self): + copy_unit_to_networkd_unit_path('25-veth.netdev', 'dhcp-server-veth-peer.network', 'dhcp-client-use-domains.network') + + start_networkd() + wait_online(['veth-peer:carrier']) + start_dnsmasq('--dhcp-option=option:domain-search,example.com') + wait_online(['veth99:routable', 'veth-peer:routable']) + + output = check_output(*networkctl_cmd, 'status', 'veth99', env=env) + print(output) + self.assertRegex(output, 'Search Domains: example.com') + + time.sleep(3) + output = check_output(*resolvectl_cmd, 'domain', 'veth99', env=env) + print(output) + self.assertRegex(output, 'example.com') + if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--build-dir', help='Path to build dir', dest='build_dir')