1 /* 2 * Copyright (c) 1982, 1986, 1991, 1993, 1995 3 * The Regents of the University of California. 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. All advertising materials mentioning features or use of this software 14 * must display the following acknowledgement: 15 * This product includes software developed by the University of 16 * California, Berkeley and its contributors. 17 * 4. Neither the name of the University nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * @(#)in_pcb.c 8.4 (Berkeley) 5/24/95 34 * $FreeBSD$ 35 */ 36 37 #include "opt_ipsec.h" 38 #include "opt_inet6.h" 39 40 #include <sys/param.h> 41 #include <sys/systm.h> 42 #include <sys/malloc.h> 43 #include <sys/mbuf.h> 44 #include <sys/domain.h> 45 #include <sys/protosw.h> 46 #include <sys/socket.h> 47 #include <sys/socketvar.h> 48 #include <sys/proc.h> 49 #include <sys/jail.h> 50 #include <sys/kernel.h> 51 #include <sys/sysctl.h> 52 53 #include <machine/limits.h> 54 55 #include <vm/uma.h> 56 57 #include <net/if.h> 58 #include <net/if_types.h> 59 #include <net/route.h> 60 61 #include <netinet/in.h> 62 #include <netinet/in_pcb.h> 63 #include <netinet/in_var.h> 64 #include <netinet/ip_var.h> 65 #ifdef INET6 66 #include <netinet/ip6.h> 67 #include <netinet6/ip6_var.h> 68 #endif /* INET6 */ 69 70 #ifdef IPSEC 71 #include <netinet6/ipsec.h> 72 #include <netkey/key.h> 73 #endif /* IPSEC */ 74 75 struct in_addr zeroin_addr; 76 77 /* 78 * These configure the range of local port addresses assigned to 79 * "unspecified" outgoing connections/packets/whatever. 80 */ 81 int ipport_lowfirstauto = IPPORT_RESERVED - 1; /* 1023 */ 82 int ipport_lowlastauto = IPPORT_RESERVEDSTART; /* 600 */ 83 int ipport_firstauto = IPPORT_HIFIRSTAUTO; /* 49152 */ 84 int ipport_lastauto = IPPORT_HILASTAUTO; /* 65535 */ 85 int ipport_hifirstauto = IPPORT_HIFIRSTAUTO; /* 49152 */ 86 int ipport_hilastauto = IPPORT_HILASTAUTO; /* 65535 */ 87 88 #define RANGECHK(var, min, max) \ 89 if ((var) < (min)) { (var) = (min); } \ 90 else if ((var) > (max)) { (var) = (max); } 91 92 static int 93 sysctl_net_ipport_check(SYSCTL_HANDLER_ARGS) 94 { 95 int error = sysctl_handle_int(oidp, 96 oidp->oid_arg1, oidp->oid_arg2, req); 97 if (!error) { 98 RANGECHK(ipport_lowfirstauto, 1, IPPORT_RESERVED - 1); 99 RANGECHK(ipport_lowlastauto, 1, IPPORT_RESERVED - 1); 100 RANGECHK(ipport_firstauto, IPPORT_RESERVED, USHRT_MAX); 101 RANGECHK(ipport_lastauto, IPPORT_RESERVED, USHRT_MAX); 102 RANGECHK(ipport_hifirstauto, IPPORT_RESERVED, USHRT_MAX); 103 RANGECHK(ipport_hilastauto, IPPORT_RESERVED, USHRT_MAX); 104 } 105 return error; 106 } 107 108 #undef RANGECHK 109 110 SYSCTL_NODE(_net_inet_ip, IPPROTO_IP, portrange, CTLFLAG_RW, 0, "IP Ports"); 111 112 SYSCTL_PROC(_net_inet_ip_portrange, OID_AUTO, lowfirst, CTLTYPE_INT|CTLFLAG_RW, 113 &ipport_lowfirstauto, 0, &sysctl_net_ipport_check, "I", ""); 114 SYSCTL_PROC(_net_inet_ip_portrange, OID_AUTO, lowlast, CTLTYPE_INT|CTLFLAG_RW, 115 &ipport_lowlastauto, 0, &sysctl_net_ipport_check, "I", ""); 116 SYSCTL_PROC(_net_inet_ip_portrange, OID_AUTO, first, CTLTYPE_INT|CTLFLAG_RW, 117 &ipport_firstauto, 0, &sysctl_net_ipport_check, "I", ""); 118 SYSCTL_PROC(_net_inet_ip_portrange, OID_AUTO, last, CTLTYPE_INT|CTLFLAG_RW, 119 &ipport_lastauto, 0, &sysctl_net_ipport_check, "I", ""); 120 SYSCTL_PROC(_net_inet_ip_portrange, OID_AUTO, hifirst, CTLTYPE_INT|CTLFLAG_RW, 121 &ipport_hifirstauto, 0, &sysctl_net_ipport_check, "I", ""); 122 SYSCTL_PROC(_net_inet_ip_portrange, OID_AUTO, hilast, CTLTYPE_INT|CTLFLAG_RW, 123 &ipport_hilastauto, 0, &sysctl_net_ipport_check, "I", ""); 124 125 /* 126 * in_pcb.c: manage the Protocol Control Blocks. 127 * 128 * NOTE: It is assumed that most of these functions will be called at 129 * splnet(). XXX - There are, unfortunately, a few exceptions to this 130 * rule that should be fixed. 131 */ 132 133 /* 134 * Allocate a PCB and associate it with the socket. 135 */ 136 int 137 in_pcballoc(so, pcbinfo, td) 138 struct socket *so; 139 struct inpcbinfo *pcbinfo; 140 struct thread *td; 141 { 142 register struct inpcb *inp; 143 #ifdef IPSEC 144 int error; 145 #endif 146 147 inp = uma_zalloc(pcbinfo->ipi_zone, M_NOWAIT); 148 if (inp == NULL) 149 return (ENOBUFS); 150 bzero((caddr_t)inp, sizeof(*inp)); 151 inp->inp_gencnt = ++pcbinfo->ipi_gencnt; 152 inp->inp_pcbinfo = pcbinfo; 153 inp->inp_socket = so; 154 #ifdef IPSEC 155 error = ipsec_init_policy(so, &inp->inp_sp); 156 if (error != 0) { 157 uma_zfree(pcbinfo->ipi_zone, inp); 158 return error; 159 } 160 #endif /*IPSEC*/ 161 #if defined(INET6) 162 if (INP_SOCKAF(so) == AF_INET6 && ip6_v6only) 163 inp->inp_flags |= IN6P_IPV6_V6ONLY; 164 #endif 165 LIST_INSERT_HEAD(pcbinfo->listhead, inp, inp_list); 166 pcbinfo->ipi_count++; 167 so->so_pcb = (caddr_t)inp; 168 INP_LOCK_INIT(inp, "inp"); 169 #ifdef INET6 170 if (ip6_auto_flowlabel) 171 inp->inp_flags |= IN6P_AUTOFLOWLABEL; 172 #endif 173 return (0); 174 } 175 176 int 177 in_pcbbind(inp, nam, td) 178 register struct inpcb *inp; 179 struct sockaddr *nam; 180 struct thread *td; 181 { 182 register struct socket *so = inp->inp_socket; 183 unsigned short *lastport; 184 struct sockaddr_in *sin; 185 struct inpcbinfo *pcbinfo = inp->inp_pcbinfo; 186 u_short lport = 0; 187 int wild = 0, reuseport = (so->so_options & SO_REUSEPORT); 188 int error, prison = 0; 189 190 if (TAILQ_EMPTY(&in_ifaddrhead)) /* XXX broken! */ 191 return (EADDRNOTAVAIL); 192 if (inp->inp_lport || inp->inp_laddr.s_addr != INADDR_ANY) 193 return (EINVAL); 194 if ((so->so_options & (SO_REUSEADDR|SO_REUSEPORT)) == 0) 195 wild = 1; 196 if (nam) { 197 sin = (struct sockaddr_in *)nam; 198 if (nam->sa_len != sizeof (*sin)) 199 return (EINVAL); 200 #ifdef notdef 201 /* 202 * We should check the family, but old programs 203 * incorrectly fail to initialize it. 204 */ 205 if (sin->sin_family != AF_INET) 206 return (EAFNOSUPPORT); 207 #endif 208 if (sin->sin_addr.s_addr != INADDR_ANY) 209 if (prison_ip(td->td_ucred, 0, &sin->sin_addr.s_addr)) 210 return(EINVAL); 211 lport = sin->sin_port; 212 if (IN_MULTICAST(ntohl(sin->sin_addr.s_addr))) { 213 /* 214 * Treat SO_REUSEADDR as SO_REUSEPORT for multicast; 215 * allow complete duplication of binding if 216 * SO_REUSEPORT is set, or if SO_REUSEADDR is set 217 * and a multicast address is bound on both 218 * new and duplicated sockets. 219 */ 220 if (so->so_options & SO_REUSEADDR) 221 reuseport = SO_REUSEADDR|SO_REUSEPORT; 222 } else if (sin->sin_addr.s_addr != INADDR_ANY) { 223 sin->sin_port = 0; /* yech... */ 224 bzero(&sin->sin_zero, sizeof(sin->sin_zero)); 225 if (ifa_ifwithaddr((struct sockaddr *)sin) == 0) 226 return (EADDRNOTAVAIL); 227 } 228 if (lport) { 229 struct inpcb *t; 230 /* GROSS */ 231 if (ntohs(lport) < IPPORT_RESERVED && td && 232 suser_cred(td->td_ucred, PRISON_ROOT)) 233 return (EACCES); 234 if (td && jailed(td->td_ucred)) 235 prison = 1; 236 if (so->so_cred->cr_uid != 0 && 237 !IN_MULTICAST(ntohl(sin->sin_addr.s_addr))) { 238 t = in_pcblookup_local(inp->inp_pcbinfo, 239 sin->sin_addr, lport, 240 prison ? 0 : INPLOOKUP_WILDCARD); 241 if (t && 242 (ntohl(sin->sin_addr.s_addr) != INADDR_ANY || 243 ntohl(t->inp_laddr.s_addr) != INADDR_ANY || 244 (t->inp_socket->so_options & 245 SO_REUSEPORT) == 0) && 246 (so->so_cred->cr_uid != 247 t->inp_socket->so_cred->cr_uid)) { 248 #if defined(INET6) 249 if (ntohl(sin->sin_addr.s_addr) != 250 INADDR_ANY || 251 ntohl(t->inp_laddr.s_addr) != 252 INADDR_ANY || 253 INP_SOCKAF(so) == 254 INP_SOCKAF(t->inp_socket)) 255 #endif /* defined(INET6) */ 256 return (EADDRINUSE); 257 } 258 } 259 if (prison && 260 prison_ip(td->td_ucred, 0, &sin->sin_addr.s_addr)) 261 return (EADDRNOTAVAIL); 262 t = in_pcblookup_local(pcbinfo, sin->sin_addr, 263 lport, prison ? 0 : wild); 264 if (t && 265 (reuseport & t->inp_socket->so_options) == 0) { 266 #if defined(INET6) 267 if (ntohl(sin->sin_addr.s_addr) != 268 INADDR_ANY || 269 ntohl(t->inp_laddr.s_addr) != 270 INADDR_ANY || 271 INP_SOCKAF(so) == 272 INP_SOCKAF(t->inp_socket)) 273 #endif /* defined(INET6) */ 274 return (EADDRINUSE); 275 } 276 } 277 inp->inp_laddr = sin->sin_addr; 278 } 279 if (lport == 0) { 280 ushort first, last; 281 int count; 282 283 if (inp->inp_laddr.s_addr != INADDR_ANY) 284 if (prison_ip(td->td_ucred, 0, &inp->inp_laddr.s_addr )) { 285 inp->inp_laddr.s_addr = INADDR_ANY; 286 return (EINVAL); 287 } 288 inp->inp_flags |= INP_ANONPORT; 289 290 if (inp->inp_flags & INP_HIGHPORT) { 291 first = ipport_hifirstauto; /* sysctl */ 292 last = ipport_hilastauto; 293 lastport = &pcbinfo->lasthi; 294 } else if (inp->inp_flags & INP_LOWPORT) { 295 if (td && (error = suser_cred(td->td_ucred, PRISON_ROOT))) { 296 inp->inp_laddr.s_addr = INADDR_ANY; 297 return error; 298 } 299 first = ipport_lowfirstauto; /* 1023 */ 300 last = ipport_lowlastauto; /* 600 */ 301 lastport = &pcbinfo->lastlow; 302 } else { 303 first = ipport_firstauto; /* sysctl */ 304 last = ipport_lastauto; 305 lastport = &pcbinfo->lastport; 306 } 307 /* 308 * Simple check to ensure all ports are not used up causing 309 * a deadlock here. 310 * 311 * We split the two cases (up and down) so that the direction 312 * is not being tested on each round of the loop. 313 */ 314 if (first > last) { 315 /* 316 * counting down 317 */ 318 count = first - last; 319 320 do { 321 if (count-- < 0) { /* completely used? */ 322 inp->inp_laddr.s_addr = INADDR_ANY; 323 return (EADDRNOTAVAIL); 324 } 325 --*lastport; 326 if (*lastport > first || *lastport < last) 327 *lastport = first; 328 lport = htons(*lastport); 329 } while (in_pcblookup_local(pcbinfo, 330 inp->inp_laddr, lport, wild)); 331 } else { 332 /* 333 * counting up 334 */ 335 count = last - first; 336 337 do { 338 if (count-- < 0) { /* completely used? */ 339 /* 340 * Undo any address bind that may have 341 * occurred above. 342 */ 343 inp->inp_laddr.s_addr = INADDR_ANY; 344 return (EADDRNOTAVAIL); 345 } 346 ++*lastport; 347 if (*lastport < first || *lastport > last) 348 *lastport = first; 349 lport = htons(*lastport); 350 } while (in_pcblookup_local(pcbinfo, 351 inp->inp_laddr, lport, wild)); 352 } 353 } 354 inp->inp_lport = lport; 355 if (prison_ip(td->td_ucred, 0, &inp->inp_laddr.s_addr)) { 356 inp->inp_laddr.s_addr = INADDR_ANY; 357 inp->inp_lport = 0; 358 return (EINVAL); 359 } 360 if (in_pcbinshash(inp) != 0) { 361 inp->inp_laddr.s_addr = INADDR_ANY; 362 inp->inp_lport = 0; 363 return (EAGAIN); 364 } 365 return (0); 366 } 367 368 /* 369 * Transform old in_pcbconnect() into an inner subroutine for new 370 * in_pcbconnect(): Do some validity-checking on the remote 371 * address (in mbuf 'nam') and then determine local host address 372 * (i.e., which interface) to use to access that remote host. 373 * 374 * This preserves definition of in_pcbconnect(), while supporting a 375 * slightly different version for T/TCP. (This is more than 376 * a bit of a kludge, but cleaning up the internal interfaces would 377 * have forced minor changes in every protocol). 378 */ 379 380 int 381 in_pcbladdr(inp, nam, plocal_sin) 382 register struct inpcb *inp; 383 struct sockaddr *nam; 384 struct sockaddr_in **plocal_sin; 385 { 386 struct in_ifaddr *ia; 387 register struct sockaddr_in *sin = (struct sockaddr_in *)nam; 388 389 if (nam->sa_len != sizeof (*sin)) 390 return (EINVAL); 391 if (sin->sin_family != AF_INET) 392 return (EAFNOSUPPORT); 393 if (sin->sin_port == 0) 394 return (EADDRNOTAVAIL); 395 if (!TAILQ_EMPTY(&in_ifaddrhead)) { 396 /* 397 * If the destination address is INADDR_ANY, 398 * use the primary local address. 399 * If the supplied address is INADDR_BROADCAST, 400 * and the primary interface supports broadcast, 401 * choose the broadcast address for that interface. 402 */ 403 if (sin->sin_addr.s_addr == INADDR_ANY) 404 sin->sin_addr = IA_SIN(TAILQ_FIRST(&in_ifaddrhead))->sin_addr; 405 else if (sin->sin_addr.s_addr == (u_long)INADDR_BROADCAST && 406 (TAILQ_FIRST(&in_ifaddrhead)->ia_ifp->if_flags & IFF_BROADCAST)) 407 sin->sin_addr = satosin(&TAILQ_FIRST(&in_ifaddrhead)->ia_broadaddr)->sin_addr; 408 } 409 if (inp->inp_laddr.s_addr == INADDR_ANY) { 410 register struct route *ro; 411 412 ia = (struct in_ifaddr *)0; 413 /* 414 * If route is known or can be allocated now, 415 * our src addr is taken from the i/f, else punt. 416 * Note that we should check the address family of the cached 417 * destination, in case of sharing the cache with IPv6. 418 */ 419 ro = &inp->inp_route; 420 if (ro->ro_rt && 421 (ro->ro_dst.sa_family != AF_INET || 422 satosin(&ro->ro_dst)->sin_addr.s_addr != 423 sin->sin_addr.s_addr || 424 inp->inp_socket->so_options & SO_DONTROUTE)) { 425 RTFREE(ro->ro_rt); 426 ro->ro_rt = (struct rtentry *)0; 427 } 428 if ((inp->inp_socket->so_options & SO_DONTROUTE) == 0 && /*XXX*/ 429 (ro->ro_rt == (struct rtentry *)0 || 430 ro->ro_rt->rt_ifp == (struct ifnet *)0)) { 431 /* No route yet, so try to acquire one */ 432 bzero(&ro->ro_dst, sizeof(struct sockaddr_in)); 433 ro->ro_dst.sa_family = AF_INET; 434 ro->ro_dst.sa_len = sizeof(struct sockaddr_in); 435 ((struct sockaddr_in *) &ro->ro_dst)->sin_addr = 436 sin->sin_addr; 437 rtalloc(ro); 438 } 439 /* 440 * If we found a route, use the address 441 * corresponding to the outgoing interface 442 * unless it is the loopback (in case a route 443 * to our address on another net goes to loopback). 444 */ 445 if (ro->ro_rt && !(ro->ro_rt->rt_ifp->if_flags & IFF_LOOPBACK)) 446 ia = ifatoia(ro->ro_rt->rt_ifa); 447 if (ia == 0) { 448 u_short fport = sin->sin_port; 449 450 sin->sin_port = 0; 451 ia = ifatoia(ifa_ifwithdstaddr(sintosa(sin))); 452 if (ia == 0) 453 ia = ifatoia(ifa_ifwithnet(sintosa(sin))); 454 sin->sin_port = fport; 455 if (ia == 0) 456 ia = TAILQ_FIRST(&in_ifaddrhead); 457 if (ia == 0) 458 return (EADDRNOTAVAIL); 459 } 460 /* 461 * If the destination address is multicast and an outgoing 462 * interface has been set as a multicast option, use the 463 * address of that interface as our source address. 464 */ 465 if (IN_MULTICAST(ntohl(sin->sin_addr.s_addr)) && 466 inp->inp_moptions != NULL) { 467 struct ip_moptions *imo; 468 struct ifnet *ifp; 469 470 imo = inp->inp_moptions; 471 if (imo->imo_multicast_ifp != NULL) { 472 ifp = imo->imo_multicast_ifp; 473 TAILQ_FOREACH(ia, &in_ifaddrhead, ia_link) 474 if (ia->ia_ifp == ifp) 475 break; 476 if (ia == 0) 477 return (EADDRNOTAVAIL); 478 } 479 } 480 /* 481 * Don't do pcblookup call here; return interface in plocal_sin 482 * and exit to caller, that will do the lookup. 483 */ 484 *plocal_sin = &ia->ia_addr; 485 486 } 487 return(0); 488 } 489 490 /* 491 * Outer subroutine: 492 * Connect from a socket to a specified address. 493 * Both address and port must be specified in argument sin. 494 * If don't have a local address for this socket yet, 495 * then pick one. 496 */ 497 int 498 in_pcbconnect(inp, nam, td) 499 register struct inpcb *inp; 500 struct sockaddr *nam; 501 struct thread *td; 502 { 503 struct sockaddr_in *ifaddr; 504 struct sockaddr_in *sin = (struct sockaddr_in *)nam; 505 struct sockaddr_in sa; 506 struct ucred *cred; 507 int error; 508 509 cred = inp->inp_socket->so_cred; 510 if (inp->inp_laddr.s_addr == INADDR_ANY && jailed(cred)) { 511 bzero(&sa, sizeof (sa)); 512 sa.sin_addr.s_addr = htonl(prison_getip(cred)); 513 sa.sin_len=sizeof (sa); 514 sa.sin_family = AF_INET; 515 error = in_pcbbind(inp, (struct sockaddr *)&sa, td); 516 if (error) 517 return (error); 518 } 519 /* 520 * Call inner routine, to assign local interface address. 521 */ 522 if ((error = in_pcbladdr(inp, nam, &ifaddr)) != 0) 523 return(error); 524 525 if (in_pcblookup_hash(inp->inp_pcbinfo, sin->sin_addr, sin->sin_port, 526 inp->inp_laddr.s_addr ? inp->inp_laddr : ifaddr->sin_addr, 527 inp->inp_lport, 0, NULL) != NULL) { 528 return (EADDRINUSE); 529 } 530 if (inp->inp_laddr.s_addr == INADDR_ANY) { 531 if (inp->inp_lport == 0) { 532 error = in_pcbbind(inp, (struct sockaddr *)0, td); 533 if (error) 534 return (error); 535 } 536 inp->inp_laddr = ifaddr->sin_addr; 537 } 538 inp->inp_faddr = sin->sin_addr; 539 inp->inp_fport = sin->sin_port; 540 in_pcbrehash(inp); 541 return (0); 542 } 543 544 void 545 in_pcbdisconnect(inp) 546 struct inpcb *inp; 547 { 548 549 inp->inp_faddr.s_addr = INADDR_ANY; 550 inp->inp_fport = 0; 551 in_pcbrehash(inp); 552 if (inp->inp_socket->so_state & SS_NOFDREF) 553 in_pcbdetach(inp); 554 } 555 556 void 557 in_pcbdetach(inp) 558 struct inpcb *inp; 559 { 560 struct socket *so = inp->inp_socket; 561 struct inpcbinfo *ipi = inp->inp_pcbinfo; 562 563 #ifdef IPSEC 564 ipsec4_delete_pcbpolicy(inp); 565 #endif /*IPSEC*/ 566 inp->inp_gencnt = ++ipi->ipi_gencnt; 567 in_pcbremlists(inp); 568 so->so_pcb = 0; 569 sotryfree(so); 570 if (inp->inp_options) 571 (void)m_free(inp->inp_options); 572 if (inp->inp_route.ro_rt) 573 rtfree(inp->inp_route.ro_rt); 574 ip_freemoptions(inp->inp_moptions); 575 inp->inp_vflag = 0; 576 INP_LOCK_DESTROY(inp); 577 uma_zfree(ipi->ipi_zone, inp); 578 } 579 580 struct sockaddr * 581 in_sockaddr(port, addr_p) 582 in_port_t port; 583 struct in_addr *addr_p; 584 { 585 struct sockaddr_in *sin; 586 587 MALLOC(sin, struct sockaddr_in *, sizeof *sin, M_SONAME, 588 M_WAITOK | M_ZERO); 589 sin->sin_family = AF_INET; 590 sin->sin_len = sizeof(*sin); 591 sin->sin_addr = *addr_p; 592 sin->sin_port = port; 593 594 return (struct sockaddr *)sin; 595 } 596 597 /* 598 * The wrapper function will pass down the pcbinfo for this function to lock. 599 * The socket must have a valid 600 * (i.e., non-nil) PCB, but it should be impossible to get an invalid one 601 * except through a kernel programming error, so it is acceptable to panic 602 * (or in this case trap) if the PCB is invalid. (Actually, we don't trap 603 * because there actually /is/ a programming error somewhere... XXX) 604 */ 605 int 606 in_setsockaddr(so, nam, pcbinfo) 607 struct socket *so; 608 struct sockaddr **nam; 609 struct inpcbinfo *pcbinfo; 610 { 611 int s; 612 register struct inpcb *inp; 613 struct in_addr addr; 614 in_port_t port; 615 616 s = splnet(); 617 INP_INFO_RLOCK(pcbinfo); 618 inp = sotoinpcb(so); 619 if (!inp) { 620 INP_INFO_RUNLOCK(pcbinfo); 621 splx(s); 622 return ECONNRESET; 623 } 624 INP_LOCK(inp); 625 port = inp->inp_lport; 626 addr = inp->inp_laddr; 627 INP_UNLOCK(inp); 628 INP_INFO_RUNLOCK(pcbinfo); 629 splx(s); 630 631 *nam = in_sockaddr(port, &addr); 632 return 0; 633 } 634 635 /* 636 * The wrapper function will pass down the pcbinfo for this function to lock. 637 */ 638 int 639 in_setpeeraddr(so, nam, pcbinfo) 640 struct socket *so; 641 struct sockaddr **nam; 642 struct inpcbinfo *pcbinfo; 643 { 644 int s; 645 register struct inpcb *inp; 646 struct in_addr addr; 647 in_port_t port; 648 649 s = splnet(); 650 INP_INFO_RLOCK(pcbinfo); 651 inp = sotoinpcb(so); 652 if (!inp) { 653 INP_INFO_RUNLOCK(pcbinfo); 654 splx(s); 655 return ECONNRESET; 656 } 657 INP_LOCK(inp); 658 port = inp->inp_fport; 659 addr = inp->inp_faddr; 660 INP_UNLOCK(inp); 661 INP_INFO_RUNLOCK(pcbinfo); 662 splx(s); 663 664 *nam = in_sockaddr(port, &addr); 665 return 0; 666 } 667 668 void 669 in_pcbnotifyall(pcbinfo, faddr, errno, notify) 670 struct inpcbinfo *pcbinfo; 671 struct in_addr faddr; 672 int errno; 673 struct inpcb *(*notify)(struct inpcb *, int); 674 { 675 struct inpcb *inp, *ninp; 676 struct inpcbhead *head; 677 int s; 678 679 s = splnet(); 680 INP_INFO_RLOCK(pcbinfo); 681 head = pcbinfo->listhead; 682 for (inp = LIST_FIRST(head); inp != NULL; inp = ninp) { 683 INP_LOCK(inp); 684 ninp = LIST_NEXT(inp, inp_list); 685 #ifdef INET6 686 if ((inp->inp_vflag & INP_IPV4) == 0) { 687 INP_UNLOCK(inp); 688 continue; 689 } 690 #endif 691 if (inp->inp_faddr.s_addr != faddr.s_addr || 692 inp->inp_socket == NULL) { 693 INP_UNLOCK(inp); 694 continue; 695 } 696 (*notify)(inp, errno); 697 INP_UNLOCK(inp); 698 } 699 INP_INFO_RUNLOCK(pcbinfo); 700 splx(s); 701 } 702 703 void 704 in_pcbpurgeif0(pcbinfo, ifp) 705 struct inpcbinfo *pcbinfo; 706 struct ifnet *ifp; 707 { 708 struct inpcb *inp; 709 struct ip_moptions *imo; 710 int i, gap; 711 712 /* why no splnet here? XXX */ 713 INP_INFO_RLOCK(pcbinfo); 714 LIST_FOREACH(inp, pcbinfo->listhead, inp_list) { 715 INP_LOCK(inp); 716 imo = inp->inp_moptions; 717 if ((inp->inp_vflag & INP_IPV4) && 718 imo != NULL) { 719 /* 720 * Unselect the outgoing interface if it is being 721 * detached. 722 */ 723 if (imo->imo_multicast_ifp == ifp) 724 imo->imo_multicast_ifp = NULL; 725 726 /* 727 * Drop multicast group membership if we joined 728 * through the interface being detached. 729 */ 730 for (i = 0, gap = 0; i < imo->imo_num_memberships; 731 i++) { 732 if (imo->imo_membership[i]->inm_ifp == ifp) { 733 in_delmulti(imo->imo_membership[i]); 734 gap++; 735 } else if (gap != 0) 736 imo->imo_membership[i - gap] = 737 imo->imo_membership[i]; 738 } 739 imo->imo_num_memberships -= gap; 740 } 741 INP_UNLOCK(inp); 742 } 743 INP_INFO_RUNLOCK(pcbinfo); 744 } 745 746 /* 747 * Check for alternatives when higher level complains 748 * about service problems. For now, invalidate cached 749 * routing information. If the route was created dynamically 750 * (by a redirect), time to try a default gateway again. 751 */ 752 void 753 in_losing(inp) 754 struct inpcb *inp; 755 { 756 register struct rtentry *rt; 757 struct rt_addrinfo info; 758 759 if ((rt = inp->inp_route.ro_rt)) { 760 bzero((caddr_t)&info, sizeof(info)); 761 info.rti_flags = rt->rt_flags; 762 info.rti_info[RTAX_DST] = rt_key(rt); 763 info.rti_info[RTAX_GATEWAY] = rt->rt_gateway; 764 info.rti_info[RTAX_NETMASK] = rt_mask(rt); 765 rt_missmsg(RTM_LOSING, &info, rt->rt_flags, 0); 766 if (rt->rt_flags & RTF_DYNAMIC) 767 (void) rtrequest1(RTM_DELETE, &info, NULL); 768 inp->inp_route.ro_rt = NULL; 769 rtfree(rt); 770 /* 771 * A new route can be allocated 772 * the next time output is attempted. 773 */ 774 } 775 } 776 777 /* 778 * After a routing change, flush old routing 779 * and allocate a (hopefully) better one. 780 */ 781 struct inpcb * 782 in_rtchange(inp, errno) 783 register struct inpcb *inp; 784 int errno; 785 { 786 if (inp->inp_route.ro_rt) { 787 rtfree(inp->inp_route.ro_rt); 788 inp->inp_route.ro_rt = 0; 789 /* 790 * A new route can be allocated the next time 791 * output is attempted. 792 */ 793 } 794 return inp; 795 } 796 797 /* 798 * Lookup a PCB based on the local address and port. 799 */ 800 struct inpcb * 801 in_pcblookup_local(pcbinfo, laddr, lport_arg, wild_okay) 802 struct inpcbinfo *pcbinfo; 803 struct in_addr laddr; 804 u_int lport_arg; 805 int wild_okay; 806 { 807 register struct inpcb *inp; 808 int matchwild = 3, wildcard; 809 u_short lport = lport_arg; 810 811 if (!wild_okay) { 812 struct inpcbhead *head; 813 /* 814 * Look for an unconnected (wildcard foreign addr) PCB that 815 * matches the local address and port we're looking for. 816 */ 817 head = &pcbinfo->hashbase[INP_PCBHASH(INADDR_ANY, lport, 0, pcbinfo->hashmask)]; 818 LIST_FOREACH(inp, head, inp_hash) { 819 #ifdef INET6 820 if ((inp->inp_vflag & INP_IPV4) == 0) 821 continue; 822 #endif 823 if (inp->inp_faddr.s_addr == INADDR_ANY && 824 inp->inp_laddr.s_addr == laddr.s_addr && 825 inp->inp_lport == lport) { 826 /* 827 * Found. 828 */ 829 return (inp); 830 } 831 } 832 /* 833 * Not found. 834 */ 835 return (NULL); 836 } else { 837 struct inpcbporthead *porthash; 838 struct inpcbport *phd; 839 struct inpcb *match = NULL; 840 /* 841 * Best fit PCB lookup. 842 * 843 * First see if this local port is in use by looking on the 844 * port hash list. 845 */ 846 porthash = &pcbinfo->porthashbase[INP_PCBPORTHASH(lport, 847 pcbinfo->porthashmask)]; 848 LIST_FOREACH(phd, porthash, phd_hash) { 849 if (phd->phd_port == lport) 850 break; 851 } 852 if (phd != NULL) { 853 /* 854 * Port is in use by one or more PCBs. Look for best 855 * fit. 856 */ 857 LIST_FOREACH(inp, &phd->phd_pcblist, inp_portlist) { 858 wildcard = 0; 859 #ifdef INET6 860 if ((inp->inp_vflag & INP_IPV4) == 0) 861 continue; 862 #endif 863 if (inp->inp_faddr.s_addr != INADDR_ANY) 864 wildcard++; 865 if (inp->inp_laddr.s_addr != INADDR_ANY) { 866 if (laddr.s_addr == INADDR_ANY) 867 wildcard++; 868 else if (inp->inp_laddr.s_addr != laddr.s_addr) 869 continue; 870 } else { 871 if (laddr.s_addr != INADDR_ANY) 872 wildcard++; 873 } 874 if (wildcard < matchwild) { 875 match = inp; 876 matchwild = wildcard; 877 if (matchwild == 0) { 878 break; 879 } 880 } 881 } 882 } 883 return (match); 884 } 885 } 886 887 /* 888 * Lookup PCB in hash list. 889 */ 890 struct inpcb * 891 in_pcblookup_hash(pcbinfo, faddr, fport_arg, laddr, lport_arg, wildcard, 892 ifp) 893 struct inpcbinfo *pcbinfo; 894 struct in_addr faddr, laddr; 895 u_int fport_arg, lport_arg; 896 int wildcard; 897 struct ifnet *ifp; 898 { 899 struct inpcbhead *head; 900 register struct inpcb *inp; 901 u_short fport = fport_arg, lport = lport_arg; 902 903 /* 904 * First look for an exact match. 905 */ 906 head = &pcbinfo->hashbase[INP_PCBHASH(faddr.s_addr, lport, fport, pcbinfo->hashmask)]; 907 LIST_FOREACH(inp, head, inp_hash) { 908 #ifdef INET6 909 if ((inp->inp_vflag & INP_IPV4) == 0) 910 continue; 911 #endif 912 if (inp->inp_faddr.s_addr == faddr.s_addr && 913 inp->inp_laddr.s_addr == laddr.s_addr && 914 inp->inp_fport == fport && 915 inp->inp_lport == lport) { 916 /* 917 * Found. 918 */ 919 return (inp); 920 } 921 } 922 if (wildcard) { 923 struct inpcb *local_wild = NULL; 924 #if defined(INET6) 925 struct inpcb *local_wild_mapped = NULL; 926 #endif /* defined(INET6) */ 927 928 head = &pcbinfo->hashbase[INP_PCBHASH(INADDR_ANY, lport, 0, pcbinfo->hashmask)]; 929 LIST_FOREACH(inp, head, inp_hash) { 930 #ifdef INET6 931 if ((inp->inp_vflag & INP_IPV4) == 0) 932 continue; 933 #endif 934 if (inp->inp_faddr.s_addr == INADDR_ANY && 935 inp->inp_lport == lport) { 936 if (ifp && ifp->if_type == IFT_FAITH && 937 (inp->inp_flags & INP_FAITH) == 0) 938 continue; 939 if (inp->inp_laddr.s_addr == laddr.s_addr) 940 return (inp); 941 else if (inp->inp_laddr.s_addr == INADDR_ANY) { 942 #if defined(INET6) 943 if (INP_CHECK_SOCKAF(inp->inp_socket, 944 AF_INET6)) 945 local_wild_mapped = inp; 946 else 947 #endif /* defined(INET6) */ 948 local_wild = inp; 949 } 950 } 951 } 952 #if defined(INET6) 953 if (local_wild == NULL) 954 return (local_wild_mapped); 955 #endif /* defined(INET6) */ 956 return (local_wild); 957 } 958 959 /* 960 * Not found. 961 */ 962 return (NULL); 963 } 964 965 /* 966 * Insert PCB onto various hash lists. 967 */ 968 int 969 in_pcbinshash(inp) 970 struct inpcb *inp; 971 { 972 struct inpcbhead *pcbhash; 973 struct inpcbporthead *pcbporthash; 974 struct inpcbinfo *pcbinfo = inp->inp_pcbinfo; 975 struct inpcbport *phd; 976 u_int32_t hashkey_faddr; 977 978 #ifdef INET6 979 if (inp->inp_vflag & INP_IPV6) 980 hashkey_faddr = inp->in6p_faddr.s6_addr32[3] /* XXX */; 981 else 982 #endif /* INET6 */ 983 hashkey_faddr = inp->inp_faddr.s_addr; 984 985 pcbhash = &pcbinfo->hashbase[INP_PCBHASH(hashkey_faddr, 986 inp->inp_lport, inp->inp_fport, pcbinfo->hashmask)]; 987 988 pcbporthash = &pcbinfo->porthashbase[INP_PCBPORTHASH(inp->inp_lport, 989 pcbinfo->porthashmask)]; 990 991 /* 992 * Go through port list and look for a head for this lport. 993 */ 994 LIST_FOREACH(phd, pcbporthash, phd_hash) { 995 if (phd->phd_port == inp->inp_lport) 996 break; 997 } 998 /* 999 * If none exists, malloc one and tack it on. 1000 */ 1001 if (phd == NULL) { 1002 MALLOC(phd, struct inpcbport *, sizeof(struct inpcbport), M_PCB, M_NOWAIT); 1003 if (phd == NULL) { 1004 return (ENOBUFS); /* XXX */ 1005 } 1006 phd->phd_port = inp->inp_lport; 1007 LIST_INIT(&phd->phd_pcblist); 1008 LIST_INSERT_HEAD(pcbporthash, phd, phd_hash); 1009 } 1010 inp->inp_phd = phd; 1011 LIST_INSERT_HEAD(&phd->phd_pcblist, inp, inp_portlist); 1012 LIST_INSERT_HEAD(pcbhash, inp, inp_hash); 1013 return (0); 1014 } 1015 1016 /* 1017 * Move PCB to the proper hash bucket when { faddr, fport } have been 1018 * changed. NOTE: This does not handle the case of the lport changing (the 1019 * hashed port list would have to be updated as well), so the lport must 1020 * not change after in_pcbinshash() has been called. 1021 */ 1022 void 1023 in_pcbrehash(inp) 1024 struct inpcb *inp; 1025 { 1026 struct inpcbhead *head; 1027 u_int32_t hashkey_faddr; 1028 1029 #ifdef INET6 1030 if (inp->inp_vflag & INP_IPV6) 1031 hashkey_faddr = inp->in6p_faddr.s6_addr32[3] /* XXX */; 1032 else 1033 #endif /* INET6 */ 1034 hashkey_faddr = inp->inp_faddr.s_addr; 1035 1036 head = &inp->inp_pcbinfo->hashbase[INP_PCBHASH(hashkey_faddr, 1037 inp->inp_lport, inp->inp_fport, inp->inp_pcbinfo->hashmask)]; 1038 1039 LIST_REMOVE(inp, inp_hash); 1040 LIST_INSERT_HEAD(head, inp, inp_hash); 1041 } 1042 1043 /* 1044 * Remove PCB from various lists. 1045 */ 1046 void 1047 in_pcbremlists(inp) 1048 struct inpcb *inp; 1049 { 1050 inp->inp_gencnt = ++inp->inp_pcbinfo->ipi_gencnt; 1051 if (inp->inp_lport) { 1052 struct inpcbport *phd = inp->inp_phd; 1053 1054 LIST_REMOVE(inp, inp_hash); 1055 LIST_REMOVE(inp, inp_portlist); 1056 if (LIST_FIRST(&phd->phd_pcblist) == NULL) { 1057 LIST_REMOVE(phd, phd_hash); 1058 free(phd, M_PCB); 1059 } 1060 } 1061 LIST_REMOVE(inp, inp_list); 1062 inp->inp_pcbinfo->ipi_count--; 1063 } 1064 1065 int 1066 prison_xinpcb(struct thread *td, struct inpcb *inp) 1067 { 1068 if (!jailed(td->td_ucred)) 1069 return (0); 1070 if (ntohl(inp->inp_laddr.s_addr) == prison_getip(td->td_ucred)) 1071 return (0); 1072 return (1); 1073 } 1074