summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/netinet6/in6.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-12-09 14:19:03 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2017-01-10 09:53:34 +0100
commit75b706fde4cbf82bcd41a1cec319778aa0f8eb2d (patch)
treeea39a351a1f6337b5a5dd6036314693adef5ffe6 /freebsd/sys/netinet6/in6.c
parentVMSTAT(8): Port to RTEMS (diff)
downloadrtems-libbsd-75b706fde4cbf82bcd41a1cec319778aa0f8eb2d.tar.bz2
Update to FreeBSD head 2016-12-10
Git mirror commit 80c55f08a05ab3b26a73b226ccb56adc3122a55c.
Diffstat (limited to 'freebsd/sys/netinet6/in6.c')
-rw-r--r--freebsd/sys/netinet6/in6.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/freebsd/sys/netinet6/in6.c b/freebsd/sys/netinet6/in6.c
index f5d82524..8a4c3663 100644
--- a/freebsd/sys/netinet6/in6.c
+++ b/freebsd/sys/netinet6/in6.c
@@ -634,7 +634,7 @@ in6_control(struct socket *so, u_long cmd, caddr_t data,
/* relate the address to the prefix */
if (ia->ia6_ndpr == NULL) {
ia->ia6_ndpr = pr;
- pr->ndpr_refcnt++;
+ pr->ndpr_addrcnt++;
/*
* If this is the first autoconf address from the
@@ -642,7 +642,7 @@ in6_control(struct socket *so, u_long cmd, caddr_t data,
* (when required).
*/
if ((ia->ia6_flags & IN6_IFF_AUTOCONF) &&
- V_ip6_use_tempaddr && pr->ndpr_refcnt == 1) {
+ V_ip6_use_tempaddr && pr->ndpr_addrcnt == 1) {
int e;
if ((e = in6_tmpifadd(ia, 1, 0)) != 0) {
log(LOG_NOTICE, "in6_control: failed "
@@ -651,6 +651,7 @@ in6_control(struct socket *so, u_long cmd, caddr_t data,
}
}
}
+ nd6_prefix_rele(pr);
/*
* this might affect the status of autoconfigured addresses,
@@ -694,12 +695,16 @@ aifaddr_out:
* and the prefix management. We do this, however, to provide
* as much backward compatibility as possible in terms of
* the ioctl operation.
- * Note that in6_purgeaddr() will decrement ndpr_refcnt.
+ * Note that in6_purgeaddr() will decrement ndpr_addrcnt.
*/
pr = ia->ia6_ndpr;
in6_purgeaddr(&ia->ia_ifa);
- if (pr && pr->ndpr_refcnt == 0)
- prelist_remove(pr);
+ if (pr != NULL && pr->ndpr_addrcnt == 0) {
+ ND6_WLOCK();
+ nd6_prefix_unlink(pr, NULL);
+ ND6_WUNLOCK();
+ nd6_prefix_del(pr);
+ }
EVENTHANDLER_INVOKE(ifaddr_event, ifp);
break;
}
@@ -1309,9 +1314,9 @@ in6_unlink_ifa(struct in6_ifaddr *ia, struct ifnet *ifp)
"in6_unlink_ifa: autoconf'ed address "
"%s has no prefix\n", ip6_sprintf(ip6buf, IA6_IN6(ia))));
} else {
- ia->ia6_ndpr->ndpr_refcnt--;
+ ia->ia6_ndpr->ndpr_addrcnt--;
/* Do not delete lles within prefix if refcont != 0 */
- if (ia->ia6_ndpr->ndpr_refcnt == 0)
+ if (ia->ia6_ndpr->ndpr_addrcnt == 0)
remove_lle = 1;
ia->ia6_ndpr = NULL;
}