[PATCH net 03/12] Revert "rtnetlink: always put IFLA_LINK for links with a link-netnsid"
From: Sabrina Dubroca <sd@queasysnail.net>
Date: 2020-10-01 08:07:25
Subsystem:
networking [general], the rest · Maintainers:
"David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds
This reverts commit feadc4b6cf42a53a8a93c918a569a0b7e62bd350.
It fixed the particular issue that was seen in the OpenShift setup,
but ignored the case of tunnels like VXLAN, which export a
IFLA_LINK_NETNSID attribute but don't have an IFLA_LINK.
In case a vxlan device is created in one netns, then moved to another,
we end up seeing:
# ip -net foo link
15: vxlan1@if15: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN mode DEFAULT group default qlen 1000
^
The next patch will fix the original problem properly.
Fixes: feadc4b6cf42 ("rtnetlink: always put IFLA_LINK for links with a link-netnsid")
Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
---
net/core/rtnetlink.c | 16 ++++++----------
1 file changed, 6 insertions(+), 10 deletions(-)
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 68e0682450c6..c35b3f02b4f9 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c@@ -1547,15 +1547,14 @@ static int put_master_ifindex(struct sk_buff *skb, struct net_device *dev) return ret; } -static int nla_put_iflink(struct sk_buff *skb, const struct net_device *dev, - bool force) +static int nla_put_iflink(struct sk_buff *skb, const struct net_device *dev) { int ifindex = dev_get_iflink(dev); - if (force || dev->ifindex != ifindex) - return nla_put_u32(skb, IFLA_LINK, ifindex); + if (dev->ifindex == ifindex) + return 0; - return 0; + return nla_put_u32(skb, IFLA_LINK, ifindex); } static noinline_for_stack int nla_put_ifalias(struct sk_buff *skb,
@@ -1572,8 +1571,6 @@ static int rtnl_fill_link_netnsid(struct sk_buff *skb, const struct net_device *dev, struct net *src_net, gfp_t gfp) { - bool put_iflink = false; - if (dev->rtnl_link_ops && dev->rtnl_link_ops->get_link_net) { struct net *link_net = dev->rtnl_link_ops->get_link_net(dev);
@@ -1582,12 +1579,10 @@ static int rtnl_fill_link_netnsid(struct sk_buff *skb, if (nla_put_s32(skb, IFLA_LINK_NETNSID, id)) return -EMSGSIZE; - - put_iflink = true; } } - return nla_put_iflink(skb, dev, put_iflink); + return 0; } static int rtnl_fill_link_af(struct sk_buff *skb,
@@ -1738,6 +1733,7 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, #ifdef CONFIG_RPS nla_put_u32(skb, IFLA_NUM_RX_QUEUES, dev->num_rx_queues) || #endif + nla_put_iflink(skb, dev) || put_master_ifindex(skb, dev) || nla_put_u8(skb, IFLA_CARRIER, netif_carrier_ok(dev)) || (dev->qdisc &&
--
2.28.0