From cd305af1fe8521357799971127a5a008fcb247d8 Mon Sep 17 00:00:00 2001 From: Susant Sahani Date: Sat, 15 Feb 2020 13:51:34 +0100 Subject: [PATCH] network: Allow DHCPv6 client to start without router's managed flag. --- man/systemd.network.xml | 8 ++++++++ src/network/networkd-link.c | 11 +++++++++++ src/network/networkd-network-gperf.gperf | 1 + src/network/networkd-network.h | 1 + test/fuzz/fuzz-network-parser/directives.network | 1 + 5 files changed, 22 insertions(+) diff --git a/man/systemd.network.xml b/man/systemd.network.xml index b73cff8ffec..f2a96d97fbd 100644 --- a/man/systemd.network.xml +++ b/man/systemd.network.xml @@ -1694,6 +1694,14 @@ a prefix-hint in the DHCPv6 solicitation. Prefix ranges 1-128. Defaults to unset. + + + WithoutRA= + + When true, DHCPv6 client starts without router advertisements's managed or other address configuration flag. + Defaults to false. + + diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index b46c8755487..bac80ade848 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -1553,6 +1553,17 @@ static int link_acquire_ipv6_conf(Link *link) { return log_link_warning_errno(link, r, "Could not start IPv6 Router Advertisement: %m"); } + if (link_dhcp6_enabled(link) && link->network->dhcp6_without_ra) { + assert(link->dhcp6_client); + assert(in_addr_is_link_local(AF_INET6, (const union in_addr_union*)&link->ipv6ll_address) > 0); + + r = dhcp6_request_address(link, true); + if (r < 0 && r != -EBUSY) + return log_link_warning_errno(link, r, "Could not acquire DHCPv6 lease: %m"); + else + log_link_debug(link, "Acquiring DHCPv6 lease"); + } + (void) dhcp6_request_prefix_delegation(link); return 0; diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index 8d7c657a1ab..143ab276c4d 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -188,6 +188,7 @@ DHCPv6.UseNTP, config_parse_bool, DHCPv6.RapidCommit, config_parse_bool, 0, offsetof(Network, rapid_commit) DHCPv6.ForceDHCPv6PDOtherInformation, config_parse_bool, 0, offsetof(Network, dhcp6_force_pd_other_information) DHCPv6.PrefixDelegationHint, config_parse_dhcp6_pd_hint, 0, 0 +DHCPv6.WithoutRA, config_parse_bool, 0, offsetof(Network, dhcp6_without_ra) IPv6AcceptRA.UseAutonomousPrefix, config_parse_bool, 0, offsetof(Network, ipv6_accept_ra_use_autonomous_prefix) IPv6AcceptRA.UseOnLinkPrefix, config_parse_bool, 0, offsetof(Network, ipv6_accept_ra_use_onlink_prefix) IPv6AcceptRA.UseDNS, config_parse_bool, 0, offsetof(Network, ipv6_accept_ra_use_dns) diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h index 266e40cef51..c3be3d95f77 100644 --- a/src/network/networkd-network.h +++ b/src/network/networkd-network.h @@ -126,6 +126,7 @@ struct Network { /* DHCPv6 Client support*/ bool dhcp6_use_dns; bool dhcp6_use_ntp; + bool dhcp6_without_ra; uint8_t dhcp6_pd_length; struct in6_addr dhcp6_pd_address; diff --git a/test/fuzz/fuzz-network-parser/directives.network b/test/fuzz/fuzz-network-parser/directives.network index ea872cd7e24..3f517ac0c35 100644 --- a/test/fuzz/fuzz-network-parser/directives.network +++ b/test/fuzz/fuzz-network-parser/directives.network @@ -107,6 +107,7 @@ UseDNS= RapidCommit= ForceDHCPv6PDOtherInformation= PrefixDelegationHint= +WithoutRA= [Route] Destination= Protocol= -- 2.39.5