batman-adv: Avoid old nodes disabling multicast optimizations completely
authorLinus Lüssing <linus.luessing@c0d3.blue>
Sat, 24 Mar 2018 23:32:04 +0000 (00:32 +0100)
committerSimon Wunderlich <sw@simonwunderlich.de>
Sun, 22 Apr 2018 07:29:14 +0000 (09:29 +0200)
Instead of disabling multicast optimizations mesh-wide once a node with
no multicast optimizations capabilities joins the mesh, do the
following:

Just insert such nodes into the WANT_ALL_IPV4/IPV6 lists. This is
sufficient to avoid multicast packet loss to such unsupportive nodes.

Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
Signed-off-by: Sven Eckelmann <sven@narfation.org>
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
net/batman-adv/multicast.c
net/batman-adv/soft-interface.c
net/batman-adv/types.h

index a11d3d89f0120a17c26f41a0559b6c40ebbbc6ca..36fd7b06c7ccb49c5b0f6c4828e8490b739688fb 100644 (file)
@@ -815,9 +815,6 @@ static int batadv_mcast_forw_mode_check(struct batadv_priv *bat_priv,
        if (!atomic_read(&bat_priv->multicast_mode))
                return -EINVAL;
 
-       if (atomic_read(&bat_priv->mcast.num_disabled))
-               return -EINVAL;
-
        switch (ntohs(ethhdr->h_proto)) {
        case ETH_P_IP:
                return batadv_mcast_forw_mode_check_ipv4(bat_priv, skb,
@@ -1183,33 +1180,23 @@ static void batadv_mcast_tvlv_ogm_handler(struct batadv_priv *bat_priv,
 {
        bool orig_mcast_enabled = !(flags & BATADV_TVLV_HANDLER_OGM_CIFNOTFND);
        u8 mcast_flags = BATADV_NO_FLAGS;
-       bool orig_initialized;
 
        if (orig_mcast_enabled && tvlv_value &&
            tvlv_value_len >= sizeof(mcast_flags))
                mcast_flags = *(u8 *)tvlv_value;
 
+       if (!orig_mcast_enabled) {
+               mcast_flags |= BATADV_MCAST_WANT_ALL_IPV4;
+               mcast_flags |= BATADV_MCAST_WANT_ALL_IPV6;
+       }
+
        spin_lock_bh(&orig->mcast_handler_lock);
-       orig_initialized = test_bit(BATADV_ORIG_CAPA_HAS_MCAST,
-                                   &orig->capa_initialized);
 
-       /* If mcast support is turned on decrease the disabled mcast node
-        * counter only if we had increased it for this node before. If this
-        * is a completely new orig_node no need to decrease the counter.
-        */
        if (orig_mcast_enabled &&
            !test_bit(BATADV_ORIG_CAPA_HAS_MCAST, &orig->capabilities)) {
-               if (orig_initialized)
-                       atomic_dec(&bat_priv->mcast.num_disabled);
                set_bit(BATADV_ORIG_CAPA_HAS_MCAST, &orig->capabilities);
-       /* If mcast support is being switched off or if this is an initial
-        * OGM without mcast support then increase the disabled mcast
-        * node counter.
-        */
        } else if (!orig_mcast_enabled &&
-                  (test_bit(BATADV_ORIG_CAPA_HAS_MCAST, &orig->capabilities) ||
-                   !orig_initialized)) {
-               atomic_inc(&bat_priv->mcast.num_disabled);
+                  test_bit(BATADV_ORIG_CAPA_HAS_MCAST, &orig->capabilities)) {
                clear_bit(BATADV_ORIG_CAPA_HAS_MCAST, &orig->capabilities);
        }
 
@@ -1595,10 +1582,6 @@ void batadv_mcast_purge_orig(struct batadv_orig_node *orig)
 
        spin_lock_bh(&orig->mcast_handler_lock);
 
-       if (!test_bit(BATADV_ORIG_CAPA_HAS_MCAST, &orig->capabilities) &&
-           test_bit(BATADV_ORIG_CAPA_HAS_MCAST, &orig->capa_initialized))
-               atomic_dec(&bat_priv->mcast.num_disabled);
-
        batadv_mcast_want_unsnoop_update(bat_priv, orig, BATADV_NO_FLAGS);
        batadv_mcast_want_ipv4_update(bat_priv, orig, BATADV_NO_FLAGS);
        batadv_mcast_want_ipv6_update(bat_priv, orig, BATADV_NO_FLAGS);
index edeffcb9f3a24e1b53c2b4d705fb260717ac09c4..67065e35de51d5453d389cb2f1bceecf40ed1396 100644 (file)
@@ -796,7 +796,6 @@ static int batadv_softif_init_late(struct net_device *dev)
        bat_priv->mcast.querier_ipv6.shadowing = false;
        bat_priv->mcast.flags = BATADV_NO_FLAGS;
        atomic_set(&bat_priv->multicast_mode, 1);
-       atomic_set(&bat_priv->mcast.num_disabled, 0);
        atomic_set(&bat_priv->mcast.num_want_all_unsnoopables, 0);
        atomic_set(&bat_priv->mcast.num_want_all_ipv4, 0);
        atomic_set(&bat_priv->mcast.num_want_all_ipv6, 0);
index 476b052ad9824d4cbcd6218dce40b603e3400fd2..0174f79e955abb5a7ede23bc7e62728732f4ecc2 100644 (file)
@@ -1212,9 +1212,6 @@ struct batadv_priv_mcast {
        /** @bridged: whether the soft interface has a bridge on top */
        bool bridged;
 
-       /** @num_disabled: number of nodes that have no mcast tvlv */
-       atomic_t num_disabled;
-
        /**
         * @num_want_all_unsnoopables: number of nodes wanting unsnoopable IP
         *  traffic