Introduce bpf_xdp_metadata_rx_checksum() kfunc in order to load the HW RX cheksum results in the eBPF program binded to the NIC. Implement xmo_rx_checksum callback for veth and ice drivers.
Please note ice support changes are just compile-tested at the moment.
--- Changes in RFC v2: - Squash patch 1/6 and 2/6 - Introduce enum xdp_checksum definitions - Rework ice support to reuse ice_rx_csum codebase
--- Lorenzo Bianconi (5): netlink: specs: Add XDP RX checksum capability to XDP metadata specs net: veth: Add xmo_rx_checksum callback to veth driver net: ice: Add xmo_rx_checksum callback selftests/bpf: Add selftest support for bpf_xdp_metadata_rx_checksum selftests/bpf: Add bpf_xdp_metadata_rx_checksum support to xdp_hw_metadat prog
Documentation/netlink/specs/netdev.yaml | 5 + drivers/net/ethernet/intel/ice/ice_base.c | 1 + drivers/net/ethernet/intel/ice/ice_txrx.h | 1 + drivers/net/ethernet/intel/ice/ice_txrx_lib.c | 125 +++++++++++++-------- drivers/net/veth.c | 20 ++++ include/net/xdp.h | 14 +++ net/core/xdp.c | 29 +++++ .../selftests/bpf/prog_tests/xdp_metadata.c | 7 ++ .../testing/selftests/bpf/progs/xdp_hw_metadata.c | 7 ++ tools/testing/selftests/bpf/progs/xdp_metadata.c | 1 + tools/testing/selftests/bpf/xdp_hw_metadata.c | 27 +++++ tools/testing/selftests/bpf/xdp_metadata.h | 13 +++ 12 files changed, 206 insertions(+), 44 deletions(-) --- base-commit: 5e3fee34f626a8cb8715f5b5409416c481714ebf change-id: 20250925-bpf-xdp-meta-rxcksum-900685e2909d
Best regards,
Introduce XDP RX checksum capability to XDP metadata specs. XDP RX checksum will be use by devices capable of exposing receive checksum result via bpf_xdp_metadata_rx_checksum(). Moreover, introduce xmo_rx_checksum netdev callback in order allow the eBPF program bounded to the device to retrieve the RX checksum result computed by the hw NIC.
Signed-off-by: Lorenzo Bianconi lorenzo@kernel.org --- Documentation/netlink/specs/netdev.yaml | 5 +++++ include/net/xdp.h | 14 ++++++++++++++ net/core/xdp.c | 29 +++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+)
diff --git a/Documentation/netlink/specs/netdev.yaml b/Documentation/netlink/specs/netdev.yaml index e00d3fa1c152d7165e9485d6d383a2cc9cef7cfd..00699bf4a7fdb67c6b9ee3548098b0c933fd39a4 100644 --- a/Documentation/netlink/specs/netdev.yaml +++ b/Documentation/netlink/specs/netdev.yaml @@ -61,6 +61,11 @@ definitions: doc: | Device is capable of exposing receive packet VLAN tag via bpf_xdp_metadata_rx_vlan_tag(). + - + name: checksum + doc: | + Device is capable of exposing receive checksum result via + bpf_xdp_metadata_rx_checksum(). - type: flags name: xsk-flags diff --git a/include/net/xdp.h b/include/net/xdp.h index aa742f413c358575396530879af4570dc3fc18de..9ab9ac10ae2074b70618a9d4f32544d8b9a30b63 100644 --- a/include/net/xdp.h +++ b/include/net/xdp.h @@ -586,6 +586,10 @@ void xdp_attachment_setup(struct xdp_attachment_info *info, NETDEV_XDP_RX_METADATA_VLAN_TAG, \ bpf_xdp_metadata_rx_vlan_tag, \ xmo_rx_vlan_tag) \ + XDP_METADATA_KFUNC(XDP_METADATA_KFUNC_RX_CHECKSUM, \ + NETDEV_XDP_RX_METADATA_CHECKSUM, \ + bpf_xdp_metadata_rx_checksum, \ + xmo_rx_checksum)
enum xdp_rx_metadata { #define XDP_METADATA_KFUNC(name, _, __, ___) name, @@ -643,12 +647,22 @@ enum xdp_rss_hash_type { XDP_RSS_TYPE_L4_IPV6_SCTP_EX = XDP_RSS_TYPE_L4_IPV6_SCTP | XDP_RSS_L3_DYNHDR, };
+enum xdp_checksum { + XDP_CHECKSUM_NONE = CHECKSUM_NONE, + XDP_CHECKSUM_UNNECESSARY = CHECKSUM_UNNECESSARY, + XDP_CHECKSUM_COMPLETE = CHECKSUM_COMPLETE, + XDP_CHECKSUM_PARTIAL = CHECKSUM_PARTIAL, +}; + struct xdp_metadata_ops { int (*xmo_rx_timestamp)(const struct xdp_md *ctx, u64 *timestamp); int (*xmo_rx_hash)(const struct xdp_md *ctx, u32 *hash, enum xdp_rss_hash_type *rss_type); int (*xmo_rx_vlan_tag)(const struct xdp_md *ctx, __be16 *vlan_proto, u16 *vlan_tci); + int (*xmo_rx_checksum)(const struct xdp_md *ctx, + enum xdp_checksum *ip_summed, + u32 *cksum_meta); };
#ifdef CONFIG_NET diff --git a/net/core/xdp.c b/net/core/xdp.c index 9100e160113a9a1e2cb88e7602e85c5f36a9f3b9..4362a5d294c9117ab69dab00deefbd8fcd62d6cd 100644 --- a/net/core/xdp.c +++ b/net/core/xdp.c @@ -961,6 +961,35 @@ __bpf_kfunc int bpf_xdp_metadata_rx_vlan_tag(const struct xdp_md *ctx, return -EOPNOTSUPP; }
+/** + * bpf_xdp_metadata_rx_checksum - Read XDP frame RX checksum. + * @ctx: XDP context pointer. + * @ip_summed: Return value pointer indicating checksum result. + * @cksum_meta: Return value pointer indicating checksum result metadata. + * + * In case of success, ``ip_summed`` is set to the RX checksum result. Possible + * values are: + * ``XDP_CHECKSUM_NONE`` + * ``XDP_CHECKSUM_UNNECESSARY`` + * ``XDP_CHECKSUM_COMPLETE`` + * ``XDP_CHECKSUM_PARTIAL`` + * + * In case of success, ``cksum_meta`` contains the hw computed checksum value + * for ``XDP_CHECKSUM_COMPLETE`` or the ``csum_level`` for + * ``XDP_CHECKSUM_UNNECESSARY``. It is set to 0 for ``XDP_CHECKSUM_NONE`` and + * ``XDP_CHECKSUM_PARTIAL``. + * + * Return: + * * Returns 0 on success or ``-errno`` on error. + * * ``-EOPNOTSUPP`` : means device driver does not implement kfunc + * * ``-ENODATA`` : means no RX-timestamp available for this frame + */ +__bpf_kfunc int bpf_xdp_metadata_rx_checksum(const struct xdp_md *ctx, + u8 *ip_summed, u32 *cksum_meta) +{ + return -EOPNOTSUPP; +} + __bpf_kfunc_end_defs();
BTF_KFUNCS_START(xdp_metadata_kfunc_ids)
On 09/25, Lorenzo Bianconi wrote:
Introduce XDP RX checksum capability to XDP metadata specs. XDP RX checksum will be use by devices capable of exposing receive checksum result via bpf_xdp_metadata_rx_checksum(). Moreover, introduce xmo_rx_checksum netdev callback in order allow the eBPF program bounded to the device to retrieve the RX checksum result computed by the hw NIC.
Signed-off-by: Lorenzo Bianconi lorenzo@kernel.org
Documentation/netlink/specs/netdev.yaml | 5 +++++ include/net/xdp.h | 14 ++++++++++++++ net/core/xdp.c | 29 +++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+)
diff --git a/Documentation/netlink/specs/netdev.yaml b/Documentation/netlink/specs/netdev.yaml index e00d3fa1c152d7165e9485d6d383a2cc9cef7cfd..00699bf4a7fdb67c6b9ee3548098b0c933fd39a4 100644 --- a/Documentation/netlink/specs/netdev.yaml +++ b/Documentation/netlink/specs/netdev.yaml @@ -61,6 +61,11 @@ definitions: doc: | Device is capable of exposing receive packet VLAN tag via bpf_xdp_metadata_rx_vlan_tag().
-
name: checksum
doc: |
Device is capable of exposing receive checksum result via
bpf_xdp_metadata_rx_checksum().
- type: flags name: xsk-flags
diff --git a/include/net/xdp.h b/include/net/xdp.h index aa742f413c358575396530879af4570dc3fc18de..9ab9ac10ae2074b70618a9d4f32544d8b9a30b63 100644 --- a/include/net/xdp.h +++ b/include/net/xdp.h @@ -586,6 +586,10 @@ void xdp_attachment_setup(struct xdp_attachment_info *info, NETDEV_XDP_RX_METADATA_VLAN_TAG, \ bpf_xdp_metadata_rx_vlan_tag, \ xmo_rx_vlan_tag) \
- XDP_METADATA_KFUNC(XDP_METADATA_KFUNC_RX_CHECKSUM, \
NETDEV_XDP_RX_METADATA_CHECKSUM, \
bpf_xdp_metadata_rx_checksum, \
xmo_rx_checksum)
enum xdp_rx_metadata { #define XDP_METADATA_KFUNC(name, _, __, ___) name, @@ -643,12 +647,22 @@ enum xdp_rss_hash_type { XDP_RSS_TYPE_L4_IPV6_SCTP_EX = XDP_RSS_TYPE_L4_IPV6_SCTP | XDP_RSS_L3_DYNHDR, }; +enum xdp_checksum {
- XDP_CHECKSUM_NONE = CHECKSUM_NONE,
- XDP_CHECKSUM_UNNECESSARY = CHECKSUM_UNNECESSARY,
- XDP_CHECKSUM_COMPLETE = CHECKSUM_COMPLETE,
- XDP_CHECKSUM_PARTIAL = CHECKSUM_PARTIAL,
+};
Btw, might be worth mentioning, awhile ago we had settled on a smaller set of exposed types:
https://lore.kernel.org/netdev/20230811161509.19722-13-larysa.zaremba@intel....
Maybe go through the previous postings and check if the arguments are still relevant? (or explain why we want more checksum now)
On 26/09/2025 06.20, Stanislav Fomichev wrote:
On 09/25, Lorenzo Bianconi wrote:
Introduce XDP RX checksum capability to XDP metadata specs. XDP RX checksum will be use by devices capable of exposing receive checksum result via bpf_xdp_metadata_rx_checksum(). Moreover, introduce xmo_rx_checksum netdev callback in order allow the eBPF program bounded to the device to retrieve the RX checksum result computed by the hw NIC.
Signed-off-by: Lorenzo Bianconi lorenzo@kernel.org
Documentation/netlink/specs/netdev.yaml | 5 +++++ include/net/xdp.h | 14 ++++++++++++++ net/core/xdp.c | 29 +++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+)
diff --git a/Documentation/netlink/specs/netdev.yaml b/Documentation/netlink/specs/netdev.yaml index e00d3fa1c152d7165e9485d6d383a2cc9cef7cfd..00699bf4a7fdb67c6b9ee3548098b0c933fd39a4 100644 --- a/Documentation/netlink/specs/netdev.yaml +++ b/Documentation/netlink/specs/netdev.yaml @@ -61,6 +61,11 @@ definitions: doc: | Device is capable of exposing receive packet VLAN tag via bpf_xdp_metadata_rx_vlan_tag().
-
name: checksum
doc: |
Device is capable of exposing receive checksum result via
bpf_xdp_metadata_rx_checksum().
- type: flags name: xsk-flags
diff --git a/include/net/xdp.h b/include/net/xdp.h index aa742f413c358575396530879af4570dc3fc18de..9ab9ac10ae2074b70618a9d4f32544d8b9a30b63 100644 --- a/include/net/xdp.h +++ b/include/net/xdp.h @@ -586,6 +586,10 @@ void xdp_attachment_setup(struct xdp_attachment_info *info, NETDEV_XDP_RX_METADATA_VLAN_TAG, \ bpf_xdp_metadata_rx_vlan_tag, \ xmo_rx_vlan_tag) \
- XDP_METADATA_KFUNC(XDP_METADATA_KFUNC_RX_CHECKSUM, \
NETDEV_XDP_RX_METADATA_CHECKSUM, \
bpf_xdp_metadata_rx_checksum, \
xmo_rx_checksum)
enum xdp_rx_metadata { #define XDP_METADATA_KFUNC(name, _, __, ___) name, @@ -643,12 +647,22 @@ enum xdp_rss_hash_type { XDP_RSS_TYPE_L4_IPV6_SCTP_EX = XDP_RSS_TYPE_L4_IPV6_SCTP | XDP_RSS_L3_DYNHDR, }; +enum xdp_checksum {
- XDP_CHECKSUM_NONE = CHECKSUM_NONE,
- XDP_CHECKSUM_UNNECESSARY = CHECKSUM_UNNECESSARY,
- XDP_CHECKSUM_COMPLETE = CHECKSUM_COMPLETE,
- XDP_CHECKSUM_PARTIAL = CHECKSUM_PARTIAL,
+};
Btw, might be worth mentioning, awhile ago we had settled on a smaller set of exposed types:
https://lore.kernel.org/netdev/20230811161509.19722-13-larysa.zaremba@intel....
Maybe go through the previous postings and check if the arguments are still relevant? (or explain why we want more checksum now)
IHMO the linked proposal reduced the types too much.
I think Lorenzo's suggested types are much better. One argument is of- cause that the types corresponds directly to the (time proven) types used by the SKB.
I could argue, that we are lacking a type that indicate hardware "failed" to do the checksum, but that is indirectly covered by CHECKSUM_NONE case. And having BPF-developers deal with both CHECKSUM_NONE and CHECKSUM_FAIL correctly is a recipe for bugs.
I will explain in another email, why we need to document what CHECKSUM_NONE actually means.
--Jesper
On 09/26, Jesper Dangaard Brouer wrote:
On 26/09/2025 06.20, Stanislav Fomichev wrote:
On 09/25, Lorenzo Bianconi wrote:
Introduce XDP RX checksum capability to XDP metadata specs. XDP RX checksum will be use by devices capable of exposing receive checksum result via bpf_xdp_metadata_rx_checksum(). Moreover, introduce xmo_rx_checksum netdev callback in order allow the eBPF program bounded to the device to retrieve the RX checksum result computed by the hw NIC.
Signed-off-by: Lorenzo Bianconi lorenzo@kernel.org
Documentation/netlink/specs/netdev.yaml | 5 +++++ include/net/xdp.h | 14 ++++++++++++++ net/core/xdp.c | 29 +++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+)
diff --git a/Documentation/netlink/specs/netdev.yaml b/Documentation/netlink/specs/netdev.yaml index e00d3fa1c152d7165e9485d6d383a2cc9cef7cfd..00699bf4a7fdb67c6b9ee3548098b0c933fd39a4 100644 --- a/Documentation/netlink/specs/netdev.yaml +++ b/Documentation/netlink/specs/netdev.yaml @@ -61,6 +61,11 @@ definitions: doc: | Device is capable of exposing receive packet VLAN tag via bpf_xdp_metadata_rx_vlan_tag().
-
name: checksum
doc: |
Device is capable of exposing receive checksum result via
bpf_xdp_metadata_rx_checksum().
- type: flags name: xsk-flags
diff --git a/include/net/xdp.h b/include/net/xdp.h index aa742f413c358575396530879af4570dc3fc18de..9ab9ac10ae2074b70618a9d4f32544d8b9a30b63 100644 --- a/include/net/xdp.h +++ b/include/net/xdp.h @@ -586,6 +586,10 @@ void xdp_attachment_setup(struct xdp_attachment_info *info, NETDEV_XDP_RX_METADATA_VLAN_TAG, \ bpf_xdp_metadata_rx_vlan_tag, \ xmo_rx_vlan_tag) \
- XDP_METADATA_KFUNC(XDP_METADATA_KFUNC_RX_CHECKSUM, \
NETDEV_XDP_RX_METADATA_CHECKSUM, \
bpf_xdp_metadata_rx_checksum, \
enum xdp_rx_metadata { #define XDP_METADATA_KFUNC(name, _, __, ___) name,xmo_rx_checksum)
@@ -643,12 +647,22 @@ enum xdp_rss_hash_type { XDP_RSS_TYPE_L4_IPV6_SCTP_EX = XDP_RSS_TYPE_L4_IPV6_SCTP | XDP_RSS_L3_DYNHDR, }; +enum xdp_checksum {
- XDP_CHECKSUM_NONE = CHECKSUM_NONE,
- XDP_CHECKSUM_UNNECESSARY = CHECKSUM_UNNECESSARY,
- XDP_CHECKSUM_COMPLETE = CHECKSUM_COMPLETE,
- XDP_CHECKSUM_PARTIAL = CHECKSUM_PARTIAL,
+};
Btw, might be worth mentioning, awhile ago we had settled on a smaller set of exposed types:
https://lore.kernel.org/netdev/20230811161509.19722-13-larysa.zaremba@intel....
Maybe go through the previous postings and check if the arguments are still relevant? (or explain why we want more checksum now)
IHMO the linked proposal reduced the types too much.
IIRC, PARTIAL was removed because it's mostly (or only) a TX feature? So no real need to expose it as an rx hint. And I think empty xdp_csum_status in that proposal might have indicated NONE?
On 25/09/2025 11.30, Lorenzo Bianconi wrote:
+/**
- bpf_xdp_metadata_rx_checksum - Read XDP frame RX checksum.
- @ctx: XDP context pointer.
- @ip_summed: Return value pointer indicating checksum result.
- @cksum_meta: Return value pointer indicating checksum result metadata.
- In case of success, ``ip_summed`` is set to the RX checksum result. Possible
- values are:
- ``XDP_CHECKSUM_NONE``
- ``XDP_CHECKSUM_UNNECESSARY``
- ``XDP_CHECKSUM_COMPLETE``
- ``XDP_CHECKSUM_PARTIAL``
- In case of success, ``cksum_meta`` contains the hw computed checksum value
- for ``XDP_CHECKSUM_COMPLETE`` or the ``csum_level`` for
- ``XDP_CHECKSUM_UNNECESSARY``. It is set to 0 for ``XDP_CHECKSUM_NONE`` and
- ``XDP_CHECKSUM_PARTIAL``.
It is very important that we explain the meaning of XDP_CHECKSUM_NONE. As I hinted in other email, this also covers the non-existing FAIL case.
If the hardware detects a wrong or failed checksum, the code still returns CHECKSUM_NONE. This is where we could consider adding a CHECKSUM_FAIL return value instead. The driver will also return CHECKSUM_NONE for the cases where it cannot parse the packet, and therefor naturally cannot calculate the checksum (given it doesn't know the protocol).
Thus, for CHECKSUM_NONE we don't know if this is because of bad checksum or hardware don't know this packet type. The philosophy is that hardware might be wrong and cannot know of newer protocols, so it is safer to let software handle recalculation of checksum for all negative cases.
Thus, if we want to use this in a (XDP) DDoS filter, then we need to combine RX-hash info about if hardware saw this as an L4 packet or not (see XDP_RSS_L4 / enum xdp_rss_hash_type). If hardware saw this as e.g. XDP_RSS_L4_TCP (or XDP_RSS_L4_UDP) and rx-csum is CHECKSUM_NONE, then we know this was a wrong/failed checksum (given this hardware knows howto csum TCP).
What do people think: Do we leave it as an exercise to the BPF-developer to deduct hardware detected a wrong/failed checksum, as that is possible as described above. Or do we introduce a CHECKSUM_FAILED?
An argument for sticking with CHECKSUM_NONE, is that it will make it much easier to add driver support, as we don't need to deal with any logic changes in the existing code.
- Return:
- Returns 0 on success or ``-errno`` on error.
- ``-EOPNOTSUPP`` : means device driver does not implement kfunc
- ``-ENODATA`` : means no RX-timestamp available for this frame
- */
+__bpf_kfunc int bpf_xdp_metadata_rx_checksum(const struct xdp_md *ctx,
u8 *ip_summed, u32 *cksum_meta)
+{
- return -EOPNOTSUPP;
+}
On Fri, 26 Sep 2025 11:53:25 +0200 Jesper Dangaard Brouer wrote:
- In case of success, ``cksum_meta`` contains the hw computed checksum value
- for ``XDP_CHECKSUM_COMPLETE`` or the ``csum_level`` for
- ``XDP_CHECKSUM_UNNECESSARY``. It is set to 0 for ``XDP_CHECKSUM_NONE`` and
- ``XDP_CHECKSUM_PARTIAL``.
It is very important that we explain the meaning of XDP_CHECKSUM_NONE. As I hinted in other email, this also covers the non-existing FAIL case.
Good idea, perhaps we should add this to the big comment about checksums in skbuff.h and point to that? Avoid the duplication?
On Fri, 26 Sep 2025 11:53:25 +0200 Jesper Dangaard Brouer wrote:
What do people think: Do we leave it as an exercise to the BPF-developer to deduct hardware detected a wrong/failed checksum, as that is possible as described above. Or do we introduce a CHECKSUM_FAILED?
I vote we leave it unless someone has a strong use case for FAILED. Checksumming and dropping packets should be pretty cheap, it's not worth complicating the stack with another option.
Implement xmo_rx_checksum callback in veth driver to report RX checksum result to the eBPF program bounded to the NIC.
Signed-off-by: Lorenzo Bianconi lorenzo@kernel.org --- drivers/net/veth.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
diff --git a/drivers/net/veth.c b/drivers/net/veth.c index a3046142cb8e2658a30041129f8d298e5e0a5822..a4de941edba910a78f79c860730aff7963225ca9 100644 --- a/drivers/net/veth.c +++ b/drivers/net/veth.c @@ -1692,6 +1692,25 @@ static int veth_xdp_rx_vlan_tag(const struct xdp_md *ctx, __be16 *vlan_proto, return err; }
+static int veth_xdp_rx_checksum(const struct xdp_md *ctx, + enum xdp_checksum *ip_summed, + u32 *cksum_meta) +{ + const struct veth_xdp_buff *_ctx = (void *)ctx; + const struct sk_buff *skb = _ctx->skb; + + if (!skb) + return -ENODATA; + + /* For locally generated packets ip_summed is set to + * CHECKSUM_PARTIAL. + */ + *ip_summed = skb->ip_summed; + *cksum_meta = 0; + + return 0; +} + static const struct net_device_ops veth_netdev_ops = { .ndo_init = veth_dev_init, .ndo_open = veth_open, @@ -1717,6 +1736,7 @@ static const struct xdp_metadata_ops veth_xdp_metadata_ops = { .xmo_rx_timestamp = veth_xdp_rx_timestamp, .xmo_rx_hash = veth_xdp_rx_hash, .xmo_rx_vlan_tag = veth_xdp_rx_vlan_tag, + .xmo_rx_checksum = veth_xdp_rx_checksum, };
#define VETH_FEATURES (NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_HW_CSUM | \
Implement xmo_rx_checksum callback in ice driver to report RX checksum result to the eBPF program bounded to the NIC. Introduce ice_get_rx_csum utility routine in order to rx cksum codebase available in ice_rx_csum().
Signed-off-by: Lorenzo Bianconi lorenzo@kernel.org --- drivers/net/ethernet/intel/ice/ice_base.c | 1 + drivers/net/ethernet/intel/ice/ice_txrx.h | 1 + drivers/net/ethernet/intel/ice/ice_txrx_lib.c | 125 +++++++++++++++++--------- 3 files changed, 83 insertions(+), 44 deletions(-)
diff --git a/drivers/net/ethernet/intel/ice/ice_base.c b/drivers/net/ethernet/intel/ice/ice_base.c index 2d35a278c555c526939e509c386959da6ce0cba9..7b1e932c8abc6292173caa36e4e26866d2e956bd 100644 --- a/drivers/net/ethernet/intel/ice/ice_base.c +++ b/drivers/net/ethernet/intel/ice/ice_base.c @@ -695,6 +695,7 @@ static int ice_vsi_cfg_rxq(struct ice_rx_ring *ring) } }
+ ring->pkt_ctx.rxq_flags = ring->flags; xdp_init_buff(&ring->xdp, ice_get_frame_sz(ring), &ring->xdp_rxq); ring->xdp.data = NULL; ring->xdp_ext.pkt_ctx = &ring->pkt_ctx; diff --git a/drivers/net/ethernet/intel/ice/ice_txrx.h b/drivers/net/ethernet/intel/ice/ice_txrx.h index 841a07bfba54ffb4907e765881bee993238cf7b8..cb6bd1e9cb97f0384b86e0f9e64339f68cae0e52 100644 --- a/drivers/net/ethernet/intel/ice/ice_txrx.h +++ b/drivers/net/ethernet/intel/ice/ice_txrx.h @@ -260,6 +260,7 @@ enum ice_rx_dtype { struct ice_pkt_ctx { u64 cached_phctime; __be16 vlan_proto; + u8 rxq_flags; };
struct ice_xdp_buff { diff --git a/drivers/net/ethernet/intel/ice/ice_txrx_lib.c b/drivers/net/ethernet/intel/ice/ice_txrx_lib.c index 45cfaabc41cbeb9b119a0e95547e012e0df1e188..56c3f09c81cefc137c6866cdc546a7c96b7890ac 100644 --- a/drivers/net/ethernet/intel/ice/ice_txrx_lib.c +++ b/drivers/net/ethernet/intel/ice/ice_txrx_lib.c @@ -80,69 +80,46 @@ ice_rx_hash_to_skb(const struct ice_rx_ring *rx_ring, libeth_rx_pt_set_hash(skb, hash, decoded); }
-/** - * ice_rx_gcs - Set generic checksum in skb - * @skb: skb currently being received and modified - * @rx_desc: receive descriptor - */ -static void ice_rx_gcs(struct sk_buff *skb, - const union ice_32b_rx_flex_desc *rx_desc) -{ - const struct ice_32b_rx_flex_desc_nic *desc; - u16 csum; - - desc = (struct ice_32b_rx_flex_desc_nic *)rx_desc; - skb->ip_summed = CHECKSUM_COMPLETE; - csum = (__force u16)desc->raw_csum; - skb->csum = csum_unfold((__force __sum16)swab16(csum)); -} - -/** - * ice_rx_csum - Indicate in skb if checksum is good - * @ring: the ring we care about - * @skb: skb currently being received and modified - * @rx_desc: the receive descriptor - * @ptype: the packet type decoded by hardware - * - * skb->protocol must be set before this function is called - */ static void -ice_rx_csum(struct ice_rx_ring *ring, struct sk_buff *skb, - union ice_32b_rx_flex_desc *rx_desc, u16 ptype) +ice_get_rx_csum(const union ice_32b_rx_flex_desc *rx_desc, u16 ptype, + struct net_device *dev, struct ice_pf *pf, u8 rxq_flag, + enum xdp_checksum *ip_summed, u32 *cksum_meta) { - struct libeth_rx_pt decoded; + struct libeth_rx_pt decoded = libie_rx_pt_parse(ptype); u16 rx_status0, rx_status1; bool ipv4, ipv6;
- /* Start with CHECKSUM_NONE and by default csum_level = 0 */ - skb->ip_summed = CHECKSUM_NONE; - - decoded = libie_rx_pt_parse(ptype); - if (!libeth_rx_pt_has_checksum(ring->netdev, decoded)) - return; + if (!libeth_rx_pt_has_checksum(dev, decoded)) + goto checksum_none;
rx_status0 = le16_to_cpu(rx_desc->wb.status_error0); rx_status1 = le16_to_cpu(rx_desc->wb.status_error1); - - if ((ring->flags & ICE_RX_FLAGS_RING_GCS) && + if ((rxq_flag & ICE_RX_FLAGS_RING_GCS) && rx_desc->wb.rxdid == ICE_RXDID_FLEX_NIC && (decoded.inner_prot == LIBETH_RX_PT_INNER_TCP || decoded.inner_prot == LIBETH_RX_PT_INNER_UDP || decoded.inner_prot == LIBETH_RX_PT_INNER_ICMP)) { - ice_rx_gcs(skb, rx_desc); + const struct ice_32b_rx_flex_desc_nic *desc; + u16 csum; + + desc = (struct ice_32b_rx_flex_desc_nic *)rx_desc; + *ip_summed = XDP_CHECKSUM_COMPLETE; + csum = (__force u16)desc->raw_csum; + *cksum_meta = csum_unfold((__force __sum16)swab16(csum)); return; }
/* check if HW has decoded the packet and checksum */ if (!(rx_status0 & BIT(ICE_RX_FLEX_DESC_STATUS0_L3L4P_S))) - return; + goto checksum_none;
ipv4 = libeth_rx_pt_get_ip_ver(decoded) == LIBETH_RX_PT_OUTER_IPV4; ipv6 = libeth_rx_pt_get_ip_ver(decoded) == LIBETH_RX_PT_OUTER_IPV6;
if (ipv4 && (rx_status0 & (BIT(ICE_RX_FLEX_DESC_STATUS0_XSUM_EIPE_S)))) { - ring->vsi->back->hw_rx_eipe_error++; - return; + if (pf) + pf->hw_rx_eipe_error++; + goto checksum_none; }
if (ipv4 && (rx_status0 & (BIT(ICE_RX_FLEX_DESC_STATUS0_XSUM_IPE_S)))) @@ -167,13 +144,48 @@ ice_rx_csum(struct ice_rx_ring *ring, struct sk_buff *skb, * we are indicating we validated the inner checksum. */ if (decoded.tunnel_type >= LIBETH_RX_PT_TUNNEL_IP_GRENAT) - skb->csum_level = 1; + *cksum_meta = 1;
- skb->ip_summed = CHECKSUM_UNNECESSARY; + *ip_summed = XDP_CHECKSUM_UNNECESSARY; return;
checksum_fail: - ring->vsi->back->hw_csum_rx_error++; + if (pf) + pf->hw_csum_rx_error++; +checksum_none: + *ip_summed = XDP_CHECKSUM_NONE; + *cksum_meta = 0; +} + +/** + * ice_rx_csum - Indicate in skb if checksum is good + * @ring: the ring we care about + * @skb: skb currently being received and modified + * @rx_desc: the receive descriptor + * @ptype: the packet type decoded by hardware + * + * skb->protocol must be set before this function is called + */ +static void +ice_rx_csum(struct ice_rx_ring *ring, struct sk_buff *skb, + union ice_32b_rx_flex_desc *rx_desc, u16 ptype) +{ + enum xdp_checksum ip_summed; + u32 cksum_meta; + + ice_get_rx_csum(rx_desc, ptype, ring->netdev, ring->vsi->back, + ring->flags, &ip_summed, &cksum_meta); + switch (ip_summed) { + case XDP_CHECKSUM_UNNECESSARY: + skb->csum_level = cksum_meta; + break; + case XDP_CHECKSUM_COMPLETE: + skb->csum = cksum_meta; + break; + default: + break; + } + skb->ip_summed = ip_summed; }
/** @@ -555,6 +567,30 @@ static int ice_xdp_rx_hash(const struct xdp_md *ctx, u32 *hash, return 0; }
+/** + * ice_xdp_rx_checksum - RX checksum XDP hint handler + * @ctx: XDP buff pointer + * @ip_summed: RX checksum result destination address + * @cksum_meta: XDP RX checksum metadata destination address + * + * Copy RX checksum result (if available) and its metadata to the + * destination address. + */ +static int ice_xdp_rx_checksum(const struct xdp_md *ctx, + enum xdp_checksum *ip_summed, + u32 *cksum_meta) +{ + const struct ice_xdp_buff *xdp_ext = (void *)ctx; + const union ice_32b_rx_flex_desc *rx_desc = xdp_ext->eop_desc; + + ice_get_rx_csum(rx_desc, ice_get_ptype(rx_desc), + xdp_ext->xdp_buff.rxq->dev, NULL, + xdp_ext->pkt_ctx->rxq_flags, + ip_summed, cksum_meta); + + return 0; +} + /** * ice_xdp_rx_vlan_tag - VLAN tag XDP hint handler * @ctx: XDP buff pointer @@ -584,4 +620,5 @@ const struct xdp_metadata_ops ice_xdp_md_ops = { .xmo_rx_timestamp = ice_xdp_rx_hw_ts, .xmo_rx_hash = ice_xdp_rx_hash, .xmo_rx_vlan_tag = ice_xdp_rx_vlan_tag, + .xmo_rx_checksum = ice_xdp_rx_checksum, };
Introduce support to xdp_metadata selftest for bpf_xdp_metadata_rx_checksum kfunc.
Signed-off-by: Lorenzo Bianconi lorenzo@kernel.org --- tools/testing/selftests/bpf/prog_tests/xdp_metadata.c | 7 +++++++ tools/testing/selftests/bpf/progs/xdp_metadata.c | 1 + tools/testing/selftests/bpf/xdp_metadata.h | 9 +++++++++ 3 files changed, 17 insertions(+)
diff --git a/tools/testing/selftests/bpf/prog_tests/xdp_metadata.c b/tools/testing/selftests/bpf/prog_tests/xdp_metadata.c index 19f92affc2daa23fdd869554e7a0475b86350a4f..707c98e664745763b01b638a537a797211ded4e1 100644 --- a/tools/testing/selftests/bpf/prog_tests/xdp_metadata.c +++ b/tools/testing/selftests/bpf/prog_tests/xdp_metadata.c @@ -258,6 +258,7 @@ static void refill_rx(struct xsk *xsk, __u64 addr)
static int verify_xsk_metadata(struct xsk *xsk, bool sent_from_af_xdp) { + __u8 ip_summed = sent_from_af_xdp ? XDP_CHECKSUM_NONE : XDP_CHECKSUM_PARTIAL; const struct xdp_desc *rx_desc; struct pollfd fds = {}; struct xdp_meta *meta; @@ -310,6 +311,12 @@ static int verify_xsk_metadata(struct xsk *xsk, bool sent_from_af_xdp) if (!ASSERT_NEQ(meta->rx_hash, 0, "rx_hash")) return -1;
+ if (!ASSERT_EQ(meta->ip_summed, ip_summed, "rx_ip_summed")) + return -1; + + if (!ASSERT_EQ(meta->cksum_meta, 0, "rx_cksum_meta")) + return -1; + if (!sent_from_af_xdp) { if (!ASSERT_NEQ(meta->rx_hash_type & XDP_RSS_TYPE_L4, 0, "rx_hash_type")) return -1; diff --git a/tools/testing/selftests/bpf/progs/xdp_metadata.c b/tools/testing/selftests/bpf/progs/xdp_metadata.c index 09bb8a038d528cf26c5b314cc927915ac2796bf0..ef6a5584a1876a3c47440f21dca927ec783469dc 100644 --- a/tools/testing/selftests/bpf/progs/xdp_metadata.c +++ b/tools/testing/selftests/bpf/progs/xdp_metadata.c @@ -98,6 +98,7 @@ int rx(struct xdp_md *ctx) bpf_xdp_metadata_rx_hash(ctx, &meta->rx_hash, &meta->rx_hash_type); bpf_xdp_metadata_rx_vlan_tag(ctx, &meta->rx_vlan_proto, &meta->rx_vlan_tci); + bpf_xdp_metadata_rx_checksum(ctx, &meta->ip_summed, &meta->cksum_meta);
return bpf_redirect_map(&xsk, ctx->rx_queue_index, XDP_PASS); } diff --git a/tools/testing/selftests/bpf/xdp_metadata.h b/tools/testing/selftests/bpf/xdp_metadata.h index 87318ad1117a1d677af121f11778178532e2a562..a16f71488a34e6df23fec6dd7dde7b7989774618 100644 --- a/tools/testing/selftests/bpf/xdp_metadata.h +++ b/tools/testing/selftests/bpf/xdp_metadata.h @@ -30,6 +30,11 @@ enum xdp_meta_field { XDP_META_FIELD_VLAN_TAG = BIT(2), };
+#define XDP_CHECKSUM_NONE 0 +#define XDP_CHECKSUM_UNNECESSARY 1 +#define XDP_CHECKSUM_COMPLETE 2 +#define XDP_CHECKSUM_PARTIAL 3 + struct xdp_meta { union { __u64 rx_timestamp; @@ -48,5 +53,9 @@ struct xdp_meta { }; __s32 rx_vlan_tag_err; }; + struct { + __u8 ip_summed; + __u32 cksum_meta; + }; enum xdp_meta_field hint_valid; };
Introduce the capability to dump HW rx checksum in xdp_hw_metadat program via bpf_xdp_metadata_rx_checksum() kfunc.
Signed-off-by: Lorenzo Bianconi lorenzo@kernel.org --- .../testing/selftests/bpf/progs/xdp_hw_metadata.c | 7 ++++++ tools/testing/selftests/bpf/xdp_hw_metadata.c | 27 ++++++++++++++++++++++ tools/testing/selftests/bpf/xdp_metadata.h | 10 +++++--- 3 files changed, 41 insertions(+), 3 deletions(-)
diff --git a/tools/testing/selftests/bpf/progs/xdp_hw_metadata.c b/tools/testing/selftests/bpf/progs/xdp_hw_metadata.c index 330ece2eabdb454da2bb2cbd297d2b2dd6efddc0..dc62d572e3ac6e2ef173b330da515757ea543415 100644 --- a/tools/testing/selftests/bpf/progs/xdp_hw_metadata.c +++ b/tools/testing/selftests/bpf/progs/xdp_hw_metadata.c @@ -110,6 +110,13 @@ int rx(struct xdp_md *ctx) else meta->hint_valid |= XDP_META_FIELD_VLAN_TAG;
+ err = bpf_xdp_metadata_rx_checksum(ctx, &meta->ip_summed, + &meta->cksum_meta); + if (err) + meta->rx_cksum_err = err; + else + meta->hint_valid |= XDP_META_FIELD_CHECKSUM; + __sync_add_and_fetch(&pkts_redir, 1); return bpf_redirect_map(&xsk, ctx->rx_queue_index, XDP_PASS); } diff --git a/tools/testing/selftests/bpf/xdp_hw_metadata.c b/tools/testing/selftests/bpf/xdp_hw_metadata.c index 3d8de0d4c96a7afdf5f60b2fdff73c22b876ce54..c8c25ef383b1fe5613540b09a52bcdc264e316b4 100644 --- a/tools/testing/selftests/bpf/xdp_hw_metadata.c +++ b/tools/testing/selftests/bpf/xdp_hw_metadata.c @@ -219,6 +219,28 @@ static void print_vlan_tci(__u16 tag) printf("PCP=%u, DEI=%d, VID=0x%X\n", pcp, dei, vlan_id); }
+static void print_rx_cksum(__u8 ip_summed, __u32 cksum_meta) +{ + const char *cksum = "CHECKSUM_NONE"; + + switch (ip_summed) { + case XDP_CHECKSUM_UNNECESSARY: + cksum = "CHECKSUM_UNNECESSARY"; + break; + case XDP_CHECKSUM_COMPLETE: + cksum = "CHECKSUM_COMPLETE"; + break; + case XDP_CHECKSUM_PARTIAL: + cksum = "CHECKSUM_PARTIAL"; + break; + case XDP_CHECKSUM_NONE: + default: + break; + } + + printf("rx-cksum: %s, csum_meta=0x%x\n", cksum, cksum_meta); +} + static void verify_xdp_metadata(void *data, clockid_t clock_id) { struct xdp_meta *meta; @@ -254,6 +276,11 @@ static void verify_xdp_metadata(void *data, clockid_t clock_id) printf("No rx_vlan_tci or rx_vlan_proto, err=%d\n", meta->rx_vlan_tag_err); } + + if (meta->hint_valid & XDP_META_FIELD_CHECKSUM) + print_rx_cksum(meta->ip_summed, meta->cksum_meta); + else + printf("No rx_chsum, err=%d\n", meta->rx_cksum_err); }
static void verify_skb_metadata(int fd) diff --git a/tools/testing/selftests/bpf/xdp_metadata.h b/tools/testing/selftests/bpf/xdp_metadata.h index a16f71488a34e6df23fec6dd7dde7b7989774618..b7ab112da8032405ec0e3d699499f4a9c5cb91dc 100644 --- a/tools/testing/selftests/bpf/xdp_metadata.h +++ b/tools/testing/selftests/bpf/xdp_metadata.h @@ -28,6 +28,7 @@ enum xdp_meta_field { XDP_META_FIELD_TS = BIT(0), XDP_META_FIELD_RSS = BIT(1), XDP_META_FIELD_VLAN_TAG = BIT(2), + XDP_META_FIELD_CHECKSUM = BIT(3), };
#define XDP_CHECKSUM_NONE 0 @@ -53,9 +54,12 @@ struct xdp_meta { }; __s32 rx_vlan_tag_err; }; - struct { - __u8 ip_summed; - __u32 cksum_meta; + union { + struct { + __u8 ip_summed; + __u32 cksum_meta; + }; + __s32 rx_cksum_err; }; enum xdp_meta_field hint_valid; };
On Thu, Sep 25, 2025 at 11:30 AM +02, Lorenzo Bianconi wrote:
Introduce bpf_xdp_metadata_rx_checksum() kfunc in order to load the HW RX cheksum results in the eBPF program binded to the NIC. Implement xmo_rx_checksum callback for veth and ice drivers.
What are going to do with HW RX checksum once XDP prog can access it?
On Thu, Sep 25, 2025 at 11:30 AM +02, Lorenzo Bianconi wrote:
Introduce bpf_xdp_metadata_rx_checksum() kfunc in order to load the HW RX cheksum results in the eBPF program binded to the NIC. Implement xmo_rx_checksum callback for veth and ice drivers.
What are going to do with HW RX checksum once XDP prog can access it?
Hi Jakub,
I guess there are multiple use-cases for bpf_xdp_metadata_rx_checksum() kfunc. The first the I have in mind is when packets are received by an af_xdp application. In this case I think we currently do not have any way to check if the packet checksum is correct, right? I think Jesper has other use-cases in mind, I will let him comment here.
Regards, Lorenzo
On Thu, Sep 25, 2025 at 12:39 PM +02, Lorenzo Bianconi wrote:
On Thu, Sep 25, 2025 at 11:30 AM +02, Lorenzo Bianconi wrote:
Introduce bpf_xdp_metadata_rx_checksum() kfunc in order to load the HW RX cheksum results in the eBPF program binded to the NIC. Implement xmo_rx_checksum callback for veth and ice drivers.
What are going to do with HW RX checksum once XDP prog can access it?
I guess there are multiple use-cases for bpf_xdp_metadata_rx_checksum() kfunc. The first the I have in mind is when packets are received by an af_xdp application. In this case I think we currently do not have any way to check if the packet checksum is correct, right? I think Jesper has other use-cases in mind, I will let him comment here.
Can you share more details on what the AF_XDP application would that info?
Regarding the use cases that Jesper is trying to unlock, as things stand we don't have a way, or an agreement on how to inject/propagate even the already existing NIC hints back into the network stack.
Hence my question - why do we want to expose another NIC hint to XDP that we can't consume in any useful way yet?
Shouldn't we first figure out how we're planning to re-inject that info into the stack?
On 25/09/2025 12.58, Jakub Sitnicki wrote:
On Thu, Sep 25, 2025 at 12:39 PM +02, Lorenzo Bianconi wrote:
On Thu, Sep 25, 2025 at 11:30 AM +02, Lorenzo Bianconi wrote:
Introduce bpf_xdp_metadata_rx_checksum() kfunc in order to load the HW RX cheksum results in the eBPF program binded to the NIC. Implement xmo_rx_checksum callback for veth and ice drivers.
What are going to do with HW RX checksum once XDP prog can access it?
I guess there are multiple use-cases for bpf_xdp_metadata_rx_checksum() kfunc. The first the I have in mind is when packets are received by an af_xdp application. In this case I think we currently do not have any way to check if the packet checksum is correct, right? I think Jesper has other use-cases in mind, I will let him comment here.
Can you share more details on what the AF_XDP application would that info?
Today the AF_XDP application need to verify the packet checksum, as it gets raw xdp_frame packets directly from hardware (no layer in-between checked this). Getting the RX-checksum validation from hardware info will be very useful for AF_XDP, as it can avoid doing this in software.
Regarding the use cases that Jesper is trying to unlock, as things stand we don't have a way, or an agreement on how to inject/propagate even the already existing NIC hints back into the network stack.
This patchset have its own merits and shouldn't be connected with my use-case of (optionally) including hardware offloads in the xdp_frame. Sure, I obviously also want this RX-checksum added, but this patchset is useful on it's own.
Hence my question - why do we want to expose another NIC hint to XDP that we can't consume in any useful way yet?
Well here *are* useful ways to use this RX-checksum info on its own. See my explanation of the DDoS use-case here[1] in other email.
Cloudflare actually also have a concrete use-case for needing this. Our XDP based Unimog[2] load-balancer (and DDoS) encapsulate all packets when they are XDP_TX forwarded. The encap receiving NIC lacking inner-packet checksum validation make us loose this hardware offload. This would allow us to save some checksum validation or even just DDOS drop based on hardware checksum validation prior to encap (as in [1]).
--Jesper
[1] https://lore.kernel.org/all/0608935c-1c1c-4374-a058-bc78d114c630@kernel.org/
[2] https://blog.cloudflare.com/unimog-cloudflares-edge-load-balancer/
On Fri, Sep 26, 2025 at 01:45 PM +02, Jesper Dangaard Brouer wrote:
On 25/09/2025 12.58, Jakub Sitnicki wrote:
On Thu, Sep 25, 2025 at 12:39 PM +02, Lorenzo Bianconi wrote:
On Thu, Sep 25, 2025 at 11:30 AM +02, Lorenzo Bianconi wrote:
Introduce bpf_xdp_metadata_rx_checksum() kfunc in order to load the HW RX cheksum results in the eBPF program binded to the NIC. Implement xmo_rx_checksum callback for veth and ice drivers.
What are going to do with HW RX checksum once XDP prog can access it?
I guess there are multiple use-cases for bpf_xdp_metadata_rx_checksum() kfunc. The first the I have in mind is when packets are received by an af_xdp application. In this case I think we currently do not have any way to check if the packet checksum is correct, right? I think Jesper has other use-cases in mind, I will let him comment here.
Can you share more details on what the AF_XDP application would that info?
Today the AF_XDP application need to verify the packet checksum, as it gets raw xdp_frame packets directly from hardware (no layer in-between checked this). Getting the RX-checksum validation from hardware info will be very useful for AF_XDP, as it can avoid doing this in software.
Regarding the use cases that Jesper is trying to unlock, as things stand we don't have a way, or an agreement on how to inject/propagate even the already existing NIC hints back into the network stack.
This patchset have its own merits and shouldn't be connected with my use-case of (optionally) including hardware offloads in the xdp_frame. Sure, I obviously also want this RX-checksum added, but this patchset is useful on it's own.
Hence my question - why do we want to expose another NIC hint to XDP that we can't consume in any useful way yet?
Well here *are* useful ways to use this RX-checksum info on its own. See my explanation of the DDoS use-case here[1] in other email.
Cloudflare actually also have a concrete use-case for needing this. Our XDP based Unimog[2] load-balancer (and DDoS) encapsulate all packets when they are XDP_TX forwarded. The encap receiving NIC lacking inner-packet checksum validation make us loose this hardware offload. This would allow us to save some checksum validation or even just DDOS drop based on hardware checksum validation prior to encap (as in [1]).
Thanks for filling in the blanks, Jesper. That's the context that I was missing.
Lorenzo, this motivaton seems worth including in the cover letter.
On Fri, Sep 26, 2025 at 01:45 PM +02, Jesper Dangaard Brouer wrote:
On 25/09/2025 12.58, Jakub Sitnicki wrote:
On Thu, Sep 25, 2025 at 12:39 PM +02, Lorenzo Bianconi wrote:
On Thu, Sep 25, 2025 at 11:30 AM +02, Lorenzo Bianconi wrote:
Introduce bpf_xdp_metadata_rx_checksum() kfunc in order to load the HW RX cheksum results in the eBPF program binded to the NIC. Implement xmo_rx_checksum callback for veth and ice drivers.
What are going to do with HW RX checksum once XDP prog can access it?
I guess there are multiple use-cases for bpf_xdp_metadata_rx_checksum() kfunc. The first the I have in mind is when packets are received by an af_xdp application. In this case I think we currently do not have any way to check if the packet checksum is correct, right? I think Jesper has other use-cases in mind, I will let him comment here.
Can you share more details on what the AF_XDP application would that info?
Today the AF_XDP application need to verify the packet checksum, as it gets raw xdp_frame packets directly from hardware (no layer in-between checked this). Getting the RX-checksum validation from hardware info will be very useful for AF_XDP, as it can avoid doing this in software.
Regarding the use cases that Jesper is trying to unlock, as things stand we don't have a way, or an agreement on how to inject/propagate even the already existing NIC hints back into the network stack.
This patchset have its own merits and shouldn't be connected with my use-case of (optionally) including hardware offloads in the xdp_frame. Sure, I obviously also want this RX-checksum added, but this patchset is useful on it's own.
Hence my question - why do we want to expose another NIC hint to XDP that we can't consume in any useful way yet?
Well here *are* useful ways to use this RX-checksum info on its own. See my explanation of the DDoS use-case here[1] in other email.
Cloudflare actually also have a concrete use-case for needing this. Our XDP based Unimog[2] load-balancer (and DDoS) encapsulate all packets when they are XDP_TX forwarded. The encap receiving NIC lacking inner-packet checksum validation make us loose this hardware offload. This would allow us to save some checksum validation or even just DDOS drop based on hardware checksum validation prior to encap (as in [1]).
Thanks for filling in the blanks, Jesper. That's the context that I was missing.
Lorenzo, this motivaton seems worth including in the cover letter.
ack, I will do.
Regards, Lorenzo
linux-kselftest-mirror@lists.linaro.org