network: drop static prefixes and static route prefixes earlier if IPv6PrefixDelegation=no or dhcpv6

This commit is contained in:
Yu Watanabe 2020-10-16 15:48:50 +09:00
parent db5756f3f3
commit 8a08bbfc98
2 changed files with 39 additions and 42 deletions

View file

@ -980,6 +980,7 @@ static int static_address_configure(const Address *address, Link *link, bool upd
int link_set_addresses(Link *link) {
Address *ad;
Prefix *p;
int r;
assert(link);
@ -1000,32 +1001,28 @@ int link_set_addresses(Link *link) {
return r;
}
if (link->network->router_prefix_delegation & RADV_PREFIX_DELEGATION_STATIC) {
Prefix *p;
HASHMAP_FOREACH(p, link->network->prefixes_by_section) {
_cleanup_(address_freep) Address *address = NULL;
HASHMAP_FOREACH(p, link->network->prefixes_by_section) {
_cleanup_(address_freep) Address *address = NULL;
if (!p->assign)
continue;
if (!p->assign)
continue;
r = address_new(&address);
if (r < 0)
return log_oom();
r = address_new(&address);
if (r < 0)
return log_oom();
r = sd_radv_prefix_get_prefix(p->radv_prefix, &address->in_addr.in6, &address->prefixlen);
if (r < 0)
return log_link_warning_errno(link, r, "Could not get RA prefix: %m");
r = sd_radv_prefix_get_prefix(p->radv_prefix, &address->in_addr.in6, &address->prefixlen);
if (r < 0)
return log_link_warning_errno(link, r, "Could not get RA prefix: %m");
r = generate_ipv6_eui_64_address(link, &address->in_addr.in6);
if (r < 0)
return log_link_warning_errno(link, r, "Could not generate EUI64 address: %m");
r = generate_ipv6_eui_64_address(link, &address->in_addr.in6);
if (r < 0)
return log_link_warning_errno(link, r, "Could not generate EUI64 address: %m");
address->family = AF_INET6;
r = static_address_configure(address, link, true);
if (r < 0)
return r;
}
address->family = AF_INET6;
r = static_address_configure(address, link, true);
if (r < 0)
return r;
}
if (link->address_messages == 0) {

View file

@ -195,6 +195,9 @@ void network_adjust_radv(Network *network) {
network->n_router_dns = 0;
network->router_dns = mfree(network->router_dns);
network->router_search_domains = ordered_set_free(network->router_search_domains);
}
if (!FLAGS_SET(network->router_prefix_delegation, RADV_PREFIX_DELEGATION_STATIC)) {
network->prefixes_by_section = hashmap_free_with_destructor(network->prefixes_by_section, prefix_free);
network->route_prefixes_by_section = hashmap_free_with_destructor(network->route_prefixes_by_section, route_prefix_free);
}
@ -632,6 +635,8 @@ static bool link_radv_enabled(Link *link) {
}
int radv_configure(Link *link) {
RoutePrefix *q;
Prefix *p;
int r;
assert(link);
@ -678,29 +683,24 @@ int radv_configure(Link *link) {
return r;
}
if (link->network->router_prefix_delegation & RADV_PREFIX_DELEGATION_STATIC) {
RoutePrefix *q;
Prefix *p;
HASHMAP_FOREACH(p, link->network->prefixes_by_section) {
r = sd_radv_add_prefix(link->radv, p->radv_prefix, false);
if (r == -EEXIST)
continue;
if (r == -ENOEXEC) {
log_link_warning_errno(link, r, "[IPv6Prefix] section configured without Prefix= setting, ignoring section.");
continue;
}
if (r < 0)
return r;
HASHMAP_FOREACH(p, link->network->prefixes_by_section) {
r = sd_radv_add_prefix(link->radv, p->radv_prefix, false);
if (r == -EEXIST)
continue;
if (r == -ENOEXEC) {
log_link_warning_errno(link, r, "[IPv6Prefix] section configured without Prefix= setting, ignoring section.");
continue;
}
if (r < 0)
return r;
}
HASHMAP_FOREACH(q, link->network->route_prefixes_by_section) {
r = sd_radv_add_route_prefix(link->radv, q->radv_route_prefix, false);
if (r == -EEXIST)
continue;
if (r < 0)
return r;
}
HASHMAP_FOREACH(q, link->network->route_prefixes_by_section) {
r = sd_radv_add_route_prefix(link->radv, q->radv_route_prefix, false);
if (r == -EEXIST)
continue;
if (r < 0)
return r;
}
return 0;