[PATCH iproute2-next] bridge: mcast: add mcast_active_v4 / mcast_active_v6 output

Linus Lüssing <[email protected]>
Newsgroups gmane.linux.network.bridge,gmane.linux.network
Message-ID <[email protected]>
Add output for the mcast_active_v4 and mcast_active_v6 states. If their
output is 1 then IGMP/MLD snooping is applied to multicast payload
traffic of their according protocol family. This is the case when:

* the bridge interface is up
* multicast snooping is enabled
* an IGMP/MLD querier is present
* for own IPv6 MLD querier: an IPv6 address is configured on the bridge

Signed-off-by: Linus Lüssing <[email protected]>
---
 bridge/vlan.c                  | 10 ++++++++++
 include/uapi/linux/if_bridge.h |  2 ++
 include/uapi/linux/if_link.h   |  2 ++
 ip/iplink_bridge.c             | 12 ++++++++++++
 4 files changed, 26 insertions(+)

diff --git a/bridge/vlan.c b/bridge/vlan.c
index 3c240207028b..d0b6afdee49d 100644
--- a/bridge/vlan.c
+++ b/bridge/vlan.c
@@ -920,6 +920,16 @@ static void print_vlan_global_opts(struct rtattr *a, int ifindex)
 		print_uint(PRINT_ANY, "msti", "msti %u ",
 			   rta_getattr_u16(vattr));
 	}
+	if (vtb[BRIDGE_VLANDB_GOPTS_MCAST_ACTIVE_V4]) {
+		vattr = vtb[BRIDGE_VLANDB_GOPTS_MCAST_ACTIVE_V4];
+		print_uint(PRINT_ANY, "mcast_active_v4", "mcast_active_v4 %u ",
+			   rta_getattr_u8(vattr));
+	}
+	if (vtb[BRIDGE_VLANDB_GOPTS_MCAST_ACTIVE_V6]) {
+		vattr = vtb[BRIDGE_VLANDB_GOPTS_MCAST_ACTIVE_V6];
+		print_uint(PRINT_ANY, "mcast_active_v6", "mcast_active_v6 %u ",
+			   rta_getattr_u8(vattr));
+	}
 	print_nl();
 	if (vtb[BRIDGE_VLANDB_GOPTS_MCAST_ROUTER_PORTS]) {
 		vattr = RTA_DATA(vtb[BRIDGE_VLANDB_GOPTS_MCAST_ROUTER_PORTS]);
diff --git a/include/uapi/linux/if_bridge.h b/include/uapi/linux/if_bridge.h
index 4d7509c4b84d..be0935057c56 100644
--- a/include/uapi/linux/if_bridge.h
+++ b/include/uapi/linux/if_bridge.h
@@ -584,6 +584,8 @@ enum {
 	BRIDGE_VLANDB_GOPTS_MCAST_ROUTER_PORTS,
 	BRIDGE_VLANDB_GOPTS_MCAST_QUERIER_STATE,
 	BRIDGE_VLANDB_GOPTS_MSTI,
+	BRIDGE_VLANDB_GOPTS_MCAST_ACTIVE_V4,
+	BRIDGE_VLANDB_GOPTS_MCAST_ACTIVE_V6,
 	__BRIDGE_VLANDB_GOPTS_MAX
 };
 #define BRIDGE_VLANDB_GOPTS_MAX (__BRIDGE_VLANDB_GOPTS_MAX - 1)
diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h
index d05f5cc750ff..7d36cfd6b30c 100644
--- a/include/uapi/linux/if_link.h
+++ b/include/uapi/linux/if_link.h
@@ -794,6 +794,8 @@ enum {
 	IFLA_BR_MCAST_QUERIER_STATE,
 	IFLA_BR_FDB_N_LEARNED,
 	IFLA_BR_FDB_MAX_LEARNED,
+	IFLA_BR_MCAST_ACTIVE_V4,
+	IFLA_BR_MCAST_ACTIVE_V6,
 	__IFLA_BR_MAX,
 };
 
diff --git a/ip/iplink_bridge.c b/ip/iplink_bridge.c
index df3264c3f45d..b3c0d6bb5310 100644
--- a/ip/iplink_bridge.c
+++ b/ip/iplink_bridge.c
@@ -784,6 +784,18 @@ static void bridge_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
 			   "mcast_mld_version %u ",
 			   rta_getattr_u8(tb[IFLA_BR_MCAST_MLD_VERSION]));
 
+	if (tb[IFLA_BR_MCAST_ACTIVE_V4])
+		print_uint(PRINT_ANY,
+			   "mcast_active_v4",
+			   "mcast_active_v4 %u ",
+			   rta_getattr_u8(tb[IFLA_BR_MCAST_ACTIVE_V4]));
+
+	if (tb[IFLA_BR_MCAST_ACTIVE_V6])
+		print_uint(PRINT_ANY,
+			   "mcast_active_v6",
+			   "mcast_active_v6 %u ",
+			   rta_getattr_u8(tb[IFLA_BR_MCAST_ACTIVE_V6]));
+
 	if (tb[IFLA_BR_NF_CALL_IPTABLES])
 		print_uint(PRINT_ANY,
 			   "nf_call_iptables",
-- 
2.51.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.