Commit dee2cdc0 authored by Nikolay Aleksandrov's avatar Nikolay Aleksandrov Committed by Jakub Kicinski
Browse files

selftests: net: bridge: add vlan mcast querier test



Add a test to try the new global vlan mcast_querier control and also
verify that tagged general query packets are properly generated when
querier is enabled for a single vlan.

TEST: Vlan mcast_querier global option default value                [ OK ]
TEST: Vlan 10 multicast querier enable                              [ OK ]
TEST: Vlan 10 tagged IGMPv2 general query sent                      [ OK ]
TEST: Vlan 10 tagged MLD general query sent                         [ OK ]

Signed-off-by: default avatarNikolay Aleksandrov <nikolay@nvidia.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 71ae450f
Loading
Loading
Loading
Loading
+104 −1
Original line number Original line Diff line number Diff line
#!/bin/bash
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
# SPDX-License-Identifier: GPL-2.0


ALL_TESTS="vlmc_control_test"
ALL_TESTS="vlmc_control_test vlmc_querier_test"
NUM_NETIFS=4
NUM_NETIFS=4
CHECK_TC="yes"
CHECK_TC="yes"
TEST_GROUP="239.10.10.10"
TEST_GROUP="239.10.10.10"
@@ -43,6 +43,9 @@ switch_create()
	ip link set dev $swp1 up
	ip link set dev $swp1 up
	ip link set dev $swp2 up
	ip link set dev $swp2 up


	tc qdisc add dev $swp1 clsact
	tc qdisc add dev $swp2 clsact

	bridge vlan add vid 10-11 dev $swp1 master
	bridge vlan add vid 10-11 dev $swp1 master
	bridge vlan add vid 10-11 dev $swp2 master
	bridge vlan add vid 10-11 dev $swp2 master


@@ -138,6 +141,106 @@ vlmc_control_test()
	log_test "Vlan 10 multicast snooping control"
	log_test "Vlan 10 multicast snooping control"
}
}


# setup for general query counting
vlmc_query_cnt_xstats()
{
	local type=$1
	local version=$2
	local dev=$3

	ip -j link xstats type bridge_slave dev $dev | \
	jq -e ".[].multicast.${type}_queries.tx_v${version}"
}

vlmc_query_cnt_setup()
{
	local type=$1
	local dev=$2

	if [[ $type == "igmp" ]]; then
		tc filter add dev $dev egress pref 10 prot 802.1Q \
			flower vlan_id 10 vlan_ethtype ipv4 dst_ip 224.0.0.1 ip_proto 2 \
			action pass
	else
		tc filter add dev $dev egress pref 10 prot 802.1Q \
			flower vlan_id 10 vlan_ethtype ipv6 dst_ip ff02::1 ip_proto icmpv6 \
			action pass
	fi

	ip link set dev br0 type bridge mcast_stats_enabled 1
}

vlmc_query_cnt_cleanup()
{
	local dev=$1

	ip link set dev br0 type bridge mcast_stats_enabled 0
	tc filter del dev $dev egress pref 10
}

vlmc_check_query()
{
	local type=$1
	local version=$2
	local dev=$3
	local expect=$4
	local time=$5
	local ret=0

	vlmc_query_cnt_setup $type $dev

	local pre_tx_xstats=$(vlmc_query_cnt_xstats $type $version $dev)
	bridge vlan global set vid 10 dev br0 mcast_snooping 1 mcast_querier 1
	ret=$?
	if [[ $ret -eq 0 ]]; then
		sleep $time

		local tcstats=$(tc_rule_stats_get $dev 10 egress)
		local post_tx_xstats=$(vlmc_query_cnt_xstats $type $version $dev)

		if [[ $tcstats != $expect || \
		      $(($post_tx_xstats-$pre_tx_xstats)) != $expect || \
		      $tcstats != $(($post_tx_xstats-$pre_tx_xstats)) ]]; then
			ret=1
		fi
	fi

	bridge vlan global set vid 10 dev br0 mcast_snooping 1 mcast_querier 0
	vlmc_query_cnt_cleanup $dev

	return $ret
}

vlmc_querier_test()
{
	RET=0
	local goutput=`bridge -j vlan global show`
	echo -n $goutput |
		jq -e ".[].vlans[] | select(.vlan == 10)" &>/dev/null
	check_err $? "Could not find vlan 10's global options"

	echo -n $goutput |
		jq -e ".[].vlans[] | select(.vlan == 10 and .mcast_querier == 0) " &>/dev/null
	check_err $? "Wrong default mcast_querier global vlan option value"
	log_test "Vlan mcast_querier global option default value"

	RET=0
	bridge vlan global set vid 10 dev br0 mcast_snooping 1 mcast_querier 1
	check_err $? "Could not enable querier in vlan 10"
	log_test "Vlan 10 multicast querier enable"
	bridge vlan global set vid 10 dev br0 mcast_snooping 1 mcast_querier 0

	RET=0
	vlmc_check_query igmp 2 $swp1 1 1
	check_err $? "No vlan tagged IGMPv2 general query packets sent"
	log_test "Vlan 10 tagged IGMPv2 general query sent"

	RET=0
	vlmc_check_query mld 1 $swp1 1 1
	check_err $? "No vlan tagged MLD general query packets sent"
	log_test "Vlan 10 tagged MLD general query sent"
}

trap cleanup EXIT
trap cleanup EXIT


setup_prepare
setup_prepare