summaryrefslogtreecommitdiffstats
path: root/src/if-bsd.c
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2019-04-26 11:27:25 +0100
committerRoy Marples <roy@marples.name>2019-04-26 11:27:25 +0100
commitdfd10c6e9f0ece8f26c0f8e895c5979bbd93ec3a (patch)
tree3a3800411f71a69e665b5a4b765b481507ff5506 /src/if-bsd.c
parent986c73fa386e30120459096146b712a6636a561f (diff)
downloaddhcpcd-dfd10c6e9f0ece8f26c0f8e895c5979bbd93ec3a.tar.xz
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.
Diffstat (limited to 'src/if-bsd.c')
-rw-r--r--src/if-bsd.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/if-bsd.c b/src/if-bsd.c
index 00d00bdc..20467dfc 100644
--- a/src/if-bsd.c
+++ b/src/if-bsd.c
@@ -943,10 +943,15 @@ if_getlifetime6(struct ipv6_addr *ia)
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);
- lifetime = &ifr6.ifr_ifru.ifru_lifetime;
+#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 @@ if_getlifetime6(struct ipv6_addr *ia)
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;