rtnetlink: Lookup device in target netns when creating link

When creating link, lookup for existing device in target net namespace
instead of current one.
For example, two links created by:

  # ip link add dummy1 type dummy
  # ip link add netns ns1 dummy1 type dummy

should have no conflict since they are in different namespaces.

Signed-off-by: Xiao Liang <shaw.leon@gmail.com>
Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Link: https://patch.msgid.link/20250219125039.18024-2-shaw.leon@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Xiao Liang
2025-02-19 20:50:27 +08:00
committed by Jakub Kicinski
parent 4fe67dd2d5
commit ec061546c6

View File

@@ -3867,20 +3867,26 @@ static int __rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh,
{
struct nlattr ** const tb = tbs->tb;
struct net *net = sock_net(skb->sk);
struct net *device_net;
struct net_device *dev;
struct ifinfomsg *ifm;
bool link_specified;
/* When creating, lookup for existing device in target net namespace */
device_net = (nlh->nlmsg_flags & NLM_F_CREATE) &&
(nlh->nlmsg_flags & NLM_F_EXCL) ?
tgt_net : net;
ifm = nlmsg_data(nlh);
if (ifm->ifi_index > 0) {
link_specified = true;
dev = __dev_get_by_index(net, ifm->ifi_index);
dev = __dev_get_by_index(device_net, ifm->ifi_index);
} else if (ifm->ifi_index < 0) {
NL_SET_ERR_MSG(extack, "ifindex can't be negative");
return -EINVAL;
} else if (tb[IFLA_IFNAME] || tb[IFLA_ALT_IFNAME]) {
link_specified = true;
dev = rtnl_dev_get(net, tb);
dev = rtnl_dev_get(device_net, tb);
} else {
link_specified = false;
dev = NULL;