summaryrefslogtreecommitdiffstats
path: root/if-bsd.c
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2016-08-22 19:52:11 +0000
committerRoy Marples <roy@marples.name>2016-08-22 19:52:11 +0000
commitcb7faf7017666aa952c44755f269d799c1ed0d1b (patch)
tree500396cab7d534406297d05cdddcc52f04806c07 /if-bsd.c
parent23ff2cc6fb4154e6a8d7d9e7d6d668409e75f25c (diff)
downloaddhcpcd-cb7faf7017666aa952c44755f269d799c1ed0d1b.tar.xz
OpenBSD does not refresh address lifetimes on subsequent calls.
Luckily dhcpcd will expire the address regardless, so just se infinite lifetimes, except for privacy addresses. Fixes [277e6848da].
Diffstat (limited to 'if-bsd.c')
-rw-r--r--if-bsd.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/if-bsd.c b/if-bsd.c
index 70904f32..9f4f4ceb 100644
--- a/if-bsd.c
+++ b/if-bsd.c
@@ -973,7 +973,7 @@ if_address6(unsigned char cmd, const struct ipv6_addr *ia)
*/
#if !((defined(__NetBSD_Version__) && __NetBSD_Version__ >= 799003600) || \
- (defined(OpenBSD) && OpenBSD >= 201605))
+ (defined(__OpenBSD__)))
if (cmd == RTM_NEWADDR && !(ia->flags & IPV6_AF_ADDED)) {
ifa.ifra_lifetime.ia6t_vltime = ND6_INFINITE_LIFETIME;
ifa.ifra_lifetime.ia6t_pltime = ND6_INFINITE_LIFETIME;
@@ -981,8 +981,22 @@ if_address6(unsigned char cmd, const struct ipv6_addr *ia)
}
#endif
+#if defined(__OpenBSD__)
+ /* BUT OpenBSD does not reset the address lifetime
+ * for subsequent calls...
+ * Luckily dhcpcd will remove the lease when it expires so
+ * just set an infinite lifetime, unless a temporary address. */
+ if (ifa.ifra_flags & IN6_IFF_PRIVACY) {
+ ifa.ifra_lifetime.ia6t_vltime = ia->prefix_vltime;
+ ifa.ifra_lifetime.ia6t_pltime = ia->prefix_pltime;
+ } else {
+ ifa.ifra_lifetime.ia6t_vltime = ND6_INFINITE_LIFETIME;
+ ifa.ifra_lifetime.ia6t_pltime = ND6_INFINITE_LIFETIME;
+ }
+#else
ifa.ifra_lifetime.ia6t_vltime = ia->prefix_vltime;
ifa.ifra_lifetime.ia6t_pltime = ia->prefix_pltime;
+#endif
return ioctl(priv->pf_inet6_fd,
cmd == RTM_DELADDR ? SIOCDIFADDR_IN6 : SIOCAIFADDR_IN6, &ifa);