commit 8e8c55a4b466716ef6975b0a13007822a2fcfd1c Author: Ryota Ozaki Date: Wed Aug 5 12:28:19 2015 +0900 Replace time_second with time_uptime diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c index d7d0641..600427b 100644 --- a/sys/net/rtsock.c +++ b/sys/net/rtsock.c @@ -717,8 +717,11 @@ rt_setmetrics(int which, const struct rt_xmsghdr *in, struct rtentry *out) 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, struct rt_xmsghdr *out) 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 diff --git a/sys/netinet/if_arp.c b/sys/netinet/if_arp.c index e5b28c5..533ca46 100644 --- a/sys/netinet/if_arp.c +++ b/sys/netinet/if_arp.c @@ -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 *rt, const struct rt_addrinfo *info) 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 *rt, const struct rt_addrinfo *info) * 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 rtentry *rt, struct mbuf *m, * 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 rtentry *rt, struct mbuf *m, /* 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; diff --git a/sys/netinet/ip_input.c b/sys/netinet/ip_input.c index b6200ce..36f7ab6 100644 --- a/sys/netinet/ip_input.c +++ b/sys/netinet/ip_input.c @@ -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 diff --git a/sys/netinet/ip_output.c b/sys/netinet/ip_output.c index 8615d0f..42317e6 100644 --- a/sys/netinet/ip_output.c +++ b/sys/netinet/ip_output.c @@ -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; } diff --git a/sys/netinet6/icmp6.c b/sys/netinet6/icmp6.c index a5ddd4c..333b5a5 100644 --- a/sys/netinet6/icmp6.c +++ b/sys/netinet6/icmp6.c @@ -1812,9 +1812,9 @@ ni6_store_addrs(struct icmp6_nodeinfo *ni6, 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; } diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c index 49cd7e7..cc0304b 100644 --- a/sys/netinet6/in6.c +++ b/sys/netinet6/in6.c @@ -507,6 +507,9 @@ in6_control1(struct socket *so, u_long cmd, void *data, struct ifnet *ifp) 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 cmd, void *data, struct ifnet *ifp) 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 cmd, void *data, struct ifnet *ifp) 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 cmd, void *data, struct ifnet *ifp) 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, struct in6_aliasreq *ifra, 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, struct in6_aliasreq *ifra, } /* 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, struct in6_aliasreq *ifra, 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, struct in6_aliasreq *ifra, */ 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. */ diff --git a/sys/netinet6/in6.h b/sys/netinet6/in6.h index 5ed1c86..b1d93da 100644 --- a/sys/netinet6/in6.h +++ b/sys/netinet6/in6.h @@ -357,11 +357,11 @@ extern const struct in6_addr in6addr_linklocal_allrouters; #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 diff --git a/sys/netinet6/ip6_forward.c b/sys/netinet6/ip6_forward.c index 79000fd..e4901ba 100644 --- a/sys/netinet6/ip6_forward.c +++ b/sys/netinet6/ip6_forward.c @@ -93,9 +93,9 @@ ip6_cantforward(const struct ip6_hdr *ip6, const struct ifnet *srcifp, 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); diff --git a/sys/netinet6/ip6_id.c b/sys/netinet6/ip6_id.c index f789cf0..088095a 100644 --- a/sys/netinet6/ip6_id.c +++ b/sys/netinet6/ip6_id.c @@ -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 */ diff --git a/sys/netinet6/ip6_mroute.c b/sys/netinet6/ip6_mroute.c index bbc834a..ba54748 100644 --- a/sys/netinet6/ip6_mroute.c +++ b/sys/netinet6/ip6_mroute.c @@ -1070,8 +1070,8 @@ ip6_mforward(struct ip6_hdr *ip6, struct ifnet *ifp, struct mbuf *m) */ 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", diff --git a/sys/netinet6/nd6.c b/sys/netinet6/nd6.c index 26f7601..f13feab 100644 --- a/sys/netinet6/nd6.c +++ b/sys/netinet6/nd6.c @@ -413,7 +413,7 @@ nd6_llinfo_settimer(struct llinfo_nd6 *ln, long xtick) 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 ifnet *ifp) 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 ifnet *ifp) ((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 ifnet *ifp) 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, size_t ol) } 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; } diff --git a/sys/netinet6/nd6_rtr.c b/sys/netinet6/nd6_rtr.c index ef59391..6fcd60a 100644 --- a/sys/netinet6/nd6_rtr.c +++ b/sys/netinet6/nd6_rtr.c @@ -275,7 +275,7 @@ nd6_ra_input(struct mbuf *m, int off, int icmp6len) 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, struct nd_defrouter *dr, 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 *newprc, 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 *newprc, 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 *newprc, 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 *newprc, 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 *newprc, } 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 *ndpr) 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 *newpr, 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 *newpr, 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; } } diff --git a/sys/sys/timevar.h b/sys/sys/timevar.h index d6d4730..04a297c 100644 --- a/sys/sys/timevar.h +++ b/sys/sys/timevar.h @@ -188,4 +188,16 @@ bool time_wraps(struct timespec *, struct timespec *); 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_ */