]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
Fix IPv6 DAD on OpenBSD.
authorRoy Marples <roy@marples.name>
Wed, 23 Nov 2016 21:05:16 +0000 (21:05 +0000)
committerRoy Marples <roy@marples.name>
Wed, 23 Nov 2016 21:05:16 +0000 (21:05 +0000)
if-bsd.c
ipv6.c
ipv6.h

index 0e033d1793478adeca21b52b9732d1f8fcb75529..d9910a5648551b13d740d804852bd2e1992257a4 100644 (file)
--- a/if-bsd.c
+++ b/if-bsd.c
@@ -1345,23 +1345,24 @@ inet6_sysctl(int code, int val, int action)
 #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)
+#if !defined(IPV6CTL_TEMPVLTIME)
 static int
-inet6_sysctlbyname(const char *name, int val, int action)
+get_sysctlbyname(const char *name)
 {
+#ifdef __OpenBSD__
+       /* OpenBSD seems to have it enabled by default .... */
+
+       UNUSED(name);
+       return -1;
+#else
+       int val;
        size_t size;
 
        size = sizeof(val);
-       if (action) {
-               if (sysctlbyname(name, NULL, 0, &val, size) == -1)
-                       return -1;
-               return 0;
-       }
        if (sysctlbyname(name, &val, &size, NULL, 0) == -1)
                return -1;
        return val;
+#endif
 }
 #endif
 
@@ -1373,7 +1374,7 @@ ip6_use_tempaddr(__unused const char *ifname)
 #ifdef IPV6CTL_USETEMPADDR
        val = get_inet6_sysctl(IPV6CTL_USETEMPADDR);
 #else
-       val = get_inet6_sysctlbyname("net.inet6.ip6.use_tempaddr");
+       val = get_sysctlbyname("net.inet6.ip6.use_tempaddr");
 #endif
        return val == -1 ? 0 : val;
 }
@@ -1386,7 +1387,7 @@ ip6_temp_preferred_lifetime(__unused const char *ifname)
 #ifdef IPV6CTL_TEMPPLTIME
        val = get_inet6_sysctl(IPV6CTL_TEMPPLTIME);
 #else
-       val = get_inet6_sysctlbyname("net.inet6.ip6.temppltime");
+       val = get_sysctlbyname("net.inet6.ip6.temppltime");
 #endif
        return val < 0 ? TEMP_PREFERRED_LIFETIME : val;
 }
@@ -1399,7 +1400,7 @@ ip6_temp_valid_lifetime(__unused const char *ifname)
 #ifdef IPV6CTL_TEMPVLTIME
        val = get_inet6_sysctl(IPV6CTL_TEMPVLTIME);
 #else
-       val = get_inet6_sysctlbyname("net.inet6.ip6.tempvltime");
+       val = get_sysctlbyname("net.inet6.ip6.tempvltime");
 #endif
        return val < 0 ? TEMP_VALID_LIFETIME : val;
 }
diff --git a/ipv6.c b/ipv6.c
index c51a1efb5f5e32c2e1876b776689a1a892874355..95665f4edb127548787337f981275c4c0dfc6d60 100644 (file)
--- a/ipv6.c
+++ b/ipv6.c
@@ -566,7 +566,7 @@ ipv6_checkaddrflags(void *arg)
                return;
        }
 
-       if (!(ia->addr_flags & IN6_IFF_TENTATIVE)) {
+       if (!(flags & IN6_IFF_TENTATIVE)) {
                /* Simulate the kernel announcing the new address. */
                ipv6_handleifa(ia->iface->ctx, RTM_NEWADDR,
                    ia->iface->ctx->ifaces, ia->iface->name,
diff --git a/ipv6.h b/ipv6.h
index 11a389687c9d7b91486b1456cb1c80c609a5c903..9efd019fb8384bccae5535d1b40184bc354b3da7 100644 (file)
--- a/ipv6.h
+++ b/ipv6.h
  * Some BSDs do not allow userland to set temporary addresses.
  * Linux-3.18 allows the marking of addresses from which to manage temp addrs.
  */
-#if defined(BSD) && defined(IN6_IFF_TEMPORARY)
-#define IPV6_MANAGETEMPADDR
+#if defined(BSD)
+#  if !defined(IN6_IFF_TEMPORARY) && defined(IN6_IFF_PRIVACY)
+     /* OpenBSD just has to be different... */
+#    define IN6_IFF_TEMPORARY  IN6_IFF_PRIVACY
+#  endif
+#  if defined(IN6_IFF_TEMPORARY)
+#    define IPV6_MANAGETEMPADDR
+#  endif
 #endif
 
 /*