1c4415a679
The NXP LSDK kernel backported changes for interface ndo_get_stats64 functions from mainline, this causes a compile error with backports/mac80211, which expects the original 4.9 defintion. As reversing the ndo_get_stats64 change signifcantly reduces the size of patch 601, the patches that were aggregated into it have been disaggregated. Signed-off-by: Mathew McBride <matt@traverse.com.au>
78 lines
2.8 KiB
Diff
78 lines
2.8 KiB
Diff
From 95b8bbff6ecf0692747622af16d917a67313f8cc Mon Sep 17 00:00:00 2001
|
|
From: Jarod Wilson <jarod@redhat.com>
|
|
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: netdev@vger.kernel.org
|
|
Signed-off-by: Jarod Wilson <jarod@redhat.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
---
|
|
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
|
|
|