|
@@ -436,10 +436,16 @@ int br_add_if(struct net_bridge *br, struct net_device *dev)
|
|
int err = 0;
|
|
int err = 0;
|
|
bool changed_addr;
|
|
bool changed_addr;
|
|
|
|
|
|
- /* Don't allow bridging non-ethernet like devices */
|
|
|
|
|
|
+ /* Don't allow bridging non-ethernet like devices, or DSA-enabled
|
|
|
|
+ * master network devices since the bridge layer rx_handler prevents
|
|
|
|
+ * the DSA fake ethertype handler to be invoked, so we do not strip off
|
|
|
|
+ * the DSA switch tag protocol header and the bridge layer just return
|
|
|
|
+ * RX_HANDLER_CONSUMED, stopping RX processing for these frames.
|
|
|
|
+ */
|
|
if ((dev->flags & IFF_LOOPBACK) ||
|
|
if ((dev->flags & IFF_LOOPBACK) ||
|
|
dev->type != ARPHRD_ETHER || dev->addr_len != ETH_ALEN ||
|
|
dev->type != ARPHRD_ETHER || dev->addr_len != ETH_ALEN ||
|
|
- !is_valid_ether_addr(dev->dev_addr))
|
|
|
|
|
|
+ !is_valid_ether_addr(dev->dev_addr) ||
|
|
|
|
+ netdev_uses_dsa(dev))
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
/* No bridging of bridges */
|
|
/* No bridging of bridges */
|