Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'dsa-next'

Florian Fainelli says:

====================
net: DSA fixes for bridge and ip-autoconf

These two patches address some real world use cases of the DSA master and slave
network devices.

You have already seen patch 1 previously and you rejected it since my
explanations were not good enough to provide a justification as to why it is
useful, hopefully this time my explanation is better.

Patch 2 solves a different, yet very real problem as well at the bridge layer
when using DSA network devices.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+11 -5
+8 -2
net/bridge/br_if.c
··· 436 436 int err = 0; 437 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 445 if ((dev->flags & IFF_LOOPBACK) || 441 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 449 return -EINVAL; 444 450 445 451 /* No bridging of bridges */
+3 -3
net/ipv4/ipconfig.c
··· 209 209 last = &ic_first_dev; 210 210 rtnl_lock(); 211 211 212 - /* bring loopback device up first */ 212 + /* bring loopback and DSA master network devices up first */ 213 213 for_each_netdev(&init_net, dev) { 214 - if (!(dev->flags & IFF_LOOPBACK)) 214 + if (!(dev->flags & IFF_LOOPBACK) && !netdev_uses_dsa(dev)) 215 215 continue; 216 216 if (dev_change_flags(dev, dev->flags | IFF_UP) < 0) 217 217 pr_err("IP-Config: Failed to open %s\n", dev->name); ··· 306 306 while ((d = next)) { 307 307 next = d->next; 308 308 dev = d->dev; 309 - if (dev != ic_dev) { 309 + if (dev != ic_dev && !netdev_uses_dsa(dev)) { 310 310 DBG(("IP-Config: Downing %s\n", dev->name)); 311 311 dev_change_flags(dev, d->flags); 312 312 }