Author: hrs
Date: Thu Jul 23 19:54:42 2015
New Revision: 285822
URL: https://svnweb.freebsd.org/changeset/base/285822

Log:
  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)

Modified:
  stable/10/sys/netinet6/in6.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/netinet6/in6.c
==============================================================================
--- stable/10/sys/netinet6/in6.c        Thu Jul 23 19:53:49 2015        
(r285821)
+++ stable/10/sys/netinet6/in6.c        Thu Jul 23 19:54:42 2015        
(r285822)
@@ -701,7 +701,8 @@ in6_control(struct socket *so, u_long cm
                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 cm
                 * 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;
        }
 
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to