network/ndisc: drop outdated PREF64 prefixes

Follow-up for 6e8f5e4c1f.

Addresses https://github.com/systemd/systemd/pull/29009#issuecomment-1705741844.
This commit is contained in:
Yu Watanabe 2023-09-06 00:44:42 +09:00
parent 6c22badfce
commit fabea9c092

View file

@ -1134,6 +1134,7 @@ static int ndisc_drop_outdated(Link *link, usec_t timestamp_usec) {
NDiscDNSSL *dnssl;
NDiscRDNSS *rdnss;
NDiscCaptivePortal *cp;
NDiscPREF64 *p64;
Address *address;
Route *route;
int r = 0, k;
@ -1194,6 +1195,15 @@ static int ndisc_drop_outdated(Link *link, usec_t timestamp_usec) {
updated = true;
}
SET_FOREACH(p64, link->ndisc_pref64) {
if (p64->lifetime_usec >= timestamp_usec)
continue; /* the pref64 prefix is still valid */
free(set_remove(link->ndisc_pref64, p64));
/* The pref64 prefix is not exported through the state file, hence it is not necessary to set
* the 'updated' flag. */
}
if (updated)
link_dirty(link);
@ -1220,6 +1230,7 @@ static int ndisc_setup_expire(Link *link) {
NDiscCaptivePortal *cp;
NDiscDNSSL *dnssl;
NDiscRDNSS *rdnss;
NDiscPREF64 *p64;
Address *address;
Route *route;
int r;
@ -1256,6 +1267,9 @@ static int ndisc_setup_expire(Link *link) {
SET_FOREACH(cp, link->ndisc_captive_portals)
lifetime_usec = MIN(lifetime_usec, cp->lifetime_usec);
SET_FOREACH(p64, link->ndisc_pref64)
lifetime_usec = MIN(lifetime_usec, p64->lifetime_usec);
if (lifetime_usec == USEC_INFINITY)
return 0;