}
if (netdev->type == LXC_NET_PHYS) {
+ /* Physical interfaces are initially returned to the parent namespace
+ * with their transient name to avoid collisions
+ */
+ netdev->ifindex = if_nametoindex(netdev->transient_name);
ret = lxc_netdev_rename_by_index(netdev->ifindex, netdev->link);
if (ret < 0)
WARN("Failed to rename interface with index %d "
netdev->priv.veth_attr.veth1[0] = '\0';
netdev->priv.veth_attr.ifindex = 0;
}
+
+ /* Clear transient name */
+ if (!is_empty_string (netdev->transient_name))
+ {
+ netdev->transient_name[0] = '\0';
+ }
}
return true;
continue;
}
- ret = lxc_netdev_move_by_index_fd(netdev->ifindex, oldfd, netdev->link);
+ /* Restore physical interfaces to host's network namespace with its transient name
+ * to avoid collisions with the host's other interfaces.
+ */
+ ret = lxc_netdev_move_by_index_fd(netdev->ifindex, oldfd, netdev->transient_name);
if (ret < 0)
WARN("Error moving network device \"%s\" back to network namespace", ifname);
else
* @created_name : the name with which this interface got created before
* being renamed to final_name.
* Currenly only used for veth devices.
+ * @transient_name : temporary name to avoid namespace collisions
* @hwaddr : mac address
* @mtu : maximum transmission unit
* @priv : information specific to the specificed network type