[PATCH iproute2-next 4/4] ip: iplink_bridge: Support bridge VLAN stats in `ip stats'
From: Petr Machata <petrm@nvidia.com>
Date: 2025-06-06 15:08:06
Subsystem:
the rest · Maintainer:
Linus Torvalds
Add support for displaying bridge VLAN statistics in `ip stats'.
Reuse the existing `bridge vlan' display and JSON format:
# ip stats show dev v2 group xstats_slave subgroup bridge suite vlan
2: v2: group xstats_slave subgroup bridge suite vlan
10
RX: 776 bytes 10 packets
TX: 224 bytes 4 packets
20
RX: 684 bytes 7 packets
TX: 0 bytes 0 packets
# ip -j -p stats show dev v2 group xstats_slave subgroup bridge suite vlan
[ {
"ifindex": 2,
"ifname": "v2",
"group": "xstats_slave",
"subgroup": "bridge",
"suite": "vlan",
"vlans": [ {
"vid": 10,
"rx_bytes": 552,
"rx_packets": 6,
"tx_bytes": 0,
"tx_packets": 0
},{
"vid": 20,
"rx_bytes": 684,
"rx_packets": 7,
"tx_bytes": 0,
"tx_packets": 0
} ]
} ]
Signed-off-by: Petr Machata <petrm@nvidia.com>
---
ip/iplink_bridge.c | 36 ++++++++++++++++++++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git a/ip/iplink_bridge.c b/ip/iplink_bridge.c
index 3d54e203..531c495d 100644
--- a/ip/iplink_bridge.c
+++ b/ip/iplink_bridge.c@@ -14,6 +14,7 @@ #include <linux/if_bridge.h> #include <net/if.h> +#include "bridge.h" #include "rt_names.h" #include "utils.h" #include "ip_common.h"
@@ -978,6 +979,26 @@ static void bridge_print_stats_stp(const struct rtattr *attr) close_json_object(); } +static void bridge_print_stats_vlan(const struct rtattr *attr) +{ + const struct bridge_vlan_xstats *vstats = RTA_DATA(attr); + + print_string(PRINT_FP, NULL, "%-" textify(IFNAMSIZ) "s ", ""); + bridge_print_vlan_stats(vstats); +} + +static int bridge_stat_desc_show_xstats(struct ipstats_stat_show_attrs *attrs, + const struct ipstats_stat_desc *desc) +{ + int ret; + + open_json_array(PRINT_JSON, "vlans"); + ret = ipstats_stat_desc_show_xstats(attrs, desc); + close_json_array(PRINT_JSON, "vlans"); + + return ret; +} + static void bridge_print_stats_attr(struct rtattr *attr, int ifindex) { struct rtattr *brtb[LINK_XSTATS_TYPE_MAX+1];
@@ -1119,10 +1140,25 @@ ipstats_stat_desc_xstats_slave_bridge_mcast = { .show_cb = &bridge_print_stats_mcast, }; +static const struct ipstats_stat_desc_xstats +ipstats_stat_desc_xstats_slave_bridge_vlan = { + .desc = { + .name = "vlan", + .kind = IPSTATS_STAT_DESC_KIND_LEAF, + .show = &bridge_stat_desc_show_xstats, + .pack = &ipstats_stat_desc_pack_xstats, + }, + .xstats_at = IFLA_STATS_LINK_XSTATS_SLAVE, + .link_type_at = LINK_XSTATS_TYPE_BRIDGE, + .inner_at = BRIDGE_XSTATS_VLAN, + .show_cb = &bridge_print_stats_vlan, +}; + static const struct ipstats_stat_desc * ipstats_stat_desc_xstats_slave_bridge_subs[] = { &ipstats_stat_desc_xstats_slave_bridge_stp.desc, &ipstats_stat_desc_xstats_slave_bridge_mcast.desc, + &ipstats_stat_desc_xstats_slave_bridge_vlan.desc, }; const struct ipstats_stat_desc ipstats_stat_desc_xstats_slave_bridge_group = {
--
2.49.0