From 4afd986753b1a8d50ea86d91732b32dff3e6e3e9 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 16 Oct 2020 16:00:49 +0900 Subject: [PATCH] network: introduce Announce= in [DHCPv6PrefixDelegation] When disabled, the delegated prefixes are not emit by RA. Closes #17353. --- src/network/networkd-dhcp6.c | 9 ++++++--- src/network/networkd-network-gperf.gperf | 1 + src/network/networkd-network.c | 3 ++- src/network/networkd-network.h | 1 + test/fuzz/fuzz-network-parser/directives.network | 1 + 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/network/networkd-dhcp6.c b/src/network/networkd-dhcp6.c index 81cf44b082..d9cc4ccf41 100644 --- a/src/network/networkd-dhcp6.c +++ b/src/network/networkd-dhcp6.c @@ -421,11 +421,14 @@ static int dhcp6_pd_assign_prefix(Link *link, const union in_addr_union *prefix, int r; assert(link); + assert(link->network); assert(prefix); - r = radv_add_prefix(link, &prefix->in6, prefix_len, lifetime_preferred, lifetime_valid); - if (r < 0) - return r; + if (link->network->dhcp6_pd_announce) { + r = radv_add_prefix(link, &prefix->in6, prefix_len, lifetime_preferred, lifetime_valid); + if (r < 0) + return r; + } r = dhcp6_set_pd_route(link, prefix, pd_prefix); if (r < 0) diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index cdf77391b0..d0ddd4c572 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -283,6 +283,7 @@ BridgeVLAN.PVID, config_parse_brvlan_pvid, BridgeVLAN.VLAN, config_parse_brvlan_vlan, 0, 0 BridgeVLAN.EgressUntagged, config_parse_brvlan_untagged, 0, 0 DHCPv6PrefixDelegation.SubnetId, config_parse_dhcp6_pd_subnet_id, 0, offsetof(Network, dhcp6_pd_subnet_id) +DHCPv6PrefixDelegation.Announce, config_parse_bool, 0, offsetof(Network, dhcp6_pd_announce) DHCPv6PrefixDelegation.Assign, config_parse_bool, 0, offsetof(Network, dhcp6_pd_assign) DHCPv6PrefixDelegation.Token, config_parse_dhcp6_pd_token, 0, offsetof(Network, dhcp6_pd_token) IPv6PrefixDelegation.RouterLifetimeSec, config_parse_sec, 0, offsetof(Network, router_lifetime_usec) diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 111a11ee0d..c72b56b2bb 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -368,8 +368,9 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi .dhcp6_use_dns = true, .dhcp6_pd = -1, - .dhcp6_pd_subnet_id = -1, + .dhcp6_pd_announce = true, .dhcp6_pd_assign = true, + .dhcp6_pd_subnet_id = -1, .dhcp_server_emit[SD_DHCP_LEASE_DNS].emit = true, .dhcp_server_emit[SD_DHCP_LEASE_NTP].emit = true, diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h index 5a8aca3133..2cf89857ba 100644 --- a/src/network/networkd-network.h +++ b/src/network/networkd-network.h @@ -202,6 +202,7 @@ struct Network { /* DHCPv6 Prefix Delegation support */ int dhcp6_pd; + bool dhcp6_pd_announce; bool dhcp6_pd_assign; int64_t dhcp6_pd_subnet_id; union in_addr_union dhcp6_pd_token; diff --git a/test/fuzz/fuzz-network-parser/directives.network b/test/fuzz/fuzz-network-parser/directives.network index 2a11156dbc..c187b1b2f8 100644 --- a/test/fuzz/fuzz-network-parser/directives.network +++ b/test/fuzz/fuzz-network-parser/directives.network @@ -137,6 +137,7 @@ SendVendorOption= RouteMetric= [DHCPv6PrefixDelegation] SubnetId= +Announce= Assign= Token= [Route]