Hi, On Tue, May 12, 2026 at 03:58:28PM +0200, Paolo Abeni wrote: > On 5/9/26 5:04 AM, Qingfang Deng wrote: > > +static struct sk_buff *pppoe_gso_segment(struct sk_buff *skb, > > + netdev_features_t features) > > +{ > > + struct sk_buff *segs = ERR_PTR(-EINVAL); > > + struct packet_offload *ptype; > > + struct pppoe_hdr *phdr; > > + __be16 orig_type, type; > > + int len, nhoff; > > + > > + skb_reset_network_header(skb); > > + nhoff = skb_network_header(skb) - skb_mac_header(skb); > > + > > + if (unlikely(!pskb_may_pull(skb, PPPOE_SES_HLEN))) > > + goto out; > > + > > + phdr = (struct pppoe_hdr *)skb_network_header(skb); > > + type = pppoe_hdr_proto(phdr); > > + ptype = gro_find_complete_by_type(type); > > + if (!ptype) > > + goto out; > > + > > + orig_type = skb->protocol; > > + __skb_pull(skb, PPPOE_SES_HLEN); > > + features &= ~(NETIF_F_TSO | NETIF_F_TSO6); > > As sashiko points out here you need to use NETIF_F_GSO_SOFTWARE. I tested this patch using NETIF_F_GSO_SOFTWARE here as Paolo suggests. Then, I made the following changes to the flowtable (see attached patch) to use this new pppoe_gso_segment function, and it works for me: Tested-by: Pablo Neira Ayuso I will submit my flowtable patch to nf-next once this patch is applied to net-next. Thanks.