|
@@ -731,7 +731,8 @@ static inline int rtnl_vfinfo_size(const struct net_device *dev)
|
|
|
size += num_vfs *
|
|
|
(nla_total_size(sizeof(struct ifla_vf_mac)) +
|
|
|
nla_total_size(sizeof(struct ifla_vf_vlan)) +
|
|
|
- nla_total_size(sizeof(struct ifla_vf_tx_rate)));
|
|
|
+ nla_total_size(sizeof(struct ifla_vf_tx_rate)) +
|
|
|
+ nla_total_size(sizeof(struct ifla_vf_spoofchk)));
|
|
|
return size;
|
|
|
} else
|
|
|
return 0;
|
|
@@ -954,13 +955,27 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
|
|
|
struct ifla_vf_mac vf_mac;
|
|
|
struct ifla_vf_vlan vf_vlan;
|
|
|
struct ifla_vf_tx_rate vf_tx_rate;
|
|
|
+ struct ifla_vf_spoofchk vf_spoofchk;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * 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.
|
|
|
+ */
|
|
|
+ ivi.spoofchk = -1;
|
|
|
if (dev->netdev_ops->ndo_get_vf_config(dev, i, &ivi))
|
|
|
break;
|
|
|
- vf_mac.vf = vf_vlan.vf = vf_tx_rate.vf = ivi.vf;
|
|
|
+ vf_mac.vf =
|
|
|
+ vf_vlan.vf =
|
|
|
+ vf_tx_rate.vf =
|
|
|
+ vf_spoofchk.vf = ivi.vf;
|
|
|
+
|
|
|
memcpy(vf_mac.mac, ivi.mac, sizeof(ivi.mac));
|
|
|
vf_vlan.vlan = ivi.vlan;
|
|
|
vf_vlan.qos = ivi.qos;
|
|
|
vf_tx_rate.rate = ivi.tx_rate;
|
|
|
+ vf_spoofchk.setting = ivi.spoofchk;
|
|
|
vf = nla_nest_start(skb, IFLA_VF_INFO);
|
|
|
if (!vf) {
|
|
|
nla_nest_cancel(skb, vfinfo);
|
|
@@ -968,7 +983,10 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
|
|
|
}
|
|
|
NLA_PUT(skb, IFLA_VF_MAC, sizeof(vf_mac), &vf_mac);
|
|
|
NLA_PUT(skb, IFLA_VF_VLAN, sizeof(vf_vlan), &vf_vlan);
|
|
|
- NLA_PUT(skb, IFLA_VF_TX_RATE, sizeof(vf_tx_rate), &vf_tx_rate);
|
|
|
+ NLA_PUT(skb, IFLA_VF_TX_RATE, sizeof(vf_tx_rate),
|
|
|
+ &vf_tx_rate);
|
|
|
+ NLA_PUT(skb, IFLA_VF_SPOOFCHK, sizeof(vf_spoofchk),
|
|
|
+ &vf_spoofchk);
|
|
|
nla_nest_end(skb, vf);
|
|
|
}
|
|
|
nla_nest_end(skb, vfinfo);
|
|
@@ -1202,6 +1220,15 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr *attr)
|
|
|
ivt->rate);
|
|
|
break;
|
|
|
}
|
|
|
+ case IFLA_VF_SPOOFCHK: {
|
|
|
+ struct ifla_vf_spoofchk *ivs;
|
|
|
+ ivs = nla_data(vf);
|
|
|
+ err = -EOPNOTSUPP;
|
|
|
+ if (ops->ndo_set_vf_spoofchk)
|
|
|
+ err = ops->ndo_set_vf_spoofchk(dev, ivs->vf,
|
|
|
+ ivs->setting);
|
|
|
+ break;
|
|
|
+ }
|
|
|
default:
|
|
|
err = -EINVAL;
|
|
|
break;
|