summaryrefslogtreecommitdiff
path: root/batman-adv/patches/0007-batman-adv-Don-t-increase-MTU-when-set-by-user.patch
diff options
context:
space:
mode:
Diffstat (limited to 'batman-adv/patches/0007-batman-adv-Don-t-increase-MTU-when-set-by-user.patch')
-rw-r--r--batman-adv/patches/0007-batman-adv-Don-t-increase-MTU-when-set-by-user.patch71
1 files changed, 71 insertions, 0 deletions
diff --git a/batman-adv/patches/0007-batman-adv-Don-t-increase-MTU-when-set-by-user.patch b/batman-adv/patches/0007-batman-adv-Don-t-increase-MTU-when-set-by-user.patch
new file mode 100644
index 0000000..ab32673
--- /dev/null
+++ b/batman-adv/patches/0007-batman-adv-Don-t-increase-MTU-when-set-by-user.patch
@@ -0,0 +1,71 @@
+From: Sven Eckelmann <sven@narfation.org>
+Date: Wed, 19 Jul 2023 10:15:06 +0200
+Subject: batman-adv: Don't increase MTU when set by user
+
+If the user set an MTU value, it usually means that there are special
+requirements for the MTU. But if an interface gots activated, the MTU was
+always recalculated and then the user set value was overwritten.
+
+The only reason why this user set value has to be overwritten, is when the
+MTU has to be decreased because batman-adv is not able to transfer packets
+with the user specified size.
+
+Fixes: 88861ea9acb7 ("[batman-adv] replacing if up/down timer with kernel notifications")
+Signed-off-by: Sven Eckelmann <sven@narfation.org>
+Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/2745af592150b758ee96abf9329dd5f42cf22c25
+
+--- a/net/batman-adv/hard-interface.c
++++ b/net/batman-adv/hard-interface.c
+@@ -629,7 +629,19 @@ out:
+ */
+ void batadv_update_min_mtu(struct net_device *soft_iface)
+ {
+- dev_set_mtu(soft_iface, batadv_hardif_min_mtu(soft_iface));
++ struct batadv_priv *bat_priv = netdev_priv(soft_iface);
++ int limit_mtu;
++ int mtu;
++
++ mtu = batadv_hardif_min_mtu(soft_iface);
++
++ if (bat_priv->mtu_set_by_user)
++ limit_mtu = bat_priv->mtu_set_by_user;
++ else
++ limit_mtu = ETH_DATA_LEN;
++
++ mtu = min(mtu, limit_mtu);
++ dev_set_mtu(soft_iface, mtu);
+
+ /* Check if the local translate table should be cleaned up to match a
+ * new (and smaller) MTU.
+--- a/net/batman-adv/soft-interface.c
++++ b/net/batman-adv/soft-interface.c
+@@ -153,11 +153,14 @@ static int batadv_interface_set_mac_addr
+
+ static int batadv_interface_change_mtu(struct net_device *dev, int new_mtu)
+ {
++ struct batadv_priv *bat_priv = netdev_priv(dev);
++
+ /* check ranges */
+ if (new_mtu < 68 || new_mtu > batadv_hardif_min_mtu(dev))
+ return -EINVAL;
+
+ dev->mtu = new_mtu;
++ bat_priv->mtu_set_by_user = new_mtu;
+
+ return 0;
+ }
+--- a/net/batman-adv/types.h
++++ b/net/batman-adv/types.h
+@@ -1547,6 +1547,12 @@ struct batadv_priv {
+ struct net_device *soft_iface;
+
+ /**
++ * @mtu_set_by_user: MTU was set once by user
++ * protected by rtnl_lock
++ */
++ int mtu_set_by_user;
++
++ /**
+ * @bat_counters: mesh internal traffic statistic counters (see
+ * batadv_counters)
+ */