[PATCH net-next 03/18] switchdev: convert parent_id_get to swdev attr get
From: <hidden>
Date: 2015-03-30 08:39:48
Subsystem:
networking drivers, networking [dsa], networking [general], rocker driver, switchdev, the rest · Maintainers:
Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Vladimir Oltean, Jiri Pirko, Ivan Vecera, Linus Torvalds
From: Scott Feldman <redacted> 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_ATTR_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 <redacted> --- 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..4bcc555 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->attr) { + 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 dcf0cb7..fd36b5c 100644
--- a/include/net/switchdev.h
+++ b/include/net/switchdev.h@@ -16,6 +16,7 @@ enum swdev_attr_id { SWDEV_ATTR_UNDEFINED, + SWDEV_ATTR_PORT_PARENT_ID, }; #define SWDEV_ATTR_F_NO_RECURSE BIT(0)
@@ -24,6 +25,9 @@ enum swdev_attr_id { struct swdev_attr { enum swdev_attr_id attr; 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..dcec629 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 = { + .attr = SWDEV_ATTR_PORT_PARENT_ID, + .flags = SWDEV_ATTR_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..3ae6052 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 = { + .attr = SWDEV_ATTR_PORT_PARENT_ID, + .flags = SWDEV_ATTR_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..2a5bfde 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->attr) { + 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 f3cac92..24440c5 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
@@ -336,11 +318,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) {
@@ -354,8 +335,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 = { + .attr = SWDEV_ATTR_PORT_PARENT_ID, + }; + struct swdev_attr prev_attr; struct net_device *dev = NULL; int nhsel;
@@ -371,17 +354,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