On Tue, Aug 25, 2026 at 11:55:40PM +0000, Paul Moses wrote: > 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/[email protected]/ > Fixes: e1ed4f92a625 ("igc: Refactor Rx timestamp handling") > Cc: [email protected] > Signed-off-by: Paul Moses <[email protected]>
Acked-by: Maciej Fijalkowski <[email protected]> > --- > # > # REPRO > # > # Receiver: igc / enp1s0 / 10.0.5.175 > # Sender: RTL8125B / enP4p65s0 / 10.0.5.165 > > # Both hosts > sudo ip link set dev enp1s0 mtu 9000 > sudo ip link set dev enP4p65s0 mtu 9000 > > # Baseline: RX timestamping off > sudo hwstamp_ctl -i enp1s0 -t 0 -r 0 > ping -n -M do -c 5 -s 8972 10.0.5.175 > # 5/5 received > > # Enable RX timestamping only > sudo hwstamp_ctl -i enp1s0 -t 0 -r 1 > > # Receiver > sudo timeout 20 tcpdump -ni enp1s0 -s 0 -w /tmp/igc-jumbo.pcap \ > 'icmp and host 10.0.5.165' > > # Sender > ping -n -M do -c 5 -W 2 -s 8972 10.0.5.175 > # 0/5 received > > # Receiver > sudo tcpdump -nn -e -vvv -r /tmp/igc-jumbo.pcap > # length 8950 > # [total length 9000 > length 8936] (invalid) > # wrong icmp cksum > > # Expected Ethernet length: 9014 > # Captured length: 8950 > # Loss: 64 = 4 continuation buffers * 16 bytes > > # Disable RX timestamping again > sudo hwstamp_ctl -i enp1s0 -t 0 -r 0 > ping -n -M do -c 5 -s 8972 10.0.5.175 > # 5/5 received > > --- > > 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 1fb5f3cbe93c..41b293dc10c3 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.55.GIT > >
