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