diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2011-07-05 13:58:33 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-07-05 18:39:39 -0700 |
commit | 44661462ee1ee3c922754fc1f246867f0d01e7ea (patch) | |
tree | e0a040be7f73d3929d45e975ca0eef7025f8f93f | |
parent | 9b9cfe7cf663c16c0d93349cc0094bb28ae7135a (diff) | |
download | linux-3.10-44661462ee1ee3c922754fc1f246867f0d01e7ea.tar.gz linux-3.10-44661462ee1ee3c922754fc1f246867f0d01e7ea.tar.bz2 linux-3.10-44661462ee1ee3c922754fc1f246867f0d01e7ea.zip |
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: Michael Guntsche <mike@it-loops.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/bridge/br_device.c | 4 | ||||
-rw-r--r-- | net/bridge/br_input.c | 6 |
2 files changed, 7 insertions, 3 deletions
diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c index c188c803c09..32b8f9f7f79 100644 --- a/net/bridge/br_device.c +++ b/net/bridge/br_device.c @@ -49,7 +49,9 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev) skb_pull(skb, ETH_HLEN); 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))) { br_flood_deliver(br, skb); goto out; diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c index f3ac1e858ee..f06ee39c73f 100644 --- a/net/bridge/br_input.c +++ b/net/bridge/br_input.c @@ -60,7 +60,7 @@ int br_handle_frame_finish(struct sk_buff *skb) br = p->br; 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)) goto drop; @@ -77,7 +77,9 @@ int br_handle_frame_finish(struct sk_buff *skb) 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); if (mdst || BR_INPUT_SKB_CB_MROUTERS_ONLY(skb)) { if ((mdst && mdst->mglist) || |