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 <[email protected]>
Reviewed-by: Ido Schimmel <[email protected]>
Signed-off-by: Ujjal Roy <[email protected]>
---
 .../net/forwarding/bridge_vlan_mcast.sh       | 140 +++++++++++++++++-
 1 file changed, 132 insertions(+), 8 deletions(-)

diff --git a/tools/testing/selftests/net/forwarding/bridge_vlan_mcast.sh 
b/tools/testing/selftests/net/forwarding/bridge_vlan_mcast.sh
index e8031f68200a..07a377652a59 100755
--- a/tools/testing/selftests/net/forwarding/bridge_vlan_mcast.sh
+++ b/tools/testing/selftests/net/forwarding/bridge_vlan_mcast.sh
@@ -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"
+       # 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"
-       log_test "Vlan 10 mcast_query_response_interval option changed to 200"
+       # 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
 }
 
-- 
2.43.0


Reply via email to