|
@@ -818,7 +818,8 @@ static inline int rtnl_vfinfo_size(const struct net_device *dev,
|
|
|
nla_total_size(sizeof(struct ifla_vf_vlan)) +
|
|
|
nla_total_size(sizeof(struct ifla_vf_spoofchk)) +
|
|
|
nla_total_size(sizeof(struct ifla_vf_rate)) +
|
|
|
- nla_total_size(sizeof(struct ifla_vf_link_state)));
|
|
|
+ nla_total_size(sizeof(struct ifla_vf_link_state)) +
|
|
|
+ nla_total_size(sizeof(struct ifla_vf_rss_query_en)));
|
|
|
return size;
|
|
|
} else
|
|
|
return 0;
|
|
@@ -1132,14 +1133,16 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
|
|
|
struct ifla_vf_tx_rate vf_tx_rate;
|
|
|
struct ifla_vf_spoofchk vf_spoofchk;
|
|
|
struct ifla_vf_link_state vf_linkstate;
|
|
|
+ struct ifla_vf_rss_query_en vf_rss_query_en;
|
|
|
|
|
|
/*
|
|
|
* Not all SR-IOV capable drivers support the
|
|
|
- * spoofcheck query. Preset to -1 so the user
|
|
|
- * space tool can detect that the driver didn't
|
|
|
- * report anything.
|
|
|
+ * spoofcheck and "RSS query enable" query. Preset to
|
|
|
+ * -1 so the user space tool can detect that the driver
|
|
|
+ * didn't report anything.
|
|
|
*/
|
|
|
ivi.spoofchk = -1;
|
|
|
+ ivi.rss_query_en = -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
|
|
@@ -1152,7 +1155,8 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
|
|
|
vf_rate.vf =
|
|
|
vf_tx_rate.vf =
|
|
|
vf_spoofchk.vf =
|
|
|
- vf_linkstate.vf = ivi.vf;
|
|
|
+ vf_linkstate.vf =
|
|
|
+ vf_rss_query_en.vf = ivi.vf;
|
|
|
|
|
|
memcpy(vf_mac.mac, ivi.mac, sizeof(ivi.mac));
|
|
|
vf_vlan.vlan = ivi.vlan;
|
|
@@ -1162,6 +1166,7 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
|
|
|
vf_rate.max_tx_rate = ivi.max_tx_rate;
|
|
|
vf_spoofchk.setting = ivi.spoofchk;
|
|
|
vf_linkstate.link_state = ivi.linkstate;
|
|
|
+ vf_rss_query_en.setting = ivi.rss_query_en;
|
|
|
vf = nla_nest_start(skb, IFLA_VF_INFO);
|
|
|
if (!vf) {
|
|
|
nla_nest_cancel(skb, vfinfo);
|
|
@@ -1176,7 +1181,10 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
|
|
|
nla_put(skb, IFLA_VF_SPOOFCHK, sizeof(vf_spoofchk),
|
|
|
&vf_spoofchk) ||
|
|
|
nla_put(skb, IFLA_VF_LINK_STATE, sizeof(vf_linkstate),
|
|
|
- &vf_linkstate))
|
|
|
+ &vf_linkstate) ||
|
|
|
+ nla_put(skb, IFLA_VF_RSS_QUERY_EN,
|
|
|
+ sizeof(vf_rss_query_en),
|
|
|
+ &vf_rss_query_en))
|
|
|
goto nla_put_failure;
|
|
|
nla_nest_end(skb, vf);
|
|
|
}
|
|
@@ -1290,6 +1298,7 @@ static const struct nla_policy ifla_vf_policy[IFLA_VF_MAX+1] = {
|
|
|
[IFLA_VF_SPOOFCHK] = { .len = sizeof(struct ifla_vf_spoofchk) },
|
|
|
[IFLA_VF_RATE] = { .len = sizeof(struct ifla_vf_rate) },
|
|
|
[IFLA_VF_LINK_STATE] = { .len = sizeof(struct ifla_vf_link_state) },
|
|
|
+ [IFLA_VF_RSS_QUERY_EN] = { .len = sizeof(struct ifla_vf_rss_query_en) },
|
|
|
};
|
|
|
|
|
|
static const struct nla_policy ifla_port_policy[IFLA_PORT_MAX+1] = {
|
|
@@ -1500,6 +1509,17 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr *attr)
|
|
|
ivl->link_state);
|
|
|
break;
|
|
|
}
|
|
|
+ case IFLA_VF_RSS_QUERY_EN: {
|
|
|
+ struct ifla_vf_rss_query_en *ivrssq_en;
|
|
|
+
|
|
|
+ ivrssq_en = nla_data(vf);
|
|
|
+ err = -EOPNOTSUPP;
|
|
|
+ if (ops->ndo_set_vf_rss_query_en)
|
|
|
+ err = ops->ndo_set_vf_rss_query_en(dev,
|
|
|
+ ivrssq_en->vf,
|
|
|
+ ivrssq_en->setting);
|
|
|
+ break;
|
|
|
+ }
|
|
|
default:
|
|
|
err = -EINVAL;
|
|
|
break;
|