aboutsummaryrefslogtreecommitdiff
path: root/sys/netinet/in_pcb.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/netinet/in_pcb.c')
-rw-r--r--sys/netinet/in_pcb.c316
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
}
/*