macvlan: Support creating macvtaps from macvlans
authorKevin Wallace <kevin@pentabarf.net>
Tue, 3 Dec 2013 10:55:22 +0000 (02:55 -0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 6 Dec 2013 00:59:02 +0000 (19:59 -0500)
When running in a network namespace whose only link to the outside
world is a macvlan device, not being able to create a macvtap off of
it is a real pain.

So modify macvtap creation to automatically forward a creation of a
macvtap on a macvlan to become a creation of a macvtap on the
underlying network device, just like is currently done with
macvlan-on-macvlan devices.

v2: Use netif_is_macvlan and macvlan_dev_real_dev helpers to make it
    more clear what we're doing.

Signed-off-by: Kevin Wallace <kevin@pentabarf.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/macvlan.c

index acf93798dc675929394e82ffed96cd1616c3a31d..cfb91570cdddccdfc02f9b860d1bf26d8b836b48 100644 (file)
@@ -820,13 +820,11 @@ int macvlan_common_newlink(struct net *src_net, struct net_device *dev,
        if (lowerdev == NULL)
                return -ENODEV;
 
-       /* When creating macvlans on top of other macvlans - use
+       /* When creating macvlans or macvtaps on top of other macvlans - use
         * the real device as the lowerdev.
         */
-       if (lowerdev->rtnl_link_ops == dev->rtnl_link_ops) {
-               struct macvlan_dev *lowervlan = netdev_priv(lowerdev);
-               lowerdev = lowervlan->lowerdev;
-       }
+       if (netif_is_macvlan(lowerdev))
+               lowerdev = macvlan_dev_real_dev(lowerdev);
 
        if (!tb[IFLA_MTU])
                dev->mtu = lowerdev->mtu;