svn commit: r185831 - user/kmacy/head_arpv2/sys/netinet6
Kip Macy
kmacy at FreeBSD.org
Tue Dec 9 19:30:38 PST 2008
Author: kmacy
Date: Wed Dec 10 03:30:37 2008
New Revision: 185831
URL: http://svn.freebsd.org/changeset/base/185831
Log:
fix IF_AFDATA_LOCK recursion in nd6_cache_lladdr
Modified:
user/kmacy/head_arpv2/sys/netinet6/icmp6.c
user/kmacy/head_arpv2/sys/netinet6/ip6_output.c
user/kmacy/head_arpv2/sys/netinet6/nd6.c
user/kmacy/head_arpv2/sys/netinet6/nd6_nbr.c
user/kmacy/head_arpv2/sys/netinet6/nd6_rtr.c
Modified: user/kmacy/head_arpv2/sys/netinet6/icmp6.c
==============================================================================
--- user/kmacy/head_arpv2/sys/netinet6/icmp6.c Wed Dec 10 03:17:27 2008 (r185830)
+++ user/kmacy/head_arpv2/sys/netinet6/icmp6.c Wed Dec 10 03:30:37 2008 (r185831)
@@ -2397,10 +2397,8 @@ icmp6_redirect_input(struct mbuf *m, int
}
/* RFC 2461 8.3 */
- IF_AFDATA_LOCK(ifp);
nd6_cache_lladdr(ifp, &redtgt6, lladdr, lladdrlen, ND_REDIRECT,
is_onlink ? ND_REDIRECT_ONLINK : ND_REDIRECT_ROUTER);
- IF_AFDATA_UNLOCK(ifp);
if (!is_onlink) { /* better router case. perform rtredirect. */
/* perform rtredirect */
Modified: user/kmacy/head_arpv2/sys/netinet6/ip6_output.c
==============================================================================
--- user/kmacy/head_arpv2/sys/netinet6/ip6_output.c Wed Dec 10 03:17:27 2008 (r185830)
+++ user/kmacy/head_arpv2/sys/netinet6/ip6_output.c Wed Dec 10 03:30:37 2008 (r185831)
@@ -1088,9 +1088,7 @@ sendorfree:
ia->ia_ifa.if_opackets++;
ia->ia_ifa.if_obytes += m->m_pkthdr.len;
}
- IF_AFDATA_LOCK(ifp);
error = nd6_output(ifp, origifp, m, dst, ro->ro_rt);
- IF_AFDATA_UNLOCK(ifp);
} else
m_freem(m);
}
Modified: user/kmacy/head_arpv2/sys/netinet6/nd6.c
==============================================================================
--- user/kmacy/head_arpv2/sys/netinet6/nd6.c Wed Dec 10 03:17:27 2008 (r185830)
+++ user/kmacy/head_arpv2/sys/netinet6/nd6.c Wed Dec 10 03:30:37 2008 (r185831)
@@ -1400,7 +1400,7 @@ nd6_cache_lladdr(struct ifnet *ifp, stru
int flags = 0;
int newstate = 0;
- IF_AFDATA_LOCK_ASSERT(ifp);
+ IF_AFDATA_UNLOCK_ASSERT(ifp);
if (ifp == NULL)
panic("ifp == NULL in nd6_cache_lladdr");
@@ -1421,9 +1421,13 @@ nd6_cache_lladdr(struct ifnet *ifp, stru
* description on it in NS section (RFC 2461 7.2.3).
*/
flags |= lladdr ? ND6_EXCLUSIVE : 0;
+ IF_AFDATA_LOCK(ifp);
ln = nd6_lookup(from, flags, ifp);
+ if (ln)
+ IF_AFDATA_UNLOCK(ifp);
if (ln == NULL) {
ln = nd6_lookup(from, flags |ND6_CREATE, ifp);
+ IF_AFDATA_UNLOCK(ifp);
is_newentry = 1;
} else {
/* do nothing if static ndp is set */
Modified: user/kmacy/head_arpv2/sys/netinet6/nd6_nbr.c
==============================================================================
--- user/kmacy/head_arpv2/sys/netinet6/nd6_nbr.c Wed Dec 10 03:17:27 2008 (r185830)
+++ user/kmacy/head_arpv2/sys/netinet6/nd6_nbr.c Wed Dec 10 03:30:37 2008 (r185831)
@@ -346,10 +346,8 @@ nd6_ns_input(struct mbuf *m, int off, in
goto freeit;
}
- IF_AFDATA_LOCK(ifp);
nd6_cache_lladdr(ifp, &saddr6, lladdr, lladdrlen,
ND_NEIGHBOR_SOLICIT, 0);
- IF_AFDATA_UNLOCK(ifp);
nd6_na_output(ifp, &saddr6, &taddr6,
((anycast || proxy || !tlladdr) ? 0 : ND_NA_FLAG_OVERRIDE) |
Modified: user/kmacy/head_arpv2/sys/netinet6/nd6_rtr.c
==============================================================================
--- user/kmacy/head_arpv2/sys/netinet6/nd6_rtr.c Wed Dec 10 03:17:27 2008 (r185830)
+++ user/kmacy/head_arpv2/sys/netinet6/nd6_rtr.c Wed Dec 10 03:30:37 2008 (r185831)
@@ -184,9 +184,7 @@ nd6_rs_input(struct mbuf *m, int off, in
goto bad;
}
- IF_AFDATA_LOCK(ifp);
nd6_cache_lladdr(ifp, &saddr6, lladdr, lladdrlen, ND_ROUTER_SOLICIT, 0);
- IF_AFDATA_UNLOCK(ifp);
freeit:
m_freem(m);
@@ -409,10 +407,8 @@ nd6_ra_input(struct mbuf *m, int off, in
goto bad;
}
- IF_AFDATA_LOCK(ifp);
nd6_cache_lladdr(ifp, &saddr6, lladdr,
lladdrlen, ND_ROUTER_ADVERT, 0);
- IF_AFDATA_UNLOCK(ifp);
/*
* Installing a link-layer address might change the state of the
More information about the svn-src-user
mailing list