netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [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).