igc_clean_rx_irq() strips IGC_TS_HDR_LEN whenever a descriptor reports IGC_RXDADV_STAT_TSIP. For multi-buffer packets, continuation descriptors retain TSIP even though the inline timestamp is present only in the first RX buffer. Subtracting the header length from each continuation buffer truncates jumbo packets by 16 bytes per continuation and leaves the packet length larger than the received data. Only consume the timestamp header when skb is NULL, which identifies the first buffer of a new packet. An skb carried in rx_ring->skb remains non-NULL when packet assembly resumes in a later NAPI poll. Link: https://lore.kernel.org/all/20260625-igb-rx-ts-fix-v3-1-99b3efa08dca@aweta.nl/ Fixes: e1ed4f92a625 ("igc: Refactor Rx timestamp handling") Cc: stable@vger.kernel.org Signed-off-by: Paul Moses Reviewed-by: Aleksandr Loktionov Acked-by: Maciej Fijalkowski Tested-by: Avigail Dahan --- drivers/net/ethernet/intel/igc/igc_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c index 1fb5f3cbe..41b293dc1 100644 --- a/drivers/net/ethernet/intel/igc/igc_main.c +++ b/drivers/net/ethernet/intel/igc/igc_main.c @@ -2639,7 +2639,8 @@ static int igc_clean_rx_irq(struct igc_q_vector *q_vector, const int budget) pktbuf = page_address(rx_buffer->page) + rx_buffer->page_offset; - if (igc_test_staterr(rx_desc, IGC_RXDADV_STAT_TSIP)) { + if (!skb && + igc_test_staterr(rx_desc, IGC_RXDADV_STAT_TSIP)) { ctx.rx_ts = pktbuf; pkt_offset = IGC_TS_HDR_LEN; size -= IGC_TS_HDR_LEN; -- 2.56.GIT