Hi,
this diff add hardware checksum offloading for the receive path of
ixl(4) interfaces.
Tested on:
ixl1 at pci3 dev 0 function 1 "Intel X710 SFP+" rev 0x02: port 1, FW 6.0.48442
API 1.7, msix, 8 queues, address 40:a6:b7:02:38:3d
OK?
Index: dev/pci/if_ixl.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_ixl.c,v
retrieving revision 1.75
diff -u -p -r1.75 if_ixl.c
--- dev/pci/if_ixl.c 23 Jul 2021 00:29:14 -0000 1.75
+++ dev/pci/if_ixl.c 22 Oct 2021 09:20:59 -0000
@@ -1388,6 +1388,7 @@ static int ixl_rxeof(struct ixl_softc *,
static void ixl_rxfill(struct ixl_softc *, struct ixl_rx_ring *);
static void ixl_rxrefill(void *);
static int ixl_rxrinfo(struct ixl_softc *, struct if_rxrinfo *);
+static void ixl_rx_checksum(struct mbuf *, uint64_t);
#if NKSTAT > 0
static void ixl_kstat_attach(struct ixl_softc *);
@@ -3190,6 +3191,7 @@ ixl_rxeof(struct ixl_softc *sc, struct i
m->m_pkthdr.csum_flags |= M_FLOWID;
}
+ ixl_rx_checksum(m, word);
ml_enqueue(&ml, m);
} else {
ifp->if_ierrors++; /* XXX */
@@ -3320,6 +3322,23 @@ ixl_rxrinfo(struct ixl_softc *sc, struct
free(ifr, M_TEMP, ixl_nqueues(sc) * sizeof(*ifr));
return (rv);
+}
+
+static void
+ixl_rx_checksum(struct mbuf *m, uint64_t word)
+{
+ if (!ISSET(word, IXL_RX_DESC_L3L4P))
+ return;
+
+ if (ISSET(word, IXL_RX_DESC_IPE))
+ return;
+
+ m->m_pkthdr.csum_flags |= M_IPV4_CSUM_IN_OK;
+
+ if (ISSET(word, IXL_RX_DESC_L4E))
+ return;
+
+ m->m_pkthdr.csum_flags |= M_TCP_CSUM_IN_OK | M_UDP_CSUM_IN_OK;
}
static int