|
@@ -838,7 +838,8 @@ static inline int rtnl_vfinfo_size(const struct net_device *dev,
|
|
|
/* IFLA_VF_STATS_BROADCAST */
|
|
|
nla_total_size(sizeof(__u64)) +
|
|
|
/* IFLA_VF_STATS_MULTICAST */
|
|
|
- nla_total_size(sizeof(__u64)));
|
|
|
+ nla_total_size(sizeof(__u64)) +
|
|
|
+ nla_total_size(sizeof(struct ifla_vf_trust)));
|
|
|
return size;
|
|
|
} else
|
|
|
return 0;
|
|
@@ -1161,6 +1162,7 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
|
|
|
struct ifla_vf_link_state vf_linkstate;
|
|
|
struct ifla_vf_rss_query_en vf_rss_query_en;
|
|
|
struct ifla_vf_stats vf_stats;
|
|
|
+ struct ifla_vf_trust vf_trust;
|
|
|
|
|
|
/*
|
|
|
* Not all SR-IOV capable drivers support the
|
|
@@ -1170,6 +1172,7 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
|
|
|
*/
|
|
|
ivi.spoofchk = -1;
|
|
|
ivi.rss_query_en = -1;
|
|
|
+ ivi.trusted = -1;
|
|
|
memset(ivi.mac, 0, sizeof(ivi.mac));
|
|
|
/* The default value for VF link state is "auto"
|
|
|
* IFLA_VF_LINK_STATE_AUTO which equals zero
|
|
@@ -1183,7 +1186,8 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
|
|
|
vf_tx_rate.vf =
|
|
|
vf_spoofchk.vf =
|
|
|
vf_linkstate.vf =
|
|
|
- vf_rss_query_en.vf = ivi.vf;
|
|
|
+ vf_rss_query_en.vf =
|
|
|
+ vf_trust.vf = ivi.vf;
|
|
|
|
|
|
memcpy(vf_mac.mac, ivi.mac, sizeof(ivi.mac));
|
|
|
vf_vlan.vlan = ivi.vlan;
|
|
@@ -1194,6 +1198,7 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
|
|
|
vf_spoofchk.setting = ivi.spoofchk;
|
|
|
vf_linkstate.link_state = ivi.linkstate;
|
|
|
vf_rss_query_en.setting = ivi.rss_query_en;
|
|
|
+ vf_trust.setting = ivi.trusted;
|
|
|
vf = nla_nest_start(skb, IFLA_VF_INFO);
|
|
|
if (!vf) {
|
|
|
nla_nest_cancel(skb, vfinfo);
|
|
@@ -1211,7 +1216,9 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
|
|
|
&vf_linkstate) ||
|
|
|
nla_put(skb, IFLA_VF_RSS_QUERY_EN,
|
|
|
sizeof(vf_rss_query_en),
|
|
|
- &vf_rss_query_en))
|
|
|
+ &vf_rss_query_en) ||
|
|
|
+ nla_put(skb, IFLA_VF_TRUST,
|
|
|
+ sizeof(vf_trust), &vf_trust))
|
|
|
goto nla_put_failure;
|
|
|
memset(&vf_stats, 0, sizeof(vf_stats));
|
|
|
if (dev->netdev_ops->ndo_get_vf_stats)
|
|
@@ -1348,6 +1355,7 @@ static const struct nla_policy ifla_vf_policy[IFLA_VF_MAX+1] = {
|
|
|
[IFLA_VF_LINK_STATE] = { .len = sizeof(struct ifla_vf_link_state) },
|
|
|
[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) },
|
|
|
};
|
|
|
|
|
|
static const struct nla_policy ifla_vf_stats_policy[IFLA_VF_STATS_MAX + 1] = {
|
|
@@ -1587,6 +1595,16 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb)
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+ if (tb[IFLA_VF_TRUST]) {
|
|
|
+ struct ifla_vf_trust *ivt = nla_data(tb[IFLA_VF_TRUST]);
|
|
|
+
|
|
|
+ err = -EOPNOTSUPP;
|
|
|
+ if (ops->ndo_set_vf_trust)
|
|
|
+ err = ops->ndo_set_vf_trust(dev, ivt->vf, ivt->setting);
|
|
|
+ if (err < 0)
|
|
|
+ return err;
|
|
|
+ }
|
|
|
+
|
|
|
return err;
|
|
|
}
|
|
|
|