net-sysfs: expose physical switch id for particular device
authorJiri Pirko <jiri@resnulli.us>
Fri, 28 Nov 2014 13:34:19 +0000 (14:34 +0100)
committerDavid S. Miller <davem@davemloft.net>
Wed, 3 Dec 2014 04:01:22 +0000 (20:01 -0800)
Signed-off-by: Jiri Pirko <jiri@resnulli.us>
Reviewed-by: Thomas Graf <tgraf@suug.ch>
Acked-by: John Fastabend <john.r.fastabend@intel.com>
Acked-by: Andy Gospodarek <gospo@cumulusnetworks.com>
Acked-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Documentation/ABI/testing/sysfs-class-net
net/core/net-sysfs.c

index e1b2e78..beb8ec4 100644 (file)
@@ -216,3 +216,11 @@ Contact:   netdev@vger.kernel.org
 Description:
                Indicates the interface protocol type as a decimal value. See
                include/uapi/linux/if_arp.h for all possible values.
+
+What:          /sys/class/net/<iface>/phys_switch_id
+Date:          November 2014
+KernelVersion: 3.19
+Contact:       netdev@vger.kernel.org
+Description:
+               Indicates the unique physical switch identifier of a switch this
+               port belongs to, as a string.
index 26c46f4..9993412 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/capability.h>
 #include <linux/kernel.h>
 #include <linux/netdevice.h>
+#include <net/switchdev.h>
 #include <linux/if_arp.h>
 #include <linux/slab.h>
 #include <linux/nsproxy.h>
@@ -416,6 +417,28 @@ static ssize_t phys_port_id_show(struct device *dev,
 }
 static DEVICE_ATTR_RO(phys_port_id);
 
+static ssize_t phys_switch_id_show(struct device *dev,
+                                  struct device_attribute *attr, char *buf)
+{
+       struct net_device *netdev = to_net_dev(dev);
+       ssize_t ret = -EINVAL;
+
+       if (!rtnl_trylock())
+               return restart_syscall();
+
+       if (dev_isalive(netdev)) {
+               struct netdev_phys_item_id ppid;
+
+               ret = netdev_switch_parent_id_get(netdev, &ppid);
+               if (!ret)
+                       ret = sprintf(buf, "%*phN\n", ppid.id_len, ppid.id);
+       }
+       rtnl_unlock();
+
+       return ret;
+}
+static DEVICE_ATTR_RO(phys_switch_id);
+
 static struct attribute *net_class_attrs[] = {
        &dev_attr_netdev_group.attr,
        &dev_attr_type.attr,
@@ -441,6 +464,7 @@ static struct attribute *net_class_attrs[] = {
        &dev_attr_tx_queue_len.attr,
        &dev_attr_gro_flush_timeout.attr,
        &dev_attr_phys_port_id.attr,
+       &dev_attr_phys_switch_id.attr,
        NULL,
 };
 ATTRIBUTE_GROUPS(net_class);