The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/netinet6/in6.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
    3  * All rights reserved.
    4  *
    5  * Redistribution and use in source and binary forms, with or without
    6  * modification, are permitted provided that the following conditions
    7  * are met:
    8  * 1. Redistributions of source code must retain the above copyright
    9  *    notice, this list of conditions and the following disclaimer.
   10  * 2. Redistributions in binary form must reproduce the above copyright
   11  *    notice, this list of conditions and the following disclaimer in the
   12  *    documentation and/or other materials provided with the distribution.
   13  * 3. Neither the name of the project nor the names of its contributors
   14  *    may be used to endorse or promote products derived from this software
   15  *    without specific prior written permission.
   16  *
   17  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
   18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
   21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   27  * SUCH DAMAGE.
   28  *
   29  *      $KAME: in6.c,v 1.259 2002/01/21 11:37:50 keiichi Exp $
   30  */
   31 
   32 /*-
   33  * Copyright (c) 1982, 1986, 1991, 1993
   34  *      The Regents of the University of California.  All rights reserved.
   35  *
   36  * Redistribution and use in source and binary forms, with or without
   37  * modification, are permitted provided that the following conditions
   38  * are met:
   39  * 1. Redistributions of source code must retain the above copyright
   40  *    notice, this list of conditions and the following disclaimer.
   41  * 2. Redistributions in binary form must reproduce the above copyright
   42  *    notice, this list of conditions and the following disclaimer in the
   43  *    documentation and/or other materials provided with the distribution.
   44  * 4. Neither the name of the University nor the names of its contributors
   45  *    may be used to endorse or promote products derived from this software
   46  *    without specific prior written permission.
   47  *
   48  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   49  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   50  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   51  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   52  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   53  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   54  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   55  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   56  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   57  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   58  * SUCH DAMAGE.
   59  *
   60  *      @(#)in.c        8.2 (Berkeley) 11/15/93
   61  */
   62 
   63 #include <sys/cdefs.h>
   64 __FBSDID("$FreeBSD: releng/11.0/sys/netinet6/in6.c 302081 2016-06-22 11:29:21Z ae $");
   65 
   66 #include "opt_compat.h"
   67 #include "opt_inet.h"
   68 #include "opt_inet6.h"
   69 
   70 #include <sys/param.h>
   71 #include <sys/eventhandler.h>
   72 #include <sys/errno.h>
   73 #include <sys/jail.h>
   74 #include <sys/malloc.h>
   75 #include <sys/socket.h>
   76 #include <sys/socketvar.h>
   77 #include <sys/sockio.h>
   78 #include <sys/systm.h>
   79 #include <sys/priv.h>
   80 #include <sys/proc.h>
   81 #include <sys/time.h>
   82 #include <sys/kernel.h>
   83 #include <sys/lock.h>
   84 #include <sys/rmlock.h>
   85 #include <sys/syslog.h>
   86 
   87 #include <net/if.h>
   88 #include <net/if_var.h>
   89 #include <net/if_types.h>
   90 #include <net/route.h>
   91 #include <net/if_dl.h>
   92 #include <net/vnet.h>
   93 
   94 #include <netinet/in.h>
   95 #include <netinet/in_var.h>
   96 #include <net/if_llatbl.h>
   97 #include <netinet/if_ether.h>
   98 #include <netinet/in_systm.h>
   99 #include <netinet/ip.h>
  100 #include <netinet/in_pcb.h>
  101 #include <netinet/ip_carp.h>
  102 
  103 #include <netinet/ip6.h>
  104 #include <netinet6/ip6_var.h>
  105 #include <netinet6/nd6.h>
  106 #include <netinet6/mld6_var.h>
  107 #include <netinet6/ip6_mroute.h>
  108 #include <netinet6/in6_ifattach.h>
  109 #include <netinet6/scope6_var.h>
  110 #include <netinet6/in6_fib.h>
  111 #include <netinet6/in6_pcb.h>
  112 
  113 VNET_DECLARE(int, icmp6_nodeinfo_oldmcprefix);
  114 #define V_icmp6_nodeinfo_oldmcprefix    VNET(icmp6_nodeinfo_oldmcprefix)
  115 
  116 /*
  117  * Definitions of some costant IP6 addresses.
  118  */
  119 const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT;
  120 const struct in6_addr in6addr_loopback = IN6ADDR_LOOPBACK_INIT;
  121 const struct in6_addr in6addr_nodelocal_allnodes =
  122         IN6ADDR_NODELOCAL_ALLNODES_INIT;
  123 const struct in6_addr in6addr_linklocal_allnodes =
  124         IN6ADDR_LINKLOCAL_ALLNODES_INIT;
  125 const struct in6_addr in6addr_linklocal_allrouters =
  126         IN6ADDR_LINKLOCAL_ALLROUTERS_INIT;
  127 const struct in6_addr in6addr_linklocal_allv2routers =
  128         IN6ADDR_LINKLOCAL_ALLV2ROUTERS_INIT;
  129 
  130 const struct in6_addr in6mask0 = IN6MASK0;
  131 const struct in6_addr in6mask32 = IN6MASK32;
  132 const struct in6_addr in6mask64 = IN6MASK64;
  133 const struct in6_addr in6mask96 = IN6MASK96;
  134 const struct in6_addr in6mask128 = IN6MASK128;
  135 
  136 const struct sockaddr_in6 sa6_any =
  137         { sizeof(sa6_any), AF_INET6, 0, 0, IN6ADDR_ANY_INIT, 0 };
  138 
  139 static int in6_notify_ifa(struct ifnet *, struct in6_ifaddr *,
  140         struct in6_aliasreq *, int);
  141 static void in6_unlink_ifa(struct in6_ifaddr *, struct ifnet *);
  142 
  143 static int in6_validate_ifra(struct ifnet *, struct in6_aliasreq *,
  144     struct in6_ifaddr *, int);
  145 static struct in6_ifaddr *in6_alloc_ifa(struct ifnet *,
  146     struct in6_aliasreq *, int flags);
  147 static int in6_update_ifa_internal(struct ifnet *, struct in6_aliasreq *,
  148     struct in6_ifaddr *, int, int);
  149 static int in6_broadcast_ifa(struct ifnet *, struct in6_aliasreq *,
  150     struct in6_ifaddr *, int);
  151 
  152 #define ifa2ia6(ifa)    ((struct in6_ifaddr *)(ifa))
  153 #define ia62ifa(ia6)    (&((ia6)->ia_ifa))
  154 
  155 
  156 void
  157 in6_newaddrmsg(struct in6_ifaddr *ia, int cmd)
  158 {
  159         struct sockaddr_dl gateway;
  160         struct sockaddr_in6 mask, addr;
  161         struct rtentry rt;
  162 
  163         /*
  164          * initialize for rtmsg generation
  165          */
  166         bzero(&gateway, sizeof(gateway));
  167         gateway.sdl_len = sizeof(gateway);
  168         gateway.sdl_family = AF_LINK;
  169 
  170         bzero(&rt, sizeof(rt));
  171         rt.rt_gateway = (struct sockaddr *)&gateway;
  172         memcpy(&mask, &ia->ia_prefixmask, sizeof(ia->ia_prefixmask));
  173         memcpy(&addr, &ia->ia_addr, sizeof(ia->ia_addr));
  174         rt_mask(&rt) = (struct sockaddr *)&mask;
  175         rt_key(&rt) = (struct sockaddr *)&addr;
  176         rt.rt_flags = RTF_HOST | RTF_STATIC;
  177         if (cmd == RTM_ADD)
  178                 rt.rt_flags |= RTF_UP;
  179         /* Announce arrival of local address to all FIBs. */
  180         rt_newaddrmsg(cmd, &ia->ia_ifa, 0, &rt);
  181 }
  182 
  183 int
  184 in6_mask2len(struct in6_addr *mask, u_char *lim0)
  185 {
  186         int x = 0, y;
  187         u_char *lim = lim0, *p;
  188 
  189         /* ignore the scope_id part */
  190         if (lim0 == NULL || lim0 - (u_char *)mask > sizeof(*mask))
  191                 lim = (u_char *)mask + sizeof(*mask);
  192         for (p = (u_char *)mask; p < lim; x++, p++) {
  193                 if (*p != 0xff)
  194                         break;
  195         }
  196         y = 0;
  197         if (p < lim) {
  198                 for (y = 0; y < 8; y++) {
  199                         if ((*p & (0x80 >> y)) == 0)
  200                                 break;
  201                 }
  202         }
  203 
  204         /*
  205          * when the limit pointer is given, do a stricter check on the
  206          * remaining bits.
  207          */
  208         if (p < lim) {
  209                 if (y != 0 && (*p & (0x00ff >> y)) != 0)
  210                         return (-1);
  211                 for (p = p + 1; p < lim; p++)
  212                         if (*p != 0)
  213                                 return (-1);
  214         }
  215 
  216         return x * 8 + y;
  217 }
  218 
  219 #ifdef COMPAT_FREEBSD32
  220 struct in6_ndifreq32 {
  221         char ifname[IFNAMSIZ];
  222         uint32_t ifindex;
  223 };
  224 #define SIOCGDEFIFACE32_IN6     _IOWR('i', 86, struct in6_ndifreq32)
  225 #endif
  226 
  227 int
  228 in6_control(struct socket *so, u_long cmd, caddr_t data,
  229     struct ifnet *ifp, struct thread *td)
  230 {
  231         struct  in6_ifreq *ifr = (struct in6_ifreq *)data;
  232         struct  in6_ifaddr *ia = NULL;
  233         struct  in6_aliasreq *ifra = (struct in6_aliasreq *)data;
  234         struct sockaddr_in6 *sa6;
  235         int carp_attached = 0;
  236         int error;
  237         u_long ocmd = cmd;
  238 
  239         /*
  240          * Compat to make pre-10.x ifconfig(8) operable.
  241          */
  242         if (cmd == OSIOCAIFADDR_IN6)
  243                 cmd = SIOCAIFADDR_IN6;
  244 
  245         switch (cmd) {
  246         case SIOCGETSGCNT_IN6:
  247         case SIOCGETMIFCNT_IN6:
  248                 /*
  249                  * XXX mrt_ioctl has a 3rd, unused, FIB argument in route.c.
  250                  * We cannot see how that would be needed, so do not adjust the
  251                  * KPI blindly; more likely should clean up the IPv4 variant.
  252                  */
  253                 return (mrt6_ioctl ? mrt6_ioctl(cmd, data) : EOPNOTSUPP);
  254         }
  255 
  256         switch (cmd) {
  257         case SIOCAADDRCTL_POLICY:
  258         case SIOCDADDRCTL_POLICY:
  259                 if (td != NULL) {
  260                         error = priv_check(td, PRIV_NETINET_ADDRCTRL6);
  261                         if (error)
  262                                 return (error);
  263                 }
  264                 return (in6_src_ioctl(cmd, data));
  265         }
  266 
  267         if (ifp == NULL)
  268                 return (EOPNOTSUPP);
  269 
  270         switch (cmd) {
  271         case SIOCSNDFLUSH_IN6:
  272         case SIOCSPFXFLUSH_IN6:
  273         case SIOCSRTRFLUSH_IN6:
  274         case SIOCSDEFIFACE_IN6:
  275         case SIOCSIFINFO_FLAGS:
  276         case SIOCSIFINFO_IN6:
  277                 if (td != NULL) {
  278                         error = priv_check(td, PRIV_NETINET_ND6);
  279                         if (error)
  280                                 return (error);
  281                 }
  282                 /* FALLTHROUGH */
  283         case OSIOCGIFINFO_IN6:
  284         case SIOCGIFINFO_IN6:
  285         case SIOCGNBRINFO_IN6:
  286         case SIOCGDEFIFACE_IN6:
  287                 return (nd6_ioctl(cmd, data, ifp));
  288 
  289 #ifdef COMPAT_FREEBSD32
  290         case SIOCGDEFIFACE32_IN6:
  291                 {
  292                         struct in6_ndifreq ndif;
  293                         struct in6_ndifreq32 *ndif32;
  294 
  295                         error = nd6_ioctl(SIOCGDEFIFACE_IN6, (caddr_t)&ndif,
  296                             ifp);
  297                         if (error)
  298                                 return (error);
  299                         ndif32 = (struct in6_ndifreq32 *)data;
  300                         ndif32->ifindex = ndif.ifindex;
  301                         return (0);
  302                 }
  303 #endif
  304         }
  305 
  306         switch (cmd) {
  307         case SIOCSIFPREFIX_IN6:
  308         case SIOCDIFPREFIX_IN6:
  309         case SIOCAIFPREFIX_IN6:
  310         case SIOCCIFPREFIX_IN6:
  311         case SIOCSGIFPREFIX_IN6:
  312         case SIOCGIFPREFIX_IN6:
  313                 log(LOG_NOTICE,
  314                     "prefix ioctls are now invalidated. "
  315                     "please use ifconfig.\n");
  316                 return (EOPNOTSUPP);
  317         }
  318 
  319         switch (cmd) {
  320         case SIOCSSCOPE6:
  321                 if (td != NULL) {
  322                         error = priv_check(td, PRIV_NETINET_SCOPE6);
  323                         if (error)
  324                                 return (error);
  325                 }
  326                 /* FALLTHROUGH */
  327         case SIOCGSCOPE6:
  328         case SIOCGSCOPE6DEF:
  329                 return (scope6_ioctl(cmd, data, ifp));
  330         }
  331 
  332         /*
  333          * Find address for this interface, if it exists.
  334          *
  335          * In netinet code, we have checked ifra_addr in SIOCSIF*ADDR operation
  336          * only, and used the first interface address as the target of other
  337          * operations (without checking ifra_addr).  This was because netinet
  338          * code/API assumed at most 1 interface address per interface.
  339          * Since IPv6 allows a node to assign multiple addresses
  340          * on a single interface, we almost always look and check the
  341          * presence of ifra_addr, and reject invalid ones here.
  342          * It also decreases duplicated code among SIOC*_IN6 operations.
  343          */
  344         switch (cmd) {
  345         case SIOCAIFADDR_IN6:
  346         case SIOCSIFPHYADDR_IN6:
  347                 sa6 = &ifra->ifra_addr;
  348                 break;
  349         case SIOCSIFADDR_IN6:
  350         case SIOCGIFADDR_IN6:
  351         case SIOCSIFDSTADDR_IN6:
  352         case SIOCSIFNETMASK_IN6:
  353         case SIOCGIFDSTADDR_IN6:
  354         case SIOCGIFNETMASK_IN6:
  355         case SIOCDIFADDR_IN6:
  356         case SIOCGIFPSRCADDR_IN6:
  357         case SIOCGIFPDSTADDR_IN6:
  358         case SIOCGIFAFLAG_IN6:
  359         case SIOCSNDFLUSH_IN6:
  360         case SIOCSPFXFLUSH_IN6:
  361         case SIOCSRTRFLUSH_IN6:
  362         case SIOCGIFALIFETIME_IN6:
  363         case SIOCGIFSTAT_IN6:
  364         case SIOCGIFSTAT_ICMP6:
  365                 sa6 = &ifr->ifr_addr;
  366                 break;
  367         case SIOCSIFADDR:
  368         case SIOCSIFBRDADDR:
  369         case SIOCSIFDSTADDR:
  370         case SIOCSIFNETMASK:
  371                 /*
  372                  * Although we should pass any non-INET6 ioctl requests
  373                  * down to driver, we filter some legacy INET requests.
  374                  * Drivers trust SIOCSIFADDR et al to come from an already
  375                  * privileged layer, and do not perform any credentials
  376                  * checks or input validation.
  377                  */
  378                 return (EINVAL);
  379         default:
  380                 sa6 = NULL;
  381                 break;
  382         }
  383         if (sa6 && sa6->sin6_family == AF_INET6) {
  384                 if (sa6->sin6_scope_id != 0)
  385                         error = sa6_embedscope(sa6, 0);
  386                 else
  387                         error = in6_setscope(&sa6->sin6_addr, ifp, NULL);
  388                 if (error != 0)
  389                         return (error);
  390                 if (td != NULL && (error = prison_check_ip6(td->td_ucred,
  391                     &sa6->sin6_addr)) != 0)
  392                         return (error);
  393                 ia = in6ifa_ifpwithaddr(ifp, &sa6->sin6_addr);
  394         } else
  395                 ia = NULL;
  396 
  397         switch (cmd) {
  398         case SIOCSIFADDR_IN6:
  399         case SIOCSIFDSTADDR_IN6:
  400         case SIOCSIFNETMASK_IN6:
  401                 /*
  402                  * Since IPv6 allows a node to assign multiple addresses
  403                  * on a single interface, SIOCSIFxxx ioctls are deprecated.
  404                  */
  405                 /* we decided to obsolete this command (20000704) */
  406                 error = EINVAL;
  407                 goto out;
  408 
  409         case SIOCDIFADDR_IN6:
  410                 /*
  411                  * for IPv4, we look for existing in_ifaddr here to allow
  412                  * "ifconfig if0 delete" to remove the first IPv4 address on
  413                  * the interface.  For IPv6, as the spec allows multiple
  414                  * interface address from the day one, we consider "remove the
  415                  * first one" semantics to be not preferable.
  416                  */
  417                 if (ia == NULL) {
  418                         error = EADDRNOTAVAIL;
  419                         goto out;
  420                 }
  421                 /* FALLTHROUGH */
  422         case SIOCAIFADDR_IN6:
  423                 /*
  424                  * We always require users to specify a valid IPv6 address for
  425                  * the corresponding operation.
  426                  */
  427                 if (ifra->ifra_addr.sin6_family != AF_INET6 ||
  428                     ifra->ifra_addr.sin6_len != sizeof(struct sockaddr_in6)) {
  429                         error = EAFNOSUPPORT;
  430                         goto out;
  431                 }
  432 
  433                 if (td != NULL) {
  434                         error = priv_check(td, (cmd == SIOCDIFADDR_IN6) ?
  435                             PRIV_NET_DELIFADDR : PRIV_NET_ADDIFADDR);
  436                         if (error)
  437                                 goto out;
  438                 }
  439                 /* FALLTHROUGH */
  440         case SIOCGIFSTAT_IN6:
  441         case SIOCGIFSTAT_ICMP6:
  442                 if (ifp->if_afdata[AF_INET6] == NULL) {
  443                         error = EPFNOSUPPORT;
  444                         goto out;
  445                 }
  446                 break;
  447 
  448         case SIOCGIFADDR_IN6:
  449                 /* This interface is basically deprecated. use SIOCGIFCONF. */
  450                 /* FALLTHROUGH */
  451         case SIOCGIFAFLAG_IN6:
  452         case SIOCGIFNETMASK_IN6:
  453         case SIOCGIFDSTADDR_IN6:
  454         case SIOCGIFALIFETIME_IN6:
  455                 /* must think again about its semantics */
  456                 if (ia == NULL) {
  457                         error = EADDRNOTAVAIL;
  458                         goto out;
  459                 }
  460                 break;
  461         }
  462 
  463         switch (cmd) {
  464         case SIOCGIFADDR_IN6:
  465                 ifr->ifr_addr = ia->ia_addr;
  466                 if ((error = sa6_recoverscope(&ifr->ifr_addr)) != 0)
  467                         goto out;
  468                 break;
  469 
  470         case SIOCGIFDSTADDR_IN6:
  471                 if ((ifp->if_flags & IFF_POINTOPOINT) == 0) {
  472                         error = EINVAL;
  473                         goto out;
  474                 }
  475                 /*
  476                  * XXX: should we check if ifa_dstaddr is NULL and return
  477                  * an error?
  478                  */
  479                 ifr->ifr_dstaddr = ia->ia_dstaddr;
  480                 if ((error = sa6_recoverscope(&ifr->ifr_dstaddr)) != 0)
  481                         goto out;
  482                 break;
  483 
  484         case SIOCGIFNETMASK_IN6:
  485                 ifr->ifr_addr = ia->ia_prefixmask;
  486                 break;
  487 
  488         case SIOCGIFAFLAG_IN6:
  489                 ifr->ifr_ifru.ifru_flags6 = ia->ia6_flags;
  490                 break;
  491 
  492         case SIOCGIFSTAT_IN6:
  493                 COUNTER_ARRAY_COPY(((struct in6_ifextra *)
  494                     ifp->if_afdata[AF_INET6])->in6_ifstat,
  495                     &ifr->ifr_ifru.ifru_stat,
  496                     sizeof(struct in6_ifstat) / sizeof(uint64_t));
  497                 break;
  498 
  499         case SIOCGIFSTAT_ICMP6:
  500                 COUNTER_ARRAY_COPY(((struct in6_ifextra *)
  501                     ifp->if_afdata[AF_INET6])->icmp6_ifstat,
  502                     &ifr->ifr_ifru.ifru_icmp6stat,
  503                     sizeof(struct icmp6_ifstat) / sizeof(uint64_t));
  504                 break;
  505 
  506         case SIOCGIFALIFETIME_IN6:
  507                 ifr->ifr_ifru.ifru_lifetime = ia->ia6_lifetime;
  508                 if (ia->ia6_lifetime.ia6t_vltime != ND6_INFINITE_LIFETIME) {
  509                         time_t maxexpire;
  510                         struct in6_addrlifetime *retlt =
  511                             &ifr->ifr_ifru.ifru_lifetime;
  512 
  513                         /*
  514                          * XXX: adjust expiration time assuming time_t is
  515                          * signed.
  516                          */
  517                         maxexpire = (-1) &
  518                             ~((time_t)1 << ((sizeof(maxexpire) * 8) - 1));
  519                         if (ia->ia6_lifetime.ia6t_vltime <
  520                             maxexpire - ia->ia6_updatetime) {
  521                                 retlt->ia6t_expire = ia->ia6_updatetime +
  522                                     ia->ia6_lifetime.ia6t_vltime;
  523                         } else
  524                                 retlt->ia6t_expire = maxexpire;
  525                 }
  526                 if (ia->ia6_lifetime.ia6t_pltime != ND6_INFINITE_LIFETIME) {
  527                         time_t maxexpire;
  528                         struct in6_addrlifetime *retlt =
  529                             &ifr->ifr_ifru.ifru_lifetime;
  530 
  531                         /*
  532                          * XXX: adjust expiration time assuming time_t is
  533                          * signed.
  534                          */
  535                         maxexpire = (-1) &
  536                             ~((time_t)1 << ((sizeof(maxexpire) * 8) - 1));
  537                         if (ia->ia6_lifetime.ia6t_pltime <
  538                             maxexpire - ia->ia6_updatetime) {
  539                                 retlt->ia6t_preferred = ia->ia6_updatetime +
  540                                     ia->ia6_lifetime.ia6t_pltime;
  541                         } else
  542                                 retlt->ia6t_preferred = maxexpire;
  543                 }
  544                 break;
  545 
  546         case SIOCAIFADDR_IN6:
  547         {
  548                 struct nd_prefixctl pr0;
  549                 struct nd_prefix *pr;
  550 
  551                 /*
  552                  * first, make or update the interface address structure,
  553                  * and link it to the list.
  554                  */
  555                 if ((error = in6_update_ifa(ifp, ifra, ia, 0)) != 0)
  556                         goto out;
  557                 if (ia != NULL)
  558                         ifa_free(&ia->ia_ifa);
  559                 if ((ia = in6ifa_ifpwithaddr(ifp, &ifra->ifra_addr.sin6_addr))
  560                     == NULL) {
  561                         /*
  562                          * this can happen when the user specify the 0 valid
  563                          * lifetime.
  564                          */
  565                         break;
  566                 }
  567 
  568                 if (cmd == ocmd && ifra->ifra_vhid > 0) {
  569                         if (carp_attach_p != NULL)
  570                                 error = (*carp_attach_p)(&ia->ia_ifa,
  571                                     ifra->ifra_vhid);
  572                         else
  573                                 error = EPROTONOSUPPORT;
  574                         if (error)
  575                                 goto out;
  576                         else
  577                                 carp_attached = 1;
  578                 }
  579 
  580                 /*
  581                  * then, make the prefix on-link on the interface.
  582                  * XXX: we'd rather create the prefix before the address, but
  583                  * we need at least one address to install the corresponding
  584                  * interface route, so we configure the address first.
  585                  */
  586 
  587                 /*
  588                  * convert mask to prefix length (prefixmask has already
  589                  * been validated in in6_update_ifa().
  590                  */
  591                 bzero(&pr0, sizeof(pr0));
  592                 pr0.ndpr_ifp = ifp;
  593                 pr0.ndpr_plen = in6_mask2len(&ifra->ifra_prefixmask.sin6_addr,
  594                     NULL);
  595                 if (pr0.ndpr_plen == 128) {
  596                         /* we don't need to install a host route. */
  597                         goto aifaddr_out;
  598                 }
  599                 pr0.ndpr_prefix = ifra->ifra_addr;
  600                 /* apply the mask for safety. */
  601                 IN6_MASK_ADDR(&pr0.ndpr_prefix.sin6_addr,
  602                     &ifra->ifra_prefixmask.sin6_addr);
  603 
  604                 /*
  605                  * XXX: since we don't have an API to set prefix (not address)
  606                  * lifetimes, we just use the same lifetimes as addresses.
  607                  * The (temporarily) installed lifetimes can be overridden by
  608                  * later advertised RAs (when accept_rtadv is non 0), which is
  609                  * an intended behavior.
  610                  */
  611                 pr0.ndpr_raf_onlink = 1; /* should be configurable? */
  612                 pr0.ndpr_raf_auto =
  613                     ((ifra->ifra_flags & IN6_IFF_AUTOCONF) != 0);
  614                 pr0.ndpr_vltime = ifra->ifra_lifetime.ia6t_vltime;
  615                 pr0.ndpr_pltime = ifra->ifra_lifetime.ia6t_pltime;
  616 
  617                 /* add the prefix if not yet. */
  618                 if ((pr = nd6_prefix_lookup(&pr0)) == NULL) {
  619                         /*
  620                          * nd6_prelist_add will install the corresponding
  621                          * interface route.
  622                          */
  623                         if ((error = nd6_prelist_add(&pr0, NULL, &pr)) != 0) {
  624                                 if (carp_attached)
  625                                         (*carp_detach_p)(&ia->ia_ifa);
  626                                 goto out;
  627                         }
  628                 }
  629 
  630                 /* relate the address to the prefix */
  631                 if (ia->ia6_ndpr == NULL) {
  632                         ia->ia6_ndpr = pr;
  633                         pr->ndpr_refcnt++;
  634 
  635                         /*
  636                          * If this is the first autoconf address from the
  637                          * prefix, create a temporary address as well
  638                          * (when required).
  639                          */
  640                         if ((ia->ia6_flags & IN6_IFF_AUTOCONF) &&
  641                             V_ip6_use_tempaddr && pr->ndpr_refcnt == 1) {
  642                                 int e;
  643                                 if ((e = in6_tmpifadd(ia, 1, 0)) != 0) {
  644                                         log(LOG_NOTICE, "in6_control: failed "
  645                                             "to create a temporary address, "
  646                                             "errno=%d\n", e);
  647                                 }
  648                         }
  649                 }
  650 
  651                 /*
  652                  * this might affect the status of autoconfigured addresses,
  653                  * that is, this address might make other addresses detached.
  654                  */
  655                 pfxlist_onlink_check();
  656 
  657 aifaddr_out:
  658                 /*
  659                  * Try to clear the flag when a new IPv6 address is added
  660                  * onto an IFDISABLED interface and it succeeds.
  661                  */
  662                 if (ND_IFINFO(ifp)->flags & ND6_IFF_IFDISABLED) {
  663                         struct in6_ndireq nd;
  664 
  665                         memset(&nd, 0, sizeof(nd));
  666                         nd.ndi.flags = ND_IFINFO(ifp)->flags;
  667                         nd.ndi.flags &= ~ND6_IFF_IFDISABLED;
  668                         if (nd6_ioctl(SIOCSIFINFO_FLAGS, (caddr_t)&nd, ifp) < 0)
  669                                 log(LOG_NOTICE, "SIOCAIFADDR_IN6: "
  670                                     "SIOCSIFINFO_FLAGS for -ifdisabled "
  671                                     "failed.");
  672                         /*
  673                          * Ignore failure of clearing the flag intentionally.
  674                          * The failure means address duplication was detected.
  675                          */
  676                 }
  677                 EVENTHANDLER_INVOKE(ifaddr_event, ifp);
  678                 break;
  679         }
  680 
  681         case SIOCDIFADDR_IN6:
  682         {
  683                 struct nd_prefix *pr;
  684 
  685                 /*
  686                  * If the address being deleted is the only one that owns
  687                  * the corresponding prefix, expire the prefix as well.
  688                  * XXX: theoretically, we don't have to worry about such
  689                  * relationship, since we separate the address management
  690                  * and the prefix management.  We do this, however, to provide
  691                  * as much backward compatibility as possible in terms of
  692                  * the ioctl operation.
  693                  * Note that in6_purgeaddr() will decrement ndpr_refcnt.
  694                  */
  695                 pr = ia->ia6_ndpr;
  696                 in6_purgeaddr(&ia->ia_ifa);
  697                 if (pr && pr->ndpr_refcnt == 0)
  698                         prelist_remove(pr);
  699                 EVENTHANDLER_INVOKE(ifaddr_event, ifp);
  700                 break;
  701         }
  702 
  703         default:
  704                 if (ifp->if_ioctl == NULL) {
  705                         error = EOPNOTSUPP;
  706                         goto out;
  707                 }
  708                 error = (*ifp->if_ioctl)(ifp, cmd, data);
  709                 goto out;
  710         }
  711 
  712         error = 0;
  713 out:
  714         if (ia != NULL)
  715                 ifa_free(&ia->ia_ifa);
  716         return (error);
  717 }
  718 
  719 
  720 /*
  721  * Join necessary multicast groups.  Factored out from in6_update_ifa().
  722  * This entire work should only be done once, for the default FIB.
  723  */
  724 static int
  725 in6_update_ifa_join_mc(struct ifnet *ifp, struct in6_aliasreq *ifra,
  726     struct in6_ifaddr *ia, int flags, struct in6_multi **in6m_sol)
  727 {
  728         char ip6buf[INET6_ADDRSTRLEN];
  729         struct in6_addr mltaddr;
  730         struct in6_multi_mship *imm;
  731         int delay, error;
  732 
  733         KASSERT(in6m_sol != NULL, ("%s: in6m_sol is NULL", __func__));
  734 
  735         /* Join solicited multicast addr for new host id. */
  736         bzero(&mltaddr, sizeof(struct in6_addr));
  737         mltaddr.s6_addr32[0] = IPV6_ADDR_INT32_MLL;
  738         mltaddr.s6_addr32[2] = htonl(1);
  739         mltaddr.s6_addr32[3] = ifra->ifra_addr.sin6_addr.s6_addr32[3];
  740         mltaddr.s6_addr8[12] = 0xff;
  741         if ((error = in6_setscope(&mltaddr, ifp, NULL)) != 0) {
  742                 /* XXX: should not happen */
  743                 log(LOG_ERR, "%s: in6_setscope failed\n", __func__);
  744                 goto cleanup;
  745         }
  746         delay = error = 0;
  747         if ((flags & IN6_IFAUPDATE_DADDELAY)) {
  748                 /*
  749                  * We need a random delay for DAD on the address being
  750                  * configured.  It also means delaying transmission of the
  751                  * corresponding MLD report to avoid report collision.
  752                  * [RFC 4861, Section 6.3.7]
  753                  */
  754                 delay = arc4random() % (MAX_RTR_SOLICITATION_DELAY * hz);
  755         }
  756         imm = in6_joingroup(ifp, &mltaddr, &error, delay);
  757         if (imm == NULL) {
  758                 nd6log((LOG_WARNING, "%s: in6_joingroup failed for %s on %s "
  759                     "(errno=%d)\n", __func__, ip6_sprintf(ip6buf, &mltaddr),
  760                     if_name(ifp), error));
  761                 goto cleanup;
  762         }
  763         LIST_INSERT_HEAD(&ia->ia6_memberships, imm, i6mm_chain);
  764         *in6m_sol = imm->i6mm_maddr;
  765 
  766         /*
  767          * Join link-local all-nodes address.
  768          */
  769         mltaddr = in6addr_linklocal_allnodes;
  770         if ((error = in6_setscope(&mltaddr, ifp, NULL)) != 0)
  771                 goto cleanup; /* XXX: should not fail */
  772 
  773         imm = in6_joingroup(ifp, &mltaddr, &error, 0);
  774         if (imm == NULL) {
  775                 nd6log((LOG_WARNING, "%s: in6_joingroup failed for %s on %s "
  776                     "(errno=%d)\n", __func__, ip6_sprintf(ip6buf, &mltaddr),
  777                     if_name(ifp), error));
  778                 goto cleanup;
  779         }
  780         LIST_INSERT_HEAD(&ia->ia6_memberships, imm, i6mm_chain);
  781 
  782         /*
  783          * Join node information group address.
  784          */
  785         delay = 0;
  786         if ((flags & IN6_IFAUPDATE_DADDELAY)) {
  787                 /*
  788                  * The spec does not say anything about delay for this group,
  789                  * but the same logic should apply.
  790                  */
  791                 delay = arc4random() % (MAX_RTR_SOLICITATION_DELAY * hz);
  792         }
  793         if (in6_nigroup(ifp, NULL, -1, &mltaddr) == 0) {
  794                 /* XXX jinmei */
  795                 imm = in6_joingroup(ifp, &mltaddr, &error, delay);
  796                 if (imm == NULL)
  797                         nd6log((LOG_WARNING,
  798                             "%s: in6_joingroup failed for %s on %s "
  799                             "(errno=%d)\n", __func__, ip6_sprintf(ip6buf,
  800                             &mltaddr), if_name(ifp), error));
  801                         /* XXX not very fatal, go on... */
  802                 else
  803                         LIST_INSERT_HEAD(&ia->ia6_memberships, imm, i6mm_chain);
  804         }
  805         if (V_icmp6_nodeinfo_oldmcprefix &&
  806             in6_nigroup_oldmcprefix(ifp, NULL, -1, &mltaddr) == 0) {
  807                 imm = in6_joingroup(ifp, &mltaddr, &error, delay);
  808                 if (imm == NULL)
  809                         nd6log((LOG_WARNING,
  810                             "%s: in6_joingroup failed for %s on %s "
  811                             "(errno=%d)\n", __func__, ip6_sprintf(ip6buf,
  812                             &mltaddr), if_name(ifp), error));
  813                         /* XXX not very fatal, go on... */
  814                 else
  815                         LIST_INSERT_HEAD(&ia->ia6_memberships, imm, i6mm_chain);
  816         }
  817 
  818         /*
  819          * Join interface-local all-nodes address.
  820          * (ff01::1%ifN, and ff01::%ifN/32)
  821          */
  822         mltaddr = in6addr_nodelocal_allnodes;
  823         if ((error = in6_setscope(&mltaddr, ifp, NULL)) != 0)
  824                 goto cleanup; /* XXX: should not fail */
  825 
  826         imm = in6_joingroup(ifp, &mltaddr, &error, 0);
  827         if (imm == NULL) {
  828                 nd6log((LOG_WARNING, "%s: in6_joingroup failed for %s on %s "
  829                     "(errno=%d)\n", __func__, ip6_sprintf(ip6buf,
  830                     &mltaddr), if_name(ifp), error));
  831                 goto cleanup;
  832         }
  833         LIST_INSERT_HEAD(&ia->ia6_memberships, imm, i6mm_chain);
  834 
  835 cleanup:
  836         return (error);
  837 }
  838 
  839 /*
  840  * Update parameters of an IPv6 interface address.
  841  * If necessary, a new entry is created and linked into address chains.
  842  * This function is separated from in6_control().
  843  */
  844 int
  845 in6_update_ifa(struct ifnet *ifp, struct in6_aliasreq *ifra,
  846     struct in6_ifaddr *ia, int flags)
  847 {
  848         int error, hostIsNew = 0;
  849 
  850         if ((error = in6_validate_ifra(ifp, ifra, ia, flags)) != 0)
  851                 return (error);
  852 
  853         if (ia == NULL) {
  854                 hostIsNew = 1;
  855                 if ((ia = in6_alloc_ifa(ifp, ifra, flags)) == NULL)
  856                         return (ENOBUFS);
  857         }
  858 
  859         error = in6_update_ifa_internal(ifp, ifra, ia, hostIsNew, flags);
  860         if (error != 0) {
  861                 if (hostIsNew != 0) {
  862                         in6_unlink_ifa(ia, ifp);
  863                         ifa_free(&ia->ia_ifa);
  864                 }
  865                 return (error);
  866         }
  867 
  868         if (hostIsNew)
  869                 error = in6_broadcast_ifa(ifp, ifra, ia, flags);
  870 
  871         return (error);
  872 }
  873 
  874 /*
  875  * Fill in basic IPv6 address request info.
  876  */
  877 void
  878 in6_prepare_ifra(struct in6_aliasreq *ifra, const struct in6_addr *addr,
  879     const struct in6_addr *mask)
  880 {
  881 
  882         memset(ifra, 0, sizeof(struct in6_aliasreq));
  883 
  884         ifra->ifra_addr.sin6_family = AF_INET6;
  885         ifra->ifra_addr.sin6_len = sizeof(struct sockaddr_in6);
  886         if (addr != NULL)
  887                 ifra->ifra_addr.sin6_addr = *addr;
  888 
  889         ifra->ifra_prefixmask.sin6_family = AF_INET6;
  890         ifra->ifra_prefixmask.sin6_len = sizeof(struct sockaddr_in6);
  891         if (mask != NULL)
  892                 ifra->ifra_prefixmask.sin6_addr = *mask;
  893 }
  894 
  895 static int
  896 in6_validate_ifra(struct ifnet *ifp, struct in6_aliasreq *ifra,
  897     struct in6_ifaddr *ia, int flags)
  898 {
  899         int plen = -1;
  900         struct sockaddr_in6 dst6;
  901         struct in6_addrlifetime *lt;
  902         char ip6buf[INET6_ADDRSTRLEN];
  903 
  904         /* Validate parameters */
  905         if (ifp == NULL || ifra == NULL) /* this maybe redundant */
  906                 return (EINVAL);
  907 
  908         /*
  909          * The destination address for a p2p link must have a family
  910          * of AF_UNSPEC or AF_INET6.
  911          */
  912         if ((ifp->if_flags & IFF_POINTOPOINT) != 0 &&
  913             ifra->ifra_dstaddr.sin6_family != AF_INET6 &&
  914             ifra->ifra_dstaddr.sin6_family != AF_UNSPEC)
  915                 return (EAFNOSUPPORT);
  916 
  917         /*
  918          * Validate address
  919          */
  920         if (ifra->ifra_addr.sin6_len != sizeof(struct sockaddr_in6) ||
  921             ifra->ifra_addr.sin6_family != AF_INET6)
  922                 return (EINVAL);
  923 
  924         /*
  925          * validate ifra_prefixmask.  don't check sin6_family, netmask
  926          * does not carry fields other than sin6_len.
  927          */
  928         if (ifra->ifra_prefixmask.sin6_len > sizeof(struct sockaddr_in6))
  929                 return (EINVAL);
  930         /*
  931          * Because the IPv6 address architecture is classless, we require
  932          * users to specify a (non 0) prefix length (mask) for a new address.
  933          * We also require the prefix (when specified) mask is valid, and thus
  934          * reject a non-consecutive mask.
  935          */
  936         if (ia == NULL && ifra->ifra_prefixmask.sin6_len == 0)
  937                 return (EINVAL);
  938         if (ifra->ifra_prefixmask.sin6_len != 0) {
  939                 plen = in6_mask2len(&ifra->ifra_prefixmask.sin6_addr,
  940                     (u_char *)&ifra->ifra_prefixmask +
  941                     ifra->ifra_prefixmask.sin6_len);
  942                 if (plen <= 0)
  943                         return (EINVAL);
  944         } else {
  945                 /*
  946                  * In this case, ia must not be NULL.  We just use its prefix
  947                  * length.
  948                  */
  949                 plen = in6_mask2len(&ia->ia_prefixmask.sin6_addr, NULL);
  950         }
  951         /*
  952          * If the destination address on a p2p interface is specified,
  953          * and the address is a scoped one, validate/set the scope
  954          * zone identifier.
  955          */
  956         dst6 = ifra->ifra_dstaddr;
  957         if ((ifp->if_flags & (IFF_POINTOPOINT|IFF_LOOPBACK)) != 0 &&
  958             (dst6.sin6_family == AF_INET6)) {
  959                 struct in6_addr in6_tmp;
  960                 u_int32_t zoneid;
  961 
  962                 in6_tmp = dst6.sin6_addr;
  963                 if (in6_setscope(&in6_tmp, ifp, &zoneid))
  964                         return (EINVAL); /* XXX: should be impossible */
  965 
  966                 if (dst6.sin6_scope_id != 0) {
  967                         if (dst6.sin6_scope_id != zoneid)
  968                                 return (EINVAL);
  969                 } else          /* user omit to specify the ID. */
  970                         dst6.sin6_scope_id = zoneid;
  971 
  972                 /* convert into the internal form */
  973                 if (sa6_embedscope(&dst6, 0))
  974                         return (EINVAL); /* XXX: should be impossible */
  975         }
  976         /* Modify original ifra_dstaddr to reflect changes */
  977         ifra->ifra_dstaddr = dst6;
  978 
  979         /*
  980          * The destination address can be specified only for a p2p or a
  981          * loopback interface.  If specified, the corresponding prefix length
  982          * must be 128.
  983          */
  984         if (ifra->ifra_dstaddr.sin6_family == AF_INET6) {
  985                 if ((ifp->if_flags & (IFF_POINTOPOINT|IFF_LOOPBACK)) == 0) {
  986                         /* XXX: noisy message */
  987                         nd6log((LOG_INFO, "in6_update_ifa: a destination can "
  988                             "be specified for a p2p or a loopback IF only\n"));
  989                         return (EINVAL);
  990                 }
  991                 if (plen != 128) {
  992                         nd6log((LOG_INFO, "in6_update_ifa: prefixlen should "
  993                             "be 128 when dstaddr is specified\n"));
  994                         return (EINVAL);
  995                 }
  996         }
  997         /* lifetime consistency check */
  998         lt = &ifra->ifra_lifetime;
  999         if (lt->ia6t_pltime > lt->ia6t_vltime)
 1000                 return (EINVAL);
 1001         if (lt->ia6t_vltime == 0) {
 1002                 /*
 1003                  * the following log might be noisy, but this is a typical
 1004                  * configuration mistake or a tool's bug.
 1005                  */
 1006                 nd6log((LOG_INFO,
 1007                     "in6_update_ifa: valid lifetime is 0 for %s\n",
 1008                     ip6_sprintf(ip6buf, &ifra->ifra_addr.sin6_addr)));
 1009 
 1010                 if (ia == NULL)
 1011                         return (0); /* there's nothing to do */
 1012         }
 1013 
 1014         /* Check prefix mask */
 1015         if (ia != NULL && ifra->ifra_prefixmask.sin6_len != 0) {
 1016                 /*
 1017                  * We prohibit changing the prefix length of an existing
 1018                  * address, because
 1019                  * + such an operation should be rare in IPv6, and
 1020                  * + the operation would confuse prefix management.
 1021                  */
 1022                 if (ia->ia_prefixmask.sin6_len != 0 &&
 1023                     in6_mask2len(&ia->ia_prefixmask.sin6_addr, NULL) != plen) {
 1024                         nd6log((LOG_INFO, "in6_validate_ifa: the prefix length "
 1025                             "of an existing %s address should not be changed\n",
 1026                             ip6_sprintf(ip6buf, &ia->ia_addr.sin6_addr)));
 1027 
 1028                         return (EINVAL);
 1029                 }
 1030         }
 1031 
 1032         return (0);
 1033 }
 1034 
 1035 
 1036 /*
 1037  * Allocate a new ifaddr and link it into chains.
 1038  */
 1039 static struct in6_ifaddr *
 1040 in6_alloc_ifa(struct ifnet *ifp, struct in6_aliasreq *ifra, int flags)
 1041 {
 1042         struct in6_ifaddr *ia;
 1043 
 1044         /*
 1045          * When in6_alloc_ifa() is called in a process of a received
 1046          * RA, it is called under an interrupt context.  So, we should
 1047          * call malloc with M_NOWAIT.
 1048          */
 1049         ia = (struct in6_ifaddr *)ifa_alloc(sizeof(*ia), M_NOWAIT);
 1050         if (ia == NULL)
 1051                 return (NULL);
 1052         LIST_INIT(&ia->ia6_memberships);
 1053         /* Initialize the address and masks, and put time stamp */
 1054         ia->ia_ifa.ifa_addr = (struct sockaddr *)&ia->ia_addr;
 1055         ia->ia_addr.sin6_family = AF_INET6;
 1056         ia->ia_addr.sin6_len = sizeof(ia->ia_addr);
 1057         /* XXX: Can we assign ,sin6_addr and skip the rest? */
 1058         ia->ia_addr = ifra->ifra_addr;
 1059         ia->ia6_createtime = time_uptime;
 1060         if ((ifp->if_flags & (IFF_POINTOPOINT | IFF_LOOPBACK)) != 0) {
 1061                 /*
 1062                  * Some functions expect that ifa_dstaddr is not
 1063                  * NULL for p2p interfaces.
 1064                  */
 1065                 ia->ia_ifa.ifa_dstaddr =
 1066                     (struct sockaddr *)&ia->ia_dstaddr;
 1067         } else {
 1068                 ia->ia_ifa.ifa_dstaddr = NULL;
 1069         }
 1070 
 1071         /* set prefix mask if any */
 1072         ia->ia_ifa.ifa_netmask = (struct sockaddr *)&ia->ia_prefixmask;
 1073         if (ifra->ifra_prefixmask.sin6_len != 0) {
 1074                 ia->ia_prefixmask.sin6_family = AF_INET6;
 1075                 ia->ia_prefixmask.sin6_len = ifra->ifra_prefixmask.sin6_len;
 1076                 ia->ia_prefixmask.sin6_addr = ifra->ifra_prefixmask.sin6_addr;
 1077         }
 1078 
 1079         ia->ia_ifp = ifp;
 1080         ifa_ref(&ia->ia_ifa);                   /* if_addrhead */
 1081         IF_ADDR_WLOCK(ifp);
 1082         TAILQ_INSERT_TAIL(&ifp->if_addrhead, &ia->ia_ifa, ifa_link);
 1083         IF_ADDR_WUNLOCK(ifp);
 1084 
 1085         ifa_ref(&ia->ia_ifa);                   /* in6_ifaddrhead */
 1086         IN6_IFADDR_WLOCK();
 1087         TAILQ_INSERT_TAIL(&V_in6_ifaddrhead, ia, ia_link);
 1088         LIST_INSERT_HEAD(IN6ADDR_HASH(&ia->ia_addr.sin6_addr), ia, ia6_hash);
 1089         IN6_IFADDR_WUNLOCK();
 1090 
 1091         return (ia);
 1092 }
 1093 
 1094 /*
 1095  * Update/configure interface address parameters:
 1096  *
 1097  * 1) Update lifetime
 1098  * 2) Update interface metric ad flags
 1099  * 3) Notify other subsystems
 1100  */
 1101 static int
 1102 in6_update_ifa_internal(struct ifnet *ifp, struct in6_aliasreq *ifra,
 1103     struct in6_ifaddr *ia, int hostIsNew, int flags)
 1104 {
 1105         int error;
 1106 
 1107         /* update timestamp */
 1108         ia->ia6_updatetime = time_uptime;
 1109 
 1110         /*
 1111          * Set lifetimes.  We do not refer to ia6t_expire and ia6t_preferred
 1112          * to see if the address is deprecated or invalidated, but initialize
 1113          * these members for applications.
 1114          */
 1115         ia->ia6_lifetime = ifra->ifra_lifetime;
 1116         if (ia->ia6_lifetime.ia6t_vltime != ND6_INFINITE_LIFETIME) {
 1117                 ia->ia6_lifetime.ia6t_expire =
 1118                     time_uptime + ia->ia6_lifetime.ia6t_vltime;
 1119         } else
 1120                 ia->ia6_lifetime.ia6t_expire = 0;
 1121         if (ia->ia6_lifetime.ia6t_pltime != ND6_INFINITE_LIFETIME) {
 1122                 ia->ia6_lifetime.ia6t_preferred =
 1123                     time_uptime + ia->ia6_lifetime.ia6t_pltime;
 1124         } else
 1125                 ia->ia6_lifetime.ia6t_preferred = 0;
 1126 
 1127         /*
 1128          * backward compatibility - if IN6_IFF_DEPRECATED is set from the
 1129          * userland, make it deprecated.
 1130          */
 1131         if ((ifra->ifra_flags & IN6_IFF_DEPRECATED) != 0) {
 1132                 ia->ia6_lifetime.ia6t_pltime = 0;
 1133                 ia->ia6_lifetime.ia6t_preferred = time_uptime;
 1134         }
 1135 
 1136         /*
 1137          * configure address flags.
 1138          */
 1139         ia->ia6_flags = ifra->ifra_flags;
 1140 
 1141         /*
 1142          * Make the address tentative before joining multicast addresses,
 1143          * so that corresponding MLD responses would not have a tentative
 1144          * source address.
 1145          */
 1146         ia->ia6_flags &= ~IN6_IFF_DUPLICATED;   /* safety */
 1147 
 1148         /*
 1149          * DAD should be performed for an new address or addresses on
 1150          * an interface with ND6_IFF_IFDISABLED.
 1151          */
 1152         if (in6if_do_dad(ifp) &&
 1153             (hostIsNew || (ND_IFINFO(ifp)->flags & ND6_IFF_IFDISABLED)))
 1154                 ia->ia6_flags |= IN6_IFF_TENTATIVE;
 1155 
 1156         /* notify other subsystems */
 1157         error = in6_notify_ifa(ifp, ia, ifra, hostIsNew);
 1158 
 1159         return (error);
 1160 }
 1161 
 1162 /*
 1163  * Do link-level ifa job:
 1164  * 1) Add lle entry for added address
 1165  * 2) Notifies routing socket users about new address
 1166  * 3) join appropriate multicast group
 1167  * 4) start DAD if enabled
 1168  */
 1169 static int
 1170 in6_broadcast_ifa(struct ifnet *ifp, struct in6_aliasreq *ifra,
 1171     struct in6_ifaddr *ia, int flags)
 1172 {
 1173         struct in6_multi *in6m_sol;
 1174         int error = 0;
 1175 
 1176         /* Add local address to lltable, if necessary (ex. on p2p link). */
 1177         if ((error = nd6_add_ifa_lle(ia)) != 0) {
 1178                 in6_purgeaddr(&ia->ia_ifa);
 1179                 ifa_free(&ia->ia_ifa);
 1180                 return (error);
 1181         }
 1182 
 1183         /* Join necessary multicast groups. */
 1184         in6m_sol = NULL;
 1185         if ((ifp->if_flags & IFF_MULTICAST) != 0) {
 1186                 error = in6_update_ifa_join_mc(ifp, ifra, ia, flags, &in6m_sol);
 1187                 if (error != 0) {
 1188                         in6_purgeaddr(&ia->ia_ifa);
 1189                         ifa_free(&ia->ia_ifa);
 1190                         return (error);
 1191                 }
 1192         }
 1193 
 1194         /* Perform DAD, if the address is TENTATIVE. */
 1195         if ((ia->ia6_flags & IN6_IFF_TENTATIVE)) {
 1196                 int delay, mindelay, maxdelay;
 1197 
 1198                 delay = 0;
 1199                 if ((flags & IN6_IFAUPDATE_DADDELAY)) {
 1200                         /*
 1201                          * We need to impose a delay before sending an NS
 1202                          * for DAD.  Check if we also needed a delay for the
 1203                          * corresponding MLD message.  If we did, the delay
 1204                          * should be larger than the MLD delay (this could be
 1205                          * relaxed a bit, but this simple logic is at least
 1206                          * safe).
 1207                          * XXX: Break data hiding guidelines and look at
 1208                          * state for the solicited multicast group.
 1209                          */
 1210                         mindelay = 0;
 1211                         if (in6m_sol != NULL &&
 1212                             in6m_sol->in6m_state == MLD_REPORTING_MEMBER) {
 1213                                 mindelay = in6m_sol->in6m_timer;
 1214                         }
 1215                         maxdelay = MAX_RTR_SOLICITATION_DELAY * hz;
 1216                         if (maxdelay - mindelay == 0)
 1217                                 delay = 0;
 1218                         else {
 1219                                 delay =
 1220                                     (arc4random() % (maxdelay - mindelay)) +
 1221                                     mindelay;
 1222                         }
 1223                 }
 1224                 nd6_dad_start((struct ifaddr *)ia, delay);
 1225         }
 1226 
 1227         in6_newaddrmsg(ia, RTM_ADD);
 1228         ifa_free(&ia->ia_ifa);
 1229         return (error);
 1230 }
 1231 
 1232 void
 1233 in6_purgeaddr(struct ifaddr *ifa)
 1234 {
 1235         struct ifnet *ifp = ifa->ifa_ifp;
 1236         struct in6_ifaddr *ia = (struct in6_ifaddr *) ifa;
 1237         struct in6_multi_mship *imm;
 1238         int plen, error;
 1239 
 1240         if (ifa->ifa_carp)
 1241                 (*carp_detach_p)(ifa);
 1242 
 1243         /*
 1244          * Remove the loopback route to the interface address.
 1245          * The check for the current setting of "nd6_useloopback"
 1246          * is not needed.
 1247          */
 1248         if (ia->ia_flags & IFA_RTSELF) {
 1249                 error = ifa_del_loopback_route((struct ifaddr *)ia,
 1250                     (struct sockaddr *)&ia->ia_addr);
 1251                 if (error == 0)
 1252                         ia->ia_flags &= ~IFA_RTSELF;
 1253         }
 1254 
 1255         /* stop DAD processing */
 1256         nd6_dad_stop(ifa);
 1257 
 1258         /* Leave multicast groups. */
 1259         while ((imm = LIST_FIRST(&ia->ia6_memberships)) != NULL) {
 1260                 LIST_REMOVE(imm, i6mm_chain);
 1261                 in6_leavegroup(imm);
 1262         }
 1263         plen = in6_mask2len(&ia->ia_prefixmask.sin6_addr, NULL); /* XXX */
 1264         if ((ia->ia_flags & IFA_ROUTE) && plen == 128) {
 1265                 error = rtinit(&(ia->ia_ifa), RTM_DELETE, ia->ia_flags |
 1266                     (ia->ia_dstaddr.sin6_family == AF_INET6 ? RTF_HOST : 0));
 1267                 if (error != 0)
 1268                         log(LOG_INFO, "%s: err=%d, destination address delete "
 1269                             "failed\n", __func__, error);
 1270                 ia->ia_flags &= ~IFA_ROUTE;
 1271         }
 1272 
 1273         in6_newaddrmsg(ia, RTM_DELETE);
 1274         in6_unlink_ifa(ia, ifp);
 1275 }
 1276 
 1277 static void
 1278 in6_unlink_ifa(struct in6_ifaddr *ia, struct ifnet *ifp)
 1279 {
 1280         char ip6buf[INET6_ADDRSTRLEN];
 1281         int remove_lle;
 1282 
 1283         IF_ADDR_WLOCK(ifp);
 1284         TAILQ_REMOVE(&ifp->if_addrhead, &ia->ia_ifa, ifa_link);
 1285         IF_ADDR_WUNLOCK(ifp);
 1286         ifa_free(&ia->ia_ifa);                  /* if_addrhead */
 1287 
 1288         /*
 1289          * Defer the release of what might be the last reference to the
 1290          * in6_ifaddr so that it can't be freed before the remainder of the
 1291          * cleanup.
 1292          */
 1293         IN6_IFADDR_WLOCK();
 1294         TAILQ_REMOVE(&V_in6_ifaddrhead, ia, ia_link);
 1295         LIST_REMOVE(ia, ia6_hash);
 1296         IN6_IFADDR_WUNLOCK();
 1297 
 1298         /*
 1299          * Release the reference to the base prefix.  There should be a
 1300          * positive reference.
 1301          */
 1302         remove_lle = 0;
 1303         if (ia->ia6_ndpr == NULL) {
 1304                 nd6log((LOG_NOTICE,
 1305                     "in6_unlink_ifa: autoconf'ed address "
 1306                     "%s has no prefix\n", ip6_sprintf(ip6buf, IA6_IN6(ia))));
 1307         } else {
 1308                 ia->ia6_ndpr->ndpr_refcnt--;
 1309                 /* Do not delete lles within prefix if refcont != 0 */
 1310                 if (ia->ia6_ndpr->ndpr_refcnt == 0)
 1311                         remove_lle = 1;
 1312                 ia->ia6_ndpr = NULL;
 1313         }
 1314 
 1315         nd6_rem_ifa_lle(ia, remove_lle);
 1316 
 1317         /*
 1318          * Also, if the address being removed is autoconf'ed, call
 1319          * pfxlist_onlink_check() since the release might affect the status of
 1320          * other (detached) addresses.
 1321          */
 1322         if ((ia->ia6_flags & IN6_IFF_AUTOCONF)) {
 1323                 pfxlist_onlink_check();
 1324         }
 1325         ifa_free(&ia->ia_ifa);                  /* in6_ifaddrhead */
 1326 }
 1327 
 1328 /*
 1329  * Notifies other subsystems about address change/arrival:
 1330  * 1) Notifies device handler on the first IPv6 address assignment
 1331  * 2) Handle routing table changes for P2P links and route
 1332  * 3) Handle routing table changes for address host route
 1333  */
 1334 static int
 1335 in6_notify_ifa(struct ifnet *ifp, struct in6_ifaddr *ia,
 1336     struct in6_aliasreq *ifra, int hostIsNew)
 1337 {
 1338         int     error = 0, plen, ifacount = 0;
 1339         struct ifaddr *ifa;
 1340         struct sockaddr_in6 *pdst;
 1341         char ip6buf[INET6_ADDRSTRLEN];
 1342 
 1343         /*
 1344          * Give the interface a chance to initialize
 1345          * if this is its first address,
 1346          */
 1347         if (hostIsNew != 0) {
 1348                 IF_ADDR_RLOCK(ifp);
 1349                 TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
 1350                         if (ifa->ifa_addr->sa_family != AF_INET6)
 1351                                 continue;
 1352                         ifacount++;
 1353                 }
 1354                 IF_ADDR_RUNLOCK(ifp);
 1355         }
 1356 
 1357         if (ifacount <= 1 && ifp->if_ioctl) {
 1358                 error = (*ifp->if_ioctl)(ifp, SIOCSIFADDR, (caddr_t)ia);
 1359                 if (error)
 1360                         return (error);
 1361         }
 1362 
 1363         /*
 1364          * If a new destination address is specified, scrub the old one and
 1365          * install the new destination.  Note that the interface must be
 1366          * p2p or loopback.
 1367          */
 1368         pdst = &ifra->ifra_dstaddr;
 1369         if (pdst->sin6_family == AF_INET6 &&
 1370             !IN6_ARE_ADDR_EQUAL(&pdst->sin6_addr, &ia->ia_dstaddr.sin6_addr)) {
 1371                 if ((ia->ia_flags & IFA_ROUTE) != 0 &&
 1372                     (rtinit(&(ia->ia_ifa), (int)RTM_DELETE, RTF_HOST) != 0)) {
 1373                         nd6log((LOG_ERR, "in6_update_ifa_internal: failed to "
 1374                             "remove a route to the old destination: %s\n",
 1375                             ip6_sprintf(ip6buf, &ia->ia_addr.sin6_addr)));
 1376                         /* proceed anyway... */
 1377                 } else
 1378                         ia->ia_flags &= ~IFA_ROUTE;
 1379                 ia->ia_dstaddr = *pdst;
 1380         }
 1381 
 1382         /*
 1383          * If a new destination address is specified for a point-to-point
 1384          * interface, install a route to the destination as an interface
 1385          * direct route.
 1386          * XXX: the logic below rejects assigning multiple addresses on a p2p
 1387          * interface that share the same destination.
 1388          */
 1389         plen = in6_mask2len(&ia->ia_prefixmask.sin6_addr, NULL); /* XXX */
 1390         if (!(ia->ia_flags & IFA_ROUTE) && plen == 128 &&
 1391             ia->ia_dstaddr.sin6_family == AF_INET6) {
 1392                 int rtflags = RTF_UP | RTF_HOST;
 1393                 /*
 1394                  * Handle the case for ::1 .
 1395                  */
 1396                 if (ifp->if_flags & IFF_LOOPBACK)
 1397                         ia->ia_flags |= IFA_RTSELF;
 1398                 error = rtinit(&ia->ia_ifa, RTM_ADD, ia->ia_flags | rtflags);
 1399                 if (error)
 1400                         return (error);
 1401                 ia->ia_flags |= IFA_ROUTE;
 1402         }
 1403 
 1404         /*
 1405          * add a loopback route to self if not exists
 1406          */
 1407         if (!(ia->ia_flags & IFA_RTSELF) && V_nd6_useloopback) {
 1408                 error = ifa_add_loopback_route((struct ifaddr *)ia,
 1409                     (struct sockaddr *)&ia->ia_addr);
 1410                 if (error == 0)
 1411                         ia->ia_flags |= IFA_RTSELF;
 1412         }
 1413 
 1414         return (error);
 1415 }
 1416 
 1417 /*
 1418  * Find an IPv6 interface link-local address specific to an interface.
 1419  * ifaddr is returned referenced.
 1420  */
 1421 struct in6_ifaddr *
 1422 in6ifa_ifpforlinklocal(struct ifnet *ifp, int ignoreflags)
 1423 {
 1424         struct ifaddr *ifa;
 1425 
 1426         IF_ADDR_RLOCK(ifp);
 1427         TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
 1428                 if (ifa->ifa_addr->sa_family != AF_INET6)
 1429                         continue;
 1430                 if (IN6_IS_ADDR_LINKLOCAL(IFA_IN6(ifa))) {
 1431                         if ((((struct in6_ifaddr *)ifa)->ia6_flags &
 1432                             ignoreflags) != 0)
 1433                                 continue;
 1434                         ifa_ref(ifa);
 1435                         break;
 1436                 }
 1437         }
 1438         IF_ADDR_RUNLOCK(ifp);
 1439 
 1440         return ((struct in6_ifaddr *)ifa);
 1441 }
 1442 
 1443 
 1444 /*
 1445  * find the internet address corresponding to a given address.
 1446  * ifaddr is returned referenced.
 1447  */
 1448 struct in6_ifaddr *
 1449 in6ifa_ifwithaddr(const struct in6_addr *addr, uint32_t zoneid)
 1450 {
 1451         struct rm_priotracker in6_ifa_tracker;
 1452         struct in6_ifaddr *ia;
 1453 
 1454         IN6_IFADDR_RLOCK(&in6_ifa_tracker);
 1455         LIST_FOREACH(ia, IN6ADDR_HASH(addr), ia6_hash) {
 1456                 if (IN6_ARE_ADDR_EQUAL(IA6_IN6(ia), addr)) {
 1457                         if (zoneid != 0 &&
 1458                             zoneid != ia->ia_addr.sin6_scope_id)
 1459                                 continue;
 1460                         ifa_ref(&ia->ia_ifa);
 1461                         break;
 1462                 }
 1463         }
 1464         IN6_IFADDR_RUNLOCK(&in6_ifa_tracker);
 1465         return (ia);
 1466 }
 1467 
 1468 /*
 1469  * find the internet address corresponding to a given interface and address.
 1470  * ifaddr is returned referenced.
 1471  */
 1472 struct in6_ifaddr *
 1473 in6ifa_ifpwithaddr(struct ifnet *ifp, const struct in6_addr *addr)
 1474 {
 1475         struct ifaddr *ifa;
 1476 
 1477         IF_ADDR_RLOCK(ifp);
 1478         TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
 1479                 if (ifa->ifa_addr->sa_family != AF_INET6)
 1480                         continue;
 1481                 if (IN6_ARE_ADDR_EQUAL(addr, IFA_IN6(ifa))) {
 1482                         ifa_ref(ifa);
 1483                         break;
 1484                 }
 1485         }
 1486         IF_ADDR_RUNLOCK(ifp);
 1487 
 1488         return ((struct in6_ifaddr *)ifa);
 1489 }
 1490 
 1491 /*
 1492  * Find a link-local scoped address on ifp and return it if any.
 1493  */
 1494 struct in6_ifaddr *
 1495 in6ifa_llaonifp(struct ifnet *ifp)
 1496 {
 1497         struct sockaddr_in6 *sin6;
 1498         struct ifaddr *ifa;
 1499 
 1500         if (ND_IFINFO(ifp)->flags & ND6_IFF_IFDISABLED)
 1501                 return (NULL);
 1502         IF_ADDR_RLOCK(ifp);
 1503         TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
 1504                 if (ifa->ifa_addr->sa_family != AF_INET6)
 1505                         continue;
 1506                 sin6 = (struct sockaddr_in6 *)ifa->ifa_addr;
 1507                 if (IN6_IS_SCOPE_LINKLOCAL(&sin6->sin6_addr) ||
 1508                     IN6_IS_ADDR_MC_INTFACELOCAL(&sin6->sin6_addr) ||
 1509                     IN6_IS_ADDR_MC_NODELOCAL(&sin6->sin6_addr))
 1510                         break;
 1511         }
 1512         IF_ADDR_RUNLOCK(ifp);
 1513 
 1514         return ((struct in6_ifaddr *)ifa);
 1515 }
 1516 
 1517 /*
 1518  * Convert IP6 address to printable (loggable) representation. Caller
 1519  * has to make sure that ip6buf is at least INET6_ADDRSTRLEN long.
 1520  */
 1521 static char digits[] = "0123456789abcdef";
 1522 char *
 1523 ip6_sprintf(char *ip6buf, const struct in6_addr *addr)
 1524 {
 1525         int i, cnt = 0, maxcnt = 0, idx = 0, index = 0;
 1526         char *cp;
 1527         const u_int16_t *a = (const u_int16_t *)addr;
 1528         const u_int8_t *d;
 1529         int dcolon = 0, zero = 0;
 1530 
 1531         cp = ip6buf;
 1532 
 1533         for (i = 0; i < 8; i++) {
 1534                 if (*(a + i) == 0) {
 1535                         cnt++;
 1536                         if (cnt == 1)
 1537                                 idx = i;
 1538                 }
 1539                 else if (maxcnt < cnt) {
 1540                         maxcnt = cnt;
 1541                         index = idx;
 1542                         cnt = 0;
 1543                 }
 1544         }
 1545         if (maxcnt < cnt) {
 1546                 maxcnt = cnt;
 1547                 index = idx;
 1548         }
 1549 
 1550         for (i = 0; i < 8; i++) {
 1551                 if (dcolon == 1) {
 1552                         if (*a == 0) {
 1553                                 if (i == 7)
 1554                                         *cp++ = ':';
 1555                                 a++;
 1556                                 continue;
 1557                         } else
 1558                                 dcolon = 2;
 1559                 }
 1560                 if (*a == 0) {
 1561                         if (dcolon == 0 && *(a + 1) == 0 && i == index) {
 1562                                 if (i == 0)
 1563                                         *cp++ = ':';
 1564                                 *cp++ = ':';
 1565                                 dcolon = 1;
 1566                         } else {
 1567                                 *cp++ = '';
 1568                                 *cp++ = ':';
 1569                         }
 1570                         a++;
 1571                         continue;
 1572                 }
 1573                 d = (const u_char *)a;
 1574                 /* Try to eliminate leading zeros in printout like in :0001. */
 1575                 zero = 1;
 1576                 *cp = digits[*d >> 4];
 1577                 if (*cp != '') {
 1578                         zero = 0;
 1579                         cp++;
 1580                 }
 1581                 *cp = digits[*d++ & 0xf];
 1582                 if (zero == 0 || (*cp != '')) {
 1583                         zero = 0;
 1584                         cp++;
 1585                 }
 1586                 *cp = digits[*d >> 4];
 1587                 if (zero == 0 || (*cp != '')) {
 1588                         zero = 0;
 1589                         cp++;
 1590                 }
 1591                 *cp++ = digits[*d & 0xf];
 1592                 *cp++ = ':';
 1593                 a++;
 1594         }
 1595         *--cp = '\0';
 1596         return (ip6buf);
 1597 }
 1598 
 1599 int
 1600 in6_localaddr(struct in6_addr *in6)
 1601 {
 1602         struct rm_priotracker in6_ifa_tracker;
 1603         struct in6_ifaddr *ia;
 1604 
 1605         if (IN6_IS_ADDR_LOOPBACK(in6) || IN6_IS_ADDR_LINKLOCAL(in6))
 1606                 return 1;
 1607 
 1608         IN6_IFADDR_RLOCK(&in6_ifa_tracker);
 1609         TAILQ_FOREACH(ia, &V_in6_ifaddrhead, ia_link) {
 1610                 if (IN6_ARE_MASKED_ADDR_EQUAL(in6, &ia->ia_addr.sin6_addr,
 1611                     &ia->ia_prefixmask.sin6_addr)) {
 1612                         IN6_IFADDR_RUNLOCK(&in6_ifa_tracker);
 1613                         return 1;
 1614                 }
 1615         }
 1616         IN6_IFADDR_RUNLOCK(&in6_ifa_tracker);
 1617 
 1618         return (0);
 1619 }
 1620 
 1621 /*
 1622  * Return 1 if an internet address is for the local host and configured
 1623  * on one of its interfaces.
 1624  */
 1625 int
 1626 in6_localip(struct in6_addr *in6)
 1627 {
 1628         struct rm_priotracker in6_ifa_tracker;
 1629         struct in6_ifaddr *ia;
 1630 
 1631         IN6_IFADDR_RLOCK(&in6_ifa_tracker);
 1632         LIST_FOREACH(ia, IN6ADDR_HASH(in6), ia6_hash) {
 1633                 if (IN6_ARE_ADDR_EQUAL(in6, &ia->ia_addr.sin6_addr)) {
 1634                         IN6_IFADDR_RUNLOCK(&in6_ifa_tracker);
 1635                         return (1);
 1636                 }
 1637         }
 1638         IN6_IFADDR_RUNLOCK(&in6_ifa_tracker);
 1639         return (0);
 1640 }
 1641  
 1642 /*
 1643  * Return 1 if an internet address is configured on an interface.
 1644  */
 1645 int
 1646 in6_ifhasaddr(struct ifnet *ifp, struct in6_addr *addr)
 1647 {
 1648         struct in6_addr in6;
 1649         struct ifaddr *ifa;
 1650         struct in6_ifaddr *ia6;
 1651 
 1652         in6 = *addr;
 1653         if (in6_clearscope(&in6))
 1654                 return (0);
 1655         in6_setscope(&in6, ifp, NULL);
 1656 
 1657         IF_ADDR_RLOCK(ifp);
 1658         TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
 1659                 if (ifa->ifa_addr->sa_family != AF_INET6)
 1660                         continue;
 1661                 ia6 = (struct in6_ifaddr *)ifa;
 1662                 if (IN6_ARE_ADDR_EQUAL(&ia6->ia_addr.sin6_addr, &in6)) {
 1663                         IF_ADDR_RUNLOCK(ifp);
 1664                         return (1);
 1665                 }
 1666         }
 1667         IF_ADDR_RUNLOCK(ifp);
 1668 
 1669         return (0);
 1670 }
 1671 
 1672 int
 1673 in6_is_addr_deprecated(struct sockaddr_in6 *sa6)
 1674 {
 1675         struct rm_priotracker in6_ifa_tracker;
 1676         struct in6_ifaddr *ia;
 1677 
 1678         IN6_IFADDR_RLOCK(&in6_ifa_tracker);
 1679         LIST_FOREACH(ia, IN6ADDR_HASH(&sa6->sin6_addr), ia6_hash) {
 1680                 if (IN6_ARE_ADDR_EQUAL(IA6_IN6(ia), &sa6->sin6_addr)) {
 1681                         if (ia->ia6_flags & IN6_IFF_DEPRECATED) {
 1682                                 IN6_IFADDR_RUNLOCK(&in6_ifa_tracker);
 1683                                 return (1); /* true */
 1684                         }
 1685                         break;
 1686                 }
 1687         }
 1688         IN6_IFADDR_RUNLOCK(&in6_ifa_tracker);
 1689 
 1690         return (0);             /* false */
 1691 }
 1692 
 1693 /*
 1694  * return length of part which dst and src are equal
 1695  * hard coding...
 1696  */
 1697 int
 1698 in6_matchlen(struct in6_addr *src, struct in6_addr *dst)
 1699 {
 1700         int match = 0;
 1701         u_char *s = (u_char *)src, *d = (u_char *)dst;
 1702         u_char *lim = s + 16, r;
 1703 
 1704         while (s < lim)
 1705                 if ((r = (*d++ ^ *s++)) != 0) {
 1706                         while (r < 128) {
 1707                                 match++;
 1708                                 r <<= 1;
 1709                         }
 1710                         break;
 1711                 } else
 1712                         match += 8;
 1713         return match;
 1714 }
 1715 
 1716 /* XXX: to be scope conscious */
 1717 int
 1718 in6_are_prefix_equal(struct in6_addr *p1, struct in6_addr *p2, int len)
 1719 {
 1720         int bytelen, bitlen;
 1721 
 1722         /* sanity check */
 1723         if (0 > len || len > 128) {
 1724                 log(LOG_ERR, "in6_are_prefix_equal: invalid prefix length(%d)\n",
 1725                     len);
 1726                 return (0);
 1727         }
 1728 
 1729         bytelen = len / 8;
 1730         bitlen = len % 8;
 1731 
 1732         if (bcmp(&p1->s6_addr, &p2->s6_addr, bytelen))
 1733                 return (0);
 1734         if (bitlen != 0 &&
 1735             p1->s6_addr[bytelen] >> (8 - bitlen) !=
 1736             p2->s6_addr[bytelen] >> (8 - bitlen))
 1737                 return (0);
 1738 
 1739         return (1);
 1740 }
 1741 
 1742 void
 1743 in6_prefixlen2mask(struct in6_addr *maskp, int len)
 1744 {
 1745         u_char maskarray[8] = {0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff};
 1746         int bytelen, bitlen, i;
 1747 
 1748         /* sanity check */
 1749         if (0 > len || len > 128) {
 1750                 log(LOG_ERR, "in6_prefixlen2mask: invalid prefix length(%d)\n",
 1751                     len);
 1752                 return;
 1753         }
 1754 
 1755         bzero(maskp, sizeof(*maskp));
 1756         bytelen = len / 8;
 1757         bitlen = len % 8;
 1758         for (i = 0; i < bytelen; i++)
 1759                 maskp->s6_addr[i] = 0xff;
 1760         if (bitlen)
 1761                 maskp->s6_addr[bytelen] = maskarray[bitlen - 1];
 1762 }
 1763 
 1764 /*
 1765  * return the best address out of the same scope. if no address was
 1766  * found, return the first valid address from designated IF.
 1767  */
 1768 struct in6_ifaddr *
 1769 in6_ifawithifp(struct ifnet *ifp, struct in6_addr *dst)
 1770 {
 1771         int dst_scope = in6_addrscope(dst), blen = -1, tlen;
 1772         struct ifaddr *ifa;
 1773         struct in6_ifaddr *besta = NULL;
 1774         struct in6_ifaddr *dep[2];      /* last-resort: deprecated */
 1775 
 1776         dep[0] = dep[1] = NULL;
 1777 
 1778         /*
 1779          * We first look for addresses in the same scope.
 1780          * If there is one, return it.
 1781          * If two or more, return one which matches the dst longest.
 1782          * If none, return one of global addresses assigned other ifs.
 1783          */
 1784         IF_ADDR_RLOCK(ifp);
 1785         TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
 1786                 if (ifa->ifa_addr->sa_family != AF_INET6)
 1787                         continue;
 1788                 if (((struct in6_ifaddr *)ifa)->ia6_flags & IN6_IFF_ANYCAST)
 1789                         continue; /* XXX: is there any case to allow anycast? */
 1790                 if (((struct in6_ifaddr *)ifa)->ia6_flags & IN6_IFF_NOTREADY)
 1791                         continue; /* don't use this interface */
 1792                 if (((struct in6_ifaddr *)ifa)->ia6_flags & IN6_IFF_DETACHED)
 1793                         continue;
 1794                 if (((struct in6_ifaddr *)ifa)->ia6_flags & IN6_IFF_DEPRECATED) {
 1795                         if (V_ip6_use_deprecated)
 1796                                 dep[0] = (struct in6_ifaddr *)ifa;
 1797                         continue;
 1798                 }
 1799 
 1800                 if (dst_scope == in6_addrscope(IFA_IN6(ifa))) {
 1801                         /*
 1802                          * call in6_matchlen() as few as possible
 1803                          */
 1804                         if (besta) {
 1805                                 if (blen == -1)
 1806                                         blen = in6_matchlen(&besta->ia_addr.sin6_addr, dst);
 1807                                 tlen = in6_matchlen(IFA_IN6(ifa), dst);
 1808                                 if (tlen > blen) {
 1809                                         blen = tlen;
 1810                                         besta = (struct in6_ifaddr *)ifa;
 1811                                 }
 1812                         } else
 1813                                 besta = (struct in6_ifaddr *)ifa;
 1814                 }
 1815         }
 1816         if (besta) {
 1817                 ifa_ref(&besta->ia_ifa);
 1818                 IF_ADDR_RUNLOCK(ifp);
 1819                 return (besta);
 1820         }
 1821 
 1822         TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
 1823                 if (ifa->ifa_addr->sa_family != AF_INET6)
 1824                         continue;
 1825                 if (((struct in6_ifaddr *)ifa)->ia6_flags & IN6_IFF_ANYCAST)
 1826                         continue; /* XXX: is there any case to allow anycast? */
 1827                 if (((struct in6_ifaddr *)ifa)->ia6_flags & IN6_IFF_NOTREADY)
 1828                         continue; /* don't use this interface */
 1829                 if (((struct in6_ifaddr *)ifa)->ia6_flags & IN6_IFF_DETACHED)
 1830                         continue;
 1831                 if (((struct in6_ifaddr *)ifa)->ia6_flags & IN6_IFF_DEPRECATED) {
 1832                         if (V_ip6_use_deprecated)
 1833                                 dep[1] = (struct in6_ifaddr *)ifa;
 1834                         continue;
 1835                 }
 1836 
 1837                 if (ifa != NULL)
 1838                         ifa_ref(ifa);
 1839                 IF_ADDR_RUNLOCK(ifp);
 1840                 return (struct in6_ifaddr *)ifa;
 1841         }
 1842 
 1843         /* use the last-resort values, that are, deprecated addresses */
 1844         if (dep[0]) {
 1845                 ifa_ref((struct ifaddr *)dep[0]);
 1846                 IF_ADDR_RUNLOCK(ifp);
 1847                 return dep[0];
 1848         }
 1849         if (dep[1]) {
 1850                 ifa_ref((struct ifaddr *)dep[1]);
 1851                 IF_ADDR_RUNLOCK(ifp);
 1852                 return dep[1];
 1853         }
 1854 
 1855         IF_ADDR_RUNLOCK(ifp);
 1856         return NULL;
 1857 }
 1858 
 1859 /*
 1860  * perform DAD when interface becomes IFF_UP.
 1861  */
 1862 void
 1863 in6_if_up(struct ifnet *ifp)
 1864 {
 1865         struct ifaddr *ifa;
 1866         struct in6_ifaddr *ia;
 1867 
 1868         IF_ADDR_RLOCK(ifp);
 1869         TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
 1870                 if (ifa->ifa_addr->sa_family != AF_INET6)
 1871                         continue;
 1872                 ia = (struct in6_ifaddr *)ifa;
 1873                 if (ia->ia6_flags & IN6_IFF_TENTATIVE) {
 1874                         /*
 1875                          * The TENTATIVE flag was likely set by hand
 1876                          * beforehand, implicitly indicating the need for DAD.
 1877                          * We may be able to skip the random delay in this
 1878                          * case, but we impose delays just in case.
 1879                          */
 1880                         nd6_dad_start(ifa,
 1881                             arc4random() % (MAX_RTR_SOLICITATION_DELAY * hz));
 1882                 }
 1883         }
 1884         IF_ADDR_RUNLOCK(ifp);
 1885 
 1886         /*
 1887          * special cases, like 6to4, are handled in in6_ifattach
 1888          */
 1889         in6_ifattach(ifp, NULL);
 1890 }
 1891 
 1892 int
 1893 in6if_do_dad(struct ifnet *ifp)
 1894 {
 1895         if ((ifp->if_flags & IFF_LOOPBACK) != 0)
 1896                 return (0);
 1897 
 1898         if ((ND_IFINFO(ifp)->flags & ND6_IFF_IFDISABLED) ||
 1899             (ND_IFINFO(ifp)->flags & ND6_IFF_NO_DAD))
 1900                 return (0);
 1901 
 1902         /*
 1903          * Our DAD routine requires the interface up and running.
 1904          * However, some interfaces can be up before the RUNNING
 1905          * status.  Additionally, users may try to assign addresses
 1906          * before the interface becomes up (or running).
 1907          * This function returns EAGAIN in that case.
 1908          * The caller should mark "tentative" on the address instead of
 1909          * performing DAD immediately.
 1910          */
 1911         if (!((ifp->if_flags & IFF_UP) &&
 1912             (ifp->if_drv_flags & IFF_DRV_RUNNING)))
 1913                 return (EAGAIN);
 1914 
 1915         return (1);
 1916 }
 1917 
 1918 /*
 1919  * Calculate max IPv6 MTU through all the interfaces and store it
 1920  * to in6_maxmtu.
 1921  */
 1922 void
 1923 in6_setmaxmtu(void)
 1924 {
 1925         unsigned long maxmtu = 0;
 1926         struct ifnet *ifp;
 1927 
 1928         IFNET_RLOCK_NOSLEEP();
 1929         TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
 1930                 /* this function can be called during ifnet initialization */
 1931                 if (!ifp->if_afdata[AF_INET6])
 1932                         continue;
 1933                 if ((ifp->if_flags & IFF_LOOPBACK) == 0 &&
 1934                     IN6_LINKMTU(ifp) > maxmtu)
 1935                         maxmtu = IN6_LINKMTU(ifp);
 1936         }
 1937         IFNET_RUNLOCK_NOSLEEP();
 1938         if (maxmtu)     /* update only when maxmtu is positive */
 1939                 V_in6_maxmtu = maxmtu;
 1940 }
 1941 
 1942 /*
 1943  * Provide the length of interface identifiers to be used for the link attached
 1944  * to the given interface.  The length should be defined in "IPv6 over
 1945  * xxx-link" document.  Note that address architecture might also define
 1946  * the length for a particular set of address prefixes, regardless of the
 1947  * link type.  As clarified in rfc2462bis, those two definitions should be
 1948  * consistent, and those really are as of August 2004.
 1949  */
 1950 int
 1951 in6_if2idlen(struct ifnet *ifp)
 1952 {
 1953         switch (ifp->if_type) {
 1954         case IFT_ETHER:         /* RFC2464 */
 1955         case IFT_PROPVIRTUAL:   /* XXX: no RFC. treat it as ether */
 1956         case IFT_L2VLAN:        /* ditto */
 1957         case IFT_IEEE80211:     /* ditto */
 1958         case IFT_BRIDGE:        /* bridge(4) only does Ethernet-like links */
 1959         case IFT_INFINIBAND:
 1960                 return (64);
 1961         case IFT_FDDI:          /* RFC2467 */
 1962                 return (64);
 1963         case IFT_ISO88025:      /* RFC2470 (IPv6 over Token Ring) */
 1964                 return (64);
 1965         case IFT_PPP:           /* RFC2472 */
 1966                 return (64);
 1967         case IFT_ARCNET:        /* RFC2497 */
 1968                 return (64);
 1969         case IFT_FRELAY:        /* RFC2590 */
 1970                 return (64);
 1971         case IFT_IEEE1394:      /* RFC3146 */
 1972                 return (64);
 1973         case IFT_GIF:
 1974                 return (64);    /* draft-ietf-v6ops-mech-v2-07 */
 1975         case IFT_LOOP:
 1976                 return (64);    /* XXX: is this really correct? */
 1977         default:
 1978                 /*
 1979                  * Unknown link type:
 1980                  * It might be controversial to use the today's common constant
 1981                  * of 64 for these cases unconditionally.  For full compliance,
 1982                  * we should return an error in this case.  On the other hand,
 1983                  * if we simply miss the standard for the link type or a new
 1984                  * standard is defined for a new link type, the IFID length
 1985                  * is very likely to be the common constant.  As a compromise,
 1986                  * we always use the constant, but make an explicit notice
 1987                  * indicating the "unknown" case.
 1988                  */
 1989                 printf("in6_if2idlen: unknown link type (%d)\n", ifp->if_type);
 1990                 return (64);
 1991         }
 1992 }
 1993 
 1994 #include <sys/sysctl.h>
 1995 
 1996 struct in6_llentry {
 1997         struct llentry          base;
 1998 };
 1999 
 2000 #define IN6_LLTBL_DEFAULT_HSIZE 32
 2001 #define IN6_LLTBL_HASH(k, h) \
 2002         (((((((k >> 8) ^ k) >> 8) ^ k) >> 8) ^ k) & ((h) - 1))
 2003 
 2004 /*
 2005  * Do actual deallocation of @lle.
 2006  */
 2007 static void
 2008 in6_lltable_destroy_lle_unlocked(struct llentry *lle)
 2009 {
 2010 
 2011         LLE_LOCK_DESTROY(lle);
 2012         LLE_REQ_DESTROY(lle);
 2013         free(lle, M_LLTABLE);
 2014 }
 2015 
 2016 /*
 2017  * Called by LLE_FREE_LOCKED when number of references
 2018  * drops to zero.
 2019  */
 2020 static void
 2021 in6_lltable_destroy_lle(struct llentry *lle)
 2022 {
 2023 
 2024         LLE_WUNLOCK(lle);
 2025         in6_lltable_destroy_lle_unlocked(lle);
 2026 }
 2027 
 2028 static struct llentry *
 2029 in6_lltable_new(const struct in6_addr *addr6, u_int flags)
 2030 {
 2031         struct in6_llentry *lle;
 2032 
 2033         lle = malloc(sizeof(struct in6_llentry), M_LLTABLE, M_NOWAIT | M_ZERO);
 2034         if (lle == NULL)                /* NB: caller generates msg */
 2035                 return NULL;
 2036 
 2037         lle->base.r_l3addr.addr6 = *addr6;
 2038         lle->base.lle_refcnt = 1;
 2039         lle->base.lle_free = in6_lltable_destroy_lle;
 2040         LLE_LOCK_INIT(&lle->base);
 2041         LLE_REQ_INIT(&lle->base);
 2042         callout_init(&lle->base.lle_timer, 1);
 2043 
 2044         return (&lle->base);
 2045 }
 2046 
 2047 static int
 2048 in6_lltable_match_prefix(const struct sockaddr *saddr,
 2049     const struct sockaddr *smask, u_int flags, struct llentry *lle)
 2050 {
 2051         const struct in6_addr *addr, *mask, *lle_addr;
 2052 
 2053         addr = &((const struct sockaddr_in6 *)saddr)->sin6_addr;
 2054         mask = &((const struct sockaddr_in6 *)smask)->sin6_addr;
 2055         lle_addr = &lle->r_l3addr.addr6;
 2056 
 2057         if (IN6_ARE_MASKED_ADDR_EQUAL(lle_addr, addr, mask) == 0)
 2058                 return (0);
 2059 
 2060         if (lle->la_flags & LLE_IFADDR) {
 2061 
 2062                 /*
 2063                  * Delete LLE_IFADDR records IFF address & flag matches.
 2064                  * Note that addr is the interface address within prefix
 2065                  * being matched.
 2066                  */
 2067                 if (IN6_ARE_ADDR_EQUAL(addr, lle_addr) &&
 2068                     (flags & LLE_STATIC) != 0)
 2069                         return (1);
 2070                 return (0);
 2071         }
 2072 
 2073         /* flags & LLE_STATIC means deleting both dynamic and static entries */
 2074         if ((flags & LLE_STATIC) || !(lle->la_flags & LLE_STATIC))
 2075                 return (1);
 2076 
 2077         return (0);
 2078 }
 2079 
 2080 static void
 2081 in6_lltable_free_entry(struct lltable *llt, struct llentry *lle)
 2082 {
 2083         struct ifnet *ifp;
 2084 
 2085         LLE_WLOCK_ASSERT(lle);
 2086         KASSERT(llt != NULL, ("lltable is NULL"));
 2087 
 2088         /* Unlink entry from table */
 2089         if ((lle->la_flags & LLE_LINKED) != 0) {
 2090 
 2091                 ifp = llt->llt_ifp;
 2092                 IF_AFDATA_WLOCK_ASSERT(ifp);
 2093                 lltable_unlink_entry(llt, lle);
 2094         }
 2095 
 2096         if (callout_stop(&lle->lle_timer) > 0)
 2097                 LLE_REMREF(lle);
 2098 
 2099         llentry_free(lle);
 2100 }
 2101 
 2102 static int
 2103 in6_lltable_rtcheck(struct ifnet *ifp,
 2104                     u_int flags,
 2105                     const struct sockaddr *l3addr)
 2106 {
 2107         const struct sockaddr_in6 *sin6;
 2108         struct nhop6_basic nh6;
 2109         struct in6_addr dst;
 2110         uint32_t scopeid;
 2111         int error;
 2112         char ip6buf[INET6_ADDRSTRLEN];
 2113 
 2114         KASSERT(l3addr->sa_family == AF_INET6,
 2115             ("sin_family %d", l3addr->sa_family));
 2116 
 2117         /* Our local addresses are always only installed on the default FIB. */
 2118 
 2119         sin6 = (const struct sockaddr_in6 *)l3addr;
 2120         in6_splitscope(&sin6->sin6_addr, &dst, &scopeid);
 2121         error = fib6_lookup_nh_basic(RT_DEFAULT_FIB, &dst, scopeid, 0, 0, &nh6);
 2122         if (error != 0 || (nh6.nh_flags & NHF_GATEWAY) || nh6.nh_ifp != ifp) {
 2123                 struct ifaddr *ifa;
 2124                 /*
 2125                  * Create an ND6 cache for an IPv6 neighbor
 2126                  * that is not covered by our own prefix.
 2127                  */
 2128                 ifa = ifaof_ifpforaddr(l3addr, ifp);
 2129                 if (ifa != NULL) {
 2130                         ifa_free(ifa);
 2131                         return 0;
 2132                 }
 2133                 log(LOG_INFO, "IPv6 address: \"%s\" is not on the network\n",
 2134                     ip6_sprintf(ip6buf, &sin6->sin6_addr));
 2135                 return EINVAL;
 2136         }
 2137         return 0;
 2138 }
 2139 
 2140 static inline uint32_t
 2141 in6_lltable_hash_dst(const struct in6_addr *dst, uint32_t hsize)
 2142 {
 2143 
 2144         return (IN6_LLTBL_HASH(dst->s6_addr32[3], hsize));
 2145 }
 2146 
 2147 static uint32_t
 2148 in6_lltable_hash(const struct llentry *lle, uint32_t hsize)
 2149 {
 2150 
 2151         return (in6_lltable_hash_dst(&lle->r_l3addr.addr6, hsize));
 2152 }
 2153 
 2154 static void
 2155 in6_lltable_fill_sa_entry(const struct llentry *lle, struct sockaddr *sa)
 2156 {
 2157         struct sockaddr_in6 *sin6;
 2158 
 2159         sin6 = (struct sockaddr_in6 *)sa;
 2160         bzero(sin6, sizeof(*sin6));
 2161         sin6->sin6_family = AF_INET6;
 2162         sin6->sin6_len = sizeof(*sin6);
 2163         sin6->sin6_addr = lle->r_l3addr.addr6;
 2164 }
 2165 
 2166 static inline struct llentry *
 2167 in6_lltable_find_dst(struct lltable *llt, const struct in6_addr *dst)
 2168 {
 2169         struct llentry *lle;
 2170         struct llentries *lleh;
 2171         u_int hashidx;
 2172 
 2173         hashidx = in6_lltable_hash_dst(dst, llt->llt_hsize);
 2174         lleh = &llt->lle_head[hashidx];
 2175         LIST_FOREACH(lle, lleh, lle_next) {
 2176                 if (lle->la_flags & LLE_DELETED)
 2177                         continue;
 2178                 if (IN6_ARE_ADDR_EQUAL(&lle->r_l3addr.addr6, dst))
 2179                         break;
 2180         }
 2181 
 2182         return (lle);
 2183 }
 2184 
 2185 static void
 2186 in6_lltable_delete_entry(struct lltable *llt, struct llentry *lle)
 2187 {
 2188 
 2189         lle->la_flags |= LLE_DELETED;
 2190         EVENTHANDLER_INVOKE(lle_event, lle, LLENTRY_DELETED);
 2191 #ifdef DIAGNOSTIC
 2192         log(LOG_INFO, "ifaddr cache = %p is deleted\n", lle);
 2193 #endif
 2194         llentry_free(lle);
 2195 }
 2196 
 2197 static struct llentry *
 2198 in6_lltable_alloc(struct lltable *llt, u_int flags,
 2199         const struct sockaddr *l3addr)
 2200 {
 2201         const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6 *)l3addr;
 2202         struct ifnet *ifp = llt->llt_ifp;
 2203         struct llentry *lle;
 2204         char linkhdr[LLE_MAX_LINKHDR];
 2205         size_t linkhdrsize;
 2206         int lladdr_off;
 2207 
 2208         KASSERT(l3addr->sa_family == AF_INET6,
 2209             ("sin_family %d", l3addr->sa_family));
 2210 
 2211         /*
 2212          * A route that covers the given address must have
 2213          * been installed 1st because we are doing a resolution,
 2214          * verify this.
 2215          */
 2216         if (!(flags & LLE_IFADDR) &&
 2217             in6_lltable_rtcheck(ifp, flags, l3addr) != 0)
 2218                 return (NULL);
 2219 
 2220         lle = in6_lltable_new(&sin6->sin6_addr, flags);
 2221         if (lle == NULL) {
 2222                 log(LOG_INFO, "lla_lookup: new lle malloc failed\n");
 2223                 return (NULL);
 2224         }
 2225         lle->la_flags = flags;
 2226         if ((flags & LLE_IFADDR) == LLE_IFADDR) {
 2227                 linkhdrsize = LLE_MAX_LINKHDR;
 2228                 if (lltable_calc_llheader(ifp, AF_INET6, IF_LLADDR(ifp),
 2229                     linkhdr, &linkhdrsize, &lladdr_off) != 0) {
 2230                         in6_lltable_destroy_lle_unlocked(lle);
 2231                         return (NULL);
 2232                 }
 2233                 lltable_set_entry_addr(ifp, lle, linkhdr, linkhdrsize,
 2234                     lladdr_off);
 2235                 lle->la_flags |= LLE_STATIC;
 2236         }
 2237 
 2238         if ((lle->la_flags & LLE_STATIC) != 0)
 2239                 lle->ln_state = ND6_LLINFO_REACHABLE;
 2240 
 2241         return (lle);
 2242 }
 2243 
 2244 static struct llentry *
 2245 in6_lltable_lookup(struct lltable *llt, u_int flags,
 2246         const struct sockaddr *l3addr)
 2247 {
 2248         const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6 *)l3addr;
 2249         struct llentry *lle;
 2250 
 2251         IF_AFDATA_LOCK_ASSERT(llt->llt_ifp);
 2252         KASSERT(l3addr->sa_family == AF_INET6,
 2253             ("sin_family %d", l3addr->sa_family));
 2254 
 2255         lle = in6_lltable_find_dst(llt, &sin6->sin6_addr);
 2256 
 2257         if (lle == NULL)
 2258                 return (NULL);
 2259 
 2260         KASSERT((flags & (LLE_UNLOCKED|LLE_EXCLUSIVE)) !=
 2261             (LLE_UNLOCKED|LLE_EXCLUSIVE),("wrong lle request flags: 0x%X",
 2262             flags));
 2263 
 2264         if (flags & LLE_UNLOCKED)
 2265                 return (lle);
 2266 
 2267         if (flags & LLE_EXCLUSIVE)
 2268                 LLE_WLOCK(lle);
 2269         else
 2270                 LLE_RLOCK(lle);
 2271         return (lle);
 2272 }
 2273 
 2274 static int
 2275 in6_lltable_dump_entry(struct lltable *llt, struct llentry *lle,
 2276     struct sysctl_req *wr)
 2277 {
 2278         struct ifnet *ifp = llt->llt_ifp;
 2279         /* XXX stack use */
 2280         struct {
 2281                 struct rt_msghdr        rtm;
 2282                 struct sockaddr_in6     sin6;
 2283                 /*
 2284                  * ndp.c assumes that sdl is word aligned
 2285                  */
 2286 #ifdef __LP64__
 2287                 uint32_t                pad;
 2288 #endif
 2289                 struct sockaddr_dl      sdl;
 2290         } ndpc;
 2291         struct sockaddr_dl *sdl;
 2292         int error;
 2293 
 2294         bzero(&ndpc, sizeof(ndpc));
 2295                         /* skip deleted entries */
 2296                         if ((lle->la_flags & LLE_DELETED) == LLE_DELETED)
 2297                                 return (0);
 2298                         /* Skip if jailed and not a valid IP of the prison. */
 2299                         lltable_fill_sa_entry(lle,
 2300                             (struct sockaddr *)&ndpc.sin6);
 2301                         if (prison_if(wr->td->td_ucred,
 2302                             (struct sockaddr *)&ndpc.sin6) != 0)
 2303                                 return (0);
 2304                         /*
 2305                          * produce a msg made of:
 2306                          *  struct rt_msghdr;
 2307                          *  struct sockaddr_in6 (IPv6)
 2308                          *  struct sockaddr_dl;
 2309                          */
 2310                         ndpc.rtm.rtm_msglen = sizeof(ndpc);
 2311                         ndpc.rtm.rtm_version = RTM_VERSION;
 2312                         ndpc.rtm.rtm_type = RTM_GET;
 2313                         ndpc.rtm.rtm_flags = RTF_UP;
 2314                         ndpc.rtm.rtm_addrs = RTA_DST | RTA_GATEWAY;
 2315                         if (V_deembed_scopeid)
 2316                                 sa6_recoverscope(&ndpc.sin6);
 2317 
 2318                         /* publish */
 2319                         if (lle->la_flags & LLE_PUB)
 2320                                 ndpc.rtm.rtm_flags |= RTF_ANNOUNCE;
 2321 
 2322                         sdl = &ndpc.sdl;
 2323                         sdl->sdl_family = AF_LINK;
 2324                         sdl->sdl_len = sizeof(*sdl);
 2325                         sdl->sdl_index = ifp->if_index;
 2326                         sdl->sdl_type = ifp->if_type;
 2327                         if ((lle->la_flags & LLE_VALID) == LLE_VALID) {
 2328                                 sdl->sdl_alen = ifp->if_addrlen;
 2329                                 bcopy(lle->ll_addr, LLADDR(sdl),
 2330                                     ifp->if_addrlen);
 2331                         } else {
 2332                                 sdl->sdl_alen = 0;
 2333                                 bzero(LLADDR(sdl), ifp->if_addrlen);
 2334                         }
 2335                         if (lle->la_expire != 0)
 2336                                 ndpc.rtm.rtm_rmx.rmx_expire = lle->la_expire +
 2337                                     lle->lle_remtime / hz +
 2338                                     time_second - time_uptime;
 2339                         ndpc.rtm.rtm_flags |= (RTF_HOST | RTF_LLDATA);
 2340                         if (lle->la_flags & LLE_STATIC)
 2341                                 ndpc.rtm.rtm_flags |= RTF_STATIC;
 2342                         if (lle->la_flags & LLE_IFADDR)
 2343                                 ndpc.rtm.rtm_flags |= RTF_PINNED;
 2344                         if (lle->ln_router != 0)
 2345                                 ndpc.rtm.rtm_flags |= RTF_GATEWAY;
 2346                         ndpc.rtm.rtm_rmx.rmx_pksent = lle->la_asked;
 2347                         /* Store state in rmx_weight value */
 2348                         ndpc.rtm.rtm_rmx.rmx_state = lle->ln_state;
 2349                         ndpc.rtm.rtm_index = ifp->if_index;
 2350                         error = SYSCTL_OUT(wr, &ndpc, sizeof(ndpc));
 2351 
 2352         return (error);
 2353 }
 2354 
 2355 static struct lltable *
 2356 in6_lltattach(struct ifnet *ifp)
 2357 {
 2358         struct lltable *llt;
 2359 
 2360         llt = lltable_allocate_htbl(IN6_LLTBL_DEFAULT_HSIZE);
 2361         llt->llt_af = AF_INET6;
 2362         llt->llt_ifp = ifp;
 2363 
 2364         llt->llt_lookup = in6_lltable_lookup;
 2365         llt->llt_alloc_entry = in6_lltable_alloc;
 2366         llt->llt_delete_entry = in6_lltable_delete_entry;
 2367         llt->llt_dump_entry = in6_lltable_dump_entry;
 2368         llt->llt_hash = in6_lltable_hash;
 2369         llt->llt_fill_sa_entry = in6_lltable_fill_sa_entry;
 2370         llt->llt_free_entry = in6_lltable_free_entry;
 2371         llt->llt_match_prefix = in6_lltable_match_prefix;
 2372         lltable_link(llt);
 2373 
 2374         return (llt);
 2375 }
 2376 
 2377 void *
 2378 in6_domifattach(struct ifnet *ifp)
 2379 {
 2380         struct in6_ifextra *ext;
 2381 
 2382         /* There are not IPv6-capable interfaces. */
 2383         switch (ifp->if_type) {
 2384         case IFT_PFLOG:
 2385         case IFT_PFSYNC:
 2386         case IFT_USB:
 2387                 return (NULL);
 2388         }
 2389         ext = (struct in6_ifextra *)malloc(sizeof(*ext), M_IFADDR, M_WAITOK);
 2390         bzero(ext, sizeof(*ext));
 2391 
 2392         ext->in6_ifstat = malloc(sizeof(counter_u64_t) *
 2393             sizeof(struct in6_ifstat) / sizeof(uint64_t), M_IFADDR, M_WAITOK);
 2394         COUNTER_ARRAY_ALLOC(ext->in6_ifstat,
 2395             sizeof(struct in6_ifstat) / sizeof(uint64_t), M_WAITOK);
 2396 
 2397         ext->icmp6_ifstat = malloc(sizeof(counter_u64_t) *
 2398             sizeof(struct icmp6_ifstat) / sizeof(uint64_t), M_IFADDR,
 2399             M_WAITOK);
 2400         COUNTER_ARRAY_ALLOC(ext->icmp6_ifstat,
 2401             sizeof(struct icmp6_ifstat) / sizeof(uint64_t), M_WAITOK);
 2402 
 2403         ext->nd_ifinfo = nd6_ifattach(ifp);
 2404         ext->scope6_id = scope6_ifattach(ifp);
 2405         ext->lltable = in6_lltattach(ifp);
 2406 
 2407         ext->mld_ifinfo = mld_domifattach(ifp);
 2408 
 2409         return ext;
 2410 }
 2411 
 2412 int
 2413 in6_domifmtu(struct ifnet *ifp)
 2414 {
 2415         if (ifp->if_afdata[AF_INET6] == NULL)
 2416                 return ifp->if_mtu;
 2417 
 2418         return (IN6_LINKMTU(ifp));
 2419 }
 2420 
 2421 void
 2422 in6_domifdetach(struct ifnet *ifp, void *aux)
 2423 {
 2424         struct in6_ifextra *ext = (struct in6_ifextra *)aux;
 2425 
 2426         mld_domifdetach(ifp);
 2427         scope6_ifdetach(ext->scope6_id);
 2428         nd6_ifdetach(ifp, ext->nd_ifinfo);
 2429         lltable_free(ext->lltable);
 2430         COUNTER_ARRAY_FREE(ext->in6_ifstat,
 2431             sizeof(struct in6_ifstat) / sizeof(uint64_t));
 2432         free(ext->in6_ifstat, M_IFADDR);
 2433         COUNTER_ARRAY_FREE(ext->icmp6_ifstat,
 2434             sizeof(struct icmp6_ifstat) / sizeof(uint64_t));
 2435         free(ext->icmp6_ifstat, M_IFADDR);
 2436         free(ext, M_IFADDR);
 2437 }
 2438 
 2439 /*
 2440  * Convert sockaddr_in6 to sockaddr_in.  Original sockaddr_in6 must be
 2441  * v4 mapped addr or v4 compat addr
 2442  */
 2443 void
 2444 in6_sin6_2_sin(struct sockaddr_in *sin, struct sockaddr_in6 *sin6)
 2445 {
 2446 
 2447         bzero(sin, sizeof(*sin));
 2448         sin->sin_len = sizeof(struct sockaddr_in);
 2449         sin->sin_family = AF_INET;
 2450         sin->sin_port = sin6->sin6_port;
 2451         sin->sin_addr.s_addr = sin6->sin6_addr.s6_addr32[3];
 2452 }
 2453 
 2454 /* Convert sockaddr_in to sockaddr_in6 in v4 mapped addr format. */
 2455 void
 2456 in6_sin_2_v4mapsin6(struct sockaddr_in *sin, struct sockaddr_in6 *sin6)
 2457 {
 2458         bzero(sin6, sizeof(*sin6));
 2459         sin6->sin6_len = sizeof(struct sockaddr_in6);
 2460         sin6->sin6_family = AF_INET6;
 2461         sin6->sin6_port = sin->sin_port;
 2462         sin6->sin6_addr.s6_addr32[0] = 0;
 2463         sin6->sin6_addr.s6_addr32[1] = 0;
 2464         sin6->sin6_addr.s6_addr32[2] = IPV6_ADDR_INT32_SMP;
 2465         sin6->sin6_addr.s6_addr32[3] = sin->sin_addr.s_addr;
 2466 }
 2467 
 2468 /* Convert sockaddr_in6 into sockaddr_in. */
 2469 void
 2470 in6_sin6_2_sin_in_sock(struct sockaddr *nam)
 2471 {
 2472         struct sockaddr_in *sin_p;
 2473         struct sockaddr_in6 sin6;
 2474 
 2475         /*
 2476          * Save original sockaddr_in6 addr and convert it
 2477          * to sockaddr_in.
 2478          */
 2479         sin6 = *(struct sockaddr_in6 *)nam;
 2480         sin_p = (struct sockaddr_in *)nam;
 2481         in6_sin6_2_sin(sin_p, &sin6);
 2482 }
 2483 
 2484 /* Convert sockaddr_in into sockaddr_in6 in v4 mapped addr format. */
 2485 void
 2486 in6_sin_2_v4mapsin6_in_sock(struct sockaddr **nam)
 2487 {
 2488         struct sockaddr_in *sin_p;
 2489         struct sockaddr_in6 *sin6_p;
 2490 
 2491         sin6_p = malloc(sizeof *sin6_p, M_SONAME, M_WAITOK);
 2492         sin_p = (struct sockaddr_in *)*nam;
 2493         in6_sin_2_v4mapsin6(sin_p, sin6_p);
 2494         free(*nam, M_SONAME);
 2495         *nam = (struct sockaddr *)sin6_p;
 2496 }

Cache object: 3484e3de05cd2ef0bf2575851ca57465


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.