]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
bridge: dump mcast querier state
authorFabian Pfitzner <f.pfitzner@pengutronix.de>
Wed, 11 Dec 2024 07:22:24 +0000 (08:22 +0100)
committerStephen Hemminger <stephen@networkplumber.org>
Thu, 12 Dec 2024 23:21:28 +0000 (15:21 -0800)
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 <f.pfitzner@pengutronix.de>
Acked-by: Nikolay Aleksandrov <razor@blackwall.org>
Acked-by: Nikolay Aleksandrov <razor@blackwall.org>
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
ip/iplink_bridge.c

index f01ffe15d7e8758799630c6cba071d2585051463..1fe89551bcedde871df78e5e399fa96b8f54bfa0 100644 (file)
@@ -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",