summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhrs <hrs@FreeBSD.org>2015-07-23 19:54:42 +0000
committerhrs <hrs@FreeBSD.org>2015-07-23 19:54:42 +0000
commit1bf10917ef2861d659852b889d19c43ecbb905c9 (patch)
tree6c75c81d58bee42c9c512ed39e692cca47081bd7
parent12f61d8213ff85047af79f358196c1d5d6eaab8d (diff)
downloadFreeBSD-src-1bf10917ef2861d659852b889d19c43ecbb905c9.zip
FreeBSD-src-1bf10917ef2861d659852b889d19c43ecbb905c9.tar.gz
MFC r273992:
Fix a bug which prevented ND6_IFF_IFDISABLED flag from clearing when the newly-added IPv6 address was /128. Approved by: re (gjb)
-rw-r--r--sys/netinet6/in6.c50
1 files changed, 24 insertions, 26 deletions
diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c
index db1db84..af374a0 100644
--- a/sys/netinet6/in6.c
+++ b/sys/netinet6/in6.c
@@ -701,7 +701,8 @@ in6_control(struct socket *so, u_long cmd, caddr_t data,
pr0.ndpr_plen = in6_mask2len(&ifra->ifra_prefixmask.sin6_addr,
NULL);
if (pr0.ndpr_plen == 128) {
- break; /* we don't need to install a host route. */
+ /* we don't need to install a host route. */
+ goto aifaddr_out;
}
pr0.ndpr_prefix = ifra->ifra_addr;
/* apply the mask for safety. */
@@ -769,32 +770,29 @@ in6_control(struct socket *so, u_long cmd, caddr_t data,
* that is, this address might make other addresses detached.
*/
pfxlist_onlink_check();
- if (error == 0 && ia) {
- if (ND_IFINFO(ifp)->flags & ND6_IFF_IFDISABLED) {
- /*
- * Try to clear the flag when a new
- * IPv6 address is added onto an
- * IFDISABLED interface and it
- * succeeds.
- */
- struct in6_ndireq nd;
-
- memset(&nd, 0, sizeof(nd));
- nd.ndi.flags = ND_IFINFO(ifp)->flags;
- nd.ndi.flags &= ~ND6_IFF_IFDISABLED;
- if (nd6_ioctl(SIOCSIFINFO_FLAGS,
- (caddr_t)&nd, ifp) < 0)
- log(LOG_NOTICE, "SIOCAIFADDR_IN6: "
- "SIOCSIFINFO_FLAGS for -ifdisabled "
- "failed.");
- /*
- * Ignore failure of clearing the flag
- * intentionally. The failure means
- * address duplication was detected.
- */
- }
- EVENTHANDLER_INVOKE(ifaddr_event, ifp);
+aifaddr_out:
+ if (error != 0 || ia == NULL)
+ break;
+ /*
+ * Try to clear the flag when a new IPv6 address is added
+ * onto an IFDISABLED interface and it succeeds.
+ */
+ if (ND_IFINFO(ifp)->flags & ND6_IFF_IFDISABLED) {
+ struct in6_ndireq nd;
+
+ memset(&nd, 0, sizeof(nd));
+ nd.ndi.flags = ND_IFINFO(ifp)->flags;
+ nd.ndi.flags &= ~ND6_IFF_IFDISABLED;
+ if (nd6_ioctl(SIOCSIFINFO_FLAGS, (caddr_t)&nd, ifp) < 0)
+ log(LOG_NOTICE, "SIOCAIFADDR_IN6: "
+ "SIOCSIFINFO_FLAGS for -ifdisabled "
+ "failed.");
+ /*
+ * Ignore failure of clearing the flag intentionally.
+ * The failure means address duplication was detected.
+ */
}
+ EVENTHANDLER_INVOKE(ifaddr_event, ifp);
break;
}
OpenPOWER on IntegriCloud