diff options
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.patch | 78 |
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 + |