0001
0002
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
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
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
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
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
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
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
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
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
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
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
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
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