+ case SIOCAUTOCONF_START:
+ ifp->if_eflags |= IFEF_ACCEPT_RTADVD;
+ return (0);
+
+ case SIOCAUTOCONF_STOP:
+ {
+ struct ifaddr *ifa, *nifa = NULL;
+
+ ifp->if_eflags &= ~IFEF_ACCEPT_RTADVD;
+
+ /* nuke prefix list. this may try to remove some of ifaddrs as well */
+ in6_purgeprefix(ifp);
+
+ /* removed autoconfigured address from interface */
+
+ for (ifa = TAILQ_FIRST(&ifp->if_addrlist); ifa != NULL; ifa = nifa)
+ {
+ nifa = TAILQ_NEXT(ifa, ifa_list);
+ if (ifa->ifa_addr == NULL || ifa->ifa_addr->sa_family != AF_INET6)
+ continue;
+ if (((struct in6_ifaddr *)ifa)->ia6_flags & IN6_IFF_AUTOCONF)
+ in6_purgeaddr(ifa);
+ }
+ return (0);
+ }
+
+
+ case SIOCLL_START:
+
+ /* NOTE: All the interface specific DLIL attachements should be done here
+ * They are currently done in in6_ifattach() for the interfaces that need it
+ */
+
+ if (ifp->if_type == IFT_PPP && ifra->ifra_addr.sin6_family == AF_INET6 &&
+ ifra->ifra_dstaddr.sin6_family == AF_INET6)
+ in6_if_up(ifp, ifra); /* PPP may provide LinkLocal addresses */
+ else
+ in6_if_up(ifp, 0);
+
+ return(0);
+
+ case SIOCLL_STOP:
+ {
+ struct ifaddr *ifa, *nifa = NULL;
+
+ /* removed link local addresses from interface */
+
+ for (ifa = TAILQ_FIRST(&ifp->if_addrlist); ifa != NULL; ifa = nifa)
+ {
+ nifa = TAILQ_NEXT(ifa, ifa_list);
+ if (ifa->ifa_addr == NULL || ifa->ifa_addr->sa_family != AF_INET6)
+ continue;
+ if (IN6_IS_ADDR_LINKLOCAL(IFA_IN6(ifa)))
+ in6_purgeaddr(ifa);
+ }
+ return (0);
+ }
+
+
+ case SIOCPROTOATTACH_IN6:
+