|
|
@@ -1496,14 +1496,15 @@ 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)
|
|
|
+static int nla_put_iflink(struct sk_buff *skb, const struct net_device *dev,
|
|
|
+ bool force)
|
|
|
{
|
|
|
int ifindex = dev_get_iflink(dev);
|
|
|
|
|
|
- if (dev->ifindex == ifindex)
|
|
|
- return 0;
|
|
|
+ if (force || dev->ifindex != ifindex)
|
|
|
+ return nla_put_u32(skb, IFLA_LINK, ifindex);
|
|
|
|
|
|
- return nla_put_u32(skb, IFLA_LINK, ifindex);
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static noinline_for_stack int nla_put_ifalias(struct sk_buff *skb,
|
|
|
@@ -1520,6 +1521,8 @@ static int rtnl_fill_link_netnsid(struct sk_buff *skb,
|
|
|
const struct net_device *dev,
|
|
|
struct net *src_net)
|
|
|
{
|
|
|
+ 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);
|
|
|
|
|
|
@@ -1528,10 +1531,12 @@ 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 0;
|
|
|
+ return nla_put_iflink(skb, dev, put_iflink);
|
|
|
}
|
|
|
|
|
|
static int rtnl_fill_link_af(struct sk_buff *skb,
|
|
|
@@ -1617,7 +1622,6 @@ 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 &&
|