From: Yu Watanabe Date: Wed, 20 Oct 2021 20:47:16 +0000 (+0900) Subject: network: dhcp6pd: not necessary to drop routes when Assign=yes X-Git-Tag: v250-rc1~439^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=796273775c917b3e987abcdcb0eaa2b2f031dd8d;p=thirdparty%2Fsystemd.git network: dhcp6pd: not necessary to drop routes when Assign=yes --- diff --git a/src/network/networkd-dhcp6.c b/src/network/networkd-dhcp6.c index 10a4496d480..b0ce0187f63 100644 --- a/src/network/networkd-dhcp6.c +++ b/src/network/networkd-dhcp6.c @@ -150,8 +150,6 @@ static int dhcp6_pd_get_assigned_prefix(Link *link, const struct in6_addr *pd_pr } int dhcp6_pd_remove(Link *link, bool only_marked) { - Address *address; - Route *route; int k, r = 0; assert(link); @@ -163,45 +161,51 @@ int dhcp6_pd_remove(Link *link, bool only_marked) { if (!only_marked) link->dhcp6_pd_configured = false; - SET_FOREACH(route, link->routes) { - if (route->source != NETWORK_CONFIG_SOURCE_DHCP6PD) - continue; - if (only_marked && !route_is_marked(route)) - continue; + if (!link->network->dhcp6_pd_assign) { + Route *route; - if (link->radv) - (void) sd_radv_remove_prefix(link->radv, &route->dst.in6, 64); + SET_FOREACH(route, link->routes) { + if (route->source != NETWORK_CONFIG_SOURCE_DHCP6PD) + continue; + if (only_marked && !route_is_marked(route)) + continue; - link_remove_dhcp6_pd_prefix(link, &route->dst.in6); + if (link->radv) + (void) sd_radv_remove_prefix(link->radv, &route->dst.in6, 64); - k = route_remove(route); - if (k < 0) - r = k; + link_remove_dhcp6_pd_prefix(link, &route->dst.in6); - route_cancel_request(route); - } + k = route_remove(route); + if (k < 0) + r = k; - SET_FOREACH(address, link->addresses) { - struct in6_addr prefix; + route_cancel_request(route); + } + } else { + Address *address; - if (address->source != NETWORK_CONFIG_SOURCE_DHCP6PD) - continue; - if (only_marked && !address_is_marked(address)) - continue; + SET_FOREACH(address, link->addresses) { + struct in6_addr prefix; + + if (address->source != NETWORK_CONFIG_SOURCE_DHCP6PD) + continue; + if (only_marked && !address_is_marked(address)) + continue; - prefix = address->in_addr.in6; - in6_addr_mask(&prefix, 64); + prefix = address->in_addr.in6; + in6_addr_mask(&prefix, 64); - if (link->radv) - (void) sd_radv_remove_prefix(link->radv, &prefix, 64); + if (link->radv) + (void) sd_radv_remove_prefix(link->radv, &prefix, 64); - link_remove_dhcp6_pd_prefix(link, &prefix); + link_remove_dhcp6_pd_prefix(link, &prefix); - k = address_remove(address); - if (k < 0) - r = k; + k = address_remove(address); + if (k < 0) + r = k; - address_cancel_request(address); + address_cancel_request(address); + } } return r;