Commit a14857c2 authored by Bin Chen's avatar Bin Chen Committed by Paolo Abeni

rtnetlink: verify rate parameters for calls to ndo_set_vf_rate

When calling ndo_set_vf_rate() the max_tx_rate parameter may be zero,
in which case the setting is cleared, or it must be greater or equal to
min_tx_rate.

Enforce this requirement on all calls to ndo_set_vf_rate via a wrapper
which also only calls ndo_set_vf_rate() if defined by the driver.

Based on work by Jakub Kicinski <kuba@kernel.org>
Signed-off-by: default avatarBin Chen <bin.chen@corigine.com>
Signed-off-by: default avatarBaowen Zheng <baowen.zheng@corigine.com>
Signed-off-by: default avatarSimon Horman <simon.horman@corigine.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 982c97ee
...@@ -2306,6 +2306,19 @@ static int rtnl_ensure_unique_netns(struct nlattr *tb[], ...@@ -2306,6 +2306,19 @@ static int rtnl_ensure_unique_netns(struct nlattr *tb[],
return -EINVAL; return -EINVAL;
} }
static int rtnl_set_vf_rate(struct net_device *dev, int vf, int min_tx_rate,
int max_tx_rate)
{
const struct net_device_ops *ops = dev->netdev_ops;
if (!ops->ndo_set_vf_rate)
return -EOPNOTSUPP;
if (max_tx_rate && max_tx_rate < min_tx_rate)
return -EINVAL;
return ops->ndo_set_vf_rate(dev, vf, min_tx_rate, max_tx_rate);
}
static int validate_linkmsg(struct net_device *dev, struct nlattr *tb[], static int validate_linkmsg(struct net_device *dev, struct nlattr *tb[],
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
...@@ -2443,11 +2456,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb) ...@@ -2443,11 +2456,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb)
if (err < 0) if (err < 0)
return err; return err;
err = -EOPNOTSUPP; err = rtnl_set_vf_rate(dev, ivt->vf,
if (ops->ndo_set_vf_rate) ivf.min_tx_rate, ivt->rate);
err = ops->ndo_set_vf_rate(dev, ivt->vf,
ivf.min_tx_rate,
ivt->rate);
if (err < 0) if (err < 0)
return err; return err;
} }
...@@ -2457,11 +2467,9 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb) ...@@ -2457,11 +2467,9 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb)
if (ivt->vf >= INT_MAX) if (ivt->vf >= INT_MAX)
return -EINVAL; return -EINVAL;
err = -EOPNOTSUPP;
if (ops->ndo_set_vf_rate) err = rtnl_set_vf_rate(dev, ivt->vf,
err = ops->ndo_set_vf_rate(dev, ivt->vf, ivt->min_tx_rate, ivt->max_tx_rate);
ivt->min_tx_rate,
ivt->max_tx_rate);
if (err < 0) if (err < 0)
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