|
@@ -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_STATS] = { .type = NLA_NESTED },
|
|
|
[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] = {
|
|
@@ -1534,6 +1536,22 @@ static int validate_linkmsg(struct net_device *dev, struct nlattr *tb[])
|
|
|
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)
|
|
|
{
|
|
|
const struct net_device_ops *ops = dev->netdev_ops;
|
|
@@ -1636,6 +1654,24 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb)
|
|
|
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;
|
|
|
}
|
|
|
|