Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 10 Dec 2008 03:30:38 +0000 (UTC)
From:      Kip Macy <kmacy@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r185831 - user/kmacy/head_arpv2/sys/netinet6
Message-ID:  <200812100330.mBA3UcpB012261@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200812100330.mBA3UcpB012261>