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=