mirror of https://gitee.com/openkylin/linux.git
batman-adv: Avoid old nodes disabling multicast optimizations completely
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>
This commit is contained in:
parent
1ba93211e2
commit
f26e4e98b1
|
@ -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;
|
||||
|
||||
spin_lock_bh(&orig->mcast_handler_lock);
|
||||
orig_initialized = test_bit(BATADV_ORIG_CAPA_HAS_MCAST,
|
||||
&orig->capa_initialized);
|
||||
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);
|
||||
|
||||
/* 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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue