]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: selftests: export packet creation helpers for driver use
authorRaju Rangoju <Raju.Rangoju@amd.com>
Fri, 31 Oct 2025 11:18:11 +0000 (16:48 +0530)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 6 Nov 2025 12:38:11 +0000 (13:38 +0100)
Export the network selftest packet creation infrastructure to allow
network drivers to reuse the existing selftest framework instead of
duplicating packet creation code.

Signed-off-by: Raju Rangoju <Raju.Rangoju@amd.com>
Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
Link: https://patch.msgid.link/20251031111811.775434-1-Raju.Rangoju@amd.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
include/net/selftests.h
net/core/selftests.c

index e65e8d230d33c2410f58c06b2907097f4a8621d9..c36e07406ad4c8e14e51b4a3761bc02dd1780b50 100644 (file)
@@ -3,9 +3,48 @@
 #define _NET_SELFTESTS
 
 #include <linux/ethtool.h>
+#include <linux/netdevice.h>
+
+struct net_packet_attrs {
+       const unsigned char *src;
+       const unsigned char *dst;
+       u32 ip_src;
+       u32 ip_dst;
+       bool tcp;
+       u16 sport;
+       u16 dport;
+       int timeout;
+       int size;
+       int max_size;
+       u8 id;
+       u16 queue_mapping;
+       bool bad_csum;
+};
+
+struct net_test_priv {
+       struct net_packet_attrs *packet;
+       struct packet_type pt;
+       struct completion comp;
+       int double_vlan;
+       int vlan_id;
+       int ok;
+};
+
+struct netsfhdr {
+       __be32 version;
+       __be64 magic;
+       u8 id;
+} __packed;
+
+#define NET_TEST_PKT_SIZE (sizeof(struct ethhdr) + sizeof(struct iphdr) + \
+                          sizeof(struct netsfhdr))
+#define NET_TEST_PKT_MAGIC     0xdeadcafecafedeadULL
+#define NET_LB_TIMEOUT         msecs_to_jiffies(200)
 
 #if IS_ENABLED(CONFIG_NET_SELFTESTS)
 
+struct sk_buff *net_test_get_skb(struct net_device *ndev, u8 id,
+                                struct net_packet_attrs *attr);
 void net_selftest(struct net_device *ndev, struct ethtool_test *etest,
                  u64 *buf);
 int net_selftest_get_count(void);
@@ -13,6 +52,12 @@ void net_selftest_get_strings(u8 *data);
 
 #else
 
+static inline struct sk_buff *net_test_get_skb(struct net_device *ndev, u8 id,
+                                              struct net_packet_attrs *attr)
+{
+       return NULL;
+}
+
 static inline void net_selftest(struct net_device *ndev, struct ethtool_test *etest,
                                u64 *buf)
 {
index 3d79133a91a6119288cd7ca3abc4b6074f8d82b7..8b81feb82c4ae719b770a5b5480dd07aaae5a54b 100644 (file)
 #include <net/tcp.h>
 #include <net/udp.h>
 
-struct net_packet_attrs {
-       const unsigned char *src;
-       const unsigned char *dst;
-       u32 ip_src;
-       u32 ip_dst;
-       bool tcp;
-       u16 sport;
-       u16 dport;
-       int timeout;
-       int size;
-       int max_size;
-       u8 id;
-       u16 queue_mapping;
-       bool bad_csum;
-};
-
-struct net_test_priv {
-       struct net_packet_attrs *packet;
-       struct packet_type pt;
-       struct completion comp;
-       int double_vlan;
-       int vlan_id;
-       int ok;
-};
-
-struct netsfhdr {
-       __be32 version;
-       __be64 magic;
-       u8 id;
-} __packed;
-
 static u8 net_test_next_id;
 
-#define NET_TEST_PKT_SIZE (sizeof(struct ethhdr) + sizeof(struct iphdr) + \
-                          sizeof(struct netsfhdr))
-#define NET_TEST_PKT_MAGIC     0xdeadcafecafedeadULL
-#define NET_LB_TIMEOUT         msecs_to_jiffies(200)
-
-static struct sk_buff *net_test_get_skb(struct net_device *ndev,
-                                       struct net_packet_attrs *attr)
+struct sk_buff *net_test_get_skb(struct net_device *ndev, u8 id,
+                                struct net_packet_attrs *attr)
 {
        struct sk_buff *skb = NULL;
        struct udphdr *uhdr = NULL;
@@ -142,8 +106,8 @@ static struct sk_buff *net_test_get_skb(struct net_device *ndev,
        shdr = skb_put(skb, sizeof(*shdr));
        shdr->version = 0;
        shdr->magic = cpu_to_be64(NET_TEST_PKT_MAGIC);
-       attr->id = net_test_next_id;
-       shdr->id = net_test_next_id++;
+       attr->id = id;
+       shdr->id = id;
 
        if (attr->size) {
                void *payload = skb_put(skb, attr->size);
@@ -190,6 +154,7 @@ static struct sk_buff *net_test_get_skb(struct net_device *ndev,
 
        return skb;
 }
+EXPORT_SYMBOL_GPL(net_test_get_skb);
 
 static int net_test_loopback_validate(struct sk_buff *skb,
                                      struct net_device *ndev,
@@ -286,12 +251,13 @@ static int __net_test_loopback(struct net_device *ndev,
        tpriv->packet = attr;
        dev_add_pack(&tpriv->pt);
 
-       skb = net_test_get_skb(ndev, attr);
+       skb = net_test_get_skb(ndev, net_test_next_id, attr);
        if (!skb) {
                ret = -ENOMEM;
                goto cleanup;
        }
 
+       net_test_next_id++;
        ret = dev_direct_xmit(skb, attr->queue_mapping);
        if (ret < 0) {
                goto cleanup;