summaryrefslogtreecommitdiff
path: root/src/network/networkd-dhcp-prefix-delegation.c
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2021-12-05 05:03:09 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2021-12-06 21:30:57 +0900
commitda10d2d5846963ed8ce2e9db4d1c4e57e3d80705 (patch)
treefe03bb098bd09f8ea55c33d0b5b9a7f0dc9dfcd2 /src/network/networkd-dhcp-prefix-delegation.c
parent95eb38c8d0df10b100d37e3be24a7eaf75b76adc (diff)
downloadsystemd-da10d2d5846963ed8ce2e9db4d1c4e57e3d80705.tar.gz
network: dhcp6pd: drop unreachable routes when lease lost
Diffstat (limited to 'src/network/networkd-dhcp-prefix-delegation.c')
-rw-r--r--src/network/networkd-dhcp-prefix-delegation.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/network/networkd-dhcp-prefix-delegation.c b/src/network/networkd-dhcp-prefix-delegation.c
index 2b2f787795..24bafb8b4a 100644
--- a/src/network/networkd-dhcp-prefix-delegation.c
+++ b/src/network/networkd-dhcp-prefix-delegation.c
@@ -655,6 +655,7 @@ static int dhcp6_pd_finalize(Link *link) {
}
void dhcp6_pd_prefix_lost(Link *dhcp6_link) {
+ Route *route;
Link *link;
int r;
@@ -670,6 +671,25 @@ void dhcp6_pd_prefix_lost(Link *dhcp6_link) {
link_enter_failed(link);
}
+ SET_FOREACH(route, dhcp6_link->manager->routes) {
+ if (route->source != NETWORK_CONFIG_SOURCE_DHCP6)
+ continue;
+ if (route->family != AF_INET6)
+ continue;
+ if (route->type != RTN_UNREACHABLE)
+ continue;
+ if (!set_contains(dhcp6_link->dhcp6_pd_prefixes,
+ &(struct in_addr_prefix) {
+ .family = AF_INET6,
+ .prefixlen = route->dst_prefixlen,
+ .address = route->dst }))
+ continue;
+
+ (void) route_remove(route);
+
+ route_cancel_request(route, dhcp6_link);
+ }
+
set_clear(dhcp6_link->dhcp6_pd_prefixes);
}