Commit 44661462 authored by Herbert Xu's avatar Herbert Xu Committed by David S. Miller

bridge: Always flood broadcast packets

As is_multicast_ether_addr returns true on broadcast packets as
well, we need to explicitly exclude broadcast packets so that
they're always flooded.  This wasn't an issue before as broadcast
packets were considered to be an unregistered multicast group,
which were always flooded.  However, as we now only flood such
packets to router ports, this is no longer acceptable.
Reported-by: default avatarMichael Guntsche <mike@it-loops.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 9b9cfe7c
...@@ -49,7 +49,9 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -49,7 +49,9 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
skb_pull(skb, ETH_HLEN); skb_pull(skb, ETH_HLEN);
rcu_read_lock(); rcu_read_lock();
if (is_multicast_ether_addr(dest)) { if (is_broadcast_ether_addr(dest))
br_flood_deliver(br, skb);
else if (is_multicast_ether_addr(dest)) {
if (unlikely(netpoll_tx_running(dev))) { if (unlikely(netpoll_tx_running(dev))) {
br_flood_deliver(br, skb); br_flood_deliver(br, skb);
goto out; goto out;
......
...@@ -60,7 +60,7 @@ int br_handle_frame_finish(struct sk_buff *skb) ...@@ -60,7 +60,7 @@ int br_handle_frame_finish(struct sk_buff *skb)
br = p->br; br = p->br;
br_fdb_update(br, p, eth_hdr(skb)->h_source); br_fdb_update(br, p, eth_hdr(skb)->h_source);
if (is_multicast_ether_addr(dest) && if (!is_broadcast_ether_addr(dest) && is_multicast_ether_addr(dest) &&
br_multicast_rcv(br, p, skb)) br_multicast_rcv(br, p, skb))
goto drop; goto drop;
...@@ -77,7 +77,9 @@ int br_handle_frame_finish(struct sk_buff *skb) ...@@ -77,7 +77,9 @@ int br_handle_frame_finish(struct sk_buff *skb)
dst = NULL; dst = NULL;
if (is_multicast_ether_addr(dest)) { if (is_broadcast_ether_addr(dest))
skb2 = skb;
else if (is_multicast_ether_addr(dest)) {
mdst = br_mdb_get(br, skb); mdst = br_mdb_get(br, skb);
if (mdst || BR_INPUT_SKB_CB_MROUTERS_ONLY(skb)) { if (mdst || BR_INPUT_SKB_CB_MROUTERS_ONLY(skb)) {
if ((mdst && mdst->mglist) || if ((mdst && mdst->mglist) ||
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment