const struct net_device *dev,
                                                   const struct net_device *slave_dev);
        struct net              *(*get_link_net)(const struct net_device *dev);
-       size_t                  (*get_linkxstats_size)(const struct net_device *dev);
+       size_t                  (*get_linkxstats_size)(const struct net_device *dev,
+                                                      int attr);
        int                     (*fill_linkxstats)(struct sk_buff *skb,
                                                   const struct net_device *dev,
-                                                  int *prividx);
+                                                  int *prividx, int attr);
 };
 
 int __rtnl_link_register(struct rtnl_link_ops *ops);
 
        IFLA_STATS_UNSPEC, /* also used as 64bit pad attribute */
        IFLA_STATS_LINK_64,
        IFLA_STATS_LINK_XSTATS,
+       IFLA_STATS_LINK_XSTATS_SLAVE,
        __IFLA_STATS_MAX,
 };
 
 
        return 0;
 }
 
-static size_t br_get_linkxstats_size(const struct net_device *dev)
+static size_t bridge_get_linkxstats_size(const struct net_device *dev)
 {
        struct net_bridge *br = netdev_priv(dev);
        struct net_bridge_vlan_group *vg;
               nla_total_size(0);
 }
 
-static int br_fill_linkxstats(struct sk_buff *skb, const struct net_device *dev,
-                             int *prividx)
+static size_t brport_get_linkxstats_size(const struct net_device *dev)
+{
+       return nla_total_size(0);
+}
+
+static size_t br_get_linkxstats_size(const struct net_device *dev, int attr)
+{
+       size_t retsize = 0;
+
+       switch (attr) {
+       case IFLA_STATS_LINK_XSTATS:
+               retsize = bridge_get_linkxstats_size(dev);
+               break;
+       case IFLA_STATS_LINK_XSTATS_SLAVE:
+               retsize = brport_get_linkxstats_size(dev);
+               break;
+       }
+
+       return retsize;
+}
+
+static int bridge_fill_linkxstats(struct sk_buff *skb,
+                                 const struct net_device *dev,
+                                 int *prividx)
 {
        struct net_bridge *br = netdev_priv(dev);
        struct net_bridge_vlan_group *vg;
        return -EMSGSIZE;
 }
 
+static int brport_fill_linkxstats(struct sk_buff *skb,
+                                 const struct net_device *dev,
+                                 int *prividx)
+{
+       struct nlattr *nest;
+
+       nest = nla_nest_start(skb, LINK_XSTATS_TYPE_BRIDGE);
+       if (!nest)
+               return -EMSGSIZE;
+       nla_nest_end(skb, nest);
+
+       return 0;
+}
+
+static int br_fill_linkxstats(struct sk_buff *skb, const struct net_device *dev,
+                             int *prividx, int attr)
+{
+       int ret = -EINVAL;
+
+       switch (attr) {
+       case IFLA_STATS_LINK_XSTATS:
+               ret = bridge_fill_linkxstats(skb, dev, prividx);
+               break;
+       case IFLA_STATS_LINK_XSTATS_SLAVE:
+               ret = brport_fill_linkxstats(skb, dev, prividx);
+               break;
+       }
+
+       return ret;
+}
+
 static struct rtnl_af_ops br_af_ops __read_mostly = {
        .family                 = AF_BRIDGE,
        .get_link_af_size       = br_get_link_af_size_filtered,
 
                        if (!attr)
                                goto nla_put_failure;
 
-                       err = ops->fill_linkxstats(skb, dev, prividx);
+                       err = ops->fill_linkxstats(skb, dev, prividx, *idxattr);
+                       nla_nest_end(skb, attr);
+                       if (err)
+                               goto nla_put_failure;
+                       *idxattr = 0;
+               }
+       }
+
+       if (stats_attr_valid(filter_mask, IFLA_STATS_LINK_XSTATS_SLAVE,
+                            *idxattr)) {
+               const struct rtnl_link_ops *ops = NULL;
+               const struct net_device *master;
+
+               master = netdev_master_upper_dev_get(dev);
+               if (master)
+                       ops = master->rtnl_link_ops;
+               if (ops && ops->fill_linkxstats) {
+                       int err;
+
+                       *idxattr = IFLA_STATS_LINK_XSTATS_SLAVE;
+                       attr = nla_nest_start(skb,
+                                             IFLA_STATS_LINK_XSTATS_SLAVE);
+                       if (!attr)
+                               goto nla_put_failure;
+
+                       err = ops->fill_linkxstats(skb, dev, prividx, *idxattr);
                        nla_nest_end(skb, attr);
                        if (err)
                                goto nla_put_failure;
 
        if (stats_attr_valid(filter_mask, IFLA_STATS_LINK_XSTATS, 0)) {
                const struct rtnl_link_ops *ops = dev->rtnl_link_ops;
+               int attr = IFLA_STATS_LINK_XSTATS;
 
                if (ops && ops->get_linkxstats_size) {
-                       size += nla_total_size(ops->get_linkxstats_size(dev));
+                       size += nla_total_size(ops->get_linkxstats_size(dev,
+                                                                       attr));
                        /* for IFLA_STATS_LINK_XSTATS */
                        size += nla_total_size(0);
                }
        }
 
+       if (stats_attr_valid(filter_mask, IFLA_STATS_LINK_XSTATS_SLAVE, 0)) {
+               struct net_device *_dev = (struct net_device *)dev;
+               const struct rtnl_link_ops *ops = NULL;
+               const struct net_device *master;
+
+               /* netdev_master_upper_dev_get can't take const */
+               master = netdev_master_upper_dev_get(_dev);
+               if (master)
+                       ops = master->rtnl_link_ops;
+               if (ops && ops->get_linkxstats_size) {
+                       int attr = IFLA_STATS_LINK_XSTATS_SLAVE;
+
+                       size += nla_total_size(ops->get_linkxstats_size(dev,
+                                                                       attr));
+                       /* for IFLA_STATS_LINK_XSTATS_SLAVE */
+                       size += nla_total_size(0);
+               }
+       }
+
        return size;
 }