diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2021-07-03 09:17:29 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-03 09:17:29 +0200 |
commit | 5f9fa7a5f3eca3c1464cbc93e3508c777da14935 (patch) | |
tree | fe54c6b95a839c465d4bea8e86eee85aaa4fa06d | |
parent | 107e21635bb59a01bc92dda05211b03a7d40bde6 (diff) | |
parent | 899034ba8167bd16e802cfbea29a9ee85dee5be5 (diff) | |
download | systemd-5f9fa7a5f3eca3c1464cbc93e3508c777da14935.tar.gz |
Merge pull request #20108 from yuwata/network-fix-ndisc-and-dhcp6-issue-20050
network: remove old addresses and routes after new ones are configured
-rw-r--r-- | src/network/networkd-dhcp6.c | 4 | ||||
-rw-r--r-- | src/network/networkd-link.c | 3 | ||||
-rw-r--r-- | src/network/networkd-ndisc.c | 13 |
3 files changed, 12 insertions, 8 deletions
diff --git a/src/network/networkd-dhcp6.c b/src/network/networkd-dhcp6.c index e850e595e3..2b72b618fc 100644 --- a/src/network/networkd-dhcp6.c +++ b/src/network/networkd-dhcp6.c @@ -145,7 +145,7 @@ static int dhcp6_pd_remove_old(Link *link, bool force) { assert(link); assert(link->manager); - if (!force && (link->dhcp6_pd_address_messages != 0 || link->dhcp6_pd_route_messages != 0)) + if (!force && (link->dhcp6_pd_address_messages > 0 || link->dhcp6_pd_route_messages > 0)) return 0; if (set_isempty(link->dhcp6_pd_addresses_old) && set_isempty(link->dhcp6_pd_routes_old)) @@ -740,7 +740,7 @@ static int dhcp6_remove_old(Link *link, bool force) { assert(link); - if (!force && (!link->dhcp6_address_configured || !link->dhcp6_route_configured)) + if (!force && (link->dhcp6_address_messages > 0 || link->dhcp6_route_messages > 0)) return 0; if (set_isempty(link->dhcp6_addresses_old) && set_isempty(link->dhcp6_routes_old)) diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index a939f55731..c1ab14ebec 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -519,7 +519,8 @@ void link_check_ready(Link *link) { /* When DHCP[46], NDisc, or IPv4LL is enabled, at least one protocol must be finished. */ return (void) log_link_debug(link, "%s(): dynamic addresses or routes are not configured.", __func__); - log_link_debug(link, "%s(): dhcp4:%s ipv4ll:%s dhcp6_addresses:%s dhcp_routes:%s dhcp_pd_addresses:%s dhcp_pd_routes:%s ndisc_addresses:%s ndisc_routes:%s", + log_link_debug(link, "%s(): dhcp4:%s ipv4ll:%s dhcp6_addresses:%s dhcp6_routes:%s " + "dhcp6_pd_addresses:%s dhcp6_pd_routes:%s ndisc_addresses:%s ndisc_routes:%s", __func__, yes_no(link->dhcp4_configured), yes_no(link->ipv4ll_address_configured), diff --git a/src/network/networkd-ndisc.c b/src/network/networkd-ndisc.c index 444147c305..efc4707855 100644 --- a/src/network/networkd-ndisc.c +++ b/src/network/networkd-ndisc.c @@ -128,9 +128,6 @@ static int ndisc_remove_old_one(Link *link, const struct in6_addr *router, bool if (!force) { bool set_callback = false; - if (!link->ndisc_addresses_configured || !link->ndisc_routes_configured) - return 0; - SET_FOREACH(na, link->ndisc_addresses) if (!na->marked && in6_addr_equal(&na->router, router)) { set_callback = true; @@ -212,6 +209,10 @@ static int ndisc_remove_old(Link *link) { assert(link); + if (link->ndisc_addresses_messages > 0 || + link->ndisc_routes_messages > 0) + return 0; + routers = set_new(&in6_addr_hash_ops); if (!routers) return -ENOMEM; @@ -818,8 +819,10 @@ static int ndisc_router_process_autonomous_prefix(Link *link, sd_ndisc_router *r r = address_get(link, address, &e); if (r > 0) { /* If the address is already assigned, but not valid anymore, then refuse to - * update the address. */ - if (e->cinfo.tstamp / 100 + e->cinfo.ifa_valid < time_now / USEC_PER_SEC) + * update the address, and it will be removed. */ + if (e->cinfo.ifa_valid != CACHE_INFO_INFINITY_LIFE_TIME && + usec_add(e->cinfo.tstamp / 100 * USEC_PER_SEC, + e->cinfo.ifa_valid * USEC_PER_SEC) < time_now) continue; } |