changeset 4483:e2f5a58c978a draft

FreeBSD: Fix fetching the IPv6 address lifetime FreeBSD it seems sensibly uses a monotonic clock for IPv6 lifetimes but the others use the wall clock.
author Roy Marples <roy@marples.name>
date Fri, 26 Apr 2019 11:27:25 +0100
parents c766946ba748
children 0f490b4cde2a
files src/if-bsd.c
diffstat 1 files changed, 6 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/if-bsd.c	Fri Apr 26 01:17:29 2019 +0100
+++ b/src/if-bsd.c	Fri Apr 26 11:27:25 2019 +0100
@@ -943,10 +943,15 @@
 	priv = (struct priv *)ia->iface->ctx->priv;
 	if (ioctl(priv->pf_inet6_fd, SIOCGIFALIFETIME_IN6, &ifr6) == -1)
 		return -1;
+	clock_gettime(CLOCK_MONOTONIC, &ia->created);
 
+#if defined(__FreeBSD__) || defined(__DragonFly__)
+	t = ia->created.tv_sec;
+#else
 	t = time(NULL);
+#endif
+
 	lifetime = &ifr6.ifr_ifru.ifru_lifetime;
-
 	if (lifetime->ia6t_preferred)
 		ia->prefix_pltime = (uint32_t)(lifetime->ia6t_preferred -
 		    MIN(t, lifetime->ia6t_preferred));
@@ -956,7 +961,6 @@
 		ia->prefix_vltime = (uint32_t)(lifetime->ia6t_expire -
 		    MIN(t, lifetime->ia6t_expire));
 		/* Calculate the created time */
-		clock_gettime(CLOCK_MONOTONIC, &ia->created);
 		ia->created.tv_sec -= lifetime->ia6t_vltime - ia->prefix_vltime;
 	} else
 		ia->prefix_vltime = ND6_INFINITE_LIFETIME;