Home | History | Annotate | Line # | Download | only in netinet6
      1  1.177     ozaki /*	$NetBSD: in6_pcb.c,v 1.177 2022/11/04 09:04:27 ozaki-r Exp $	*/
      2   1.35    itojun /*	$KAME: in6_pcb.c,v 1.84 2001/02/08 18:02:08 itojun Exp $	*/
      3    1.5   thorpej 
      4    1.2    itojun /*
      5    1.2    itojun  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
      6    1.2    itojun  * All rights reserved.
      7   1.23    itojun  *
      8    1.2    itojun  * Redistribution and use in source and binary forms, with or without
      9    1.2    itojun  * modification, are permitted provided that the following conditions
     10    1.2    itojun  * are met:
     11    1.2    itojun  * 1. Redistributions of source code must retain the above copyright
     12    1.2    itojun  *    notice, this list of conditions and the following disclaimer.
     13    1.2    itojun  * 2. Redistributions in binary form must reproduce the above copyright
     14    1.2    itojun  *    notice, this list of conditions and the following disclaimer in the
     15    1.2    itojun  *    documentation and/or other materials provided with the distribution.
     16    1.2    itojun  * 3. Neither the name of the project nor the names of its contributors
     17    1.2    itojun  *    may be used to endorse or promote products derived from this software
     18    1.2    itojun  *    without specific prior written permission.
     19   1.23    itojun  *
     20    1.2    itojun  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
     21    1.2    itojun  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     22    1.2    itojun  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     23    1.2    itojun  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
     24    1.2    itojun  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     25    1.2    itojun  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     26    1.2    itojun  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     27    1.2    itojun  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     28    1.2    itojun  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     29    1.2    itojun  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     30    1.2    itojun  * SUCH DAMAGE.
     31    1.2    itojun  */
     32    1.2    itojun 
     33    1.2    itojun /*
     34    1.2    itojun  * Copyright (c) 1982, 1986, 1991, 1993
     35    1.2    itojun  *	The Regents of the University of California.  All rights reserved.
     36    1.2    itojun  *
     37    1.2    itojun  * Redistribution and use in source and binary forms, with or without
     38    1.2    itojun  * modification, are permitted provided that the following conditions
     39    1.2    itojun  * are met:
     40    1.2    itojun  * 1. Redistributions of source code must retain the above copyright
     41    1.2    itojun  *    notice, this list of conditions and the following disclaimer.
     42    1.2    itojun  * 2. Redistributions in binary form must reproduce the above copyright
     43    1.2    itojun  *    notice, this list of conditions and the following disclaimer in the
     44    1.2    itojun  *    documentation and/or other materials provided with the distribution.
     45   1.54       agc  * 3. Neither the name of the University nor the names of its contributors
     46    1.2    itojun  *    may be used to endorse or promote products derived from this software
     47    1.2    itojun  *    without specific prior written permission.
     48    1.2    itojun  *
     49    1.2    itojun  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     50    1.2    itojun  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     51    1.2    itojun  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     52    1.2    itojun  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     53    1.2    itojun  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     54    1.2    itojun  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     55    1.2    itojun  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     56    1.2    itojun  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     57    1.2    itojun  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     58    1.2    itojun  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     59    1.2    itojun  * SUCH DAMAGE.
     60    1.2    itojun  *
     61    1.2    itojun  *	@(#)in_pcb.c	8.2 (Berkeley) 1/4/94
     62    1.2    itojun  */
     63   1.44     lukem 
     64   1.44     lukem #include <sys/cdefs.h>
     65  1.177     ozaki __KERNEL_RCSID(0, "$NetBSD: in6_pcb.c,v 1.177 2022/11/04 09:04:27 ozaki-r Exp $");
     66    1.7   thorpej 
     67  1.143     pooka #ifdef _KERNEL_OPT
     68   1.53     perry #include "opt_inet.h"
     69    1.7   thorpej #include "opt_ipsec.h"
     70  1.143     pooka #endif
     71    1.2    itojun 
     72    1.2    itojun #include <sys/param.h>
     73    1.2    itojun #include <sys/systm.h>
     74    1.2    itojun #include <sys/mbuf.h>
     75    1.2    itojun #include <sys/protosw.h>
     76    1.2    itojun #include <sys/socket.h>
     77    1.2    itojun #include <sys/socketvar.h>
     78    1.2    itojun #include <sys/ioctl.h>
     79    1.2    itojun #include <sys/errno.h>
     80    1.2    itojun #include <sys/time.h>
     81    1.2    itojun #include <sys/proc.h>
     82   1.71      elad #include <sys/kauth.h>
     83  1.104      elad #include <sys/domain.h>
     84  1.110     pooka #include <sys/once.h>
     85    1.2    itojun 
     86    1.2    itojun #include <net/if.h>
     87    1.2    itojun #include <net/route.h>
     88    1.2    itojun 
     89    1.2    itojun #include <netinet/in.h>
     90    1.2    itojun #include <netinet/in_var.h>
     91    1.2    itojun #include <netinet/in_systm.h>
     92    1.2    itojun #include <netinet/ip.h>
     93    1.2    itojun #include <netinet/in_pcb.h>
     94   1.19    itojun #include <netinet/ip6.h>
     95  1.120  christos #include <netinet/portalgo.h>
     96   1.11    itojun #include <netinet6/ip6_var.h>
     97    1.2    itojun #include <netinet6/in6_pcb.h>
     98   1.69    rpaulo #include <netinet6/scope6_var.h>
     99    1.2    itojun 
    100    1.8    itojun #include "faith.h"
    101    1.2    itojun 
    102  1.123  christos #ifdef IPSEC
    103   1.64  jonathan #include <netipsec/ipsec.h>
    104   1.64  jonathan #include <netipsec/ipsec6.h>
    105   1.64  jonathan #include <netipsec/key.h>
    106  1.123  christos #endif /* IPSEC */
    107   1.64  jonathan 
    108  1.113    dyoung #include <netinet/tcp_vtw.h>
    109  1.113    dyoung 
    110   1.99      matt const struct in6_addr zeroin6_addr;
    111   1.30    itojun 
    112   1.60    itojun #define	IN6PCBHASH_PORT(table, lport) \
    113   1.60    itojun 	&(table)->inpt_porthashtbl[ntohs(lport) & (table)->inpt_porthash]
    114   1.56    itojun #define IN6PCBHASH_BIND(table, laddr, lport) \
    115   1.56    itojun 	&(table)->inpt_bindhashtbl[ \
    116   1.56    itojun 	    (((laddr)->s6_addr32[0] ^ (laddr)->s6_addr32[1] ^ \
    117   1.56    itojun 	      (laddr)->s6_addr32[2] ^ (laddr)->s6_addr32[3]) + ntohs(lport)) & \
    118   1.56    itojun 	    (table)->inpt_bindhash]
    119   1.56    itojun #define IN6PCBHASH_CONNECT(table, faddr, fport, laddr, lport) \
    120   1.56    itojun 	&(table)->inpt_bindhashtbl[ \
    121   1.56    itojun 	    ((((faddr)->s6_addr32[0] ^ (faddr)->s6_addr32[1] ^ \
    122   1.56    itojun 	      (faddr)->s6_addr32[2] ^ (faddr)->s6_addr32[3]) + ntohs(fport)) + \
    123   1.56    itojun 	     (((laddr)->s6_addr32[0] ^ (laddr)->s6_addr32[1] ^ \
    124   1.56    itojun 	      (laddr)->s6_addr32[2] ^ (laddr)->s6_addr32[3]) + \
    125   1.56    itojun 	      ntohs(lport))) & (table)->inpt_bindhash]
    126   1.56    itojun 
    127   1.30    itojun int ip6_anonportmin = IPV6PORT_ANONMIN;
    128   1.30    itojun int ip6_anonportmax = IPV6PORT_ANONMAX;
    129   1.30    itojun int ip6_lowportmin  = IPV6PORT_RESERVEDMIN;
    130   1.30    itojun int ip6_lowportmax  = IPV6PORT_RESERVEDMAX;
    131    1.2    itojun 
    132   1.56    itojun void
    133  1.175     ozaki in6pcb_init(struct inpcbtable *table, int bindhashsize, int connecthashsize)
    134   1.56    itojun {
    135   1.56    itojun 
    136  1.174     ozaki 	inpcb_init(table, bindhashsize, connecthashsize);
    137  1.176     ozaki 	table->inpt_lastport = (in_port_t)ip6_anonportmax;
    138    1.2    itojun }
    139    1.2    itojun 
    140  1.104      elad /*
    141  1.172     ozaki  * Bind address from sin6 to inp.
    142  1.104      elad  */
    143  1.107      elad static int
    144  1.175     ozaki in6pcb_bind_addr(struct inpcb *inp, struct sockaddr_in6 *sin6, struct lwp *l)
    145    1.2    itojun {
    146  1.104      elad 	int error;
    147  1.148     ozaki 	int s;
    148  1.104      elad 
    149  1.104      elad 	/*
    150  1.104      elad 	 * We should check the family, but old programs
    151  1.164  dholland 	 * incorrectly fail to initialize it.
    152  1.104      elad 	 */
    153  1.104      elad 	if (sin6->sin6_family != AF_INET6)
    154  1.177     ozaki 		return EAFNOSUPPORT;
    155    1.2    itojun 
    156  1.104      elad #ifndef INET
    157  1.104      elad 	if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr))
    158  1.177     ozaki 		return EADDRNOTAVAIL;
    159  1.104      elad #endif
    160   1.56    itojun 
    161  1.104      elad 	if ((error = sa6_embedscope(sin6, ip6_use_defzone)) != 0)
    162  1.177     ozaki 		return error;
    163   1.69    rpaulo 
    164  1.148     ozaki 	s = pserialize_read_enter();
    165  1.104      elad 	if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
    166  1.172     ozaki 		if ((inp->inp_flags & IN6P_IPV6_V6ONLY) != 0) {
    167  1.148     ozaki 			error = EINVAL;
    168  1.148     ozaki 			goto out;
    169  1.148     ozaki 		}
    170  1.104      elad 		if (sin6->sin6_addr.s6_addr32[3]) {
    171  1.104      elad 			struct sockaddr_in sin;
    172  1.104      elad 
    173  1.104      elad 			memset(&sin, 0, sizeof(sin));
    174  1.104      elad 			sin.sin_len = sizeof(sin);
    175  1.104      elad 			sin.sin_family = AF_INET;
    176  1.104      elad 			bcopy(&sin6->sin6_addr.s6_addr32[3],
    177  1.104      elad 			    &sin.sin_addr, sizeof(sin.sin_addr));
    178  1.148     ozaki 			if (!IN_MULTICAST(sin.sin_addr.s_addr)) {
    179  1.148     ozaki 				struct ifaddr *ifa;
    180  1.148     ozaki 				ifa = ifa_ifwithaddr((struct sockaddr *)&sin);
    181  1.167  christos 				if (ifa == NULL &&
    182  1.172     ozaki 				    (inp->inp_flags & IN6P_BINDANY) == 0) {
    183  1.148     ozaki 					error = EADDRNOTAVAIL;
    184  1.148     ozaki 					goto out;
    185  1.148     ozaki 				}
    186  1.148     ozaki 			}
    187  1.104      elad 		}
    188  1.131  christos 	} else if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) {
    189  1.131  christos 		// succeed
    190  1.104      elad 	} else if (!IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
    191  1.148     ozaki 		struct ifaddr *ifa = NULL;
    192  1.104      elad 
    193  1.172     ozaki 		if ((inp->inp_flags & IN6P_FAITH) == 0) {
    194  1.148     ozaki 			ifa = ifa_ifwithaddr(sin6tosa(sin6));
    195  1.167  christos 			if (ifa == NULL &&
    196  1.172     ozaki 			    (inp->inp_flags & IN6P_BINDANY) == 0) {
    197  1.148     ozaki 				error = EADDRNOTAVAIL;
    198  1.148     ozaki 				goto out;
    199  1.148     ozaki 			}
    200  1.148     ozaki 		}
    201  1.104      elad 
    202    1.2    itojun 		/*
    203  1.104      elad 		 * bind to an anycast address might accidentally
    204  1.104      elad 		 * cause sending a packet with an anycast source
    205  1.104      elad 		 * address, so we forbid it.
    206  1.104      elad 		 *
    207  1.104      elad 		 * We should allow to bind to a deprecated address,
    208  1.104      elad 		 * since the application dare to use it.
    209  1.104      elad 		 * But, can we assume that they are careful enough
    210  1.104      elad 		 * to check if the address is deprecated or not?
    211  1.104      elad 		 * Maybe, as a safeguard, we should have a setsockopt
    212  1.104      elad 		 * flag to control the bind(2) behavior against
    213  1.104      elad 		 * deprecated addresses (default: forbid bind(2)).
    214    1.2    itojun 		 */
    215  1.148     ozaki 		if (ifa &&
    216  1.148     ozaki 		    ifatoia6(ifa)->ia6_flags &
    217  1.150       roy 		    (IN6_IFF_ANYCAST | IN6_IFF_DUPLICATED)) {
    218  1.148     ozaki 			error = EADDRNOTAVAIL;
    219  1.148     ozaki 			goto out;
    220  1.148     ozaki 		}
    221  1.104      elad 	}
    222  1.173     ozaki 	in6p_laddr(inp) = sin6->sin6_addr;
    223  1.148     ozaki 	error = 0;
    224  1.148     ozaki out:
    225  1.148     ozaki 	pserialize_read_exit(s);
    226  1.148     ozaki 	return error;
    227  1.104      elad }
    228    1.2    itojun 
    229  1.104      elad /*
    230  1.172     ozaki  * Bind port from sin6 to inp.
    231  1.104      elad  */
    232  1.107      elad static int
    233  1.175     ozaki in6pcb_bind_port(struct inpcb *inp, struct sockaddr_in6 *sin6, struct lwp *l)
    234  1.104      elad {
    235  1.172     ozaki 	struct inpcbtable *table = inp->inp_table;
    236  1.172     ozaki 	struct socket *so = inp->inp_socket;
    237  1.104      elad 	int wild = 0, reuseport = (so->so_options & SO_REUSEPORT);
    238  1.105      elad 	int error;
    239    1.2    itojun 
    240  1.104      elad 	if ((so->so_options & (SO_REUSEADDR|SO_REUSEPORT)) == 0 &&
    241  1.104      elad 	   ((so->so_proto->pr_flags & PR_CONNREQUIRED) == 0 ||
    242  1.104      elad 	    (so->so_options & SO_ACCEPTCONN) == 0))
    243  1.104      elad 		wild = 1;
    244    1.2    itojun 
    245  1.105      elad 	if (sin6->sin6_port != 0) {
    246  1.105      elad 		enum kauth_network_req req;
    247  1.105      elad 
    248   1.13    itojun #ifndef IPNOPRIVPORTS
    249  1.105      elad 		if (ntohs(sin6->sin6_port) < IPV6PORT_RESERVED)
    250  1.105      elad 			req = KAUTH_REQ_NETWORK_BIND_PRIVPORT;
    251  1.105      elad 		else
    252  1.105      elad #endif /* IPNOPRIVPORTS */
    253  1.105      elad 			req = KAUTH_REQ_NETWORK_BIND_PORT;
    254  1.105      elad 
    255  1.105      elad 		error = kauth_authorize_network(l->l_cred, KAUTH_NETWORK_BIND,
    256  1.105      elad 		    req, so, sin6, NULL);
    257  1.105      elad 		if (error)
    258  1.177     ozaki 			return EACCES;
    259  1.105      elad 	}
    260    1.2    itojun 
    261  1.104      elad 	if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) {
    262  1.104      elad 		/*
    263  1.104      elad 		 * Treat SO_REUSEADDR as SO_REUSEPORT for multicast;
    264  1.104      elad 		 * allow compepte duplication of binding if
    265  1.104      elad 		 * SO_REUSEPORT is set, or if SO_REUSEADDR is set
    266  1.104      elad 		 * and a multicast address is bound on both
    267  1.104      elad 		 * new and duplicated sockets.
    268  1.104      elad 		 */
    269  1.134     seanb 		if (so->so_options & (SO_REUSEADDR | SO_REUSEPORT))
    270  1.104      elad 			reuseport = SO_REUSEADDR|SO_REUSEPORT;
    271  1.104      elad 	}
    272  1.104      elad 
    273  1.106      elad 	if (sin6->sin6_port != 0) {
    274  1.106      elad 		if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
    275   1.56    itojun #ifdef INET
    276  1.106      elad 			struct inpcb *t;
    277  1.113    dyoung 			struct vestigial_inpcb vestige;
    278    1.2    itojun 
    279  1.174     ozaki 			t = inpcb_lookup_local(table,
    280  1.106      elad 			    *(struct in_addr *)&sin6->sin6_addr.s6_addr32[3],
    281  1.113    dyoung 			    sin6->sin6_port, wild, &vestige);
    282  1.106      elad 			if (t && (reuseport & t->inp_socket->so_options) == 0)
    283  1.177     ozaki 				return EADDRINUSE;
    284  1.113    dyoung 			if (!t
    285  1.113    dyoung 			    && vestige.valid
    286  1.113    dyoung 			    && !(reuseport && vestige.reuse_port))
    287  1.113    dyoung 			    return EADDRINUSE;
    288   1.56    itojun #else
    289  1.177     ozaki 			return EADDRNOTAVAIL;
    290    1.2    itojun #endif
    291  1.106      elad 		}
    292   1.56    itojun 
    293  1.106      elad 		{
    294  1.172     ozaki 			struct inpcb *t;
    295  1.113    dyoung 			struct vestigial_inpcb vestige;
    296    1.2    itojun 
    297  1.175     ozaki 			t = in6pcb_lookup_local(table, &sin6->sin6_addr,
    298  1.113    dyoung 			    sin6->sin6_port, wild, &vestige);
    299  1.172     ozaki 			if (t && (reuseport & t->inp_socket->so_options) == 0)
    300  1.177     ozaki 				return EADDRINUSE;
    301  1.113    dyoung 			if (!t
    302  1.113    dyoung 			    && vestige.valid
    303  1.113    dyoung 			    && !(reuseport && vestige.reuse_port))
    304  1.113    dyoung 			    return EADDRINUSE;
    305  1.106      elad 		}
    306    1.2    itojun 	}
    307   1.10    itojun 
    308  1.104      elad 	if (sin6->sin6_port == 0) {
    309   1.10    itojun 		int e;
    310  1.175     ozaki 		e = in6pcb_set_port(sin6, inp, l);
    311   1.56    itojun 		if (e != 0)
    312  1.177     ozaki 			return e;
    313   1.56    itojun 	} else {
    314  1.172     ozaki 		inp->inp_lport = sin6->sin6_port;
    315  1.174     ozaki 		inpcb_set_state(inp, INP_BOUND);
    316   1.10    itojun 	}
    317   1.10    itojun 
    318  1.172     ozaki 	LIST_REMOVE(inp, inp_lhash);
    319  1.172     ozaki 	LIST_INSERT_HEAD(IN6PCBHASH_PORT(table, inp->inp_lport),
    320  1.172     ozaki 	    inp, inp_lhash);
    321   1.60    itojun 
    322  1.177     ozaki 	return 0;
    323  1.104      elad }
    324  1.104      elad 
    325  1.104      elad int
    326  1.175     ozaki in6pcb_bind(void *v, struct sockaddr_in6 *sin6, struct lwp *l)
    327  1.104      elad {
    328  1.172     ozaki 	struct inpcb *inp = v;
    329  1.108      elad 	struct sockaddr_in6 lsin6;
    330  1.104      elad 	int error;
    331  1.104      elad 
    332  1.172     ozaki 	if (inp->inp_af != AF_INET6)
    333  1.177     ozaki 		return EINVAL;
    334  1.104      elad 
    335  1.104      elad 	/*
    336  1.104      elad 	 * If we already have a local port or a local address it means we're
    337  1.104      elad 	 * bounded.
    338  1.104      elad 	 */
    339  1.173     ozaki 	if (inp->inp_lport || !(IN6_IS_ADDR_UNSPECIFIED(&in6p_laddr(inp)) ||
    340  1.173     ozaki 	    (IN6_IS_ADDR_V4MAPPED(&in6p_laddr(inp)) &&
    341  1.173     ozaki 	      in6p_laddr(inp).s6_addr32[3] == 0)))
    342  1.177     ozaki 		return EINVAL;
    343  1.104      elad 
    344  1.135       rtr 	if (NULL != sin6) {
    345  1.104      elad 		/* We were provided a sockaddr_in6 to use. */
    346  1.135       rtr 		if (sin6->sin6_len != sizeof(*sin6))
    347  1.177     ozaki 			return EINVAL;
    348  1.104      elad 	} else {
    349  1.104      elad 		/* We always bind to *something*, even if it's "anything". */
    350  1.108      elad 		lsin6 = *((const struct sockaddr_in6 *)
    351  1.172     ozaki 		    inp->inp_socket->so_proto->pr_domain->dom_sa_any);
    352  1.108      elad 		sin6 = &lsin6;
    353  1.104      elad 	}
    354  1.104      elad 
    355  1.104      elad 	/* Bind address. */
    356  1.175     ozaki 	error = in6pcb_bind_addr(inp, sin6, l);
    357  1.104      elad 	if (error)
    358  1.177     ozaki 		return error;
    359  1.104      elad 
    360  1.104      elad 	/* Bind port. */
    361  1.175     ozaki 	error = in6pcb_bind_port(inp, sin6, l);
    362  1.104      elad 	if (error) {
    363  1.104      elad 		/*
    364  1.104      elad 		 * Reset the address here to "any" so we don't "leak" the
    365  1.172     ozaki 		 * inpcb.
    366  1.104      elad 		 */
    367  1.173     ozaki 		in6p_laddr(inp) = in6addr_any;
    368  1.104      elad 
    369  1.177     ozaki 		return error;
    370  1.104      elad 	}
    371  1.104      elad 
    372  1.104      elad 
    373   1.57    itojun #if 0
    374  1.173     ozaki 	in6p_flowinfo(inp) = 0;	/* XXX */
    375   1.57    itojun #endif
    376  1.177     ozaki 	return 0;
    377   1.10    itojun }
    378   1.10    itojun 
    379   1.10    itojun /*
    380    1.2    itojun  * Connect from a socket to a specified address.
    381    1.2    itojun  * Both address and port must be specified in argument sin6.
    382    1.2    itojun  * If don't have a local address for this socket yet,
    383    1.2    itojun  * then pick one.
    384    1.2    itojun  */
    385    1.2    itojun int
    386  1.175     ozaki in6pcb_connect(void *v, struct sockaddr_in6 *sin6, struct lwp *l)
    387    1.2    itojun {
    388  1.172     ozaki 	struct inpcb *inp = v;
    389    1.2    itojun 	struct in6_addr *in6a = NULL;
    390  1.151     ozaki 	struct in6_addr ia6;
    391    1.2    itojun 	struct ifnet *ifp = NULL;	/* outgoing interface */
    392    1.2    itojun 	int error = 0;
    393   1.69    rpaulo 	int scope_ambiguous = 0;
    394   1.31    itojun #ifdef INET
    395    1.2    itojun 	struct in6_addr mapped;
    396   1.31    itojun #endif
    397   1.26    itojun 	struct sockaddr_in6 tmp;
    398  1.113    dyoung 	struct vestigial_inpcb vestige;
    399  1.145     ozaki 	struct psref psref;
    400  1.145     ozaki 	int bound;
    401    1.2    itojun 
    402    1.2    itojun 	(void)&in6a;				/* XXX fool gcc */
    403    1.2    itojun 
    404  1.172     ozaki 	if (inp->inp_af != AF_INET6)
    405  1.177     ozaki 		return EINVAL;
    406   1.56    itojun 
    407  1.137       rtr 	if (sin6->sin6_len != sizeof(*sin6))
    408  1.177     ozaki 		return EINVAL;
    409    1.2    itojun 	if (sin6->sin6_family != AF_INET6)
    410  1.177     ozaki 		return EAFNOSUPPORT;
    411    1.2    itojun 	if (sin6->sin6_port == 0)
    412  1.177     ozaki 		return EADDRNOTAVAIL;
    413    1.2    itojun 
    414  1.122  christos 	if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr) &&
    415  1.172     ozaki 	    inp->inp_socket->so_type == SOCK_STREAM)
    416  1.122  christos 		return EADDRNOTAVAIL;
    417  1.122  christos 
    418   1.69    rpaulo 	if (sin6->sin6_scope_id == 0 && !ip6_use_defzone)
    419   1.69    rpaulo 		scope_ambiguous = 1;
    420   1.69    rpaulo 	if ((error = sa6_embedscope(sin6, ip6_use_defzone)) != 0)
    421  1.177     ozaki 		return error;
    422   1.69    rpaulo 
    423    1.2    itojun 	/* sanity check for mapped address case */
    424    1.2    itojun 	if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
    425  1.172     ozaki 		if ((inp->inp_flags & IN6P_IPV6_V6ONLY) != 0)
    426   1.41    itojun 			return EINVAL;
    427  1.173     ozaki 		if (IN6_IS_ADDR_UNSPECIFIED(&in6p_laddr(inp)))
    428  1.173     ozaki 			in6p_laddr(inp).s6_addr16[5] = htons(0xffff);
    429  1.173     ozaki 		if (!IN6_IS_ADDR_V4MAPPED(&in6p_laddr(inp)))
    430    1.2    itojun 			return EINVAL;
    431   1.41    itojun 	} else
    432   1.41    itojun 	{
    433  1.173     ozaki 		if (IN6_IS_ADDR_V4MAPPED(&in6p_laddr(inp)))
    434    1.2    itojun 			return EINVAL;
    435    1.2    itojun 	}
    436   1.26    itojun 
    437   1.26    itojun 	/* protect *sin6 from overwrites */
    438   1.26    itojun 	tmp = *sin6;
    439   1.26    itojun 	sin6 = &tmp;
    440    1.2    itojun 
    441  1.145     ozaki 	bound = curlwp_bind();
    442    1.2    itojun 	/* Source address selection. */
    443  1.173     ozaki 	if (IN6_IS_ADDR_V4MAPPED(&in6p_laddr(inp)) &&
    444  1.173     ozaki 	    in6p_laddr(inp).s6_addr32[3] == 0) {
    445   1.31    itojun #ifdef INET
    446  1.148     ozaki 		struct sockaddr_in sin;
    447  1.148     ozaki 		struct in_ifaddr *ia4;
    448  1.148     ozaki 		struct psref _psref;
    449    1.2    itojun 
    450  1.100    cegger 		memset(&sin, 0, sizeof(sin));
    451    1.2    itojun 		sin.sin_len = sizeof(sin);
    452    1.2    itojun 		sin.sin_family = AF_INET;
    453  1.103   tsutsui 		memcpy(&sin.sin_addr, &sin6->sin6_addr.s6_addr32[3],
    454    1.2    itojun 			sizeof(sin.sin_addr));
    455  1.172     ozaki 		ia4 = in_selectsrc(&sin, &inp->inp_route,
    456  1.172     ozaki 			inp->inp_socket->so_options, NULL, &error, &_psref);
    457  1.148     ozaki 		if (ia4 == NULL) {
    458    1.2    itojun 			if (error == 0)
    459    1.2    itojun 				error = EADDRNOTAVAIL;
    460  1.163     ozaki 			curlwp_bindx(bound);
    461  1.177     ozaki 			return error;
    462    1.2    itojun 		}
    463  1.100    cegger 		memset(&mapped, 0, sizeof(mapped));
    464    1.2    itojun 		mapped.s6_addr16[5] = htons(0xffff);
    465  1.148     ozaki 		memcpy(&mapped.s6_addr32[3], &IA_SIN(ia4)->sin_addr,
    466  1.148     ozaki 		    sizeof(IA_SIN(ia4)->sin_addr));
    467  1.148     ozaki 		ia4_release(ia4, &_psref);
    468    1.2    itojun 		in6a = &mapped;
    469   1.31    itojun #else
    470  1.163     ozaki 		curlwp_bindx(bound);
    471   1.31    itojun 		return EADDRNOTAVAIL;
    472   1.31    itojun #endif
    473   1.69    rpaulo 	} else {
    474   1.10    itojun 		/*
    475   1.10    itojun 		 * XXX: in6_selectsrc might replace the bound local address
    476   1.10    itojun 		 * with the address specified by setsockopt(IPV6_PKTINFO).
    477   1.10    itojun 		 * Is it the intended behavior?
    478   1.10    itojun 		 */
    479  1.173     ozaki 		error = in6_selectsrc(sin6, in6p_outputopts(inp),
    480  1.173     ozaki 		    in6p_moptions(inp), &inp->inp_route, &in6p_laddr(inp),
    481  1.151     ozaki 		    &ifp, &psref, &ia6);
    482  1.152  christos 		if (error == 0)
    483  1.152  christos 			in6a = &ia6;
    484   1.69    rpaulo 		if (ifp && scope_ambiguous &&
    485   1.69    rpaulo 		    (error = in6_setscope(&sin6->sin6_addr, ifp, NULL)) != 0) {
    486  1.145     ozaki 			if_put(ifp, &psref);
    487  1.145     ozaki 			curlwp_bindx(bound);
    488  1.152  christos 			return error;
    489   1.69    rpaulo 		}
    490   1.69    rpaulo 
    491  1.152  christos 		if (in6a == NULL) {
    492  1.145     ozaki 			if_put(ifp, &psref);
    493  1.145     ozaki 			curlwp_bindx(bound);
    494    1.2    itojun 			if (error == 0)
    495    1.2    itojun 				error = EADDRNOTAVAIL;
    496  1.152  christos 			return error;
    497    1.2    itojun 		}
    498    1.2    itojun 	}
    499    1.2    itojun 
    500  1.145     ozaki 	if (ifp != NULL) {
    501  1.175     ozaki 		in6p_ip6(inp).ip6_hlim = (u_int8_t)in6pcb_selecthlim(inp, ifp);
    502  1.145     ozaki 		if_put(ifp, &psref);
    503  1.145     ozaki 	} else
    504  1.175     ozaki 		in6p_ip6(inp).ip6_hlim = (u_int8_t)in6pcb_selecthlim_rt(inp);
    505  1.145     ozaki 	curlwp_bindx(bound);
    506    1.2    itojun 
    507  1.175     ozaki 	if (in6pcb_lookup(inp->inp_table, &sin6->sin6_addr,
    508   1.56    itojun 	    sin6->sin6_port,
    509  1.173     ozaki 	    IN6_IS_ADDR_UNSPECIFIED(&in6p_laddr(inp)) ? in6a : &in6p_laddr(inp),
    510  1.172     ozaki 				  inp->inp_lport, 0, &vestige)
    511  1.113    dyoung 		|| vestige.valid)
    512  1.177     ozaki 		return EADDRINUSE;
    513  1.173     ozaki 	if (IN6_IS_ADDR_UNSPECIFIED(&in6p_laddr(inp)) ||
    514  1.173     ozaki 	    (IN6_IS_ADDR_V4MAPPED(&in6p_laddr(inp)) &&
    515  1.173     ozaki 	     in6p_laddr(inp).s6_addr32[3] == 0))
    516   1.41    itojun 	{
    517  1.172     ozaki 		if (inp->inp_lport == 0) {
    518  1.175     ozaki 			error = in6pcb_bind(inp, NULL, l);
    519   1.68       dsl 			if (error != 0)
    520   1.68       dsl 				return error;
    521   1.29    itojun 		}
    522  1.173     ozaki 		in6p_laddr(inp) = *in6a;
    523    1.2    itojun 	}
    524  1.173     ozaki 	in6p_faddr(inp) = sin6->sin6_addr;
    525  1.172     ozaki 	inp->inp_fport = sin6->sin6_port;
    526  1.116  christos 
    527  1.116  christos         /* Late bind, if needed */
    528  1.172     ozaki 	if (inp->inp_bindportonsend) {
    529  1.116  christos                struct sockaddr_in6 lsin = *((const struct sockaddr_in6 *)
    530  1.172     ozaki 		    inp->inp_socket->so_proto->pr_domain->dom_sa_any);
    531  1.173     ozaki 		lsin.sin6_addr = in6p_laddr(inp);
    532  1.116  christos 		lsin.sin6_port = 0;
    533  1.116  christos 
    534  1.175     ozaki                if ((error = in6pcb_bind_port(inp, &lsin, l)) != 0)
    535  1.116  christos                        return error;
    536  1.116  christos 	}
    537  1.116  christos 
    538  1.174     ozaki 	inpcb_set_state(inp, INP_CONNECTED);
    539  1.173     ozaki 	in6p_flowinfo(inp) &= ~IPV6_FLOWLABEL_MASK;
    540   1.57    itojun 	if (ip6_auto_flowlabel)
    541  1.173     ozaki 		in6p_flowinfo(inp) |=
    542   1.58    itojun 		    (htonl(ip6_randomflowlabel()) & IPV6_FLOWLABEL_MASK);
    543  1.123  christos #if defined(IPSEC)
    544  1.172     ozaki 	if (ipsec_enabled && inp->inp_socket->so_type == SOCK_STREAM)
    545  1.172     ozaki 		ipsec_pcbconn(inp->inp_sp);
    546   1.40    itojun #endif
    547  1.177     ozaki 	return 0;
    548    1.2    itojun }
    549    1.2    itojun 
    550    1.2    itojun void
    551  1.175     ozaki in6pcb_disconnect(struct inpcb *inp)
    552    1.2    itojun {
    553  1.173     ozaki 	memset((void *)&in6p_faddr(inp), 0, sizeof(in6p_faddr(inp)));
    554  1.172     ozaki 	inp->inp_fport = 0;
    555  1.174     ozaki 	inpcb_set_state(inp, INP_BOUND);
    556  1.173     ozaki 	in6p_flowinfo(inp) &= ~IPV6_FLOWLABEL_MASK;
    557  1.123  christos #if defined(IPSEC)
    558  1.125  christos 	if (ipsec_enabled)
    559  1.172     ozaki 		ipsec_pcbdisconn(inp->inp_sp);
    560   1.40    itojun #endif
    561  1.172     ozaki 	if (inp->inp_socket->so_state & SS_NOFDREF)
    562  1.174     ozaki 		inpcb_destroy(inp);
    563    1.2    itojun }
    564    1.2    itojun 
    565    1.2    itojun void
    566  1.175     ozaki in6pcb_fetch_sockaddr(struct inpcb *inp, struct sockaddr_in6 *sin6)
    567    1.2    itojun {
    568    1.2    itojun 
    569  1.172     ozaki 	if (inp->inp_af != AF_INET6)
    570   1.56    itojun 		return;
    571   1.56    itojun 
    572  1.173     ozaki 	sockaddr_in6_init(sin6, &in6p_laddr(inp), inp->inp_lport, 0, 0);
    573   1.69    rpaulo 	(void)sa6_recoverscope(sin6); /* XXX: should catch errors */
    574    1.2    itojun }
    575    1.2    itojun 
    576    1.2    itojun void
    577  1.175     ozaki in6pcb_fetch_peeraddr(struct inpcb *inp, struct sockaddr_in6 *sin6)
    578    1.2    itojun {
    579    1.2    itojun 
    580  1.172     ozaki 	if (inp->inp_af != AF_INET6)
    581   1.56    itojun 		return;
    582   1.56    itojun 
    583  1.173     ozaki 	sockaddr_in6_init(sin6, &in6p_faddr(inp), inp->inp_fport, 0, 0);
    584   1.69    rpaulo 	(void)sa6_recoverscope(sin6); /* XXX: should catch errors */
    585    1.2    itojun }
    586    1.2    itojun 
    587    1.2    itojun /*
    588    1.2    itojun  * Pass some notification to all connections of a protocol
    589    1.2    itojun  * associated with address dst.  The local address and/or port numbers
    590    1.2    itojun  * may be specified to limit the search.  The "usual action" will be
    591    1.2    itojun  * taken, depending on the ctlinput cmd.  The caller must filter any
    592    1.2    itojun  * cmds that are uninteresting (e.g., no error in the map).
    593    1.2    itojun  * Call the protocol specific routine (if any) to report
    594    1.2    itojun  * any errors for each matching socket.
    595    1.2    itojun  *
    596    1.6    itojun  * Must be called at splsoftnet.
    597   1.35    itojun  *
    598   1.35    itojun  * Note: src (4th arg) carries the flowlabel value on the original IPv6
    599   1.35    itojun  * header, in sin6_flowinfo member.
    600    1.2    itojun  */
    601    1.2    itojun int
    602  1.175     ozaki in6pcb_notify(struct inpcbtable *table, const struct sockaddr *dst,
    603   1.83    dyoung     u_int fport_arg, const struct sockaddr *src, u_int lport_arg, int cmd,
    604  1.172     ozaki     void *cmdarg, void (*notify)(struct inpcb *, int))
    605    1.2    itojun {
    606  1.172     ozaki 	struct inpcb *inp;
    607   1.83    dyoung 	struct sockaddr_in6 sa6_src;
    608   1.83    dyoung 	const struct sockaddr_in6 *sa6_dst;
    609  1.176     ozaki 	in_port_t fport = fport_arg, lport = lport_arg;
    610    1.2    itojun 	int errno;
    611    1.2    itojun 	int nmatch = 0;
    612   1.35    itojun 	u_int32_t flowinfo;
    613    1.2    itojun 
    614   1.59  christos 	if ((unsigned)cmd >= PRC_NCMDS || dst->sa_family != AF_INET6)
    615    1.2    itojun 		return 0;
    616   1.35    itojun 
    617   1.83    dyoung 	sa6_dst = (const struct sockaddr_in6 *)dst;
    618   1.35    itojun 	if (IN6_IS_ADDR_UNSPECIFIED(&sa6_dst->sin6_addr))
    619    1.2    itojun 		return 0;
    620    1.2    itojun 
    621    1.2    itojun 	/*
    622   1.35    itojun 	 * note that src can be NULL when we get notify by local fragmentation.
    623   1.35    itojun 	 */
    624   1.67  christos 	sa6_src = (src == NULL) ? sa6_any : *(const struct sockaddr_in6 *)src;
    625   1.35    itojun 	flowinfo = sa6_src.sin6_flowinfo;
    626   1.35    itojun 
    627   1.35    itojun 	/*
    628    1.2    itojun 	 * Redirects go to all references to the destination,
    629  1.175     ozaki 	 * and use in6pcb_rtchange to invalidate the route cache.
    630  1.175     ozaki 	 * Dead host indications: also use in6pcb_rtchange to invalidate
    631   1.20    itojun 	 * the cache, and deliver the error to all the sockets.
    632    1.2    itojun 	 * Otherwise, if we have knowledge of the local port and address,
    633    1.2    itojun 	 * deliver only to that socket.
    634    1.2    itojun 	 */
    635    1.2    itojun 	if (PRC_IS_REDIRECT(cmd) || cmd == PRC_HOSTDEAD) {
    636    1.2    itojun 		fport = 0;
    637    1.2    itojun 		lport = 0;
    638  1.100    cegger 		memset((void *)&sa6_src.sin6_addr, 0, sizeof(sa6_src.sin6_addr));
    639   1.20    itojun 
    640   1.35    itojun 		if (cmd != PRC_HOSTDEAD)
    641  1.175     ozaki 			notify = in6pcb_rtchange;
    642    1.2    itojun 	}
    643   1.20    itojun 
    644    1.2    itojun 	errno = inet6ctlerrmap[cmd];
    645  1.172     ozaki 	TAILQ_FOREACH(inp, &table->inpt_queue, inp_queue) {
    646  1.153     ozaki 		struct rtentry *rt = NULL;
    647  1.153     ozaki 
    648  1.172     ozaki 		if (inp->inp_af != AF_INET6)
    649   1.56    itojun 			continue;
    650   1.20    itojun 
    651   1.35    itojun 		/*
    652   1.35    itojun 		 * Under the following condition, notify of redirects
    653   1.35    itojun 		 * to the pcb, without making address matches against inpcb.
    654   1.35    itojun 		 * - redirect notification is arrived.
    655   1.35    itojun 		 * - the inpcb is unconnected.
    656   1.35    itojun 		 * - the inpcb is caching !RTF_HOST routing entry.
    657   1.35    itojun 		 * - the ICMPv6 notification is from the gateway cached in the
    658   1.35    itojun 		 *   inpcb.  i.e. ICMPv6 notification is from nexthop gateway
    659   1.35    itojun 		 *   the inpcb used very recently.
    660   1.35    itojun 		 *
    661   1.35    itojun 		 * This is to improve interaction between netbsd/openbsd
    662   1.35    itojun 		 * redirect handling code, and inpcb route cache code.
    663   1.35    itojun 		 * without the clause, !RTF_HOST routing entry (which carries
    664   1.35    itojun 		 * gateway used by inpcb right before the ICMPv6 redirect)
    665   1.35    itojun 		 * will be cached forever in unconnected inpcb.
    666   1.35    itojun 		 *
    667   1.35    itojun 		 * There still is a question regarding to what is TRT:
    668   1.35    itojun 		 * - On bsdi/freebsd, RTF_HOST (cloned) routing entry will be
    669   1.35    itojun 		 *   generated on packet output.  inpcb will always cache
    670   1.35    itojun 		 *   RTF_HOST routing entry so there's no need for the clause
    671   1.35    itojun 		 *   (ICMPv6 redirect will update RTF_HOST routing entry,
    672   1.35    itojun 		 *   and inpcb is caching it already).
    673   1.35    itojun 		 *   However, bsdi/freebsd are vulnerable to local DoS attacks
    674   1.35    itojun 		 *   due to the cloned routing entries.
    675   1.35    itojun 		 * - Specwise, "destination cache" is mentioned in RFC2461.
    676   1.35    itojun 		 *   Jinmei says that it implies bsdi/freebsd behavior, itojun
    677   1.35    itojun 		 *   is not really convinced.
    678   1.35    itojun 		 * - Having hiwat/lowat on # of cloned host route (redirect/
    679   1.35    itojun 		 *   pmtud) may be a good idea.  netbsd/openbsd has it.  see
    680   1.35    itojun 		 *   icmp6_mtudisc_update().
    681   1.35    itojun 		 */
    682   1.35    itojun 		if ((PRC_IS_REDIRECT(cmd) || cmd == PRC_HOSTDEAD) &&
    683  1.173     ozaki 		    IN6_IS_ADDR_UNSPECIFIED(&in6p_laddr(inp)) &&
    684  1.172     ozaki 		    (rt = rtcache_validate(&inp->inp_route)) != NULL &&
    685   1.91    dyoung 		    !(rt->rt_flags & RTF_HOST)) {
    686   1.83    dyoung 			const struct sockaddr_in6 *dst6;
    687   1.35    itojun 
    688   1.83    dyoung 			dst6 = (const struct sockaddr_in6 *)
    689  1.172     ozaki 			    rtcache_getdst(&inp->inp_route);
    690   1.86    dyoung 			if (dst6 == NULL)
    691   1.86    dyoung 				;
    692   1.86    dyoung 			else if (IN6_ARE_ADDR_EQUAL(&dst6->sin6_addr,
    693  1.153     ozaki 			    &sa6_dst->sin6_addr)) {
    694  1.172     ozaki 				rtcache_unref(rt, &inp->inp_route);
    695   1.35    itojun 				goto do_notify;
    696  1.153     ozaki 			}
    697   1.20    itojun 		}
    698  1.172     ozaki 		rtcache_unref(rt, &inp->inp_route);
    699   1.20    itojun 
    700   1.35    itojun 		/*
    701   1.70    rpaulo 		 * If the error designates a new path MTU for a destination
    702   1.70    rpaulo 		 * and the application (associated with this socket) wanted to
    703   1.70    rpaulo 		 * know the value, notify. Note that we notify for all
    704   1.70    rpaulo 		 * disconnected sockets if the corresponding application
    705   1.70    rpaulo 		 * wanted. This is because some UDP applications keep sending
    706   1.70    rpaulo 		 * sockets disconnected.
    707   1.70    rpaulo 		 * XXX: should we avoid to notify the value to TCP sockets?
    708   1.70    rpaulo 		 */
    709  1.172     ozaki 		if (cmd == PRC_MSGSIZE && (inp->inp_flags & IN6P_MTU) != 0 &&
    710  1.173     ozaki 		    (IN6_IS_ADDR_UNSPECIFIED(&in6p_faddr(inp)) ||
    711  1.173     ozaki 		     IN6_ARE_ADDR_EQUAL(&in6p_faddr(inp), &sa6_dst->sin6_addr))) {
    712  1.172     ozaki 			ip6_notify_pmtu(inp, (const struct sockaddr_in6 *)dst,
    713   1.70    rpaulo 					(u_int32_t *)cmdarg);
    714   1.70    rpaulo 		}
    715   1.70    rpaulo 
    716   1.70    rpaulo 		/*
    717   1.35    itojun 		 * Detect if we should notify the error. If no source and
    718   1.42    itojun 		 * destination ports are specified, but non-zero flowinfo and
    719   1.35    itojun 		 * local address match, notify the error. This is the case
    720   1.35    itojun 		 * when the error is delivered with an encrypted buffer
    721   1.35    itojun 		 * by ESP. Otherwise, just compare addresses and ports
    722   1.35    itojun 		 * as usual.
    723   1.35    itojun 		 */
    724   1.35    itojun 		if (lport == 0 && fport == 0 && flowinfo &&
    725  1.172     ozaki 		    inp->inp_socket != NULL &&
    726  1.173     ozaki 		    flowinfo == (in6p_flowinfo(inp) & IPV6_FLOWLABEL_MASK) &&
    727  1.173     ozaki 		    IN6_ARE_ADDR_EQUAL(&in6p_laddr(inp), &sa6_src.sin6_addr))
    728   1.35    itojun 			goto do_notify;
    729  1.173     ozaki 		else if (!IN6_ARE_ADDR_EQUAL(&in6p_faddr(inp),
    730   1.35    itojun 					     &sa6_dst->sin6_addr) ||
    731  1.172     ozaki 		    inp->inp_socket == NULL ||
    732  1.172     ozaki 		    (lport && inp->inp_lport != lport) ||
    733   1.35    itojun 		    (!IN6_IS_ADDR_UNSPECIFIED(&sa6_src.sin6_addr) &&
    734  1.173     ozaki 		     !IN6_ARE_ADDR_EQUAL(&in6p_laddr(inp),
    735   1.35    itojun 					 &sa6_src.sin6_addr)) ||
    736  1.172     ozaki 		    (fport && inp->inp_fport != fport))
    737    1.2    itojun 			continue;
    738   1.20    itojun 
    739   1.35    itojun 	  do_notify:
    740   1.35    itojun 		if (notify)
    741  1.172     ozaki 			(*notify)(inp, errno);
    742    1.2    itojun 		nmatch++;
    743    1.2    itojun 	}
    744    1.2    itojun 	return nmatch;
    745   1.16   thorpej }
    746   1.16   thorpej 
    747   1.16   thorpej void
    748  1.175     ozaki in6pcb_purgeif0(struct inpcbtable *table, struct ifnet *ifp)
    749   1.16   thorpej {
    750  1.172     ozaki 	struct inpcb *inp;
    751   1.37    itojun 	struct ip6_moptions *im6o;
    752   1.37    itojun 	struct in6_multi_mship *imm, *nimm;
    753   1.16   thorpej 
    754  1.144     ozaki 	KASSERT(ifp != NULL);
    755  1.144     ozaki 
    756  1.172     ozaki 	TAILQ_FOREACH(inp, &table->inpt_queue, inp_queue) {
    757  1.159     ozaki 		bool need_unlock = false;
    758  1.172     ozaki 		if (inp->inp_af != AF_INET6)
    759   1.56    itojun 			continue;
    760   1.56    itojun 
    761  1.172     ozaki 		/* The caller holds either one of inps' lock */
    762  1.172     ozaki 		if (!inp_locked(inp)) {
    763  1.172     ozaki 			inp_lock(inp);
    764  1.159     ozaki 			need_unlock = true;
    765  1.159     ozaki 		}
    766  1.173     ozaki 		im6o = in6p_moptions(inp);
    767   1.37    itojun 		if (im6o) {
    768   1.37    itojun 			/*
    769   1.37    itojun 			 * Unselect the outgoing interface if it is being
    770   1.37    itojun 			 * detached.
    771   1.37    itojun 			 */
    772  1.144     ozaki 			if (im6o->im6o_multicast_if_index == ifp->if_index)
    773  1.144     ozaki 				im6o->im6o_multicast_if_index = 0;
    774   1.37    itojun 
    775   1.37    itojun 			/*
    776   1.37    itojun 			 * Drop multicast group membership if we joined
    777   1.37    itojun 			 * through the interface being detached.
    778   1.37    itojun 			 * XXX controversial - is it really legal for kernel
    779   1.37    itojun 			 * to force this?
    780   1.37    itojun 			 */
    781  1.158     ozaki 			LIST_FOREACH_SAFE(imm, &im6o->im6o_memberships,
    782  1.158     ozaki 			    i6mm_chain, nimm) {
    783   1.37    itojun 				if (imm->i6mm_maddr->in6m_ifp == ifp) {
    784   1.37    itojun 					LIST_REMOVE(imm, i6mm_chain);
    785   1.45    itojun 					in6_leavegroup(imm);
    786   1.37    itojun 				}
    787   1.37    itojun 			}
    788   1.37    itojun 		}
    789  1.162     ozaki 
    790  1.172     ozaki 		in_purgeifmcast(inp->inp_moptions, ifp);
    791  1.162     ozaki 
    792  1.159     ozaki 		if (need_unlock)
    793  1.172     ozaki 			inp_unlock(inp);
    794   1.38    itojun 	}
    795   1.38    itojun }
    796   1.38    itojun 
    797   1.38    itojun void
    798  1.175     ozaki in6pcb_purgeif(struct inpcbtable *table, struct ifnet *ifp)
    799   1.38    itojun {
    800   1.91    dyoung 	struct rtentry *rt;
    801  1.172     ozaki 	struct inpcb *inp;
    802   1.38    itojun 
    803  1.172     ozaki 	TAILQ_FOREACH(inp, &table->inpt_queue, inp_queue) {
    804  1.172     ozaki 		if (inp->inp_af != AF_INET6)
    805   1.56    itojun 			continue;
    806  1.172     ozaki 		if ((rt = rtcache_validate(&inp->inp_route)) != NULL &&
    807  1.153     ozaki 		    rt->rt_ifp == ifp) {
    808  1.172     ozaki 			rtcache_unref(rt, &inp->inp_route);
    809  1.175     ozaki 			in6pcb_rtchange(inp, 0);
    810  1.153     ozaki 		} else
    811  1.172     ozaki 			rtcache_unref(rt, &inp->inp_route);
    812   1.16   thorpej 	}
    813    1.2    itojun }
    814    1.2    itojun 
    815    1.2    itojun /*
    816   1.79    dyoung  * After a routing change, flush old routing.  A new route can be
    817   1.79    dyoung  * allocated the next time output is attempted.
    818    1.2    itojun  */
    819    1.2    itojun void
    820  1.175     ozaki in6pcb_rtchange(struct inpcb *inp, int errno)
    821    1.2    itojun {
    822  1.172     ozaki 	if (inp->inp_af != AF_INET6)
    823   1.56    itojun 		return;
    824   1.56    itojun 
    825  1.172     ozaki 	rtcache_free(&inp->inp_route);
    826   1.80     joerg 	/*
    827   1.80     joerg 	 * A new route can be allocated the next time
    828   1.80     joerg 	 * output is attempted.
    829   1.80     joerg 	 */
    830    1.2    itojun }
    831    1.2    itojun 
    832  1.172     ozaki struct inpcb *
    833  1.175     ozaki in6pcb_lookup_local(struct inpcbtable *table, struct in6_addr *laddr6,
    834  1.113    dyoung 		   u_int lport_arg, int lookup_wildcard, struct vestigial_inpcb *vp)
    835    1.2    itojun {
    836   1.60    itojun 	struct inpcbhead *head;
    837  1.172     ozaki 	struct inpcb *inp, *match = NULL;
    838    1.2    itojun 	int matchwild = 3, wildcard;
    839  1.176     ozaki 	in_port_t lport = lport_arg;
    840   1.56    itojun 
    841  1.113    dyoung 	if (vp)
    842  1.113    dyoung 		vp->valid = 0;
    843  1.113    dyoung 
    844   1.60    itojun 	head = IN6PCBHASH_PORT(table, lport);
    845  1.172     ozaki 	LIST_FOREACH(inp, head, inp_lhash) {
    846  1.172     ozaki 		if (inp->inp_af != AF_INET6)
    847   1.56    itojun 			continue;
    848    1.2    itojun 
    849  1.172     ozaki 		if (inp->inp_lport != lport)
    850    1.2    itojun 			continue;
    851    1.2    itojun 		wildcard = 0;
    852  1.173     ozaki 		if (IN6_IS_ADDR_V4MAPPED(&in6p_faddr(inp))) {
    853  1.172     ozaki 			if ((inp->inp_flags & IN6P_IPV6_V6ONLY) != 0)
    854    1.2    itojun 				continue;
    855   1.11    itojun 		}
    856  1.173     ozaki 		if (!IN6_IS_ADDR_UNSPECIFIED(&in6p_faddr(inp)))
    857   1.56    itojun 			wildcard++;
    858  1.173     ozaki 		if (IN6_IS_ADDR_V4MAPPED(&in6p_laddr(inp))) {
    859  1.172     ozaki 			if ((inp->inp_flags & IN6P_IPV6_V6ONLY) != 0)
    860   1.56    itojun 				continue;
    861   1.11    itojun 			if (!IN6_IS_ADDR_V4MAPPED(laddr6))
    862   1.11    itojun 				continue;
    863   1.56    itojun 
    864   1.56    itojun 			/* duplicate of IPv4 logic */
    865   1.56    itojun 			wildcard = 0;
    866  1.173     ozaki 			if (IN6_IS_ADDR_V4MAPPED(&in6p_faddr(inp)) &&
    867  1.173     ozaki 			    in6p_faddr(inp).s6_addr32[3])
    868   1.11    itojun 				wildcard++;
    869  1.173     ozaki 			if (!in6p_laddr(inp).s6_addr32[3]) {
    870   1.56    itojun 				if (laddr6->s6_addr32[3])
    871   1.56    itojun 					wildcard++;
    872   1.56    itojun 			} else {
    873   1.56    itojun 				if (!laddr6->s6_addr32[3])
    874   1.56    itojun 					wildcard++;
    875   1.56    itojun 				else {
    876  1.173     ozaki 					if (in6p_laddr(inp).s6_addr32[3] !=
    877   1.56    itojun 					    laddr6->s6_addr32[3])
    878   1.56    itojun 						continue;
    879   1.56    itojun 				}
    880   1.56    itojun 			}
    881  1.173     ozaki 		} else if (IN6_IS_ADDR_UNSPECIFIED(&in6p_laddr(inp))) {
    882   1.11    itojun 			if (IN6_IS_ADDR_V4MAPPED(laddr6)) {
    883  1.172     ozaki 				if ((inp->inp_flags & IN6P_IPV6_V6ONLY) != 0)
    884   1.11    itojun 					continue;
    885   1.56    itojun 			}
    886   1.56    itojun 			if (!IN6_IS_ADDR_UNSPECIFIED(laddr6))
    887    1.2    itojun 				wildcard++;
    888   1.56    itojun 		} else {
    889   1.56    itojun 			if (IN6_IS_ADDR_V4MAPPED(laddr6)) {
    890  1.172     ozaki 				if ((inp->inp_flags & IN6P_IPV6_V6ONLY) != 0)
    891   1.56    itojun 					continue;
    892   1.56    itojun 			}
    893   1.56    itojun 			if (IN6_IS_ADDR_UNSPECIFIED(laddr6))
    894    1.2    itojun 				wildcard++;
    895   1.56    itojun 			else {
    896  1.173     ozaki 				if (!IN6_ARE_ADDR_EQUAL(&in6p_laddr(inp),
    897   1.56    itojun 				    laddr6))
    898   1.11    itojun 					continue;
    899   1.56    itojun 			}
    900    1.2    itojun 		}
    901   1.56    itojun 		if (wildcard && !lookup_wildcard)
    902    1.2    itojun 			continue;
    903    1.2    itojun 		if (wildcard < matchwild) {
    904  1.172     ozaki 			match = inp;
    905    1.2    itojun 			matchwild = wildcard;
    906    1.2    itojun 			if (matchwild == 0)
    907    1.2    itojun 				break;
    908    1.2    itojun 		}
    909    1.2    itojun 	}
    910  1.113    dyoung 	if (match && matchwild == 0)
    911  1.113    dyoung 		return match;
    912  1.113    dyoung 
    913  1.113    dyoung 	if (vp && table->vestige && table->vestige->init_ports6) {
    914  1.113    dyoung 		struct vestigial_inpcb better;
    915  1.171       ryo 		bool has_better = false;
    916  1.113    dyoung 		void *state;
    917  1.113    dyoung 
    918  1.113    dyoung 		state = (*table->vestige->init_ports6)(laddr6,
    919  1.113    dyoung 						       lport_arg,
    920  1.113    dyoung 						       lookup_wildcard);
    921  1.113    dyoung 		while (table->vestige
    922  1.113    dyoung 		       && (*table->vestige->next_port6)(state, vp)) {
    923  1.113    dyoung 
    924  1.113    dyoung 			if (vp->lport != lport)
    925  1.113    dyoung 				continue;
    926  1.113    dyoung 			wildcard = 0;
    927  1.113    dyoung 			if (!IN6_IS_ADDR_UNSPECIFIED(&vp->faddr.v6))
    928  1.113    dyoung 				wildcard++;
    929  1.113    dyoung 			if (IN6_IS_ADDR_UNSPECIFIED(&vp->laddr.v6)) {
    930  1.113    dyoung 				if (!IN6_IS_ADDR_UNSPECIFIED(laddr6))
    931  1.113    dyoung 					wildcard++;
    932  1.113    dyoung 			} else {
    933  1.113    dyoung 				if (IN6_IS_ADDR_V4MAPPED(laddr6)) {
    934  1.113    dyoung 					if (vp->v6only)
    935  1.113    dyoung 						continue;
    936  1.113    dyoung 				}
    937  1.113    dyoung 				if (IN6_IS_ADDR_UNSPECIFIED(laddr6))
    938  1.113    dyoung 					wildcard++;
    939  1.113    dyoung 				else {
    940  1.113    dyoung 					if (!IN6_ARE_ADDR_EQUAL(&vp->laddr.v6, laddr6))
    941  1.113    dyoung 						continue;
    942  1.113    dyoung 				}
    943  1.113    dyoung 			}
    944  1.113    dyoung 			if (wildcard && !lookup_wildcard)
    945  1.113    dyoung 				continue;
    946  1.113    dyoung 			if (wildcard < matchwild) {
    947  1.113    dyoung 				better = *vp;
    948  1.171       ryo 				has_better = true;
    949  1.113    dyoung 
    950  1.113    dyoung 				matchwild = wildcard;
    951  1.113    dyoung 				if (matchwild == 0)
    952  1.113    dyoung 					break;
    953  1.113    dyoung 			}
    954  1.113    dyoung 		}
    955  1.113    dyoung 
    956  1.171       ryo 		if (has_better) {
    957  1.171       ryo 			*vp = better;
    958  1.171       ryo 			return 0;
    959  1.113    dyoung 		}
    960  1.113    dyoung 	}
    961  1.177     ozaki 	return match;
    962    1.2    itojun }
    963    1.2    itojun 
    964   1.55    itojun /*
    965  1.172     ozaki  * WARNING: return value (rtentry) could be IPv4 one if inpcb is connected to
    966   1.55    itojun  * IPv4 mapped address.
    967   1.55    itojun  */
    968    1.2    itojun struct rtentry *
    969  1.175     ozaki in6pcb_rtentry(struct inpcb *inp)
    970    1.2    itojun {
    971   1.91    dyoung 	struct rtentry *rt;
    972   1.86    dyoung 	struct route *ro;
    973   1.90  drochner 	union {
    974   1.90  drochner 		const struct sockaddr *sa;
    975   1.90  drochner 		const struct sockaddr_in6 *sa6;
    976   1.90  drochner #ifdef INET
    977   1.90  drochner 		const struct sockaddr_in *sa4;
    978   1.90  drochner #endif
    979   1.90  drochner 	} cdst;
    980    1.2    itojun 
    981  1.172     ozaki 	ro = &inp->inp_route;
    982    1.2    itojun 
    983  1.172     ozaki 	if (inp->inp_af != AF_INET6)
    984  1.177     ozaki 		return NULL;
    985   1.56    itojun 
    986   1.90  drochner 	cdst.sa = rtcache_getdst(ro);
    987   1.90  drochner 	if (cdst.sa == NULL)
    988   1.86    dyoung 		;
    989   1.90  drochner #ifdef INET
    990   1.90  drochner 	else if (cdst.sa->sa_family == AF_INET) {
    991  1.173     ozaki 		KASSERT(IN6_IS_ADDR_V4MAPPED(&in6p_faddr(inp)));
    992  1.173     ozaki 		if (cdst.sa4->sin_addr.s_addr != in6p_faddr(inp).s6_addr32[3])
    993   1.90  drochner 			rtcache_free(ro);
    994   1.90  drochner 	}
    995   1.90  drochner #endif
    996   1.90  drochner 	else {
    997   1.90  drochner 		if (!IN6_ARE_ADDR_EQUAL(&cdst.sa6->sin6_addr,
    998  1.173     ozaki 					&in6p_faddr(inp)))
    999   1.90  drochner 			rtcache_free(ro);
   1000   1.90  drochner 	}
   1001   1.93    dyoung 	if ((rt = rtcache_validate(ro)) == NULL)
   1002   1.93    dyoung 		rt = rtcache_update(ro, 1);
   1003   1.55    itojun #ifdef INET
   1004  1.173     ozaki 	if (rt == NULL && IN6_IS_ADDR_V4MAPPED(&in6p_faddr(inp))) {
   1005   1.86    dyoung 		union {
   1006   1.86    dyoung 			struct sockaddr		dst;
   1007   1.86    dyoung 			struct sockaddr_in	dst4;
   1008   1.86    dyoung 		} u;
   1009   1.86    dyoung 		struct in_addr addr;
   1010   1.55    itojun 
   1011  1.173     ozaki 		addr.s_addr = in6p_faddr(inp).s6_addr32[3];
   1012   1.86    dyoung 
   1013   1.86    dyoung 		sockaddr_in_init(&u.dst4, &addr, 0);
   1014  1.139     ozaki 		if (rtcache_setdst(ro, &u.dst) != 0)
   1015  1.139     ozaki 			return NULL;
   1016   1.86    dyoung 
   1017   1.92    dyoung 		rt = rtcache_init(ro);
   1018   1.55    itojun 	} else
   1019   1.55    itojun #endif
   1020  1.173     ozaki 	if (rt == NULL && !IN6_IS_ADDR_UNSPECIFIED(&in6p_faddr(inp))) {
   1021   1.86    dyoung 		union {
   1022   1.86    dyoung 			struct sockaddr		dst;
   1023   1.86    dyoung 			struct sockaddr_in6	dst6;
   1024   1.86    dyoung 		} u;
   1025   1.86    dyoung 
   1026  1.173     ozaki 		sockaddr_in6_init(&u.dst6, &in6p_faddr(inp), 0, 0, 0);
   1027  1.139     ozaki 		if (rtcache_setdst(ro, &u.dst) != 0)
   1028  1.139     ozaki 			return NULL;
   1029   1.83    dyoung 
   1030   1.92    dyoung 		rt = rtcache_init(ro);
   1031    1.2    itojun 	}
   1032   1.92    dyoung 	return rt;
   1033    1.2    itojun }
   1034    1.2    itojun 
   1035  1.153     ozaki void
   1036  1.175     ozaki in6pcb_rtentry_unref(struct rtentry *rt, struct inpcb *inp)
   1037  1.153     ozaki {
   1038  1.153     ozaki 
   1039  1.172     ozaki 	rtcache_unref(rt, &inp->inp_route);
   1040  1.153     ozaki }
   1041  1.153     ozaki 
   1042  1.172     ozaki struct inpcb *
   1043  1.175     ozaki in6pcb_lookup(struct inpcbtable *table, const struct in6_addr *faddr6,
   1044  1.113    dyoung 		      u_int fport_arg, const struct in6_addr *laddr6, u_int lport_arg,
   1045  1.113    dyoung 		      int faith,
   1046  1.113    dyoung 		      struct vestigial_inpcb *vp)
   1047    1.2    itojun {
   1048   1.56    itojun 	struct inpcbhead *head;
   1049  1.172     ozaki 	struct inpcb *inp;
   1050  1.176     ozaki 	in_port_t fport = fport_arg, lport = lport_arg;
   1051    1.2    itojun 
   1052  1.114    dyoung 	if (vp)
   1053  1.114    dyoung 		vp->valid = 0;
   1054  1.114    dyoung 
   1055   1.56    itojun 	head = IN6PCBHASH_CONNECT(table, faddr6, fport, laddr6, lport);
   1056  1.172     ozaki 	LIST_FOREACH(inp, head, inp_hash) {
   1057  1.172     ozaki 		if (inp->inp_af != AF_INET6)
   1058   1.56    itojun 			continue;
   1059   1.56    itojun 
   1060    1.2    itojun 		/* find exact match on both source and dest */
   1061  1.172     ozaki 		if (inp->inp_fport != fport)
   1062    1.2    itojun 			continue;
   1063  1.172     ozaki 		if (inp->inp_lport != lport)
   1064    1.2    itojun 			continue;
   1065  1.173     ozaki 		if (IN6_IS_ADDR_UNSPECIFIED(&in6p_faddr(inp)))
   1066    1.2    itojun 			continue;
   1067  1.173     ozaki 		if (!IN6_ARE_ADDR_EQUAL(&in6p_faddr(inp), faddr6))
   1068    1.2    itojun 			continue;
   1069  1.173     ozaki 		if (IN6_IS_ADDR_UNSPECIFIED(&in6p_laddr(inp)))
   1070    1.2    itojun 			continue;
   1071  1.173     ozaki 		if (!IN6_ARE_ADDR_EQUAL(&in6p_laddr(inp), laddr6))
   1072    1.2    itojun 			continue;
   1073   1.41    itojun 		if ((IN6_IS_ADDR_V4MAPPED(laddr6) ||
   1074   1.41    itojun 		     IN6_IS_ADDR_V4MAPPED(faddr6)) &&
   1075  1.172     ozaki 		    (inp->inp_flags & IN6P_IPV6_V6ONLY))
   1076   1.41    itojun 			continue;
   1077  1.172     ozaki 		return inp;
   1078    1.2    itojun 	}
   1079  1.113    dyoung 	if (vp && table->vestige) {
   1080  1.113    dyoung 		if ((*table->vestige->lookup6)(faddr6, fport_arg,
   1081  1.113    dyoung 					       laddr6, lport_arg, vp))
   1082  1.141     ozaki 			return NULL;
   1083  1.113    dyoung 	}
   1084  1.113    dyoung 
   1085    1.2    itojun 	return NULL;
   1086    1.2    itojun }
   1087    1.2    itojun 
   1088  1.172     ozaki struct inpcb *
   1089  1.175     ozaki in6pcb_lookup_bound(struct inpcbtable *table, const struct in6_addr *laddr6,
   1090   1.87  christos 	u_int lport_arg, int faith)
   1091    1.2    itojun {
   1092   1.56    itojun 	struct inpcbhead *head;
   1093  1.172     ozaki 	struct inpcb *inp;
   1094  1.176     ozaki 	in_port_t lport = lport_arg;
   1095   1.62    atatat #ifdef INET
   1096   1.56    itojun 	struct in6_addr zero_mapped;
   1097   1.56    itojun #endif
   1098   1.56    itojun 
   1099   1.56    itojun 	head = IN6PCBHASH_BIND(table, laddr6, lport);
   1100  1.172     ozaki 	LIST_FOREACH(inp, head, inp_hash) {
   1101  1.172     ozaki 		if (inp->inp_af != AF_INET6)
   1102   1.56    itojun 			continue;
   1103    1.2    itojun 
   1104  1.172     ozaki 		if (faith && (inp->inp_flags & IN6P_FAITH) == 0)
   1105    1.8    itojun 			continue;
   1106  1.172     ozaki 		if (inp->inp_fport != 0)
   1107    1.2    itojun 			continue;
   1108  1.172     ozaki 		if (inp->inp_lport != lport)
   1109    1.2    itojun 			continue;
   1110   1.56    itojun 		if (IN6_IS_ADDR_V4MAPPED(laddr6) &&
   1111  1.172     ozaki 		    (inp->inp_flags & IN6P_IPV6_V6ONLY) != 0)
   1112   1.56    itojun 			continue;
   1113  1.173     ozaki 		if (IN6_ARE_ADDR_EQUAL(&in6p_laddr(inp), laddr6))
   1114   1.56    itojun 			goto out;
   1115   1.56    itojun 	}
   1116   1.56    itojun #ifdef INET
   1117   1.56    itojun 	if (IN6_IS_ADDR_V4MAPPED(laddr6)) {
   1118   1.56    itojun 		memset(&zero_mapped, 0, sizeof(zero_mapped));
   1119   1.56    itojun 		zero_mapped.s6_addr16[5] = 0xffff;
   1120   1.56    itojun 		head = IN6PCBHASH_BIND(table, &zero_mapped, lport);
   1121  1.172     ozaki 		LIST_FOREACH(inp, head, inp_hash) {
   1122  1.172     ozaki 			if (inp->inp_af != AF_INET6)
   1123   1.56    itojun 				continue;
   1124   1.56    itojun 
   1125  1.172     ozaki 			if (faith && (inp->inp_flags & IN6P_FAITH) == 0)
   1126   1.56    itojun 				continue;
   1127  1.172     ozaki 			if (inp->inp_fport != 0)
   1128   1.56    itojun 				continue;
   1129  1.172     ozaki 			if (inp->inp_lport != lport)
   1130   1.56    itojun 				continue;
   1131  1.172     ozaki 			if ((inp->inp_flags & IN6P_IPV6_V6ONLY) != 0)
   1132   1.56    itojun 				continue;
   1133  1.173     ozaki 			if (IN6_ARE_ADDR_EQUAL(&in6p_laddr(inp), &zero_mapped))
   1134   1.56    itojun 				goto out;
   1135   1.11    itojun 		}
   1136    1.2    itojun 	}
   1137   1.56    itojun #endif
   1138   1.56    itojun 	head = IN6PCBHASH_BIND(table, &zeroin6_addr, lport);
   1139  1.172     ozaki 	LIST_FOREACH(inp, head, inp_hash) {
   1140  1.172     ozaki 		if (inp->inp_af != AF_INET6)
   1141   1.56    itojun 			continue;
   1142   1.56    itojun 
   1143  1.172     ozaki 		if (faith && (inp->inp_flags & IN6P_FAITH) == 0)
   1144   1.56    itojun 			continue;
   1145  1.172     ozaki 		if (inp->inp_fport != 0)
   1146   1.56    itojun 			continue;
   1147  1.172     ozaki 		if (inp->inp_lport != lport)
   1148   1.56    itojun 			continue;
   1149   1.56    itojun 		if (IN6_IS_ADDR_V4MAPPED(laddr6) &&
   1150  1.172     ozaki 		    (inp->inp_flags & IN6P_IPV6_V6ONLY) != 0)
   1151   1.56    itojun 			continue;
   1152  1.173     ozaki 		if (IN6_ARE_ADDR_EQUAL(&in6p_laddr(inp), &zeroin6_addr))
   1153   1.56    itojun 			goto out;
   1154   1.56    itojun 	}
   1155  1.177     ozaki 	return NULL;
   1156   1.56    itojun 
   1157   1.56    itojun out:
   1158  1.172     ozaki 	if (inp != LIST_FIRST(head)) {
   1159  1.172     ozaki 		LIST_REMOVE(inp, inp_hash);
   1160  1.172     ozaki 		LIST_INSERT_HEAD(head, inp, inp_hash);
   1161   1.56    itojun 	}
   1162  1.172     ozaki 	return inp;
   1163   1.56    itojun }
   1164   1.56    itojun 
   1165   1.56    itojun void
   1166  1.175     ozaki in6pcb_set_state(struct inpcb *inp, int state)
   1167   1.56    itojun {
   1168   1.56    itojun 
   1169  1.172     ozaki 	if (inp->inp_af != AF_INET6)
   1170   1.56    itojun 		return;
   1171   1.56    itojun 
   1172  1.172     ozaki 	if (inp->inp_state > INP_ATTACHED)
   1173  1.172     ozaki 		LIST_REMOVE(inp, inp_hash);
   1174   1.56    itojun 
   1175   1.56    itojun 	switch (state) {
   1176  1.172     ozaki 	case INP_BOUND:
   1177  1.172     ozaki 		LIST_INSERT_HEAD(IN6PCBHASH_BIND(inp->inp_table,
   1178  1.173     ozaki 		    &in6p_laddr(inp), inp->inp_lport), inp,
   1179  1.172     ozaki 		    inp_hash);
   1180   1.56    itojun 		break;
   1181  1.172     ozaki 	case INP_CONNECTED:
   1182  1.172     ozaki 		LIST_INSERT_HEAD(IN6PCBHASH_CONNECT(inp->inp_table,
   1183  1.173     ozaki 		    &in6p_faddr(inp), inp->inp_fport,
   1184  1.173     ozaki 		    &in6p_laddr(inp), inp->inp_lport), inp,
   1185  1.172     ozaki 		    inp_hash);
   1186   1.56    itojun 		break;
   1187   1.56    itojun 	}
   1188   1.56    itojun 
   1189  1.172     ozaki 	inp->inp_state = state;
   1190    1.2    itojun }
   1191