Author: hrs
Date: Sat Dec  3 22:15:42 2011
New Revision: 228246
URL: http://svn.freebsd.org/changeset/base/228246

Log:
  MFC r226446:
  Fix a problem that an interface unexpectedly becomes IFF_UP by
  just doing "ifconfing inet6 -ifdisabled" when the interface has
  ND6_IFF_AUTO_LINKLOCAL flag and no link-local address.
  
  Approved by:  re (bz)

Modified:
  releng/9.0/sys/netinet6/nd6.c
Directory Properties:
  releng/9.0/sys/   (props changed)
  releng/9.0/sys/amd64/include/xen/   (props changed)
  releng/9.0/sys/boot/   (props changed)
  releng/9.0/sys/boot/i386/efi/   (props changed)
  releng/9.0/sys/boot/ia64/efi/   (props changed)
  releng/9.0/sys/boot/ia64/ski/   (props changed)
  releng/9.0/sys/boot/powerpc/boot1.chrp/   (props changed)
  releng/9.0/sys/boot/powerpc/ofw/   (props changed)
  releng/9.0/sys/cddl/contrib/opensolaris/   (props changed)
  releng/9.0/sys/conf/   (props changed)
  releng/9.0/sys/contrib/dev/acpica/   (props changed)
  releng/9.0/sys/contrib/octeon-sdk/   (props changed)
  releng/9.0/sys/contrib/pf/   (props changed)
  releng/9.0/sys/contrib/x86emu/   (props changed)

Modified: releng/9.0/sys/netinet6/nd6.c
==============================================================================
--- releng/9.0/sys/netinet6/nd6.c       Sat Dec  3 22:14:15 2011        
(r228245)
+++ releng/9.0/sys/netinet6/nd6.c       Sat Dec  3 22:15:42 2011        
(r228246)
@@ -1364,7 +1364,8 @@ nd6_ioctl(u_long cmd, caddr_t data, stru
                                    " duplicate.\n");
                        } else {
                                ND_IFINFO(ifp)->flags &= ~ND6_IFF_IFDISABLED;
-                               in6_if_up(ifp);
+                               if (ifp->if_flags & IFF_UP)
+                                       in6_if_up(ifp);
                        }
                } else if (!(ND_IFINFO(ifp)->flags & ND6_IFF_IFDISABLED) &&
                            (ND.flags & ND6_IFF_IFDISABLED)) {
@@ -1382,35 +1383,37 @@ nd6_ioctl(u_long cmd, caddr_t data, stru
                        IF_ADDR_UNLOCK(ifp);
                }
 
-               if (!(ND_IFINFO(ifp)->flags & ND6_IFF_AUTO_LINKLOCAL) &&
-                   (ND.flags & ND6_IFF_AUTO_LINKLOCAL)) {
-                       /* auto_linklocal 0->1 transision */
-
-                       /* If no link-local address on ifp, configure */
-                       ND_IFINFO(ifp)->flags |= ND6_IFF_AUTO_LINKLOCAL;
-                       in6_ifattach(ifp, NULL);
-               } else if ((ND_IFINFO(ifp)->flags & ND6_IFF_AUTO_LINKLOCAL) &&
-                   !(ND.flags & ND6_IFF_IFDISABLED)) {
-                       /*
-                        * When the IF already has
-                        * ND6_IFF_AUTO_LINKLOCAL and no link-local
-                        * address is assigned, try to assign one.
-                        */
-                       int haslinklocal = 0;
+               if (ND.flags & ND6_IFF_AUTO_LINKLOCAL) {
+                       if (!(ND_IFINFO(ifp)->flags & ND6_IFF_AUTO_LINKLOCAL)) {
+                               /* auto_linklocal 0->1 transision */
+
+                               /* If no link-local address on ifp, configure */
+                               ND_IFINFO(ifp)->flags |= ND6_IFF_AUTO_LINKLOCAL;
+                               in6_ifattach(ifp, NULL);
+                       } else if (!(ND.flags & ND6_IFF_IFDISABLED) &&
+                           ifp->if_flags & IFF_UP) {
+                               /*
+                                * When the IF already has
+                                * ND6_IFF_AUTO_LINKLOCAL, no link-local
+                                * address is assigned, and IFF_UP, try to
+                                * assign one.
+                                */
+                               int haslinklocal = 0;
                        
-                       IF_ADDR_LOCK(ifp);
-                       TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
-                               if (ifa->ifa_addr->sa_family != AF_INET6)
-                                       continue;
-                               ia = (struct in6_ifaddr *)ifa;
-                               if (IN6_IS_ADDR_LINKLOCAL(IA6_IN6(ia))) {
-                                       haslinklocal = 1;
-                                       break;
+                               IF_ADDR_LOCK(ifp);
+                               TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) 
{
+                                       if (ifa->ifa_addr->sa_family != 
AF_INET6)
+                                               continue;
+                                       ia = (struct in6_ifaddr *)ifa;
+                                       if (IN6_IS_ADDR_LINKLOCAL(IA6_IN6(ia))) 
{
+                                               haslinklocal = 1;
+                                               break;
+                                       }
                                }
+                               IF_ADDR_UNLOCK(ifp);
+                               if (!haslinklocal)
+                                       in6_ifattach(ifp, NULL);
                        }
-                       IF_ADDR_UNLOCK(ifp);
-                       if (!haslinklocal)
-                               in6_ifattach(ifp, NULL);
                }
        }
                ND_IFINFO(ifp)->flags = ND.flags;
_______________________________________________
[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