summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2020-01-17 16:21:37 +0000
committerRoy Marples <roy@marples.name>2020-01-17 16:25:11 +0000
commit3eff5b959fff26e27deb140f79dd534e96fc3322 (patch)
tree8c3f05a32ff3c91ab7117d9be40262ff1d41ca91
parent8678cf30ce2004d9e8c82ea5709b56ac0eed9ff0 (diff)
downloaddhcpcd-3eff5b959fff26e27deb140f79dd534e96fc3322.tar.xz
inet6: Temporary addresses only work if prefix + ifidlen == 128
Cater for various prefix lengths when using temporay addresses.
-rw-r--r--src/if-linux.c3
-rw-r--r--src/ipv6.h3
-rw-r--r--src/ipv6nd.c3
3 files changed, 7 insertions, 2 deletions
diff --git a/src/if-linux.c b/src/if-linux.c
index 6719e487..aad2142b 100644
--- a/src/if-linux.c
+++ b/src/if-linux.c
@@ -1713,7 +1713,8 @@ if_address6(unsigned char cmd, const struct ipv6_addr *ia)
#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
diff --git a/src/ipv6.h b/src/ipv6.h
index a7dc50a9..047e4bef 100644
--- a/src/ipv6.h
+++ b/src/ipv6.h
@@ -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 && \
diff --git a/src/ipv6nd.c b/src/ipv6nd.c
index 798f23b7..55f8c993 100644
--- a/src/ipv6nd.c
+++ b/src/ipv6nd.c
@@ -1262,7 +1262,8 @@ ipv6nd_handlera(struct dhcpcd_ctx *ctx,
#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)