From: Roy Marples Date: Wed, 29 Apr 2020 21:41:35 +0000 (+0100) Subject: inet6: Mark temp addrs for regen X-Git-Tag: v9.1.0~99 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=756049bc78b4345afe35005587eace51dec689c4;p=thirdparty%2Fdhcpcd.git 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. --- 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 {