Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/bash
0002 # SPDX-License-Identifier: GPL-2.0
0003 
0004 ALL_TESTS="mldv2include_test mldv2inc_allow_test mldv2inc_is_include_test mldv2inc_is_exclude_test \
0005            mldv2inc_to_exclude_test mldv2exc_allow_test mldv2exc_is_include_test \
0006            mldv2exc_is_exclude_test mldv2exc_to_exclude_test mldv2inc_block_test \
0007            mldv2exc_block_test mldv2exc_timeout_test mldv2star_ex_auto_add_test"
0008 NUM_NETIFS=4
0009 CHECK_TC="yes"
0010 TEST_GROUP="ff02::cc"
0011 TEST_GROUP_MAC="33:33:00:00:00:cc"
0012 
0013 # MLDv2 is_in report: grp ff02::cc is_include 2001:db8:1::1,2001:db8:1::2,2001:db8:1::3
0014 MZPKT_IS_INC="33:33:00:00:00:01:fe:54:00:04:5e:ba:86:dd:60:0a:2d:ae:00:54:00:01:fe:80:00:\
0015 00:00:00:00:00:fc:54:00:ff:fe:04:5e:ba:ff:02:00:00:00:00:00:00:00:00:00:00:00:00:00:01:3a:\
0016 00:05:02:00:00:00:00:8f:00:8e:d9:00:00:00:01:01:00:00:03:ff:02:00:00:00:00:00:00:00:00:00:\
0017 00:00:00:00:cc:20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:01:20:01:0d:b8:00:01:00:00:00:\
0018 00:00:00:00:00:00:02:20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:03"
0019 # MLDv2 is_in report: grp ff02::cc is_include 2001:db8:1::10,2001:db8:1::11,2001:db8:1::12
0020 MZPKT_IS_INC2="33:33:00:00:00:01:fe:54:00:04:5e:ba:86:dd:60:0a:2d:ae:00:54:00:01:fe:80:00:\
0021 00:00:00:00:00:fc:54:00:ff:fe:04:5e:ba:ff:02:00:00:00:00:00:00:00:00:00:00:00:00:00:01:3a:00:\
0022 05:02:00:00:00:00:8f:00:8e:ac:00:00:00:01:01:00:00:03:ff:02:00:00:00:00:00:00:00:00:00:00:00:\
0023 00:00:cc:20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:10:20:01:0d:b8:00:01:00:00:00:00:00:00:\
0024 00:00:00:11:20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:12"
0025 # MLDv2 is_in report: grp ff02::cc is_include 2001:db8:1::20,2001:db8:1::30
0026 MZPKT_IS_INC3="33:33:00:00:00:01:fe:54:00:04:5e:ba:86:dd:60:0a:2d:ae:00:44:00:01:fe:80:00:00:00:\
0027 00:00:00:fc:54:00:ff:fe:04:5e:ba:ff:02:00:00:00:00:00:00:00:00:00:00:00:00:00:01:3a:00:05:02:00:\
0028 00:00:00:8f:00:bc:5a:00:00:00:01:01:00:00:02:ff:02:00:00:00:00:00:00:00:00:00:00:00:00:00:cc:20:\
0029 01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:20:20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:30"
0030 # MLDv2 allow report: grp ff02::cc allow 2001:db8:1::10,2001:db8:1::11,2001:db8:1::12
0031 MZPKT_ALLOW="33:33:00:00:00:01:fe:54:00:04:5e:ba:86:dd:60:0a:2d:ae:00:54:00:01:fe:80:00:00:\
0032 00:00:00:00:fc:54:00:ff:fe:04:5e:ba:ff:02:00:00:00:00:00:00:00:00:00:00:00:00:00:01:3a:00:05:\
0033 02:00:00:00:00:8f:00:8a:ac:00:00:00:01:05:00:00:03:ff:02:00:00:00:00:00:00:00:00:00:00:00:00:\
0034 00:cc:20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:10:20:01:0d:b8:00:01:00:00:00:00:00:00:00:\
0035 00:00:11:20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:12"
0036 # MLDv2 allow report: grp ff02::cc allow 2001:db8:1::20,2001:db8:1::30
0037 MZPKT_ALLOW2="33:33:00:00:00:01:fe:54:00:04:5e:ba:86:dd:60:0a:2d:ae:00:44:00:01:fe:80:00:00:00:\
0038 00:00:00:fc:54:00:ff:fe:04:5e:ba:ff:02:00:00:00:00:00:00:00:00:00:00:00:00:00:01:3a:00:05:02:00:\
0039 00:00:00:8f:00:b8:5a:00:00:00:01:05:00:00:02:ff:02:00:00:00:00:00:00:00:00:00:00:00:00:00:cc:20:\
0040 01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:20:20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:30"
0041 # MLDv2 is_ex report: grp ff02::cc is_exclude 2001:db8:1::1,2001:db8:1::2,2001:db8:1::20,2001:db8:1::21
0042 MZPKT_IS_EXC="33:33:00:00:00:01:fe:54:00:04:5e:ba:86:dd:60:0a:2d:ae:00:64:00:01:fe:80:00:00:00:\
0043 00:00:00:fc:54:00:ff:fe:04:5e:ba:ff:02:00:00:00:00:00:00:00:00:00:00:00:00:00:01:3a:00:05:02:00:\
0044 00:00:00:8f:00:5f:d0:00:00:00:01:02:00:00:04:ff:02:00:00:00:00:00:00:00:00:00:00:00:00:00:cc:20:\
0045 01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:01:20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:02:20:\
0046 01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:20:20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:21"
0047 # MLDv2 is_ex report: grp ff02::cc is_exclude 2001:db8:1::20,2001:db8:1::30
0048 MZPKT_IS_EXC2="33:33:00:00:00:01:fe:54:00:04:5e:ba:86:dd:60:0a:2d:ae:00:44:00:01:fe:80:00:00:00:\
0049 00:00:00:fc:54:00:ff:fe:04:5e:ba:ff:02:00:00:00:00:00:00:00:00:00:00:00:00:00:01:3a:00:05:02:00:\
0050 00:00:00:8f:00:bb:5a:00:00:00:01:02:00:00:02:ff:02:00:00:00:00:00:00:00:00:00:00:00:00:00:cc:20:\
0051 01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:20:20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:30"
0052 # MLDv2 to_ex report: grp ff02::cc to_exclude 2001:db8:1::1,2001:db8:1::20,2001:db8:1::30
0053 MZPKT_TO_EXC="33:33:00:00:00:01:fe:54:00:04:5e:ba:86:dd:60:0a:2d:ae:00:54:00:01:fe:80:00:00:00:\
0054 00:00:00:fc:54:00:ff:fe:04:5e:ba:ff:02:00:00:00:00:00:00:00:00:00:00:00:00:00:01:3a:00:05:02:00:\
0055 00:00:00:8f:00:8b:8e:00:00:00:01:04:00:00:03:ff:02:00:00:00:00:00:00:00:00:00:00:00:00:00:cc:20:\
0056 01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:01:20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:20:20:\
0057 01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:30"
0058 # MLDv2 block report: grp ff02::cc block 2001:db8:1::1,2001:db8:1::20,2001:db8:1::30
0059 MZPKT_BLOCK="33:33:00:00:00:01:fe:54:00:04:5e:ba:86:dd:60:0a:2d:ae:00:54:00:01:fe:80:00:00:00:00:\
0060 00:00:fc:54:00:ff:fe:04:5e:ba:ff:02:00:00:00:00:00:00:00:00:00:00:00:00:00:01:3a:00:05:02:00:00:\
0061 00:00:8f:00:89:8e:00:00:00:01:06:00:00:03:ff:02:00:00:00:00:00:00:00:00:00:00:00:00:00:cc:20:01:\
0062 0d:b8:00:01:00:00:00:00:00:00:00:00:00:01:20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:20:20:01:\
0063 0d:b8:00:01:00:00:00:00:00:00:00:00:00:30"
0064 
0065 source lib.sh
0066 
0067 h1_create()
0068 {
0069         simple_if_init $h1 2001:db8:1::1/64
0070 }
0071 
0072 h1_destroy()
0073 {
0074         simple_if_fini $h1 2001:db8:1::1/64
0075 }
0076 
0077 h2_create()
0078 {
0079         simple_if_init $h2 2001:db8:1::2/64
0080 }
0081 
0082 h2_destroy()
0083 {
0084         simple_if_fini $h2 2001:db8:1::2/64
0085 }
0086 
0087 switch_create()
0088 {
0089         ip link add dev br0 type bridge mcast_snooping 1 mcast_query_response_interval 100 \
0090                                         mcast_mld_version 2 mcast_startup_query_interval 300 \
0091                                         mcast_querier 1
0092 
0093         ip link set dev $swp1 master br0
0094         ip link set dev $swp2 master br0
0095 
0096         ip link set dev br0 up
0097         ip link set dev $swp1 up
0098         ip link set dev $swp2 up
0099 
0100         # make sure a query has been generated
0101         sleep 5
0102 }
0103 
0104 switch_destroy()
0105 {
0106         ip link set dev $swp2 down
0107         ip link set dev $swp1 down
0108 
0109         ip link del dev br0
0110 }
0111 
0112 setup_prepare()
0113 {
0114         h1=${NETIFS[p1]}
0115         swp1=${NETIFS[p2]}
0116 
0117         swp2=${NETIFS[p3]}
0118         h2=${NETIFS[p4]}
0119 
0120         vrf_prepare
0121 
0122         h1_create
0123         h2_create
0124 
0125         switch_create
0126 }
0127 
0128 cleanup()
0129 {
0130         pre_cleanup
0131 
0132         switch_destroy
0133 
0134         h2_destroy
0135         h1_destroy
0136 
0137         vrf_cleanup
0138 }
0139 
0140 mldv2include_prepare()
0141 {
0142         local host1_if=$1
0143         local X=("2001:db8:1::1" "2001:db8:1::2" "2001:db8:1::3")
0144 
0145         ip link set dev br0 type bridge mcast_mld_version 2
0146         check_err $? "Could not change bridge MLD version to 2"
0147 
0148         $MZ $host1_if $MZPKT_IS_INC -q
0149         sleep 1
0150         bridge -j -d -s mdb show dev br0 \
0151                 | jq -e ".[].mdb[] | \
0152                          select(.grp == \"$TEST_GROUP\" and .source_list != null)" &>/dev/null
0153         check_err $? "Missing *,G entry with source list"
0154         bridge -j -d -s mdb show dev br0 \
0155                 | jq -e ".[].mdb[] | \
0156                          select(.grp == \"$TEST_GROUP\" and \
0157                                 .source_list != null and .filter_mode == \"include\")" &>/dev/null
0158         check_err $? "Wrong *,G entry filter mode"
0159         brmcast_check_sg_entries "is_include" "${X[@]}"
0160 }
0161 
0162 mldv2exclude_prepare()
0163 {
0164         local host1_if=$1
0165         local mac=$2
0166         local group=$3
0167         local pkt=$4
0168         local X=("2001:db8:1::1" "2001:db8:1::2")
0169         local Y=("2001:db8:1::20" "2001:db8:1::21")
0170 
0171         mldv2include_prepare $h1
0172 
0173         $MZ $host1_if -c 1 $MZPKT_IS_EXC -q
0174         sleep 1
0175         bridge -j -d -s mdb show dev br0 \
0176                 | jq -e ".[].mdb[] | \
0177                          select(.grp == \"$TEST_GROUP\" and \
0178                          .source_list != null and .filter_mode == \"exclude\")" &>/dev/null
0179         check_err $? "Wrong *,G entry filter mode"
0180 
0181         brmcast_check_sg_entries "is_exclude" "${X[@]}" "${Y[@]}"
0182 
0183         brmcast_check_sg_state 0 "${X[@]}"
0184         brmcast_check_sg_state 1 "${Y[@]}"
0185 
0186         bridge -j -d -s mdb show dev br0 \
0187                 | jq -e ".[].mdb[] | \
0188                          select(.grp == \"$TEST_GROUP\" and \
0189                                 .source_list != null and
0190                                 .source_list[].address == \"2001:db8:1::3\")" &>/dev/null
0191         check_fail $? "Wrong *,G entry source list, 2001:db8:1::3 entry still exists"
0192 }
0193 
0194 mldv2cleanup()
0195 {
0196         local port=$1
0197 
0198         bridge mdb del dev br0 port $port grp $TEST_GROUP
0199         ip link set dev br0 type bridge mcast_mld_version 1
0200 }
0201 
0202 mldv2include_test()
0203 {
0204         RET=0
0205         local X=("2001:db8:1::1" "2001:db8:1::2" "2001:db8:1::3")
0206 
0207         mldv2include_prepare $h1
0208 
0209         brmcast_check_sg_state 0 "${X[@]}"
0210 
0211         brmcast_check_sg_fwding 1 "${X[@]}"
0212         brmcast_check_sg_fwding 0 "2001:db8:1::100"
0213 
0214         log_test "MLDv2 report $TEST_GROUP is_include"
0215 
0216         mldv2cleanup $swp1
0217 }
0218 
0219 mldv2inc_allow_test()
0220 {
0221         RET=0
0222         local X=("2001:db8:1::10" "2001:db8:1::11" "2001:db8:1::12")
0223 
0224         mldv2include_prepare $h1
0225 
0226         $MZ $h1 -c 1 $MZPKT_ALLOW -q
0227         sleep 1
0228         brmcast_check_sg_entries "allow" "${X[@]}"
0229 
0230         brmcast_check_sg_state 0 "${X[@]}"
0231 
0232         brmcast_check_sg_fwding 1 "${X[@]}"
0233         brmcast_check_sg_fwding 0 "2001:db8:1::100"
0234 
0235         log_test "MLDv2 report $TEST_GROUP include -> allow"
0236 
0237         mldv2cleanup $swp1
0238 }
0239 
0240 mldv2inc_is_include_test()
0241 {
0242         RET=0
0243         local X=("2001:db8:1::10" "2001:db8:1::11" "2001:db8:1::12")
0244 
0245         mldv2include_prepare $h1
0246 
0247         $MZ $h1 -c 1 $MZPKT_IS_INC2 -q
0248         sleep 1
0249         brmcast_check_sg_entries "is_include" "${X[@]}"
0250 
0251         brmcast_check_sg_state 0 "${X[@]}"
0252 
0253         brmcast_check_sg_fwding 1 "${X[@]}"
0254         brmcast_check_sg_fwding 0 "2001:db8:1::100"
0255 
0256         log_test "MLDv2 report $TEST_GROUP include -> is_include"
0257 
0258         mldv2cleanup $swp1
0259 }
0260 
0261 mldv2inc_is_exclude_test()
0262 {
0263         RET=0
0264 
0265         mldv2exclude_prepare $h1
0266 
0267         brmcast_check_sg_fwding 1 "${X[@]}" 2001:db8:1::100
0268         brmcast_check_sg_fwding 0 "${Y[@]}"
0269 
0270         log_test "MLDv2 report $TEST_GROUP include -> is_exclude"
0271 
0272         mldv2cleanup $swp1
0273 }
0274 
0275 mldv2inc_to_exclude_test()
0276 {
0277         RET=0
0278         local X=("2001:db8:1::1")
0279         local Y=("2001:db8:1::20" "2001:db8:1::30")
0280 
0281         mldv2include_prepare $h1
0282 
0283         ip link set dev br0 type bridge mcast_last_member_interval 500
0284         check_err $? "Could not change mcast_last_member_interval to 5s"
0285 
0286         $MZ $h1 -c 1 $MZPKT_TO_EXC -q
0287         sleep 1
0288         bridge -j -d -s mdb show dev br0 \
0289                 | jq -e ".[].mdb[] | \
0290                          select(.grp == \"$TEST_GROUP\" and \
0291                                 .source_list != null and .filter_mode == \"exclude\")" &>/dev/null
0292         check_err $? "Wrong *,G entry filter mode"
0293 
0294         brmcast_check_sg_entries "to_exclude" "${X[@]}" "${Y[@]}"
0295 
0296         brmcast_check_sg_state 0 "${X[@]}"
0297         brmcast_check_sg_state 1 "${Y[@]}"
0298 
0299         bridge -j -d -s mdb show dev br0 \
0300                 | jq -e ".[].mdb[] | \
0301                          select(.grp == \"$TEST_GROUP\" and \
0302                                 .source_list != null and
0303                                 .source_list[].address == \"2001:db8:1::2\")" &>/dev/null
0304         check_fail $? "Wrong *,G entry source list, 2001:db8:1::2 entry still exists"
0305         bridge -j -d -s mdb show dev br0 \
0306                 | jq -e ".[].mdb[] | \
0307                          select(.grp == \"$TEST_GROUP\" and \
0308                                 .source_list != null and
0309                                 .source_list[].address == \"2001:db8:1::21\")" &>/dev/null
0310         check_fail $? "Wrong *,G entry source list, 2001:db8:1::21 entry still exists"
0311 
0312         brmcast_check_sg_fwding 1 "${X[@]}" 2001:db8:1::100
0313         brmcast_check_sg_fwding 0 "${Y[@]}"
0314 
0315         log_test "MLDv2 report $TEST_GROUP include -> to_exclude"
0316 
0317         ip link set dev br0 type bridge mcast_last_member_interval 100
0318 
0319         mldv2cleanup $swp1
0320 }
0321 
0322 mldv2exc_allow_test()
0323 {
0324         RET=0
0325         local X=("2001:db8:1::1" "2001:db8:1::2" "2001:db8:1::20" "2001:db8:1::30")
0326         local Y=("2001:db8:1::21")
0327 
0328         mldv2exclude_prepare $h1
0329 
0330         $MZ $h1 -c 1 $MZPKT_ALLOW2 -q
0331         sleep 1
0332         brmcast_check_sg_entries "allow" "${X[@]}" "${Y[@]}"
0333 
0334         brmcast_check_sg_state 0 "${X[@]}"
0335         brmcast_check_sg_state 1 "${Y[@]}"
0336 
0337         brmcast_check_sg_fwding 1 "${X[@]}" 2001:db8:1::100
0338         brmcast_check_sg_fwding 0 "${Y[@]}"
0339 
0340         log_test "MLDv2 report $TEST_GROUP exclude -> allow"
0341 
0342         mldv2cleanup $swp1
0343 }
0344 
0345 mldv2exc_is_include_test()
0346 {
0347         RET=0
0348         local X=("2001:db8:1::1" "2001:db8:1::2" "2001:db8:1::20" "2001:db8:1::30")
0349         local Y=("2001:db8:1::21")
0350 
0351         mldv2exclude_prepare $h1
0352 
0353         $MZ $h1 -c 1 $MZPKT_IS_INC3 -q
0354         sleep 1
0355         brmcast_check_sg_entries "is_include" "${X[@]}" "${Y[@]}"
0356 
0357         brmcast_check_sg_state 0 "${X[@]}"
0358         brmcast_check_sg_state 1 "${Y[@]}"
0359 
0360         brmcast_check_sg_fwding 1 "${X[@]}" 2001:db8:1::100
0361         brmcast_check_sg_fwding 0 "${Y[@]}"
0362 
0363         log_test "MLDv2 report $TEST_GROUP exclude -> is_include"
0364 
0365         mldv2cleanup $swp1
0366 }
0367 
0368 mldv2exc_is_exclude_test()
0369 {
0370         RET=0
0371         local X=("2001:db8:1::30")
0372         local Y=("2001:db8:1::20")
0373 
0374         mldv2exclude_prepare $h1
0375 
0376         $MZ $h1 -c 1 $MZPKT_IS_EXC2 -q
0377         sleep 1
0378         brmcast_check_sg_entries "is_exclude" "${X[@]}" "${Y[@]}"
0379 
0380         brmcast_check_sg_state 0 "${X[@]}"
0381         brmcast_check_sg_state 1 "${Y[@]}"
0382 
0383         brmcast_check_sg_fwding 1 "${X[@]}" 2001:db8:1::100
0384         brmcast_check_sg_fwding 0 "${Y[@]}"
0385 
0386         log_test "MLDv2 report $TEST_GROUP exclude -> is_exclude"
0387 
0388         mldv2cleanup $swp1
0389 }
0390 
0391 mldv2exc_to_exclude_test()
0392 {
0393         RET=0
0394         local X=("2001:db8:1::1" "2001:db8:1::30")
0395         local Y=("2001:db8:1::20")
0396 
0397         mldv2exclude_prepare $h1
0398 
0399         ip link set dev br0 type bridge mcast_last_member_interval 500
0400         check_err $? "Could not change mcast_last_member_interval to 5s"
0401 
0402         $MZ $h1 -c 1 $MZPKT_TO_EXC -q
0403         sleep 1
0404         brmcast_check_sg_entries "to_exclude" "${X[@]}" "${Y[@]}"
0405 
0406         brmcast_check_sg_state 0 "${X[@]}"
0407         brmcast_check_sg_state 1 "${Y[@]}"
0408 
0409         brmcast_check_sg_fwding 1 "${X[@]}" 2001:db8:1::100
0410         brmcast_check_sg_fwding 0 "${Y[@]}"
0411 
0412         log_test "MLDv2 report $TEST_GROUP exclude -> to_exclude"
0413 
0414         ip link set dev br0 type bridge mcast_last_member_interval 100
0415 
0416         mldv2cleanup $swp1
0417 }
0418 
0419 mldv2inc_block_test()
0420 {
0421         RET=0
0422         local X=("2001:db8:1::2" "2001:db8:1::3")
0423 
0424         mldv2include_prepare $h1
0425 
0426         $MZ $h1 -c 1 $MZPKT_BLOCK -q
0427         # make sure the lowered timers have expired (by default 2 seconds)
0428         sleep 3
0429         brmcast_check_sg_entries "block" "${X[@]}"
0430 
0431         brmcast_check_sg_state 0 "${X[@]}"
0432 
0433         bridge -j -d -s mdb show dev br0 \
0434                 | jq -e ".[].mdb[] | \
0435                          select(.grp == \"$TEST_GROUP\" and \
0436                                 .source_list != null and
0437                                 .source_list[].address == \"2001:db8:1::1\")" &>/dev/null
0438         check_fail $? "Wrong *,G entry source list, 2001:db8:1::1 entry still exists"
0439 
0440         brmcast_check_sg_fwding 1 "${X[@]}"
0441         brmcast_check_sg_fwding 0 2001:db8:1::100
0442 
0443         log_test "MLDv2 report $TEST_GROUP include -> block"
0444 
0445         mldv2cleanup $swp1
0446 }
0447 
0448 mldv2exc_block_test()
0449 {
0450         RET=0
0451         local X=("2001:db8:1::1" "2001:db8:1::2" "2001:db8:1::30")
0452         local Y=("2001:db8:1::20" "2001:db8:1::21")
0453 
0454         mldv2exclude_prepare $h1
0455 
0456         ip link set dev br0 type bridge mcast_last_member_interval 500
0457         check_err $? "Could not change mcast_last_member_interval to 5s"
0458 
0459         $MZ $h1 -c 1 $MZPKT_BLOCK -q
0460         sleep 1
0461         brmcast_check_sg_entries "block" "${X[@]}" "${Y[@]}"
0462 
0463         brmcast_check_sg_state 0 "${X[@]}"
0464         brmcast_check_sg_state 1 "${Y[@]}"
0465 
0466         brmcast_check_sg_fwding 1 "${X[@]}" 2001:db8:1::100
0467         brmcast_check_sg_fwding 0 "${Y[@]}"
0468 
0469         log_test "MLDv2 report $TEST_GROUP exclude -> block"
0470 
0471         ip link set dev br0 type bridge mcast_last_member_interval 100
0472 
0473         mldv2cleanup $swp1
0474 }
0475 
0476 mldv2exc_timeout_test()
0477 {
0478         RET=0
0479         local X=("2001:db8:1::20" "2001:db8:1::30")
0480 
0481         # GMI should be 3 seconds
0482         ip link set dev br0 type bridge mcast_query_interval 100 \
0483                                         mcast_query_response_interval 100 \
0484                                         mcast_membership_interval 300
0485 
0486         mldv2exclude_prepare $h1
0487         ip link set dev br0 type bridge mcast_query_interval 500 \
0488                                         mcast_query_response_interval 500 \
0489                                         mcast_membership_interval 1500
0490 
0491         $MZ $h1 -c 1 $MZPKT_ALLOW2 -q
0492         sleep 3
0493         bridge -j -d -s mdb show dev br0 \
0494                 | jq -e ".[].mdb[] | \
0495                          select(.grp == \"$TEST_GROUP\" and \
0496                                 .source_list != null and .filter_mode == \"include\")" &>/dev/null
0497         check_err $? "Wrong *,G entry filter mode"
0498 
0499         bridge -j -d -s mdb show dev br0 \
0500                 | jq -e ".[].mdb[] | \
0501                          select(.grp == \"$TEST_GROUP\" and \
0502                                 .source_list != null and
0503                                 .source_list[].address == \"2001:db8:1::1\")" &>/dev/null
0504         check_fail $? "Wrong *,G entry source list, 2001:db8:1::1 entry still exists"
0505         bridge -j -d -s mdb show dev br0 \
0506                 | jq -e ".[].mdb[] | \
0507                          select(.grp == \"$TEST_GROUP\" and \
0508                                 .source_list != null and
0509                                 .source_list[].address == \"2001:db8:1::2\")" &>/dev/null
0510         check_fail $? "Wrong *,G entry source list, 2001:db8:1::2 entry still exists"
0511 
0512         brmcast_check_sg_entries "allow" "${X[@]}"
0513 
0514         brmcast_check_sg_state 0 "${X[@]}"
0515 
0516         brmcast_check_sg_fwding 1 "${X[@]}"
0517         brmcast_check_sg_fwding 0 2001:db8:1::100
0518 
0519         log_test "MLDv2 group $TEST_GROUP exclude timeout"
0520 
0521         ip link set dev br0 type bridge mcast_query_interval 12500 \
0522                                         mcast_query_response_interval 1000 \
0523                                         mcast_membership_interval 26000
0524 
0525         mldv2cleanup $swp1
0526 }
0527 
0528 mldv2star_ex_auto_add_test()
0529 {
0530         RET=0
0531 
0532         mldv2exclude_prepare $h1
0533 
0534         $MZ $h2 -c 1 $MZPKT_IS_INC -q
0535         sleep 1
0536         bridge -j -d -s mdb show dev br0 \
0537                 | jq -e ".[].mdb[] | \
0538                          select(.grp == \"$TEST_GROUP\" and .src == \"2001:db8:1::3\" and \
0539                                 .port == \"$swp1\")" &>/dev/null
0540         check_err $? "S,G entry for *,G port doesn't exist"
0541 
0542         bridge -j -d -s mdb show dev br0 \
0543                 | jq -e ".[].mdb[] | \
0544                          select(.grp == \"$TEST_GROUP\" and .src == \"2001:db8:1::3\" and \
0545                                 .port == \"$swp1\" and \
0546                                 .flags[] == \"added_by_star_ex\")" &>/dev/null
0547         check_err $? "Auto-added S,G entry doesn't have added_by_star_ex flag"
0548 
0549         brmcast_check_sg_fwding 1 2001:db8:1::3
0550 
0551         log_test "MLDv2 S,G port entry automatic add to a *,G port"
0552 
0553         mldv2cleanup $swp1
0554         mldv2cleanup $swp2
0555 }
0556 
0557 trap cleanup EXIT
0558 
0559 setup_prepare
0560 setup_wait
0561 
0562 tests_run
0563 
0564 exit $EXIT_STATUS