Commit 7a4c53be authored by Stephen Hemminger's avatar Stephen Hemminger Committed by David S. Miller

net: report invalid mtu value via netlink extack

If an invalid MTU value is set through rtnetlink return extra error
information instead of putting message in kernel log. For other cases
where there is no visible API, keep the error report in the log.

Example:
	# ip li set dev enp12s0 mtu 10000
	Error: mtu greater than device maximum.

	# ifconfig enp12s0 mtu 10000
	SIOCSIFMTU: Invalid argument
	# dmesg | tail -1
	[ 2047.795467] enp12s0: mtu greater than device maximum
Signed-off-by: default avatarStephen Hemminger <stephen@networkplumber.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3e7a50ce
...@@ -3546,6 +3546,8 @@ int dev_set_alias(struct net_device *, const char *, size_t); ...@@ -3546,6 +3546,8 @@ int dev_set_alias(struct net_device *, const char *, size_t);
int dev_get_alias(const struct net_device *, char *, size_t); int dev_get_alias(const struct net_device *, char *, size_t);
int dev_change_net_namespace(struct net_device *, struct net *, const char *); int dev_change_net_namespace(struct net_device *, struct net *, const char *);
int __dev_set_mtu(struct net_device *, int); int __dev_set_mtu(struct net_device *, int);
int dev_set_mtu_ext(struct net_device *dev, int mtu,
struct netlink_ext_ack *extack);
int dev_set_mtu(struct net_device *, int); int dev_set_mtu(struct net_device *, int);
int dev_change_tx_queue_len(struct net_device *, unsigned long); int dev_change_tx_queue_len(struct net_device *, unsigned long);
void dev_set_group(struct net_device *, int); void dev_set_group(struct net_device *, int);
......
...@@ -7523,13 +7523,15 @@ int __dev_set_mtu(struct net_device *dev, int new_mtu) ...@@ -7523,13 +7523,15 @@ int __dev_set_mtu(struct net_device *dev, int new_mtu)
EXPORT_SYMBOL(__dev_set_mtu); EXPORT_SYMBOL(__dev_set_mtu);
/** /**
* dev_set_mtu - Change maximum transfer unit * dev_set_mtu_ext - Change maximum transfer unit
* @dev: device * @dev: device
* @new_mtu: new transfer unit * @new_mtu: new transfer unit
* @extack: netlink extended ack
* *
* Change the maximum transfer size of the network device. * Change the maximum transfer size of the network device.
*/ */
int dev_set_mtu(struct net_device *dev, int new_mtu) int dev_set_mtu_ext(struct net_device *dev, int new_mtu,
struct netlink_ext_ack *extack)
{ {
int err, orig_mtu; int err, orig_mtu;
...@@ -7538,14 +7540,12 @@ int dev_set_mtu(struct net_device *dev, int new_mtu) ...@@ -7538,14 +7540,12 @@ int dev_set_mtu(struct net_device *dev, int new_mtu)
/* MTU must be positive, and in range */ /* MTU must be positive, and in range */
if (new_mtu < 0 || new_mtu < dev->min_mtu) { if (new_mtu < 0 || new_mtu < dev->min_mtu) {
net_err_ratelimited("%s: Invalid MTU %d requested, hw min %d\n", NL_SET_ERR_MSG(extack, "mtu less than device minimum");
dev->name, new_mtu, dev->min_mtu);
return -EINVAL; return -EINVAL;
} }
if (dev->max_mtu > 0 && new_mtu > dev->max_mtu) { if (dev->max_mtu > 0 && new_mtu > dev->max_mtu) {
net_err_ratelimited("%s: Invalid MTU %d requested, hw max %d\n", NL_SET_ERR_MSG(extack, "mtu greater than device maximum");
dev->name, new_mtu, dev->max_mtu);
return -EINVAL; return -EINVAL;
} }
...@@ -7573,6 +7573,17 @@ int dev_set_mtu(struct net_device *dev, int new_mtu) ...@@ -7573,6 +7573,17 @@ int dev_set_mtu(struct net_device *dev, int new_mtu)
} }
return err; return err;
} }
int dev_set_mtu(struct net_device *dev, int new_mtu)
{
struct netlink_ext_ack extack;
int err;
err = dev_set_mtu_ext(dev, new_mtu, &extack);
if (err)
net_err_ratelimited("%s: %s\n", dev->name, extack._msg);
return err;
}
EXPORT_SYMBOL(dev_set_mtu); EXPORT_SYMBOL(dev_set_mtu);
/** /**
......
...@@ -2382,7 +2382,7 @@ static int do_setlink(const struct sk_buff *skb, ...@@ -2382,7 +2382,7 @@ static int do_setlink(const struct sk_buff *skb,
} }
if (tb[IFLA_MTU]) { if (tb[IFLA_MTU]) {
err = dev_set_mtu(dev, nla_get_u32(tb[IFLA_MTU])); err = dev_set_mtu_ext(dev, nla_get_u32(tb[IFLA_MTU]), extack);
if (err < 0) if (err < 0)
goto errout; goto errout;
status |= DO_SETLINK_MODIFIED; status |= DO_SETLINK_MODIFIED;
......
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