net: ipv4: handle DSA enabled master network devices
The logic to configure a network interface for kernel IP auto-configuration is very simplistic, and does not handle the case where a device is stacked onto another such as with DSA. This causes the kernel not to open and configure the master network device in a DSA switch tree, and therefore slave network devices using this master network devices as conduit device cannot be open. This restriction comes from a check in net/dsa/slave.c, which is basically checking the master netdev flags for IFF_UP and returns -ENETDOWN if it is not the case. Automatically bringing-up DSA master network devices allows DSA slave network devices to be used as valid interfaces for e.g: NFS root booting by allowing kernel IP autoconfiguration to succeed on these interfaces. On the reverse path, make sure we do not attempt to close a DSA-enabled device as this would implicitely prevent the slave DSA network device from operating. Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
5bdc73800d
commit
728c02089a
|
@ -209,9 +209,9 @@ static int __init ic_open_devs(void)
|
|||
last = &ic_first_dev;
|
||||
rtnl_lock();
|
||||
|
||||
/* bring loopback device up first */
|
||||
/* bring loopback and DSA master network devices up first */
|
||||
for_each_netdev(&init_net, dev) {
|
||||
if (!(dev->flags & IFF_LOOPBACK))
|
||||
if (!(dev->flags & IFF_LOOPBACK) && !netdev_uses_dsa(dev))
|
||||
continue;
|
||||
if (dev_change_flags(dev, dev->flags | IFF_UP) < 0)
|
||||
pr_err("IP-Config: Failed to open %s\n", dev->name);
|
||||
|
@ -306,7 +306,7 @@ static void __init ic_close_devs(void)
|
|||
while ((d = next)) {
|
||||
next = d->next;
|
||||
dev = d->dev;
|
||||
if (dev != ic_dev) {
|
||||
if (dev != ic_dev && !netdev_uses_dsa(dev)) {
|
||||
DBG(("IP-Config: Downing %s\n", dev->name));
|
||||
dev_change_flags(dev, d->flags);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue