mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-22 03:27:30 -04:00
selftests: net: bridge: add MRC and QQIC field encoding tests
Enhance vlmc_query_intvl_test and vlmc_query_response_intvl_test in bridge_vlan_mcast.sh to validate IGMPv3/MLDv2 protocol compliance for MRC and QQIC field encoding across both linear and exponential ranges. TEST: Vlan multicast snooping enable [ OK ] TEST: Vlan mcast_query_interval global option default value [ OK ] TEST: Number of tagged IGMPv2 general query [ OK ] TEST: IGMPv3 QQIC linear value 60(s) [ OK ] TEST: MLDv2 QQIC linear value 60(s) [ OK ] TEST: IGMPv3 QQIC non linear value 160(s) [ OK ] TEST: MLDv2 QQIC non linear value 160(s) [ OK ] TEST: Vlan mcast_query_response_interval global option default value [ OK ] TEST: IGMPv3 MRC linear value of 60(x0.1s) [ OK ] TEST: MLDv2 MRC linear value of 24000(ms) [ OK ] TEST: IGMPv3 MRC non linear value of 240(x0.1s) [ OK ] TEST: MLDv2 MRC non linear value of 48000(ms) [ OK ] Reviewed-by: Nikolay Aleksandrov <razor@blackwall.org> Reviewed-by: Ido Schimmel <idosch@nvidia.com> Signed-off-by: Ujjal Roy <royujjal@gmail.com> Link: https://patch.msgid.link/20260502131907.987-6-royujjal@gmail.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
e51560f422
commit
529dbe762d
@@ -162,14 +162,27 @@ vlmc_query_cnt_setup()
|
||||
{
|
||||
local type=$1
|
||||
local dev=$2
|
||||
local match=($3)
|
||||
|
||||
if [[ $type == "igmp" ]]; then
|
||||
tc filter add dev $dev egress pref 10 prot 802.1Q \
|
||||
# This matches: IP Protocol 2 (IGMP)
|
||||
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 goto chain 1
|
||||
# AND Type 0x11 (Query) at offset 0 of IGMP header
|
||||
# 20 bytes IPv4 header + 4 bytes Router Alert option + IGMP[offset 0]
|
||||
tc filter add dev "$dev" egress pref 20 chain 1 prot 802.1Q u32 \
|
||||
match u8 0x11 0xff at 24 "${match[@]}" \
|
||||
action pass
|
||||
else
|
||||
tc filter add dev $dev egress pref 10 prot 802.1Q \
|
||||
# This matches: ICMPv6
|
||||
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 goto chain 1
|
||||
# AND Type 0x82 (Query) at offset 0 of MLD header
|
||||
# 40 bytes IPv6 header + 8 bytes Hop-by-hop option + MLD[offset 0]
|
||||
tc filter add dev "$dev" egress pref 20 chain 1 prot 802.1Q u32 \
|
||||
match u8 0x82 0xff at 48 "${match[@]}" \
|
||||
action pass
|
||||
fi
|
||||
|
||||
@@ -181,7 +194,39 @@ 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
|
||||
tc filter del dev "$dev" egress pref 20 chain 1
|
||||
tc filter del dev "$dev" egress pref 10
|
||||
}
|
||||
|
||||
vlmc_query_get_intvl_match()
|
||||
{
|
||||
local type=$1
|
||||
local version=$2
|
||||
local test=$3
|
||||
local enc_val=$4
|
||||
|
||||
if [ "$test" = "qqic" ]; then
|
||||
# QQIC is 8-bit floating point encoding for IGMPv3 and MLDv2
|
||||
if [ "${type}v${version}" = "igmpv3" ]; then
|
||||
# QQIC is at offset 9 of IGMP header
|
||||
# 20 bytes IPv4 header + 4 bytes Router Alert option + IGMP[offset 9]
|
||||
echo "match u8 $enc_val 0xff at 33"
|
||||
elif [ "${type}v${version}" = "mldv2" ]; then
|
||||
# QQIC is at offset 25 of MLD header
|
||||
# 40 bytes IPv6 header + 8 bytes Hop-by-hop option + MLD[offset 25]
|
||||
echo "match u8 $enc_val 0xff at 73"
|
||||
fi
|
||||
elif [ "$test" = "mrc" ]; then
|
||||
if [ "${type}v${version}" = "igmpv3" ]; then
|
||||
# MRC is 8-bit floating point encoding at offset 1 of IGMP header
|
||||
# 20 bytes IPv4 header + 4 bytes Router Alert option + IGMP[offset 1]
|
||||
echo "match u8 $enc_val 0xff at 25"
|
||||
elif [ "${type}v${version}" = "mldv2" ]; then
|
||||
# MRC is 16-bit floating point encoding at offset 4 of MLD header
|
||||
# 40 bytes IPv6 header + 8 bytes Hop-by-hop option + MLD[offset 4]
|
||||
echo "match u16 $enc_val 0xffff at 52"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
vlmc_check_query()
|
||||
@@ -191,9 +236,13 @@ vlmc_check_query()
|
||||
local dev=$3
|
||||
local expect=$4
|
||||
local time=$5
|
||||
local test=$6
|
||||
local enc_val=$7
|
||||
local intvl_match=""
|
||||
local ret=0
|
||||
|
||||
vlmc_query_cnt_setup $type $dev
|
||||
intvl_match="$(vlmc_query_get_intvl_match "$type" "$version" "$test" "$enc_val")"
|
||||
vlmc_query_cnt_setup "$type" "$dev" "$intvl_match"
|
||||
|
||||
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
|
||||
@@ -201,7 +250,7 @@ vlmc_check_query()
|
||||
if [[ $ret -eq 0 ]]; then
|
||||
sleep $time
|
||||
|
||||
local tcstats=$(tc_rule_stats_get $dev 10 egress)
|
||||
local tcstats=$(tc_rule_stats_get "$dev" 20 egress)
|
||||
local post_tx_xstats=$(vlmc_query_cnt_xstats $type $version $dev)
|
||||
|
||||
if [[ $tcstats != $expect || \
|
||||
@@ -448,8 +497,46 @@ vlmc_query_intvl_test()
|
||||
# 1 is sent immediately, then 2 more in the next 5 seconds
|
||||
vlmc_check_query igmp 2 $swp1 3 5
|
||||
check_err $? "Wrong number of tagged IGMPv2 general queries sent"
|
||||
log_test "Vlan 10 mcast_query_interval option changed to 200"
|
||||
log_test "Number of tagged IGMPv2 general query"
|
||||
|
||||
RET=0
|
||||
bridge vlan global set vid 10 dev br0 mcast_snooping 1 mcast_igmp_version 3
|
||||
check_err $? "Could not set mcast_igmp_version in vlan 10"
|
||||
bridge vlan global set vid 10 dev br0 mcast_snooping 1 mcast_mld_version 2
|
||||
check_err $? "Could not set mcast_mld_version in vlan 10"
|
||||
bridge vlan global set vid 10 dev br0 mcast_snooping 1 mcast_query_interval 6000
|
||||
check_err $? "Could not set mcast_query_interval in vlan 10"
|
||||
# 1 is sent immediately, IGMPv3 QQIC should match with linear value 60 (0x3c)
|
||||
# which is 8-bit encoded value of 60 [units of seconds]
|
||||
vlmc_check_query igmp 3 $swp1 1 1 qqic 0x3c
|
||||
check_err $? "Wrong QQIC in generated IGMPv3 general queries"
|
||||
log_test "IGMPv3 QQIC linear value 60(s)"
|
||||
|
||||
RET=0
|
||||
# 1 is sent immediately, MLDv2 QQIC should match with linear value 60 (0x3c)
|
||||
# which is 8-bit encoded value of 60 [units of seconds]
|
||||
vlmc_check_query mld 2 $swp1 1 1 qqic 0x3c
|
||||
check_err $? "Wrong QQIC in generated MLDv2 general queries"
|
||||
log_test "MLDv2 QQIC linear value 60(s)"
|
||||
|
||||
RET=0
|
||||
bridge vlan global set vid 10 dev br0 mcast_snooping 1 mcast_query_interval 16000
|
||||
check_err $? "Could not set mcast_query_interval in vlan 10"
|
||||
# 1 is sent immediately, IGMPv3 QQIC should match with non linear value 132 (0x84)
|
||||
# which is 8-bit encoded value of 160 [units of seconds]
|
||||
vlmc_check_query igmp 3 $swp1 1 1 qqic 0x84
|
||||
check_err $? "Wrong QQIC in generated IGMPv3 general queries"
|
||||
log_test "IGMPv3 QQIC non linear value 160(s)"
|
||||
|
||||
RET=0
|
||||
# 1 is sent immediately, MLDv2 QQIC should match with non linear value 132 (0x84)
|
||||
# which is 8-bit encoded value of 160 [units of seconds]
|
||||
vlmc_check_query mld 2 $swp1 1 1 qqic 0x84
|
||||
check_err $? "Wrong QQIC in generated MLDv2 general queries"
|
||||
log_test "MLDv2 QQIC non linear value 160(s)"
|
||||
|
||||
bridge vlan global set vid 10 dev br0 mcast_snooping 1 mcast_igmp_version 2
|
||||
bridge vlan global set vid 10 dev br0 mcast_snooping 1 mcast_mld_version 1
|
||||
bridge vlan global set vid 10 dev br0 mcast_snooping 1 mcast_startup_query_count 2
|
||||
bridge vlan global set vid 10 dev br0 mcast_snooping 1 mcast_query_interval 12500
|
||||
}
|
||||
@@ -469,10 +556,47 @@ vlmc_query_response_intvl_test()
|
||||
log_test "Vlan mcast_query_response_interval global option default value"
|
||||
|
||||
RET=0
|
||||
bridge vlan global set vid 10 dev br0 mcast_snooping 1 mcast_query_response_interval 200
|
||||
bridge vlan global set vid 10 dev br0 mcast_snooping 1 mcast_startup_query_count 0
|
||||
bridge vlan global set vid 10 dev br0 mcast_snooping 1 mcast_igmp_version 3
|
||||
check_err $? "Could not set mcast_igmp_version in vlan 10"
|
||||
bridge vlan global set vid 10 dev br0 mcast_snooping 1 mcast_mld_version 2
|
||||
check_err $? "Could not set mcast_mld_version in vlan 10"
|
||||
bridge vlan global set vid 10 dev br0 mcast_snooping 1 mcast_query_response_interval 600
|
||||
check_err $? "Could not set mcast_query_response_interval in vlan 10"
|
||||
log_test "Vlan 10 mcast_query_response_interval option changed to 200"
|
||||
# 1 is sent immediately, IGMPv3 MRC should match with linear value 60 (0x3c)
|
||||
# which is 8-bit encoded value of 60 [units of 0.1s = 6 seconds]
|
||||
vlmc_check_query igmp 3 $swp1 1 1 mrc 0x3c
|
||||
check_err $? "Wrong MRC in generated IGMPv3 general queries"
|
||||
log_test "IGMPv3 MRC linear value of 60(x0.1s)"
|
||||
|
||||
RET=0
|
||||
bridge vlan global set vid 10 dev br0 mcast_snooping 1 mcast_query_response_interval 2400
|
||||
check_err $? "Could not set mcast_query_response_interval in vlan 10"
|
||||
# 1 is sent immediately, MLDv2 MRC should match with linear value 0x5dc0 (24000)
|
||||
# which is 16-bit encoded value of 24000 [units of ms / 24 seconds]
|
||||
vlmc_check_query mld 2 $swp1 1 1 mrc 0x5dc0
|
||||
check_err $? "Wrong MRC in generated MLDv2 general queries"
|
||||
log_test "MLDv2 MRC linear value of 24000(ms)"
|
||||
|
||||
RET=0
|
||||
# 1 is sent immediately, IGMPv3 MRC should match with non linear value 142 (0x8e)
|
||||
# which is 8-bit encoded value of 240 [units of 0.1s = 24 seconds]
|
||||
vlmc_check_query igmp 3 $swp1 1 1 mrc 0x8e
|
||||
check_err $? "Wrong MRC in generated IGMPv3 general queries"
|
||||
log_test "IGMPv3 MRC non linear value of 240(x0.1s)"
|
||||
|
||||
RET=0
|
||||
bridge vlan global set vid 10 dev br0 mcast_snooping 1 mcast_query_response_interval 4800
|
||||
check_err $? "Could not set mcast_query_response_interval in vlan 10"
|
||||
# 1 is sent immediately, MLDv2 MRC should match with non linear value 0x8770 (34672)
|
||||
# which is 16-bit encoded value of 48000 [units of ms / 48 seconds]
|
||||
vlmc_check_query mld 2 $swp1 1 1 mrc 0x8770
|
||||
check_err $? "Wrong MRC in generated MLDv2 general queries"
|
||||
log_test "MLDv2 MRC non linear value of 48000(ms)"
|
||||
|
||||
bridge vlan global set vid 10 dev br0 mcast_snooping 1 mcast_igmp_version 2
|
||||
bridge vlan global set vid 10 dev br0 mcast_snooping 1 mcast_mld_version 1
|
||||
bridge vlan global set vid 10 dev br0 mcast_snooping 1 mcast_startup_query_count 2
|
||||
bridge vlan global set vid 10 dev br0 mcast_snooping 1 mcast_query_response_interval 1000
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user