The branch main has been updated by gallatin:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=ac1cd655f647cfd8e8d8c08da00f41abfce212a1

commit ac1cd655f647cfd8e8d8c08da00f41abfce212a1
Author:     Andrew Gallatin <[email protected]>
AuthorDate: 2026-01-05 17:02:23 +0000
Commit:     Andrew Gallatin <[email protected]>
CommitDate: 2026-01-05 19:10:17 +0000

    ixl: verify flowid is valid before setting rsstype & flowid
    
    According to section 8.3.2.2.1 of the XL710 datasheet,
    FLTSTAT indicates if RSS hashing was used (or flow director
    or nothing) to arrive at the flowid it is reporting.
    We need to check this before reporting the flowid and setting the
    rss type. Not checking this allows invalid flowids (0s) to be
    reported for some TCP traffic (it seems to mostly impact incoming
    connections). This leads to the inp flowid being 0, and egress
    traffic being unbalanced (going to tx queue 0, and NIC 0 of an
    lacp bundle).
    
    Differential Revision: https://reviews.freebsd.org/D54442
    Reviewed by: adrian, kbowling
    Sponsored by: Netflix
    MFC after: 2 weeks
---
 sys/dev/ixl/ixl_txrx.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/sys/dev/ixl/ixl_txrx.c b/sys/dev/ixl/ixl_txrx.c
index f971a3073265..04b8279bdc59 100644
--- a/sys/dev/ixl/ixl_txrx.c
+++ b/sys/dev/ixl/ixl_txrx.c
@@ -661,7 +661,7 @@ ixl_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
        struct ixl_rx_queue     *que = &vsi->rx_queues[ri->iri_qsidx];
        struct rx_ring          *rxr = &que->rxr;
        union i40e_rx_desc      *cur;
-       u32             status, error;
+       u32             status, error, fltstat;
        u16             plen;
        u64             qword;
        u8              ptype;
@@ -717,8 +717,12 @@ ixl_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
 
        if ((scctx->isc_capenable & IFCAP_RXCSUM) != 0)
                rxr->csum_errs += ixl_rx_checksum(ri, status, error, ptype);
-       ri->iri_flowid = le32toh(cur->wb.qword0.hi_dword.rss);
-       ri->iri_rsstype = ixl_ptype_to_hash(ptype);
+       fltstat = (status >> I40E_RX_DESC_STATUS_FLTSTAT_SHIFT);
+       if ((fltstat & I40E_RX_DESC_FLTSTAT_RSS_HASH) ==
+               I40E_RX_DESC_FLTSTAT_RSS_HASH) {
+               ri->iri_flowid = le32toh(cur->wb.qword0.hi_dword.rss);
+               ri->iri_rsstype = ixl_ptype_to_hash(ptype);
+       }
        if (status & (1 << I40E_RX_DESC_STATUS_L2TAG1P_SHIFT)) {
                ri->iri_vtag = le16toh(cur->wb.qword0.lo_dword.l2tag1);
                ri->iri_flags |= M_VLANTAG;

Reply via email to