|
@@ -659,6 +659,27 @@ __setup("netdev=", netdev_boot_setup);
|
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
+/**
|
|
|
+ * dev_get_iflink - get 'iflink' value of a interface
|
|
|
+ * @dev: targeted interface
|
|
|
+ *
|
|
|
+ * Indicates the ifindex the interface is linked to.
|
|
|
+ * Physical interfaces have the same 'ifindex' and 'iflink' values.
|
|
|
+ */
|
|
|
+
|
|
|
+int dev_get_iflink(const struct net_device *dev)
|
|
|
+{
|
|
|
+ if (dev->netdev_ops && dev->netdev_ops->ndo_get_iflink)
|
|
|
+ return dev->netdev_ops->ndo_get_iflink(dev);
|
|
|
+
|
|
|
+ /* If dev->rtnl_link_ops is set, it's a virtual interface. */
|
|
|
+ if (dev->rtnl_link_ops)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ return dev->ifindex;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(dev_get_iflink);
|
|
|
+
|
|
|
/**
|
|
|
* __dev_get_by_name - find a device by its name
|
|
|
* @net: the applicable net namespace
|
|
@@ -6314,8 +6335,6 @@ int register_netdevice(struct net_device *dev)
|
|
|
spin_lock_init(&dev->addr_list_lock);
|
|
|
netdev_set_addr_lockdep_class(dev);
|
|
|
|
|
|
- dev->iflink = -1;
|
|
|
-
|
|
|
ret = dev_get_valid_name(net, dev, dev->name);
|
|
|
if (ret < 0)
|
|
|
goto out;
|
|
@@ -6345,9 +6364,6 @@ int register_netdevice(struct net_device *dev)
|
|
|
else if (__dev_get_by_index(net, dev->ifindex))
|
|
|
goto err_uninit;
|
|
|
|
|
|
- if (dev->iflink == -1)
|
|
|
- dev->iflink = dev->ifindex;
|
|
|
-
|
|
|
/* Transfer changeable features to wanted_features and enable
|
|
|
* software offloads (GSO and GRO).
|
|
|
*/
|
|
@@ -7060,12 +7076,8 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char
|
|
|
dev_net_set(dev, net);
|
|
|
|
|
|
/* If there is an ifindex conflict assign a new one */
|
|
|
- if (__dev_get_by_index(net, dev->ifindex)) {
|
|
|
- int iflink = (dev->iflink == dev->ifindex);
|
|
|
+ if (__dev_get_by_index(net, dev->ifindex))
|
|
|
dev->ifindex = dev_new_index(net);
|
|
|
- if (iflink)
|
|
|
- dev->iflink = dev->ifindex;
|
|
|
- }
|
|
|
|
|
|
/* Send a netdev-add uevent to the new namespace */
|
|
|
kobject_uevent(&dev->dev.kobj, KOBJ_ADD);
|