diff options
| author | Roy Marples <roy@marples.name> | 2020-04-29 22:41:35 +0100 |
|---|---|---|
| committer | Roy Marples <roy@marples.name> | 2020-04-29 22:41:35 +0100 |
| commit | 257dae21343e899ad2667aac9b981fa427b7541b (patch) | |
| tree | 95c0e18d10395d06d5dea947d930919d69d2a2ab /src | |
| parent | 787d42df9d4cbddc1acd771fd86833f0cbce0ede (diff) | |
| download | dhcpcd-257dae21343e899ad2667aac9b981fa427b7541b.tar.xz | |
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.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ipv6.c | 12 | ||||
| -rw-r--r-- | src/ipv6.h | 3 |
2 files changed, 14 insertions, 1 deletions
@@ -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 */ @@ -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 { |
