Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'selftests-net-bridge-add-tests-for-igmpv3'

Nikolay Aleksandrov says:

====================
selftests: net: bridge: add tests for IGMPv3

This set adds tests for the bridge's new IGMPv3 support. The tests use
precooked packets which are sent via mausezahn and the resulting state
after each test is checked for proper X,Y sets, (*,G) source list, source
list entry timers, (S,G) existence and flags, packet forwarding and
blocking, exclude group expiration and (*,G) auto-add. The first 3 patches
prepare the existing IGMPv2 tests, then patch 4 adds new helpers which are
used throughout the rest of the v3 tests.
The following new tests are added:
- base case: IGMPv3 report 239.10.10.10 is_include (A)
- include -> allow report
- include -> is_include report
- include -> is_exclude report
- include -> to_exclude report
- exclude -> allow report
- exclude -> is_include report
- exclude -> is_exclude report
- exclude -> to_exclude report
- include -> block report
- exclude -> block report
- exclude timeout (move to include + entry deletion)
- S,G port entry automatic add to a *,G,exclude port

The variable names and set notation are the same as per RFC 3376,
for more information check RFC 3376 sections 4.2.15 and 6.4.1.
MLDv2 tests will be added by a separate patch-set.
====================

Link: https://lore.kernel.org/r/20201027185934.227040-1-razor@blackwall.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+520 -12
+520 -12
tools/testing/selftests/net/forwarding/bridge_igmp.sh
··· 1 1 #!/bin/bash 2 2 # SPDX-License-Identifier: GPL-2.0 3 3 4 - ALL_TESTS="reportleave_test" 4 + ALL_TESTS="v2reportleave_test v3include_test v3inc_allow_test v3inc_is_include_test \ 5 + v3inc_is_exclude_test v3inc_to_exclude_test v3exc_allow_test v3exc_is_include_test \ 6 + v3exc_is_exclude_test v3exc_to_exclude_test v3inc_block_test v3exc_block_test \ 7 + v3exc_timeout_test v3star_ex_auto_add_test" 5 8 NUM_NETIFS=4 6 9 CHECK_TC="yes" 7 10 TEST_GROUP="239.10.10.10" 8 11 TEST_GROUP_MAC="01:00:5e:0a:0a:0a" 12 + 13 + ALL_GROUP="224.0.0.1" 14 + ALL_MAC="01:00:5e:00:00:01" 15 + 16 + # IGMPv3 is_in report: grp 239.10.10.10 is_include 192.0.2.1,192.0.2.2,192.0.2.3 17 + MZPKT_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" 18 + # IGMPv3 is_in report: grp 239.10.10.10 is_include 192.0.2.10,192.0.2.11,192.0.2.12 19 + MZPKT_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" 20 + # IGMPv3 is_in report: grp 239.10.10.10 is_include 192.0.2.20,192.0.2.30 21 + MZPKT_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" 22 + # IGMPv3 allow report: grp 239.10.10.10 allow 192.0.2.10,192.0.2.11,192.0.2.12 23 + MZPKT_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" 24 + # IGMPv3 allow report: grp 239.10.10.10 allow 192.0.2.20,192.0.2.30 25 + MZPKT_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" 26 + # 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 27 + MZPKT_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" 28 + # IGMPv3 is_ex report: grp 239.10.10.10 is_exclude 192.0.2.20,192.0.2.30 29 + MZPKT_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" 30 + # IGMPv3 to_ex report: grp 239.10.10.10 to_exclude 192.0.2.1,192.0.2.20,192.0.2.30 31 + MZPKT_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" 32 + # IGMPv3 block report: grp 239.10.10.10 block 192.0.2.1,192.0.2.20,192.0.2.30 33 + MZPKT_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" 34 + 9 35 source lib.sh 10 36 11 37 h1_create() ··· 109 83 mcast_packet_test() 110 84 { 111 85 local mac=$1 112 - local ip=$2 113 - local host1_if=$3 114 - local host2_if=$4 86 + local src_ip=$2 87 + local ip=$3 88 + local host1_if=$4 89 + local host2_if=$5 115 90 local seen=0 116 91 117 92 # Add an ACL on `host2_if` which will tell us whether the packet 118 93 # was received by it or not. 119 94 tc qdisc add dev $host2_if ingress 120 95 tc filter add dev $host2_if ingress protocol ip pref 1 handle 101 \ 121 - flower dst_mac $mac action drop 96 + flower ip_proto udp dst_mac $mac action drop 122 97 123 - $MZ $host1_if -c 1 -p 64 -b $mac -B $ip -t udp "dp=4096,sp=2048" -q 98 + $MZ $host1_if -c 1 -p 64 -b $mac -A $src_ip -B $ip -t udp "dp=4096,sp=2048" -q 124 99 sleep 1 125 100 126 101 tc -j -s filter show dev $host2_if ingress \ ··· 137 110 return $seen 138 111 } 139 112 140 - reportleave_test() 113 + v2reportleave_test() 141 114 { 142 115 RET=0 143 116 ip address add dev $h2 $TEST_GROUP/32 autojoin ··· 145 118 146 119 sleep 5 147 120 bridge mdb show dev br0 | grep $TEST_GROUP 1>/dev/null 148 - check_err $? "Report didn't create mdb entry for $TEST_GROUP" 121 + check_err $? "IGMPv2 report didn't create mdb entry for $TEST_GROUP" 149 122 150 - mcast_packet_test $TEST_GROUP_MAC $TEST_GROUP $h1 $h2 123 + mcast_packet_test $TEST_GROUP_MAC 192.0.2.1 $TEST_GROUP $h1 $h2 151 124 check_fail $? "Traffic to $TEST_GROUP wasn't forwarded" 152 125 153 - log_test "IGMP report $TEST_GROUP" 126 + log_test "IGMPv2 report $TEST_GROUP" 154 127 155 128 RET=0 156 129 bridge mdb show dev br0 | grep $TEST_GROUP 1>/dev/null ··· 163 136 bridge mdb show dev br0 | grep $TEST_GROUP 1>/dev/null 164 137 check_fail $? "Leave didn't delete mdb entry for $TEST_GROUP" 165 138 166 - mcast_packet_test $TEST_GROUP_MAC $TEST_GROUP $h1 $h2 139 + mcast_packet_test $TEST_GROUP_MAC 192.0.2.1 $TEST_GROUP $h1 $h2 167 140 check_err $? "Traffic to $TEST_GROUP was forwarded without mdb entry" 168 141 169 - log_test "IGMP leave $TEST_GROUP" 142 + log_test "IGMPv2 leave $TEST_GROUP" 143 + } 144 + 145 + check_sg_entries() 146 + { 147 + local report=$1; shift 148 + local slist=("$@") 149 + local sarg="" 150 + 151 + for src in "${slist[@]}"; do 152 + sarg="${sarg} and .source_list[].address == \"$src\"" 153 + done 154 + bridge -j -d -s mdb show dev br0 \ 155 + | jq -e ".[].mdb[] | \ 156 + select(.grp == \"$TEST_GROUP\" and .source_list != null $sarg)" &>/dev/null 157 + check_err $? "Wrong *,G entry source list after $report report" 158 + 159 + for sgent in "${slist[@]}"; do 160 + bridge -j -d -s mdb show dev br0 \ 161 + | jq -e ".[].mdb[] | \ 162 + select(.grp == \"$TEST_GROUP\" and .src == \"$sgent\")" &>/dev/null 163 + check_err $? "Missing S,G entry ($sgent, $TEST_GROUP)" 164 + done 165 + } 166 + 167 + check_sg_fwding() 168 + { 169 + local should_fwd=$1; shift 170 + local sources=("$@") 171 + 172 + for src in "${sources[@]}"; do 173 + local retval=0 174 + 175 + mcast_packet_test $TEST_GROUP_MAC $src $TEST_GROUP $h2 $h1 176 + retval=$? 177 + if [ $should_fwd -eq 1 ]; then 178 + check_fail $retval "Didn't forward traffic from S,G ($src, $TEST_GROUP)" 179 + else 180 + check_err $retval "Forwarded traffic for blocked S,G ($src, $TEST_GROUP)" 181 + fi 182 + done 183 + } 184 + 185 + check_sg_state() 186 + { 187 + local is_blocked=$1; shift 188 + local sources=("$@") 189 + local should_fail=1 190 + 191 + if [ $is_blocked -eq 1 ]; then 192 + should_fail=0 193 + fi 194 + 195 + for src in "${sources[@]}"; do 196 + bridge -j -d -s mdb show dev br0 \ 197 + | jq -e ".[].mdb[] | \ 198 + select(.grp == \"$TEST_GROUP\" and .source_list != null) | 199 + .source_list[] | 200 + select(.address == \"$src\") | 201 + select(.timer == \"0.00\")" &>/dev/null 202 + check_err_fail $should_fail $? "Entry $src has zero timer" 203 + 204 + bridge -j -d -s mdb show dev br0 \ 205 + | jq -e ".[].mdb[] | \ 206 + select(.grp == \"$TEST_GROUP\" and .src == \"$src\" and \ 207 + .flags[] == \"blocked\")" &>/dev/null 208 + check_err_fail $should_fail $? "Entry $src has blocked flag" 209 + done 210 + } 211 + 212 + v3include_prepare() 213 + { 214 + local host1_if=$1 215 + local mac=$2 216 + local group=$3 217 + local X=("192.0.2.1" "192.0.2.2" "192.0.2.3") 218 + 219 + ip link set dev br0 type bridge mcast_igmp_version 3 220 + check_err $? "Could not change bridge IGMP version to 3" 221 + 222 + $MZ $host1_if -b $mac -c 1 -B $group -t ip "proto=2,p=$MZPKT_IS_INC" -q 223 + sleep 1 224 + bridge -j -d -s mdb show dev br0 \ 225 + | jq -e ".[].mdb[] | \ 226 + select(.grp == \"$TEST_GROUP\" and .source_list != null)" &>/dev/null 227 + check_err $? "Missing *,G entry with source list" 228 + bridge -j -d -s mdb show dev br0 \ 229 + | jq -e ".[].mdb[] | \ 230 + select(.grp == \"$TEST_GROUP\" and \ 231 + .source_list != null and .filter_mode == \"include\")" &>/dev/null 232 + check_err $? "Wrong *,G entry filter mode" 233 + check_sg_entries "is_include" "${X[@]}" 234 + } 235 + 236 + v3exclude_prepare() 237 + { 238 + local host1_if=$1 239 + local mac=$2 240 + local group=$3 241 + local pkt=$4 242 + local X=("192.0.2.1" "192.0.2.2") 243 + local Y=("192.0.2.20" "192.0.2.21") 244 + 245 + v3include_prepare $host1_if $mac $group 246 + 247 + $MZ $host1_if -c 1 -b $mac -B $group -t ip "proto=2,p=$MZPKT_IS_EXC" -q 248 + sleep 1 249 + bridge -j -d -s mdb show dev br0 \ 250 + | jq -e ".[].mdb[] | \ 251 + select(.grp == \"$TEST_GROUP\" and \ 252 + .source_list != null and .filter_mode == \"exclude\")" &>/dev/null 253 + check_err $? "Wrong *,G entry filter mode" 254 + 255 + check_sg_entries "is_exclude" "${X[@]}" "${Y[@]}" 256 + 257 + check_sg_state 0 "${X[@]}" 258 + check_sg_state 1 "${Y[@]}" 259 + 260 + bridge -j -d -s mdb show dev br0 \ 261 + | jq -e ".[].mdb[] | \ 262 + select(.grp == \"$TEST_GROUP\" and \ 263 + .source_list != null and 264 + .source_list[].address == \"192.0.2.3\")" &>/dev/null 265 + check_fail $? "Wrong *,G entry source list, 192.0.2.3 entry still exists" 266 + } 267 + 268 + v3cleanup() 269 + { 270 + local port=$1 271 + local group=$2 272 + 273 + bridge mdb del dev br0 port $port grp $group 274 + ip link set dev br0 type bridge mcast_igmp_version 2 275 + } 276 + 277 + v3include_test() 278 + { 279 + RET=0 280 + local X=("192.0.2.1" "192.0.2.2" "192.0.2.3") 281 + 282 + v3include_prepare $h1 $ALL_MAC $ALL_GROUP 283 + 284 + check_sg_state 0 "${X[@]}" 285 + 286 + check_sg_fwding 1 "${X[@]}" 287 + check_sg_fwding 0 "192.0.2.100" 288 + 289 + log_test "IGMPv3 report $TEST_GROUP is_include" 290 + 291 + v3cleanup $swp1 $TEST_GROUP 292 + } 293 + 294 + v3inc_allow_test() 295 + { 296 + RET=0 297 + local X=("192.0.2.10" "192.0.2.11" "192.0.2.12") 298 + 299 + v3include_prepare $h1 $ALL_MAC $ALL_GROUP 300 + 301 + $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_ALLOW" -q 302 + sleep 1 303 + check_sg_entries "allow" "${X[@]}" 304 + 305 + check_sg_state 0 "${X[@]}" 306 + 307 + check_sg_fwding 1 "${X[@]}" 308 + check_sg_fwding 0 "192.0.2.100" 309 + 310 + log_test "IGMPv3 report $TEST_GROUP include -> allow" 311 + 312 + v3cleanup $swp1 $TEST_GROUP 313 + } 314 + 315 + v3inc_is_include_test() 316 + { 317 + RET=0 318 + local X=("192.0.2.10" "192.0.2.11" "192.0.2.12") 319 + 320 + v3include_prepare $h1 $ALL_MAC $ALL_GROUP 321 + 322 + $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_IS_INC2" -q 323 + sleep 1 324 + check_sg_entries "is_include" "${X[@]}" 325 + 326 + check_sg_state 0 "${X[@]}" 327 + 328 + check_sg_fwding 1 "${X[@]}" 329 + check_sg_fwding 0 "192.0.2.100" 330 + 331 + log_test "IGMPv3 report $TEST_GROUP include -> is_include" 332 + 333 + v3cleanup $swp1 $TEST_GROUP 334 + } 335 + 336 + v3inc_is_exclude_test() 337 + { 338 + RET=0 339 + 340 + v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP 341 + 342 + check_sg_fwding 1 "${X[@]}" 192.0.2.100 343 + check_sg_fwding 0 "${Y[@]}" 344 + 345 + log_test "IGMPv3 report $TEST_GROUP include -> is_exclude" 346 + 347 + v3cleanup $swp1 $TEST_GROUP 348 + } 349 + 350 + v3inc_to_exclude_test() 351 + { 352 + RET=0 353 + local X=("192.0.2.1") 354 + local Y=("192.0.2.20" "192.0.2.30") 355 + 356 + v3include_prepare $h1 $ALL_MAC $ALL_GROUP 357 + 358 + ip link set dev br0 type bridge mcast_last_member_interval 500 359 + check_err $? "Could not change mcast_last_member_interval to 5s" 360 + 361 + $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_TO_EXC" -q 362 + sleep 1 363 + bridge -j -d -s mdb show dev br0 \ 364 + | jq -e ".[].mdb[] | \ 365 + select(.grp == \"$TEST_GROUP\" and \ 366 + .source_list != null and .filter_mode == \"exclude\")" &>/dev/null 367 + check_err $? "Wrong *,G entry filter mode" 368 + 369 + check_sg_entries "to_exclude" "${X[@]}" "${Y[@]}" 370 + 371 + check_sg_state 0 "${X[@]}" 372 + check_sg_state 1 "${Y[@]}" 373 + 374 + bridge -j -d -s mdb show dev br0 \ 375 + | jq -e ".[].mdb[] | \ 376 + select(.grp == \"$TEST_GROUP\" and \ 377 + .source_list != null and 378 + .source_list[].address == \"192.0.2.2\")" &>/dev/null 379 + check_fail $? "Wrong *,G entry source list, 192.0.2.2 entry still exists" 380 + bridge -j -d -s mdb show dev br0 \ 381 + | jq -e ".[].mdb[] | \ 382 + select(.grp == \"$TEST_GROUP\" and \ 383 + .source_list != null and 384 + .source_list[].address == \"192.0.2.21\")" &>/dev/null 385 + check_fail $? "Wrong *,G entry source list, 192.0.2.21 entry still exists" 386 + 387 + check_sg_fwding 1 "${X[@]}" 192.0.2.100 388 + check_sg_fwding 0 "${Y[@]}" 389 + 390 + log_test "IGMPv3 report $TEST_GROUP include -> to_exclude" 391 + 392 + ip link set dev br0 type bridge mcast_last_member_interval 100 393 + 394 + v3cleanup $swp1 $TEST_GROUP 395 + } 396 + 397 + v3exc_allow_test() 398 + { 399 + RET=0 400 + local X=("192.0.2.1" "192.0.2.2" "192.0.2.20" "192.0.2.30") 401 + local Y=("192.0.2.21") 402 + 403 + v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP 404 + 405 + $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_ALLOW2" -q 406 + sleep 1 407 + check_sg_entries "allow" "${X[@]}" "${Y[@]}" 408 + 409 + check_sg_state 0 "${X[@]}" 410 + check_sg_state 1 "${Y[@]}" 411 + 412 + check_sg_fwding 1 "${X[@]}" 192.0.2.100 413 + check_sg_fwding 0 "${Y[@]}" 414 + 415 + log_test "IGMPv3 report $TEST_GROUP exclude -> allow" 416 + 417 + v3cleanup $swp1 $TEST_GROUP 418 + } 419 + 420 + v3exc_is_include_test() 421 + { 422 + RET=0 423 + local X=("192.0.2.1" "192.0.2.2" "192.0.2.20" "192.0.2.30") 424 + local Y=("192.0.2.21") 425 + 426 + v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP 427 + 428 + $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_IS_INC3" -q 429 + sleep 1 430 + check_sg_entries "is_include" "${X[@]}" "${Y[@]}" 431 + 432 + check_sg_state 0 "${X[@]}" 433 + check_sg_state 1 "${Y[@]}" 434 + 435 + check_sg_fwding 1 "${X[@]}" 192.0.2.100 436 + check_sg_fwding 0 "${Y[@]}" 437 + 438 + log_test "IGMPv3 report $TEST_GROUP exclude -> is_include" 439 + 440 + v3cleanup $swp1 $TEST_GROUP 441 + } 442 + 443 + v3exc_is_exclude_test() 444 + { 445 + RET=0 446 + local X=("192.0.2.30") 447 + local Y=("192.0.2.20") 448 + 449 + v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP 450 + 451 + $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_IS_EXC2" -q 452 + sleep 1 453 + check_sg_entries "is_exclude" "${X[@]}" "${Y[@]}" 454 + 455 + check_sg_state 0 "${X[@]}" 456 + check_sg_state 1 "${Y[@]}" 457 + 458 + check_sg_fwding 1 "${X[@]}" 192.0.2.100 459 + check_sg_fwding 0 "${Y[@]}" 460 + 461 + log_test "IGMPv3 report $TEST_GROUP exclude -> is_exclude" 462 + 463 + v3cleanup $swp1 $TEST_GROUP 464 + } 465 + 466 + v3exc_to_exclude_test() 467 + { 468 + RET=0 469 + local X=("192.0.2.1" "192.0.2.30") 470 + local Y=("192.0.2.20") 471 + 472 + v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP 473 + 474 + ip link set dev br0 type bridge mcast_last_member_interval 500 475 + check_err $? "Could not change mcast_last_member_interval to 5s" 476 + 477 + $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_TO_EXC" -q 478 + sleep 1 479 + check_sg_entries "to_exclude" "${X[@]}" "${Y[@]}" 480 + 481 + check_sg_state 0 "${X[@]}" 482 + check_sg_state 1 "${Y[@]}" 483 + 484 + check_sg_fwding 1 "${X[@]}" 192.0.2.100 485 + check_sg_fwding 0 "${Y[@]}" 486 + 487 + log_test "IGMPv3 report $TEST_GROUP exclude -> to_exclude" 488 + 489 + ip link set dev br0 type bridge mcast_last_member_interval 100 490 + 491 + v3cleanup $swp1 $TEST_GROUP 492 + } 493 + 494 + v3inc_block_test() 495 + { 496 + RET=0 497 + local X=("192.0.2.2" "192.0.2.3") 498 + 499 + v3include_prepare $h1 $ALL_MAC $ALL_GROUP 500 + 501 + $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_BLOCK" -q 502 + # make sure the lowered timers have expired (by default 2 seconds) 503 + sleep 3 504 + check_sg_entries "block" "${X[@]}" 505 + 506 + check_sg_state 0 "${X[@]}" 507 + 508 + bridge -j -d -s mdb show dev br0 \ 509 + | jq -e ".[].mdb[] | \ 510 + select(.grp == \"$TEST_GROUP\" and \ 511 + .source_list != null and 512 + .source_list[].address == \"192.0.2.1\")" &>/dev/null 513 + check_fail $? "Wrong *,G entry source list, 192.0.2.1 entry still exists" 514 + 515 + check_sg_fwding 1 "${X[@]}" 516 + check_sg_fwding 0 "192.0.2.100" 517 + 518 + log_test "IGMPv3 report $TEST_GROUP include -> block" 519 + 520 + v3cleanup $swp1 $TEST_GROUP 521 + } 522 + 523 + v3exc_block_test() 524 + { 525 + RET=0 526 + local X=("192.0.2.1" "192.0.2.2" "192.0.2.30") 527 + local Y=("192.0.2.20" "192.0.2.21") 528 + 529 + v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP 530 + 531 + ip link set dev br0 type bridge mcast_last_member_interval 500 532 + check_err $? "Could not change mcast_last_member_interval to 5s" 533 + 534 + $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_BLOCK" -q 535 + sleep 1 536 + check_sg_entries "block" "${X[@]}" "${Y[@]}" 537 + 538 + check_sg_state 0 "${X[@]}" 539 + check_sg_state 1 "${Y[@]}" 540 + 541 + check_sg_fwding 1 "${X[@]}" 192.0.2.100 542 + check_sg_fwding 0 "${Y[@]}" 543 + 544 + log_test "IGMPv3 report $TEST_GROUP exclude -> block" 545 + 546 + ip link set dev br0 type bridge mcast_last_member_interval 100 547 + 548 + v3cleanup $swp1 $TEST_GROUP 549 + } 550 + 551 + v3exc_timeout_test() 552 + { 553 + RET=0 554 + local X=("192.0.2.20" "192.0.2.30") 555 + 556 + # GMI should be 3 seconds 557 + ip link set dev br0 type bridge mcast_query_interval 100 mcast_query_response_interval 100 558 + 559 + v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP 560 + ip link set dev br0 type bridge mcast_query_interval 500 mcast_query_response_interval 500 561 + $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_ALLOW2" -q 562 + sleep 3 563 + bridge -j -d -s mdb show dev br0 \ 564 + | jq -e ".[].mdb[] | \ 565 + select(.grp == \"$TEST_GROUP\" and \ 566 + .source_list != null and .filter_mode == \"include\")" &>/dev/null 567 + check_err $? "Wrong *,G entry filter mode" 568 + 569 + bridge -j -d -s mdb show dev br0 \ 570 + | jq -e ".[].mdb[] | \ 571 + select(.grp == \"$TEST_GROUP\" and \ 572 + .source_list != null and 573 + .source_list[].address == \"192.0.2.1\")" &>/dev/null 574 + check_fail $? "Wrong *,G entry source list, 192.0.2.1 entry still exists" 575 + bridge -j -d -s mdb show dev br0 \ 576 + | jq -e ".[].mdb[] | \ 577 + select(.grp == \"$TEST_GROUP\" and \ 578 + .source_list != null and 579 + .source_list[].address == \"192.0.2.2\")" &>/dev/null 580 + check_fail $? "Wrong *,G entry source list, 192.0.2.2 entry still exists" 581 + 582 + check_sg_entries "allow" "${X[@]}" 583 + 584 + check_sg_state 0 "${X[@]}" 585 + 586 + check_sg_fwding 1 "${X[@]}" 587 + check_sg_fwding 0 192.0.2.100 588 + 589 + log_test "IGMPv3 group $TEST_GROUP exclude timeout" 590 + 591 + ip link set dev br0 type bridge mcast_query_interval 12500 \ 592 + mcast_query_response_interval 1000 593 + 594 + v3cleanup $swp1 $TEST_GROUP 595 + } 596 + 597 + v3star_ex_auto_add_test() 598 + { 599 + RET=0 600 + 601 + v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP 602 + 603 + $MZ $h2 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_IS_INC" -q 604 + sleep 1 605 + bridge -j -d -s mdb show dev br0 \ 606 + | jq -e ".[].mdb[] | \ 607 + select(.grp == \"$TEST_GROUP\" and .src == \"192.0.2.3\" and \ 608 + .port == \"$swp1\")" &>/dev/null 609 + check_err $? "S,G entry for *,G port doesn't exist" 610 + 611 + bridge -j -d -s mdb show dev br0 \ 612 + | jq -e ".[].mdb[] | \ 613 + select(.grp == \"$TEST_GROUP\" and .src == \"192.0.2.3\" and \ 614 + .port == \"$swp1\" and \ 615 + .flags[] == \"added_by_star_ex\")" &>/dev/null 616 + check_err $? "Auto-added S,G entry doesn't have added_by_star_ex flag" 617 + 618 + check_sg_fwding 1 192.0.2.3 619 + 620 + log_test "IGMPv3 S,G port entry automatic add to a *,G port" 621 + 622 + v3cleanup $swp1 $TEST_GROUP 623 + v3cleanup $swp2 $TEST_GROUP 170 624 } 171 625 172 626 trap cleanup EXIT