Index: sys/dev/cxgbe/tom/t4_connect.c =================================================================== --- sys/dev/cxgbe/tom/t4_connect.c +++ sys/dev/cxgbe/tom/t4_connect.c @@ -101,6 +101,8 @@ make_established(toep, be32toh(cpl->snd_isn) - 1, be32toh(cpl->rcv_isn) - 1, cpl->tcp_opt); + inp->inp_flowtype = M_HASHTYPE_OPAQUE; + inp->inp_flowid = tid; if (ulp_mode(toep) == ULP_MODE_TLS) tls_establish(toep); Index: sys/dev/cxgbe/tom/t4_listen.c =================================================================== --- sys/dev/cxgbe/tom/t4_listen.c +++ sys/dev/cxgbe/tom/t4_listen.c @@ -946,9 +946,7 @@ { struct adapter *sc = tod->tod_softc; struct synq_entry *synqe = arg; -#ifdef INVARIANTS struct inpcb *inp = sotoinpcb(so); -#endif struct toepcb *toep = synqe->toep; NET_EPOCH_ASSERT(); /* prevents bad race with accept() */ @@ -962,6 +960,14 @@ toep->flags |= TPF_CPL_PENDING; update_tid(sc, synqe->tid, toep); synqe->flags |= TPF_SYNQE_EXPANDED; + if (synqe->rss_hash != 0) { + inp->inp_flowtype = (inp->inp_vflag & INP_IPV6) ? + M_HASHTYPE_RSS_TCP_IPV6 : M_HASHTYPE_RSS_TCP_IPV4; + inp->inp_flowid = synqe->rss_hash; + } else { + inp->inp_flowtype = M_HASHTYPE_OPAQUE; + inp->inp_flowid = synqe->tid; + } } static void @@ -1299,6 +1305,10 @@ NET_EPOCH_EXIT(et); REJECT_PASS_ACCEPT_REQ(true); } + if (rss->hash_type == RSS_HASH_TCP) + synqe->rss_hash = be32toh(rss->hash_val); + else + synqe->rss_hash = 0; atomic_store_int(&synqe->ok_to_respond, 0); init_conn_params(vi, &settings, &inc, so, &cpl->tcpopt, e->idx, Index: sys/dev/cxgbe/tom/t4_tom.h =================================================================== --- sys/dev/cxgbe/tom/t4_tom.h +++ sys/dev/cxgbe/tom/t4_tom.h @@ -242,6 +242,7 @@ uint32_t iss; uint32_t irs; uint32_t ts; + uint32_t rss_hash; __be16 tcp_opt; /* from cpl_pass_establish */ struct toepcb *toep;