From a98c06f1c8705eb604ebb7c156e51e45035e43e1 Mon Sep 17 00:00:00 2001 From: Gleb Smirnoff Date: Tue, 30 Nov 2010 15:57:00 +0000 Subject: [PATCH] Use time_uptime instead of non-monotonic time_second to drive ARP timeouts. Suggested by: bde --- sys/netinet/if_ether.c | 10 +++++----- sys/netinet/in.c | 2 +- usr.sbin/arp/arp.c | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/sys/netinet/if_ether.c b/sys/netinet/if_ether.c index ee5d8e05fb54..df05c04e0d79 100644 --- a/sys/netinet/if_ether.c +++ b/sys/netinet/if_ether.c @@ -323,7 +323,7 @@ arpresolve(struct ifnet *ifp, struct rtentry *rt0, struct mbuf *m, } if ((la->la_flags & LLE_VALID) && - ((la->la_flags & LLE_STATIC) || la->la_expire > time_second)) { + ((la->la_flags & LLE_STATIC) || la->la_expire > time_uptime)) { bcopy(&la->ll_addr, desten, ifp->if_addrlen); /* * If entry has an expiry time and it is approaching, @@ -331,7 +331,7 @@ arpresolve(struct ifnet *ifp, struct rtentry *rt0, struct mbuf *m, * arpt_down interval. */ if (!(la->la_flags & LLE_STATIC) && - time_second + la->la_preempt > la->la_expire) { + time_uptime + la->la_preempt > la->la_expire) { arprequest(ifp, NULL, &SIN(dst)->sin_addr, IF_LLADDR(ifp)); @@ -351,7 +351,7 @@ arpresolve(struct ifnet *ifp, struct rtentry *rt0, struct mbuf *m, goto done; } - renew = (la->la_asked == 0 || la->la_expire != time_second); + renew = (la->la_asked == 0 || la->la_expire != time_uptime); if ((renew || m != NULL) && (flags & LLE_EXCLUSIVE) == 0) { flags |= LLE_EXCLUSIVE; LLE_RUNLOCK(la); @@ -403,7 +403,7 @@ arpresolve(struct ifnet *ifp, struct rtentry *rt0, struct mbuf *m, int canceled; LLE_ADDREF(la); - la->la_expire = time_second; + la->la_expire = time_uptime; canceled = callout_reset(&la->la_timer, hz * V_arpt_down, arptimer, la); if (canceled) @@ -713,7 +713,7 @@ in_arpinput(struct mbuf *m) int canceled; LLE_ADDREF(la); - la->la_expire = time_second + V_arpt_keep; + la->la_expire = time_uptime + V_arpt_keep; canceled = callout_reset(&la->la_timer, hz * V_arpt_keep, arptimer, la); if (canceled) diff --git a/sys/netinet/in.c b/sys/netinet/in.c index 2ec54e29ede2..d8c71f156f32 100644 --- a/sys/netinet/in.c +++ b/sys/netinet/in.c @@ -1333,7 +1333,7 @@ in_lltable_new(const struct sockaddr *l3addr, u_int flags) * For IPv4 this will trigger "arpresolve" to generate * an ARP request. */ - lle->base.la_expire = time_second; /* mark expired */ + lle->base.la_expire = time_uptime; /* mark expired */ lle->l3_addr4 = *(const struct sockaddr_in *)l3addr; lle->base.lle_refcnt = 1; LLE_LOCK_INIT(&lle->base); diff --git a/usr.sbin/arp/arp.c b/usr.sbin/arp/arp.c index 2ee9d67e6827..32bfd9ab7a37 100644 --- a/usr.sbin/arp/arp.c +++ b/usr.sbin/arp/arp.c @@ -602,10 +602,10 @@ print_entry(struct sockaddr_dl *sdl, if (rtm->rtm_rmx.rmx_expire == 0) printf(" permanent"); else { - static struct timeval tv; - if (tv.tv_sec == 0) - gettimeofday(&tv, 0); - if ((expire_time = rtm->rtm_rmx.rmx_expire - tv.tv_sec) > 0) + static struct timespec tp; + if (tp.tv_sec == 0) + clock_gettime(CLOCK_MONOTONIC, &tp); + if ((expire_time = rtm->rtm_rmx.rmx_expire - tp.tv_sec) > 0) printf(" expires in %d seconds", (int)expire_time); else printf(" expired");