aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/bridge/br_if.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c
index 81e49fb73169..b087d278c679 100644
--- a/net/bridge/br_if.c
+++ b/net/bridge/br_if.c
@@ -436,10 +436,16 @@ int br_add_if(struct net_bridge *br, struct net_device *dev)
436 int err = 0; 436 int err = 0;
437 bool changed_addr; 437 bool changed_addr;
438 438
439 /* Don't allow bridging non-ethernet like devices */ 439 /* Don't allow bridging non-ethernet like devices, or DSA-enabled
440 * master network devices since the bridge layer rx_handler prevents
441 * the DSA fake ethertype handler to be invoked, so we do not strip off
442 * the DSA switch tag protocol header and the bridge layer just return
443 * RX_HANDLER_CONSUMED, stopping RX processing for these frames.
444 */
440 if ((dev->flags & IFF_LOOPBACK) || 445 if ((dev->flags & IFF_LOOPBACK) ||
441 dev->type != ARPHRD_ETHER || dev->addr_len != ETH_ALEN || 446 dev->type != ARPHRD_ETHER || dev->addr_len != ETH_ALEN ||
442 !is_valid_ether_addr(dev->dev_addr)) 447 !is_valid_ether_addr(dev->dev_addr) ||
448 netdev_uses_dsa(dev))
443 return -EINVAL; 449 return -EINVAL;
444 450
445 /* No bridging of bridges */ 451 /* No bridging of bridges */