The issue only appeared with hardware-timestamping enabled (RTE_ETH_RX_OFFLOAD_TIMESTAMP).
The length of the prepended hardware timestamp was not subtracted from the data length so that received packets were 16 bytes longer than expected. In scatter-gather mode only the first mbuf has a timestamp but the data offset of the follow-up mbufs was not adjusted accordingly. This caused 16 bytes of packet data to be missing between the segments. Signed-off-by: Martin Weiser <martin.wei...@allegro-packets.com> --- drivers/net/igc/igc_txrx.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/net/igc/igc_txrx.c b/drivers/net/igc/igc_txrx.c index d0cee1b016..2fafa91bd5 100644 --- a/drivers/net/igc/igc_txrx.c +++ b/drivers/net/igc/igc_txrx.c @@ -347,6 +347,8 @@ igc_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) rxm->data_off = RTE_PKTMBUF_HEADROOM; data_len = rte_le_to_cpu_16(rxd.wb.upper.length) - rxq->crc_len; + if (rxq->offloads & RTE_ETH_RX_OFFLOAD_TIMESTAMP) + data_len -= IGC_TS_HDR_LEN; rxm->data_len = data_len; rxm->pkt_len = data_len; rxm->nb_segs = 1; @@ -509,6 +511,12 @@ igc_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, */ rxm->data_off = RTE_PKTMBUF_HEADROOM; data_len = rte_le_to_cpu_16(rxd.wb.upper.length); + if (rxq->offloads & RTE_ETH_RX_OFFLOAD_TIMESTAMP) { + if (first_seg == NULL) + data_len -= IGC_TS_HDR_LEN; + else + rxm->data_off -= IGC_TS_HDR_LEN; + } rxm->data_len = data_len; /* @@ -557,6 +565,7 @@ igc_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, last_seg->data_len = last_seg->data_len - (RTE_ETHER_CRC_LEN - data_len); last_seg->next = NULL; + rxm = last_seg; } else { rxm->data_len = (uint16_t) (data_len - RTE_ETHER_CRC_LEN); -- 2.47.0