diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-12-05 05:03:09 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-12-06 21:30:57 +0900 |
commit | da10d2d5846963ed8ce2e9db4d1c4e57e3d80705 (patch) | |
tree | fe03bb098bd09f8ea55c33d0b5b9a7f0dc9dfcd2 /src/network/networkd-dhcp-prefix-delegation.c | |
parent | 95eb38c8d0df10b100d37e3be24a7eaf75b76adc (diff) | |
download | systemd-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.c | 20 |
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); } |