]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
batman-adv: Fix duplicated OGMs on NETDEV_UP
authorSven Eckelmann <sven@narfation.org>
Sun, 2 Jun 2019 08:57:31 +0000 (10:57 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 26 Jul 2019 07:12:29 +0000 (09:12 +0200)
[ Upstream commit 9e6b5648bbc4cd48fab62cecbb81e9cc3c6e7e88 ]

The state of slave interfaces are handled differently depending on whether
the interface is up or not. All active interfaces (IFF_UP) will transmit
OGMs. But for B.A.T.M.A.N. IV, also non-active interfaces are scheduling
(low TTL) OGMs on active interfaces. The code which setups and schedules
the OGMs must therefore already be called when the interfaces gets added as
slave interface and the transmit function must then check whether it has to
send out the OGM or not on the specific slave interface.

But the commit f0d97253fb5f ("batman-adv: remove ogm_emit and ogm_schedule
API calls") moved the setup code from the enable function to the activate
function. The latter is called either when the added slave was already up
when batadv_hardif_enable_interface processed the new interface or when a
NETDEV_UP event was received for this slave interfac. As result, each
NETDEV_UP would schedule a new OGM worker for the interface and thus OGMs
would be send a lot more than expected.

Fixes: f0d97253fb5f ("batman-adv: remove ogm_emit and ogm_schedule API calls")
Reported-by: Linus Lüssing <linus.luessing@c0d3.blue>
Tested-by: Linus Lüssing <linus.luessing@c0d3.blue>
Acked-by: Marek Lindner <mareklindner@neomailbox.ch>
Signed-off-by: Sven Eckelmann <sven@narfation.org>
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/batman-adv/bat_iv_ogm.c
net/batman-adv/hard-interface.c
net/batman-adv/types.h

index de61091af6668734709ab5fc46a40358eff54b82..267418b6129a636865f41c52d8cd778e34a29ca3 100644 (file)
@@ -2349,7 +2349,7 @@ batadv_iv_ogm_neigh_is_sob(struct batadv_neigh_node *neigh1,
        return ret;
 }
 
-static void batadv_iv_iface_activate(struct batadv_hard_iface *hard_iface)
+static void batadv_iv_iface_enabled(struct batadv_hard_iface *hard_iface)
 {
        /* begin scheduling originator messages on that interface */
        batadv_iv_ogm_schedule(hard_iface);
@@ -2695,8 +2695,8 @@ unlock:
 static struct batadv_algo_ops batadv_batman_iv __read_mostly = {
        .name = "BATMAN_IV",
        .iface = {
-               .activate = batadv_iv_iface_activate,
                .enable = batadv_iv_ogm_iface_enable,
+               .enabled = batadv_iv_iface_enabled,
                .disable = batadv_iv_ogm_iface_disable,
                .update_mac = batadv_iv_ogm_iface_update_mac,
                .primary_set = batadv_iv_ogm_primary_iface_set,
index 96ef7c70b4d92ef249e0b233c1f2a0c9bec6452c..9072392e43cd61c7b167c1647eaedf54b5ee73ce 100644 (file)
@@ -807,6 +807,9 @@ int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface,
 
        batadv_hardif_recalc_extra_skbroom(soft_iface);
 
+       if (bat_priv->algo_ops->iface.enabled)
+               bat_priv->algo_ops->iface.enabled(hard_iface);
+
 out:
        return 0;
 
index ed0f6a519de55cb9cbab447a4ab8f885da56da8c..3c83c8b4f1e1e669a2482be49fd646ef8952cdf2 100644 (file)
@@ -2135,6 +2135,9 @@ struct batadv_algo_iface_ops {
        /** @enable: init routing info when hard-interface is enabled */
        int (*enable)(struct batadv_hard_iface *hard_iface);
 
+       /** @enabled: notification when hard-interface was enabled (optional) */
+       void (*enabled)(struct batadv_hard_iface *hard_iface);
+
        /** @disable: de-init routing info when hard-interface is disabled */
        void (*disable)(struct batadv_hard_iface *hard_iface);