[PATCH bpf-next V1 0/7] xdp: Propagate RX HW hints for XDP_REDIRECTed packets via xdp_frame

Jesper Dangaard Brouer
2025-06-03T17:45:53Z

This patch series enables the propagation of NIC hardware RX metadata
offload hints for packets undergoing XDP_REDIRECT. Currently, SKBs
created from `xdp_frame`s after an XDP_REDIRECT (e.g. to cpumap or veth)
lack hardware hints.

While XDP hardware RX metadata can be read by BPF programs bound to the
physical device's ifindex (BPF_F_XDP_DEV_BOUND_ONLY) using kfuncs [1],
there's no mechanism to persist these hints for use after a redirect.
The currently available kfuncs[1] provide rx_hash, rx_vlan_tag and
rx_timestamp.

This series introduces new BPF kfuncs allowing an XDP program to store
existing HW metadata hints (rx_hash, rx_vlan_tag and rx_timestamp) into
the `xdp_frame`. These stored hints are then used in
`__xdp_build_skb_from_frame()` to populate the corresponding fields in
the newly created SKB.

The immediate production motivation is to correctly populate `skb->hash`
(the RX hash). This is important for GRO (Generic Receive Offload)
functionality. For instance, the netstack needs the `skb->hash` to be
set *before* the GRO engine processes the packet (see
`dev_gro_receive()` [0]). Without the correct RX hash, the GRO engine
(e.g., cpumap recently gained GRO support) effectively operates on a
single hash bucket, limiting its ability to aggregate flows.

Populating these fields via a TC ingress hook is not viable as it
executes too late in the packet processing pipeline for uses like GRO.

We considered XDP traits as an alternative to statically adding members
to the end of `struct xdp_frame` area. However, given the immediate need
for this functionality and the current development status of traits, we
believe this approach is a pragmatic solution. We are open to revisiting
this and potentially migrating to a traits-based implementation if/when
they become a generally accepted mechanism for such extensions.

Furthermore, this patchset demonstrates a tangible in-kernel requirement
for such metadata propagation and could serve as an early example or
adopter of the XDP traits mechanism.

[0] https://elixir.bootlin.com/linux/v6.14.7/source/net/core/gro.c#L463
[1] https://docs.kernel.org/networking/xdp-rx-metadata.html

---

Jesper Dangaard Brouer (2):
selftests/bpf: Adjust test for maximum packet size in xdp_do_redirect
net: xdp: update documentation for xdp-rx-metadata.rst

Lorenzo Bianconi (5):
net: xdp: Add xdp_rx_meta structure
net: xdp: Add kfuncs to store hw metadata in xdp_buff
net: xdp: Set skb hw metadata from xdp_frame
net: veth: Read xdp metadata from rx_meta struct if available
bpf: selftests: Add rx_meta store kfuncs selftest

Documentation/networking/xdp-rx-metadata.rst | 74 ++++++--
drivers/net/veth.c | 12 ++
include/net/xdp.h | 134 ++++++++++++--
net/core/xdp.c | 107 ++++++++++-
net/xdp/xsk_buff_pool.c | 4 +-
.../bpf/prog_tests/xdp_do_redirect.c | 6 +-
.../selftests/bpf/prog_tests/xdp_rxmeta.c | 166 ++++++++++++++++++
.../selftests/bpf/progs/xdp_rxmeta_receiver.c | 44 +++++
.../selftests/bpf/progs/xdp_rxmeta_redirect.c | 48 +++++
9 files changed, 560 insertions(+), 35 deletions(-)
create mode 100644 tools/testing/selftests/bpf/prog_tests/xdp_rxmeta.c
create mode 100644 tools/testing/selftests/bpf/progs/xdp_rxmeta_receiver.c
create mode 100644 tools/testing/selftests/bpf/progs/xdp_rxmeta_redirect.c

--