svn commit: r202132 - stable/8/sys/netinet

[ Available lists | Index of svn-src-all | Month of Jan 2010 | Week of 12 Jan 2010 | Raw email | View thread | Wrap long lines | Reply | Tag ]
From
Qing Li <qingli@FreeBSD.org>
Date
12 Jan 2010 00:04:14
Subject
svn commit: r202132 - stable/8/sys/netinet
Message-ID
201001120004.o0C04D2X016641@svn.freebsd.org


[ Hide this part ]
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);
}


Elapsed time: 0.060 seconds