From 16aa4494d7fc6543e5e92beb2ce01648b79f8fa2 Mon Sep 17 00:00:00 2001 From: Fabian Pfitzner Date: Wed, 11 Dec 2024 08:22:24 +0100 Subject: [PATCH] bridge: dump mcast querier state Kernel support for dumping the multicast querier state was added in this commit [1]. As some people might be interested to get this information from userspace, this commit implements the necessary changes to show it via ip -d link show [dev] The querier state shows the following information for IPv4 and IPv6 respectively: 1) The ip address of the current querier in the network. This could be ourselves or an external querier. 2) The port on which the querier was seen 3) Querier timeout in seconds [1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=c7fa1d9b1fb179375e889ff076a1566ecc997bfc Signed-off-by: Fabian Pfitzner Acked-by: Nikolay Aleksandrov Acked-by: Nikolay Aleksandrov Signed-off-by: Stephen Hemminger --- ip/iplink_bridge.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/ip/iplink_bridge.c b/ip/iplink_bridge.c index f01ffe15..1fe89551 100644 --- a/ip/iplink_bridge.c +++ b/ip/iplink_bridge.c @@ -661,6 +661,65 @@ static void bridge_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[]) "mcast_querier %u ", rta_getattr_u8(tb[IFLA_BR_MCAST_QUERIER])); + if (tb[IFLA_BR_MCAST_QUERIER_STATE]) { + struct rtattr *bqtb[BRIDGE_QUERIER_MAX + 1]; + SPRINT_BUF(other_time); + + parse_rtattr_nested(bqtb, BRIDGE_QUERIER_MAX, tb[IFLA_BR_MCAST_QUERIER_STATE]); + memset(other_time, 0, sizeof(other_time)); + + open_json_object("mcast_querier_state_ipv4"); + if (bqtb[BRIDGE_QUERIER_IP_ADDRESS]) { + print_string(PRINT_FP, + NULL, + "%s ", + "mcast_querier_ipv4_addr"); + print_color_string(PRINT_ANY, + COLOR_INET, + "mcast_querier_ipv4_addr", + "%s ", + format_host_rta(AF_INET, bqtb[BRIDGE_QUERIER_IP_ADDRESS])); + } + if (bqtb[BRIDGE_QUERIER_IP_PORT]) + print_uint(PRINT_ANY, + "mcast_querier_ipv4_port", + "mcast_querier_ipv4_port %u ", + rta_getattr_u32(bqtb[BRIDGE_QUERIER_IP_PORT])); + if (bqtb[BRIDGE_QUERIER_IP_OTHER_TIMER]) + print_string(PRINT_ANY, + "mcast_querier_ipv4_other_timer", + "mcast_querier_ipv4_other_timer %s ", + sprint_time64( + rta_getattr_u64(bqtb[BRIDGE_QUERIER_IP_OTHER_TIMER]), + other_time)); + close_json_object(); + open_json_object("mcast_querier_state_ipv6"); + if (bqtb[BRIDGE_QUERIER_IPV6_ADDRESS]) { + print_string(PRINT_FP, + NULL, + "%s ", + "mcast_querier_ipv6_addr"); + print_color_string(PRINT_ANY, + COLOR_INET6, + "mcast_querier_ipv6_addr", + "%s ", + format_host_rta(AF_INET6, bqtb[BRIDGE_QUERIER_IPV6_ADDRESS])); + } + if (bqtb[BRIDGE_QUERIER_IPV6_PORT]) + print_uint(PRINT_ANY, + "mcast_querier_ipv6_port", + "mcast_querier_ipv6_port %u ", + rta_getattr_u32(bqtb[BRIDGE_QUERIER_IPV6_PORT])); + if (bqtb[BRIDGE_QUERIER_IPV6_OTHER_TIMER]) + print_string(PRINT_ANY, + "mcast_querier_ipv6_other_timer", + "mcast_querier_ipv6_other_timer %s ", + sprint_time64( + rta_getattr_u64(bqtb[BRIDGE_QUERIER_IPV6_OTHER_TIMER]), + other_time)); + close_json_object(); + } + if (tb[IFLA_BR_MCAST_HASH_ELASTICITY]) print_uint(PRINT_ANY, "mcast_hash_elasticity", -- 2.47.2