lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Fri, 21 Nov 2014 08:16:17 +0100
From:	Jiri Pirko <jiri@...nulli.us>
To:	Andy Gospodarek <gospo@...ulusnetworks.com>
Cc:	Roopa Prabhu <roopa@...ulusnetworks.com>, netdev@...r.kernel.org,
	davem@...emloft.net, nhorman@...driver.com, andy@...yhouse.net,
	tgraf@...g.ch, dborkman@...hat.com, ogerlitz@...lanox.com,
	jesse@...ira.com, pshelar@...ira.com, azhou@...ira.com,
	ben@...adent.org.uk, stephen@...workplumber.org,
	jeffrey.t.kirsher@...el.com, vyasevic@...hat.com,
	xiyou.wangcong@...il.com, john.r.fastabend@...el.com,
	edumazet@...gle.com, jhs@...atatu.com, sfeldma@...il.com,
	f.fainelli@...il.com, linville@...driver.com, jasowang@...hat.com,
	ebiederm@...ssion.com, nicolas.dichtel@...nd.com,
	ryazanov.s.a@...il.com, buytenh@...tstofly.org,
	aviadr@...lanox.com, nbd@...nwrt.org, alexei.starovoitov@...il.com,
	Neil.Jerram@...aswitch.com, ronye@...lanox.com,
	simon.horman@...ronome.com, alexander.h.duyck@...hat.com,
	john.ronciak@...el.com, mleitner@...hat.com, shrijeet@...il.com,
	bcrl@...ck.org
Subject: Re: [patch net-next v2 02/10] net: introduce generic switch devices
 support

Thu, Nov 20, 2014 at 04:55:41PM CET, gospo@...ulusnetworks.com wrote:
>On Wed, Nov 19, 2014 at 05:59:19AM -0800, Roopa Prabhu wrote:
>> On 11/19/14, 5:46 AM, Jiri Pirko wrote:
>> >Wed, Nov 19, 2014 at 02:28:10PM CET, roopa@...ulusnetworks.com wrote:
>> >>On 11/9/14, 2:51 AM, Jiri Pirko wrote:
>> >>>The goal of this is to provide a possibility to support various switch
>> >>>chips. Drivers should implement relevant ndos to do so. Now there is
>> >>>only one ndo defined:
>> >>>- for getting physical switch id is in place.
>> >>>
>> >>>Note that user can use random port netdevice to access the switch.
>> >>>
>> >>>Signed-off-by: Jiri Pirko <jiri@...nulli.us>
>> >>>---
>> >>>  Documentation/networking/switchdev.txt | 59 ++++++++++++++++++++++++++++++++++
>> >>>  MAINTAINERS                            |  7 ++++
>> >>>  include/linux/netdevice.h              | 10 ++++++
>> >>>  include/net/switchdev.h                | 30 +++++++++++++++++
>> >>>  net/Kconfig                            |  1 +
>> >>>  net/Makefile                           |  3 ++
>> >>>  net/switchdev/Kconfig                  | 13 ++++++++
>> >>>  net/switchdev/Makefile                 |  5 +++
>> >>>  net/switchdev/switchdev.c              | 33 +++++++++++++++++++
>> >>>  9 files changed, 161 insertions(+)
>> >>>  create mode 100644 Documentation/networking/switchdev.txt
>> >>>  create mode 100644 include/net/switchdev.h
>> >>>  create mode 100644 net/switchdev/Kconfig
>> >>>  create mode 100644 net/switchdev/Makefile
>> >>>  create mode 100644 net/switchdev/switchdev.c
>> >>>
>> >>>diff --git a/Documentation/networking/switchdev.txt b/Documentation/networking/switchdev.txt
>> >>>new file mode 100644
>> >>>index 0000000..98be76c
>> >>>--- /dev/null
>> >>>+++ b/Documentation/networking/switchdev.txt
>> >>>@@ -0,0 +1,59 @@
>> >>>+Switch (and switch-ish) device drivers HOWTO
>> >>>+===========================
>> >>>+
>> >>>+Please note that the word "switch" is here used in very generic meaning.
>> >>>+This include devices supporting L2/L3 but also various flow offloading chips,
>> >>>+including switches embedded into SR-IOV NICs.
>> >>>+
>> >>>+Lets describe a topology a bit. Imagine the following example:
>> >>>+
>> >>>+       +----------------------------+    +---------------+
>> >>>+       |     SOME switch chip       |    |      CPU      |
>> >>>+       +----------------------------+    +---------------+
>> >>>+       port1 port2 port3 port4 MNGMNT    |     PCI-E     |
>> >>>+         |     |     |     |     |       +---------------+
>> >>>+        PHY   PHY    |     |     |         |  NIC0 NIC1
>> >>>+                     |     |     |         |   |    |
>> >>>+                     |     |     +- PCI-E -+   |    |
>> >>>+                     |     +------- MII -------+    |
>> >>>+                     +------------- MII ------------+
>> >>>+
>> >>>+In this example, there are two independent lines between the switch silicon
>> >>>+and CPU. NIC0 and NIC1 drivers are not aware of a switch presence. They are
>> >>>+separate from the switch driver. SOME switch chip is by managed by a driver
>> >>>+via PCI-E device MNGMNT. Note that MNGMNT device, NIC0 and NIC1 may be
>> >>>+connected to some other type of bus.
>> >>>+
>> >>>+Now, for the previous example show the representation in kernel:
>> >>>+
>> >>>+       +----------------------------+    +---------------+
>> >>>+       |     SOME switch chip       |    |      CPU      |
>> >>>+       +----------------------------+    +---------------+
>> >>>+       sw0p0 sw0p1 sw0p2 sw0p3 MNGMNT    |     PCI-E     |
>> >>>+         |     |     |     |     |       +---------------+
>> >>>+        PHY   PHY    |     |     |         |  eth0 eth1
>> >>>+                     |     |     |         |   |    |
>> >>>+                     |     |     +- PCI-E -+   |    |
>> >>>+                     |     +------- MII -------+    |
>> >>>+                     +------------- MII ------------+
>> >>>+
>> >>>+Lets call the example switch driver for SOME switch chip "SOMEswitch". This
>> >>>+driver takes care of PCI-E device MNGMNT. There is a netdevice instance sw0pX
>> >>>+created for each port of a switch. These netdevices are instances
>> >>>+of "SOMEswitch" driver. sw0pX netdevices serve as a "representation"
>> >>>+of the switch chip. eth0 and eth1 are instances of some other existing driver.
>> >>>+
>> >>>+The only difference of the switch-port netdevice from the ordinary netdevice
>> >>>+is that is implements couple more NDOs:
>> >>>+
>> >>>+	ndo_sw_parent_get_id - This returns the same ID for two port netdevices
>> >>>+			       of the same physical switch chip. This is
>> >>>+			       mandatory to be implemented by all switch drivers
>> >>>+			       and serves the caller for recognition of a port
>> >>>+			       netdevice.
>> >>>+	ndo_sw_parent_* - Functions that serve for a manipulation of the switch
>> >>>+			  chip itself (it can be though of as a "parent" of the
>> >>>+			  port, therefore the name). They are not port-specific.
>> >>>+			  Caller might use arbitrary port netdevice of the same
>> >>>+			  switch and it will make no difference.
>> >>>+	ndo_sw_port_* - Functions that serve for a port-specific manipulation.
>> >>>diff --git a/MAINTAINERS b/MAINTAINERS
>> >>>index 3a41fb0..776e078 100644
>> >>>--- a/MAINTAINERS
>> >>>+++ b/MAINTAINERS
>> >>>@@ -9003,6 +9003,13 @@ F:	lib/swiotlb.c
>> >>>  F:	arch/*/kernel/pci-swiotlb.c
>> >>>  F:	include/linux/swiotlb.h
>> >>>+SWITCHDEV
>> >>>+M:	Jiri Pirko <jiri@...nulli.us>
>> >>>+L:	netdev@...r.kernel.org
>> >>>+S:	Supported
>> >>>+F:	net/switchdev/
>> >>>+F:	include/net/switchdev.h
>> >>>+
>> >>>  SYNOPSYS ARC ARCHITECTURE
>> >>>  M:	Vineet Gupta <vgupta@...opsys.com>
>> >>>  S:	Supported
>> >>>diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
>> >>>index 71922e0..97eade9 100644
>> >>>--- a/include/linux/netdevice.h
>> >>>+++ b/include/linux/netdevice.h
>> >>>@@ -1017,6 +1017,12 @@ typedef u16 (*select_queue_fallback_t)(struct net_device *dev,
>> >>>   *	performing GSO on a packet. The device returns true if it is
>> >>>   *	able to GSO the packet, false otherwise. If the return value is
>> >>>   *	false the stack will do software GSO.
>> >>>+ *
>> >>>+ * int (*ndo_sw_parent_id_get)(struct net_device *dev,
>> >>>+ *			       struct netdev_phys_item_id *psid);
>> >>>+ *	Called to get an ID of the switch chip this port is part of.
>> >>>+ *	If driver implements this, it indicates that it represents a port
>> >>>+ *	of a switch chip.
>> >>>   */
>> >>>  struct net_device_ops {
>> >>>  	int			(*ndo_init)(struct net_device *dev);
>> >>>@@ -1168,6 +1174,10 @@ struct net_device_ops {
>> >>>  	int			(*ndo_get_lock_subclass)(struct net_device *dev);
>> >>>  	bool			(*ndo_gso_check) (struct sk_buff *skb,
>> >>>  						  struct net_device *dev);
>> >>>+#ifdef CONFIG_NET_SWITCHDEV
>> >>>+	int			(*ndo_sw_parent_id_get)(struct net_device *dev,
>> >>>+							struct netdev_phys_item_id *psid);
>> >>Can we keep the name generic and not include "sw" which implies switch here
>> >>?.
>> >>I understand that it is under CONFIG_NET_SWITCHDEV but we might find use for
>> >>them in other offload scenarios in the future.
>> >>This particular ndo can be just ndo_parent_id_get().
>> >>And the others that do specific offloads can have "offload" in them if
>> >>required..?.
>> >
>> >But this is for getting parent switch id, sw should be there.
>> 
>> Since we have not figured out the details or namespace for switchd ids yet,
>> its still some parent id to me.
>> 
>> >If comes a
>> >time when this might be reused to something else, we change it then.
>> >This is internal api, easily changeable.
>> also, "sw" seems more "software"  than "switch".
>
>I had voiced this same concern when we met and discussed this in
>Dusseldorf.  Let's move to another name such as 'hw' (since we really
>are talking about hardware abstraction) or 'offload.'  Just using 'sw'
>is confusing as many will not read it as switch.
>
>I'll be happy to post a fix based on your devel patches.

Np, I'll take care of it.

>
>
>> 
>> >
>> >>
>> >>
>> >>>+#endif
>> >>>  };
>> >>>  /**
>> >>>diff --git a/include/net/switchdev.h b/include/net/switchdev.h
>> >>>new file mode 100644
>> >>>index 0000000..79bf9bd
>> >>>--- /dev/null
>> >>>+++ b/include/net/switchdev.h
>> >>>@@ -0,0 +1,30 @@
>> >>>+/*
>> >>>+ * include/net/switchdev.h - Switch device API
>> >>>+ * Copyright (c) 2014 Jiri Pirko <jiri@...nulli.us>
>> >>>+ *
>> >>>+ * This program is free software; you can redistribute it and/or modify
>> >>>+ * it under the terms of the GNU General Public License as published by
>> >>>+ * the Free Software Foundation; either version 2 of the License, or
>> >>>+ * (at your option) any later version.
>> >>>+ */
>> >>>+#ifndef _LINUX_SWITCHDEV_H_
>> >>>+#define _LINUX_SWITCHDEV_H_
>> >>>+
>> >>>+#include <linux/netdevice.h>
>> >>>+
>> >>>+#ifdef CONFIG_NET_SWITCHDEV
>> >>>+
>> >>>+int netdev_sw_parent_id_get(struct net_device *dev,
>> >>>+			    struct netdev_phys_item_id *psid);
>> >>>+
>> >>>+#else
>> >>>+
>> >>>+static inline int netdev_sw_parent_id_get(struct net_device *dev,
>> >>>+					  struct netdev_phys_item_id *psid)
>> >>>+{
>> >>>+	return -EOPNOTSUPP;
>> >>>+}
>> >>>+
>> >>>+#endif
>> >>>+
>> >>>+#endif /* _LINUX_SWITCHDEV_H_ */
>> >>>diff --git a/net/Kconfig b/net/Kconfig
>> >>>index 99815b5..ff9ffc1 100644
>> >>>--- a/net/Kconfig
>> >>>+++ b/net/Kconfig
>> >>>@@ -228,6 +228,7 @@ source "net/vmw_vsock/Kconfig"
>> >>>  source "net/netlink/Kconfig"
>> >>>  source "net/mpls/Kconfig"
>> >>>  source "net/hsr/Kconfig"
>> >>>+source "net/switchdev/Kconfig"
>> >>>  config RPS
>> >>>  	boolean
>> >>>diff --git a/net/Makefile b/net/Makefile
>> >>>index 7ed1970..95fc694 100644
>> >>>--- a/net/Makefile
>> >>>+++ b/net/Makefile
>> >>>@@ -73,3 +73,6 @@ obj-$(CONFIG_OPENVSWITCH)	+= openvswitch/
>> >>>  obj-$(CONFIG_VSOCKETS)	+= vmw_vsock/
>> >>>  obj-$(CONFIG_NET_MPLS_GSO)	+= mpls/
>> >>>  obj-$(CONFIG_HSR)		+= hsr/
>> >>>+ifneq ($(CONFIG_NET_SWITCHDEV),)
>> >>>+obj-y				+= switchdev/
>> >>>+endif
>> >>>diff --git a/net/switchdev/Kconfig b/net/switchdev/Kconfig
>> >>>new file mode 100644
>> >>>index 0000000..1557545
>> >>>--- /dev/null
>> >>>+++ b/net/switchdev/Kconfig
>> >>>@@ -0,0 +1,13 @@
>> >>>+#
>> >>>+# Configuration for Switch device support
>> >>>+#
>> >>>+
>> >>>+config NET_SWITCHDEV
>> >>>+	boolean "Switch (and switch-ish) device support (EXPERIMENTAL)"
>> >>>+	depends on INET
>> >>>+	---help---
>> >>>+	  This module provides glue between core networking code and device
>> >>>+	  drivers in order to support hardware switch chips in very generic
>> >>>+	  meaning of the word "switch". This include devices supporting L2/L3 but
>> >>>+	  also various flow offloading chips, including switches embedded into
>> >>>+	  SR-IOV NICs.
>> >>>diff --git a/net/switchdev/Makefile b/net/switchdev/Makefile
>> >>>new file mode 100644
>> >>>index 0000000..5ed63ed
>> >>>--- /dev/null
>> >>>+++ b/net/switchdev/Makefile
>> >>>@@ -0,0 +1,5 @@
>> >>>+#
>> >>>+# Makefile for the Switch device API
>> >>>+#
>> >>>+
>> >>>+obj-$(CONFIG_NET_SWITCHDEV) += switchdev.o
>> >>>diff --git a/net/switchdev/switchdev.c b/net/switchdev/switchdev.c
>> >>>new file mode 100644
>> >>>index 0000000..5010f646
>> >>>--- /dev/null
>> >>>+++ b/net/switchdev/switchdev.c
>> >>>@@ -0,0 +1,33 @@
>> >>>+/*
>> >>>+ * net/switchdev/switchdev.c - Switch device API
>> >>>+ * Copyright (c) 2014 Jiri Pirko <jiri@...nulli.us>
>> >>>+ *
>> >>>+ * This program is free software; you can redistribute it and/or modify
>> >>>+ * it under the terms of the GNU General Public License as published by
>> >>>+ * the Free Software Foundation; either version 2 of the License, or
>> >>>+ * (at your option) any later version.
>> >>>+ */
>> >>>+
>> >>>+#include <linux/kernel.h>
>> >>>+#include <linux/types.h>
>> >>>+#include <linux/init.h>
>> >>>+#include <linux/netdevice.h>
>> >>>+#include <net/switchdev.h>
>> >>>+
>> >>>+/**
>> >>>+ *	netdev_sw_parent_id_get - Get ID of a switch
>> >>>+ *	@dev: port device
>> >>>+ *	@psid: switch ID
>> >>>+ *
>> >>>+ *	Get ID of a switch this port is part of.
>> >>>+ */
>> >>>+int netdev_sw_parent_id_get(struct net_device *dev,
>> >>>+			    struct netdev_phys_item_id *psid)
>> >>>+{
>> >>>+	const struct net_device_ops *ops = dev->netdev_ops;
>> >>>+
>> >>>+	if (!ops->ndo_sw_parent_id_get)
>> >>>+		return -EOPNOTSUPP;
>> >>>+	return ops->ndo_sw_parent_id_get(dev, psid);
>> >>>+}
>> >>>+EXPORT_SYMBOL(netdev_sw_parent_id_get);
>> >--
>> >To unsubscribe from this list: send the line "unsubscribe netdev" in
>> >the body of a message to majordomo@...r.kernel.org
>> >More majordomo info at  http://vger.kernel.org/majordomo-info.html
>> 
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Powered by blists - more mailing lists