|
@@ -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);
|