-----Original Message-----
From: Willem de Bruijn <[email protected]>
Sent: Tuesday, August 25, 2026 6:12 PM
To: Chia-Yu Chang (Nokia) <[email protected]>; Willem de Bruijn
<[email protected]>; Jakub Kicinski <[email protected]>
Cc: Mirja Kuehlewind <[email protected]>; [email protected];
[email protected]; [email protected]; [email protected];
[email protected]; [email protected]; [email protected];
[email protected]; [email protected]; [email protected];
[email protected]; [email protected]; [email protected];
[email protected]; [email protected]; [email protected];
[email protected]; [email protected]; [email protected];
[email protected]; [email protected]; [email protected];
[email protected]; [email protected]; [email protected];
[email protected]; [email protected]; [email protected];
[email protected]; [email protected]; [email protected]; Koen De
Schepper (Nokia) <[email protected]>; [email protected];
Ingemar Johansson S <[email protected]>; [email protected];
[email protected]; [email protected]; [email protected]; Parav Pandit
<[email protected]>; Willem de Bruijn <[email protected]>; [email protected]
Subject: RE: [PATCH v5 net-next 1/2] net: update comments for SKB_GSO_TCP_ECN
and SKB_GSO_TCP_ACCECN
CAUTION: This is an external email. Please be very careful when clicking links
or opening attachments. See the URL nok.it/ext for additional information.
> > > > On Fri, 14 Aug 2026 09:34:01 -0400 Willem de Bruijn wrote:
> > > > > > Current SW GRO sets SKB_GSO_TCP_ACCECN when the flushed skb carries
> > > > > > CWR in tcp_gro_complete():
> > > > > > if (th->cwr)
> > > > > > shinfo->gso_type |= SKB_GSO_TCP_ACCECN;
> > > > >
> > > > > And I suppose it follows correct AccECN rules for coalescing.
> > > > >
> > > > > That is a performance regression from RFC 3168 ECN, as it allows
> > > > > for less effective coalescing. I have no intuition how much it
> > > > > will differ in practice.
> > > > >
> > > > > > For HW GRO of a legacy device that implementing RFC3168 semantics,
> > > > > > setting SKB_GSO_TCP_ECN seems reasonable.
> > > > > > However, such a device would not be able to preserve ACCECN
> > > > > > signaling across the GRO/GSO.
> > > > > > In that case, if preserving AccECN signaling is required, disabling
> > > > > > HW GRO may indeed be necessary.
> > > > >
> > > > > Right.
> > > >
> > > > I'm still not following.. Maybe Willem can ELI5 what the problem is.
> > > >
> > > > _SW_ GRO follows only the AccECN rules.
> > > > But if HW GRO follows RFC 3168 and we mark the aggregate as
> > > > SKB_GSO_TCP_ECN - TSO will also abide, and segmented output will
> > > > be identical to pre-GRO input.
> > >
> > > +1
> > >
> > > > Are we trying to ban RFC 3168 behavior in HW purely to match SW?
> > >
> > > I think that's the intent here?
> > Hi Willem,
> >
> > I think we can still change SKB_GSO_TCP_ECN into SKB_GSO_TCP_ACCECN on the
> > RX path, even if HW GRO and SW GRO use different aggregation rules.
> > Currently, SW GRO flushes when the CWR state changes and sets
> > SKB_GSO_TCP_ACCECN when the resulting skb carries CWR=1.
> >
> >
> > For HW GRO, if the device flushes immediately when a CWR=1 packet arrives,
> > there is no need to set either SKB_GSO_TCP_ECN or SKB_GSO_TCP_ACCECN.
> > In that case, each CWR=1 packet is emitted separately, and there is no need
> > to preserve multiple CWR indications through GSO.
> > So, if the HW can be confirmed to always flush CWR-marked packets without
> > coalescing them, preserving multiple CWR indications through GSO is not
> > required.
> > In that case, using SKB_GSO_TCP_ACCECN would not provide any additional
> > benefit.
>
> I agree.
>
> The difference on transmit is that SKB_GSO_TCP_ACCECN will copy the ECN bits
> to every segment, whereas SKB_GSO_TCP_ECN will only set the bits on the first
> segment.
>
> From commit 023af5a72ab1 ("gso: AccECN support") that introduced
> SKB_GSO_TCP_ACCECN:
>
> With RFC 3168 ECN aware TSO (NETIF_F_TSO_ECN) CWR flag is cleared
> starting from 2nd segment which is incompatible how AccECN handles
> the CWR flag. Such super-segments are indicated by SKB_GSO_TCP_ECN.
> With AccECN, CWR flag (or more accurately, the ACE field that also
> includes ECE & AE flags) changes only when new packet(s) with CE
> mark arrives so the flag should not be changed within a super-skb.
>
> Makes me wonder what SKB_GS_TCP_ACCECN adds. Copying bits from the GSO skb to
> all segments is the default. SKB_GSO_TCP_ECN is an indication that the NIC
> knows how to diverge from this default for these specific bits.
>
> That commit confirms this:
>
> If NIC is completely unaware of RFC3168 ECN (doesn't support
> NETIF_F_TSO_ECN) or its TSO engine can be set to not touch CWR flag
> despite supporting also NETIF_F_TSO_ECN, TSO could be safely used
> with AccECN on such NIC. This should be evaluated per NIC basis
> (not done in this patch series for any NICs).`
>
> >
> > The problematic case is when a HW GRO aggregates multiple packets carrying
> > CWR=1 and only sets SKB_GSO_TCP_ECN.
>
> The driver of such a device could be updated to set SKB_GSO_TCP_ACCECN or not
> set any such ECN GSO flag.
>
> The driver of other devices that do follow RFC 3168 semantics will continue
> to have to set SKB_GSO_TCP_ECN on the GSO skb. It is quite plausible that few
> or no devices currently support ECN in their HW-GRO coalescing.
>
Yes, I agree.
In another email I was asking Jijie how their hns3 HW-GRO handles CWR-marked
packets.
If their device flushes immediately when a CWR=1 packet arrives, then the
SKB_GSO_TCP_ECN handling in hns3_enet.c may not be necessary.
In that case, each CWR-marked packet is emitted separately and there may be no
need to use either SKB_GSO_TCP_ACCECN or SKB_GSO_TCP_ECN.
If their HW-GRO can coalesce multiple CWR=1 packets, flagging the resulting skb
with SKB_GSO_TCP_ECN would lose AccECN information during segmentation.
In that case, the skb should either carry SKB_GSO_TCP_ACCECN, or no ECN GSO
flag at all if the segmentation engine preserves the CWR signaling unchanged.
> > During GSO, only the first output segment would carry CWR=1, which loses
> > the remaining CWR signaling information required by AccECN.
> > In that case, changing from SKB_GSO_TCP_ECN to SKB_GSO_TCP_ACCECN would
> > preserve the original signaling by ensuring that the segmented packets
> > carry the correct CWR information.
> > As I understand RFC3168, receiving additional CWR-marked packets is
> > harmless, because once a valid CWR has been received, the receiver already
> > stops echoing ECE.
>
> Agreed.
>
> > Additional CWR indications do not change the receiver state.
> > This would have a performance impact since it disables HW TSO for the skb
> > and falls back to software segmentation.
>
> You mean if the device advertises NETIF_F_TSO_ECN, and GSO skbs may contain
> AccECN signals, the host must downgrade from TSO to GSO to avoid corrupting
> the signal?
>
> The cost of that would be significant. Not something to do for established
> environments. But technically seemingly correct, at least for packets with
> non-zero ECN bits.
Yes, this is what I mean. And I agree the cost would not be small.
So, I am thinking of first checking the existing drivers that still use
SKB_GSO_TCP_ECN. So far I have only found hns3_enet.
I also plan to update the comments for SKB_GSO_TCP_ECN and SKB_GSO_TCP_ACCECN
in include/linux/skbuff.h to capture the conclusions from this discussion.
Then we can at least clarify the expected semantics and review whether the
existing HW-GRO implementations and drivers are consistent with them.
Also, patch 6f74bc8b6e8d0 already added a flags_cwr GRO test, which may be
useful when reviewing the expected behavior of future HW-GRO implementations.
>
> > But IMO it preserves correctness for both RFC3168 ECN and AccECN.
>
> Side-note: this thread probably has way too many Cc: for this narrow topic.