{"id":2196365,"url":"http://patchwork.ozlabs.org/api/1.0/patches/2196365/?format=json","project":{"id":46,"url":"http://patchwork.ozlabs.org/api/1.0/projects/46/?format=json","name":"Intel Wired Ethernet development","link_name":"intel-wired-lan","list_id":"intel-wired-lan.osuosl.org","list_email":"intel-wired-lan@osuosl.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20260213-bpf-xdp-meta-rxcksum-v2-3-a82c4802afbe@kernel.org>","date":"2026-02-13T15:26:22","name":"[bpf-next,v2,3/5] net: ice: Add xmo_rx_checksum callback","commit_ref":null,"pull_url":null,"state":"handled-elsewhere","archived":false,"hash":"04f03faab09242978370781a441b396985d10cd9","submitter":{"id":76007,"url":"http://patchwork.ozlabs.org/api/1.0/people/76007/?format=json","name":"Lorenzo Bianconi","email":"lorenzo@kernel.org"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20260213-bpf-xdp-meta-rxcksum-v2-3-a82c4802afbe@kernel.org/mbox/","series":[{"id":492113,"url":"http://patchwork.ozlabs.org/api/1.0/series/492113/?format=json","date":"2026-02-13T15:26:20","name":"Add the the capability to load HW RX checsum in eBPF programs","version":2,"mbox":"http://patchwork.ozlabs.org/series/492113/mbox/"}],"check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2196365/checks/","tags":{},"headers":{"Return-Path":"<intel-wired-lan-bounces@osuosl.org>","X-Original-To":["incoming@patchwork.ozlabs.org","intel-wired-lan@lists.osuosl.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","intel-wired-lan@lists.osuosl.org"],"Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=osuosl.org header.i=@osuosl.org header.a=rsa-sha256\n header.s=default header.b=G+Hj608n;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=osuosl.org\n (client-ip=2605:bc80:3010::138; helo=smtp1.osuosl.org;\n envelope-from=intel-wired-lan-bounces@osuosl.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from smtp1.osuosl.org (smtp1.osuosl.org [IPv6:2605:bc80:3010::138])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fCGHk5PPlz1xxM\n\tfor <incoming@patchwork.ozlabs.org>; Sat, 14 Feb 2026 02:27:14 +1100 (AEDT)","from localhost (localhost [127.0.0.1])\n\tby smtp1.osuosl.org (Postfix) with ESMTP id 08D53844B0;\n\tFri, 13 Feb 2026 15:27:13 +0000 (UTC)","from smtp1.osuosl.org ([127.0.0.1])\n by localhost (smtp1.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id eGrftIHDSG18; Fri, 13 Feb 2026 15:27:11 +0000 (UTC)","from lists1.osuosl.org (lists1.osuosl.org [140.211.166.142])\n\tby smtp1.osuosl.org (Postfix) with ESMTP id 866FC844AF;\n\tFri, 13 Feb 2026 15:27:11 +0000 (UTC)","from smtp3.osuosl.org (smtp3.osuosl.org [IPv6:2605:bc80:3010::136])\n by lists1.osuosl.org (Postfix) with ESMTP id EB233EC\n for <intel-wired-lan@lists.osuosl.org>; Fri, 13 Feb 2026 15:27:09 +0000 (UTC)","from localhost (localhost [127.0.0.1])\n by smtp3.osuosl.org (Postfix) with ESMTP id E5793611FB\n for <intel-wired-lan@lists.osuosl.org>; Fri, 13 Feb 2026 15:27:09 +0000 (UTC)","from smtp3.osuosl.org ([127.0.0.1])\n by localhost (smtp3.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id n6GEjUqz9fRp for <intel-wired-lan@lists.osuosl.org>;\n Fri, 13 Feb 2026 15:27:09 +0000 (UTC)","from sea.source.kernel.org (sea.source.kernel.org\n [IPv6:2600:3c0a:e001:78e:0:1991:8:25])\n by smtp3.osuosl.org (Postfix) with ESMTPS id 30968607E0\n for <intel-wired-lan@lists.osuosl.org>; Fri, 13 Feb 2026 15:27:08 +0000 (UTC)","from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58])\n by sea.source.kernel.org (Postfix) with ESMTP id 84ADF440F9;\n Fri, 13 Feb 2026 15:27:08 +0000 (UTC)","by smtp.kernel.org (Postfix) with ESMTPSA id D9FA5C116C6;\n Fri, 13 Feb 2026 15:27:07 +0000 (UTC)"],"X-Virus-Scanned":["amavis at osuosl.org","amavis at osuosl.org"],"X-Comment":"SPF check N/A for local connections - client-ip=140.211.166.142;\n helo=lists1.osuosl.org; envelope-from=intel-wired-lan-bounces@osuosl.org;\n receiver=<UNKNOWN> ","DKIM-Filter":["OpenDKIM Filter v2.11.0 smtp1.osuosl.org 866FC844AF","OpenDKIM Filter v2.11.0 smtp3.osuosl.org 30968607E0"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=osuosl.org;\n\ts=default; t=1770996431;\n\tbh=D4LKZUvsThHEX6gjEDccjf19jgwypwMXzItxtoiq+pw=;\n\th=From:Date:References:In-Reply-To:To:Cc:Subject:List-Id:\n\t List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe:\n\t From;\n\tb=G+Hj608nF7wczmmdl9i2KTd+HxnC9bBFC/VvmEyf5bBOCw9PpKdLHYz1QET/uOabh\n\t vHrJcfX6j1uB9TLQlrA7pihduw3PYLwVjyuWpjNiSjcoD6X59RI1lPiK8p2X1sbdhl\n\t WdKNHei03/UmIuXdOpvy5hvYwM1lFzLPBi1LlPpeT7vE/gn/7ZxMTmTRGQ5jyiz86f\n\t jeh8qH4DXf+rLmyxreOE6OrN4KhViZo3ji7fgyjbEk2xTU2fE0s/btA3W1cqFlFg1e\n\t ubVYDRHJkYg+SUFof37qoj64sYJSVYKl/KcblrJ6SNkY/eecsxqKY38t2M5sZr+od5\n\t j5dT0+w+Rez8Q==","Received-SPF":"Pass (mailfrom) identity=mailfrom;\n client-ip=2600:3c0a:e001:78e:0:1991:8:25; helo=sea.source.kernel.org;\n envelope-from=lorenzo@kernel.org; receiver=<UNKNOWN>","DMARC-Filter":"OpenDMARC Filter v1.4.2 smtp3.osuosl.org 30968607E0","From":"Lorenzo Bianconi <lorenzo@kernel.org>","Date":"Fri, 13 Feb 2026 16:26:22 +0100","MIME-Version":"1.0","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"7bit","Message-Id":"<20260213-bpf-xdp-meta-rxcksum-v2-3-a82c4802afbe@kernel.org>","References":"<20260213-bpf-xdp-meta-rxcksum-v2-0-a82c4802afbe@kernel.org>","In-Reply-To":"<20260213-bpf-xdp-meta-rxcksum-v2-0-a82c4802afbe@kernel.org>","To":"Donald Hunter <donald.hunter@gmail.com>,\n Jakub Kicinski <kuba@kernel.org>, \"David S. Miller\" <davem@davemloft.net>,\n Eric Dumazet <edumazet@google.com>, Paolo Abeni <pabeni@redhat.com>,\n Simon Horman <horms@kernel.org>, Alexei Starovoitov <ast@kernel.org>,\n Daniel Borkmann <daniel@iogearbox.net>,\n Jesper Dangaard Brouer <hawk@kernel.org>,\n John Fastabend <john.fastabend@gmail.com>,\n Stanislav Fomichev <sdf@fomichev.me>, Andrew Lunn <andrew+netdev@lunn.ch>,\n Tony Nguyen <anthony.l.nguyen@intel.com>,\n Przemek Kitszel <przemyslaw.kitszel@intel.com>,\n Alexander Lobakin <aleksander.lobakin@intel.com>,\n Andrii Nakryiko <andrii@kernel.org>,\n Martin KaFai Lau <martin.lau@linux.dev>,\n Eduard Zingerman <eddyz87@gmail.com>, Song Liu <song@kernel.org>,\n Yonghong Song <yonghong.song@linux.dev>, KP Singh <kpsingh@kernel.org>,\n Hao Luo <haoluo@google.com>, Jiri Olsa <jolsa@kernel.org>,\n Shuah Khan <shuah@kernel.org>,\n Maciej Fijalkowski <maciej.fijalkowski@intel.com>","Cc":"Jakub Sitnicki <jakub@cloudflare.com>, netdev@vger.kernel.org,\n bpf@vger.kernel.org, intel-wired-lan@lists.osuosl.org,\n linux-kselftest@vger.kernel.org, Lorenzo Bianconi <lorenzo@kernel.org>","X-Mailer":"b4 0.14.2","X-Mailman-Original-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple;\n d=kernel.org; s=k20201202; t=1770996428;\n bh=nlLq2xy0y7+YVfCtc0NLP1rkpfOWfsf+4065jFl7AeA=;\n h=From:Date:Subject:References:In-Reply-To:To:Cc:From;\n b=Cf+nDXWG+S2iiIHpPdoYNiVPhZcHL/CvTXuxSQHDMrXkR1s07vPlhVEJE9z1uspNX\n q6yzXZKkKEk7TukKInjFTQ4XQq+OBltJmRogz7M3y7jcYJDmbZ4DbviEVShw4QYLak\n H6chEE6QReZPCS/WK/N7PZ+ugZ3/CCkUZZBG1fkxgve9ZTDagxg1jh37AQekLTAthI\n oVH/VuX9u5vFCLFVdpKPz1P5oZ6ILMh4lhXFO3rotb+pFHF09j4FmF1LMnQyXPmDqk\n el3lSRC1bQFH+32fMjq4RO1S8zREisrvD41QmlhhVOD7jJKrKUzXWwhhBoLzKSht0u\n +amk06BivSJcQ==","X-Mailman-Original-Authentication-Results":["smtp3.osuosl.org;\n dmarc=pass (p=quarantine dis=none)\n header.from=kernel.org","smtp3.osuosl.org;\n dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.a=rsa-sha256 header.s=k20201202 header.b=Cf+nDXWG"],"Subject":"[Intel-wired-lan] [PATCH bpf-next v2 3/5] net: ice: Add\n xmo_rx_checksum callback","X-BeenThere":"intel-wired-lan@osuosl.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"Intel Wired Ethernet Linux Kernel Driver Development\n <intel-wired-lan.osuosl.org>","List-Unsubscribe":"<https://lists.osuosl.org/mailman/options/intel-wired-lan>,\n <mailto:intel-wired-lan-request@osuosl.org?subject=unsubscribe>","List-Archive":"<http://lists.osuosl.org/pipermail/intel-wired-lan/>","List-Post":"<mailto:intel-wired-lan@osuosl.org>","List-Help":"<mailto:intel-wired-lan-request@osuosl.org?subject=help>","List-Subscribe":"<https://lists.osuosl.org/mailman/listinfo/intel-wired-lan>,\n <mailto:intel-wired-lan-request@osuosl.org?subject=subscribe>","Errors-To":"intel-wired-lan-bounces@osuosl.org","Sender":"\"Intel-wired-lan\" <intel-wired-lan-bounces@osuosl.org>"},"content":"Implement xmo_rx_checksum callback in ice driver to report RX checksum\nresult to the eBPF program bounded to the NIC.\nIntroduce ice_get_rx_csum utility routine in order to rx cksum codebase\navailable in ice_rx_csum().\n\nSigned-off-by: Lorenzo Bianconi <lorenzo@kernel.org>\n---\n drivers/net/ethernet/intel/ice/ice_txrx_lib.c | 118 +++++++++++++++++---------\n 1 file changed, 76 insertions(+), 42 deletions(-)","diff":"diff --git a/drivers/net/ethernet/intel/ice/ice_txrx_lib.c b/drivers/net/ethernet/intel/ice/ice_txrx_lib.c\nindex 956da38d63b0032db238325dcff818bbd99478e9..65b34b29f396560739fc58293496a5e9ddf09b53 100644\n--- a/drivers/net/ethernet/intel/ice/ice_txrx_lib.c\n+++ b/drivers/net/ethernet/intel/ice/ice_txrx_lib.c\n@@ -81,69 +81,47 @@ ice_rx_hash_to_skb(const struct ice_rx_ring *rx_ring,\n \t\tlibeth_rx_pt_set_hash(skb, hash, decoded);\n }\n \n-/**\n- * ice_rx_gcs - Set generic checksum in skb\n- * @skb: skb currently being received and modified\n- * @rx_desc: receive descriptor\n- */\n-static void ice_rx_gcs(struct sk_buff *skb,\n-\t\t       const union ice_32b_rx_flex_desc *rx_desc)\n-{\n-\tconst struct ice_32b_rx_flex_desc_nic *desc;\n-\tu16 csum;\n-\n-\tdesc = (struct ice_32b_rx_flex_desc_nic *)rx_desc;\n-\tskb->ip_summed = CHECKSUM_COMPLETE;\n-\tcsum = (__force u16)desc->raw_csum;\n-\tskb->csum = csum_unfold((__force __sum16)swab16(csum));\n-}\n-\n-/**\n- * ice_rx_csum - Indicate in skb if checksum is good\n- * @ring: the ring we care about\n- * @skb: skb currently being received and modified\n- * @rx_desc: the receive descriptor\n- * @ptype: the packet type decoded by hardware\n- *\n- * skb->protocol must be set before this function is called\n- */\n static void\n-ice_rx_csum(struct ice_rx_ring *ring, struct sk_buff *skb,\n-\t    union ice_32b_rx_flex_desc *rx_desc, u16 ptype)\n+ice_get_rx_csum(const union ice_32b_rx_flex_desc *rx_desc, u16 ptype,\n+\t\tstruct ice_rx_ring *ring, enum xdp_checksum *ip_summed,\n+\t\tu32 *cksum_meta)\n {\n-\tstruct libeth_rx_pt decoded;\n+\tstruct libeth_rx_pt decoded = libie_rx_pt_parse(ptype);\n \tu16 rx_status0, rx_status1;\n \tbool ipv4, ipv6;\n \n-\t/* Start with CHECKSUM_NONE and by default csum_level = 0 */\n-\tskb->ip_summed = CHECKSUM_NONE;\n-\n-\tdecoded = libie_rx_pt_parse(ptype);\n \tif (!libeth_rx_pt_has_checksum(ring->netdev, decoded))\n-\t\treturn;\n+\t\tgoto checksum_none;\n \n \trx_status0 = le16_to_cpu(rx_desc->wb.status_error0);\n \trx_status1 = le16_to_cpu(rx_desc->wb.status_error1);\n-\n \tif ((ring->flags & ICE_RX_FLAGS_RING_GCS) &&\n \t    rx_desc->wb.rxdid == ICE_RXDID_FLEX_NIC &&\n \t    (decoded.inner_prot == LIBETH_RX_PT_INNER_TCP ||\n \t     decoded.inner_prot == LIBETH_RX_PT_INNER_UDP ||\n \t     decoded.inner_prot == LIBETH_RX_PT_INNER_ICMP)) {\n-\t\tice_rx_gcs(skb, rx_desc);\n+\t\tconst struct ice_32b_rx_flex_desc_nic *desc;\n+\t\t__wsum wcsum;\n+\t\tu16 csum;\n+\n+\t\tdesc = (struct ice_32b_rx_flex_desc_nic *)rx_desc;\n+\t\t*ip_summed = XDP_CHECKSUM_COMPLETE;\n+\t\tcsum = (__force u16)desc->raw_csum;\n+\t\twcsum = csum_unfold((__force __sum16)swab16(csum));\n+\t\t*cksum_meta = (__force u32)wcsum;\n \t\treturn;\n \t}\n \n \t/* check if HW has decoded the packet and checksum */\n \tif (!(rx_status0 & BIT(ICE_RX_FLEX_DESC_STATUS0_L3L4P_S)))\n-\t\treturn;\n+\t\tgoto checksum_none;\n \n \tipv4 = libeth_rx_pt_get_ip_ver(decoded) == LIBETH_RX_PT_OUTER_IPV4;\n \tipv6 = libeth_rx_pt_get_ip_ver(decoded) == LIBETH_RX_PT_OUTER_IPV6;\n \n \tif (ipv4 && (rx_status0 & (BIT(ICE_RX_FLEX_DESC_STATUS0_XSUM_EIPE_S)))) {\n \t\tring->vsi->back->hw_rx_eipe_error++;\n-\t\treturn;\n+\t\tgoto checksum_none;\n \t}\n \n \tif (ipv4 && (rx_status0 & (BIT(ICE_RX_FLEX_DESC_STATUS0_XSUM_IPE_S))))\n@@ -167,14 +145,45 @@ ice_rx_csum(struct ice_rx_ring *ring, struct sk_buff *skb,\n \t * we need to bump the checksum level by 1 to reflect the fact that\n \t * we are indicating we validated the inner checksum.\n \t */\n-\tif (decoded.tunnel_type >= LIBETH_RX_PT_TUNNEL_IP_GRENAT)\n-\t\tskb->csum_level = 1;\n-\n-\tskb->ip_summed = CHECKSUM_UNNECESSARY;\n+\t*cksum_meta = decoded.tunnel_type >= LIBETH_RX_PT_TUNNEL_IP_GRENAT;\n+\t*ip_summed = XDP_CHECKSUM_UNNECESSARY;\n \treturn;\n \n checksum_fail:\n \tring->vsi->back->hw_csum_rx_error++;\n+checksum_none:\n+\t*ip_summed = XDP_CHECKSUM_NONE;\n+\t*cksum_meta = 0;\n+}\n+\n+/**\n+ * ice_rx_csum - Indicate in skb if checksum is good\n+ * @ring: the ring we care about\n+ * @skb: skb currently being received and modified\n+ * @rx_desc: the receive descriptor\n+ * @ptype: the packet type decoded by hardware\n+ *\n+ * skb->protocol must be set before this function is called\n+ */\n+static void\n+ice_rx_csum(struct ice_rx_ring *ring, struct sk_buff *skb,\n+\t    union ice_32b_rx_flex_desc *rx_desc, u16 ptype)\n+{\n+\tenum xdp_checksum ip_summed;\n+\tu32 cksum_meta;\n+\n+\tice_get_rx_csum(rx_desc, ptype, ring, &ip_summed, &cksum_meta);\n+\tswitch (ip_summed) {\n+\tcase XDP_CHECKSUM_UNNECESSARY:\n+\t\tskb->csum_level = cksum_meta;\n+\t\tbreak;\n+\tcase XDP_CHECKSUM_COMPLETE:\n+\t\tskb->csum = (__force __wsum)cksum_meta;\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\tskb->ip_summed = ip_summed;\n }\n \n /**\n@@ -569,6 +578,30 @@ static int ice_xdp_rx_hash(const struct xdp_md *ctx, u32 *hash,\n \treturn 0;\n }\n \n+/**\n+ * ice_xdp_rx_checksum - RX checksum XDP hint handler\n+ * @ctx: XDP buff pointer\n+ * @ip_summed: RX checksum result destination address\n+ * @cksum_meta: XDP RX checksum metadata destination address\n+ *\n+ * Copy RX checksum result (if available) and its metadata to the\n+ * destination address.\n+ */\n+static int ice_xdp_rx_checksum(const struct xdp_md *ctx,\n+\t\t\t       enum xdp_checksum *ip_summed,\n+\t\t\t       u32 *cksum_meta)\n+{\n+\tconst struct libeth_xdp_buff *xdp_ext = (void *)ctx;\n+\tconst union ice_32b_rx_flex_desc *rx_desc = xdp_ext->desc;\n+\tstruct ice_rx_ring *ring;\n+\n+\tring = libeth_xdp_buff_to_rq(xdp_ext, typeof(*ring), xdp_rxq);\n+\tice_get_rx_csum(rx_desc, ice_get_ptype(rx_desc), ring, ip_summed,\n+\t\t\tcksum_meta);\n+\n+\treturn 0;\n+}\n+\n /**\n  * ice_xdp_rx_vlan_tag - VLAN tag XDP hint handler\n  * @ctx: XDP buff pointer\n@@ -601,4 +634,5 @@ const struct xdp_metadata_ops ice_xdp_md_ops = {\n \t.xmo_rx_timestamp\t\t= ice_xdp_rx_hw_ts,\n \t.xmo_rx_hash\t\t\t= ice_xdp_rx_hash,\n \t.xmo_rx_vlan_tag\t\t= ice_xdp_rx_vlan_tag,\n+\t.xmo_rx_checksum\t\t= ice_xdp_rx_checksum,\n };\n","prefixes":["bpf-next","v2","3/5"]}