summaryrefslogtreecommitdiff
path: root/sys/netinet6/in6.c
diff options
context:
space:
mode:
authorJun-ichiro itojun Hagino <itojun@cvs.openbsd.org>2002-10-17 00:09:40 +0000
committerJun-ichiro itojun Hagino <itojun@cvs.openbsd.org>2002-10-17 00:09:40 +0000
commit184f0f0cf626ba16e8792cf6eed29798ef876839 (patch)
tree92c0d2e9ef418f7decefe282bf6d9a21f2e3f404 /sys/netinet6/in6.c
parent12123c65b426f190f521b902bf0727e9890ee108 (diff)
do not differentiate manually configured address from autoconfigured ones
wrt prefix management; - always earn a reference to the prefix when an address is configured (by ioctl). - always delete the prefix when an address that has the last referene is manually removed. The change should solve the problem raised in KAME-snap 6989. sync w/kame
Diffstat (limited to 'sys/netinet6/in6.c')
-rw-r--r--sys/netinet6/in6.c27
1 files changed, 10 insertions, 17 deletions
diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c
index c52f013e59e..883e52c7b78 100644
--- a/sys/netinet6/in6.c
+++ b/sys/netinet6/in6.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: in6.c,v 1.48 2002/09/23 23:28:15 itojun Exp $ */
+/* $OpenBSD: in6.c,v 1.49 2002/10/17 00:09:39 itojun Exp $ */
/* $KAME: in6.c,v 1.198 2001/07/18 09:12:38 itojun Exp $ */
/*
@@ -704,7 +704,7 @@ in6_control(so, cmd, data, ifp, p)
pr0.ndpr_vltime = ifra->ifra_lifetime.ia6t_vltime;
pr0.ndpr_pltime = ifra->ifra_lifetime.ia6t_pltime;
- /* add the prefix if there's one. */
+ /* add the prefix if not yet. */
if ((pr = nd6_prefix_lookup(&pr0)) == NULL) {
/*
* nd6_prelist_add will install the corresponding
@@ -718,8 +718,9 @@ in6_control(so, cmd, data, ifp, p)
return (EINVAL); /* XXX panic here? */
}
}
- if ((ia->ia6_flags & IN6_IFF_AUTOCONF) &&
- ia->ia6_ndpr == NULL) { /* new autoconfed addr */
+
+ /* relate the address to the prefix */
+ if (ia->ia6_ndpr == NULL) {
ia->ia6_ndpr = pr;
pr->ndpr_refcnt++;
}
@@ -759,20 +760,12 @@ in6_control(so, cmd, data, ifp, p)
pr0.ndpr_prefix.sin6_addr.s6_addr32[i] &=
ia->ia_prefixmask.sin6_addr.s6_addr32[i];
}
- /*
- * The logic of the following condition is a bit complicated.
- * We expire the prefix when
- * 1. the address obeys autoconfiguration and it is the
- * only owner of the associated prefix, or
- * 2. the address does not obey autoconf and there is no
- * other owner of the prefix.
- */
if ((pr = nd6_prefix_lookup(&pr0)) != NULL &&
- (((ia->ia6_flags & IN6_IFF_AUTOCONF) != 0 &&
- pr->ndpr_refcnt == 1) ||
- ((ia->ia6_flags & IN6_IFF_AUTOCONF) == 0 &&
- pr->ndpr_refcnt == 0)))
- purgeprefix = 1;
+ pr == ia->ia6_ndpr) {
+ pr->ndpr_refcnt--;
+ if (pr->ndpr_refcnt == 0)
+ purgeprefix = 1;
+ }
purgeaddr:
in6_purgeaddr(&ia->ia_ifa);