123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- From 95b8bbff6ecf0692747622af16d917a67313f8cc Mon Sep 17 00:00:00 2001
- From: Jarod Wilson <[email protected]>
- Date: Fri, 7 Oct 2016 22:04:33 -0400
- Subject: [PATCH] net: centralize net_device min/max MTU checking
- While looking into an MTU issue with sfc, I started noticing that almost
- every NIC driver with an ndo_change_mtu function implemented almost
- exactly the same range checks, and in many cases, that was the only
- practical thing their ndo_change_mtu function was doing. Quite a few
- drivers have either 68, 64, 60 or 46 as their minimum MTU value checked,
- and then various sizes from 1500 to 65535 for their maximum MTU value. We
- can remove a whole lot of redundant code here if we simple store min_mtu
- and max_mtu in net_device, and check against those in net/core/dev.c's
- dev_set_mtu().
- In theory, there should be zero functional change with this patch, it just
- puts the infrastructure in place. Subsequent patches will attempt to start
- using said infrastructure, with theoretically zero change in
- functionality.
- CC: [email protected]
- Signed-off-by: Jarod Wilson <[email protected]>
- Signed-off-by: David S. Miller <[email protected]>
- ---
- include/linux/netdevice.h | 4 ++++
- net/core/dev.c | 13 +++++++++++--
- 2 files changed, 15 insertions(+), 2 deletions(-)
- diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
- index 780e7171f548..2082b7d02a77 100644
- --- a/include/linux/netdevice.h
- +++ b/include/linux/netdevice.h
- @@ -1507,6 +1507,8 @@ enum netdev_priv_flags {
- * @if_port: Selectable AUI, TP, ...
- * @dma: DMA channel
- * @mtu: Interface MTU value
- + * @min_mtu: Interface Minimum MTU value
- + * @max_mtu: Interface Maximum MTU value
- * @type: Interface hardware type
- * @hard_header_len: Maximum hardware header length.
- * @min_header_len: Minimum hardware header length
- @@ -1728,6 +1730,8 @@ struct net_device {
- unsigned char dma;
-
- unsigned int mtu;
- + unsigned int min_mtu;
- + unsigned int max_mtu;
- unsigned short type;
- unsigned short hard_header_len;
- unsigned short min_header_len;
- diff --git a/net/core/dev.c b/net/core/dev.c
- index 2e04fd188081..c7ec56e8659a 100644
- --- a/net/core/dev.c
- +++ b/net/core/dev.c
- @@ -6524,9 +6524,18 @@ int dev_set_mtu(struct net_device *dev, int new_mtu)
- if (new_mtu == dev->mtu)
- return 0;
-
- - /* MTU must be positive. */
- - if (new_mtu < 0)
- + /* MTU must be positive, and in range */
- + if (new_mtu < 0 || new_mtu < dev->min_mtu) {
- + net_err_ratelimited("%s: Invalid MTU %d requested, hw min %d\n",
- + dev->name, new_mtu, dev->min_mtu);
- return -EINVAL;
- + }
- +
- + if (dev->max_mtu > 0 && new_mtu > dev->max_mtu) {
- + net_err_ratelimited("%s: Invalid MTU %d requested, hw max %d\n",
- + dev->name, new_mtu, dev->min_mtu);
- + return -EINVAL;
- + }
-
- if (!netif_device_present(dev))
- return -ENODEV;
- --
- 2.11.1
|