]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
batman-adv: Don't increase MTU when set by user
authorSven Eckelmann <sven@narfation.org>
Wed, 19 Jul 2023 08:01:15 +0000 (10:01 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 30 Aug 2023 14:18:17 +0000 (16:18 +0200)
commit d8e42a2b0addf238be8b3b37dcd9795a5c1be459 upstream.

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: c6c8fea29769 ("net: Add batman-adv meshing protocol")
Cc: stable@vger.kernel.org
Signed-off-by: Sven Eckelmann <sven@narfation.org>
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
net/batman-adv/hard-interface.c
net/batman-adv/soft-interface.c
net/batman-adv/types.h

index ee9cf7c6332a719a61a34d6197d5a25b9ac44fac..44cf612c0831e32b347f5be6c81a51a883faafed 100644 (file)
@@ -627,7 +627,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.
index 6ab28b509d4bb3c8d773c690b8b0ad55b3835dc1..99cd8aef073549a0624719a04a8113e0b1735a4e 100644 (file)
@@ -154,11 +154,14 @@ static int batadv_interface_set_mac_addr(struct net_device *dev, void *p)
 
 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;
 }
index 2be5d4a712c5c2ddc4a04d7296a6d4e4b57a7478..2635763bbd67a5b96591d877966306da85160893 100644 (file)
@@ -1546,6 +1546,12 @@ struct batadv_priv {
        /** @soft_iface: net device which holds this struct as private data */
        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)