macvlan: Support creating macvlans from macvlans
authorEric Biederman <ebiederm@aristanetworks.com>
Fri, 13 Mar 2009 20:15:37 +0000 (13:15 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 13 Mar 2009 20:15:37 +0000 (13:15 -0700)
When running in a network namespace whose only link to
the outside world is a macvlan device, not being
able to create another macvlan is a real pain.

So modify macvlan creation to allow automatically forward
a creation of a macvlan on a macvlan to become a creation
of a macvlan on the underlying network device.

Signed-off-by: Eric Biederman <ebiederm@aristanetworks.com>
Acked-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/macvlan.c

index 7e24b50486869c8295e19d8b7339b7d56d6ef909..b5241fc0f512f19a395fa517afd849508a9c32a1 100644 (file)
@@ -461,12 +461,13 @@ static int macvlan_newlink(struct net_device *dev,
        if (lowerdev == NULL)
                return -ENODEV;
 
-       /* Don't allow macvlans on top of other macvlans - its not really
-        * wrong, but lockdep can't handle it and its not useful for anything
-        * you couldn't do directly on top of the real device.
+       /* When creating macvlans on top of other macvlans - use
+        * the real device as the lowerdev.
         */
-       if (lowerdev->rtnl_link_ops == dev->rtnl_link_ops)
-               return -ENODEV;
+       if (lowerdev->rtnl_link_ops == dev->rtnl_link_ops) {
+               struct macvlan_dev *lowervlan = netdev_priv(lowerdev);
+               lowerdev = lowervlan->lowerdev;
+       }
 
        if (!tb[IFLA_MTU])
                dev->mtu = lowerdev->mtu;