diff options
Diffstat (limited to 'sys/netinet/in_pcb.c')
-rw-r--r-- | sys/netinet/in_pcb.c | 316 |
1 files changed, 2 insertions, 314 deletions
diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c index 9dd2aee11bf0..f1ac46b28477 100644 --- a/sys/netinet/in_pcb.c +++ b/sys/netinet/in_pcb.c @@ -45,7 +45,6 @@ __FBSDID("$FreeBSD$"); #include "opt_inet.h" #include "opt_inet6.h" #include "opt_ratelimit.h" -#include "opt_pcbgroup.h" #include "opt_route.h" #include "opt_rss.h" @@ -542,9 +541,6 @@ in_pcbinfo_init(struct inpcbinfo *pcbinfo, const char *name, &pcbinfo->ipi_porthashmask); pcbinfo->ipi_lbgrouphashbase = hashinit(porthash_nelements, M_PCB, &pcbinfo->ipi_lbgrouphashmask); -#ifdef PCBGROUP - in_pcbgroup_init(pcbinfo, hashfields, hash_nelements); -#endif pcbinfo->ipi_zone = uma_zcreate(inpcbzone_name, sizeof(struct inpcb), NULL, NULL, inpcbzone_init, inpcb_fini, UMA_ALIGN_PTR, 0); uma_zone_set_max(pcbinfo->ipi_zone, maxsockets); @@ -567,9 +563,6 @@ in_pcbinfo_destroy(struct inpcbinfo *pcbinfo) pcbinfo->ipi_porthashmask); hashdestroy(pcbinfo->ipi_lbgrouphashbase, M_PCB, pcbinfo->ipi_lbgrouphashmask); -#ifdef PCBGROUP - in_pcbgroup_destroy(pcbinfo); -#endif uma_zdestroy(pcbinfo->ipi_zone); INP_LIST_LOCK_DESTROY(pcbinfo); INP_HASH_LOCK_DESTROY(pcbinfo); @@ -1522,8 +1515,7 @@ in_pcbdetach(struct inpcb *inp) * in_pcbref() bumps the reference count on an inpcb in order to maintain * stability of an inpcb pointer despite the inpcb lock being released. This * is used in TCP when the inpcbinfo lock needs to be acquired or upgraded, - * but where the inpcb lock may already held, or when acquiring a reference - * via a pcbgroup. + * but where the inpcb lock may already held. * * in_pcbref() should be used only to provide brief memory stability, and * must always be followed by a call to INP_WLOCK() and in_pcbrele() to @@ -1783,9 +1775,6 @@ in_pcbdrop(struct inpcb *inp) } INP_HASH_WUNLOCK(inp->inp_pcbinfo); inp->inp_flags &= ~INP_INHASHLIST; -#ifdef PCBGROUP - in_pcbgroup_remove(inp); -#endif } } @@ -2097,241 +2086,6 @@ in_pcblookup_lbgroup(const struct inpcbinfo *pcbinfo, return (local_wild); } -#ifdef PCBGROUP -/* - * Lookup PCB in hash list, using pcbgroup tables. - */ -static struct inpcb * -in_pcblookup_group(struct inpcbinfo *pcbinfo, struct inpcbgroup *pcbgroup, - struct in_addr faddr, u_int fport_arg, struct in_addr laddr, - u_int lport_arg, int lookupflags, struct ifnet *ifp) -{ - struct inpcbhead *head; - struct inpcb *inp, *tmpinp; - u_short fport = fport_arg, lport = lport_arg; - bool locked; - - /* - * First look for an exact match. - */ - tmpinp = NULL; - INP_GROUP_LOCK(pcbgroup); - head = &pcbgroup->ipg_hashbase[INP_PCBHASH(faddr.s_addr, lport, fport, - pcbgroup->ipg_hashmask)]; - CK_LIST_FOREACH(inp, head, inp_pcbgrouphash) { -#ifdef INET6 - /* XXX inp locking */ - if ((inp->inp_vflag & INP_IPV4) == 0) - continue; -#endif - if (inp->inp_faddr.s_addr == faddr.s_addr && - inp->inp_laddr.s_addr == laddr.s_addr && - inp->inp_fport == fport && - inp->inp_lport == lport) { - /* - * XXX We should be able to directly return - * the inp here, without any checks. - * Well unless both bound with SO_REUSEPORT? - */ - if (prison_flag(inp->inp_cred, PR_IP4)) - goto found; - if (tmpinp == NULL) - tmpinp = inp; - } - } - if (tmpinp != NULL) { - inp = tmpinp; - goto found; - } - -#ifdef RSS - /* - * For incoming connections, we may wish to do a wildcard - * match for an RSS-local socket. - */ - if ((lookupflags & INPLOOKUP_WILDCARD) != 0) { - struct inpcb *local_wild = NULL, *local_exact = NULL; -#ifdef INET6 - struct inpcb *local_wild_mapped = NULL; -#endif - struct inpcb *jail_wild = NULL; - struct inpcbhead *head; - int injail; - - /* - * Order of socket selection - we always prefer jails. - * 1. jailed, non-wild. - * 2. jailed, wild. - * 3. non-jailed, non-wild. - * 4. non-jailed, wild. - */ - - head = &pcbgroup->ipg_hashbase[INP_PCBHASH(INADDR_ANY, - lport, 0, pcbgroup->ipg_hashmask)]; - CK_LIST_FOREACH(inp, head, inp_pcbgrouphash) { -#ifdef INET6 - /* XXX inp locking */ - if ((inp->inp_vflag & INP_IPV4) == 0) - continue; -#endif - if (inp->inp_faddr.s_addr != INADDR_ANY || - inp->inp_lport != lport) - continue; - - injail = prison_flag(inp->inp_cred, PR_IP4); - if (injail) { - if (prison_check_ip4(inp->inp_cred, - &laddr) != 0) - continue; - } else { - if (local_exact != NULL) - continue; - } - - if (inp->inp_laddr.s_addr == laddr.s_addr) { - if (injail) - goto found; - else - local_exact = inp; - } else if (inp->inp_laddr.s_addr == INADDR_ANY) { -#ifdef INET6 - /* XXX inp locking, NULL check */ - if (inp->inp_vflag & INP_IPV6PROTO) - local_wild_mapped = inp; - else -#endif - if (injail) - jail_wild = inp; - else - local_wild = inp; - } - } /* LIST_FOREACH */ - - inp = jail_wild; - if (inp == NULL) - inp = local_exact; - if (inp == NULL) - inp = local_wild; -#ifdef INET6 - if (inp == NULL) - inp = local_wild_mapped; -#endif - if (inp != NULL) - goto found; - } -#endif - - /* - * Then look for a wildcard match, if requested. - */ - if ((lookupflags & INPLOOKUP_WILDCARD) != 0) { - struct inpcb *local_wild = NULL, *local_exact = NULL; -#ifdef INET6 - struct inpcb *local_wild_mapped = NULL; -#endif - struct inpcb *jail_wild = NULL; - struct inpcbhead *head; - int injail; - - /* - * Order of socket selection - we always prefer jails. - * 1. jailed, non-wild. - * 2. jailed, wild. - * 3. non-jailed, non-wild. - * 4. non-jailed, wild. - */ - head = &pcbinfo->ipi_wildbase[INP_PCBHASH(INADDR_ANY, lport, - 0, pcbinfo->ipi_wildmask)]; - CK_LIST_FOREACH(inp, head, inp_pcbgroup_wild) { -#ifdef INET6 - /* XXX inp locking */ - if ((inp->inp_vflag & INP_IPV4) == 0) - continue; -#endif - if (inp->inp_faddr.s_addr != INADDR_ANY || - inp->inp_lport != lport) - continue; - - injail = prison_flag(inp->inp_cred, PR_IP4); - if (injail) { - if (prison_check_ip4(inp->inp_cred, - &laddr) != 0) - continue; - } else { - if (local_exact != NULL) - continue; - } - - if (inp->inp_laddr.s_addr == laddr.s_addr) { - if (injail) - goto found; - else - local_exact = inp; - } else if (inp->inp_laddr.s_addr == INADDR_ANY) { -#ifdef INET6 - /* XXX inp locking, NULL check */ - if (inp->inp_vflag & INP_IPV6PROTO) - local_wild_mapped = inp; - else -#endif - if (injail) - jail_wild = inp; - else - local_wild = inp; - } - } /* LIST_FOREACH */ - inp = jail_wild; - if (inp == NULL) - inp = local_exact; - if (inp == NULL) - inp = local_wild; -#ifdef INET6 - if (inp == NULL) - inp = local_wild_mapped; -#endif - if (inp != NULL) - goto found; - } /* if (lookupflags & INPLOOKUP_WILDCARD) */ - INP_GROUP_UNLOCK(pcbgroup); - return (NULL); - -found: - if (lookupflags & INPLOOKUP_WLOCKPCB) - locked = INP_TRY_WLOCK(inp); - else if (lookupflags & INPLOOKUP_RLOCKPCB) - locked = INP_TRY_RLOCK(inp); - else - panic("%s: locking bug", __func__); - if (__predict_false(locked && (inp->inp_flags2 & INP_FREED))) { - if (lookupflags & INPLOOKUP_WLOCKPCB) - INP_WUNLOCK(inp); - else - INP_RUNLOCK(inp); - return (NULL); - } else if (!locked) - in_pcbref(inp); - INP_GROUP_UNLOCK(pcbgroup); - if (!locked) { - if (lookupflags & INPLOOKUP_WLOCKPCB) { - INP_WLOCK(inp); - if (in_pcbrele_wlocked(inp)) - return (NULL); - } else { - INP_RLOCK(inp); - if (in_pcbrele_rlocked(inp)) - return (NULL); - } - } -#ifdef INVARIANTS - if (lookupflags & INPLOOKUP_WLOCKPCB) - INP_WLOCK_ASSERT(inp); - else - INP_RLOCK_ASSERT(inp); -#endif - return (inp); -} -#endif /* PCBGROUP */ - /* * Lookup PCB in hash list, using pcbinfo tables. This variation assumes * that the caller has locked the hash list, and will not perform any further @@ -2497,40 +2251,17 @@ in_pcblookup_hash(struct inpcbinfo *pcbinfo, struct in_addr faddr, /* * Public inpcb lookup routines, accepting a 4-tuple, and optionally, an mbuf * from which a pre-calculated hash value may be extracted. - * - * Possibly more of this logic should be in in_pcbgroup.c. */ struct inpcb * in_pcblookup(struct inpcbinfo *pcbinfo, struct in_addr faddr, u_int fport, struct in_addr laddr, u_int lport, int lookupflags, struct ifnet *ifp) { -#if defined(PCBGROUP) && !defined(RSS) - struct inpcbgroup *pcbgroup; -#endif KASSERT((lookupflags & ~INPLOOKUP_MASK) == 0, ("%s: invalid lookup flags %d", __func__, lookupflags)); KASSERT((lookupflags & (INPLOOKUP_RLOCKPCB | INPLOOKUP_WLOCKPCB)) != 0, ("%s: LOCKPCB not set", __func__)); - /* - * When not using RSS, use connection groups in preference to the - * reservation table when looking up 4-tuples. When using RSS, just - * use the reservation table, due to the cost of the Toeplitz hash - * in software. - * - * XXXRW: This policy belongs in the pcbgroup code, as in principle - * we could be doing RSS with a non-Toeplitz hash that is affordable - * in software. - */ -#if defined(PCBGROUP) && !defined(RSS) - if (in_pcbgroup_enabled(pcbinfo)) { - pcbgroup = in_pcbgroup_bytuple(pcbinfo, laddr, lport, faddr, - fport); - return (in_pcblookup_group(pcbinfo, pcbgroup, faddr, fport, - laddr, lport, lookupflags, ifp)); - } -#endif return (in_pcblookup_hash(pcbinfo, faddr, fport, laddr, lport, lookupflags, ifp, M_NODOM)); } @@ -2540,39 +2271,12 @@ in_pcblookup_mbuf(struct inpcbinfo *pcbinfo, struct in_addr faddr, u_int fport, struct in_addr laddr, u_int lport, int lookupflags, struct ifnet *ifp, struct mbuf *m) { -#ifdef PCBGROUP - struct inpcbgroup *pcbgroup; -#endif KASSERT((lookupflags & ~INPLOOKUP_MASK) == 0, ("%s: invalid lookup flags %d", __func__, lookupflags)); KASSERT((lookupflags & (INPLOOKUP_RLOCKPCB | INPLOOKUP_WLOCKPCB)) != 0, ("%s: LOCKPCB not set", __func__)); -#ifdef PCBGROUP - /* - * If we can use a hardware-generated hash to look up the connection - * group, use that connection group to find the inpcb. Otherwise - * fall back on a software hash -- or the reservation table if we're - * using RSS. - * - * XXXRW: As above, that policy belongs in the pcbgroup code. - */ - if (in_pcbgroup_enabled(pcbinfo) && - !(M_HASHTYPE_TEST(m, M_HASHTYPE_NONE))) { - pcbgroup = in_pcbgroup_byhash(pcbinfo, M_HASHTYPE_GET(m), - m->m_pkthdr.flowid); - if (pcbgroup != NULL) - return (in_pcblookup_group(pcbinfo, pcbgroup, faddr, - fport, laddr, lport, lookupflags, ifp)); -#ifndef RSS - pcbgroup = in_pcbgroup_bytuple(pcbinfo, laddr, lport, faddr, - fport); - return (in_pcblookup_group(pcbinfo, pcbgroup, faddr, fport, - laddr, lport, lookupflags, ifp)); -#endif - } -#endif return (in_pcblookup_hash(pcbinfo, faddr, fport, laddr, lport, lookupflags, ifp, m->m_pkthdr.numa_domain)); } @@ -2647,13 +2351,7 @@ in_pcbinshash_internal(struct inpcb *inp, struct mbuf *m) CK_LIST_INSERT_HEAD(&phd->phd_pcblist, inp, inp_portlist); CK_LIST_INSERT_HEAD(pcbhash, inp, inp_hash); inp->inp_flags |= INP_INHASHLIST; -#ifdef PCBGROUP - if (m != NULL) { - in_pcbgroup_update_mbuf(inp, m); - } else { - in_pcbgroup_update(inp); - } -#endif + return (0); } @@ -2702,13 +2400,6 @@ in_pcbrehash_mbuf(struct inpcb *inp, struct mbuf *m) CK_LIST_REMOVE(inp, inp_hash); CK_LIST_INSERT_HEAD(head, inp, inp_hash); - -#ifdef PCBGROUP - if (m != NULL) - in_pcbgroup_update_mbuf(inp, m); - else - in_pcbgroup_update(inp); -#endif } void @@ -2749,9 +2440,6 @@ in_pcbremlists(struct inpcb *inp) } CK_LIST_REMOVE(inp, inp_list); pcbinfo->ipi_count--; -#ifdef PCBGROUP - in_pcbgroup_remove(inp); -#endif } /* |