Mercurial > hg > dhcpcd
changeset 4978:ab1d8e03721c draft
inet6: Temporary addresses only work if prefix + ifidlen == 128
Cater for various prefix lengths when using temporay addresses.
| author | Roy Marples <roy@marples.name> |
|---|---|
| date | Fri, 17 Jan 2020 16:21:37 +0000 |
| parents | 22f0a8a41013 |
| children | 326cb725999e |
| files | src/if-linux.c src/ipv6.h src/ipv6nd.c |
| diffstat | 3 files changed, 7 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/if-linux.c Fri Jan 17 14:02:59 2020 +0000 +++ b/src/if-linux.c Fri Jan 17 16:21:37 2020 +0000 @@ -1802,7 +1802,8 @@ #endif } #elif IFA_F_MANAGETEMPADDR - if (ia->flags & IPV6_AF_AUTOCONF) + if (ia->flags & IPV6_AF_AUTOCONF && + ipv6_ifidlen(ia->iface) + ia->prefix_len == 128) flags |= IFA_F_MANAGETEMPADDR; #endif #ifdef IFA_F_NOPREFIXROUTE
--- a/src/ipv6.h Fri Jan 17 14:02:59 2020 +0000 +++ b/src/ipv6.h Fri Jan 17 16:21:37 2020 +0000 @@ -67,6 +67,9 @@ #define IDGEN_RETRIES 3 #define IDGEN_DELAY 1 /* second */ +/* Interface identifier length. Prefix + this == 128 for autoconf */ +#define ipv6_ifidlen(ifp) 64 + #ifndef IN6_ARE_MASKED_ADDR_EQUAL #define IN6_ARE_MASKED_ADDR_EQUAL(d, a, m) ( \ (((d)->s6_addr32[0] ^ (a)->s6_addr32[0]) & (m)->s6_addr32[0]) == 0 && \
--- a/src/ipv6nd.c Fri Jan 17 14:02:59 2020 +0000 +++ b/src/ipv6nd.c Fri Jan 17 16:21:37 2020 +0000 @@ -1280,7 +1280,8 @@ #ifdef IPV6_MANAGETEMPADDR /* RFC4941 Section 3.3.3 */ if (ap->flags & IPV6_AF_AUTOCONF && - ip6_use_tempaddr(ap->iface->name)) + ip6_use_tempaddr(ap->iface->name) && + ipv6_ifidlen(ap->iface) + ap->prefix_len == 128) { if (!new_ap) { if (ipv6_settemptime(ap, 1) == NULL)
