diff options
author | 2025-02-19 20:50:27 +0800 | |
---|---|---|
committer | 2025-02-21 15:28:01 -0800 | |
commit | ec061546c6cffbb8929495bba3953f0cc5e177fa (patch) | |
tree | 3ab430b609efc42e844120f14dc953a7004541c8 /net/core/rtnetlink.c | |
parent | Merge branch 'dt-bindings-net-realtek-rtl9301-switch' (diff) | |
download | wireguard-linux-ec061546c6cffbb8929495bba3953f0cc5e177fa.tar.xz wireguard-linux-ec061546c6cffbb8929495bba3953f0cc5e177fa.zip |
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>
Diffstat (limited to '')
-rw-r--r-- | net/core/rtnetlink.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index abe1a461ea67..0f3e2c6021de 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -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; |