Module Name: src
Committed By: ozaki-r
Date: Fri Aug 7 08:11:33 UTC 2015
Modified Files:
src/sys/net: rtsock.c
src/sys/netinet: if_arp.c ip_input.c ip_output.c
src/sys/netinet6: icmp6.c in6.c in6.h ip6_forward.c ip6_id.c
ip6_mroute.c nd6.c nd6_rtr.c
src/sys/sys: timevar.h
Log Message:
Use time_uptime instead of time_second to avoid time leaps
Some codes in sys/net* use time_second to manage time periods such as
cache expirations. However, time_second doesn't increase monotonically
and can leap by say settimeofday(2) according to time_second(9). We
should use time_uptime instead of it to avoid such time leaps.
This change replaces time_second with time_uptime. Additionally it
converts a time based on time_uptime to a time based on time_second
when the kernel passes the time to userland programs that expect
the latter, and vice versa.
Note that we shouldn't leak time_uptime to other hosts over the
netowrk. My investigation shows there is no such leak:
http://mail-index.netbsd.org/tech-net/2015/08/06/msg005332.html
Discussed on tech-kern and tech-net.
To generate a diff of this commit:
cvs rdiff -u -r1.172 -r1.173 src/sys/net/rtsock.c
cvs rdiff -u -r1.170 -r1.171 src/sys/netinet/if_arp.c
cvs rdiff -u -r1.322 -r1.323 src/sys/netinet/ip_input.c
cvs rdiff -u -r1.244 -r1.245 src/sys/netinet/ip_output.c
cvs rdiff -u -r1.172 -r1.173 src/sys/netinet6/icmp6.c
cvs rdiff -u -r1.188 -r1.189 src/sys/netinet6/in6.c
cvs rdiff -u -r1.84 -r1.85 src/sys/netinet6/in6.h
cvs rdiff -u -r1.76 -r1.77 src/sys/netinet6/ip6_forward.c
cvs rdiff -u -r1.17 -r1.18 src/sys/netinet6/ip6_id.c
cvs rdiff -u -r1.107 -r1.108 src/sys/netinet6/ip6_mroute.c
cvs rdiff -u -r1.165 -r1.166 src/sys/netinet6/nd6.c
cvs rdiff -u -r1.101 -r1.102 src/sys/netinet6/nd6_rtr.c
cvs rdiff -u -r1.33 -r1.34 src/sys/sys/timevar.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/net/rtsock.c
diff -u src/sys/net/rtsock.c:1.172 src/sys/net/rtsock.c:1.173
--- src/sys/net/rtsock.c:1.172 Fri Jul 17 02:21:08 2015
+++ src/sys/net/rtsock.c Fri Aug 7 08:11:33 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: rtsock.c,v 1.172 2015/07/17 02:21:08 ozaki-r Exp $ */
+/* $NetBSD: rtsock.c,v 1.173 2015/08/07 08:11:33 ozaki-r Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -61,7 +61,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.172 2015/07/17 02:21:08 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.173 2015/08/07 08:11:33 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -717,8 +717,11 @@ rt_setmetrics(int which, const struct rt
metric(RTV_RTTVAR, rmx_rttvar);
metric(RTV_HOPCOUNT, rmx_hopcount);
metric(RTV_MTU, rmx_mtu);
- metric(RTV_EXPIRE, rmx_expire);
#undef metric
+ if (which & RTV_EXPIRE) {
+ out->rt_rmx.rmx_expire = in->rtm_rmx.rmx_expire ?
+ time_wall_to_mono(in->rtm_rmx.rmx_expire) : 0;
+ }
}
static void
@@ -732,8 +735,9 @@ rtm_setmetrics(const struct rtentry *in,
metric(rmx_rttvar);
metric(rmx_hopcount);
metric(rmx_mtu);
- metric(rmx_expire);
#undef metric
+ out->rtm_rmx.rmx_expire = in->rt_rmx.rmx_expire ?
+ time_mono_to_wall(in->rt_rmx.rmx_expire) : 0;
}
static int
Index: src/sys/netinet/if_arp.c
diff -u src/sys/netinet/if_arp.c:1.170 src/sys/netinet/if_arp.c:1.171
--- src/sys/netinet/if_arp.c:1.170 Wed Jul 15 08:49:15 2015
+++ src/sys/netinet/if_arp.c Fri Aug 7 08:11:33 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: if_arp.c,v 1.170 2015/07/15 08:49:15 ozaki-r Exp $ */
+/* $NetBSD: if_arp.c,v 1.171 2015/08/07 08:11:33 ozaki-r Exp $ */
/*-
* Copyright (c) 1998, 2000, 2008 The NetBSD Foundation, Inc.
@@ -68,7 +68,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_arp.c,v 1.170 2015/07/15 08:49:15 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_arp.c,v 1.171 2015/08/07 08:11:33 ozaki-r Exp $");
#include "opt_ddb.h"
#include "opt_inet.h"
@@ -429,8 +429,8 @@ arptimer(void *arg)
if (rt->rt_expire == 0)
continue;
- if ((rt->rt_expire - time_second) < arpt_refresh &&
- rt->rt_pksent > (time_second - arpt_keep)) {
+ if ((rt->rt_expire - time_uptime) < arpt_refresh &&
+ rt->rt_pksent > (time_uptime - arpt_keep)) {
/*
* If the entry has been used during since last
* refresh, try to renew it before deleting.
@@ -439,7 +439,7 @@ arptimer(void *arg)
&satocsin(rt->rt_ifa->ifa_addr)->sin_addr,
&satocsin(rt_getkey(rt))->sin_addr,
CLLADDR(rt->rt_ifp->if_sadl));
- } else if (rt->rt_expire <= time_second)
+ } else if (rt->rt_expire <= time_uptime)
arptfree(la); /* timer has expired; clear */
}
@@ -506,16 +506,6 @@ arp_rtrequest(int req, struct rtentry *r
if (!arpinit_done) {
arpinit_done = 1;
- /*
- * We generate expiration times from time_second
- * so avoid accidentally creating permanent routes.
- */
- if (time_second == 0) {
- struct timespec ts;
- ts.tv_sec = 1;
- ts.tv_nsec = 0;
- tc_setclock(&ts);
- }
callout_init(&arptimer_ch, CALLOUT_MPSAFE);
callout_reset(&arptimer_ch, hz, arptimer, NULL);
}
@@ -589,7 +579,8 @@ arp_rtrequest(int req, struct rtentry *r
* it's a "permanent" route, so that routes cloned
* from it do not need their expiration time set.
*/
- rt->rt_expire = time_second;
+ KASSERT(time_uptime != 0);
+ rt->rt_expire = time_uptime;
/*
* linklayers with particular link MTU limitation.
*/
@@ -844,11 +835,11 @@ arpresolve(struct ifnet *ifp, struct rte
* Check the address family and length is valid, the address
* is resolved; otherwise, try to resolve.
*/
- if ((rt->rt_expire == 0 || rt->rt_expire > time_second) &&
+ if ((rt->rt_expire == 0 || rt->rt_expire > time_uptime) &&
sdl->sdl_family == AF_LINK && sdl->sdl_alen != 0) {
memcpy(desten, CLLADDR(sdl),
min(sdl->sdl_alen, ifp->if_addrlen));
- rt->rt_pksent = time_second; /* Time for last pkt sent */
+ rt->rt_pksent = time_uptime; /* Time for last pkt sent */
return 1;
}
/*
@@ -876,13 +867,13 @@ arpresolve(struct ifnet *ifp, struct rte
/* This should never happen. (Should it? -gwr) */
printf("arpresolve: unresolved and rt_expire == 0\n");
/* Set expiration time to now (expired). */
- rt->rt_expire = time_second;
+ rt->rt_expire = time_uptime;
}
#endif
if (rt->rt_expire) {
rt->rt_flags &= ~RTF_REJECT;
- if (la->la_asked == 0 || rt->rt_expire != time_second) {
- rt->rt_expire = time_second;
+ if (la->la_asked == 0 || rt->rt_expire != time_uptime) {
+ rt->rt_expire = time_uptime;
if (la->la_asked++ < arp_maxtries) {
arprequest(ifp,
&satocsin(rt->rt_ifa->ifa_addr)->sin_addr,
@@ -1234,7 +1225,7 @@ in_arpinput(struct mbuf *m)
(void)sockaddr_dl_setaddr(sdl, sdl->sdl_len, ar_sha(ah),
ah->ar_hln);
if (rt->rt_expire)
- rt->rt_expire = time_second + arpt_keep;
+ rt->rt_expire = time_uptime + arpt_keep;
rt->rt_flags &= ~RTF_REJECT;
la->la_asked = 0;
Index: src/sys/netinet/ip_input.c
diff -u src/sys/netinet/ip_input.c:1.322 src/sys/netinet/ip_input.c:1.323
--- src/sys/netinet/ip_input.c:1.322 Sat May 2 20:22:12 2015
+++ src/sys/netinet/ip_input.c Fri Aug 7 08:11:33 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: ip_input.c,v 1.322 2015/05/02 20:22:12 joerg Exp $ */
+/* $NetBSD: ip_input.c,v 1.323 2015/08/07 08:11:33 ozaki-r Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -91,7 +91,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_input.c,v 1.322 2015/05/02 20:22:12 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_input.c,v 1.323 2015/08/07 08:11:33 ozaki-r Exp $");
#include "opt_inet.h"
#include "opt_compat_netbsd.h"
@@ -319,7 +319,7 @@ ip_init(void)
ip_reass_init();
ip_ids = ip_id_init();
- ip_id = time_second & 0xfffff;
+ ip_id = time_uptime & 0xfffff;
ip_mtudisc_timeout_q = rt_timer_queue_create(ip_mtudisc_timeout);
#ifdef GATEWAY
Index: src/sys/netinet/ip_output.c
diff -u src/sys/netinet/ip_output.c:1.244 src/sys/netinet/ip_output.c:1.245
--- src/sys/netinet/ip_output.c:1.244 Fri Jul 17 02:21:08 2015
+++ src/sys/netinet/ip_output.c Fri Aug 7 08:11:33 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: ip_output.c,v 1.244 2015/07/17 02:21:08 ozaki-r Exp $ */
+/* $NetBSD: ip_output.c,v 1.245 2015/08/07 08:11:33 ozaki-r Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -91,7 +91,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_output.c,v 1.244 2015/07/17 02:21:08 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_output.c,v 1.245 2015/08/07 08:11:33 ozaki-r Exp $");
#include "opt_inet.h"
#include "opt_ipsec.h"
@@ -274,7 +274,7 @@ retry:
}
if ((rt->rt_flags & RTF_REJECT) != 0) {
if (rt->rt_rmx.rmx_expire == 0 ||
- time_second < rt->rt_rmx.rmx_expire) {
+ time_uptime < rt->rt_rmx.rmx_expire) {
error = (rt == rt0) ? EHOSTDOWN : EHOSTUNREACH;
goto bad;
}
Index: src/sys/netinet6/icmp6.c
diff -u src/sys/netinet6/icmp6.c:1.172 src/sys/netinet6/icmp6.c:1.173
--- src/sys/netinet6/icmp6.c:1.172 Fri Jul 24 07:36:29 2015
+++ src/sys/netinet6/icmp6.c Fri Aug 7 08:11:33 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: icmp6.c,v 1.172 2015/07/24 07:36:29 ozaki-r Exp $ */
+/* $NetBSD: icmp6.c,v 1.173 2015/08/07 08:11:33 ozaki-r Exp $ */
/* $KAME: icmp6.c,v 1.217 2001/06/20 15:03:29 jinmei Exp $ */
/*
@@ -62,7 +62,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: icmp6.c,v 1.172 2015/07/24 07:36:29 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: icmp6.c,v 1.173 2015/08/07 08:11:33 ozaki-r Exp $");
#include "opt_inet.h"
#include "opt_ipsec.h"
@@ -1812,9 +1812,9 @@ ni6_store_addrs(struct icmp6_nodeinfo *n
ltime = ND6_INFINITE_LIFETIME;
else {
if (ifa6->ia6_lifetime.ia6t_expire >
- time_second)
+ time_uptime)
ltime = ifa6->ia6_lifetime.ia6t_expire -
- time_second;
+ time_uptime;
else
ltime = 0;
}
Index: src/sys/netinet6/in6.c
diff -u src/sys/netinet6/in6.c:1.188 src/sys/netinet6/in6.c:1.189
--- src/sys/netinet6/in6.c:1.188 Wed Apr 22 19:46:08 2015
+++ src/sys/netinet6/in6.c Fri Aug 7 08:11:33 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: in6.c,v 1.188 2015/04/22 19:46:08 roy Exp $ */
+/* $NetBSD: in6.c,v 1.189 2015/08/07 08:11:33 ozaki-r Exp $ */
/* $KAME: in6.c,v 1.198 2001/07/18 09:12:38 itojun Exp $ */
/*
@@ -62,7 +62,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in6.c,v 1.188 2015/04/22 19:46:08 roy Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in6.c,v 1.189 2015/08/07 08:11:33 ozaki-r Exp $");
#include "opt_inet.h"
#include "opt_compat_netbsd.h"
@@ -507,6 +507,9 @@ in6_control1(struct socket *so, u_long c
maxexpire - ia->ia6_updatetime) {
retlt->ia6t_expire = ia->ia6_updatetime +
ia->ia6_lifetime.ia6t_vltime;
+ retlt->ia6t_expire = retlt->ia6t_expire ?
+ time_mono_to_wall(retlt->ia6t_expire) :
+ 0;
} else
retlt->ia6t_expire = maxexpire;
}
@@ -525,6 +528,9 @@ in6_control1(struct socket *so, u_long c
maxexpire - ia->ia6_updatetime) {
retlt->ia6t_preferred = ia->ia6_updatetime +
ia->ia6_lifetime.ia6t_pltime;
+ retlt->ia6t_preferred = retlt->ia6t_preferred ?
+ time_mono_to_wall(retlt->ia6t_preferred) :
+ 0;
} else
retlt->ia6t_preferred = maxexpire;
}
@@ -545,6 +551,7 @@ in6_control1(struct socket *so, u_long c
int i;
struct nd_prefixctl prc0;
struct nd_prefix *pr;
+ struct in6_addrlifetime *lt;
/* reject read-only flags */
if ((ifra->ifra_flags & IN6_IFF_DUPLICATED) != 0 ||
@@ -555,6 +562,16 @@ in6_control1(struct socket *so, u_long c
return EINVAL;
}
/*
+ * ia6t_expire and ia6t_preferred won't be used for now,
+ * so just in case.
+ */
+ lt = &ifra->ifra_lifetime;
+ if (lt->ia6t_expire != 0)
+ lt->ia6t_expire = time_wall_to_mono(lt->ia6t_expire);
+ if (lt->ia6t_preferred != 0)
+ lt->ia6t_preferred =
+ time_wall_to_mono(lt->ia6t_preferred);
+ /*
* first, make or update the interface address structure,
* and link it to the list.
*/
@@ -878,7 +895,7 @@ in6_update_ifa1(struct ifnet *ifp, struc
ia->ia_ifa.ifa_addr = (struct sockaddr *)&ia->ia_addr;
ia->ia_addr.sin6_family = AF_INET6;
ia->ia_addr.sin6_len = sizeof(ia->ia_addr);
- ia->ia6_createtime = time_second;
+ ia->ia6_createtime = time_uptime;
if ((ifp->if_flags & (IFF_POINTOPOINT | IFF_LOOPBACK)) != 0) {
/*
* XXX: some functions expect that ifa_dstaddr is not
@@ -906,7 +923,7 @@ in6_update_ifa1(struct ifnet *ifp, struc
}
/* update timestamp */
- ia->ia6_updatetime = time_second;
+ ia->ia6_updatetime = time_uptime;
/* set prefix mask */
if (ifra->ifra_prefixmask.sin6_len) {
@@ -953,12 +970,12 @@ in6_update_ifa1(struct ifnet *ifp, struc
ia->ia6_lifetime = ifra->ifra_lifetime;
if (ia->ia6_lifetime.ia6t_vltime != ND6_INFINITE_LIFETIME) {
ia->ia6_lifetime.ia6t_expire =
- time_second + ia->ia6_lifetime.ia6t_vltime;
+ time_uptime + ia->ia6_lifetime.ia6t_vltime;
} else
ia->ia6_lifetime.ia6t_expire = 0;
if (ia->ia6_lifetime.ia6t_pltime != ND6_INFINITE_LIFETIME) {
ia->ia6_lifetime.ia6t_preferred =
- time_second + ia->ia6_lifetime.ia6t_pltime;
+ time_uptime + ia->ia6_lifetime.ia6t_pltime;
} else
ia->ia6_lifetime.ia6t_preferred = 0;
@@ -988,7 +1005,7 @@ in6_update_ifa1(struct ifnet *ifp, struc
*/
if ((ifra->ifra_flags & IN6_IFF_DEPRECATED) != 0) {
ia->ia6_lifetime.ia6t_pltime = 0;
- ia->ia6_lifetime.ia6t_preferred = time_second;
+ ia->ia6_lifetime.ia6t_preferred = time_uptime;
}
/* reset the interface and routing table appropriately. */
Index: src/sys/netinet6/in6.h
diff -u src/sys/netinet6/in6.h:1.84 src/sys/netinet6/in6.h:1.85
--- src/sys/netinet6/in6.h:1.84 Wed Apr 22 19:46:08 2015
+++ src/sys/netinet6/in6.h Fri Aug 7 08:11:33 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: in6.h,v 1.84 2015/04/22 19:46:08 roy Exp $ */
+/* $NetBSD: in6.h,v 1.85 2015/08/07 08:11:33 ozaki-r Exp $ */
/* $KAME: in6.h,v 1.83 2001/03/29 02:55:07 jinmei Exp $ */
/*
@@ -357,11 +357,11 @@ extern const struct in6_addr in6addr_lin
#define IFA6_IS_DEPRECATED(a) \
((a)->ia6_lifetime.ia6t_pltime != ND6_INFINITE_LIFETIME && \
- (u_int32_t)((time_second - (a)->ia6_updatetime)) > \
+ (u_int32_t)((time_uptime - (a)->ia6_updatetime)) > \
(a)->ia6_lifetime.ia6t_pltime)
#define IFA6_IS_INVALID(a) \
((a)->ia6_lifetime.ia6t_vltime != ND6_INFINITE_LIFETIME && \
- (u_int32_t)((time_second - (a)->ia6_updatetime)) > \
+ (u_int32_t)((time_uptime - (a)->ia6_updatetime)) > \
(a)->ia6_lifetime.ia6t_vltime)
#endif
Index: src/sys/netinet6/ip6_forward.c
diff -u src/sys/netinet6/ip6_forward.c:1.76 src/sys/netinet6/ip6_forward.c:1.77
--- src/sys/netinet6/ip6_forward.c:1.76 Wed Dec 10 01:10:14 2014
+++ src/sys/netinet6/ip6_forward.c Fri Aug 7 08:11:33 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: ip6_forward.c,v 1.76 2014/12/10 01:10:14 christos Exp $ */
+/* $NetBSD: ip6_forward.c,v 1.77 2015/08/07 08:11:33 ozaki-r Exp $ */
/* $KAME: ip6_forward.c,v 1.109 2002/09/11 08:10:17 sakane Exp $ */
/*
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip6_forward.c,v 1.76 2014/12/10 01:10:14 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip6_forward.c,v 1.77 2015/08/07 08:11:33 ozaki-r Exp $");
#include "opt_gateway.h"
#include "opt_ipsec.h"
@@ -93,9 +93,9 @@ ip6_cantforward(const struct ip6_hdr *ip
if (dstifp)
in6_ifstat_inc(dstifp, ifs6_in_discard);
- if (ip6_log_time + ip6_log_interval >= time_second)
+ if (ip6_log_time + ip6_log_interval >= time_uptime)
return;
- ip6_log_time = time_second;
+ ip6_log_time = time_uptime;
va_start(ap, fmt);
vsnprintf(reason, sizeof(reason), fmt, ap);
Index: src/sys/netinet6/ip6_id.c
diff -u src/sys/netinet6/ip6_id.c:1.17 src/sys/netinet6/ip6_id.c:1.18
--- src/sys/netinet6/ip6_id.c:1.17 Sat Nov 19 22:51:29 2011
+++ src/sys/netinet6/ip6_id.c Fri Aug 7 08:11:33 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: ip6_id.c,v 1.17 2011/11/19 22:51:29 tls Exp $ */
+/* $NetBSD: ip6_id.c,v 1.18 2015/08/07 08:11:33 ozaki-r Exp $ */
/* $KAME: ip6_id.c,v 1.8 2003/09/06 13:41:06 itojun Exp $ */
/* $OpenBSD: ip_id.c,v 1.6 2002/03/15 18:19:52 millert Exp $ */
@@ -82,7 +82,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip6_id.c,v 1.17 2011/11/19 22:51:29 tls Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip6_id.c,v 1.18 2015/08/07 08:11:33 ozaki-r Exp $");
#include <sys/param.h>
#include <sys/cprng.h>
@@ -211,7 +211,7 @@ initid(struct randomtab *p)
p->ru_g = pmod(p->ru_gen, j, p->ru_n);
p->ru_counter = 0;
- p->ru_reseed = time_second + p->ru_out;
+ p->ru_reseed = time_uptime + p->ru_out;
p->ru_msb = p->ru_msb ? 0 : (1U << (p->ru_bits - 1));
}
@@ -220,7 +220,7 @@ randomid(struct randomtab *p)
{
int i, n;
- if (p->ru_counter >= p->ru_max || time_second > p->ru_reseed)
+ if (p->ru_counter >= p->ru_max || time_uptime > p->ru_reseed)
initid(p);
/* Skip a random number of ids */
Index: src/sys/netinet6/ip6_mroute.c
diff -u src/sys/netinet6/ip6_mroute.c:1.107 src/sys/netinet6/ip6_mroute.c:1.108
--- src/sys/netinet6/ip6_mroute.c:1.107 Sat May 17 21:26:20 2014
+++ src/sys/netinet6/ip6_mroute.c Fri Aug 7 08:11:33 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: ip6_mroute.c,v 1.107 2014/05/17 21:26:20 rmind Exp $ */
+/* $NetBSD: ip6_mroute.c,v 1.108 2015/08/07 08:11:33 ozaki-r Exp $ */
/* $KAME: ip6_mroute.c,v 1.49 2001/07/25 09:21:18 jinmei Exp $ */
/*
@@ -117,7 +117,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip6_mroute.c,v 1.107 2014/05/17 21:26:20 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip6_mroute.c,v 1.108 2015/08/07 08:11:33 ozaki-r Exp $");
#include "opt_inet.h"
#include "opt_mrouting.h"
@@ -1070,8 +1070,8 @@ ip6_mforward(struct ip6_hdr *ip6, struct
*/
if (IN6_IS_ADDR_UNSPECIFIED(&ip6->ip6_src)) {
IP6_STATINC(IP6_STAT_CANTFORWARD);
- if (ip6_log_time + ip6_log_interval < time_second) {
- ip6_log_time = time_second;
+ if (ip6_log_time + ip6_log_interval < time_uptime) {
+ ip6_log_time = time_uptime;
log(LOG_DEBUG,
"cannot forward "
"from %s to %s nxt %d received on %s\n",
Index: src/sys/netinet6/nd6.c
diff -u src/sys/netinet6/nd6.c:1.165 src/sys/netinet6/nd6.c:1.166
--- src/sys/netinet6/nd6.c:1.165 Fri Jul 17 02:21:08 2015
+++ src/sys/netinet6/nd6.c Fri Aug 7 08:11:33 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: nd6.c,v 1.165 2015/07/17 02:21:08 ozaki-r Exp $ */
+/* $NetBSD: nd6.c,v 1.166 2015/08/07 08:11:33 ozaki-r Exp $ */
/* $KAME: nd6.c,v 1.279 2002/06/08 11:16:51 itojun Exp $ */
/*
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nd6.c,v 1.165 2015/07/17 02:21:08 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nd6.c,v 1.166 2015/08/07 08:11:33 ozaki-r Exp $");
#include "opt_net_mpsafe.h"
@@ -413,7 +413,7 @@ nd6_llinfo_settimer(struct llinfo_nd6 *l
ln->ln_ntick = 0;
callout_stop(&ln->ln_timer_ch);
} else {
- ln->ln_expire = time_second + xtick / hz;
+ ln->ln_expire = time_uptime + xtick / hz;
if (xtick > INT_MAX) {
ln->ln_ntick = xtick - INT_MAX;
callout_reset(&ln->ln_timer_ch, INT_MAX,
@@ -555,7 +555,7 @@ nd6_timer(void *ignored_arg)
/* expire default router list */
TAILQ_FOREACH_SAFE(dr, &nd_defrouter, dr_entry, next_dr) {
- if (dr->expire && dr->expire < time_second) {
+ if (dr->expire && dr->expire < time_uptime) {
defrtrlist_del(dr, NULL);
}
}
@@ -647,7 +647,7 @@ nd6_timer(void *ignored_arg)
* prefix is not necessary.
*/
if (pr->ndpr_vltime != ND6_INFINITE_LIFETIME &&
- time_second - pr->ndpr_lastupdate > pr->ndpr_vltime) {
+ time_uptime - pr->ndpr_lastupdate > pr->ndpr_vltime) {
/*
* address expiration and prefix expiration are
@@ -1086,9 +1086,9 @@ nd6_free(struct rtentry *rt, int gc)
* XXX: the check for ln_state would be redundant,
* but we intentionally keep it just in case.
*/
- if (dr->expire > time_second)
+ if (dr->expire > time_uptime)
nd6_llinfo_settimer(ln,
- (dr->expire - time_second) * hz);
+ (dr->expire - time_uptime) * hz);
else
nd6_llinfo_settimer(ln, (long)nd6_gctimer * hz);
splx(s);
@@ -1566,7 +1566,8 @@ nd6_ioctl(u_long cmd, void *data, struct
drl->defrouter[i].flags = dr->flags;
drl->defrouter[i].rtlifetime = dr->rtlifetime;
- drl->defrouter[i].expire = dr->expire;
+ drl->defrouter[i].expire = dr->expire ?
+ time_mono_to_wall(dr->expire) : 0;
drl->defrouter[i].if_index = dr->ifp->if_index;
i++;
}
@@ -1610,9 +1611,11 @@ nd6_ioctl(u_long cmd, void *data, struct
((sizeof(maxexpire) * 8) - 1));
if (pr->ndpr_vltime <
maxexpire - pr->ndpr_lastupdate) {
- oprl->prefix[i].expire =
- pr->ndpr_lastupdate +
- pr->ndpr_vltime;
+ time_t expire;
+ expire = pr->ndpr_lastupdate +
+ pr->ndpr_vltime;
+ oprl->prefix[i].expire = expire ?
+ time_mono_to_wall(expire) : 0;
} else
oprl->prefix[i].expire = maxexpire;
}
@@ -1839,7 +1842,8 @@ nd6_ioctl(u_long cmd, void *data, struct
nbi->state = ln->ln_state;
nbi->asked = ln->ln_asked;
nbi->isrouter = ln->ln_router;
- nbi->expire = ln->ln_expire;
+ nbi->expire = ln->ln_expire ?
+ time_mono_to_wall(ln->ln_expire) : 0;
splx(s);
break;
@@ -2557,7 +2561,8 @@ fill_drlist(void *oldp, size_t *oldlenp,
}
d->flags = dr->flags;
d->rtlifetime = dr->rtlifetime;
- d->expire = dr->expire;
+ d->expire = dr->expire ?
+ time_mono_to_wall(dr->expire) : 0;
d->if_index = dr->ifp->if_index;
}
Index: src/sys/netinet6/nd6_rtr.c
diff -u src/sys/netinet6/nd6_rtr.c:1.101 src/sys/netinet6/nd6_rtr.c:1.102
--- src/sys/netinet6/nd6_rtr.c:1.101 Fri Jul 17 02:21:08 2015
+++ src/sys/netinet6/nd6_rtr.c Fri Aug 7 08:11:33 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: nd6_rtr.c,v 1.101 2015/07/17 02:21:08 ozaki-r Exp $ */
+/* $NetBSD: nd6_rtr.c,v 1.102 2015/08/07 08:11:33 ozaki-r Exp $ */
/* $KAME: nd6_rtr.c,v 1.95 2001/02/07 08:09:47 itojun Exp $ */
/*
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nd6_rtr.c,v 1.101 2015/07/17 02:21:08 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nd6_rtr.c,v 1.102 2015/08/07 08:11:33 ozaki-r Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -275,7 +275,7 @@ nd6_ra_input(struct mbuf *m, int off, in
drtr.rtaddr = saddr6;
drtr.flags = nd_ra->nd_ra_flags_reserved;
drtr.rtlifetime = ntohs(nd_ra->nd_ra_router_lifetime);
- drtr.expire = time_second + drtr.rtlifetime;
+ drtr.expire = time_uptime + drtr.rtlifetime;
drtr.ifp = ifp;
/* unspecified or not? (RFC 2461 6.3.4) */
if (advreachable) {
@@ -950,7 +950,7 @@ nd6_prelist_add(struct nd_prefixctl *prc
free(newpr, M_IP6NDP);
return(error);
}
- newpr->ndpr_lastupdate = time_second;
+ newpr->ndpr_lastupdate = time_uptime;
if (newp != NULL)
*newp = newpr;
@@ -1090,7 +1090,7 @@ prelist_update(struct nd_prefixctl *newp
pr->ndpr_vltime = newprc->ndprc_vltime;
pr->ndpr_pltime = newprc->ndprc_pltime;
(void)in6_init_prefix_ltimes(pr); /* XXX error case? */
- pr->ndpr_lastupdate = time_second;
+ pr->ndpr_lastupdate = time_uptime;
}
if (newprc->ndprc_raf_onlink &&
@@ -1228,7 +1228,7 @@ prelist_update(struct nd_prefixctl *newp
lt6_tmp = ifa6->ia6_lifetime;
if (lt6_tmp.ia6t_vltime == ND6_INFINITE_LIFETIME)
remaininglifetime = ND6_INFINITE_LIFETIME;
- else if (time_second - ifa6->ia6_updatetime >
+ else if (time_uptime - ifa6->ia6_updatetime >
lt6_tmp.ia6t_vltime) {
/*
* The case of "invalid" address. We should usually
@@ -1237,7 +1237,7 @@ prelist_update(struct nd_prefixctl *newp
remaininglifetime = 0;
} else
remaininglifetime = lt6_tmp.ia6t_vltime -
- (time_second - ifa6->ia6_updatetime);
+ (time_uptime - ifa6->ia6_updatetime);
/* when not updating, keep the current stored lifetime. */
lt6_tmp.ia6t_vltime = remaininglifetime;
@@ -1272,18 +1272,18 @@ prelist_update(struct nd_prefixctl *newp
u_int32_t maxvltime, maxpltime;
if (ip6_temp_valid_lifetime >
- (u_int32_t)((time_second - ifa6->ia6_createtime) +
+ (u_int32_t)((time_uptime - ifa6->ia6_createtime) +
ip6_desync_factor)) {
maxvltime = ip6_temp_valid_lifetime -
- (time_second - ifa6->ia6_createtime) -
+ (time_uptime - ifa6->ia6_createtime) -
ip6_desync_factor;
} else
maxvltime = 0;
if (ip6_temp_preferred_lifetime >
- (u_int32_t)((time_second - ifa6->ia6_createtime) +
+ (u_int32_t)((time_uptime - ifa6->ia6_createtime) +
ip6_desync_factor)) {
maxpltime = ip6_temp_preferred_lifetime -
- (time_second - ifa6->ia6_createtime) -
+ (time_uptime - ifa6->ia6_createtime) -
ip6_desync_factor;
} else
maxpltime = 0;
@@ -1299,7 +1299,7 @@ prelist_update(struct nd_prefixctl *newp
}
ifa6->ia6_lifetime = lt6_tmp;
- ifa6->ia6_updatetime = time_second;
+ ifa6->ia6_updatetime = time_uptime;
}
if (ia6_match == NULL && newprc->ndprc_vltime) {
int ifidlen;
@@ -1969,7 +1969,7 @@ in6_tmpifadd(
if (ia0->ia6_lifetime.ia6t_vltime != ND6_INFINITE_LIFETIME) {
vltime0 = IFA6_IS_INVALID(ia0) ? 0 :
(ia0->ia6_lifetime.ia6t_vltime -
- (time_second - ia0->ia6_updatetime));
+ (time_uptime - ia0->ia6_updatetime));
if (vltime0 > ip6_temp_valid_lifetime)
vltime0 = ip6_temp_valid_lifetime;
} else
@@ -1977,7 +1977,7 @@ in6_tmpifadd(
if (ia0->ia6_lifetime.ia6t_pltime != ND6_INFINITE_LIFETIME) {
pltime0 = IFA6_IS_DEPRECATED(ia0) ? 0 :
(ia0->ia6_lifetime.ia6t_pltime -
- (time_second - ia0->ia6_updatetime));
+ (time_uptime - ia0->ia6_updatetime));
if (pltime0 > ip6_temp_preferred_lifetime - ip6_desync_factor){
pltime0 = ip6_temp_preferred_lifetime -
ip6_desync_factor;
@@ -2042,11 +2042,11 @@ in6_init_prefix_ltimes(struct nd_prefix
if (ndpr->ndpr_pltime == ND6_INFINITE_LIFETIME)
ndpr->ndpr_preferred = 0;
else
- ndpr->ndpr_preferred = time_second + ndpr->ndpr_pltime;
+ ndpr->ndpr_preferred = time_uptime + ndpr->ndpr_pltime;
if (ndpr->ndpr_vltime == ND6_INFINITE_LIFETIME)
ndpr->ndpr_expire = 0;
else
- ndpr->ndpr_expire = time_second + ndpr->ndpr_vltime;
+ ndpr->ndpr_expire = time_uptime + ndpr->ndpr_vltime;
return 0;
}
@@ -2061,7 +2061,7 @@ in6_init_address_ltimes(struct nd_prefix
if (lt6->ia6t_vltime == ND6_INFINITE_LIFETIME)
lt6->ia6t_expire = 0;
else {
- lt6->ia6t_expire = time_second;
+ lt6->ia6t_expire = time_uptime;
lt6->ia6t_expire += lt6->ia6t_vltime;
}
@@ -2069,7 +2069,7 @@ in6_init_address_ltimes(struct nd_prefix
if (lt6->ia6t_pltime == ND6_INFINITE_LIFETIME)
lt6->ia6t_preferred = 0;
else {
- lt6->ia6t_preferred = time_second;
+ lt6->ia6t_preferred = time_uptime;
lt6->ia6t_preferred += lt6->ia6t_pltime;
}
}
Index: src/sys/sys/timevar.h
diff -u src/sys/sys/timevar.h:1.33 src/sys/sys/timevar.h:1.34
--- src/sys/sys/timevar.h:1.33 Fri Mar 29 01:09:45 2013
+++ src/sys/sys/timevar.h Fri Aug 7 08:11:33 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: timevar.h,v 1.33 2013/03/29 01:09:45 christos Exp $ */
+/* $NetBSD: timevar.h,v 1.34 2015/08/07 08:11:33 ozaki-r Exp $ */
/*
* Copyright (c) 2005, 2008 The NetBSD Foundation.
@@ -188,4 +188,16 @@ bool time_wraps(struct timespec *, struc
extern volatile time_t time_second; /* current second in the epoch */
extern volatile time_t time_uptime; /* system uptime in seconds */
+static inline time_t time_mono_to_wall(time_t t)
+{
+
+ return t - time_uptime + time_second;
+}
+
+static inline time_t time_wall_to_mono(time_t t)
+{
+
+ return t - time_second + time_uptime;
+}
+
#endif /* !_SYS_TIMEVAR_H_ */