diff --git a/man/systemd.network.xml b/man/systemd.network.xml index 01297c397f..cdb6f4eb87 100644 --- a/man/systemd.network.xml +++ b/man/systemd.network.xml @@ -2063,6 +2063,19 @@ Table=1234 + + UseDelegatedPrefix= + + When true (the default), the client will request the DHCPv6 server to delegate + prefixes. If the server provides prefixes to be delegated, then subnets of the prefixes are + assigned to the interfaces which enables DHCPv6PrefixDelegation=. + See also DHCPv6PrefixDelegation= in [Network] section, + [DHCPv6PrefixDelegation] section, and + RFC 8415. + + + + RouteMetric= UseDNS= diff --git a/src/network/networkd-dhcp6.c b/src/network/networkd-dhcp6.c index 76f4833b4c..1deaed1347 100644 --- a/src/network/networkd-dhcp6.c +++ b/src/network/networkd-dhcp6.c @@ -1423,25 +1423,6 @@ static int dhcp6_set_hostname(sd_dhcp6_client *client, Link *link) { return 0; } -static bool dhcp6_enable_prefix_delegation(Link *dhcp6_link) { - Link *link; - - assert(dhcp6_link); - assert(dhcp6_link->manager); - - HASHMAP_FOREACH(link, dhcp6_link->manager->links_by_index) { - if (link == dhcp6_link) - continue; - - if (!link_dhcp6_pd_is_enabled(link)) - continue; - - return true; - } - - return false; -} - static int dhcp6_set_identifier(Link *link, sd_dhcp6_client *client) { const DUID *duid; int r; @@ -1559,11 +1540,10 @@ static int dhcp6_configure(Link *link) { if (r < 0) return log_link_debug_errno(link, r, "DHCPv6 CLIENT: Failed to set callback: %m"); - if (dhcp6_enable_prefix_delegation(link)) { - r = sd_dhcp6_client_set_prefix_delegation(client, true); - if (r < 0) - return log_link_debug_errno(link, r, "DHCPv6 CLIENT: Failed to set prefix delegation: %m"); - } + r = sd_dhcp6_client_set_prefix_delegation(client, link->network->dhcp6_use_pd_prefix); + if (r < 0) + return log_link_debug_errno(link, r, "DHCPv6 CLIENT: Failed to %s prefix delegation: %m", + enable_disable(link->network->dhcp6_use_pd_prefix)); if (link->network->dhcp6_pd_prefix_length > 0) { r = sd_dhcp6_client_set_prefix_delegation_hint(client, diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index a6415c2311..758aa8ee19 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -238,6 +238,7 @@ DHCPv4.SendVendorOption, config_parse_dhcp_send_option, DHCPv4.RouteMTUBytes, config_parse_mtu, AF_INET, offsetof(Network, dhcp_route_mtu) DHCPv4.FallbackLeaseLifetimeSec, config_parse_dhcp_fallback_lease_lifetime, 0, 0 DHCPv6.UseAddress, config_parse_bool, 0, offsetof(Network, dhcp6_use_address) +DHCPv6.UseDelegatedPrefix, config_parse_bool, 0, offsetof(Network, dhcp6_use_pd_prefix) DHCPv6.UseDNS, config_parse_dhcp_use_dns, AF_INET6, 0 DHCPv6.UseHostname, config_parse_bool, 0, offsetof(Network, dhcp6_use_hostname) DHCPv6.UseDomains, config_parse_dhcp_use_domains, AF_INET6, 0 diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 3b8e508ee8..be3c087c8a 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -400,6 +400,7 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi .dhcp_broadcast = -1, .dhcp6_use_address = true, + .dhcp6_use_pd_prefix = true, .dhcp6_use_dns = true, .dhcp6_use_hostname = true, .dhcp6_use_ntp = true, diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h index b23f70b356..dd9804ea2d 100644 --- a/src/network/networkd-network.h +++ b/src/network/networkd-network.h @@ -169,6 +169,7 @@ struct Network { /* DHCPv6 Client support */ bool dhcp6_use_address; + bool dhcp6_use_pd_prefix; bool dhcp6_use_dns; bool dhcp6_use_dns_set; bool dhcp6_use_hostname; diff --git a/test/fuzz/fuzz-network-parser/directives.network b/test/fuzz/fuzz-network-parser/directives.network index ea02d4c640..dae13a243c 100644 --- a/test/fuzz/fuzz-network-parser/directives.network +++ b/test/fuzz/fuzz-network-parser/directives.network @@ -130,6 +130,7 @@ RouteMTUBytes= FallbackLeaseLifetimeSec= [DHCPv6] UseAddress= +UseDelegatedPrefix= UseNTP= UseDNS= UseHostname=