Commit 62938182 authored by Nikolay Aleksandrov's avatar Nikolay Aleksandrov Committed by David S. Miller
Browse files

net: bridge: vlan: add support for mcast querier global option



Add support to change and retrieve global vlan multicast querier state.
We just need to pass multicast context to br_multicast_set_querier
instead of bridge device and the rest of the logic remains the same.

Signed-off-by: default avatarNikolay Aleksandrov <nikolay@nvidia.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent cb486ce9
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -560,6 +560,7 @@ enum {
	BRIDGE_VLANDB_GOPTS_MCAST_QUERY_INTVL,
	BRIDGE_VLANDB_GOPTS_MCAST_QUERY_RESPONSE_INTVL,
	BRIDGE_VLANDB_GOPTS_MCAST_STARTUP_QUERY_INTVL,
	BRIDGE_VLANDB_GOPTS_MCAST_QUERIER,
	__BRIDGE_VLANDB_GOPTS_MAX
};
#define BRIDGE_VLANDB_GOPTS_MAX (__BRIDGE_VLANDB_GOPTS_MAX - 1)
+3 −4
Original line number Diff line number Diff line
@@ -4297,14 +4297,13 @@ bool br_multicast_router(const struct net_device *dev)
}
EXPORT_SYMBOL_GPL(br_multicast_router);

int br_multicast_set_querier(struct net_bridge *br, unsigned long val)
int br_multicast_set_querier(struct net_bridge_mcast *brmctx, unsigned long val)
{
	struct net_bridge_mcast *brmctx = &br->multicast_ctx;
	unsigned long max_delay;

	val = !!val;

	spin_lock_bh(&br->multicast_lock);
	spin_lock_bh(&brmctx->br->multicast_lock);
	if (brmctx->multicast_querier == val)
		goto unlock;

@@ -4327,7 +4326,7 @@ int br_multicast_set_querier(struct net_bridge *br, unsigned long val)
#endif

unlock:
	spin_unlock_bh(&br->multicast_lock);
	spin_unlock_bh(&brmctx->br->multicast_lock);

	return 0;
}
+3 −2
Original line number Diff line number Diff line
@@ -1309,7 +1309,8 @@ static int br_changelink(struct net_device *brdev, struct nlattr *tb[],
	if (data[IFLA_BR_MCAST_QUERIER]) {
		u8 mcast_querier = nla_get_u8(data[IFLA_BR_MCAST_QUERIER]);

		err = br_multicast_set_querier(br, mcast_querier);
		err = br_multicast_set_querier(&br->multicast_ctx,
					       mcast_querier);
		if (err)
			return err;
	}
@@ -1575,7 +1576,7 @@ static int br_fill_info(struct sk_buff *skb, const struct net_device *brdev)
	    nla_put_u8(skb, IFLA_BR_MCAST_QUERY_USE_IFADDR,
		       br_opt_get(br, BROPT_MULTICAST_QUERY_USE_IFADDR)) ||
	    nla_put_u8(skb, IFLA_BR_MCAST_QUERIER,
		       READ_ONCE(br->multicast_ctx.multicast_querier)) ||
		       br->multicast_ctx.multicast_querier) ||
	    nla_put_u8(skb, IFLA_BR_MCAST_STATS_ENABLED,
		       br_opt_get(br, BROPT_MULTICAST_STATS_ENABLED)) ||
	    nla_put_u32(skb, IFLA_BR_MCAST_HASH_ELASTICITY, RHT_ELASTICITY) ||
+3 −2
Original line number Diff line number Diff line
@@ -881,7 +881,7 @@ int br_multicast_set_router(struct net_bridge *br, unsigned long val);
int br_multicast_set_port_router(struct net_bridge_port *p, unsigned long val);
int br_multicast_toggle(struct net_bridge *br, unsigned long val,
			struct netlink_ext_ack *extack);
int br_multicast_set_querier(struct net_bridge *br, unsigned long val);
int br_multicast_set_querier(struct net_bridge_mcast *brmctx, unsigned long val);
int br_multicast_set_hash_max(struct net_bridge *br, unsigned long val);
int br_multicast_set_igmp_version(struct net_bridge_mcast *brmctx,
				  unsigned long val);
@@ -1028,7 +1028,7 @@ __br_multicast_querier_exists(struct net_bridge_mcast *brmctx,
{
	bool own_querier_enabled;

	if (READ_ONCE(brmctx->multicast_querier)) {
	if (brmctx->multicast_querier) {
		if (is_ipv6 && !br_opt_get(brmctx->br, BROPT_HAS_IPV6_ADDR))
			own_querier_enabled = false;
		else
@@ -1190,6 +1190,7 @@ br_multicast_ctx_options_equal(const struct net_bridge_mcast *brmctx1,
	       brmctx2->multicast_query_response_interval &&
	       brmctx1->multicast_startup_query_interval ==
	       brmctx2->multicast_startup_query_interval &&
	       brmctx1->multicast_querier == brmctx2->multicast_querier &&
#if IS_ENABLED(CONFIG_IPV6)
	       brmctx1->multicast_mld_version ==
	       brmctx2->multicast_mld_version &&
+2 −2
Original line number Diff line number Diff line
@@ -447,13 +447,13 @@ static ssize_t multicast_querier_show(struct device *d,
				      char *buf)
{
	struct net_bridge *br = to_bridge(d);
	return sprintf(buf, "%d\n", READ_ONCE(br->multicast_ctx.multicast_querier));
	return sprintf(buf, "%d\n", br->multicast_ctx.multicast_querier);
}

static int set_multicast_querier(struct net_bridge *br, unsigned long val,
				 struct netlink_ext_ack *extack)
{
	return br_multicast_set_querier(br, val);
	return br_multicast_set_querier(&br->multicast_ctx, val);
}

static ssize_t multicast_querier_store(struct device *d,
Loading