Repository : ssh://git@open-mesh.org/batctl
On branch : master
commit 49cc660a07863be6bdc3b65d1ecd1c67efe9cb7f Author: Linus Lüssing linus.luessing@web.de Date: Sat Feb 15 17:47:54 2014 +0100
batctl: Send multicast packets to nodes with a WANT_ALL flag
With this patch a node sends IPv4 multicast packets to nodes which have a BATADV_MCAST_WANT_ALL_IPV4 flag set and IPv6 multicast packets to nodes which have a BATADV_MCAST_WANT_ALL_IPV6 flag set, too.
Why is this needed? There are scenarios involving bridges where multicast report snooping and multicast TT announcements are not sufficient, which would lead to packet loss for some nodes otherwise:
MLDv1 and IGMPv1/IGMPv2 have a suppression mechanism for multicast listener reports. When we have an MLDv1/IGMPv1/IGMPv2 querier behind a bridge then our snooping bridge is potentially not going to see any reports even though listeners exist because according to RFC4541 such reports are only forwarded to multicast routers:
----------------------------------------------------------- --------------- {Querier}---|Snoop. Switch|----{Listener} --------------- \ ^ ------- | br0 | < ??? ------- \ _-~---~_ _-~/ ~-_ ~ batman-adv -----{Sender} ~_ cloud ~/ -~~__-__-~_/
I) MLDv1 Query: {Querier} -> flooded II) MLDv1 Report: {Listener} -> {Querier}
-> br0 cannot detect the {Listener} => Packets from {Sender} need to be forwarded to all detected listeners and MLDv1/IGMPv1/IGMPv2 queriers.
-----------------------------------------------------------
Note that we do not need to explicitly forward to MLDv2/IGMPv3 queriers, because these protocols have no report suppression: A bridge has no trouble detecting MLDv2/IGMPv3 listeners.
Even though we do not support bridges yet we need to provide the according infrastructure already to not break compatibility later.
Signed-off-by: Linus Lüssing linus.luessing@web.de Signed-off-by: Marek Lindner mareklindner@neomailbox.ch
49cc660a07863be6bdc3b65d1ecd1c67efe9cb7f packet.h | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/packet.h b/packet.h index 0aada24..feaa336 100644 --- a/packet.h +++ b/packet.h @@ -93,9 +93,13 @@ enum batadv_icmp_packettype { * enum batadv_mcast_flags - flags for multicast capabilities and settings * @BATADV_MCAST_WANT_ALL_UNSNOOPABLES: we want all packets destined for * 224.0.0.0/24 or ff02::1 + * @BATADV_MCAST_WANT_ALL_IPV4: we want all IPv4 multicast packets + * @BATADV_MCAST_WANT_ALL_IPV6: we want all IPv6 multicast packets */ enum batadv_mcast_flags { BATADV_MCAST_WANT_ALL_UNSNOOPABLES = BIT(0), + BATADV_MCAST_WANT_ALL_IPV4 = BIT(1), + BATADV_MCAST_WANT_ALL_IPV6 = BIT(2), };
/* tt data subtypes */