]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
inet6: Temporary addresses only work if prefix + ifidlen == 128
authorRoy Marples <roy@marples.name>
Fri, 17 Jan 2020 16:21:37 +0000 (16:21 +0000)
committerRoy Marples <roy@marples.name>
Fri, 17 Jan 2020 16:25:11 +0000 (16:25 +0000)
Cater for various prefix lengths when using temporay addresses.

src/if-linux.c
src/ipv6.h
src/ipv6nd.c

index 6719e48771fdf1dd24e6146a7715889aa0f71f3d..aad2142b92197c55c346494b006cdabf7367121d 100644 (file)
@@ -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
index a7dc50a97031e1caaddd28f7ff6ff2bc356ef268..047e4bef76a38883d3a0ddc189af4058737489ff 100644 (file)
@@ -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 && \
index 798f23b7449e9809bb05e110d075b5d5bbbbf8e7..55f8c993f0437c5da903731ce85da718ab6b901f 100644 (file)
@@ -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)