diff options
| -rw-r--r-- | net/bridge/br_if.c | 10 |
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 */ |
