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

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
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
ALL_TESTS="vlmc_control_test"
ALL_TESTS="vlmc_control_test vlmc_querier_test"
NUM_NETIFS=4
CHECK_TC="yes"
TEST_GROUP="239.10.10.10"
......@@ -43,6 +43,9 @@ switch_create()
ip link set dev $swp1 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 $swp2 master
......@@ -138,6 +141,106 @@ vlmc_control_test()
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
setup_prepare
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment