From: Roopa Prabhu <roopa@cumulusnetworks.com>
To: Jiri Pirko <jiri@resnulli.us>
Cc: netdev@vger.kernel.org, davem@davemloft.net,
nhorman@tuxdriver.com, andy@greyhouse.net, tgraf@suug.ch,
dborkman@redhat.com, ogerlitz@mellanox.com, jesse@nicira.com,
pshelar@nicira.com, azhou@nicira.com, ben@decadent.org.uk,
stephen@networkplumber.org, jeffrey.t.kirsher@intel.com,
vyasevic@redhat.com, xiyou.wangcong@gmail.com,
john.r.fastabend@intel.com, edumazet@google.com,
jhs@mojatatu.com, sfeldma@gmail.com, f.fainelli@gmail.com,
linville@tuxdriver.com, jasowang@redhat.com,
ebiederm@xmission.com, nicolas.dichtel@6wind.com,
ryazanov.s.a@gmail.com, buytenh@wantstofly.org,
aviadr@mellanox.com, nbd@openwrt.org,
alexei.starovoitov@gmail.com, Neil.Jerram@metaswitch.com,
ronye@mellanox.com, simon.horman@netronome.com,
alexander.h.duyck@redhat.com, john.ronciak@intel.com,
mleitner@redhat.com, shrijeet@gmail.com,
gospo@cumulusnetworks.com, bcrl@kvack.org
Subject: Re: [patch net-next v2 02/10] net: introduce generic switch devices support
Date: Wed, 19 Nov 2014 05:59:19 -0800 [thread overview]
Message-ID: <546CA237.3010600@cumulusnetworks.com> (raw)
In-Reply-To: <20141119134645.GE1926@nanopsycho.orion>
On 11/19/14, 5:46 AM, Jiri Pirko wrote:
> Wed, Nov 19, 2014 at 02:28:10PM CET, roopa@cumulusnetworks.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@resnulli.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@resnulli.us>
>>> +L: netdev@vger.kernel.org
>>> +S: Supported
>>> +F: net/switchdev/
>>> +F: include/net/switchdev.h
>>> +
>>> SYNOPSYS ARC ARCHITECTURE
>>> M: Vineet Gupta <vgupta@synopsys.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".
>
>>
>>
>>> +#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@resnulli.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@resnulli.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@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2014-11-19 13:59 UTC|newest]
Thread overview: 100+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-09 10:51 [patch net-next v2 00/10] introduce rocker switch driver with hardware accelerated datapath api - phase 1: bridge fdb offload Jiri Pirko
2014-11-09 10:51 ` [patch net-next v2 01/10] net: rename netdev_phys_port_id to more generic name Jiri Pirko
2014-11-10 3:35 ` Jamal Hadi Salim
2014-11-10 5:23 ` David Miller
2014-11-10 12:06 ` Jamal Hadi Salim
2014-11-10 12:33 ` Daniel Borkmann
2014-11-10 12:56 ` Jamal Hadi Salim
2014-11-10 16:28 ` David Miller
2014-11-10 7:43 ` Jiri Pirko
2014-11-10 12:17 ` Jamal Hadi Salim
2014-11-10 13:16 ` Jiri Pirko
2014-11-10 13:20 ` Jamal Hadi Salim
2014-11-10 16:28 ` David Miller
2014-11-10 19:03 ` Jamal Hadi Salim
2014-11-10 21:57 ` John Fastabend
2014-11-09 10:51 ` [patch net-next v2 02/10] net: introduce generic switch devices support Jiri Pirko
2014-11-10 21:59 ` John Fastabend
2014-11-11 15:11 ` Jiri Pirko
2014-11-11 9:49 ` M. Braun
2014-11-11 10:04 ` Jiri Pirko
2014-11-19 13:28 ` Roopa Prabhu
2014-11-19 13:46 ` Jiri Pirko
2014-11-19 13:59 ` Roopa Prabhu [this message]
2014-11-20 15:55 ` Andy Gospodarek
2014-11-21 7:16 ` Jiri Pirko
2014-11-09 10:51 ` [patch net-next v2 03/10] rtnl: expose physical switch id for particular device Jiri Pirko
2014-11-10 3:43 ` Jamal Hadi Salim
2014-11-10 7:45 ` Jiri Pirko
2014-11-10 17:58 ` Roopa Prabhu
2014-11-10 20:02 ` Scott Feldman
2014-11-11 13:55 ` Roopa Prabhu
2014-11-10 22:14 ` Jiri Pirko
2014-11-10 22:31 ` John Fastabend
2014-11-10 22:01 ` John Fastabend
2014-11-09 10:51 ` [patch net-next v2 04/10] net-sysfs: " Jiri Pirko
2014-11-10 22:01 ` John Fastabend
2014-11-09 10:51 ` [patch net-next v2 05/10] rocker: introduce rocker switch driver Jiri Pirko
2014-11-10 22:04 ` John Fastabend
2014-11-11 14:29 ` Thomas Graf
2014-11-11 15:19 ` Jiri Pirko
2014-11-11 15:32 ` Thomas Graf
2014-11-11 15:40 ` Jiri Pirko
2014-11-11 16:10 ` Thomas Graf
2014-11-27 14:09 ` Florian Fainelli
2014-11-11 15:41 ` Roopa Prabhu
2014-11-11 15:44 ` John Fastabend
2014-11-11 15:28 ` Jiri Pirko
2014-11-09 10:51 ` [patch net-next v2 06/10] bridge: introduce fdb offloading via switchdev Jiri Pirko
2014-11-10 3:47 ` Jamal Hadi Salim
2014-11-10 8:15 ` Jiri Pirko
2014-11-10 9:30 ` Scott Feldman
2014-11-10 12:47 ` Jamal Hadi Salim
2014-11-10 13:47 ` Jiri Pirko
2014-11-10 19:13 ` Jamal Hadi Salim
2014-11-10 13:51 ` Thomas Graf
2014-11-10 17:30 ` Andy Gospodarek
2014-11-10 19:03 ` Roopa Prabhu
2014-11-12 13:43 ` Jiri Pirko
2014-11-09 10:51 ` [patch net-next v2 07/10] bridge: call netdev_sw_port_stp_update when bridge port STP status changes Jiri Pirko
2014-11-10 13:11 ` Jamal Hadi Salim
2014-11-10 14:04 ` Thomas Graf
2014-11-10 19:20 ` Jamal Hadi Salim
2014-11-10 15:59 ` Roopa Prabhu
2014-11-09 10:51 ` [patch net-next v2 08/10] bridge: add API to notify bridge driver of learned FBD on offloaded device Jiri Pirko
2014-11-11 14:21 ` Roopa Prabhu
2014-11-11 17:38 ` Scott Feldman
2014-11-11 21:43 ` Roopa Prabhu
2014-11-09 10:51 ` [patch net-next v2 09/10] rocker: implement rocker ofdpa flow table manipulation Jiri Pirko
2014-11-09 10:51 ` [patch net-next v2 10/10] rocker: implement L2 bridge offloading Jiri Pirko
2014-11-10 3:53 ` Jamal Hadi Salim
2014-11-10 8:18 ` Jiri Pirko
2014-11-10 9:10 ` Nicolas Dichtel
2014-11-10 8:46 ` Scott Feldman
2014-11-10 12:27 ` Jamal Hadi Salim
2014-11-10 16:12 ` Roopa Prabhu
2014-11-10 17:36 ` Scott Feldman
2014-11-10 18:35 ` Roopa Prabhu
2014-11-10 19:27 ` Jamal Hadi Salim
2014-11-10 19:47 ` Scott Feldman
2014-11-10 21:14 ` Jamal Hadi Salim
2014-11-10 19:25 ` Jamal Hadi Salim
2014-11-10 17:22 ` Scott Feldman
2014-11-09 16:40 ` [patch net-next] bridge: rename fdb_*_hw to fdb_*_hw_addr to avoid confusion Jiri Pirko
2014-11-11 2:33 ` David Miller
2014-11-11 7:20 ` Jiri Pirko
2014-11-10 3:31 ` [patch net-next v2 00/10] introduce rocker switch driver with hardware accelerated datapath api - phase 1: bridge fdb offload Jamal Hadi Salim
2014-11-10 3:46 ` Simon Horman
2014-11-10 4:03 ` Jamal Hadi Salim
2014-11-10 4:58 ` Simon Horman
2014-11-10 22:23 ` John Fastabend
2014-11-11 8:51 ` Simon Horman
2014-11-13 5:44 ` Simon Horman
2014-11-13 6:31 ` John Fastabend
2014-11-21 2:01 ` Simon Horman
2014-11-21 7:20 ` John Fastabend
2014-11-10 7:23 ` Jiri Pirko
2014-11-10 12:16 ` Jamal Hadi Salim
2014-11-10 13:12 ` Jiri Pirko
2014-11-10 16:48 ` Thomas Graf
2014-11-12 13:44 ` Jiri Pirko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=546CA237.3010600@cumulusnetworks.com \
--to=roopa@cumulusnetworks.com \
--cc=Neil.Jerram@metaswitch.com \
--cc=alexander.h.duyck@redhat.com \
--cc=alexei.starovoitov@gmail.com \
--cc=andy@greyhouse.net \
--cc=aviadr@mellanox.com \
--cc=azhou@nicira.com \
--cc=bcrl@kvack.org \
--cc=ben@decadent.org.uk \
--cc=buytenh@wantstofly.org \
--cc=davem@davemloft.net \
--cc=dborkman@redhat.com \
--cc=ebiederm@xmission.com \
--cc=edumazet@google.com \
--cc=f.fainelli@gmail.com \
--cc=gospo@cumulusnetworks.com \
--cc=jasowang@redhat.com \
--cc=jeffrey.t.kirsher@intel.com \
--cc=jesse@nicira.com \
--cc=jhs@mojatatu.com \
--cc=jiri@resnulli.us \
--cc=john.r.fastabend@intel.com \
--cc=john.ronciak@intel.com \
--cc=linville@tuxdriver.com \
--cc=mleitner@redhat.com \
--cc=nbd@openwrt.org \
--cc=netdev@vger.kernel.org \
--cc=nhorman@tuxdriver.com \
--cc=nicolas.dichtel@6wind.com \
--cc=ogerlitz@mellanox.com \
--cc=pshelar@nicira.com \
--cc=ronye@mellanox.com \
--cc=ryazanov.s.a@gmail.com \
--cc=sfeldma@gmail.com \
--cc=shrijeet@gmail.com \
--cc=simon.horman@netronome.com \
--cc=stephen@networkplumber.org \
--cc=tgraf@suug.ch \
--cc=vyasevic@redhat.com \
--cc=xiyou.wangcong@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.