Lines Matching +full:fsin +full:- +full:enable
1 /*-
2 * SPDX-License-Identifier: BSD-3-Clause
6 * Copyright (c) 2007-2009 Robert N. M. Watson
7 * Copyright (c) 2010-2011 Juniper Networks, Inc.
8 * Copyright (c) 2021-2022 Gleb Smirnoff <glebius@FreeBSD.org>
120 VNET_DEFINE(int, ipport_lowfirstauto) = IPPORT_RESERVED - 1; /* 1023 */
132 VNET_DEFINE(int, ipport_reservedhigh) = IPPORT_RESERVED - 1; /* 1023 */
135 /* Enable random ephemeral port allocation by default. */
155 RANGECHK(V_ipport_lowfirstauto, 1, IPPORT_RESERVED - 1); in sysctl_net_ipport_check()
156 RANGECHK(V_ipport_lowlastauto, 1, IPPORT_RESERVED - 1); in sysctl_net_ipport_check()
202 &VNET_NAME(ipport_randomized), 0, "Enable random port allocation");
266 LIST_INIT(&grp->il_pending); in in_pcblbgroup_alloc()
267 grp->il_cred = crhold(cred); in in_pcblbgroup_alloc()
268 grp->il_vflag = vflag; in in_pcblbgroup_alloc()
269 grp->il_lport = port; in in_pcblbgroup_alloc()
270 grp->il_numa_domain = numa_domain; in in_pcblbgroup_alloc()
271 grp->il_fibnum = fib; in in_pcblbgroup_alloc()
272 grp->il_dependladdr = *addr; in in_pcblbgroup_alloc()
273 grp->il_inpsiz = size; in in_pcblbgroup_alloc()
283 crfree(grp->il_cred); in in_pcblbgroup_free_deferred()
290 KASSERT(LIST_EMPTY(&grp->il_pending), in in_pcblbgroup_free()
294 NET_EPOCH_CALL(in_pcblbgroup_free_deferred, &grp->il_epoch_ctx); in in_pcblbgroup_free()
306 pcbinfo = inp->inp_pcbinfo; in in_pcblbgroup_find()
309 hdr = &pcbinfo->ipi_lbgrouphashbase[ in in_pcblbgroup_find()
310 INP_PCBPORTHASH(inp->inp_lport, pcbinfo->ipi_lbgrouphashmask)]; in in_pcblbgroup_find()
314 for (unsigned int i = 0; i < grp->il_inpcnt; i++) { in in_pcblbgroup_find()
315 if (inp == grp->il_inp[i]) in in_pcblbgroup_find()
318 LIST_FOREACH(inp1, &grp->il_pending, inp_lbgroup_list) { in in_pcblbgroup_find()
330 KASSERT(grp->il_inpcnt < grp->il_inpsiz, in in_pcblbgroup_insert()
331 ("invalid local group size %d and count %d", grp->il_inpsiz, in in_pcblbgroup_insert()
332 grp->il_inpcnt)); in in_pcblbgroup_insert()
335 if (inp->inp_socket->so_proto->pr_listen != pr_listen_notsupp && in in_pcblbgroup_insert()
336 !SOLISTENING(inp->inp_socket)) { in in_pcblbgroup_insert()
341 LIST_INSERT_HEAD(&grp->il_pending, inp, inp_lbgroup_list); in in_pcblbgroup_insert()
342 grp->il_pendcnt++; in in_pcblbgroup_insert()
344 grp->il_inp[grp->il_inpcnt] = inp; in in_pcblbgroup_insert()
350 atomic_store_rel_int(&grp->il_inpcnt, grp->il_inpcnt + 1); in in_pcblbgroup_insert()
353 inp->inp_flags |= INP_INLBGROUP; in in_pcblbgroup_insert()
363 grp = in_pcblbgroup_alloc(old_grp->il_cred, old_grp->il_vflag, in in_pcblbgroup_resize()
364 old_grp->il_lport, &old_grp->il_dependladdr, size, in in_pcblbgroup_resize()
365 old_grp->il_numa_domain, old_grp->il_fibnum); in in_pcblbgroup_resize()
369 KASSERT(old_grp->il_inpcnt < grp->il_inpsiz, in in_pcblbgroup_resize()
371 grp->il_inpsiz, old_grp->il_inpcnt)); in in_pcblbgroup_resize()
373 for (i = 0; i < old_grp->il_inpcnt; ++i) in in_pcblbgroup_resize()
374 grp->il_inp[i] = old_grp->il_inp[i]; in in_pcblbgroup_resize()
375 grp->il_inpcnt = old_grp->il_inpcnt; in in_pcblbgroup_resize()
377 LIST_SWAP(&old_grp->il_pending, &grp->il_pending, inpcb, in in_pcblbgroup_resize()
379 grp->il_pendcnt = old_grp->il_pendcnt; in in_pcblbgroup_resize()
380 old_grp->il_pendcnt = 0; in in_pcblbgroup_resize()
399 pcbinfo = inp->inp_pcbinfo; in in_pcbinslbgrouphash()
404 fib = (inp->inp_flags & INP_BOUNDFIB) != 0 ? in in_pcbinslbgrouphash()
405 inp->inp_inc.inc_fibnum : RT_ALL_FIBS; in in_pcbinslbgrouphash()
411 if ((inp->inp_vflag & INP_IPV4) && in in_pcbinslbgrouphash()
412 inp->inp_laddr.s_addr == INADDR_ANY && in in_pcbinslbgrouphash()
413 INP_CHECK_SOCKAF(inp->inp_socket, AF_INET6)) { in in_pcbinslbgrouphash()
418 idx = INP_PCBPORTHASH(inp->inp_lport, pcbinfo->ipi_lbgrouphashmask); in in_pcbinslbgrouphash()
419 hdr = &pcbinfo->ipi_lbgrouphashbase[idx]; in in_pcbinslbgrouphash()
421 if (grp->il_cred->cr_prison == inp->inp_cred->cr_prison && in in_pcbinslbgrouphash()
422 grp->il_vflag == inp->inp_vflag && in in_pcbinslbgrouphash()
423 grp->il_lport == inp->inp_lport && in in_pcbinslbgrouphash()
424 grp->il_numa_domain == numa_domain && in in_pcbinslbgrouphash()
425 grp->il_fibnum == fib && in in_pcbinslbgrouphash()
426 memcmp(&grp->il_dependladdr, in in_pcbinslbgrouphash()
427 &inp->inp_inc.inc_ie.ie_dependladdr, in in_pcbinslbgrouphash()
428 sizeof(grp->il_dependladdr)) == 0) { in in_pcbinslbgrouphash()
434 grp = in_pcblbgroup_alloc(inp->inp_cred, inp->inp_vflag, in in_pcbinslbgrouphash()
435 inp->inp_lport, &inp->inp_inc.inc_ie.ie_dependladdr, in in_pcbinslbgrouphash()
441 } else if (grp->il_inpcnt + grp->il_pendcnt == grp->il_inpsiz) { in in_pcbinslbgrouphash()
442 if (grp->il_inpsiz >= INPCBLBGROUP_SIZMAX) { in in_pcbinslbgrouphash()
445 ntohs(grp->il_lport)); in in_pcbinslbgrouphash()
450 grp = in_pcblbgroup_resize(hdr, grp, grp->il_inpsiz * 2); in in_pcbinslbgrouphash()
472 pcbinfo = inp->inp_pcbinfo; in in_pcbremlbgrouphash()
475 MPASS(inp->inp_flags & INP_INLBGROUP); in in_pcbremlbgrouphash()
478 hdr = &pcbinfo->ipi_lbgrouphashbase[ in in_pcbremlbgrouphash()
479 INP_PCBPORTHASH(inp->inp_lport, pcbinfo->ipi_lbgrouphashmask)]; in in_pcbremlbgrouphash()
481 for (i = 0; i < grp->il_inpcnt; ++i) { in in_pcbremlbgrouphash()
482 if (grp->il_inp[i] != inp) in in_pcbremlbgrouphash()
485 if (grp->il_inpcnt == 1 && in in_pcbremlbgrouphash()
486 LIST_EMPTY(&grp->il_pending)) { in in_pcbremlbgrouphash()
490 grp->il_inp[i] = in in_pcbremlbgrouphash()
491 grp->il_inp[grp->il_inpcnt - 1]; in in_pcbremlbgrouphash()
496 atomic_store_rel_int(&grp->il_inpcnt, in in_pcbremlbgrouphash()
497 grp->il_inpcnt - 1); in in_pcbremlbgrouphash()
499 inp->inp_flags &= ~INP_INLBGROUP; in in_pcbremlbgrouphash()
502 LIST_FOREACH(inp1, &grp->il_pending, inp_lbgroup_list) { in in_pcbremlbgrouphash()
505 grp->il_pendcnt--; in in_pcbremlbgrouphash()
506 inp->inp_flags &= ~INP_INLBGROUP; in in_pcbremlbgrouphash()
534 pcbinfo = inp->inp_pcbinfo; in in_pcblbgroup_numa()
554 * Initialize an inpcbinfo - a per-VNET instance of connections db.
561 mtx_init(&pcbinfo->ipi_lock, pcbstor->ips_infolock_name, NULL, MTX_DEF); in in_pcbinfo_init()
562 mtx_init(&pcbinfo->ipi_hash_lock, pcbstor->ips_hashlock_name, in in_pcbinfo_init()
565 pcbinfo->ipi_vnet = curvnet; in in_pcbinfo_init()
567 CK_LIST_INIT(&pcbinfo->ipi_listhead); in in_pcbinfo_init()
568 pcbinfo->ipi_count = 0; in in_pcbinfo_init()
569 pcbinfo->ipi_hash_exact = hashinit(hash_nelements, M_PCB, in in_pcbinfo_init()
570 &pcbinfo->ipi_hashmask); in in_pcbinfo_init()
571 pcbinfo->ipi_hash_wild = hashinit(hash_nelements, M_PCB, in in_pcbinfo_init()
572 &pcbinfo->ipi_hashmask); in in_pcbinfo_init()
574 pcbinfo->ipi_porthashbase = hashinit(porthash_nelements, M_PCB, in in_pcbinfo_init()
575 &pcbinfo->ipi_porthashmask); in in_pcbinfo_init()
576 pcbinfo->ipi_lbgrouphashbase = hashinit(porthash_nelements, M_PCB, in in_pcbinfo_init()
577 &pcbinfo->ipi_lbgrouphashmask); in in_pcbinfo_init()
578 pcbinfo->ipi_zone = pcbstor->ips_zone; in in_pcbinfo_init()
579 pcbinfo->ipi_portzone = pcbstor->ips_portzone; in in_pcbinfo_init()
580 pcbinfo->ipi_smr = uma_zone_get_smr(pcbinfo->ipi_zone); in in_pcbinfo_init()
590 KASSERT(pcbinfo->ipi_count == 0, in in_pcbinfo_destroy()
591 ("%s: ipi_count = %u", __func__, pcbinfo->ipi_count)); in in_pcbinfo_destroy()
593 hashdestroy(pcbinfo->ipi_hash_exact, M_PCB, pcbinfo->ipi_hashmask); in in_pcbinfo_destroy()
594 hashdestroy(pcbinfo->ipi_hash_wild, M_PCB, pcbinfo->ipi_hashmask); in in_pcbinfo_destroy()
595 hashdestroy(pcbinfo->ipi_porthashbase, M_PCB, in in_pcbinfo_destroy()
596 pcbinfo->ipi_porthashmask); in in_pcbinfo_destroy()
597 hashdestroy(pcbinfo->ipi_lbgrouphashbase, M_PCB, in in_pcbinfo_destroy()
598 pcbinfo->ipi_lbgrouphashmask); in in_pcbinfo_destroy()
599 mtx_destroy(&pcbinfo->ipi_hash_lock); in in_pcbinfo_destroy()
600 mtx_destroy(&pcbinfo->ipi_lock); in in_pcbinfo_destroy()
604 * Initialize a pcbstorage - per protocol zones to allocate inpcbs.
612 pcbstor->ips_zone = uma_zcreate(pcbstor->ips_zone_name, in in_pcbstorage_init()
613 pcbstor->ips_size, NULL, NULL, pcbstor->ips_pcbinit, in in_pcbstorage_init()
615 pcbstor->ips_portzone = uma_zcreate(pcbstor->ips_portzone_name, in in_pcbstorage_init()
617 uma_zone_set_smr(pcbstor->ips_portzone, in in_pcbstorage_init()
618 uma_zone_get_smr(pcbstor->ips_zone)); in in_pcbstorage_init()
622 * Destroy a pcbstorage - used by unloadable protocols.
629 uma_zdestroy(pcbstor->ips_zone); in in_pcbstorage_destroy()
630 uma_zdestroy(pcbstor->ips_portzone); in in_pcbstorage_destroy()
645 inp = uma_zalloc_smr(pcbinfo->ipi_zone, M_NOWAIT); in in_pcballoc()
648 bzero(&inp->inp_start_zero, inp_zero_size); in in_pcballoc()
650 inp->inp_numa_domain = M_NODOM; in in_pcballoc()
652 inp->inp_pcbinfo = pcbinfo; in in_pcballoc()
653 inp->inp_socket = so; in in_pcballoc()
654 inp->inp_cred = crhold(so->so_cred); in in_pcballoc()
655 inp->inp_inc.inc_fibnum = so->so_fibnum; in in_pcballoc()
673 inp->inp_vflag |= INP_IPV6PROTO | INP_IPV6; in in_pcballoc()
675 inp->inp_flags |= IN6P_IPV6_V6ONLY; in in_pcballoc()
678 inp->inp_vflag |= INP_IPV4; in in_pcballoc()
681 inp->inp_flags |= IN6P_AUTOFLOWLABEL; in in_pcballoc()
682 inp->in6p_hops = -1; /* use kernel default */ in in_pcballoc()
689 inp->inp_vflag |= INP_IPV4; in in_pcballoc()
691 inp->inp_smr = SMR_SEQ_INVALID; in in_pcballoc()
697 inp->inp_route.ro_flags = RT_LLE_CACHE; in in_pcballoc()
698 refcount_init(&inp->inp_refcount, 1); /* Reference from socket. */ in in_pcballoc()
701 pcbinfo->ipi_count++; in in_pcballoc()
702 inp->inp_gencnt = ++pcbinfo->ipi_gencnt; in in_pcballoc()
703 CK_LIST_INSERT_HEAD(&pcbinfo->ipi_listhead, inp, inp_list); in in_pcballoc()
705 so->so_pcb = inp; in in_pcballoc()
711 crfree(inp->inp_cred); in in_pcballoc()
713 inp->inp_cred = NULL; in in_pcballoc()
715 uma_zfree_smr(pcbinfo->ipi_zone, inp); in in_pcballoc()
727 KASSERT(sin == NULL || sin->sin_family == AF_INET, in in_pcbbind()
729 KASSERT(sin == NULL || sin->sin_len == sizeof(struct sockaddr_in), in in_pcbbind()
732 INP_HASH_WLOCK_ASSERT(inp->inp_pcbinfo); in in_pcbbind()
734 if (inp->inp_lport != 0 || inp->inp_laddr.s_addr != INADDR_ANY) in in_pcbbind()
736 anonport = sin == NULL || sin->sin_port == 0; in in_pcbbind()
737 error = in_pcbbind_setup(inp, sin, &inp->inp_laddr.s_addr, in in_pcbbind()
738 &inp->inp_lport, flags, cred); in in_pcbbind()
742 inp->inp_laddr.s_addr = INADDR_ANY; in in_pcbbind()
743 inp->inp_lport = 0; in in_pcbbind()
744 inp->inp_flags &= ~INP_BOUNDFIB; in in_pcbbind()
748 inp->inp_flags |= INP_ANONPORT; in in_pcbbind()
756 * and a foreign address and port. If fsa is non-NULL, choose a local port
777 pcbinfo = inp->inp_pcbinfo; in in_pcb_lport_dest()
786 if (inp->inp_flags & INP_HIGHPORT) { in in_pcb_lport_dest()
789 lastport = &pcbinfo->ipi_lasthi; in in_pcb_lport_dest()
790 } else if (inp->inp_flags & INP_LOWPORT) { in in_pcb_lport_dest()
796 lastport = &pcbinfo->ipi_lastlow; in in_pcb_lport_dest()
800 lastport = &pcbinfo->ipi_lastport; in in_pcb_lport_dest()
816 if ((inp->inp_vflag & (INP_IPV4|INP_IPV6)) == INP_IPV4) { in in_pcb_lport_dest()
818 laddr = ((struct sockaddr_in *)lsa)->sin_addr; in in_pcb_lport_dest()
820 faddr = ((struct sockaddr_in *)fsa)->sin_addr; in in_pcb_lport_dest()
825 if ((inp->inp_vflag & INP_IPV6) != 0) { in in_pcb_lport_dest()
827 laddr6 = &((struct sockaddr_in6 *)lsa)->sin6_addr; in in_pcb_lport_dest()
829 faddr6 = &((struct sockaddr_in6 *)fsa)->sin6_addr; in in_pcb_lport_dest()
837 *lastport = first + (arc4random() % (last - first)); in in_pcb_lport_dest()
839 count = last - first; in in_pcb_lport_dest()
842 if (count-- < 0) /* completely used? */ in in_pcb_lport_dest()
851 if (lsa->sa_family == AF_INET) { in in_pcb_lport_dest()
858 if (lsa->sa_family == AF_INET6) { in in_pcb_lport_dest()
866 if ((inp->inp_vflag & INP_IPV6) != 0) { in in_pcb_lport_dest()
868 &inp->in6p_laddr, lport, RT_ALL_FIBS, in in_pcb_lport_dest()
872 (inp->inp_vflag & INP_IPV4)) in in_pcb_lport_dest()
925 INP_HASH_LOCK_ASSERT(inp->inp_pcbinfo); in in_pcbbind_avail()
959 if ((inp->inp_flags & INP_BINDANY) == 0 && in in_pcbbind_avail()
973 priv_check_cred(inp->inp_cred, PRIV_NETINET_REUSEPORT) != 0) { in in_pcbbind_avail()
981 * which has a unique 4-tuple. in in_pcbbind_avail()
983 t = in_pcblookup_local(inp->inp_pcbinfo, laddr, lport, in in_pcbbind_avail()
986 (inp->inp_socket->so_type != SOCK_STREAM || in in_pcbbind_avail()
987 in_nullhost(t->inp_faddr)) && in in_pcbbind_avail()
988 (inp->inp_cred->cr_uid != t->inp_cred->cr_uid)) in in_pcbbind_avail()
991 t = in_pcblookup_local(inp->inp_pcbinfo, laddr, lport, fib, in in_pcbbind_avail()
994 t->inp_socket->so_options) == 0) { in in_pcbbind_avail()
997 !in_nullhost(t->inp_laddr) || in in_pcbbind_avail()
998 (inp->inp_vflag & INP_IPV6PROTO) == 0 || in in_pcbbind_avail()
999 (t->inp_vflag & INP_IPV6PROTO) == 0) in in_pcbbind_avail()
1012 * port and address to authorise the sending of a once-off packet.
1020 struct socket *so = inp->inp_socket; in in_pcbbind_setup()
1029 INP_HASH_LOCK_ASSERT(inp->inp_pcbinfo); in in_pcbbind_setup()
1036 sooptions = atomic_load_int(&so->so_options); in in_pcbbind_setup()
1043 KASSERT(sin->sin_family == AF_INET, in in_pcbbind_setup()
1045 KASSERT(sin->sin_len == sizeof(*sin), in in_pcbbind_setup()
1048 error = prison_local_ip4(cred, &sin->sin_addr); in in_pcbbind_setup()
1051 if (sin->sin_port != *lportp) { in in_pcbbind_setup()
1055 lport = sin->sin_port; in in_pcbbind_setup()
1057 laddr = sin->sin_addr; in in_pcbbind_setup()
1059 fib = (flags & INPBIND_FIB) != 0 ? inp->inp_inc.inc_fibnum : in in_pcbbind_setup()
1078 inp->inp_flags |= INP_BOUNDFIB; in in_pcbbind_setup()
1096 INP_HASH_WLOCK_ASSERT(inp->inp_pcbinfo); in in_pcbconnect()
1097 KASSERT(in_nullhost(inp->inp_faddr), in in_pcbconnect()
1100 lport = inp->inp_lport; in in_pcbconnect()
1101 laddr = inp->inp_laddr.s_addr; in in_pcbconnect()
1108 inp->inp_faddr.s_addr = faddr; in in_pcbconnect()
1109 inp->inp_fport = fport; in in_pcbconnect()
1112 if (inp->inp_laddr.s_addr == INADDR_ANY && inp->inp_lport == 0) { in in_pcbconnect()
1113 inp->inp_lport = lport; in in_pcbconnect()
1114 inp->inp_laddr.s_addr = laddr; in in_pcbconnect()
1116 inp->inp_laddr.s_addr = inp->inp_faddr.s_addr = in in_pcbconnect()
1118 inp->inp_lport = inp->inp_fport = 0; in in_pcbconnect()
1122 inp->inp_lport = lport; in in_pcbconnect()
1123 inp->inp_laddr.s_addr = laddr; in in_pcbconnect()
1124 if ((inp->inp_flags & INP_INHASHLIST) != 0) in in_pcbconnect()
1133 hash_val = fib4_calc_software_hash(inp->inp_laddr, in in_pcbconnect()
1134 inp->inp_faddr, 0, fport, in in_pcbconnect()
1135 inp->inp_socket->so_proto->pr_protocol, &hash_type); in in_pcbconnect()
1137 inp->inp_flowid = hash_val; in in_pcbconnect()
1138 inp->inp_flowtype = hash_type; in in_pcbconnect()
1142 inp->inp_flags |= INP_ANONPORT; in in_pcbconnect()
1175 sin->sin_family = AF_INET; in in_pcbladdr()
1176 sin->sin_len = sizeof(struct sockaddr_in); in in_pcbladdr()
1177 sin->sin_addr.s_addr = faddr->s_addr; in in_pcbladdr()
1185 if ((inp->inp_socket->so_options & SO_DONTROUTE) == 0) in in_pcbladdr()
1186 nh = fib4_lookup(inp->inp_inc.inc_fibnum, *faddr, in in_pcbladdr()
1197 if (nh == NULL || nh->nh_ifp == NULL) { in in_pcbladdr()
1202 inp->inp_socket->so_fibnum)); in in_pcbladdr()
1205 inp->inp_socket->so_fibnum)); in in_pcbladdr()
1213 laddr->s_addr = ia->ia_addr.sin_addr.s_addr; in in_pcbladdr()
1217 ifp = ia->ia_ifp; in in_pcbladdr()
1219 CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { in in_pcbladdr()
1220 sa = ifa->ifa_addr; in in_pcbladdr()
1221 if (sa->sa_family != AF_INET) in in_pcbladdr()
1224 if (prison_check_ip4(cred, &sin->sin_addr) == 0) { in in_pcbladdr()
1230 laddr->s_addr = ia->ia_addr.sin_addr.s_addr; in in_pcbladdr()
1248 if ((nh->nh_ifp->if_flags & IFF_LOOPBACK) == 0) { in in_pcbladdr()
1254 ia = (struct in_ifaddr *)nh->nh_ifa; in in_pcbladdr()
1255 laddr->s_addr = ia->ia_addr.sin_addr.s_addr; in in_pcbladdr()
1261 sin = (struct sockaddr_in *)nh->nh_ifa->ifa_addr; in in_pcbladdr()
1262 if (prison_check_ip4(cred, &sin->sin_addr) == 0) { in in_pcbladdr()
1263 ia = (struct in_ifaddr *)nh->nh_ifa; in in_pcbladdr()
1264 laddr->s_addr = ia->ia_addr.sin_addr.s_addr; in in_pcbladdr()
1273 ifp = nh->nh_ifp; in in_pcbladdr()
1274 CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { in in_pcbladdr()
1275 sa = ifa->ifa_addr; in in_pcbladdr()
1276 if (sa->sa_family != AF_INET) in in_pcbladdr()
1279 if (prison_check_ip4(cred, &sin->sin_addr) == 0) { in in_pcbladdr()
1285 laddr->s_addr = ia->ia_addr.sin_addr.s_addr; in in_pcbladdr()
1303 if ((nh->nh_ifp->if_flags & IFF_LOOPBACK) != 0) { in in_pcbladdr()
1307 inp->inp_socket->so_fibnum)); in in_pcbladdr()
1310 inp->inp_socket->so_fibnum)); in in_pcbladdr()
1319 laddr->s_addr = ia->ia_addr.sin_addr.s_addr; in in_pcbladdr()
1327 ifp = ia->ia_ifp; in in_pcbladdr()
1329 CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { in in_pcbladdr()
1330 sa = ifa->ifa_addr; in in_pcbladdr()
1331 if (sa->sa_family != AF_INET) in in_pcbladdr()
1335 &sin->sin_addr) == 0) { in in_pcbladdr()
1341 laddr->s_addr = ia->ia_addr.sin_addr.s_addr; in in_pcbladdr()
1352 if (error == 0 && laddr->s_addr == INADDR_ANY) in in_pcbladdr()
1377 KASSERT(sin->sin_family == AF_INET, in in_pcbconnect_setup()
1379 KASSERT(sin->sin_len == sizeof(*sin), in in_pcbconnect_setup()
1388 INP_HASH_LOCK_ASSERT(inp->inp_pcbinfo); in in_pcbconnect_setup()
1390 if (sin->sin_port == 0) in in_pcbconnect_setup()
1394 faddr = sin->sin_addr; in in_pcbconnect_setup()
1395 fport = sin->sin_port; in in_pcbconnect_setup()
1406 IA_SIN(CK_STAILQ_FIRST(&V_in_ifaddrhead))->sin_addr; in in_pcbconnect_setup()
1410 if (CK_STAILQ_FIRST(&V_in_ifaddrhead)->ia_ifp->if_flags & in in_pcbconnect_setup()
1413 &V_in_ifaddrhead)->ia_broadaddr)->sin_addr; in in_pcbconnect_setup()
1426 inp->inp_moptions != NULL) { in in_pcbconnect_setup()
1430 imo = inp->inp_moptions; in in_pcbconnect_setup()
1431 if (imo->imo_multicast_ifp != NULL) { in in_pcbconnect_setup()
1432 ifp = imo->imo_multicast_ifp; in in_pcbconnect_setup()
1434 if (ia->ia_ifp == ifp && in in_pcbconnect_setup()
1436 &ia->ia_addr.sin_addr) == 0) in in_pcbconnect_setup()
1442 laddr = ia->ia_addr.sin_addr; in in_pcbconnect_setup()
1452 if (in_pcblookup_hash_locked(inp->inp_pcbinfo, faddr, in in_pcbconnect_setup()
1456 struct sockaddr_in lsin, fsin; in in_pcbconnect_setup() local
1459 bzero(&fsin, sizeof(fsin)); in in_pcbconnect_setup()
1462 fsin.sin_family = AF_INET; in in_pcbconnect_setup()
1463 fsin.sin_addr = faddr; in in_pcbconnect_setup()
1465 &lport, (struct sockaddr *)& fsin, fport, cred, in in_pcbconnect_setup()
1482 INP_HASH_WLOCK_ASSERT(inp->inp_pcbinfo); in in_pcbdisconnect()
1483 KASSERT(inp->inp_smr == SMR_SEQ_INVALID, in in_pcbdisconnect()
1489 inp->inp_smr = smr_advance(inp->inp_pcbinfo->ipi_smr); in in_pcbdisconnect()
1490 inp->inp_laddr.s_addr = INADDR_ANY; in in_pcbdisconnect()
1491 inp->inp_faddr.s_addr = INADDR_ANY; in in_pcbdisconnect()
1492 inp->inp_fport = 0; in in_pcbdisconnect()
1503 if ((inp->inp_flags & INP_INLBGROUP) != 0) { in in_pcblisten()
1506 pcbinfo = inp->inp_pcbinfo; in in_pcblisten()
1510 grp->il_pendcnt--; in in_pcblisten()
1529 rw_rlock(&inp->inp_lock) : rw_wlock(&inp->inp_lock); in inp_lock()
1537 rw_runlock(&inp->inp_lock) : rw_wunlock(&inp->inp_lock); in inp_unlock()
1545 rw_try_rlock(&inp->inp_lock) : rw_try_wlock(&inp->inp_lock)); in inp_trylock()
1553 SMR_ASSERT_ENTERED(inp->inp_pcbinfo->ipi_smr); in _inp_smr_lock()
1556 if (__predict_false(inp->inp_flags & ignflags)) { in _inp_smr_lock()
1557 smr_exit(inp->inp_pcbinfo->ipi_smr); in _inp_smr_lock()
1561 smr_exit(inp->inp_pcbinfo->ipi_smr); in _inp_smr_lock()
1565 if (__predict_true(refcount_acquire_if_not_zero(&inp->inp_refcount))) { in _inp_smr_lock()
1566 smr_exit(inp->inp_pcbinfo->ipi_smr); in _inp_smr_lock()
1576 if (__predict_false(inp->inp_flags & ignflags)) { in _inp_smr_lock()
1582 smr_exit(inp->inp_pcbinfo->ipi_smr); in _inp_smr_lock()
1600 * inp_next() - inpcb hash/list traversal iterator
1605 * - Iterator can have either write-lock or read-lock semantics, that can not
1607 * - Iterator can iterate either over all pcbs list (INP_ALL_LIST), or through
1609 * - Iterator may have optional bool matching function. The matching function
1622 * - New entries won't be seen, as they are always added to the head of a list.
1623 * - Removed entries won't stop traversal as long as they are not added to
1628 CK_LIST_FIRST(&(ipi)->ipi_listhead) : \
1629 CK_LIST_FIRST(&(ipi)->ipi_hash_exact[(hash)]))
1635 rw_assert(&(inp)->inp_lock, \
1640 const struct inpcbinfo *ipi = ii->ipi; in inp_next()
1641 inp_match_t *match = ii->match; in inp_next()
1642 void *ctx = ii->ctx; in inp_next()
1643 inp_lookup_t lock = ii->lock; in inp_next()
1644 int hash = ii->hash; in inp_next()
1647 if (ii->inp == NULL) { /* First call. */ in inp_next()
1648 smr_enter(ipi->ipi_smr); in inp_next()
1658 smr_enter(ipi->ipi_smr); in inp_next()
1667 smr_exit(ipi->ipi_smr); in inp_next()
1669 ii->inp = inp; in inp_next()
1675 smr_enter(ipi->ipi_smr); in inp_next()
1677 inp = ii->inp; in inp_next()
1682 smr_exit(ipi->ipi_smr); in inp_next()
1690 if (__predict_false(inp->inp_flags & INP_FREED)) { in inp_next()
1701 smr_exit(ipi->ipi_smr); in inp_next()
1709 * anchoring point is ii->inp, which we keep locked for this case, so in inp_next()
1712 if (__predict_true(refcount_acquire_if_not_zero(&inp->inp_refcount))) { in inp_next()
1713 smr_exit(ipi->ipi_smr); in inp_next()
1716 smr_enter(ipi->ipi_smr); in inp_next()
1722 if (__predict_false(inp->inp_flags & INP_FREED)) { in inp_next()
1724 smr_enter(ipi->ipi_smr); in inp_next()
1731 inp_unlock(ii->inp, lock); in inp_next()
1732 ii->inp = inp; in inp_next()
1734 return (ii->inp); in inp_next()
1749 old = refcount_acquire(&inp->inp_refcount); in in_pcbref()
1763 if (!refcount_release(&inp->inp_refcount)) in in_pcbrele_rlocked()
1766 MPASS(inp->inp_flags & INP_FREED); in in_pcbrele_rlocked()
1767 MPASS(inp->inp_socket == NULL); in in_pcbrele_rlocked()
1768 crfree(inp->inp_cred); in in_pcbrele_rlocked()
1770 inp->inp_cred = NULL; in in_pcbrele_rlocked()
1773 uma_zfree_smr(inp->inp_pcbinfo->ipi_zone, inp); in in_pcbrele_rlocked()
1783 if (!refcount_release(&inp->inp_refcount)) in in_pcbrele_wlocked()
1786 MPASS(inp->inp_flags & INP_FREED); in in_pcbrele_wlocked()
1787 MPASS(inp->inp_socket == NULL); in in_pcbrele_wlocked()
1788 crfree(inp->inp_cred); in in_pcbrele_wlocked()
1790 inp->inp_cred = NULL; in in_pcbrele_wlocked()
1793 uma_zfree_smr(inp->inp_pcbinfo->ipi_zone, inp); in in_pcbrele_wlocked()
1817 struct inpcbinfo *pcbinfo = inp->inp_pcbinfo; in in_pcbfree()
1826 KASSERT(inp->inp_socket != NULL, ("%s: inp_socket == NULL", __func__)); in in_pcbfree()
1827 KASSERT((inp->inp_flags & INP_FREED) == 0, in in_pcbfree()
1835 if (inp->inp_flags & INP_INHASHLIST) in in_pcbfree()
1838 inp->inp_gencnt = ++pcbinfo->ipi_gencnt; in in_pcbfree()
1839 pcbinfo->ipi_count--; in in_pcbfree()
1844 if (inp->inp_snd_tag != NULL) in in_pcbfree()
1847 inp->inp_flags |= INP_FREED; in in_pcbfree()
1848 inp->inp_socket->so_pcb = NULL; in in_pcbfree()
1849 inp->inp_socket = NULL; in in_pcbfree()
1851 RO_INVALIDATE_CACHE(&inp->inp_route); in in_pcbfree()
1856 if (inp->inp_sp != NULL) in in_pcbfree()
1860 if (inp->inp_options) in in_pcbfree()
1861 (void)m_free(inp->inp_options); in in_pcbfree()
1862 DEBUG_POISON_POINTER(inp->inp_options); in in_pcbfree()
1863 imo = inp->inp_moptions; in in_pcbfree()
1864 DEBUG_POISON_POINTER(inp->inp_moptions); in in_pcbfree()
1867 if (inp->inp_vflag & INP_IPV6PROTO) { in in_pcbfree()
1868 ip6_freepcbopts(inp->in6p_outputopts); in in_pcbfree()
1869 DEBUG_POISON_POINTER(inp->in6p_outputopts); in in_pcbfree()
1870 im6o = inp->in6p_moptions; in in_pcbfree()
1871 DEBUG_POISON_POINTER(inp->in6p_moptions); in in_pcbfree()
1888 * Different protocols initialize their inpcbs differently - giving
1905 * closed. This might occur as a result of a shutdown()-initiated TCP close
1919 inp->inp_flags |= INP_DROPPED; in in_pcbdrop()
1920 if (inp->inp_flags & INP_INHASHLIST) in in_pcbdrop()
1939 .sin_port = inp->inp_lport, in in_getsockaddr()
1940 .sin_addr = inp->inp_laddr, in in_getsockaddr()
1957 .sin_port = inp->inp_fport, in in_getpeeraddr()
1958 .sin_addr = inp->inp_faddr, in in_getpeeraddr()
1968 if ((inp->inp_vflag & INP_IPV4) && inp->inp_moptions != NULL) in inp_v4_multi_match()
1989 imo = inp->inp_moptions; in in_pcbpurgeif0()
1994 if (imo->imo_multicast_ifp == ifp) in in_pcbpurgeif0()
1995 imo->imo_multicast_ifp = NULL; in in_pcbpurgeif0()
2004 IP_MFILTER_FOREACH(imf, &imo->imo_head) { in in_pcbpurgeif0()
2005 if ((inm = imf->imf_inm) == NULL) in in_pcbpurgeif0()
2007 if (inm->inm_ifp != ifp) in in_pcbpurgeif0()
2009 ip_mfilter_remove(&imo->imo_head, imf); in in_pcbpurgeif0()
2047 head = &pcbinfo->ipi_hash_wild[INP_PCBHASH_WILD(lport, in in_pcblookup_local()
2048 pcbinfo->ipi_hashmask)]; in in_pcblookup_local()
2052 if ((inp->inp_vflag & INP_IPV4) == 0) in in_pcblookup_local()
2055 if (inp->inp_faddr.s_addr == INADDR_ANY && in in_pcblookup_local()
2056 inp->inp_laddr.s_addr == laddr.s_addr && in in_pcblookup_local()
2057 inp->inp_lport == lport && (fib == RT_ALL_FIBS || in in_pcblookup_local()
2058 inp->inp_inc.inc_fibnum == fib)) { in in_pcblookup_local()
2062 if (prison_equal_ip4(cred->cr_prison, in in_pcblookup_local()
2063 inp->inp_cred->cr_prison)) in in_pcblookup_local()
2081 porthash = &pcbinfo->ipi_porthashbase[INP_PCBPORTHASH(lport, in in_pcblookup_local()
2082 pcbinfo->ipi_porthashmask)]; in in_pcblookup_local()
2084 if (phd->phd_port == lport) in in_pcblookup_local()
2092 CK_LIST_FOREACH(inp, &phd->phd_pcblist, inp_portlist) { in in_pcblookup_local()
2094 if (!prison_equal_ip4(inp->inp_cred->cr_prison, in in_pcblookup_local()
2095 cred->cr_prison)) in in_pcblookup_local()
2098 inp->inp_inc.inc_fibnum != fib) in in_pcblookup_local()
2102 if ((inp->inp_vflag & INP_IPV4) == 0) in in_pcblookup_local()
2117 if ((inp->inp_vflag & INP_IPV6) != 0) in in_pcblookup_local()
2120 if (inp->inp_faddr.s_addr != INADDR_ANY) in in_pcblookup_local()
2122 if (inp->inp_laddr.s_addr != INADDR_ANY) { in in_pcblookup_local()
2125 else if (inp->inp_laddr.s_addr != laddr.s_addr) in in_pcblookup_local()
2147 return ((domain == M_NODOM || domain == grp->il_numa_domain) && in in_pcblookup_lb_match()
2148 (fib == RT_ALL_FIBS || fib == grp->il_fibnum)); in in_pcblookup_lb_match()
2165 hdr = &pcbinfo->ipi_lbgrouphashbase[ in in_pcblookup_lbgroup()
2166 INP_PCBPORTHASH(lport, pcbinfo->ipi_lbgrouphashmask)]; in in_pcblookup_lbgroup()
2170 * - prefer jailed groups to non-jailed groups in in_pcblookup_lbgroup()
2171 * - prefer exact source address matches to wildcard matches in in_pcblookup_lbgroup()
2172 * - prefer groups bound to the specified NUMA domain in in_pcblookup_lbgroup()
2179 if (!(grp->il_vflag & INP_IPV4)) in in_pcblookup_lbgroup()
2182 if (grp->il_lport != lport) in in_pcblookup_lbgroup()
2185 injail = prison_flag(grp->il_cred, PR_IP4) != 0; in in_pcblookup_lbgroup()
2186 if (injail && prison_check_ip4_locked(grp->il_cred->cr_prison, in in_pcblookup_lbgroup()
2190 if (grp->il_laddr.s_addr == laddr->s_addr) { in in_pcblookup_lbgroup()
2200 } else if (grp->il_laddr.s_addr == INADDR_ANY) { in in_pcblookup_lbgroup()
2227 count = atomic_load_acq_int(&grp->il_inpcnt); in in_pcblookup_lbgroup()
2230 inp = grp->il_inp[INP_PCBLBGROUP_PKTHASH(faddr, lport, fport) % count]; in in_pcblookup_lbgroup()
2241 if ((inp->inp_vflag & INP_IPV4) == 0) in in_pcblookup_exact_match()
2244 if (inp->inp_faddr.s_addr == faddr.s_addr && in in_pcblookup_exact_match()
2245 inp->inp_laddr.s_addr == laddr.s_addr && in in_pcblookup_exact_match()
2246 inp->inp_fport == fport && in in_pcblookup_exact_match()
2247 inp->inp_lport == lport) in in_pcblookup_exact_match()
2261 head = &pcbinfo->ipi_hash_exact[INP_PCBHASH(&faddr, lport, fport, in in_pcblookup_hash_exact()
2262 pcbinfo->ipi_hashmask)]; in in_pcblookup_hash_exact()
2282 if ((inp->inp_vflag & INP_IPV4) == 0) in in_pcblookup_wild_match()
2285 if (inp->inp_faddr.s_addr != INADDR_ANY || inp->inp_lport != lport) in in_pcblookup_wild_match()
2287 if (fib != RT_ALL_FIBS && inp->inp_inc.inc_fibnum != fib) in in_pcblookup_wild_match()
2289 if (inp->inp_laddr.s_addr == INADDR_ANY) in in_pcblookup_wild_match()
2291 if (inp->inp_laddr.s_addr == laddr.s_addr) in in_pcblookup_wild_match()
2296 #define INP_LOOKUP_AGAIN ((struct inpcb *)(uintptr_t)-1)
2305 KASSERT(SMR_ENTERED(pcbinfo->ipi_smr), in in_pcblookup_hash_wild_smr()
2308 head = &pcbinfo->ipi_hash_wild[INP_PCBHASH_WILD(lport, in in_pcblookup_hash_wild_smr()
2309 pcbinfo->ipi_hashmask)]; in in_pcblookup_hash_wild_smr()
2320 prison_check_ip4_locked(inp->inp_cred->cr_prison, in in_pcblookup_hash_wild_smr()
2348 * Order of socket selection - we always prefer jails. in in_pcblookup_hash_wild_locked()
2349 * 1. jailed, non-wild. in in_pcblookup_hash_wild_locked()
2351 * 3. non-jailed, non-wild. in in_pcblookup_hash_wild_locked()
2352 * 4. non-jailed, wild. in in_pcblookup_hash_wild_locked()
2354 head = &pcbinfo->ipi_hash_wild[INP_PCBHASH_WILD(lport, in in_pcblookup_hash_wild_locked()
2355 pcbinfo->ipi_hashmask)]; in in_pcblookup_hash_wild_locked()
2368 injail = prison_flag(inp->inp_cred, PR_IP4) != 0; in in_pcblookup_hash_wild_locked()
2370 if (prison_check_ip4_locked(inp->inp_cred->cr_prison, in in_pcblookup_hash_wild_locked()
2385 if (inp->inp_vflag & INP_IPV6PROTO) in in_pcblookup_hash_wild_locked()
2465 /* XXX-MJ or retry until we get a negative match? */ in in_pcblookup_hash()
2487 smr_enter(pcbinfo->ipi_smr); in in_pcblookup_hash_smr()
2492 * Revalidate the 4-tuple, the socket could have been in in_pcblookup_hash_smr()
2531 smr_exit(pcbinfo->ipi_smr); in in_pcblookup_hash_smr()
2537 * Public inpcb lookup routines, accepting a 4-tuple, and optionally, an mbuf
2538 * from which a pre-calculated hash value may be extracted.
2562 lookupflags, m->m_pkthdr.numa_domain, fib)); in in_pcblookup_mbuf()
2569 return (prison_flag(inp->inp_cred, flag) != 0); in in_pcbjailed()
2574 * in_pcblookup_hash_wild_*() always encounter the highest-ranking PCB first.
2576 * Specifically, keep jailed PCBs in front of non-jailed PCBs, and keep PCBs
2577 * with exact local addresses ahead of wildcard PCBs. Unbound v4-mapped v6 PCBs
2587 INP_HASH_WLOCK_ASSERT(inp->inp_pcbinfo); in _in_pcbinshash_wild()
2590 bound = inp->inp_laddr.s_addr != INADDR_ANY; in _in_pcbinshash_wild()
2591 if (!bound && (inp->inp_vflag & INP_IPV6PROTO) != 0) { in _in_pcbinshash_wild()
2619 if (last->inp_laddr.s_addr == INADDR_ANY) in _in_pcbinshash_wild()
2644 INP_HASH_WLOCK_ASSERT(inp->inp_pcbinfo); in _in6_pcbinshash_wild()
2647 bound = !IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_laddr); in _in6_pcbinshash_wild()
2665 if (IN6_IS_ADDR_UNSPECIFIED(&last->in6p_laddr)) in _in6_pcbinshash_wild()
2688 struct inpcbinfo *pcbinfo = inp->inp_pcbinfo; in in_pcbinshash()
2695 KASSERT((inp->inp_flags & INP_INHASHLIST) == 0, in in_pcbinshash()
2699 if (inp->inp_vflag & INP_IPV6) { in in_pcbinshash()
2700 hash = INP6_PCBHASH(&inp->in6p_faddr, inp->inp_lport, in in_pcbinshash()
2701 inp->inp_fport, pcbinfo->ipi_hashmask); in in_pcbinshash()
2702 connected = !IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_faddr); in in_pcbinshash()
2706 hash = INP_PCBHASH(&inp->inp_faddr, inp->inp_lport, in in_pcbinshash()
2707 inp->inp_fport, pcbinfo->ipi_hashmask); in in_pcbinshash()
2708 connected = !in_nullhost(inp->inp_faddr); in in_pcbinshash()
2712 pcbhash = &pcbinfo->ipi_hash_exact[hash]; in in_pcbinshash()
2714 pcbhash = &pcbinfo->ipi_hash_wild[hash]; in in_pcbinshash()
2716 pcbporthash = &pcbinfo->ipi_porthashbase[ in in_pcbinshash()
2717 INP_PCBPORTHASH(inp->inp_lport, pcbinfo->ipi_porthashmask)]; in in_pcbinshash()
2723 if ((inp->inp_socket->so_options & SO_REUSEPORT_LB) != 0) { in in_pcbinshash()
2733 if (phd->phd_port == inp->inp_lport) in in_pcbinshash()
2741 phd = uma_zalloc_smr(pcbinfo->ipi_portzone, M_NOWAIT); in in_pcbinshash()
2743 if ((inp->inp_flags & INP_INLBGROUP) != 0) in in_pcbinshash()
2747 phd->phd_port = inp->inp_lport; in in_pcbinshash()
2748 CK_LIST_INIT(&phd->phd_pcblist); in in_pcbinshash()
2751 inp->inp_phd = phd; in in_pcbinshash()
2752 CK_LIST_INSERT_HEAD(&phd->phd_pcblist, inp, inp_portlist); in in_pcbinshash()
2759 if (inp->inp_smr != SMR_SEQ_INVALID) { in in_pcbinshash()
2760 smr_wait(pcbinfo->ipi_smr, inp->inp_smr); in in_pcbinshash()
2761 inp->inp_smr = SMR_SEQ_INVALID; in in_pcbinshash()
2768 if ((inp->inp_vflag & INP_IPV6) != 0) in in_pcbinshash()
2774 inp->inp_flags |= INP_INHASHLIST; in in_pcbinshash()
2782 struct inpcbport *phd = inp->inp_phd; in in_pcbremhash_locked()
2785 INP_HASH_WLOCK_ASSERT(inp->inp_pcbinfo); in in_pcbremhash_locked()
2786 MPASS(inp->inp_flags & INP_INHASHLIST); in in_pcbremhash_locked()
2788 if ((inp->inp_flags & INP_INLBGROUP) != 0) in in_pcbremhash_locked()
2791 if (inp->inp_vflag & INP_IPV6) { in in_pcbremhash_locked()
2792 if (IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_faddr)) in in_pcbremhash_locked()
2799 if (in_nullhost(inp->inp_faddr)) in in_pcbremhash_locked()
2805 if (CK_LIST_FIRST(&phd->phd_pcblist) == NULL) { in in_pcbremhash_locked()
2807 uma_zfree_smr(inp->inp_pcbinfo->ipi_portzone, phd); in in_pcbremhash_locked()
2809 inp->inp_flags &= ~INP_INHASHLIST; in in_pcbremhash_locked()
2815 INP_HASH_WLOCK(inp->inp_pcbinfo); in in_pcbremhash()
2817 INP_HASH_WUNLOCK(inp->inp_pcbinfo); in in_pcbremhash()
2829 struct inpcbinfo *pcbinfo = inp->inp_pcbinfo; in in_pcbrehash()
2836 KASSERT(inp->inp_flags & INP_INHASHLIST, in in_pcbrehash()
2838 KASSERT(inp->inp_smr == SMR_SEQ_INVALID, in in_pcbrehash()
2842 if (inp->inp_vflag & INP_IPV6) { in in_pcbrehash()
2843 hash = INP6_PCBHASH(&inp->in6p_faddr, inp->inp_lport, in in_pcbrehash()
2844 inp->inp_fport, pcbinfo->ipi_hashmask); in in_pcbrehash()
2845 connected = !IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_faddr); in in_pcbrehash()
2849 hash = INP_PCBHASH(&inp->inp_faddr, inp->inp_lport, in in_pcbrehash()
2850 inp->inp_fport, pcbinfo->ipi_hashmask); in in_pcbrehash()
2851 connected = !in_nullhost(inp->inp_faddr); in in_pcbrehash()
2864 head = &pcbinfo->ipi_hash_exact[hash]; in in_pcbrehash()
2867 head = &pcbinfo->ipi_hash_wild[hash]; in in_pcbrehash()
2882 RO_INVALIDATE_CACHE(&inp->inp_route); in in_losing()
2897 KASSERT(inp != NULL, ("in_pcbsosetlabel: so->so_pcb == NULL")); in in_pcbsosetlabel()
2968 return (inp->inp_socket); in inp_inpcbtosocket()
2977 *laddr = inp->inp_laddr.s_addr; in inp_4tuple_get()
2978 *faddr = inp->inp_faddr.s_addr; in inp_4tuple_get()
2979 *lp = inp->inp_lport; in inp_4tuple_get()
2980 *fp = inp->inp_fport; in inp_4tuple_get()
2984 * Create an external-format (``xinpcb'') structure using the information in
2985 * the kernel-format in_pcb structure pointed to by inp. This is done to
2988 * information-hiding if we decide that some of this information should be
2996 xi->xi_len = sizeof(struct xinpcb); in in_pcbtoxinpcb()
2997 if (inp->inp_socket) in in_pcbtoxinpcb()
2998 sotoxsocket(inp->inp_socket, &xi->xi_socket); in in_pcbtoxinpcb()
2999 bcopy(&inp->inp_inc, &xi->inp_inc, sizeof(struct in_conninfo)); in in_pcbtoxinpcb()
3000 xi->inp_gencnt = inp->inp_gencnt; in in_pcbtoxinpcb()
3001 xi->inp_flow = inp->inp_flow; in in_pcbtoxinpcb()
3002 xi->inp_flowid = inp->inp_flowid; in in_pcbtoxinpcb()
3003 xi->inp_flowtype = inp->inp_flowtype; in in_pcbtoxinpcb()
3004 xi->inp_flags = inp->inp_flags; in in_pcbtoxinpcb()
3005 xi->inp_flags2 = inp->inp_flags2; in in_pcbtoxinpcb()
3006 xi->in6p_cksum = inp->in6p_cksum; in in_pcbtoxinpcb()
3007 xi->in6p_hops = inp->in6p_hops; in in_pcbtoxinpcb()
3008 xi->inp_ip_tos = inp->inp_ip_tos; in in_pcbtoxinpcb()
3009 xi->inp_vflag = inp->inp_vflag; in in_pcbtoxinpcb()
3010 xi->inp_ip_ttl = inp->inp_ip_ttl; in in_pcbtoxinpcb()
3011 xi->inp_ip_p = inp->inp_ip_p; in in_pcbtoxinpcb()
3012 xi->inp_ip_minttl = inp->inp_ip_minttl; in in_pcbtoxinpcb()
3028 if (req->oldptr != NULL || req->oldlen != 0) in sysctl_setsockopt()
3030 if (req->newptr == NULL) in sysctl_setsockopt()
3032 if (req->newlen > sizeof(buf)) in sysctl_setsockopt()
3034 error = SYSCTL_IN(req, buf, req->newlen); in sysctl_setsockopt()
3037 if (req->newlen < sizeof(struct sockopt_parameters)) in sysctl_setsockopt()
3040 sopt.sopt_level = params->sop_level; in sysctl_setsockopt()
3041 sopt.sopt_name = params->sop_optname; in sysctl_setsockopt()
3043 sopt.sopt_val = params->sop_optval; in sysctl_setsockopt()
3044 sopt.sopt_valsize = req->newlen - sizeof(struct sockopt_parameters); in sysctl_setsockopt()
3047 if (params->sop_inc.inc_flags & INC_ISIPV6) { in sysctl_setsockopt()
3048 if (IN6_IS_SCOPE_LINKLOCAL(¶ms->sop_inc.inc6_laddr)) in sysctl_setsockopt()
3049 params->sop_inc.inc6_laddr.s6_addr16[1] = in sysctl_setsockopt()
3050 htons(params->sop_inc.inc6_zoneid & 0xffff); in sysctl_setsockopt()
3051 if (IN6_IS_SCOPE_LINKLOCAL(¶ms->sop_inc.inc6_faddr)) in sysctl_setsockopt()
3052 params->sop_inc.inc6_faddr.s6_addr16[1] = in sysctl_setsockopt()
3053 htons(params->sop_inc.inc6_zoneid & 0xffff); in sysctl_setsockopt()
3056 if (params->sop_inc.inc_lport != htons(0) && in sysctl_setsockopt()
3057 params->sop_inc.inc_fport != htons(0)) { in sysctl_setsockopt()
3059 if (params->sop_inc.inc_flags & INC_ISIPV6) in sysctl_setsockopt()
3061 ¶ms->sop_inc.inc6_faddr, in sysctl_setsockopt()
3062 params->sop_inc.inc_lport, in sysctl_setsockopt()
3063 params->sop_inc.inc_fport, in sysctl_setsockopt()
3064 pcbinfo->ipi_hashmask); in sysctl_setsockopt()
3068 ¶ms->sop_inc.inc_faddr, in sysctl_setsockopt()
3069 params->sop_inc.inc_lport, in sysctl_setsockopt()
3070 params->sop_inc.inc_fport, in sysctl_setsockopt()
3071 pcbinfo->ipi_hashmask); in sysctl_setsockopt()
3074 if (inp->inp_gencnt == params->sop_id) { in sysctl_setsockopt()
3075 if (inp->inp_flags & INP_DROPPED) { in sysctl_setsockopt()
3079 so = inp->inp_socket; in sysctl_setsockopt()
3082 if (params->sop_level == SOL_SOCKET) { in sysctl_setsockopt()
3116 if (inc->inc_flags & INC_ISIPV6) { in db_print_inconninfo()
3118 ip6_sprintf(laddr_str, &inc->inc6_laddr); in db_print_inconninfo()
3119 ip6_sprintf(faddr_str, &inc->inc6_faddr); in db_print_inconninfo()
3124 inet_ntoa_r(inc->inc_laddr, laddr_str); in db_print_inconninfo()
3125 inet_ntoa_r(inc->inc_faddr, faddr_str); in db_print_inconninfo()
3129 ntohs(inc->inc_lport)); in db_print_inconninfo()
3132 ntohs(inc->inc_fport)); in db_print_inconninfo()
3281 db_printf("inp_flow: 0x%x\n", inp->inp_flow); in db_print_inpcb()
3283 db_print_inconninfo(&inp->inp_inc, "inp_conninfo", indent); in db_print_inpcb()
3287 inp->inp_label, inp->inp_flags); in db_print_inpcb()
3288 db_print_inpflags(inp->inp_flags); in db_print_inpcb()
3292 db_printf("inp_sp: %p inp_vflag: 0x%x (", inp->inp_sp, in db_print_inpcb()
3293 inp->inp_vflag); in db_print_inpcb()
3294 db_print_inpvflag(inp->inp_vflag); in db_print_inpcb()
3299 inp->inp_ip_ttl, inp->inp_ip_p, inp->inp_ip_minttl); in db_print_inpcb()
3303 if (inp->inp_vflag & INP_IPV6) { in db_print_inpcb()
3305 "in6p_moptions: %p\n", inp->in6p_options, in db_print_inpcb()
3306 inp->in6p_outputopts, inp->in6p_moptions); in db_print_inpcb()
3308 "in6p_hops %u\n", inp->in6p_icmp6filt, inp->in6p_cksum, in db_print_inpcb()
3309 inp->in6p_hops); in db_print_inpcb()
3314 "inp_ip_moptions: %p\n", inp->inp_ip_tos, in db_print_inpcb()
3315 inp->inp_options, inp->inp_moptions); in db_print_inpcb()
3319 db_printf("inp_phd: %p inp_gencnt: %ju\n", inp->inp_phd, in db_print_inpcb()
3320 (uintmax_t)inp->inp_gencnt); in db_print_inpcb()
3339 * Modify TX rate limit based on the existing "inp->inp_snd_tag",
3352 mst = inp->inp_snd_tag; in in_pcbmodify_txrtlmt()
3356 if (mst->sw->snd_tag_modify == NULL) { in in_pcbmodify_txrtlmt()
3359 error = mst->sw->snd_tag_modify(mst, ¶ms); in in_pcbmodify_txrtlmt()
3366 * "inp->inp_snd_tag", if any.
3375 mst = inp->inp_snd_tag; in in_pcbquery_txrtlmt()
3379 if (mst->sw->snd_tag_query == NULL) { in in_pcbquery_txrtlmt()
3382 error = mst->sw->snd_tag_query(mst, ¶ms); in in_pcbquery_txrtlmt()
3391 * "inp->inp_snd_tag", if any.
3400 mst = inp->inp_snd_tag; in in_pcbquery_txrlevel()
3404 if (mst->sw->snd_tag_query == NULL) in in_pcbquery_txrlevel()
3407 error = mst->sw->snd_tag_query(mst, ¶ms); in in_pcbquery_txrlevel()
3415 * given by the "ifp" argument and save it in "inp->inp_snd_tag":
3423 .rate_limit.hdr.type = (max_pacing_rate == -1U) ? in in_pcbattach_txrtlmt()
3427 .rate_limit.hdr.numa_domain = inp->inp_numa_domain, in in_pcbattach_txrtlmt()
3440 if (*st != NULL || (inp->inp_flags & INP_DROPPED) != 0) in in_pcbattach_txrtlmt()
3460 counter_u64_add(rate_limit_active, -1); in in_pcbdetach_tag()
3465 * Free an existing TX rate limit tag based on the "inp->inp_snd_tag",
3475 mst = inp->inp_snd_tag; in in_pcbdetach_txrtlmt()
3476 inp->inp_snd_tag = NULL; in in_pcbdetach_txrtlmt()
3483 counter_u64_add(rate_limit_active, -1); in in_pcbdetach_txrtlmt()
3498 if (inp->inp_snd_tag != NULL && inp->inp_snd_tag->ifp != ifp) { in in_pcboutput_txrtlmt_locked()
3500 inp->inp_flags2 |= INP_RATE_LIMIT_CHANGED; in in_pcboutput_txrtlmt_locked()
3510 if (max_pacing_rate == 0 && inp->inp_snd_tag == NULL) { in in_pcboutput_txrtlmt_locked()
3512 } else if (!(ifp->if_capenable & IFCAP_TXRTLMT)) { in in_pcboutput_txrtlmt_locked()
3513 if (inp->inp_snd_tag != NULL) in in_pcboutput_txrtlmt_locked()
3516 } else if (inp->inp_snd_tag == NULL) { in in_pcboutput_txrtlmt_locked()
3526 mb->m_pkthdr.flowid, max_pacing_rate, &inp->inp_snd_tag); in in_pcboutput_txrtlmt_locked()
3532 inp->inp_flags2 &= ~INP_RATE_LIMIT_CHANGED; in in_pcboutput_txrtlmt_locked()
3552 socket = inp->inp_socket; in in_pcboutput_txrtlmt()
3559 * out and use the non-ratelimited ring for the in in_pcboutput_txrtlmt()
3576 max_pacing_rate = socket->so_max_pacing_rate; in in_pcboutput_txrtlmt()
3595 if (inp->inp_snd_tag == NULL) in in_pcboutput_eagain()
3601 * out and use the non-ratelimited ring for the in in_pcboutput_eagain()
3616 inp->inp_flags2 |= INP_RATE_LIMIT_CHANGED; in in_pcboutput_eagain()