Commit 9c7dafbf authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by David S. Miller

net: Allow to create links with given ifindex

Currently the RTM_NEWLINK results in -EOPNOTSUPP if the ifinfomsg->ifi_index
is not zero. I propose to allow requesting ifindices on link creation. This
is required by the checkpoint-restore to correctly restore a net namespace
(i.e. -- a container).
Signed-off-by: default avatarPavel Emelyanov <xemul@parallels.com>
Acked-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b14f243a
...@@ -5579,7 +5579,12 @@ int register_netdevice(struct net_device *dev) ...@@ -5579,7 +5579,12 @@ int register_netdevice(struct net_device *dev)
} }
} }
dev->ifindex = dev_new_index(net); ret = -EBUSY;
if (!dev->ifindex)
dev->ifindex = dev_new_index(net);
else if (__dev_get_by_index(net, dev->ifindex))
goto err_uninit;
if (dev->iflink == -1) if (dev->iflink == -1)
dev->iflink = dev->ifindex; dev->iflink = dev->ifindex;
......
...@@ -1812,8 +1812,6 @@ static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) ...@@ -1812,8 +1812,6 @@ static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
return -ENODEV; return -ENODEV;
} }
if (ifm->ifi_index)
return -EOPNOTSUPP;
if (tb[IFLA_MAP] || tb[IFLA_MASTER] || tb[IFLA_PROTINFO]) if (tb[IFLA_MAP] || tb[IFLA_MASTER] || tb[IFLA_PROTINFO])
return -EOPNOTSUPP; return -EOPNOTSUPP;
...@@ -1839,10 +1837,14 @@ static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) ...@@ -1839,10 +1837,14 @@ static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
return PTR_ERR(dest_net); return PTR_ERR(dest_net);
dev = rtnl_create_link(net, dest_net, ifname, ops, tb); dev = rtnl_create_link(net, dest_net, ifname, ops, tb);
if (IS_ERR(dev)) {
if (IS_ERR(dev))
err = PTR_ERR(dev); err = PTR_ERR(dev);
else if (ops->newlink) goto out;
}
dev->ifindex = ifm->ifi_index;
if (ops->newlink)
err = ops->newlink(net, dev, tb, data); err = ops->newlink(net, dev, tb, data);
else else
err = register_netdevice(dev); err = register_netdevice(dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment