Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -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;
+4 −2
Original line number Diff line number Diff line
@@ -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) ||