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 |
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?
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!
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.
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?
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?
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
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 --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; +};