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_ */

Reply via email to