From 257dae21343e899ad2667aac9b981fa427b7541b Mon Sep 17 00:00:00 2001 From: Roy Marples Date: Wed, 29 Apr 2020 22:41:35 +0100 Subject: [PATCH] inet6: Mark temp addrs for regen This solves an infinite loop where new temp addrs regened are added at the tail and we loop endlessly. --- src/ipv6.c | 12 ++++++++++++ src/ipv6.h | 3 ++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/ipv6.c b/src/ipv6.c index c039e7e6..8ecdf622 100644 --- a/src/ipv6.c +++ b/src/ipv6.c @@ -2073,10 +2073,22 @@ ipv6_regentempaddrs(void *arg) ipv6_regen_desync(ifp, true); clock_gettime(CLOCK_MONOTONIC, &tv); + + /* Mark addresses for regen so we don't infinite loop. */ TAILQ_FOREACH(ia, &state->addrs, next) { if (ia->flags & IPV6_AF_TEMPORARY && !(ia->flags & IPV6_AF_STALE)) + ia->flags |= IPV6_AF_REGEN; + else + ia->flags &= ~IPV6_AF_REGEN; + } + + /* Now regen temp addrs */ + TAILQ_FOREACH(ia, &state->addrs, next) { + if (ia->flags & IPV6_AF_REGEN) { ipv6_regentempaddr0(ia, &tv); + ia->flags &= ~IPV6_AF_REGEN; + } } } #endif /* IPV6_MANAGETEMPADDR */ diff --git a/src/ipv6.h b/src/ipv6.h index 005735d7..b159827b 100644 --- a/src/ipv6.h +++ b/src/ipv6.h @@ -225,8 +225,9 @@ struct ipv6_addr { #define IPV6_AF_DELEGATEDLOG (1U << 11) #define IPV6_AF_RAPFX (1U << 12) #define IPV6_AF_EXTENDED (1U << 13) +#define IPV6_AF_REGEN (1U << 14) #ifdef IPV6_MANAGETEMPADDR -#define IPV6_AF_TEMPORARY (1U << 14) +#define IPV6_AF_TEMPORARY (1U << 15) #endif struct ll_callback { -- 2.47.2