changeset 2956:7f0f34ed67d8 draft

Support BSDs where userland is not allowed to set temporary addresses.
author Roy Marples <roy@marples.name>
date Mon, 23 Feb 2015 10:55:09 +0000
parents 17d1f58bc244
children 25dafd1a9960
files if-bsd.c if.h ipv6.c ipv6.h
diffstat 4 files changed, 19 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/if-bsd.c	Mon Feb 23 09:35:42 2015 +0000
+++ b/if-bsd.c	Mon Feb 23 10:55:09 2015 +0000
@@ -618,8 +618,10 @@
 	if (a->autoconf)
 		ifa.ifra_flags |= IN6_IFF_AUTOCONF;
 #endif
+#ifdef IPV6_MANGETEMPADDR
 	if (a->flags & IPV6_AF_TEMPORARY)
 		ifa.ifra_flags |= IN6_IFF_TEMPORARY;
+#endif
 
 #define ADDADDR(v, addr) {						      \
 		(v)->sin6_family = AF_INET6;				      \
@@ -1089,6 +1091,7 @@
 }
 #endif
 
+#ifdef IPV6_MANAGETEMPADDR
 #ifndef IPV6CTL_TEMPVLTIME
 #define get_inet6_sysctlbyname(code) inet6_sysctlbyname(code, 0, 0)
 #define set_inet6_sysctlbyname(code, val) inet6_sysctlbyname(code, val, 1)
@@ -1119,7 +1122,7 @@
 #else
 	val = get_inet6_sysctlbyname("net.inet6.ip6.use_tempaddr");
 #endif
-	return val == -1 ? TEMP_PREFERRED_LIFETIME : val;
+	return val == -1 ? 0 : val;
 }
 
 int
@@ -1147,6 +1150,7 @@
 #endif
 	return val < 0 ? TEMP_VALID_LIFETIME : val;
 }
+#endif
 
 #define del_if_nd6_flag(ifname, flag) if_nd6_flag(ifname, flag, -1)
 #define get_if_nd6_flag(ifname, flag) if_nd6_flag(ifname, flag,  0)
--- a/if.h	Mon Feb 23 09:35:42 2015 +0000
+++ b/if.h	Mon Feb 23 10:55:09 2015 +0000
@@ -125,9 +125,13 @@
 
 #ifdef INET6
 int if_checkipv6(struct dhcpcd_ctx *ctx, const struct interface *, int);
+#ifdef IPV6_MANAGETEMPADDR
 int ip6_use_tempaddr(const char *ifname);
 int ip6_temp_preferred_lifetime(const char *ifname);
 int ip6_temp_valid_lifetime(const char *ifname);
+#else
+#define ip6_use_tempaddr(a) (0)
+#endif
 
 int if_address6(const struct ipv6_addr *, int);
 #define if_addaddress6(a) if_address6(a, 1)
--- a/ipv6.c	Mon Feb 23 09:35:42 2015 +0000
+++ b/ipv6.c	Mon Feb 23 10:55:09 2015 +0000
@@ -984,8 +984,10 @@
 				    ap, next);
 			}
 			ap->addr_flags = flags;
+#ifdef IPV6_MANAGETEMPADDR
 			if (ap->addr_flags & IN6_IFF_TEMPORARY)
 				ap->flags |= IPV6_AF_TEMPORARY;
+#endif
 			if (IN6_IS_ADDR_LINKLOCAL(&ap->addr)) {
 #ifdef IPV6_POLLADDRFLAG
 				if (ap->addr_flags & IN6_IFF_TENTATIVE) {
--- a/ipv6.h	Mon Feb 23 09:35:42 2015 +0000
+++ b/ipv6.h	Mon Feb 23 10:55:09 2015 +0000
@@ -88,7 +88,12 @@
 /* Linux-3.18 can manage temporary addresses even with RA
  * processing disabled. */
 //#undef IFA_F_MANAGETEMPADDR
-#ifndef IFA_F_MANAGETEMPADDR
+#if defined(__linux__) && defined(IFA_F_MANAGETEMPADDR)
+#define IPV6_MANAGETEMPADDR
+#endif
+
+/* Some BSDs do not allow userlan to set temporary addresses. */
+#if defined(BSD) && defined(IN6_IFF_TEMPORARY)
 #define IPV6_MANAGETEMPADDR
 #endif
 
@@ -130,7 +135,9 @@
 #define IPV6_AF_DELEGATEDPFX	0x0100
 #define IPV6_AF_DELEGATEDZERO	0x0200
 #define IPV6_AF_REQUEST		0x0400
+#ifdef IPV6_MANAGETEMPADDR
 #define IPV6_AF_TEMPORARY	0X0800
+#endif
 
 struct rt6 {
 	TAILQ_ENTRY(rt6) next;