Skip to content

Commit 7a4c53b

Browse files
shemmingerdavem330
authored andcommitted
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: Stephen Hemminger <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 3e7a50c commit 7a4c53b

File tree

3 files changed

+20
-7
lines changed

3 files changed

+20
-7
lines changed

include/linux/netdevice.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3546,6 +3546,8 @@ int dev_set_alias(struct net_device *, const char *, size_t);
35463546
int dev_get_alias(const struct net_device *, char *, size_t);
35473547
int dev_change_net_namespace(struct net_device *, struct net *, const char *);
35483548
int __dev_set_mtu(struct net_device *, int);
3549+
int dev_set_mtu_ext(struct net_device *dev, int mtu,
3550+
struct netlink_ext_ack *extack);
35493551
int dev_set_mtu(struct net_device *, int);
35503552
int dev_change_tx_queue_len(struct net_device *, unsigned long);
35513553
void dev_set_group(struct net_device *, int);

net/core/dev.c

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7523,13 +7523,15 @@ int __dev_set_mtu(struct net_device *dev, int new_mtu)
75237523
EXPORT_SYMBOL(__dev_set_mtu);
75247524

75257525
/**
7526-
* dev_set_mtu - Change maximum transfer unit
7526+
* dev_set_mtu_ext - Change maximum transfer unit
75277527
* @dev: device
75287528
* @new_mtu: new transfer unit
7529+
* @extack: netlink extended ack
75297530
*
75307531
* Change the maximum transfer size of the network device.
75317532
*/
7532-
int dev_set_mtu(struct net_device *dev, int new_mtu)
7533+
int dev_set_mtu_ext(struct net_device *dev, int new_mtu,
7534+
struct netlink_ext_ack *extack)
75337535
{
75347536
int err, orig_mtu;
75357537

@@ -7538,14 +7540,12 @@ int dev_set_mtu(struct net_device *dev, int new_mtu)
75387540

75397541
/* MTU must be positive, and in range */
75407542
if (new_mtu < 0 || new_mtu < dev->min_mtu) {
7541-
net_err_ratelimited("%s: Invalid MTU %d requested, hw min %d\n",
7542-
dev->name, new_mtu, dev->min_mtu);
7543+
NL_SET_ERR_MSG(extack, "mtu less than device minimum");
75437544
return -EINVAL;
75447545
}
75457546

75467547
if (dev->max_mtu > 0 && new_mtu > dev->max_mtu) {
7547-
net_err_ratelimited("%s: Invalid MTU %d requested, hw max %d\n",
7548-
dev->name, new_mtu, dev->max_mtu);
7548+
NL_SET_ERR_MSG(extack, "mtu greater than device maximum");
75497549
return -EINVAL;
75507550
}
75517551

@@ -7573,6 +7573,17 @@ int dev_set_mtu(struct net_device *dev, int new_mtu)
75737573
}
75747574
return err;
75757575
}
7576+
7577+
int dev_set_mtu(struct net_device *dev, int new_mtu)
7578+
{
7579+
struct netlink_ext_ack extack;
7580+
int err;
7581+
7582+
err = dev_set_mtu_ext(dev, new_mtu, &extack);
7583+
if (err)
7584+
net_err_ratelimited("%s: %s\n", dev->name, extack._msg);
7585+
return err;
7586+
}
75767587
EXPORT_SYMBOL(dev_set_mtu);
75777588

75787589
/**

net/core/rtnetlink.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2382,7 +2382,7 @@ static int do_setlink(const struct sk_buff *skb,
23822382
}
23832383

23842384
if (tb[IFLA_MTU]) {
2385-
err = dev_set_mtu(dev, nla_get_u32(tb[IFLA_MTU]));
2385+
err = dev_set_mtu_ext(dev, nla_get_u32(tb[IFLA_MTU]), extack);
23862386
if (err < 0)
23872387
goto errout;
23882388
status |= DO_SETLINK_MODIFIED;

0 commit comments

Comments
 (0)