svn commit: r216075 - in head: sys/netinet usr.sbin/arp

Gleb Smirnoff glebius at FreeBSD.org
Tue Nov 30 15:57:01 UTC 2010


Author: glebius
Date: Tue Nov 30 15:57:00 2010
New Revision: 216075
URL: http://svn.freebsd.org/changeset/base/216075

Log:
  Use time_uptime instead of non-monotonic time_second to drive ARP
  timeouts.
  
  Suggested by:	bde

Modified:
  head/sys/netinet/if_ether.c
  head/sys/netinet/in.c
  head/usr.sbin/arp/arp.c

Modified: head/sys/netinet/if_ether.c
==============================================================================
--- head/sys/netinet/if_ether.c	Tue Nov 30 09:34:47 2010	(r216074)
+++ head/sys/netinet/if_ether.c	Tue Nov 30 15:57:00 2010	(r216075)
@@ -323,7 +323,7 @@ retry:
 	} 
 
 	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 @@ retry:
 		 * 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 @@ retry:
 		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 @@ retry:
 		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 @@ match:
 			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)

Modified: head/sys/netinet/in.c
==============================================================================
--- head/sys/netinet/in.c	Tue Nov 30 09:34:47 2010	(r216074)
+++ head/sys/netinet/in.c	Tue Nov 30 15:57:00 2010	(r216075)
@@ -1333,7 +1333,7 @@ in_lltable_new(const struct sockaddr *l3
 	 * 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);

Modified: head/usr.sbin/arp/arp.c
==============================================================================
--- head/usr.sbin/arp/arp.c	Tue Nov 30 09:34:47 2010	(r216074)
+++ head/usr.sbin/arp/arp.c	Tue Nov 30 15:57:00 2010	(r216075)
@@ -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");


More information about the svn-src-head mailing list