From: sfeldma@gmail.com
To: netdev@vger.kernel.org
Cc: jiri@resnulli.us, roopa@cumulusnetworks.com, linux@roeck-us.net,
f.fainelli@gmail.com, sridhar.samudrala@intel.com,
ronen.arad@intel.com
Subject: [PATCH net-next v2 02/26] switchdev: convert parent_id_get to swdev attr get
Date: Wed, 1 Apr 2015 03:07:38 -0700 [thread overview]
Message-ID: <1427882882-2533-3-git-send-email-sfeldma@gmail.com> (raw)
In-Reply-To: <1427882882-2533-1-git-send-email-sfeldma@gmail.com>
From: Scott Feldman <sfeldma@gmail.com>
Switch ID is just a gettable port attribute. Convert swdev op
swdev_parent_id_get to a swdev attr.
Note: for sysfs and netlink interfaces, SWDEV_ATTR_PORT_PARENT_ID is called
with SWDEV_F_NO_RECUSE to limit switch ID user-visiblity to only port
netdevs. So port is stacked under bond/bridge, the user can only see switch
ID for port.
Signed-off-by: Scott Feldman <sfeldma@gmail.com>
---
drivers/net/ethernet/rocker/rocker.c | 16 +++++++++-----
include/net/switchdev.h | 18 ++++------------
net/core/net-sysfs.c | 10 ++++++---
net/core/rtnetlink.c | 9 +++++---
net/dsa/slave.c | 16 +++++++++-----
net/switchdev/switchdev.c | 38 ++++++++++------------------------
6 files changed, 50 insertions(+), 57 deletions(-)
diff --git a/drivers/net/ethernet/rocker/rocker.c b/drivers/net/ethernet/rocker/rocker.c
index c9558e6..00f55ab 100644
--- a/drivers/net/ethernet/rocker/rocker.c
+++ b/drivers/net/ethernet/rocker/rocker.c
@@ -4220,14 +4220,20 @@ static const struct net_device_ops rocker_port_netdev_ops = {
* swdev interface
********************/
-static int rocker_port_swdev_parent_id_get(struct net_device *dev,
- struct netdev_phys_item_id *psid)
+static int rocker_port_attr_get(struct net_device *dev, struct swdev_attr *attr)
{
struct rocker_port *rocker_port = netdev_priv(dev);
struct rocker *rocker = rocker_port->rocker;
- psid->id_len = sizeof(rocker->hw.id);
- memcpy(&psid->id, &rocker->hw.id, psid->id_len);
+ switch (attr->id) {
+ case SWDEV_ATTR_PORT_PARENT_ID:
+ attr->ppid.id_len = sizeof(rocker->hw.id);
+ memcpy(&attr->ppid.id, &rocker->hw.id, attr->ppid.id_len);
+ break;
+ default:
+ return -EOPNOTSUPP;
+ }
+
return 0;
}
@@ -4264,7 +4270,7 @@ static int rocker_port_swdev_fib_ipv4_del(struct net_device *dev,
}
static const struct swdev_ops rocker_port_swdev_ops = {
- .swdev_parent_id_get = rocker_port_swdev_parent_id_get,
+ .swdev_port_attr_get = rocker_port_attr_get,
.swdev_port_stp_update = rocker_port_swdev_port_stp_update,
.swdev_fib_ipv4_add = rocker_port_swdev_fib_ipv4_add,
.swdev_fib_ipv4_del = rocker_port_swdev_fib_ipv4_del,
diff --git a/include/net/switchdev.h b/include/net/switchdev.h
index b5a7d06..041fa42 100644
--- a/include/net/switchdev.h
+++ b/include/net/switchdev.h
@@ -19,11 +19,15 @@
enum swdev_attr_id {
SWDEV_ATTR_UNDEFINED,
+ SWDEV_ATTR_PORT_PARENT_ID,
};
struct swdev_attr {
enum swdev_attr_id id;
u32 flags;
+ union {
+ struct netdev_phys_item_id ppid; /* PORT_PARENT_ID */
+ };
};
struct fib_info;
@@ -31,10 +35,6 @@ struct fib_info;
/**
* struct switchdev_ops - switchdev operations
*
- * @swdev_parent_id_get: 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.
- *
* @swdev_port_attr_get: Get a port attribute (see swdev_attr).
*
* @swdev_port_attr_set: Set a port attribute (see swdev_attr).
@@ -47,8 +47,6 @@ struct fib_info;
* @swdev_fib_ipv4_del: Called to delete IPv4 route from switch device.
*/
struct swdev_ops {
- int (*swdev_parent_id_get)(struct net_device *dev,
- struct netdev_phys_item_id *psid);
int (*swdev_port_attr_get)(struct net_device *dev,
struct swdev_attr *attr);
int (*swdev_port_attr_set)(struct net_device *dev,
@@ -86,8 +84,6 @@ netdev_switch_notifier_info_to_dev(const struct netdev_switch_notifier_info *inf
#ifdef CONFIG_NET_SWITCHDEV
-int netdev_switch_parent_id_get(struct net_device *dev,
- struct netdev_phys_item_id *psid);
int swdev_port_attr_get(struct net_device *dev, struct swdev_attr *attr);
int swdev_port_attr_set(struct net_device *dev, struct swdev_attr *attr);
int netdev_switch_port_stp_update(struct net_device *dev, u8 state);
@@ -111,12 +107,6 @@ void netdev_switch_fib_ipv4_abort(struct fib_info *fi);
#else
-static inline int netdev_switch_parent_id_get(struct net_device *dev,
- struct netdev_phys_item_id *psid)
-{
- return -EOPNOTSUPP;
-}
-
static inline int swdev_port_attr_get(struct net_device *dev,
enum swdev_attr *attr)
{
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c
index cc5cf68..1239c99 100644
--- a/net/core/net-sysfs.c
+++ b/net/core/net-sysfs.c
@@ -450,11 +450,15 @@ static ssize_t phys_switch_id_show(struct device *dev,
return restart_syscall();
if (dev_isalive(netdev)) {
- struct netdev_phys_item_id ppid;
+ struct swdev_attr attr = {
+ .id = SWDEV_ATTR_PORT_PARENT_ID,
+ .flags = SWDEV_F_NO_RECURSE,
+ };
- ret = netdev_switch_parent_id_get(netdev, &ppid);
+ ret = swdev_port_attr_get(netdev, &attr);
if (!ret)
- ret = sprintf(buf, "%*phN\n", ppid.id_len, ppid.id);
+ ret = sprintf(buf, "%*phN\n", attr.ppid.id_len,
+ attr.ppid.id);
}
rtnl_unlock();
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index b96ac21..3434724 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -1003,16 +1003,19 @@ static int rtnl_phys_port_name_fill(struct sk_buff *skb, struct net_device *dev)
static int rtnl_phys_switch_id_fill(struct sk_buff *skb, struct net_device *dev)
{
int err;
- struct netdev_phys_item_id psid;
+ struct swdev_attr attr = {
+ .id = SWDEV_ATTR_PORT_PARENT_ID,
+ .flags = SWDEV_F_NO_RECURSE,
+ };
- err = netdev_switch_parent_id_get(dev, &psid);
+ err = swdev_port_attr_get(dev, &attr);
if (err) {
if (err == -EOPNOTSUPP)
return 0;
return err;
}
- if (nla_put(skb, IFLA_PHYS_SWITCH_ID, psid.id_len, psid.id))
+ if (nla_put(skb, IFLA_PHYS_SWITCH_ID, attr.ppid.id_len, attr.ppid.id))
return -EMSGSIZE;
return 0;
diff --git a/net/dsa/slave.c b/net/dsa/slave.c
index 3597724..e994cba 100644
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -384,14 +384,20 @@ static int dsa_slave_bridge_port_leave(struct net_device *dev)
return ret;
}
-static int dsa_slave_parent_id_get(struct net_device *dev,
- struct netdev_phys_item_id *psid)
+static int dsa_slave_port_attr_get(struct net_device *dev,
+ struct swdev_attr *attr)
{
struct dsa_slave_priv *p = netdev_priv(dev);
struct dsa_switch *ds = p->parent;
- psid->id_len = sizeof(ds->index);
- memcpy(&psid->id, &ds->index, psid->id_len);
+ switch (attr->id) {
+ case SWDEV_ATTR_PORT_PARENT_ID:
+ attr->ppid.id_len = sizeof(ds->index);
+ memcpy(&attr->ppid.id, &ds->index, attr->ppid.id_len);
+ break;
+ default:
+ return -EOPNOTSUPP;
+ }
return 0;
}
@@ -678,7 +684,7 @@ static const struct net_device_ops dsa_slave_netdev_ops = {
};
static const struct swdev_ops dsa_slave_swdev_ops = {
- .swdev_parent_id_get = dsa_slave_parent_id_get,
+ .swdev_port_attr_get = dsa_slave_port_attr_get,
.swdev_port_stp_update = dsa_slave_stp_update,
};
diff --git a/net/switchdev/switchdev.c b/net/switchdev/switchdev.c
index e41cf72..753f117 100644
--- a/net/switchdev/switchdev.c
+++ b/net/switchdev/switchdev.c
@@ -19,24 +19,6 @@
#include <net/switchdev.h>
/**
- * netdev_switch_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_switch_parent_id_get(struct net_device *dev,
- struct netdev_phys_item_id *psid)
-{
- const struct swdev_ops *ops = dev->swdev_ops;
-
- if (!ops || !ops->swdev_parent_id_get)
- return -EOPNOTSUPP;
- return ops->swdev_parent_id_get(dev, psid);
-}
-EXPORT_SYMBOL_GPL(netdev_switch_parent_id_get);
-
-/**
* swdev_port_attr_get - Get port attribute
*
* @dev: port device
@@ -347,11 +329,10 @@ static struct net_device *netdev_switch_get_lowest_dev(struct net_device *dev)
struct list_head *iter;
/* Recusively search down until we find a sw port dev.
- * (A sw port dev supports swdev_parent_id_get).
+ * (A sw port dev supports swdev_port_attr_get).
*/
- if (dev->features & NETIF_F_HW_SWITCH_OFFLOAD &&
- ops && ops->swdev_parent_id_get)
+ if (ops && ops->swdev_port_attr_get)
return dev;
netdev_for_each_lower_dev(dev, lower_dev, iter) {
@@ -365,8 +346,10 @@ static struct net_device *netdev_switch_get_lowest_dev(struct net_device *dev)
static struct net_device *netdev_switch_get_dev_by_nhs(struct fib_info *fi)
{
- struct netdev_phys_item_id psid;
- struct netdev_phys_item_id prev_psid;
+ struct swdev_attr attr = {
+ .id = SWDEV_ATTR_PORT_PARENT_ID,
+ };
+ struct swdev_attr prev_attr;
struct net_device *dev = NULL;
int nhsel;
@@ -382,17 +365,18 @@ static struct net_device *netdev_switch_get_dev_by_nhs(struct fib_info *fi)
if (!dev)
return NULL;
- if (netdev_switch_parent_id_get(dev, &psid))
+ if (swdev_port_attr_get(dev, &attr))
return NULL;
if (nhsel > 0) {
- if (prev_psid.id_len != psid.id_len)
+ if (prev_attr.ppid.id_len != attr.ppid.id_len)
return NULL;
- if (memcmp(prev_psid.id, psid.id, psid.id_len))
+ if (memcmp(prev_attr.ppid.id, attr.ppid.id,
+ attr.ppid.id_len))
return NULL;
}
- prev_psid = psid;
+ prev_attr = attr;
}
return dev;
--
1.7.10.4
next prev parent reply other threads:[~2015-04-01 10:06 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-04-01 10:07 [PATCH net-next v2 00/26] switchdev: spring cleanup sfeldma
2015-04-01 10:07 ` [PATCH net-next v2 01/26] switchdev: introduce get/set attrs ops sfeldma
2015-04-01 12:19 ` Jamal Hadi Salim
2015-04-01 18:08 ` David Miller
2015-04-02 7:43 ` Scott Feldman
2015-04-02 16:05 ` David Miller
2015-04-02 17:38 ` Scott Feldman
2015-04-02 17:54 ` David Miller
2015-04-02 18:43 ` Andrew Lunn
2015-04-01 10:07 ` sfeldma [this message]
2015-04-01 10:07 ` [PATCH net-next v2 03/26] switchdev: convert STP update to swdev attr set sfeldma
2015-04-01 10:07 ` [PATCH net-next v2 04/26] switchdev: add bridge port flags attr sfeldma
2015-04-01 10:07 ` [PATCH net-next v2 05/26] rocker: use swdev get/set attr for bridge port flags sfeldma
2015-04-01 10:07 ` [PATCH net-next v2 06/26] switchdev: introduce swdev add/del obj ops sfeldma
2015-04-01 10:07 ` [PATCH net-next v2 07/26] switchdev: add port vlan obj sfeldma
2015-04-01 10:07 ` [PATCH net-next v2 08/26] rocker: use swdev add/del obj for bridge port vlans sfeldma
2015-04-01 10:07 ` [PATCH net-next v2 09/26] switchdev: add new swdev bridge setlink sfeldma
2015-04-01 10:07 ` [PATCH net-next v2 10/26] rocker: cut over to new swdev_port_bridge_setlink sfeldma
2015-04-01 10:07 ` [PATCH net-next v2 11/26] bonding: " sfeldma
2015-04-01 10:07 ` [PATCH net-next v2 12/26] team: " sfeldma
2015-04-01 10:07 ` [PATCH net-next v2 13/26] switchdev: remove old netdev_switch_port_bridge_setlink sfeldma
2015-04-01 10:07 ` [PATCH net-next v2 14/26] switchdev: add new swdev_port_bridge_dellink sfeldma
2015-04-01 10:07 ` [PATCH net-next v2 15/26] rocker: cut over to " sfeldma
2015-04-01 10:07 ` [PATCH net-next v2 16/26] bonding: " sfeldma
2015-04-01 10:07 ` [PATCH net-next v2 17/26] team: " sfeldma
2015-04-01 10:07 ` [PATCH net-next v2 18/26] switchdev: remove unused netdev_switch_port_bridge_dellink sfeldma
2015-04-01 10:07 ` [PATCH net-next v2 19/26] switchdev: add new swdev_port_bridge_getlink sfeldma
2015-04-01 10:07 ` [PATCH net-next v2 20/26] rocker: cut over to " sfeldma
2015-04-01 10:07 ` [PATCH net-next v2 21/26] bonding: " sfeldma
2015-04-01 10:07 ` [PATCH net-next v2 22/26] team: " sfeldma
2015-04-01 10:07 ` [PATCH net-next v2 23/26] switchdev: rename netdev_switch_fib_* to swdev_fib_* sfeldma
2015-04-01 10:08 ` [PATCH net-next v2 24/26] switchdev: rename netdev_switch_notifier_* to swdev_notifier_* sfeldma
2015-04-01 10:08 ` [PATCH net-next v2 25/26] switchdev: convert swdev_fib_ipv4_add/del over to swdev_port_obj_add/del sfeldma
2015-04-01 11:47 ` Jiri Pirko
2015-04-01 15:05 ` roopa
2015-04-01 16:05 ` Jiri Pirko
2015-04-03 18:00 ` Florian Fainelli
2015-04-06 21:56 ` Scott Feldman
2015-04-01 10:08 ` [PATCH net-next v2 26/26] switchdev: bring documentation up-to-date sfeldma
2015-04-01 11:40 ` [PATCH net-next v2 00/26] switchdev: spring cleanup Jiri Pirko
2015-04-01 18:02 ` Scott Feldman
2015-04-02 6:06 ` 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=1427882882-2533-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=ronen.arad@intel.com \
--cc=roopa@cumulusnetworks.com \
--cc=sridhar.samudrala@intel.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.