changeset 4977:eeebfa2bcda5 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 24da8e4ccf61
children 5c71961f3015
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 13:22:57 2020 +0000
+++ b/src/if-linux.c	Fri Jan 17 16:21:37 2020 +0000
@@ -1713,7 +1713,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 13:22:57 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 13:22:57 2020 +0000
+++ b/src/ipv6nd.c	Fri Jan 17 16:21:37 2020 +0000
@@ -1262,7 +1262,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)