diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c --- a/sys/netinet/tcp_input.c +++ b/sys/netinet/tcp_input.c @@ -55,6 +55,7 @@ #include "opt_inet.h" #include "opt_inet6.h" #include "opt_ipsec.h" +#include "opt_rss.h" #include #include @@ -83,6 +84,7 @@ #include #include #include +#include #include #define TCPSTATES /* for logging */ @@ -90,6 +92,7 @@ #include #include #include +#include #include #include #include /* required for icmp_var.h */ @@ -99,6 +102,7 @@ #include #include #include +#include #include #include #include @@ -936,10 +940,36 @@ INP_LOCK_ASSERT(inp); if ((inp->inp_flowtype == M_HASHTYPE_NONE) && - (M_HASHTYPE_GET(m) != M_HASHTYPE_NONE) && !SOLISTENING(inp->inp_socket)) { - inp->inp_flowid = m->m_pkthdr.flowid; - inp->inp_flowtype = M_HASHTYPE_GET(m); + if (M_HASHTYPE_GET(m) != M_HASHTYPE_NONE) { + inp->inp_flowid = m->m_pkthdr.flowid; + inp->inp_flowtype = M_HASHTYPE_GET(m); + } +#ifdef RSS + else { + /* assign flowid by software RSS hash */ +#ifdef INET6 + if (isipv6) { + rss_proto_software_hash_v6(&inp->in6p_faddr, + &inp->in6p_laddr, + inp->inp_fport, + inp->inp_lport, + IPPROTO_TCP, + &inp->inp_flowid, + &inp->inp_flowtype); + } else +#endif /* INET6 */ + { + rss_proto_software_hash_v4(inp->inp_faddr, + inp->inp_laddr, + inp->inp_fport, + inp->inp_lport, + IPPROTO_TCP, + &inp->inp_flowid, + &inp->inp_flowtype); + } + } +#endif /* RSS */ } #if defined(IPSEC) || defined(IPSEC_SUPPORT) #ifdef INET6