diff options
author | eri <eri@FreeBSD.org> | 2015-06-24 19:06:54 +0000 |
---|---|---|
committer | eri <eri@FreeBSD.org> | 2015-06-24 19:06:54 +0000 |
commit | 5d11dcc72032e3027520c3aa2ffb5905115760e7 (patch) | |
tree | f2cdc241097c50043335e554271a557911309045 | |
parent | bad6606621decbf88fb0fafde27b090dfb10004a (diff) | |
download | FreeBSD-src-5d11dcc72032e3027520c3aa2ffb5905115760e7.zip FreeBSD-src-5d11dcc72032e3027520c3aa2ffb5905115760e7.tar.gz |
MFC r284512: Properly handle locking on the ARP protocol request sending.
-rw-r--r-- | sys/netinet/if_ether.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/sys/netinet/if_ether.c b/sys/netinet/if_ether.c index 4ffaee3..78d2f43 100644 --- a/sys/netinet/if_ether.c +++ b/sys/netinet/if_ether.c @@ -365,6 +365,7 @@ retry: if ((la->la_flags & LLE_VALID) && ((la->la_flags & LLE_STATIC) || la->la_expire > time_uptime)) { bcopy(&la->ll_addr, desten, ifp->if_addrlen); + renew = 0; /* * If entry has an expiry time and it is approaching, * see if we need to send an ARP request within this @@ -372,13 +373,21 @@ retry: */ if (!(la->la_flags & LLE_STATIC) && time_uptime + la->la_preempt > la->la_expire) { - arprequest(ifp, NULL, &SIN(dst)->sin_addr, NULL); + renew = 1; la->la_preempt--; } *lle = la; - error = 0; - goto done; + + if (flags & LLE_EXCLUSIVE) + LLE_WUNLOCK(la); + else + LLE_RUNLOCK(la); + + if (renew == 1) + arprequest(ifp, NULL, &SIN(dst)->sin_addr, NULL); + + return (0); } if (la->la_flags & LLE_STATIC) { /* should not happen! */ |