Author: qingli
Date: Tue Jan 12 00:04:13 2010
New Revision: 202132
URL: http://svn.freebsd.org/changeset/base/202132

Log:
  MFC   r201544
  
  An existing incomplete ARP entry would expire a subsequent
  statically configured entry of the same host. This bug was
  due to the expiration timer was not cancelled when installing
  the static entry. Since there exist a potential race condition
  with respect to timer cancellation, simply check for the
  LLE_STATIC bit inside the expiration function instead of
  cancelling the active timer.

Modified:
  stable/8/sys/netinet/if_ether.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)

Modified: stable/8/sys/netinet/if_ether.c
==============================================================================
--- stable/8/sys/netinet/if_ether.c     Mon Jan 11 23:33:30 2010        
(r202131)
+++ stable/8/sys/netinet/if_ether.c     Tue Jan 12 00:04:13 2010        
(r202132)
@@ -168,17 +168,23 @@ arptimer(void *arg)
        ifp = lle->lle_tbl->llt_ifp;
        IF_AFDATA_LOCK(ifp);
        LLE_WLOCK(lle);
-       if ((!callout_pending(&lle->la_timer) &&
-           callout_active(&lle->la_timer))) {
-               (void) llentry_free(lle);
-       }
-#ifdef DIAGNOSTIC
+       if (lle->la_flags & LLE_STATIC)
+               LLE_WUNLOCK(lle);
        else {
-               struct sockaddr *l3addr = L3_ADDR(lle);
-               log(LOG_INFO, "arptimer issue: %p, IPv4 address: \"%s\"\n", lle,
-                   inet_ntoa(((const struct sockaddr_in *)l3addr)->sin_addr));
-       }
+               if (!callout_pending(&lle->la_timer) &&
+                   callout_active(&lle->la_timer)) {
+                       (void) llentry_free(lle);
+               } 
+#ifdef DIAGNOSTIC
+               else {
+                       struct sockaddr *l3addr = L3_ADDR(lle);
+                       log(LOG_INFO, 
+                           "arptimer issue: %p, IPv4 address: \"%s\"\n", lle,
+                           inet_ntoa(
+                               ((const struct sockaddr_in 
*)l3addr)->sin_addr));
+               }
 #endif
+       }
        IF_AFDATA_UNLOCK(ifp);
 }
 
_______________________________________________
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"

Reply via email to