diff mbox series

[RFC,net-next,4/6] netdevsim: add software driver for testing offloads

Message ID 20171124023613.16855-5-jakub.kicinski@netronome.com
State RFC, archived
Delegated to: BPF Maintainers
Headers show
Series xdp: make stack perform remove and tests | expand

Commit Message

Jakub Kicinski Nov. 24, 2017, 2:36 a.m. UTC
To be able to run selftests without any hardware required we
need a software model.  The model can also serve as an example
implementation for those implementing actual HW offloads.
The dummy driver have previously been extended to test SR-IOV,
but the general consensus seems to be against adding further
features to it.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Simon Horman <simon.horman@netronome.com>
---
 MAINTAINERS                       |   5 ++
 drivers/net/Kconfig               |  10 +++
 drivers/net/Makefile              |   1 +
 drivers/net/netdevsim/Makefile    |   6 ++
 drivers/net/netdevsim/netdev.c    | 136 ++++++++++++++++++++++++++++++++++++++
 drivers/net/netdevsim/netdevsim.h |  44 ++++++++++++
 6 files changed, 202 insertions(+)
 create mode 100644 drivers/net/netdevsim/Makefile
 create mode 100644 drivers/net/netdevsim/netdev.c
 create mode 100644 drivers/net/netdevsim/netdevsim.h

Comments

Jiri Pirko Nov. 24, 2017, 7:24 a.m. UTC | #1
Fri, Nov 24, 2017 at 03:36:11AM CET, jakub.kicinski@netronome.com wrote:
>To be able to run selftests without any hardware required we
>need a software model.  The model can also serve as an example
>implementation for those implementing actual HW offloads.
>The dummy driver have previously been extended to test SR-IOV,
>but the general consensus seems to be against adding further
>features to it.
>
>Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
>Reviewed-by: Simon Horman <simon.horman@netronome.com>
>---

[...]


>+++ b/drivers/net/netdevsim/netdev.c
>@@ -0,0 +1,136 @@
>+/*
>+ * Copyright (C) 2017 Netronome Systems, Inc.
>+ *
>+ * This software is dual licensed under the GNU General License Version 2,
>+ * June 1991 as shown in the file COPYING in the top-level directory of this
>+ * source tree or the BSD 2-Clause License provided below.  You have the
>+ * option to license this software under the complete terms of either license.
>+ *
>+ * The BSD 2-Clause License:

Why gpl2 is not enough for this?
Jakub Kicinski Nov. 24, 2017, 7:49 a.m. UTC | #2
On Thu, Nov 23, 2017 at 11:24 PM, Jiri Pirko <jiri@resnulli.us> wrote:
> Fri, Nov 24, 2017 at 03:36:11AM CET, jakub.kicinski@netronome.com wrote:
>>To be able to run selftests without any hardware required we
>>need a software model.  The model can also serve as an example
>>implementation for those implementing actual HW offloads.
>>The dummy driver have previously been extended to test SR-IOV,
>>but the general consensus seems to be against adding further
>>features to it.
>>
>>Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
>>Reviewed-by: Simon Horman <simon.horman@netronome.com>
>>---
>
> [...]
>
>
>>+++ b/drivers/net/netdevsim/netdev.c
>>@@ -0,0 +1,136 @@
>>+/*
>>+ * Copyright (C) 2017 Netronome Systems, Inc.
>>+ *
>>+ * This software is dual licensed under the GNU General License Version 2,
>>+ * June 1991 as shown in the file COPYING in the top-level directory of this
>>+ * source tree or the BSD 2-Clause License provided below.  You have the
>>+ * option to license this software under the complete terms of either license.
>>+ *
>>+ * The BSD 2-Clause License:
>
> Why gpl2 is not enough for this?

It's the license I got from legal, I will request permission to use
pure gpl2.  Thanks!
Jiri Pirko Nov. 24, 2017, 8:07 a.m. UTC | #3
Fri, Nov 24, 2017 at 08:49:17AM CET, jakub.kicinski@netronome.com wrote:
>On Thu, Nov 23, 2017 at 11:24 PM, Jiri Pirko <jiri@resnulli.us> wrote:
>> Fri, Nov 24, 2017 at 03:36:11AM CET, jakub.kicinski@netronome.com wrote:
>>>To be able to run selftests without any hardware required we
>>>need a software model.  The model can also serve as an example
>>>implementation for those implementing actual HW offloads.
>>>The dummy driver have previously been extended to test SR-IOV,
>>>but the general consensus seems to be against adding further
>>>features to it.
>>>
>>>Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
>>>Reviewed-by: Simon Horman <simon.horman@netronome.com>
>>>---
>>
>> [...]
>>
>>
>>>+++ b/drivers/net/netdevsim/netdev.c
>>>@@ -0,0 +1,136 @@
>>>+/*
>>>+ * Copyright (C) 2017 Netronome Systems, Inc.
>>>+ *
>>>+ * This software is dual licensed under the GNU General License Version 2,
>>>+ * June 1991 as shown in the file COPYING in the top-level directory of this
>>>+ * source tree or the BSD 2-Clause License provided below.  You have the
>>>+ * option to license this software under the complete terms of either license.
>>>+ *
>>>+ * The BSD 2-Clause License:
>>
>> Why gpl2 is not enough for this?
>
>It's the license I got from legal, I will request permission to use
>pure gpl2.  Thanks!

Yeah, I semi-understand need for bsd for actual hw driver (we have it
for mlxsw as well). But for this testing driver, it really does not make
sense.
David Miller Nov. 27, 2017, 7:30 p.m. UTC | #4
From: Jakub Kicinski <jakub.kicinski@netronome.com>
Date: Thu, 23 Nov 2017 18:36:11 -0800

> The dummy driver have previously been extended to test SR-IOV,
> but the general consensus seems to be against adding further
> features to it.

I guess this is fine, but then is it going to be the case that
every time we want to add a software offload implementation for
testing driver paths we add yet another dummy driver?
Jakub Kicinski Nov. 27, 2017, 7:42 p.m. UTC | #5
On Tue, 28 Nov 2017 04:30:26 +0900 (KST), David Miller wrote:
> From: Jakub Kicinski <jakub.kicinski@netronome.com>
> Date: Thu, 23 Nov 2017 18:36:11 -0800
> 
> > The dummy driver have previously been extended to test SR-IOV,
> > but the general consensus seems to be against adding further
> > features to it.  
> 
> I guess this is fine, but then is it going to be the case that
> every time we want to add a software offload implementation for
> testing driver paths we add yet another dummy driver?

I would expect others to extend the netdevsim driver, so all test/SW
implementation would live there.

I was considering moving the SR-IOV code over, too, but I'm worried  
I will break existing tests.  Phil, Sabrina would you be OK with that?
Phil Sutter Nov. 28, 2017, 2:55 p.m. UTC | #6
Hi,

On Mon, Nov 27, 2017 at 11:42:49AM -0800, Jakub Kicinski wrote:
> On Tue, 28 Nov 2017 04:30:26 +0900 (KST), David Miller wrote:
> > From: Jakub Kicinski <jakub.kicinski@netronome.com>
> > Date: Thu, 23 Nov 2017 18:36:11 -0800
> > 
> > > The dummy driver have previously been extended to test SR-IOV,
> > > but the general consensus seems to be against adding further
> > > features to it.  
> > 
> > I guess this is fine, but then is it going to be the case that
> > every time we want to add a software offload implementation for
> > testing driver paths we add yet another dummy driver?
> 
> I would expect others to extend the netdevsim driver, so all test/SW
> implementation would live there.
> 
> I was considering moving the SR-IOV code over, too, but I'm worried  
> I will break existing tests.  Phil, Sabrina would you be OK with that?

Yes, that's fine with us!

Thanks, Phil
Jiri Pirko Nov. 28, 2017, 4:20 p.m. UTC | #7
Mon, Nov 27, 2017 at 08:42:49PM CET, jakub.kicinski@netronome.com wrote:
>On Tue, 28 Nov 2017 04:30:26 +0900 (KST), David Miller wrote:
>> From: Jakub Kicinski <jakub.kicinski@netronome.com>
>> Date: Thu, 23 Nov 2017 18:36:11 -0800
>> 
>> > The dummy driver have previously been extended to test SR-IOV,
>> > but the general consensus seems to be against adding further
>> > features to it.  
>> 
>> I guess this is fine, but then is it going to be the case that
>> every time we want to add a software offload implementation for
>> testing driver paths we add yet another dummy driver?
>
>I would expect others to extend the netdevsim driver, so all test/SW
>implementation would live there.
>
>I was considering moving the SR-IOV code over, too, but I'm worried  

Agreed. Leave dummy be dummy. netdevsim should serve this purpose.

Thanks!

>I will break existing tests.  Phil, Sabrina would you be OK with that?
diff mbox series

Patch

diff --git a/MAINTAINERS b/MAINTAINERS
index 44512c346206..e70e9c6e2595 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -9596,6 +9596,11 @@  NETWORKING [WIRELESS]
 L:	linux-wireless@vger.kernel.org
 Q:	http://patchwork.kernel.org/project/linux-wireless/list/
 
+NETDEVSIM
+M:	Jakub Kicinski <jakub.kicinski@netronome.com>
+S:	Maintained
+F:	drivers/net/netdevsim/*
+
 NETXEN (1/10) GbE SUPPORT
 M:	Manish Chopra <manish.chopra@cavium.com>
 M:	Rahul Verma <rahul.verma@cavium.com>
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index 0936da592e12..0aeab01d2429 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -497,4 +497,14 @@  config THUNDERBOLT_NET
 
 source "drivers/net/hyperv/Kconfig"
 
+config NETDEVSIM
+	tristate "Simulated networking device"
+	help
+	  This driver is a developer testing tool and software model that can
+	  be used to test various control path networking APIs, especially
+	  HW-offload related.
+
+	  To compile this driver as a module, choose M here: the module
+	  will be called netdevsim.
+
 endif # NETDEVICES
diff --git a/drivers/net/Makefile b/drivers/net/Makefile
index 766f62d02a0b..04c3b747812c 100644
--- a/drivers/net/Makefile
+++ b/drivers/net/Makefile
@@ -78,3 +78,4 @@  obj-$(CONFIG_FUJITSU_ES) += fjes/
 
 thunderbolt-net-y += thunderbolt.o
 obj-$(CONFIG_THUNDERBOLT_NET) += thunderbolt-net.o
+obj-$(CONFIG_NETDEVSIM) += netdevsim/
diff --git a/drivers/net/netdevsim/Makefile b/drivers/net/netdevsim/Makefile
new file mode 100644
index 000000000000..07867bfe873b
--- /dev/null
+++ b/drivers/net/netdevsim/Makefile
@@ -0,0 +1,6 @@ 
+# SPDX-License-Identifier: GPL-2.0
+
+obj-$(CONFIG_NETDEVSIM) += netdevsim.o
+
+netdevsim-objs := \
+	netdev.o \
diff --git a/drivers/net/netdevsim/netdev.c b/drivers/net/netdevsim/netdev.c
new file mode 100644
index 000000000000..6f6c78bb076b
--- /dev/null
+++ b/drivers/net/netdevsim/netdev.c
@@ -0,0 +1,136 @@ 
+/*
+ * Copyright (C) 2017 Netronome Systems, Inc.
+ *
+ * This software is dual licensed under the GNU General License Version 2,
+ * June 1991 as shown in the file COPYING in the top-level directory of this
+ * source tree or the BSD 2-Clause License provided below.  You have the
+ * option to license this software under the complete terms of either license.
+ *
+ * The BSD 2-Clause License:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      1. Redistributions of source code must retain the above
+ *         copyright notice, this list of conditions and the following
+ *         disclaimer.
+ *
+ *      2. Redistributions in binary form must reproduce the above
+ *         copyright notice, this list of conditions and the following
+ *         disclaimer in the documentation and/or other materials
+ *         provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include <linux/etherdevice.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/netdevice.h>
+#include <linux/slab.h>
+#include <net/netlink.h>
+#include <net/rtnetlink.h>
+
+#include "netdevsim.h"
+
+static netdev_tx_t nsim_start_xmit(struct sk_buff *skb, struct net_device *dev)
+{
+	struct netdevsim *ns = netdev_priv(dev);
+
+	u64_stats_update_begin(&ns->syncp);
+	ns->tx_packets++;
+	ns->tx_bytes += skb->len;
+	u64_stats_update_end(&ns->syncp);
+
+	dev_kfree_skb(skb);
+
+	return NETDEV_TX_OK;
+}
+
+static void nsim_set_rx_mode(struct net_device *dev)
+{
+}
+
+static void
+nsim_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
+{
+	struct netdevsim *ns = netdev_priv(dev);
+	unsigned int start;
+
+	do {
+		start = u64_stats_fetch_begin(&ns->syncp);
+		stats->tx_bytes = ns->tx_bytes;
+		stats->tx_packets = ns->tx_packets;
+	} while (u64_stats_fetch_retry(&ns->syncp, start));
+}
+
+static const struct net_device_ops nsim_netdev_ops = {
+	.ndo_start_xmit		= nsim_start_xmit,
+	.ndo_set_rx_mode	= nsim_set_rx_mode,
+	.ndo_set_mac_address	= eth_mac_addr,
+	.ndo_validate_addr	= eth_validate_addr,
+	.ndo_get_stats64	= nsim_get_stats64,
+};
+
+static void nsim_setup(struct net_device *dev)
+{
+	ether_setup(dev);
+	eth_hw_addr_random(dev);
+
+	dev->netdev_ops = &nsim_netdev_ops;
+	dev->needs_free_netdev = true;
+
+	dev->tx_queue_len = 0;
+	dev->flags |= IFF_NOARP;
+	dev->flags &= ~IFF_MULTICAST;
+	dev->priv_flags |= IFF_LIVE_ADDR_CHANGE |
+			   IFF_NO_QUEUE;
+	dev->features |= NETIF_F_HIGHDMA |
+			 NETIF_F_SG |
+			 NETIF_F_FRAGLIST |
+			 NETIF_F_HW_CSUM |
+			 NETIF_F_TSO;
+	dev->max_mtu = ETH_MAX_MTU;
+}
+
+static int nsim_validate(struct nlattr *tb[], struct nlattr *data[],
+			 struct netlink_ext_ack *extack)
+{
+	if (tb[IFLA_ADDRESS]) {
+		if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN)
+			return -EINVAL;
+		if (!is_valid_ether_addr(nla_data(tb[IFLA_ADDRESS])))
+			return -EADDRNOTAVAIL;
+	}
+	return 0;
+}
+
+static struct rtnl_link_ops nsim_link_ops __read_mostly = {
+	.kind		= DRV_NAME,
+	.priv_size	= sizeof(struct netdevsim),
+	.setup		= nsim_setup,
+	.validate	= nsim_validate,
+};
+
+static int __init nsim_module_init(void)
+{
+	return rtnl_link_register(&nsim_link_ops);
+}
+
+static void __exit nsim_module_exit(void)
+{
+	rtnl_link_unregister(&nsim_link_ops);
+}
+
+module_init(nsim_module_init);
+module_exit(nsim_module_exit);
+MODULE_LICENSE("GPL");
+MODULE_ALIAS_RTNL_LINK(DRV_NAME);
diff --git a/drivers/net/netdevsim/netdevsim.h b/drivers/net/netdevsim/netdevsim.h
new file mode 100644
index 000000000000..8cf174ed55c5
--- /dev/null
+++ b/drivers/net/netdevsim/netdevsim.h
@@ -0,0 +1,44 @@ 
+/*
+ * Copyright (C) 2017 Netronome Systems, Inc.
+ *
+ * This software is dual licensed under the GNU General License Version 2,
+ * June 1991 as shown in the file COPYING in the top-level directory of this
+ * source tree or the BSD 2-Clause License provided below.  You have the
+ * option to license this software under the complete terms of either license.
+ *
+ * The BSD 2-Clause License:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      1. Redistributions of source code must retain the above
+ *         copyright notice, this list of conditions and the following
+ *         disclaimer.
+ *
+ *      2. Redistributions in binary form must reproduce the above
+ *         copyright notice, this list of conditions and the following
+ *         disclaimer in the documentation and/or other materials
+ *         provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include <linux/kernel.h>
+#include <linux/netdevice.h>
+#include <linux/u64_stats_sync.h>
+
+#define DRV_NAME	"netdevsim"
+
+struct netdevsim {
+	u64 tx_packets;
+	u64 tx_bytes;
+	struct u64_stats_sync syncp;
+};