Commit cc8e27cc authored by Eli Cohen's avatar Eli Cohen Committed by Doug Ledford

net/core: Add support for configuring VF GUIDs

Add two new NLAs to support configuration of Infiniband node or port
GUIDs. New applications can choose to use this interface to configure
GUIDs with iproute2 with commands such as:

ip link set dev ib0 vf 0 node_guid 00:02:c9:03:00:21:6e:70
ip link set dev ib0 vf 0 port_guid 00:02:c9:03:00:21:6e:78

A new ndo, ndo_sef_vf_guid is introduced to notify the net device of the
request to change the GUID.
Signed-off-by: default avatarEli Cohen <eli@mellanox.com>
Reviewed-by: default avatarOr Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent fb532d6a
...@@ -1147,6 +1147,9 @@ struct net_device_ops { ...@@ -1147,6 +1147,9 @@ struct net_device_ops {
struct nlattr *port[]); struct nlattr *port[]);
int (*ndo_get_vf_port)(struct net_device *dev, int (*ndo_get_vf_port)(struct net_device *dev,
int vf, struct sk_buff *skb); int vf, struct sk_buff *skb);
int (*ndo_set_vf_guid)(struct net_device *dev,
int vf, u64 guid,
int guid_type);
int (*ndo_set_vf_rss_query_en)( int (*ndo_set_vf_rss_query_en)(
struct net_device *dev, struct net_device *dev,
int vf, bool setting); int vf, bool setting);
......
...@@ -556,6 +556,8 @@ enum { ...@@ -556,6 +556,8 @@ enum {
*/ */
IFLA_VF_STATS, /* network device statistics */ IFLA_VF_STATS, /* network device statistics */
IFLA_VF_TRUST, /* Trust VF */ IFLA_VF_TRUST, /* Trust VF */
IFLA_VF_IB_NODE_GUID, /* VF Infiniband node GUID */
IFLA_VF_IB_PORT_GUID, /* VF Infiniband port GUID */
__IFLA_VF_MAX, __IFLA_VF_MAX,
}; };
...@@ -588,6 +590,11 @@ struct ifla_vf_spoofchk { ...@@ -588,6 +590,11 @@ struct ifla_vf_spoofchk {
__u32 setting; __u32 setting;
}; };
struct ifla_vf_guid {
__u32 vf;
__u64 guid;
};
enum { enum {
IFLA_VF_LINK_STATE_AUTO, /* link state of the uplink */ IFLA_VF_LINK_STATE_AUTO, /* link state of the uplink */
IFLA_VF_LINK_STATE_ENABLE, /* link always up */ IFLA_VF_LINK_STATE_ENABLE, /* link always up */
......
...@@ -1387,6 +1387,8 @@ static const struct nla_policy ifla_vf_policy[IFLA_VF_MAX+1] = { ...@@ -1387,6 +1387,8 @@ static const struct nla_policy ifla_vf_policy[IFLA_VF_MAX+1] = {
[IFLA_VF_RSS_QUERY_EN] = { .len = sizeof(struct ifla_vf_rss_query_en) }, [IFLA_VF_RSS_QUERY_EN] = { .len = sizeof(struct ifla_vf_rss_query_en) },
[IFLA_VF_STATS] = { .type = NLA_NESTED }, [IFLA_VF_STATS] = { .type = NLA_NESTED },
[IFLA_VF_TRUST] = { .len = sizeof(struct ifla_vf_trust) }, [IFLA_VF_TRUST] = { .len = sizeof(struct ifla_vf_trust) },
[IFLA_VF_IB_NODE_GUID] = { .len = sizeof(struct ifla_vf_guid) },
[IFLA_VF_IB_PORT_GUID] = { .len = sizeof(struct ifla_vf_guid) },
}; };
static const struct nla_policy ifla_vf_stats_policy[IFLA_VF_STATS_MAX + 1] = { static const struct nla_policy ifla_vf_stats_policy[IFLA_VF_STATS_MAX + 1] = {
...@@ -1534,6 +1536,22 @@ static int validate_linkmsg(struct net_device *dev, struct nlattr *tb[]) ...@@ -1534,6 +1536,22 @@ static int validate_linkmsg(struct net_device *dev, struct nlattr *tb[])
return 0; return 0;
} }
static int handle_infiniband_guid(struct net_device *dev, struct ifla_vf_guid *ivt,
int guid_type)
{
const struct net_device_ops *ops = dev->netdev_ops;
return ops->ndo_set_vf_guid(dev, ivt->vf, ivt->guid, guid_type);
}
static int handle_vf_guid(struct net_device *dev, struct ifla_vf_guid *ivt, int guid_type)
{
if (dev->type != ARPHRD_INFINIBAND)
return -EOPNOTSUPP;
return handle_infiniband_guid(dev, ivt, guid_type);
}
static int do_setvfinfo(struct net_device *dev, struct nlattr **tb) static int do_setvfinfo(struct net_device *dev, struct nlattr **tb)
{ {
const struct net_device_ops *ops = dev->netdev_ops; const struct net_device_ops *ops = dev->netdev_ops;
...@@ -1636,6 +1654,24 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb) ...@@ -1636,6 +1654,24 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb)
return err; return err;
} }
if (tb[IFLA_VF_IB_NODE_GUID]) {
struct ifla_vf_guid *ivt = nla_data(tb[IFLA_VF_IB_NODE_GUID]);
if (!ops->ndo_set_vf_guid)
return -EOPNOTSUPP;
return handle_vf_guid(dev, ivt, IFLA_VF_IB_NODE_GUID);
}
if (tb[IFLA_VF_IB_PORT_GUID]) {
struct ifla_vf_guid *ivt = nla_data(tb[IFLA_VF_IB_PORT_GUID]);
if (!ops->ndo_set_vf_guid)
return -EOPNOTSUPP;
return handle_vf_guid(dev, ivt, IFLA_VF_IB_PORT_GUID);
}
return err; return err;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment