From nobody Mon Feb 9 06:20:59 2026 Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E640A214225 for ; Tue, 29 Apr 2025 07:41:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745912473; cv=none; b=hxQZsWuexhKpvAD71vq1Gy2qhytcBUp17yz6Khr7khg4sH1i0k8YpeN0+O3BuWDLoQarHCdpfEVgN6CqoSoYjHAcP/VmhqPf2j/CGOP5OswCAWD1IPqFTvJmaZJaZRQxzIA3pDkNSGprBAiSIzbMq2/b6tO02nU3uelYMf2JNJ0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745912473; c=relaxed/simple; bh=0Pe2j0oXCZbo69Dqx7B15NyJMv5NjWuFBulofgo6Jhc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=W8yi5Pc+OAvQ9kyKW7R4BeFohO+oxnlZxLkH5lFxRRgAd3wVM9CcSkwbbg7ju2pGmA3s+92czp8amHUEp8rOYZd+DKofnjGB3S+q6+7qSpjP1/EDH/pWrr1bduwsM4KuXaxf4LEkClfRAlIuaxXZVRDkggeccztwHgxECxYMqUg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1u9faT-0006KO-Sj; Tue, 29 Apr 2025 09:41:05 +0200 Received: from dude04.red.stw.pengutronix.de ([2a0a:edc0:0:1101:1d::ac]) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1u9faS-000E3C-1R; Tue, 29 Apr 2025 09:41:04 +0200 Received: from ore by dude04.red.stw.pengutronix.de with local (Exim 4.96) (envelope-from ) id 1u9faS-00CY6e-1E; Tue, 29 Apr 2025 09:41:04 +0200 From: Oleksij Rempel To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: Oleksij Rempel , kernel@pengutronix.de, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, Maxime Chevallier Subject: [PATCH net-next v3 1/4] net: selftests: drop test index from net_selftest_get_strings() Date: Tue, 29 Apr 2025 09:41:00 +0200 Message-Id: <20250429074103.2991006-2-o.rempel@pengutronix.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250429074103.2991006-1-o.rempel@pengutronix.de> References: <20250429074103.2991006-1-o.rempel@pengutronix.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: ore@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The test index is redundant and reduces available space for test names, which are already limited to ETH_GSTRING_LEN (32 bytes). Removing the index improves readability in tools like `ethtool -t`, especially when longer test names are used. Before this change: 3. PHY internal loopback, enab 7. PHY internal loopback, disa After this change: PHY internal loopback, enable PHY internal loopback, disable Signed-off-by: Oleksij Rempel Reviewed-by: Simon Horman --- changes v2: - use ethtool_puts instead of ethtool_sprintf --- net/core/selftests.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/net/core/selftests.c b/net/core/selftests.c index 35f807ea9952..9146e33db25a 100644 --- a/net/core/selftests.c +++ b/net/core/selftests.c @@ -408,8 +408,7 @@ void net_selftest_get_strings(u8 *data) int i; =20 for (i =3D 0; i < net_selftest_get_count(); i++) - ethtool_sprintf(&data, "%2d. %s", i + 1, - net_selftests[i].name); + ethtool_puts(&data, net_selftests[i].name); } EXPORT_SYMBOL_GPL(net_selftest_get_strings); =20 --=20 2.39.5 From nobody Mon Feb 9 06:20:59 2026 Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6390C26FD9C for ; Tue, 29 Apr 2025 07:41:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745912473; cv=none; b=K/LiUAcHNlCIIEDOeHOHjsDPCTjEDLuWMuXqr/nSQ97fVM17B3jrP9mqfQ+tHydB8SHVy7Mdd8Z5SHzn6LD5RXhfSf59IEYs/+z+P2750a7xUZgStUdjABB+SzYDDdNU3n2azd9XhokfwVtBYO4q1aQi7Aj2l53nskeUiwcV23k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745912473; c=relaxed/simple; bh=1k8DD7DU6StfRskpYGO/JVOEw0YmLwAKC4vCqPkq0s4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=KRXAl7+3NBVrlEbRL9gWIHlDnYCYSmgXE3FAWLQPp2DcAxVb/9HA+ixZkYkexve1pTXPoGPIRmPKBdIv3wKTeqhoduV++A8nDiiSBYDNLHXcdni44ivJP6C3eKvROlASIBznoc4TM+AUTZYM5sMEiqYQr1kmhmGPuvwACclT52w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1u9faT-0006KP-Sj; Tue, 29 Apr 2025 09:41:05 +0200 Received: from dude04.red.stw.pengutronix.de ([2a0a:edc0:0:1101:1d::ac]) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1u9faS-000E3D-1W; Tue, 29 Apr 2025 09:41:04 +0200 Received: from ore by dude04.red.stw.pengutronix.de with local (Exim 4.96) (envelope-from ) id 1u9faS-00CY6o-1J; Tue, 29 Apr 2025 09:41:04 +0200 From: Oleksij Rempel To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: Oleksij Rempel , kernel@pengutronix.de, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, Maxime Chevallier Subject: [PATCH net-next v3 2/4] net: selftests: prepare for detailed error handling in net_test_get_skb() Date: Tue, 29 Apr 2025 09:41:01 +0200 Message-Id: <20250429074103.2991006-3-o.rempel@pengutronix.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250429074103.2991006-1-o.rempel@pengutronix.de> References: <20250429074103.2991006-1-o.rempel@pengutronix.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: ore@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Replace NULL return with ERR_PTR(-ENOMEM) in net_test_get_skb() and update the caller to use IS_ERR/PTR_ERR. This prepares the code for follow-up changes that will return more specific error codes from net_test_get_skb(). Signed-off-by: Oleksij Rempel Reviewed-by: Simon Horman --- net/core/selftests.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/net/core/selftests.c b/net/core/selftests.c index 9146e33db25a..3f82a5d14cd4 100644 --- a/net/core/selftests.c +++ b/net/core/selftests.c @@ -74,7 +74,7 @@ static struct sk_buff *net_test_get_skb(struct net_device= *ndev, =20 skb =3D netdev_alloc_skb(ndev, size); if (!skb) - return NULL; + return ERR_PTR(-ENOMEM); =20 prefetchw(skb->data); =20 @@ -267,8 +267,8 @@ static int __net_test_loopback(struct net_device *ndev, dev_add_pack(&tpriv->pt); =20 skb =3D net_test_get_skb(ndev, attr); - if (!skb) { - ret =3D -ENOMEM; + if (IS_ERR(skb)) { + ret =3D PTR_ERR(skb); goto cleanup; } =20 --=20 2.39.5 From nobody Mon Feb 9 06:20:59 2026 Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0A53F274647 for ; Tue, 29 Apr 2025 07:41:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745912474; cv=none; b=a9P+gpc578AhvoUsWi9SGXmsqh49W5WQzbyxX3LoycVq47d83d23mOzx167JBXNhaBn4toQBLlZHbkGnRvpqraLrU4TxnaMUhMikDUgQ6g8ofIbBdNWZN89lCj2Fm2eXopSYyaejC3kU0Gvvq/4QwzWpZ1POW4UqQqzTL4uBdSg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745912474; c=relaxed/simple; bh=nU+O1Una1TIiAm07bKMi/oDXNkUkAHyXkJkMwhSb8C0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version:Content-Type; b=Q5yBaqxx9jZLIDAmDOw5GIzODFqR5PvbLuX4r1Ms5CHfmKrN+VN3j0frdmJM5aqGUn7JD8z1iQE14jipCf0DrNqei+h/T0mgf/7aX823zFwl0GMU0d+TD18s0yUeJy8nQEiFb/U7bgyptaGjaBitnDILwKFsOotJq4kc5UYxxws= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1u9faT-0006KQ-Sj; Tue, 29 Apr 2025 09:41:05 +0200 Received: from dude04.red.stw.pengutronix.de ([2a0a:edc0:0:1101:1d::ac]) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1u9faS-000E3E-1a; Tue, 29 Apr 2025 09:41:04 +0200 Received: from ore by dude04.red.stw.pengutronix.de with local (Exim 4.96) (envelope-from ) id 1u9faS-00CY6y-1N; Tue, 29 Apr 2025 09:41:04 +0200 From: Oleksij Rempel To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: Oleksij Rempel , kernel@pengutronix.de, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, Maxime Chevallier Subject: [PATCH net-next v3 3/4] net: selftests: add checksum mode support and SW checksum handling Date: Tue, 29 Apr 2025 09:41:02 +0200 Message-Id: <20250429074103.2991006-4-o.rempel@pengutronix.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250429074103.2991006-1-o.rempel@pengutronix.de> References: <20250429074103.2991006-1-o.rempel@pengutronix.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: ore@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Introduce `enum net_test_checksum_mode` to support both CHECKSUM_COMPLETE and CHECKSUM_PARTIAL modes in selftest packet generation. Add helpers to calculate and apply software checksums for TCP/UDP in CHECKSUM_COMPLETE mode, and refactor checksum handling into a dedicated function `net_test_set_checksum()`. Update PHY loopback tests to use CHECKSUM_COMPLETE by default to avoid hardware offload dependencies and improve reliability. Also rename loopback test names to clarify checksum type and transport. Signed-off-by: Oleksij Rempel --- changes v2: - Rebased on latest net-next - Fixed Sparse warnings in net_test_setup_sw_csum(): * Use __sum16 instead of __be16 for final_csum --- net/core/selftests.c | 219 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 207 insertions(+), 12 deletions(-) diff --git a/net/core/selftests.c b/net/core/selftests.c index 3f82a5d14cd4..591686978dd7 100644 --- a/net/core/selftests.c +++ b/net/core/selftests.c @@ -10,10 +10,16 @@ */ =20 #include +#include #include #include #include =20 +enum net_test_checksum_mode { + NET_TEST_CHECKSUM_COMPLETE, + NET_TEST_CHECKSUM_PARTIAL, +}; + struct net_packet_attrs { const unsigned char *src; const unsigned char *dst; @@ -27,6 +33,7 @@ struct net_packet_attrs { int max_size; u8 id; u16 queue_mapping; + enum net_test_checksum_mode csum_mode; }; =20 struct net_test_priv { @@ -51,6 +58,133 @@ static u8 net_test_next_id; #define NET_TEST_PKT_MAGIC 0xdeadcafecafedeadULL #define NET_LB_TIMEOUT msecs_to_jiffies(200) =20 +/** + * net_test_setup_sw_csum - Compute and apply software checksum + * (CHECKSUM_COMPLETE) + * @skb: Socket buffer with transport header set + * @iph: Pointer to IPv4 header inside skb + * + * This function computes and fills the transport layer checksum (TCP or U= DP), + * and sets skb->ip_summed =3D CHECKSUM_COMPLETE. + * + * Returns 0 on success, or negative error code on failure. + */ +static int net_test_setup_sw_csum(struct sk_buff *skb, + struct iphdr *iph) +{ + int transport_offset =3D skb_transport_offset(skb); + int transport_len =3D skb->len - transport_offset; + __sum16 final_csum; + __wsum csum; + + switch (iph->protocol) { + case IPPROTO_TCP: + if (!pskb_may_pull(skb, + transport_offset + sizeof(struct tcphdr))) + return -EFAULT; + + tcp_hdr(skb)->check =3D 0; + break; + case IPPROTO_UDP: + if (!pskb_may_pull(skb, + transport_offset + sizeof(struct udphdr))) + return -EFAULT; + + udp_hdr(skb)->check =3D 0; + break; + default: + pr_err("net_selftest: unsupported proto for sw csum: %u\n", + iph->protocol); + return -EINVAL; + } + + csum =3D skb_checksum(skb, transport_offset, transport_len, 0); + final_csum =3D csum_tcpudp_magic(iph->saddr, iph->daddr, transport_len, + iph->protocol, csum); + + if (iph->protocol =3D=3D IPPROTO_UDP && final_csum =3D=3D 0) + final_csum =3D CSUM_MANGLED_0; + + if (iph->protocol =3D=3D IPPROTO_TCP) + tcp_hdr(skb)->check =3D final_csum; + else + udp_hdr(skb)->check =3D final_csum; + + skb->ip_summed =3D CHECKSUM_COMPLETE; + + return 0; +} + +/** + * net_test_setup_hw_csum - Setup skb for hardware checksum offload + * (CHECKSUM_PARTIAL) + * @skb: Socket buffer to prepare + * @iph: Pointer to IPv4 header inside skb + * + * This function sets skb fields and clears transport checksum field + * so that the NIC or driver can compute the checksum during transmit. + * + * Returns 0 on success, or negative error code on failure. + */ +static int net_test_setup_hw_csum(struct sk_buff *skb, struct iphdr *iph) +{ + u16 csum_offset; + + skb->ip_summed =3D CHECKSUM_PARTIAL; + skb->csum =3D 0; + + switch (iph->protocol) { + case IPPROTO_TCP: + if (!tcp_hdr(skb)) + return -EINVAL; + tcp_hdr(skb)->check =3D 0; + csum_offset =3D offsetof(struct tcphdr, check); + break; + case IPPROTO_UDP: + if (!udp_hdr(skb)) + return -EINVAL; + udp_hdr(skb)->check =3D 0; + csum_offset =3D offsetof(struct udphdr, check); + break; + default: + pr_err("net_selftest: unsupported proto for hw csum: %u\n", + iph->protocol); + return -EINVAL; + } + + skb->csum_start =3D skb_transport_header(skb) - skb->head; + skb->csum_offset =3D csum_offset; + + return 0; +} + +/** + * net_test_set_checksum - Apply requested checksum mode to skb + * @skb: Socket buffer containing the packet + * @attr: Packet attributes including desired checksum mode + * @iph: Pointer to the IP header within skb + * + * This function sets up the skb's checksum handling based on + * attr->csum_mode by calling the appropriate helper. + * + * Returns 0 on success, or negative error code on failure. + */ +static int net_test_set_checksum(struct sk_buff *skb, + struct net_packet_attrs *attr, + struct iphdr *iph) +{ + switch (attr->csum_mode) { + case NET_TEST_CHECKSUM_COMPLETE: + return net_test_setup_sw_csum(skb, iph); + case NET_TEST_CHECKSUM_PARTIAL: + return net_test_setup_hw_csum(skb, iph); + default: + pr_err("net_selftest: invalid checksum mode: %d\n", + attr->csum_mode); + return -EINVAL; + } +} + static struct sk_buff *net_test_get_skb(struct net_device *ndev, struct net_packet_attrs *attr) { @@ -61,6 +195,7 @@ static struct sk_buff *net_test_get_skb(struct net_devic= e *ndev, struct ethhdr *ehdr; struct iphdr *ihdr; int iplen, size; + int ret; =20 size =3D attr->size + NET_TEST_PKT_SIZE; =20 @@ -157,15 +292,10 @@ static struct sk_buff *net_test_get_skb(struct net_de= vice *ndev, memset(pad, 0, pad_len); } =20 - skb->csum =3D 0; - skb->ip_summed =3D CHECKSUM_PARTIAL; - if (attr->tcp) { - thdr->check =3D ~tcp_v4_check(skb->len, ihdr->saddr, - ihdr->daddr, 0); - skb->csum_start =3D skb_transport_header(skb) - skb->head; - skb->csum_offset =3D offsetof(struct tcphdr, check); - } else { - udp4_hwcsum(skb, ihdr->saddr, ihdr->daddr); + ret =3D net_test_set_checksum(skb, attr, ihdr); + if (ret < 0) { + kfree_skb(skb); + return ERR_PTR(ret); } =20 skb->protocol =3D htons(ETH_P_IP); @@ -318,29 +448,94 @@ static int net_test_phy_loopback_disable(struct net_d= evice *ndev) return phy_loopback(ndev->phydev, false, 0); } =20 +/** + * net_test_phy_loopback_udp - Basic PHY loopback test using UDP with SW + * checksum + * @ndev: The network device to test + * + * Sends and receives a minimal UDP packet through the device's internal + * PHY loopback path. The transport checksum is computed in software + * (CHECKSUM_COMPLETE), ensuring test validity regardless of hardware + * checksum offload support. + * + * Expected packet path: + * Test code =E2=86=92 MAC driver =E2=86=92 MAC HW =E2=86=92 xMII =E2=86= =92 PHY =E2=86=92 + * internal PHY loopback =E2=86=92 xMII =E2=86=92 MAC HW =E2=86=92 MAC d= river =E2=86=92 test code + * + * The test frame includes Ethernet (14B), IPv4 (20B), UDP (8B), and a + * minimal payload (13B), totaling 55 bytes before padding/FCS. Most + * MACs will pad this to 60 bytes before appending the FCS. + * + * Returns 0 on success, or negative error code on failure. + */ static int net_test_phy_loopback_udp(struct net_device *ndev) { struct net_packet_attrs attr =3D { }; =20 attr.dst =3D ndev->dev_addr; + attr.tcp =3D false; + attr.csum_mode =3D NET_TEST_CHECKSUM_COMPLETE; + return __net_test_loopback(ndev, &attr); } =20 +/** + * net_test_phy_loopback_udp_mtu - PHY loopback test using UDP MTU-sized f= rame + * with SW checksum + * @ndev: The network device to test + * + * Sends and receives a UDP packet through the device's internal PHY loopb= ack + * path. The packet uses software checksum calculation (CHECKSUM_COMPLETE), + * and the total L2 frame size is padded to match the device MTU. + * + * This tests the loopback path with larger frames and ensures checksum + * correctness regardless of hardware offload support. + * + * Expected packet path: + * Test code =E2=86=92 MAC driver =E2=86=92 MAC HW =E2=86=92 xMII =E2=86= =92 PHY =E2=86=92 + * internal PHY loopback =E2=86=92 xMII =E2=86=92 MAC HW =E2=86=92 MAC d= river =E2=86=92 test code + * + * Returns 0 on success, or negative error code on failure. + */ static int net_test_phy_loopback_udp_mtu(struct net_device *ndev) { struct net_packet_attrs attr =3D { }; =20 attr.dst =3D ndev->dev_addr; attr.max_size =3D ndev->mtu; + attr.tcp =3D false; + attr.csum_mode =3D NET_TEST_CHECKSUM_COMPLETE; + return __net_test_loopback(ndev, &attr); } =20 +/** + * net_test_phy_loopback_tcp - PHY loopback test using TCP with SW checksum + * @ndev: The network device to test + * + * Sends and receives a minimal TCP packet through the device's internal + * PHY loopback path. The checksum is computed in software + * (CHECKSUM_COMPLETE), avoiding reliance on hardware checksum offload, + * which may behave inconsistently with TCP in some loopback setups. + * + * Expected packet path: + * Test code =E2=86=92 MAC driver =E2=86=92 MAC HW =E2=86=92 xMII =E2=86= =92 PHY =E2=86=92 + * internal PHY loopback =E2=86=92 xMII =E2=86=92 MAC HW =E2=86=92 MAC d= river =E2=86=92 test code + * + * The generated test frame includes Ethernet (14B), IPv4 (20B), TCP (20B), + * and a small payload (13B), totaling 67 bytes before FCS. Since the total + * exceeds the Ethernet minimum, MAC padding is typically not applied. + * + * Returns 0 on success, or negative error code on failure. + */ static int net_test_phy_loopback_tcp(struct net_device *ndev) { struct net_packet_attrs attr =3D { }; =20 attr.dst =3D ndev->dev_addr; attr.tcp =3D true; + attr.csum_mode =3D NET_TEST_CHECKSUM_COMPLETE; + return __net_test_loopback(ndev, &attr); } =20 @@ -359,13 +554,13 @@ static const struct net_test { .name =3D "PHY internal loopback, enable ", .fn =3D net_test_phy_loopback_enable, }, { - .name =3D "PHY internal loopback, UDP ", + .name =3D "PHY loopback UDP (SW csum) ", .fn =3D net_test_phy_loopback_udp, }, { - .name =3D "PHY internal loopback, MTU ", + .name =3D "PHY loopback UDP MTU (SW csum)", .fn =3D net_test_phy_loopback_udp_mtu, }, { - .name =3D "PHY internal loopback, TCP ", + .name =3D "PHY loopback TCP (SW csum) ", .fn =3D net_test_phy_loopback_tcp, }, { /* This test should be done after all PHY loopback test */ --=20 2.39.5 From nobody Mon Feb 9 06:20:59 2026 Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D40C1189B9D for ; Tue, 29 Apr 2025 07:41:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745912473; cv=none; b=Ua2PQRt0mbGTut2R2pjcStx3ymIrYLn4uKR8bQe4zrO4TdxTuKaJ2ClKeHOeTbjMaRHe+9+bmBBSJj5k+Lua0GDG3+iQEW13F1Yp0Os0p72gsjrsphQlf2lj+tB+Ro0flCznAIuJG2pNk+ek0n/zL0r2dTNXBFHdFf9vm8v0X58= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745912473; c=relaxed/simple; bh=MBFWwb46UQQNdOkUo56hW2ui2l2iYYiZr5TxJR/PPC4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version:Content-Type; b=R6v9WmMJZQIzIQH+I143+oELOUbBG+7x3iJ0XD89+zja34faC9WlfXlLt6r95AHWmCfZ4MmmBgtdbzTQwU9h1EOyDT06f+DkWgHuAYXlhk2XxgvMlqd53vPfO28cz38nsdz0pvO3Sg4c9418HAIYRY/D8Oxw5JJVWep9rCRP/MY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1u9faT-0006KR-Sj; Tue, 29 Apr 2025 09:41:05 +0200 Received: from dude04.red.stw.pengutronix.de ([2a0a:edc0:0:1101:1d::ac]) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1u9faS-000E3G-1e; Tue, 29 Apr 2025 09:41:04 +0200 Received: from ore by dude04.red.stw.pengutronix.de with local (Exim 4.96) (envelope-from ) id 1u9faS-00CY78-1Q; Tue, 29 Apr 2025 09:41:04 +0200 From: Oleksij Rempel To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: Oleksij Rempel , kernel@pengutronix.de, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, Maxime Chevallier Subject: [PATCH net-next v3 4/4] net: selftests: add PHY loopback tests with HW checksum offload Date: Tue, 29 Apr 2025 09:41:03 +0200 Message-Id: <20250429074103.2991006-5-o.rempel@pengutronix.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250429074103.2991006-1-o.rempel@pengutronix.de> References: <20250429074103.2991006-1-o.rempel@pengutronix.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: ore@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Introduce two new PHY loopback tests that validate hardware checksum offload functionality using UDP and TCP packets. These tests set csum_mode =3D CHECKSUM_PARTIAL, allowing the NIC to compute transport checksums. Tests are only executed if the device advertises NETIF_F_HW_CSUM support. If not, they are skipped with -EOPNOTSUPP. Also register the tests under descriptive names in the test list. Signed-off-by: Oleksij Rempel Reviewed-by: Simon Horman --- net/core/selftests.c | 80 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/net/core/selftests.c b/net/core/selftests.c index 591686978dd7..e751dc677858 100644 --- a/net/core/selftests.c +++ b/net/core/selftests.c @@ -539,6 +539,79 @@ static int net_test_phy_loopback_tcp(struct net_device= *ndev) return __net_test_loopback(ndev, &attr); } =20 +/** + * net_test_phy_loopback_udp_hwcsum - PHY loopback test using UDP with HW + * checksum + * @ndev: The network device to test + * + * Sends and receives a UDP packet through the device's internal PHY loopb= ack + * path. The packet is configured for hardware checksum offload + * (CHECKSUM_PARTIAL), allowing the NIC to compute the transport checksum. + * + * Expected packet path: + * Test code =E2=86=92 MAC driver =E2=86=92 MAC HW =E2=86=92 xMII =E2=86= =92 PHY =E2=86=92 + * internal PHY loopback =E2=86=92 xMII =E2=86=92 MAC HW =E2=86=92 MAC d= river =E2=86=92 test code + * + * The test frame includes Ethernet (14B), IPv4 (20B), UDP (8B), and a + * small payload (13B), totaling 55 bytes before MAC padding/FCS. Most + * MACs pad this to the minimum Ethernet payload (60 bytes before FCS). + * + * If the device does not support NETIF_F_HW_CSUM, the test is skipped + * and -EOPNOTSUPP is returned. + * + * Returns 0 on success, or negative error code on failure. + */ +static int net_test_phy_loopback_udp_hwcsum(struct net_device *ndev) +{ + struct net_packet_attrs attr =3D { }; + + if (!(ndev->features & NETIF_F_HW_CSUM)) + return -EOPNOTSUPP; + + attr.dst =3D ndev->dev_addr; + attr.tcp =3D false; + attr.csum_mode =3D NET_TEST_CHECKSUM_PARTIAL; + + return __net_test_loopback(ndev, &attr); +} + +/** + * net_test_phy_loopback_tcp_hwcsum - PHY loopback test using TCP with HW + * checksum + * @ndev: The network device to test + * + * Sends and receives a TCP packet through the device's internal PHY loopb= ack + * path. The packet is configured for hardware checksum offload + * (CHECKSUM_PARTIAL), allowing the NIC to compute the transport checksum. + * + * Expected packet path: + * Test code =E2=86=92 MAC driver =E2=86=92 MAC HW =E2=86=92 xMII =E2=86= =92 PHY =E2=86=92 + * internal PHY loopback =E2=86=92 xMII =E2=86=92 MAC HW =E2=86=92 MAC d= river =E2=86=92 test code + * (via packet_type handler) + * + * The test frame includes Ethernet (14B), IPv4 (20B), TCP (20B), + * and a small payload (13B), totaling 67 bytes before FCS. + * No additional padding is required. + * + * If the device does not support NETIF_F_HW_CSUM, the test is skipped + * and -EOPNOTSUPP is returned. + * + * Returns 0 on success, or negative error code on failure. + */ +static int net_test_phy_loopback_tcp_hwcsum(struct net_device *ndev) +{ + struct net_packet_attrs attr =3D { }; + + if (!(ndev->features & NETIF_F_HW_CSUM)) + return -EOPNOTSUPP; + + attr.dst =3D ndev->dev_addr; + attr.tcp =3D true; + attr.csum_mode =3D NET_TEST_CHECKSUM_PARTIAL; + + return __net_test_loopback(ndev, &attr); +} + static const struct net_test { char name[ETH_GSTRING_LEN]; int (*fn)(struct net_device *ndev); @@ -562,6 +635,13 @@ static const struct net_test { }, { .name =3D "PHY loopback TCP (SW csum) ", .fn =3D net_test_phy_loopback_tcp, + }, { + /* Conditional HW checksum tests */ + .name =3D "PHY loopback UDP (HW csum) ", + .fn =3D net_test_phy_loopback_udp_hwcsum, + }, { + .name =3D "PHY loopback TCP (HW csum) ", + .fn =3D net_test_phy_loopback_tcp_hwcsum, }, { /* This test should be done after all PHY loopback test */ .name =3D "PHY internal loopback, disable", --=20 2.39.5