diff --git a/man/systemd.network.xml b/man/systemd.network.xml
index 606a2dd5dbb..7cf1da6ce5e 100644
--- a/man/systemd.network.xml
+++ b/man/systemd.network.xml
@@ -1926,6 +1926,13 @@ IPv6Token=prefixstable:2002:da8:1::
+
+ UseFQDN=
+
+ Equivalent of UseHostname= in the [DHCPv4] section.
+
+
+
RouteMetric=
diff --git a/src/network/networkd-dhcp6.c b/src/network/networkd-dhcp6.c
index 85a533b32fc..e643a92247d 100644
--- a/src/network/networkd-dhcp6.c
+++ b/src/network/networkd-dhcp6.c
@@ -11,6 +11,7 @@
#include "escape.h"
#include "hashmap.h"
+#include "hostname-setup.h"
#include "hostname-util.h"
#include "missing_network.h"
#include "networkd-address.h"
@@ -1073,6 +1074,25 @@ static int dhcp6_address_acquired(Link *link) {
return r;
}
+ if (link->network->dhcp6_use_fqdn) {
+ const char *dhcpname = NULL;
+ _cleanup_free_ char *hostname = NULL;
+ (void) sd_dhcp6_lease_get_fqdn(link->dhcp6_lease, &dhcpname);
+
+ if (dhcpname) {
+ r = shorten_overlong(dhcpname, &hostname);
+ if (r < 0)
+ log_link_warning_errno(link, r, "Unable to shorten overlong DHCP hostname '%s', ignoring: %m", dhcpname);
+ if (r == 1)
+ log_link_notice(link, "Overlong DHCP hostname received, shortened from '%s' to '%s'", dhcpname, hostname);
+ }
+ if (hostname) {
+ r = manager_set_hostname(link->manager, hostname);
+ if (r < 0)
+ log_link_error_errno(link, r, "Failed to set transient hostname to '%s': %m", hostname);
+ }
+ }
+
return 0;
}
diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf
index 7f0de7660c3..ad261406f0a 100644
--- a/src/network/networkd-network-gperf.gperf
+++ b/src/network/networkd-network-gperf.gperf
@@ -223,6 +223,7 @@ DHCPv4.RouteMTUBytes, config_parse_mtu,
DHCPv4.FallbackLeaseLifetimeSec, config_parse_dhcp_fallback_lease_lifetime, 0, 0
DHCPv6.UseAddress, config_parse_bool, 0, offsetof(Network, dhcp6_use_address)
DHCPv6.UseDNS, config_parse_dhcp_use_dns, 0, 0
+DHCPv6.UseFQDN, config_parse_bool, 0, offsetof(Network, dhcp6_use_fqdn)
DHCPv6.UseNTP, config_parse_dhcp_use_ntp, 0, 0
DHCPv6.RapidCommit, config_parse_bool, 0, offsetof(Network, dhcp6_rapid_commit)
DHCPv6.MUDURL, config_parse_dhcp6_mud_url, 0, 0
diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c
index 84ab1d5e18d..69cf95fedee 100644
--- a/src/network/networkd-network.c
+++ b/src/network/networkd-network.c
@@ -374,6 +374,7 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
.dhcp6_use_address = true,
.dhcp6_use_dns = true,
+ .dhcp6_use_fqdn = true,
.dhcp6_use_ntp = true,
.dhcp6_rapid_commit = true,
.dhcp6_route_metric = DHCP_ROUTE_METRIC,
diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h
index 288248dfa68..899b86eec91 100644
--- a/src/network/networkd-network.h
+++ b/src/network/networkd-network.h
@@ -159,6 +159,7 @@ struct Network {
bool dhcp6_use_address;
bool dhcp6_use_dns;
bool dhcp6_use_dns_set;
+ bool dhcp6_use_fqdn;
bool dhcp6_use_ntp;
bool dhcp6_use_ntp_set;
bool dhcp6_rapid_commit;
diff --git a/test/fuzz/fuzz-network-parser/directives.network b/test/fuzz/fuzz-network-parser/directives.network
index 1c4f338ad09..51dd56ade92 100644
--- a/test/fuzz/fuzz-network-parser/directives.network
+++ b/test/fuzz/fuzz-network-parser/directives.network
@@ -127,6 +127,7 @@ FallbackLeaseLifetimeSec=
UseAddress=
UseNTP=
UseDNS=
+UseFQDN=
RapidCommit=
ForceDHCPv6PDOtherInformation=
PrefixDelegationHint=