Re: [Intel-wired-lan] [PATCH net-next v4 2/2] e1000e: add XDP_REDIRECT support
From: Matteo Croce
Date: Thu Mar 26 2026 - 22:42:51 EST
Il giorno mar 24 mar 2026 alle ore 09:48 Loktionov, Aleksandr
<aleksandr.loktionov@xxxxxxxxx> ha scritto:
>
>
>
> > -----Original Message-----
> > From: Intel-wired-lan <intel-wired-lan-bounces@xxxxxxxxxx> On Behalf
> > Of Matteo Croce
> > Sent: Monday, March 23, 2026 7:28 PM
> > To: Nguyen, Anthony L <anthony.l.nguyen@xxxxxxxxx>; Kitszel,
> > Przemyslaw <przemyslaw.kitszel@xxxxxxxxx>; Andrew Lunn
> > <andrew+netdev@xxxxxxx>; David S. Miller <davem@xxxxxxxxxxxxx>; Eric
> > Dumazet <edumazet@xxxxxxxxxx>; Jakub Kicinski <kuba@xxxxxxxxxx>; Paolo
> > Abeni <pabeni@xxxxxxxxxx>; Alexei Starovoitov <ast@xxxxxxxxxx>; Daniel
> > Borkmann <daniel@xxxxxxxxxxxxx>; Jesper Dangaard Brouer
> > <hawk@xxxxxxxxxx>; John Fastabend <john.fastabend@xxxxxxxxx>; Mohsin
> > Bashir <mohsin.bashr@xxxxxxxxx>
> > Cc: netdev@xxxxxxxxxxxxxxx; bpf@xxxxxxxxxxxxxxx; intel-wired-
> > lan@xxxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx
> > Subject: [Intel-wired-lan] [PATCH net-next v4 2/2] e1000e: add
> > XDP_REDIRECT support
> >
> > Add the ability to redirect packets to other devices via XDP_REDIRECT
> > and to receive redirected frames from other devices via ndo_xdp_xmit.
> >
> > New functionality:
> > - XDP_REDIRECT case in e1000_run_xdp() using xdp_do_redirect()
> > - e1000_xdp_xmit() as the ndo_xdp_xmit callback for receiving
> > redirected frames from other devices
> > - xdp_do_flush() in e1000_finalize_xdp() for REDIR completions
> > - xdp_features_set/clear_redirect_target() in e1000_xdp_setup()
> > - NETDEV_XDP_ACT_REDIRECT and NETDEV_XDP_ACT_NDO_XMIT advertised
> >
> > Assisted-by: claude-opus-4-6
> > Signed-off-by: Matteo Croce <teknoraver@xxxxxxxx>
> > ---
> > drivers/net/ethernet/intel/e1000e/netdev.c | 85
> > +++++++++++++++++++++-
> > 1 file changed, 81 insertions(+), 4 deletions(-)
> >
> > diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c
> > b/drivers/net/ethernet/intel/e1000e/netdev.c
> > index d77f208f00cc..01661e1a74e5 100644
> > --- a/drivers/net/ethernet/intel/e1000e/netdev.c
> > +++ b/drivers/net/ethernet/intel/e1000e/netdev.c
> > @@ -41,6 +41,7 @@ char e1000e_driver_name[] = "e1000e";
> > #define E1000_XDP_PASS 0
> > #define E1000_XDP_CONSUMED BIT(0)
> > #define E1000_XDP_TX BIT(1)
>
> ...
>
> >
> > +/**
> > + * e1000_xdp_xmit - transmit XDP frames from another device
> > + * @netdev: network interface device structure
> > + * @n: number of frames to transmit
> > + * @frames: array of XDP frame pointers
> > + * @flags: XDP transmit flags
> > + *
> > + * This is the ndo_xdp_xmit callback, called when other devices
> > +redirect
> > + * frames to this device.
> > + **/
> > +static int e1000_xdp_xmit(struct net_device *netdev, int n,
> > + struct xdp_frame **frames, u32 flags) {
> > + struct e1000_adapter *adapter = netdev_priv(netdev);
> > + struct e1000_ring *tx_ring = adapter->tx_ring;
> > + struct netdev_queue *nq = netdev_get_tx_queue(netdev, 0);
> > + int cpu = smp_processor_id();
> > + int nxmit = 0;
> > + int i;
> > +
> > + if (unlikely(test_bit(__E1000_DOWN, &adapter->state)))
> > + return -ENETDOWN;
> > +
> > + if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK))
> > + return -EINVAL;
> > +
> > + if (!adapter->xdp_prog)
> > + return -ENXIO;
> > +
> > + __netif_tx_lock(nq, cpu);
> > + txq_trans_cond_update(nq);
> > +
> > + for (i = 0; i < n; i++) {
> > + int err;
> > +
> > + err = e1000_xdp_xmit_ring(adapter, tx_ring, frames[i]);
> > + if (err != E1000_XDP_TX)
> > + break;
> On first failure, we break out of the loop. frames[i] through frames[n-1] are silently abandoned.
> It should be no memleaks I hope, but silent packets drop is nasty!
>
I wanted to be consistent with other similar drivers, this i what igb
does in igb_main.c:
for (i = 0; i < n; i++) {
struct xdp_frame *xdpf = frames[i];
int err;
err = igb_xmit_xdp_ring(adapter, tx_ring, xdpf);
if (err != IGB_XDP_TX)
break;
nxmit++;
}
Regards,
--
Matteo Croce
perl -e 'for($t=0;;$t++){print chr($t*($t>>8|$t>>13)&255)}' |aplay