History

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. ====================

David S. Miller committed 11 years ago

Commit cbcd1fa2 parents 5bdc738 8db0a2e2 files · +11 −5Browse files

Unified · Split

2 files
  1. net/bridge/br_if.c +8 −2
  2. net/ipv4/ipconfig.c +3 −3
net/bridge/br_if.c+8−2
@@ -436,10 +436,16 @@ int br_add_if(struct net_bridge *br, struct net_device *dev) · 435 unmodified lines
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 */
net/ipv4/ipconfig.c+3−3
@@ -209,9 +209,9 @@ static int __init ic_open_devs(void) · 208 unmodified lines
209 last = &ic_first_dev;209 last = &ic_first_dev;
210 rtnl_lock();210 rtnl_lock();
211 211
212 /* bring loopback device up first */212 /* bring loopback and DSA master network devices up first */
213 for_each_netdev(&init_net, dev) {213 for_each_netdev(&init_net, dev) {
214 if (!(dev->flags & IFF_LOOPBACK))214 if (!(dev->flags & IFF_LOOPBACK) && !netdev_uses_dsa(dev))
215 continue;215 continue;
216 if (dev_change_flags(dev, dev->flags | IFF_UP) < 0)216 if (dev_change_flags(dev, dev->flags | IFF_UP) < 0)
217 pr_err("IP-Config: Failed to open %s\n", dev->name);217 pr_err("IP-Config: Failed to open %s\n", dev->name);
@@ -306,7 +306,7 @@ static void __init ic_close_devs(void) · 88 unmodified lines
306 while ((d = next)) {306 while ((d = next)) {
307 next = d->next;307 next = d->next;
308 dev = d->dev;308 dev = d->dev;
309 if (dev != ic_dev) {309 if (dev != ic_dev && !netdev_uses_dsa(dev)) {
310 DBG(("IP-Config: Downing %s\n", dev->name));310 DBG(("IP-Config: Downing %s\n", dev->name));
311 dev_change_flags(dev, d->flags);311 dev_change_flags(dev, d->flags);
312 }312 }