From: sfeldma@gmail.com
To: netdev@vger.kernel.org
Cc: jiri@resnulli.us, roopa@cumulusnetworks.com, linux@roeck-us.net,
f.fainelli@gmail.com
Subject: [PATCH net-next 02/18] switchdev: flesh out get/set attr ops
Date: Mon, 30 Mar 2015 01:40:20 -0700 [thread overview]
Message-ID: <1427704836-8776-3-git-send-email-sfeldma@gmail.com> (raw)
In-Reply-To: <1427704836-8776-1-git-send-email-sfeldma@gmail.com>
From: Scott Feldman <sfeldma@gmail.com>
Add the basic algorithms for get/set attr ops. Use the same recusive algo to
walk lower devs we've used for STP updates, for example. For get, compare attr
value for each lower dev and only return success if attr values match across
all lower devs. For sets, set the same attr value for all lower devs. If
something goes wrong on one of the lower devs, revert all back to previous attr
value.
If lower dev recusion isn't desired, allow a flag SWDEV_ATTR_F_NO_RECURSE to
indicate get/set only work on port (lowest) device.
On set, allow a flag SWDEV_ATTR_F_NO_RECOVER to turn off automatic err
recovery.
Signed-off-by: Scott Feldman <sfeldma@gmail.com>
---
include/net/switchdev.h | 4 +++
net/switchdev/switchdev.c | 71 +++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 73 insertions(+), 2 deletions(-)
diff --git a/include/net/switchdev.h b/include/net/switchdev.h
index 7b72a4f..dcf0cb7 100644
--- a/include/net/switchdev.h
+++ b/include/net/switchdev.h
@@ -18,8 +18,12 @@ enum swdev_attr_id {
SWDEV_ATTR_UNDEFINED,
};
+#define SWDEV_ATTR_F_NO_RECURSE BIT(0)
+#define SWDEV_ATTR_F_NO_RECOVER BIT(1)
+
struct swdev_attr {
enum swdev_attr_id attr;
+ u32 flags;
};
struct fib_info;
diff --git a/net/switchdev/switchdev.c b/net/switchdev/switchdev.c
index a894fa5..f3cac92 100644
--- a/net/switchdev/switchdev.c
+++ b/net/switchdev/switchdev.c
@@ -44,10 +44,67 @@ EXPORT_SYMBOL_GPL(netdev_switch_parent_id_get);
*/
int swdev_port_attr_get(struct net_device *dev, struct swdev_attr *attr)
{
- return -EOPNOTSUPP;
+ const struct swdev_ops *ops = dev->swdev_ops;
+ struct net_device *lower_dev;
+ struct list_head *iter;
+ struct swdev_attr first = {
+ .attr = SWDEV_ATTR_UNDEFINED
+ };
+ int err = -EOPNOTSUPP;
+
+ if (ops && ops->swdev_port_attr_get)
+ return ops->swdev_port_attr_get(dev, attr);
+
+ if (attr->flags & SWDEV_ATTR_F_NO_RECURSE)
+ return err;
+
+ /* Switch device port(s) may be stacked under
+ * bond/team/vlan dev, so recurse down to get attr on
+ * each port. Return -ENODATA if attr values don't
+ * compare across ports.
+ */
+
+ netdev_for_each_lower_dev(dev, lower_dev, iter) {
+ err = swdev_port_attr_get(lower_dev, attr);
+ if (err)
+ break;
+ if (first.attr == SWDEV_ATTR_UNDEFINED)
+ first = *attr;
+ else if (memcmp(&first, attr, sizeof(*attr)))
+ return -ENODATA;
+ }
+
+ return err;
}
EXPORT_SYMBOL_GPL(swdev_port_attr_get);
+static int _swdev_port_attr_set(struct net_device *dev, struct swdev_attr *attr)
+{
+ const struct swdev_ops *ops = dev->swdev_ops;
+ struct net_device *lower_dev;
+ struct list_head *iter;
+ int err = -EOPNOTSUPP;
+
+ if (ops && ops->swdev_port_attr_set)
+ return ops->swdev_port_attr_set(dev, attr);
+
+ if (attr->flags & SWDEV_ATTR_F_NO_RECURSE)
+ return err;
+
+ /* Switch device port(s) may be stacked under
+ * bond/team/vlan dev, so recurse down to set attr on
+ * each port.
+ */
+
+ netdev_for_each_lower_dev(dev, lower_dev, iter) {
+ err = _swdev_port_attr_set(lower_dev, attr);
+ if (err)
+ break;
+ }
+
+ return err;
+}
+
/**
* swdev_port_attr_set - Set port attribute
*
@@ -56,7 +113,17 @@ EXPORT_SYMBOL_GPL(swdev_port_attr_get);
*/
int swdev_port_attr_set(struct net_device *dev, struct swdev_attr *attr)
{
- return -EOPNOTSUPP;
+ struct swdev_attr prev = *attr;
+ int err, get_err;
+
+ get_err = swdev_port_attr_get(dev, &prev);
+
+ err = _swdev_port_attr_set(dev, attr);
+ if (err && !get_err && !(attr->flags & SWDEV_ATTR_F_NO_RECOVER))
+ /* Some err on set: revert to previous value */
+ _swdev_port_attr_set(dev, &prev);
+
+ return err;
}
EXPORT_SYMBOL_GPL(swdev_port_attr_set);
--
1.7.10.4
next prev parent reply other threads:[~2015-03-30 8:39 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-30 8:40 [PATCH net-next 00/18] switchdev: spring cleanup sfeldma
2015-03-30 8:40 ` [PATCH net-next 01/18] switchdev: introduce get/set attrs ops sfeldma
2015-03-30 8:40 ` sfeldma [this message]
2015-03-30 11:55 ` [PATCH net-next 02/18] switchdev: flesh out get/set attr ops Jiri Pirko
2015-03-30 18:32 ` Arad, Ronen
2015-03-30 20:46 ` Jiri Pirko
2015-03-30 21:00 ` Scott Feldman
2015-03-31 0:22 ` Arad, Ronen
2015-03-31 0:38 ` Scott Feldman
2015-03-31 15:37 ` roopa
[not found] ` <CAJieiUh0Svt3LZsgoi7RaV8Be0eFyRvoJU3BmW7v3fEvwfXiHg@mail.gmail.com>
2015-03-31 16:05 ` Scott Feldman
2015-03-30 8:40 ` [PATCH net-next 03/18] switchdev: convert parent_id_get to swdev attr get sfeldma
2015-03-30 8:40 ` [PATCH net-next 04/18] switchdev: convert STP update to swdev attr set sfeldma
2015-03-30 11:54 ` Jiri Pirko
2015-03-30 13:47 ` roopa
2015-03-30 8:40 ` [PATCH net-next 05/18] switchdev: add bridge port flags attr sfeldma
2015-03-30 8:40 ` [PATCH net-next 06/18] rocker: use swdev get/set attr for bridge port flags sfeldma
2015-03-30 12:01 ` Jiri Pirko
2015-03-30 8:40 ` [PATCH net-next 07/18] switchdev: add new swdev bridge setlink sfeldma
2015-03-30 12:31 ` Jiri Pirko
2015-03-30 8:40 ` [PATCH net-next 08/18] rocker: cut over to new swdev_port_bridge_setlink sfeldma
2015-03-30 8:40 ` [PATCH net-next 09/18] bonding: " sfeldma
2015-03-30 8:40 ` [PATCH net-next 10/18] team: " sfeldma
2015-03-30 8:40 ` [PATCH net-next 11/18] switchdev: remove old netdev_switch_port_bridge_setlink sfeldma
2015-03-30 13:23 ` roopa
2015-03-30 20:20 ` Scott Feldman
2015-03-30 20:46 ` Arad, Ronen
2015-03-30 21:27 ` Scott Feldman
2015-03-31 0:08 ` Arad, Ronen
2015-03-31 0:44 ` Scott Feldman
2015-03-31 5:52 ` Jiri Pirko
2015-03-31 19:15 ` Arad, Ronen
2015-03-31 21:52 ` Jiri Pirko
2015-03-31 23:32 ` Arad, Ronen
2015-04-01 2:38 ` Scott Feldman
2015-04-01 12:03 ` Jamal Hadi Salim
2015-04-01 17:56 ` Scott Feldman
2015-04-02 1:01 ` Florian Fainelli
2015-03-30 8:40 ` [PATCH net-next 12/18] switchdev: remove unused netdev_switch_port_bridge_dellink sfeldma
2015-03-30 13:23 ` roopa
2015-03-30 8:40 ` [PATCH net-next 13/18] switchdev: remove unused NETIF_F_HW_SWITCH_OFFLOAD sfeldma
2015-03-30 13:38 ` roopa
2015-03-30 20:48 ` Samudrala, Sridhar
2015-03-30 21:20 ` Scott Feldman
2015-03-31 15:34 ` roopa
[not found] ` <CAJieiUiL4QRQAC30=bkYadYD2L2cOcn7mNLV98uH3Go0exMO+A@mail.gmail.com>
2015-03-31 16:03 ` Scott Feldman
2015-03-30 8:40 ` [PATCH net-next 14/18] switchdev: add new swdev_port_bridge_getlink sfeldma
2015-03-30 8:40 ` [PATCH net-next 15/18] rocker: cut over to " sfeldma
2015-03-30 8:40 ` [PATCH net-next 16/18] switchdev: rename netdev_switch_fib_* to swdev_fib_* sfeldma
2015-03-30 8:40 ` [PATCH net-next 17/18] switchdev: rename netdev_switch_notifier_* to swdev_notifier_* sfeldma
2015-03-30 8:40 ` [PATCH net-next 18/18] switchdev: bring documentation up-to-date sfeldma
2015-03-30 12:00 ` [PATCH net-next 00/18] switchdev: spring cleanup Jiri Pirko
2015-03-30 13:11 ` Andy Gospodarek
2015-03-30 15:00 ` roopa
2015-03-30 16:11 ` Or Gerlitz
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=1427704836-8776-3-git-send-email-sfeldma@gmail.com \
--to=sfeldma@gmail.com \
--cc=f.fainelli@gmail.com \
--cc=jiri@resnulli.us \
--cc=linux@roeck-us.net \
--cc=netdev@vger.kernel.org \
--cc=roopa@cumulusnetworks.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).