1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3 4ALL_TESTS=" 5 v2reportleave_test 6 v3include_test 7 v3inc_allow_test 8 v3inc_is_include_test 9 v3inc_is_exclude_test 10 v3inc_to_exclude_test 11 v3exc_allow_test 12 v3exc_is_include_test 13 v3exc_is_exclude_test 14 v3exc_to_exclude_test 15 v3inc_block_test 16 v3exc_block_test 17 v3exc_timeout_test 18 v3star_ex_auto_add_test 19 v2per_vlan_snooping_port_stp_test 20 v2per_vlan_snooping_vlan_stp_test 21" 22NUM_NETIFS=4 23CHECK_TC="yes" 24TEST_GROUP="239.10.10.10" 25TEST_GROUP_MAC="01:00:5e:0a:0a:0a" 26 27ALL_GROUP="224.0.0.1" 28ALL_MAC="01:00:5e:00:00:01" 29 30# IGMPv3 is_in report: grp 239.10.10.10 is_include 192.0.2.1,192.0.2.2,192.0.2.3 31MZPKT_IS_INC="22:00:9d:de:00:00:00:01:01:00:00:03:ef:0a:0a:0a:c0:00:02:01:c0:00:02:02:c0:00:02:03" 32# IGMPv3 is_in report: grp 239.10.10.10 is_include 192.0.2.10,192.0.2.11,192.0.2.12 33MZPKT_IS_INC2="22:00:9d:c3:00:00:00:01:01:00:00:03:ef:0a:0a:0a:c0:00:02:0a:c0:00:02:0b:c0:00:02:0c" 34# IGMPv3 is_in report: grp 239.10.10.10 is_include 192.0.2.20,192.0.2.30 35MZPKT_IS_INC3="22:00:5f:b4:00:00:00:01:01:00:00:02:ef:0a:0a:0a:c0:00:02:14:c0:00:02:1e" 36# IGMPv3 allow report: grp 239.10.10.10 allow 192.0.2.10,192.0.2.11,192.0.2.12 37MZPKT_ALLOW="22:00:99:c3:00:00:00:01:05:00:00:03:ef:0a:0a:0a:c0:00:02:0a:c0:00:02:0b:c0:00:02:0c" 38# IGMPv3 allow report: grp 239.10.10.10 allow 192.0.2.20,192.0.2.30 39MZPKT_ALLOW2="22:00:5b:b4:00:00:00:01:05:00:00:02:ef:0a:0a:0a:c0:00:02:14:c0:00:02:1e" 40# IGMPv3 is_ex report: grp 239.10.10.10 is_exclude 192.0.2.1,192.0.2.2,192.0.2.20,192.0.2.21 41MZPKT_IS_EXC="22:00:da:b6:00:00:00:01:02:00:00:04:ef:0a:0a:0a:c0:00:02:01:c0:00:02:02:c0:00:02:14:c0:00:02:15" 42# IGMPv3 is_ex report: grp 239.10.10.10 is_exclude 192.0.2.20,192.0.2.30 43MZPKT_IS_EXC2="22:00:5e:b4:00:00:00:01:02:00:00:02:ef:0a:0a:0a:c0:00:02:14:c0:00:02:1e" 44# IGMPv3 to_ex report: grp 239.10.10.10 to_exclude 192.0.2.1,192.0.2.20,192.0.2.30 45MZPKT_TO_EXC="22:00:9a:b1:00:00:00:01:04:00:00:03:ef:0a:0a:0a:c0:00:02:01:c0:00:02:14:c0:00:02:1e" 46# IGMPv3 block report: grp 239.10.10.10 block 192.0.2.1,192.0.2.20,192.0.2.30 47MZPKT_BLOCK="22:00:98:b1:00:00:00:01:06:00:00:03:ef:0a:0a:0a:c0:00:02:01:c0:00:02:14:c0:00:02:1e" 48 49source lib.sh 50 51h1_create() 52{ 53 simple_if_init $h1 192.0.2.1/24 2001:db8:1::1/64 54} 55 56h1_destroy() 57{ 58 simple_if_fini $h1 192.0.2.1/24 2001:db8:1::1/64 59} 60 61h2_create() 62{ 63 simple_if_init $h2 192.0.2.2/24 2001:db8:1::2/64 64} 65 66h2_destroy() 67{ 68 simple_if_fini $h2 192.0.2.2/24 2001:db8:1::2/64 69} 70 71switch_create() 72{ 73 ip link add dev br0 type bridge mcast_snooping 1 mcast_querier 1 74 75 ip link set dev $swp1 master br0 76 ip link set dev $swp2 master br0 77 78 ip link set dev br0 up 79 ip link set dev $swp1 up 80 ip link set dev $swp2 up 81} 82 83switch_destroy() 84{ 85 ip link set dev $swp2 down 86 ip link set dev $swp1 down 87 88 ip link del dev br0 89} 90 91setup_prepare() 92{ 93 h1=${NETIFS[p1]} 94 swp1=${NETIFS[p2]} 95 96 swp2=${NETIFS[p3]} 97 h2=${NETIFS[p4]} 98 99 vrf_prepare 100 101 h1_create 102 h2_create 103 104 switch_create 105} 106 107cleanup() 108{ 109 pre_cleanup 110 111 switch_destroy 112 113 h2_destroy 114 h1_destroy 115 116 vrf_cleanup 117} 118 119v2reportleave_test() 120{ 121 RET=0 122 ip address add dev $h2 $TEST_GROUP/32 autojoin 123 check_err $? "Could not join $TEST_GROUP" 124 125 sleep 5 126 bridge mdb show dev br0 | grep $TEST_GROUP 1>/dev/null 127 check_err $? "IGMPv2 report didn't create mdb entry for $TEST_GROUP" 128 129 mcast_packet_test $TEST_GROUP_MAC 192.0.2.1 $TEST_GROUP $h1 $h2 130 check_fail $? "Traffic to $TEST_GROUP wasn't forwarded" 131 132 log_test "IGMPv2 report $TEST_GROUP" 133 134 RET=0 135 bridge mdb show dev br0 | grep $TEST_GROUP 1>/dev/null 136 check_err $? "mdb entry for $TEST_GROUP is missing" 137 138 ip address del dev $h2 $TEST_GROUP/32 139 check_err $? "Could not leave $TEST_GROUP" 140 141 sleep 5 142 bridge mdb show dev br0 | grep $TEST_GROUP 1>/dev/null 143 check_fail $? "Leave didn't delete mdb entry for $TEST_GROUP" 144 145 mcast_packet_test $TEST_GROUP_MAC 192.0.2.1 $TEST_GROUP $h1 $h2 146 check_err $? "Traffic to $TEST_GROUP was forwarded without mdb entry" 147 148 log_test "IGMPv2 leave $TEST_GROUP" 149} 150 151v3include_prepare() 152{ 153 local host1_if=$1 154 local mac=$2 155 local group=$3 156 local X=("192.0.2.1" "192.0.2.2" "192.0.2.3") 157 158 ip link set dev br0 type bridge mcast_igmp_version 3 159 check_err $? "Could not change bridge IGMP version to 3" 160 161 $MZ $host1_if -b $mac -c 1 -B $group -t ip "proto=2,p=$MZPKT_IS_INC" -q 162 sleep 1 163 bridge -j -d -s mdb show dev br0 \ 164 | jq -e ".[].mdb[] | \ 165 select(.grp == \"$TEST_GROUP\" and .source_list != null)" &>/dev/null 166 check_err $? "Missing *,G entry with source list" 167 bridge -j -d -s mdb show dev br0 \ 168 | jq -e ".[].mdb[] | \ 169 select(.grp == \"$TEST_GROUP\" and \ 170 .source_list != null and .filter_mode == \"include\")" &>/dev/null 171 check_err $? "Wrong *,G entry filter mode" 172 brmcast_check_sg_entries "is_include" "${X[@]}" 173} 174 175v3exclude_prepare() 176{ 177 local host1_if=$1 178 local mac=$2 179 local group=$3 180 local pkt=$4 181 local X=("192.0.2.1" "192.0.2.2") 182 local Y=("192.0.2.20" "192.0.2.21") 183 184 v3include_prepare $host1_if $mac $group 185 186 $MZ $host1_if -c 1 -b $mac -B $group -t ip "proto=2,p=$MZPKT_IS_EXC" -q 187 sleep 1 188 bridge -j -d -s mdb show dev br0 \ 189 | jq -e ".[].mdb[] | \ 190 select(.grp == \"$TEST_GROUP\" and \ 191 .source_list != null and .filter_mode == \"exclude\")" &>/dev/null 192 check_err $? "Wrong *,G entry filter mode" 193 194 brmcast_check_sg_entries "is_exclude" "${X[@]}" "${Y[@]}" 195 196 brmcast_check_sg_state 0 "${X[@]}" 197 brmcast_check_sg_state 1 "${Y[@]}" 198 199 bridge -j -d -s mdb show dev br0 \ 200 | jq -e ".[].mdb[] | \ 201 select(.grp == \"$TEST_GROUP\" and \ 202 .source_list != null and 203 .source_list[].address == \"192.0.2.3\")" &>/dev/null 204 check_fail $? "Wrong *,G entry source list, 192.0.2.3 entry still exists" 205} 206 207v3cleanup() 208{ 209 local port=$1 210 local group=$2 211 212 bridge mdb del dev br0 port $port grp $group 213 ip link set dev br0 type bridge mcast_igmp_version 2 214} 215 216v3include_test() 217{ 218 RET=0 219 local X=("192.0.2.1" "192.0.2.2" "192.0.2.3") 220 221 v3include_prepare $h1 $ALL_MAC $ALL_GROUP 222 223 brmcast_check_sg_state 0 "${X[@]}" 224 225 brmcast_check_sg_fwding 1 "${X[@]}" 226 brmcast_check_sg_fwding 0 "192.0.2.100" 227 228 log_test "IGMPv3 report $TEST_GROUP is_include" 229 230 v3cleanup $swp1 $TEST_GROUP 231} 232 233v3inc_allow_test() 234{ 235 RET=0 236 local X=("192.0.2.10" "192.0.2.11" "192.0.2.12") 237 238 v3include_prepare $h1 $ALL_MAC $ALL_GROUP 239 240 $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_ALLOW" -q 241 sleep 1 242 brmcast_check_sg_entries "allow" "${X[@]}" 243 244 brmcast_check_sg_state 0 "${X[@]}" 245 246 brmcast_check_sg_fwding 1 "${X[@]}" 247 brmcast_check_sg_fwding 0 "192.0.2.100" 248 249 log_test "IGMPv3 report $TEST_GROUP include -> allow" 250 251 v3cleanup $swp1 $TEST_GROUP 252} 253 254v3inc_is_include_test() 255{ 256 RET=0 257 local X=("192.0.2.10" "192.0.2.11" "192.0.2.12") 258 259 v3include_prepare $h1 $ALL_MAC $ALL_GROUP 260 261 $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_IS_INC2" -q 262 sleep 1 263 brmcast_check_sg_entries "is_include" "${X[@]}" 264 265 brmcast_check_sg_state 0 "${X[@]}" 266 267 brmcast_check_sg_fwding 1 "${X[@]}" 268 brmcast_check_sg_fwding 0 "192.0.2.100" 269 270 log_test "IGMPv3 report $TEST_GROUP include -> is_include" 271 272 v3cleanup $swp1 $TEST_GROUP 273} 274 275v3inc_is_exclude_test() 276{ 277 RET=0 278 279 v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP 280 281 brmcast_check_sg_fwding 1 "${X[@]}" 192.0.2.100 282 brmcast_check_sg_fwding 0 "${Y[@]}" 283 284 log_test "IGMPv3 report $TEST_GROUP include -> is_exclude" 285 286 v3cleanup $swp1 $TEST_GROUP 287} 288 289v3inc_to_exclude_test() 290{ 291 RET=0 292 local X=("192.0.2.1") 293 local Y=("192.0.2.20" "192.0.2.30") 294 295 v3include_prepare $h1 $ALL_MAC $ALL_GROUP 296 297 ip link set dev br0 type bridge mcast_last_member_interval 500 298 check_err $? "Could not change mcast_last_member_interval to 5s" 299 300 $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_TO_EXC" -q 301 sleep 1 302 bridge -j -d -s mdb show dev br0 \ 303 | jq -e ".[].mdb[] | \ 304 select(.grp == \"$TEST_GROUP\" and \ 305 .source_list != null and .filter_mode == \"exclude\")" &>/dev/null 306 check_err $? "Wrong *,G entry filter mode" 307 308 brmcast_check_sg_entries "to_exclude" "${X[@]}" "${Y[@]}" 309 310 brmcast_check_sg_state 0 "${X[@]}" 311 brmcast_check_sg_state 1 "${Y[@]}" 312 313 bridge -j -d -s mdb show dev br0 \ 314 | jq -e ".[].mdb[] | \ 315 select(.grp == \"$TEST_GROUP\" and \ 316 .source_list != null and 317 .source_list[].address == \"192.0.2.2\")" &>/dev/null 318 check_fail $? "Wrong *,G entry source list, 192.0.2.2 entry still exists" 319 bridge -j -d -s mdb show dev br0 \ 320 | jq -e ".[].mdb[] | \ 321 select(.grp == \"$TEST_GROUP\" and \ 322 .source_list != null and 323 .source_list[].address == \"192.0.2.21\")" &>/dev/null 324 check_fail $? "Wrong *,G entry source list, 192.0.2.21 entry still exists" 325 326 brmcast_check_sg_fwding 1 "${X[@]}" 192.0.2.100 327 brmcast_check_sg_fwding 0 "${Y[@]}" 328 329 log_test "IGMPv3 report $TEST_GROUP include -> to_exclude" 330 331 ip link set dev br0 type bridge mcast_last_member_interval 100 332 333 v3cleanup $swp1 $TEST_GROUP 334} 335 336v3exc_allow_test() 337{ 338 RET=0 339 local X=("192.0.2.1" "192.0.2.2" "192.0.2.20" "192.0.2.30") 340 local Y=("192.0.2.21") 341 342 v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP 343 344 $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_ALLOW2" -q 345 sleep 1 346 brmcast_check_sg_entries "allow" "${X[@]}" "${Y[@]}" 347 348 brmcast_check_sg_state 0 "${X[@]}" 349 brmcast_check_sg_state 1 "${Y[@]}" 350 351 brmcast_check_sg_fwding 1 "${X[@]}" 192.0.2.100 352 brmcast_check_sg_fwding 0 "${Y[@]}" 353 354 log_test "IGMPv3 report $TEST_GROUP exclude -> allow" 355 356 v3cleanup $swp1 $TEST_GROUP 357} 358 359v3exc_is_include_test() 360{ 361 RET=0 362 local X=("192.0.2.1" "192.0.2.2" "192.0.2.20" "192.0.2.30") 363 local Y=("192.0.2.21") 364 365 v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP 366 367 $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_IS_INC3" -q 368 sleep 1 369 brmcast_check_sg_entries "is_include" "${X[@]}" "${Y[@]}" 370 371 brmcast_check_sg_state 0 "${X[@]}" 372 brmcast_check_sg_state 1 "${Y[@]}" 373 374 brmcast_check_sg_fwding 1 "${X[@]}" 192.0.2.100 375 brmcast_check_sg_fwding 0 "${Y[@]}" 376 377 log_test "IGMPv3 report $TEST_GROUP exclude -> is_include" 378 379 v3cleanup $swp1 $TEST_GROUP 380} 381 382v3exc_is_exclude_test() 383{ 384 RET=0 385 local X=("192.0.2.30") 386 local Y=("192.0.2.20") 387 388 v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP 389 390 $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_IS_EXC2" -q 391 sleep 1 392 brmcast_check_sg_entries "is_exclude" "${X[@]}" "${Y[@]}" 393 394 brmcast_check_sg_state 0 "${X[@]}" 395 brmcast_check_sg_state 1 "${Y[@]}" 396 397 brmcast_check_sg_fwding 1 "${X[@]}" 192.0.2.100 398 brmcast_check_sg_fwding 0 "${Y[@]}" 399 400 log_test "IGMPv3 report $TEST_GROUP exclude -> is_exclude" 401 402 v3cleanup $swp1 $TEST_GROUP 403} 404 405v3exc_to_exclude_test() 406{ 407 RET=0 408 local X=("192.0.2.1" "192.0.2.30") 409 local Y=("192.0.2.20") 410 411 v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP 412 413 ip link set dev br0 type bridge mcast_last_member_interval 500 414 check_err $? "Could not change mcast_last_member_interval to 5s" 415 416 $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_TO_EXC" -q 417 sleep 1 418 brmcast_check_sg_entries "to_exclude" "${X[@]}" "${Y[@]}" 419 420 brmcast_check_sg_state 0 "${X[@]}" 421 brmcast_check_sg_state 1 "${Y[@]}" 422 423 brmcast_check_sg_fwding 1 "${X[@]}" 192.0.2.100 424 brmcast_check_sg_fwding 0 "${Y[@]}" 425 426 log_test "IGMPv3 report $TEST_GROUP exclude -> to_exclude" 427 428 ip link set dev br0 type bridge mcast_last_member_interval 100 429 430 v3cleanup $swp1 $TEST_GROUP 431} 432 433v3inc_block_test() 434{ 435 RET=0 436 local X=("192.0.2.2" "192.0.2.3") 437 438 v3include_prepare $h1 $ALL_MAC $ALL_GROUP 439 440 $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_BLOCK" -q 441 # make sure the lowered timers have expired (by default 2 seconds) 442 sleep 3 443 brmcast_check_sg_entries "block" "${X[@]}" 444 445 brmcast_check_sg_state 0 "${X[@]}" 446 447 bridge -j -d -s mdb show dev br0 \ 448 | jq -e ".[].mdb[] | \ 449 select(.grp == \"$TEST_GROUP\" and \ 450 .source_list != null and 451 .source_list[].address == \"192.0.2.1\")" &>/dev/null 452 check_fail $? "Wrong *,G entry source list, 192.0.2.1 entry still exists" 453 454 brmcast_check_sg_fwding 1 "${X[@]}" 455 brmcast_check_sg_fwding 0 "192.0.2.100" 456 457 log_test "IGMPv3 report $TEST_GROUP include -> block" 458 459 v3cleanup $swp1 $TEST_GROUP 460} 461 462v3exc_block_test() 463{ 464 RET=0 465 local X=("192.0.2.1" "192.0.2.2" "192.0.2.30") 466 local Y=("192.0.2.20" "192.0.2.21") 467 468 v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP 469 470 ip link set dev br0 type bridge mcast_last_member_interval 500 471 check_err $? "Could not change mcast_last_member_interval to 5s" 472 473 $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_BLOCK" -q 474 sleep 1 475 brmcast_check_sg_entries "block" "${X[@]}" "${Y[@]}" 476 477 brmcast_check_sg_state 0 "${X[@]}" 478 brmcast_check_sg_state 1 "${Y[@]}" 479 480 brmcast_check_sg_fwding 1 "${X[@]}" 192.0.2.100 481 brmcast_check_sg_fwding 0 "${Y[@]}" 482 483 log_test "IGMPv3 report $TEST_GROUP exclude -> block" 484 485 ip link set dev br0 type bridge mcast_last_member_interval 100 486 487 v3cleanup $swp1 $TEST_GROUP 488} 489 490v3exc_timeout_test() 491{ 492 RET=0 493 local X=("192.0.2.20" "192.0.2.30") 494 495 # GMI should be 5 seconds 496 ip link set dev br0 type bridge mcast_query_interval 100 \ 497 mcast_query_response_interval 100 \ 498 mcast_membership_interval 500 499 500 v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP 501 ip link set dev br0 type bridge mcast_query_interval 500 \ 502 mcast_query_response_interval 500 \ 503 mcast_membership_interval 1500 504 505 $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_ALLOW2" -q 506 sleep 5 507 bridge -j -d -s mdb show dev br0 \ 508 | jq -e ".[].mdb[] | \ 509 select(.grp == \"$TEST_GROUP\" and \ 510 .source_list != null and .filter_mode == \"include\")" &>/dev/null 511 check_err $? "Wrong *,G entry filter mode" 512 513 bridge -j -d -s mdb show dev br0 \ 514 | jq -e ".[].mdb[] | \ 515 select(.grp == \"$TEST_GROUP\" and \ 516 .source_list != null and 517 .source_list[].address == \"192.0.2.1\")" &>/dev/null 518 check_fail $? "Wrong *,G entry source list, 192.0.2.1 entry still exists" 519 bridge -j -d -s mdb show dev br0 \ 520 | jq -e ".[].mdb[] | \ 521 select(.grp == \"$TEST_GROUP\" and \ 522 .source_list != null and 523 .source_list[].address == \"192.0.2.2\")" &>/dev/null 524 check_fail $? "Wrong *,G entry source list, 192.0.2.2 entry still exists" 525 526 brmcast_check_sg_entries "allow" "${X[@]}" 527 528 brmcast_check_sg_state 0 "${X[@]}" 529 530 brmcast_check_sg_fwding 1 "${X[@]}" 531 brmcast_check_sg_fwding 0 192.0.2.100 532 533 log_test "IGMPv3 group $TEST_GROUP exclude timeout" 534 535 ip link set dev br0 type bridge mcast_query_interval 12500 \ 536 mcast_query_response_interval 1000 \ 537 mcast_membership_interval 26000 538 539 v3cleanup $swp1 $TEST_GROUP 540} 541 542v3star_ex_auto_add_test() 543{ 544 RET=0 545 546 v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP 547 548 $MZ $h2 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_IS_INC" -q 549 sleep 1 550 bridge -j -d -s mdb show dev br0 \ 551 | jq -e ".[].mdb[] | \ 552 select(.grp == \"$TEST_GROUP\" and .src == \"192.0.2.3\" and \ 553 .port == \"$swp1\")" &>/dev/null 554 check_err $? "S,G entry for *,G port doesn't exist" 555 556 bridge -j -d -s mdb show dev br0 \ 557 | jq -e ".[].mdb[] | \ 558 select(.grp == \"$TEST_GROUP\" and .src == \"192.0.2.3\" and \ 559 .port == \"$swp1\" and \ 560 .flags[] == \"added_by_star_ex\")" &>/dev/null 561 check_err $? "Auto-added S,G entry doesn't have added_by_star_ex flag" 562 563 brmcast_check_sg_fwding 1 192.0.2.3 564 565 log_test "IGMPv3 S,G port entry automatic add to a *,G port" 566 567 v3cleanup $swp1 $TEST_GROUP 568 v3cleanup $swp2 $TEST_GROUP 569} 570 571v2per_vlan_snooping_stp_test() 572{ 573 local is_port=$1 574 575 local msg="port" 576 [[ $is_port -ne 1 ]] && msg="vlan" 577 578 ip link set br0 up type bridge vlan_filtering 1 \ 579 mcast_igmp_version 2 \ 580 mcast_snooping 1 \ 581 mcast_vlan_snooping 1 \ 582 mcast_querier 1 \ 583 mcast_stats_enabled 1 584 bridge vlan global set vid 1 dev br0 \ 585 mcast_snooping 1 \ 586 mcast_querier 1 \ 587 mcast_query_interval 100 \ 588 mcast_startup_query_count 0 589 [[ $is_port -eq 1 ]] && bridge link set dev $swp1 state 0 590 [[ $is_port -ne 1 ]] && bridge vlan set vid 1 dev $swp1 state 4 591 sleep 5 592 local tx_s=$(ip -j -p stats show dev $swp1 \ 593 group xstats_slave subgroup bridge suite mcast \ 594 | jq '.[]["multicast"]["igmp_queries"]["tx_v2"]') 595 596 [[ $is_port -eq 1 ]] && bridge link set dev $swp1 state 3 597 [[ $is_port -ne 1 ]] && bridge vlan set vid 1 dev $swp1 state 3 598 sleep 5 599 local tx_e=$(ip -j -p stats show dev $swp1 \ 600 group xstats_slave subgroup bridge suite mcast \ 601 | jq '.[]["multicast"]["igmp_queries"]["tx_v2"]') 602 603 RET=0 604 local tx=$(expr $tx_e - $tx_s) 605 test $tx -gt 0 606 check_err $? "No IGMP queries after STP state becomes forwarding" 607 log_test "per vlan snooping with $msg stp state change" 608 609 # restore settings 610 bridge vlan global set vid 1 dev br0 \ 611 mcast_querier 0 \ 612 mcast_query_interval 12500 \ 613 mcast_startup_query_count 2 614 ip link set br0 up type bridge vlan_filtering 0 \ 615 mcast_vlan_snooping 0 \ 616 mcast_stats_enabled 0 617} 618 619v2per_vlan_snooping_port_stp_test() 620{ 621 v2per_vlan_snooping_stp_test 1 622} 623 624v2per_vlan_snooping_vlan_stp_test() 625{ 626 v2per_vlan_snooping_stp_test 0 627} 628 629trap cleanup EXIT 630 631setup_prepare 632setup_wait 633 634tests_run 635 636exit $EXIT_STATUS 637