summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorqingli <qingli@FreeBSD.org>2010-02-27 07:12:25 +0000
committerqingli <qingli@FreeBSD.org>2010-02-27 07:12:25 +0000
commit03d2b3884ad57edb16b4ab6773c1ea6269efa2e1 (patch)
tree8d9092c3bb0f69badfd4192f4e88c3c4a30b6b20
parent11df6402b4916bd2c5bf5c685dc72b0c13a37098 (diff)
downloadFreeBSD-src-03d2b3884ad57edb16b4ab6773c1ea6269efa2e1.zip
FreeBSD-src-03d2b3884ad57edb16b4ab6773c1ea6269efa2e1.tar.gz
Use reference counting instead of locking to secure an address while
that address is being used to generate temporary IPv6 address. This approach is sufficient and avoids recursive locking. MFC after: 3 days
-rw-r--r--sys/netinet6/nd6.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/sys/netinet6/nd6.c b/sys/netinet6/nd6.c
index d90520e..a32539b 100644
--- a/sys/netinet6/nd6.c
+++ b/sys/netinet6/nd6.c
@@ -764,22 +764,25 @@ regen_tmpaddr(struct in6_ifaddr *ia6)
*/
if (!IFA6_IS_DEPRECATED(it6))
public_ifa6 = it6;
+
+ if (public_ifa6 != NULL)
+ ifa_ref(&public_ifa6->ia_ifa);
}
+ IF_ADDR_UNLOCK(ifp);
if (public_ifa6 != NULL) {
int e;
if ((e = in6_tmpifadd(public_ifa6, 0, 0)) != 0) {
- IF_ADDR_UNLOCK(ifp);
+ ifa_free(&public_ifa6->ia_ifa);
log(LOG_NOTICE, "regen_tmpaddr: failed to create a new"
" tmp addr,errno=%d\n", e);
return (-1);
}
- IF_ADDR_UNLOCK(ifp);
+ ifa_free(&public_ifa6->ia_ifa);
return (0);
}
- IF_ADDR_UNLOCK(ifp);
return (-1);
}
OpenPOWER on IntegriCloud