bridge: prevent flooding IPv6 packets that do not have a listener
authorLinus Lüssing <linus.luessing@web.de>
Wed, 4 Sep 2013 00:13:38 +0000 (02:13 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 5 Sep 2013 16:35:41 +0000 (12:35 -0400)
Currently if there is no listener for a certain group then IPv6 packets
for that group are flooded on all ports, even though there might be no
host and router interested in it on a port.

With this commit they are only forwarded to ports with a multicast
router.

Just like commit bd4265fe36 ("bridge: Only flood unregistered groups
to routers") did for IPv4, let's do the same for IPv6 with the same
reasoning.

Signed-off-by: Linus Lüssing <linus.luessing@web.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/bridge/br_multicast.c

index 4accd0de6e8ed0a33c1fa9026630fe6b1ebcb247..5388955b2a3c4aec3423b463b630997cc4f06762 100644 (file)
@@ -1491,8 +1491,14 @@ static int br_multicast_ipv6_rcv(struct net_bridge *br,
         *  - MLD has always Router Alert hop-by-hop option
         *  - But we do not support jumbrograms.
         */
-       if (ip6h->version != 6 ||
-           ip6h->nexthdr != IPPROTO_HOPOPTS ||
+       if (ip6h->version != 6)
+               return 0;
+
+       /* Prevent flooding this packet if there is no listener present */
+       if (ipv6_is_transient_multicast(&ip6h->daddr))
+               BR_INPUT_SKB_CB(skb)->mrouters_only = 1;
+
+       if (ip6h->nexthdr != IPPROTO_HOPOPTS ||
            ip6h->payload_len == 0)
                return 0;