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

2010-11-30 Thread Gleb Smirnoff
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);
___
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to svn-src-all-unsubscr...@freebsd.org


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

2010-11-30 Thread Jilles Tjoelker
On Tue, Nov 30, 2010 at 03:57:00PM +, Gleb Smirnoff wrote:
 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/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);

Hmm, doesn't this break the API between arp(8) and the kernel?
Assuming we care, perhaps arp(8) should send/receive realtime, converted
at the time it requests the data. The kernel can then continue to use
monotonic time internally (which I agree is better).

-- 
Jilles Tjoelker
___
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to svn-src-all-unsubscr...@freebsd.org