diff options
author | qingli <qingli@FreeBSD.org> | 2010-02-27 07:12:25 +0000 |
---|---|---|
committer | qingli <qingli@FreeBSD.org> | 2010-02-27 07:12:25 +0000 |
commit | 03d2b3884ad57edb16b4ab6773c1ea6269efa2e1 (patch) | |
tree | 8d9092c3bb0f69badfd4192f4e88c3c4a30b6b20 | |
parent | 11df6402b4916bd2c5bf5c685dc72b0c13a37098 (diff) | |
download | FreeBSD-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.c | 9 |
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); } |