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