From d739fddeb5fcf09ea7430ca564bd6f264162ceda Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 16 Feb 2020 01:32:49 +0900 Subject: [PATCH] network: add setting to support RA without DHCPv6 client Closes #13991. --- man/systemd.network.xml | 8 ++++++++ src/network/networkd-ndisc.c | 3 ++- src/network/networkd-network-gperf.gperf | 1 + src/network/networkd-network.c | 1 + src/network/networkd-network.h | 1 + test/fuzz/fuzz-network-parser/directives.network | 1 + 6 files changed, 14 insertions(+), 1 deletion(-) diff --git a/man/systemd.network.xml b/man/systemd.network.xml index f2a96d97fb..c6fefd8da8 100644 --- a/man/systemd.network.xml +++ b/man/systemd.network.xml @@ -1776,6 +1776,14 @@ + + DHCPv6Client= + + Takes a boolean. When true (the default), the DHCPv6 client will be started when the + RA has the managed or other information flag. + + + diff --git a/src/network/networkd-ndisc.c b/src/network/networkd-ndisc.c index 90cd0c81ab..fe1de6387e 100644 --- a/src/network/networkd-ndisc.c +++ b/src/network/networkd-ndisc.c @@ -794,7 +794,8 @@ static int ndisc_router_handler(Link *link, sd_ndisc_router *rt) { if (r < 0) return log_link_warning_errno(link, r, "Failed to get RA flags: %m"); - if (flags & (ND_RA_FLAG_MANAGED | ND_RA_FLAG_OTHER)) { + if (flags & (ND_RA_FLAG_MANAGED | ND_RA_FLAG_OTHER) && + link->network->ipv6_accept_ra_start_dhcp6_client) { /* (re)start DHCPv6 client in stateful or stateless mode according to RA flags */ r = dhcp6_request_address(link, !(flags & ND_RA_FLAG_MANAGED)); if (r < 0 && r != -EBUSY) diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index 143ab276c4..c0e2479460 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -193,6 +193,7 @@ IPv6AcceptRA.UseAutonomousPrefix, config_parse_bool, 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) IPv6AcceptRA.UseDomains, config_parse_dhcp_use_domains, 0, offsetof(Network, ipv6_accept_ra_use_domains) +IPv6AcceptRA.DHCPv6Client, config_parse_bool, 0, offsetof(Network, ipv6_accept_ra_start_dhcp6_client) IPv6AcceptRA.RouteTable, config_parse_section_route_table, 0, 0 IPv6AcceptRA.BlackList, config_parse_ndisc_black_listed_prefix, 0, 0 DHCPServer.MaxLeaseTimeSec, config_parse_sec, 0, offsetof(Network, dhcp_server_max_lease_time_usec) diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 2e716b291e..066263c280 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -451,6 +451,7 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi .ipv6_accept_ra_use_onlink_prefix = true, .ipv6_accept_ra_route_table = RT_TABLE_MAIN, .ipv6_accept_ra_route_table_set = false, + .ipv6_accept_ra_start_dhcp6_client = true, .keep_configuration = _KEEP_CONFIGURATION_INVALID, diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h index c3be3d95f7..1e43635c54 100644 --- a/src/network/networkd-network.h +++ b/src/network/networkd-network.h @@ -214,6 +214,7 @@ struct Network { bool ipv6_accept_ra_use_dns; bool ipv6_accept_ra_use_autonomous_prefix; bool ipv6_accept_ra_use_onlink_prefix; + bool ipv6_accept_ra_start_dhcp6_client; bool active_slave; bool primary_slave; DHCPUseDomains ipv6_accept_ra_use_domains; diff --git a/test/fuzz/fuzz-network-parser/directives.network b/test/fuzz/fuzz-network-parser/directives.network index 3f517ac0c3..82d9787958 100644 --- a/test/fuzz/fuzz-network-parser/directives.network +++ b/test/fuzz/fuzz-network-parser/directives.network @@ -251,6 +251,7 @@ Prefix= UseDomains= RouteTable= UseDNS= +DHCPv6Client= UseAutonomousPrefix= UseOnLinkPrefix= BlackList=