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; \
}
#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)
#else
val = get_inet6_sysctlbyname("net.inet6.ip6.use_tempaddr");
#endif
- return val == -1 ? TEMP_PREFERRED_LIFETIME : val;
+ return val == -1 ? 0 : val;
}
int
#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)
#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)
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) {
/* 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
#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;