On Tuesday, October 13th, 2026 at 8:40 PM, Paul Moses <[email protected]> wrote:

> 
> 
> 
> 
> On Tuesday, October 13th, 2026 at 8:10 PM, [email protected] 
> <[email protected]> wrote:
> 
> > Thank you for your contribution! Sashiko AI review found 2 potential 
> > issue(s) to consider:
> > - [High] igc: Frame Preemption express packets (mPackets) lose TSIP 
> > stripping when interleaved
> > - [High] igc: incomplete TSIP underflow fix due to XDP fragment drop
> > --
> >
> > commit 61d038c91b93b927335a69df60dbf6cc817c79e2
> > Author: Paul Moses <[email protected]>
> > igc: only strip RX timestamp header from first buffer
> >
> > This patch modifies the RX path to only subtract the 16-byte TSIP inline
> > timestamp from the first buffer of an skb-assembled packet. This is intended
> > to prevent an unsigned length underflow on continuation buffers shorter than
> > 16 bytes.
> >
> > > diff --git a/drivers/net/ethernet/intel/igc/igc_main.c 
> > > b/drivers/net/ethernet/intel/igc/igc_main.c
> > > index 1fb5f3cbe93c5..41b293dc10c3a 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;
> > >           }
> >
> > [Severity: High]
> > Does this condition corrupt interleaved express packets?
> >
> > Frame Preemption allows express packets (mPackets) to be interleaved in the
> > RX ring while a preemptable packet is being assembled. When an mPacket
> > arrives during this assembly, skb will be non-NULL.
> >
> > Because of the new !skb check, the mPacket's TSIP header won't be stripped,
> > leaving pkt_offset at 0 and size unmodified.
> >
> > Shortly after this check in igc_clean_rx_irq(), the mPacket is handled:
> >
> >     if (igc_fpe_is_pmac_enabled(adapter) &&
> >         igc_fpe_handle_mpacket(adapter, rx_desc, size, pktbuf + 
> > pkt_offset)) {
> >             /* Advance the ring next-to-clean */
> >             igc_is_non_eop(rx_ring, rx_desc);
> >             ...
> >
> > Will this pass the unadjusted size and unstripped TSIP header (pktbuf + 0)
> > into igc_fpe_handle_mpacket(), treating the 16-byte hardware timestamp as
> > packet payload?
> 
> It'll drop, not do that, but I'll fix in this series.
> 
> 
> >
> > [Severity: High]
> > Does this fix fully prevent the continuation fragment underflow?
> >
> > The patch attempts to fix a queue stall caused by an integer underflow on
> > continuation fragments, but relies on skb being non-NULL to detect them.
> >
> > If XDP is enabled and the administrator has enabled the rx-all feature
> > (disabling MTU enforcement), an oversized packet can be split across 
> > multiple
> > descriptors. If the XDP program drops the first descriptor (e.g., returning
> > XDP_DROP), skb remains NULL.
> >
> > When the loop hits igc_is_non_eop() and continues to the next descriptor,
> > skb will still be NULL. If that continuation fragment is shorter than
> > 16 bytes and has the TSIP status bit set, won't this check evaluate to true
> > and cause size to underflow exactly as it did before the patch?
> >
> 
> No, xdp was still no bueno, but I've had some breakthroughs already today and
> this is all mostly finished, I'll submit v3 series shortly.
> 
> Thanks,
> Paul
> 
> 

Is this list private? Can I openly discuss remaining security matters?

Reply via email to