aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/layerscape/patches-4.9/001-net-centralize-net_device-min-max-MTU-checking.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/layerscape/patches-4.9/001-net-centralize-net_device-min-max-MTU-checking.patch')
-rw-r--r--target/linux/layerscape/patches-4.9/001-net-centralize-net_device-min-max-MTU-checking.patch78
1 files changed, 78 insertions, 0 deletions
diff --git a/target/linux/layerscape/patches-4.9/001-net-centralize-net_device-min-max-MTU-checking.patch b/target/linux/layerscape/patches-4.9/001-net-centralize-net_device-min-max-MTU-checking.patch
new file mode 100644
index 0000000000..fcabb62f5e
--- /dev/null
+++ b/target/linux/layerscape/patches-4.9/001-net-centralize-net_device-min-max-MTU-checking.patch
@@ -0,0 +1,78 @@
+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
+