|
@@ -1307,6 +1307,31 @@ static u32 rtnl_get_event(unsigned long event)
|
|
|
return rtnl_event_type;
|
|
|
}
|
|
|
|
|
|
+static int put_master_ifindex(struct sk_buff *skb, struct net_device *dev)
|
|
|
+{
|
|
|
+ const struct net_device *upper_dev;
|
|
|
+ int ret = 0;
|
|
|
+
|
|
|
+ rcu_read_lock();
|
|
|
+
|
|
|
+ upper_dev = netdev_master_upper_dev_get_rcu(dev);
|
|
|
+ if (upper_dev)
|
|
|
+ ret = nla_put_u32(skb, IFLA_MASTER, upper_dev->ifindex);
|
|
|
+
|
|
|
+ rcu_read_unlock();
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+static int nla_put_iflink(struct sk_buff *skb, const struct net_device *dev)
|
|
|
+{
|
|
|
+ int ifindex = dev_get_iflink(dev);
|
|
|
+
|
|
|
+ if (dev->ifindex == ifindex)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ return nla_put_u32(skb, IFLA_LINK, ifindex);
|
|
|
+}
|
|
|
+
|
|
|
static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
|
|
|
int type, u32 pid, u32 seq, u32 change,
|
|
|
unsigned int flags, u32 ext_filter_mask,
|
|
@@ -1316,7 +1341,6 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
|
|
|
struct nlmsghdr *nlh;
|
|
|
struct nlattr *af_spec;
|
|
|
struct rtnl_af_ops *af_ops;
|
|
|
- struct net_device *upper_dev = netdev_master_upper_dev_get(dev);
|
|
|
|
|
|
ASSERT_RTNL();
|
|
|
nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ifm), flags);
|
|
@@ -1345,10 +1369,8 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
|
|
|
#ifdef CONFIG_RPS
|
|
|
nla_put_u32(skb, IFLA_NUM_RX_QUEUES, dev->num_rx_queues) ||
|
|
|
#endif
|
|
|
- (dev->ifindex != dev_get_iflink(dev) &&
|
|
|
- nla_put_u32(skb, IFLA_LINK, dev_get_iflink(dev))) ||
|
|
|
- (upper_dev &&
|
|
|
- nla_put_u32(skb, IFLA_MASTER, upper_dev->ifindex)) ||
|
|
|
+ nla_put_iflink(skb, dev) ||
|
|
|
+ put_master_ifindex(skb, dev) ||
|
|
|
nla_put_u8(skb, IFLA_CARRIER, netif_carrier_ok(dev)) ||
|
|
|
(dev->qdisc &&
|
|
|
nla_put_string(skb, IFLA_QDISC, dev->qdisc->ops->id)) ||
|