* [patch net-next 0/3] export device physical port id to userspace
@ 2013-07-19 13:55 Jiri Pirko
2013-07-19 13:55 ` [patch net-next 1/3] net: add ndo to get id of physical port of the device Jiri Pirko
` (3 more replies)
0 siblings, 4 replies; 8+ messages in thread
From: Jiri Pirko @ 2013-07-19 13:55 UTC (permalink / raw)
To: netdev; +Cc: davem, stephen, Narendra_K, bhutchings, john.r.fastabend
This patchset is based on patch by Narendra_K@Dell.com
Once device which can change phys port id during its lifetime adopts this,
NETDEV_CHANGEPHYSPORTID event will be added and driver will call
call_netdevice_notifiers(NETDEV_NETDEV_CHANGEPHYSPORTID, dev) to propagate
the change to userspace.
Jiri Pirko (3):
net: add ndo to get id of physical port of the device
rtnl: export physical port id via RT netlink
net: export physical port id via sysfs
include/linux/netdevice.h | 18 ++++++++++++++++++
include/uapi/linux/if_link.h | 1 +
net/core/net-sysfs.c | 41 +++++++++++++++++++++++++++++++++++++++++
net/core/rtnetlink.c | 25 ++++++++++++++++++++++++-
4 files changed, 84 insertions(+), 1 deletion(-)
--
1.8.1.4
^ permalink raw reply [flat|nested] 8+ messages in thread
* [patch net-next 1/3] net: add ndo to get id of physical port of the device
2013-07-19 13:55 [patch net-next 0/3] export device physical port id to userspace Jiri Pirko
@ 2013-07-19 13:55 ` Jiri Pirko
2013-07-19 13:55 ` [patch net-next 2/3] rtnl: export physical port id via RT netlink Jiri Pirko
` (2 subsequent siblings)
3 siblings, 0 replies; 8+ messages in thread
From: Jiri Pirko @ 2013-07-19 13:55 UTC (permalink / raw)
To: netdev; +Cc: davem, stephen, Narendra_K, bhutchings, john.r.fastabend
This patch adds a ndo for getting physical port of the device. Driver
which is aware of being virtual function of some physical port should
implement this ndo.
Signed-off-by: Jiri Pirko <jiri@resnulli.us>
---
include/linux/netdevice.h | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 0741a1e..c992741 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -728,6 +728,16 @@ struct netdev_fcoe_hbainfo {
};
#endif
+#define MAX_PHYS_PORT_ID_LEN 32
+
+/* This structure holds a unique identifier to identify the
+ * physical port used by a netdevice.
+ */
+struct netdev_phys_port_id {
+ unsigned char id[MAX_PHYS_PORT_ID_LEN];
+ unsigned char id_len;
+};
+
/*
* This structure defines the management hooks for network devices.
* The following hooks can be defined; unless noted otherwise, they are
@@ -932,6 +942,12 @@ struct netdev_fcoe_hbainfo {
* that determine carrier state from physical hardware properties (eg
* network cables) or protocol-dependent mechanisms (eg
* USB_CDC_NOTIFY_NETWORK_CONNECTION) should NOT implement this function.
+ *
+ * int (*ndo_get_phys_port_id)(struct net_device *dev,
+ * struct netdev_phys_port_id *ppid);
+ * Called to get ID of physical port of this device. If driver does
+ * not implement this, it is assumed that the hw is not able to have
+ * multiple net devices on single physical port.
*/
struct net_device_ops {
int (*ndo_init)(struct net_device *dev);
@@ -1060,6 +1076,8 @@ struct net_device_ops {
struct nlmsghdr *nlh);
int (*ndo_change_carrier)(struct net_device *dev,
bool new_carrier);
+ int (*ndo_get_phys_port_id)(struct net_device *dev,
+ struct netdev_phys_port_id *ppid);
};
/*
--
1.8.1.4
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [patch net-next 2/3] rtnl: export physical port id via RT netlink
2013-07-19 13:55 [patch net-next 0/3] export device physical port id to userspace Jiri Pirko
2013-07-19 13:55 ` [patch net-next 1/3] net: add ndo to get id of physical port of the device Jiri Pirko
@ 2013-07-19 13:55 ` Jiri Pirko
2013-07-19 16:07 ` Ben Hutchings
2013-07-19 13:55 ` [patch net-next 3/3] net: export physical port id via sysfs Jiri Pirko
2013-07-19 13:55 ` [patch iproute2] ip: show physical port id Jiri Pirko
3 siblings, 1 reply; 8+ messages in thread
From: Jiri Pirko @ 2013-07-19 13:55 UTC (permalink / raw)
To: netdev; +Cc: davem, stephen, Narendra_K, bhutchings, john.r.fastabend
Signed-off-by: Jiri Pirko <jiri@resnulli.us>
---
include/uapi/linux/if_link.h | 1 +
net/core/rtnetlink.c | 25 ++++++++++++++++++++++++-
2 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h
index 03f6170..04c0e7a 100644
--- a/include/uapi/linux/if_link.h
+++ b/include/uapi/linux/if_link.h
@@ -143,6 +143,7 @@ enum {
IFLA_NUM_TX_QUEUES,
IFLA_NUM_RX_QUEUES,
IFLA_CARRIER,
+ IFLA_PHYS_PORT_ID,
__IFLA_MAX
};
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 3de7408..2bd0e67 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -767,7 +767,8 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev,
+ rtnl_vfinfo_size(dev, ext_filter_mask) /* IFLA_VFINFO_LIST */
+ rtnl_port_size(dev) /* IFLA_VF_PORTS + IFLA_PORT_SELF */
+ rtnl_link_get_size(dev) /* IFLA_LINKINFO */
- + rtnl_link_get_af_size(dev); /* IFLA_AF_SPEC */
+ + rtnl_link_get_af_size(dev) /* IFLA_AF_SPEC */
+ + nla_total_size(MAX_PHYS_PORT_ID_LEN); /* IFLA_PHYS_PORT_ID */
}
static int rtnl_vf_ports_fill(struct sk_buff *skb, struct net_device *dev)
@@ -846,6 +847,24 @@ static int rtnl_port_fill(struct sk_buff *skb, struct net_device *dev)
return 0;
}
+static int rtnl_phys_port_id_fill(struct sk_buff *skb, struct net_device *dev)
+{
+ int err;
+ struct netdev_phys_port_id ppid;
+
+ if (!dev->netdev_ops->ndo_get_phys_port_id)
+ return 0;
+
+ err = dev->netdev_ops->ndo_get_phys_port_id(dev, &ppid);
+ if (err)
+ return err;
+
+ if (nla_put(skb, IFLA_PHYS_PORT_ID, ppid.id_len, ppid.id))
+ return -EMSGSIZE;
+
+ return 0;
+}
+
static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
int type, u32 pid, u32 seq, u32 change,
unsigned int flags, u32 ext_filter_mask)
@@ -913,6 +932,9 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
goto nla_put_failure;
}
+ if (rtnl_phys_port_id_fill(skb, dev))
+ goto nla_put_failure;
+
attr = nla_reserve(skb, IFLA_STATS,
sizeof(struct rtnl_link_stats));
if (attr == NULL)
@@ -1113,6 +1135,7 @@ const struct nla_policy ifla_policy[IFLA_MAX+1] = {
[IFLA_PROMISCUITY] = { .type = NLA_U32 },
[IFLA_NUM_TX_QUEUES] = { .type = NLA_U32 },
[IFLA_NUM_RX_QUEUES] = { .type = NLA_U32 },
+ [IFLA_PHYS_PORT_ID] = { .type = NLA_BINARY, .len = MAX_PHYS_PORT_ID_LEN },
};
EXPORT_SYMBOL(ifla_policy);
--
1.8.1.4
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [patch net-next 3/3] net: export physical port id via sysfs
2013-07-19 13:55 [patch net-next 0/3] export device physical port id to userspace Jiri Pirko
2013-07-19 13:55 ` [patch net-next 1/3] net: add ndo to get id of physical port of the device Jiri Pirko
2013-07-19 13:55 ` [patch net-next 2/3] rtnl: export physical port id via RT netlink Jiri Pirko
@ 2013-07-19 13:55 ` Jiri Pirko
2013-07-19 13:55 ` [patch iproute2] ip: show physical port id Jiri Pirko
3 siblings, 0 replies; 8+ messages in thread
From: Jiri Pirko @ 2013-07-19 13:55 UTC (permalink / raw)
To: netdev; +Cc: davem, stephen, Narendra_K, bhutchings, john.r.fastabend
Signed-off-by: Jiri Pirko <jiri@resnulli.us>
---
net/core/net-sysfs.c | 41 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 41 insertions(+)
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c
index 981fed3..fb19ede 100644
--- a/net/core/net-sysfs.c
+++ b/net/core/net-sysfs.c
@@ -334,6 +334,46 @@ static ssize_t store_group(struct device *dev, struct device_attribute *attr,
return netdev_store(dev, attr, buf, len, change_group);
}
+static size_t _format_port_id(char *buf, int buflen,
+ const unsigned char *id, int len)
+{
+ int i;
+ char *cp = buf;
+
+ for (i = 0; i < len; i++)
+ cp += scnprintf(cp, buflen - (cp - buf), "%02x", id[i]);
+ return cp - buf;
+}
+
+ssize_t sysfs_format_port_id(char *buf, const unsigned char *id, int len)
+{
+ size_t l;
+
+ l = _format_port_id(buf, PAGE_SIZE, id, len);
+ l += scnprintf(buf + l, PAGE_SIZE - l, "\n");
+ return (ssize_t)l;
+}
+static ssize_t show_phys_port_id(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct net_device *netdev = to_net_dev(dev);
+ ssize_t ret = 0;
+
+ if (!rtnl_trylock())
+ return restart_syscall();
+
+ if (dev_isalive(netdev) && netdev->netdev_ops->ndo_get_phys_port_id) {
+ struct netdev_phys_port_id ppid;
+
+ ret = netdev->netdev_ops->ndo_get_phys_port_id(netdev, &ppid);
+ if (!ret)
+ ret = sysfs_format_port_id(buf, ppid.id, ppid.id_len);
+ }
+ rtnl_unlock();
+
+ return ret;
+}
+
static struct device_attribute net_class_attributes[] = {
__ATTR(addr_assign_type, S_IRUGO, show_addr_assign_type, NULL),
__ATTR(addr_len, S_IRUGO, show_addr_len, NULL),
@@ -355,6 +395,7 @@ static struct device_attribute net_class_attributes[] = {
__ATTR(tx_queue_len, S_IRUGO | S_IWUSR, show_tx_queue_len,
store_tx_queue_len),
__ATTR(netdev_group, S_IRUGO | S_IWUSR, show_group, store_group),
+ __ATTR(phys_port_id, S_IRUGO, show_phys_port_id, NULL),
{}
};
--
1.8.1.4
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [patch iproute2] ip: show physical port id
2013-07-19 13:55 [patch net-next 0/3] export device physical port id to userspace Jiri Pirko
` (2 preceding siblings ...)
2013-07-19 13:55 ` [patch net-next 3/3] net: export physical port id via sysfs Jiri Pirko
@ 2013-07-19 13:55 ` Jiri Pirko
2013-08-04 18:48 ` Stephen Hemminger
3 siblings, 1 reply; 8+ messages in thread
From: Jiri Pirko @ 2013-07-19 13:55 UTC (permalink / raw)
To: netdev; +Cc: davem, stephen, Narendra_K, bhutchings, john.r.fastabend
Signed-off-by: Jiri Pirko <jiri@resnulli.us>
---
include/linux/if_link.h | 1 +
ip/ipaddress.c | 10 ++++++++++
2 files changed, 11 insertions(+)
diff --git a/include/linux/if_link.h b/include/linux/if_link.h
index 965dc9f..ea0d5b7 100644
--- a/include/linux/if_link.h
+++ b/include/linux/if_link.h
@@ -143,6 +143,7 @@ enum {
IFLA_NUM_TX_QUEUES,
IFLA_NUM_RX_QUEUES,
IFLA_CARRIER,
+ IFLA_PHYS_PORT_ID,
__IFLA_MAX
};
diff --git a/ip/ipaddress.c b/ip/ipaddress.c
index 5b9a438..0c7c55b 100644
--- a/ip/ipaddress.c
+++ b/ip/ipaddress.c
@@ -429,6 +429,16 @@ int print_linkinfo(const struct sockaddr_nl *who,
fprintf(fp, "master %s ", ll_idx_n2a(*(int*)RTA_DATA(tb[IFLA_MASTER]), b1));
}
+ if (tb[IFLA_PHYS_PORT_ID]) {
+ int i;
+ unsigned char *buf = RTA_DATA(tb[IFLA_PHYS_PORT_ID]);
+ unsigned char len = RTA_PAYLOAD(tb[IFLA_PHYS_PORT_ID]);
+
+ fprintf(fp, "phys_port_id ");
+ for (i = 0; i < len; i++)
+ fprintf(fp, "%02x", buf[i]);
+ fprintf(fp, " ");
+ }
if (tb[IFLA_OPERSTATE])
print_operstate(fp, rta_getattr_u8(tb[IFLA_OPERSTATE]));
--
1.8.1.4
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [patch net-next 2/3] rtnl: export physical port id via RT netlink
2013-07-19 13:55 ` [patch net-next 2/3] rtnl: export physical port id via RT netlink Jiri Pirko
@ 2013-07-19 16:07 ` Ben Hutchings
2013-07-19 17:13 ` Jiri Pirko
0 siblings, 1 reply; 8+ messages in thread
From: Ben Hutchings @ 2013-07-19 16:07 UTC (permalink / raw)
To: Jiri Pirko; +Cc: netdev, davem, stephen, Narendra_K, john.r.fastabend
On Fri, 2013-07-19 at 15:55 +0200, Jiri Pirko wrote:
> Signed-off-by: Jiri Pirko <jiri@resnulli.us>
> ---
> include/uapi/linux/if_link.h | 1 +
> net/core/rtnetlink.c | 25 ++++++++++++++++++++++++-
> 2 files changed, 25 insertions(+), 1 deletion(-)
>
> diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h
> index 03f6170..04c0e7a 100644
> --- a/include/uapi/linux/if_link.h
> +++ b/include/uapi/linux/if_link.h
[...]
> @@ -846,6 +847,24 @@ static int rtnl_port_fill(struct sk_buff *skb, struct net_device *dev)
> return 0;
> }
>
> +static int rtnl_phys_port_id_fill(struct sk_buff *skb, struct net_device *dev)
> +{
> + int err;
> + struct netdev_phys_port_id ppid;
> +
> + if (!dev->netdev_ops->ndo_get_phys_port_id)
> + return 0;
> +
> + err = dev->netdev_ops->ndo_get_phys_port_id(dev, &ppid);
> + if (err)
> + return err;
[...]
I can imagine a driver only sometimes being able to get the physical
port ID, depending on hardware variant or firmware version. That
shouldn't require defining another instance of net_device_ops. So if
the error is -EOPNOTSUPP this should return 0, same as if the function
pointer is NULL.
Ben.
--
Ben Hutchings, Staff Engineer, Solarflare
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [patch net-next 2/3] rtnl: export physical port id via RT netlink
2013-07-19 16:07 ` Ben Hutchings
@ 2013-07-19 17:13 ` Jiri Pirko
0 siblings, 0 replies; 8+ messages in thread
From: Jiri Pirko @ 2013-07-19 17:13 UTC (permalink / raw)
To: Ben Hutchings; +Cc: netdev, davem, stephen, Narendra_K, john.r.fastabend
Fri, Jul 19, 2013 at 06:07:10PM CEST, bhutchings@solarflare.com wrote:
>On Fri, 2013-07-19 at 15:55 +0200, Jiri Pirko wrote:
>> Signed-off-by: Jiri Pirko <jiri@resnulli.us>
>> ---
>> include/uapi/linux/if_link.h | 1 +
>> net/core/rtnetlink.c | 25 ++++++++++++++++++++++++-
>> 2 files changed, 25 insertions(+), 1 deletion(-)
>>
>> diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h
>> index 03f6170..04c0e7a 100644
>> --- a/include/uapi/linux/if_link.h
>> +++ b/include/uapi/linux/if_link.h
>[...]
>> @@ -846,6 +847,24 @@ static int rtnl_port_fill(struct sk_buff *skb, struct net_device *dev)
>> return 0;
>> }
>>
>> +static int rtnl_phys_port_id_fill(struct sk_buff *skb, struct net_device *dev)
>> +{
>> + int err;
>> + struct netdev_phys_port_id ppid;
>> +
>> + if (!dev->netdev_ops->ndo_get_phys_port_id)
>> + return 0;
>> +
>> + err = dev->netdev_ops->ndo_get_phys_port_id(dev, &ppid);
>> + if (err)
>> + return err;
>[...]
>
>I can imagine a driver only sometimes being able to get the physical
>port ID, depending on hardware variant or firmware version. That
>shouldn't require defining another instance of net_device_ops. So if
>the error is -EOPNOTSUPP this should return 0, same as if the function
>pointer is NULL.
Makes sense. I will adjust this. Thanks Ben.
>
>Ben.
>
>--
>Ben Hutchings, Staff Engineer, Solarflare
>Not speaking for my employer; that's the marketing department's job.
>They asked us to note that Solarflare product names are trademarked.
>
>--
>To unsubscribe from this list: send the line "unsubscribe netdev" in
>the body of a message to majordomo@vger.kernel.org
>More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [patch iproute2] ip: show physical port id
2013-07-19 13:55 ` [patch iproute2] ip: show physical port id Jiri Pirko
@ 2013-08-04 18:48 ` Stephen Hemminger
0 siblings, 0 replies; 8+ messages in thread
From: Stephen Hemminger @ 2013-08-04 18:48 UTC (permalink / raw)
To: Jiri Pirko; +Cc: netdev, davem, Narendra_K, bhutchings, john.r.fastabend
On Fri, 19 Jul 2013 15:55:52 +0200
Jiri Pirko <jiri@resnulli.us> wrote:
> Signed-off-by: Jiri Pirko <jiri@resnulli.us>
Applied to net-next-3.11 branch to go into the matching release
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2013-08-04 18:49 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-07-19 13:55 [patch net-next 0/3] export device physical port id to userspace Jiri Pirko
2013-07-19 13:55 ` [patch net-next 1/3] net: add ndo to get id of physical port of the device Jiri Pirko
2013-07-19 13:55 ` [patch net-next 2/3] rtnl: export physical port id via RT netlink Jiri Pirko
2013-07-19 16:07 ` Ben Hutchings
2013-07-19 17:13 ` Jiri Pirko
2013-07-19 13:55 ` [patch net-next 3/3] net: export physical port id via sysfs Jiri Pirko
2013-07-19 13:55 ` [patch iproute2] ip: show physical port id Jiri Pirko
2013-08-04 18:48 ` Stephen Hemminger
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).