Commit 720516b1 authored by David S. Miller's avatar David S. Miller

Merge branch 'mtu-related-changes'

Stephen Hemminger says:

====================
mtu related changes

While looking at other MTU issues, noticed a couple oppurtunties
for improving user experience.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 4b09384a 7a4c53be
...@@ -220,14 +220,14 @@ static int net_failover_change_mtu(struct net_device *dev, int new_mtu) ...@@ -220,14 +220,14 @@ static int net_failover_change_mtu(struct net_device *dev, int new_mtu)
struct net_device *primary_dev, *standby_dev; struct net_device *primary_dev, *standby_dev;
int ret = 0; int ret = 0;
primary_dev = rcu_dereference(nfo_info->primary_dev); primary_dev = rtnl_dereference(nfo_info->primary_dev);
if (primary_dev) { if (primary_dev) {
ret = dev_set_mtu(primary_dev, new_mtu); ret = dev_set_mtu(primary_dev, new_mtu);
if (ret) if (ret)
return ret; return ret;
} }
standby_dev = rcu_dereference(nfo_info->standby_dev); standby_dev = rtnl_dereference(nfo_info->standby_dev);
if (standby_dev) { if (standby_dev) {
ret = dev_set_mtu(standby_dev, new_mtu); ret = dev_set_mtu(standby_dev, new_mtu);
if (ret) { if (ret) {
......
...@@ -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);
......
...@@ -164,6 +164,8 @@ enum { ...@@ -164,6 +164,8 @@ enum {
IFLA_CARRIER_UP_COUNT, IFLA_CARRIER_UP_COUNT,
IFLA_CARRIER_DOWN_COUNT, IFLA_CARRIER_DOWN_COUNT,
IFLA_NEW_IFINDEX, IFLA_NEW_IFINDEX,
IFLA_MIN_MTU,
IFLA_MAX_MTU,
__IFLA_MAX __IFLA_MAX
}; };
......
...@@ -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);
/** /**
......
...@@ -1015,6 +1015,8 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev, ...@@ -1015,6 +1015,8 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev,
+ nla_total_size(4) /* IFLA_IF_NETNSID */ + nla_total_size(4) /* IFLA_IF_NETNSID */
+ nla_total_size(4) /* IFLA_CARRIER_UP_COUNT */ + nla_total_size(4) /* IFLA_CARRIER_UP_COUNT */
+ nla_total_size(4) /* IFLA_CARRIER_DOWN_COUNT */ + nla_total_size(4) /* IFLA_CARRIER_DOWN_COUNT */
+ nla_total_size(4) /* IFLA_MIN_MTU */
+ nla_total_size(4) /* IFLA_MAX_MTU */
+ 0; + 0;
} }
...@@ -1601,6 +1603,8 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, ...@@ -1601,6 +1603,8 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb,
netif_running(dev) ? dev->operstate : IF_OPER_DOWN) || netif_running(dev) ? dev->operstate : IF_OPER_DOWN) ||
nla_put_u8(skb, IFLA_LINKMODE, dev->link_mode) || nla_put_u8(skb, IFLA_LINKMODE, dev->link_mode) ||
nla_put_u32(skb, IFLA_MTU, dev->mtu) || nla_put_u32(skb, IFLA_MTU, dev->mtu) ||
nla_put_u32(skb, IFLA_MIN_MTU, dev->min_mtu) ||
nla_put_u32(skb, IFLA_MAX_MTU, dev->max_mtu) ||
nla_put_u32(skb, IFLA_GROUP, dev->group) || nla_put_u32(skb, IFLA_GROUP, dev->group) ||
nla_put_u32(skb, IFLA_PROMISCUITY, dev->promiscuity) || nla_put_u32(skb, IFLA_PROMISCUITY, dev->promiscuity) ||
nla_put_u32(skb, IFLA_NUM_TX_QUEUES, dev->num_tx_queues) || nla_put_u32(skb, IFLA_NUM_TX_QUEUES, dev->num_tx_queues) ||
...@@ -1732,6 +1736,8 @@ static const struct nla_policy ifla_policy[IFLA_MAX+1] = { ...@@ -1732,6 +1736,8 @@ static const struct nla_policy ifla_policy[IFLA_MAX+1] = {
[IFLA_IF_NETNSID] = { .type = NLA_S32 }, [IFLA_IF_NETNSID] = { .type = NLA_S32 },
[IFLA_CARRIER_UP_COUNT] = { .type = NLA_U32 }, [IFLA_CARRIER_UP_COUNT] = { .type = NLA_U32 },
[IFLA_CARRIER_DOWN_COUNT] = { .type = NLA_U32 }, [IFLA_CARRIER_DOWN_COUNT] = { .type = NLA_U32 },
[IFLA_MIN_MTU] = { .type = NLA_U32 },
[IFLA_MAX_MTU] = { .type = NLA_U32 },
}; };
static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = { static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = {
...@@ -2376,7 +2382,7 @@ static int do_setlink(const struct sk_buff *skb, ...@@ -2376,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