summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2021-07-03 09:17:29 +0200
committerGitHub <noreply@github.com>2021-07-03 09:17:29 +0200
commit5f9fa7a5f3eca3c1464cbc93e3508c777da14935 (patch)
treefe54c6b95a839c465d4bea8e86eee85aaa4fa06d
parent107e21635bb59a01bc92dda05211b03a7d40bde6 (diff)
parent899034ba8167bd16e802cfbea29a9ee85dee5be5 (diff)
downloadsystemd-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.c4
-rw-r--r--src/network/networkd-link.c3
-rw-r--r--src/network/networkd-ndisc.c13
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;
}