1f1054c65SNikolay Aleksandrov#!/bin/bash 2f1054c65SNikolay Aleksandrov# SPDX-License-Identifier: GPL-2.0 3f1054c65SNikolay Aleksandrov 43c8b9fdaSNikolay AleksandrovALL_TESTS="v2reportleave_test v3include_test v3inc_allow_test v3inc_is_include_test \ 57b4f7138SNikolay Aleksandrov v3inc_is_exclude_test v3inc_to_exclude_test v3exc_allow_test v3exc_is_include_test \ 618f66c96SNikolay Aleksandrov v3exc_is_exclude_test v3exc_to_exclude_test v3inc_block_test v3exc_block_test \ 7414ea375SNikolay Aleksandrov v3exc_timeout_test v3star_ex_auto_add_test" 8f1054c65SNikolay AleksandrovNUM_NETIFS=4 9f1054c65SNikolay AleksandrovCHECK_TC="yes" 10f1054c65SNikolay AleksandrovTEST_GROUP="239.10.10.10" 11f1054c65SNikolay AleksandrovTEST_GROUP_MAC="01:00:5e:0a:0a:0a" 1298ae11cfSNikolay Aleksandrov 1398ae11cfSNikolay AleksandrovALL_GROUP="224.0.0.1" 1498ae11cfSNikolay AleksandrovALL_MAC="01:00:5e:00:00:01" 1598ae11cfSNikolay Aleksandrov 1698ae11cfSNikolay Aleksandrov# IGMPv3 is_in report: grp 239.10.10.10 is_include 192.0.2.1,192.0.2.2,192.0.2.3 1798ae11cfSNikolay AleksandrovMZPKT_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" 1847021771SNikolay Aleksandrov# IGMPv3 is_in report: grp 239.10.10.10 is_include 192.0.2.10,192.0.2.11,192.0.2.12 1947021771SNikolay AleksandrovMZPKT_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" 20e7e7ab7cSNikolay Aleksandrov# IGMPv3 is_in report: grp 239.10.10.10 is_include 192.0.2.20,192.0.2.30 21e7e7ab7cSNikolay AleksandrovMZPKT_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" 2298ae11cfSNikolay Aleksandrov# IGMPv3 allow report: grp 239.10.10.10 allow 192.0.2.10,192.0.2.11,192.0.2.12 2398ae11cfSNikolay AleksandrovMZPKT_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" 24eecd8cfdSNikolay Aleksandrov# IGMPv3 allow report: grp 239.10.10.10 allow 192.0.2.20,192.0.2.30 25eecd8cfdSNikolay AleksandrovMZPKT_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" 263c8b9fdaSNikolay Aleksandrov# 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 273c8b9fdaSNikolay AleksandrovMZPKT_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" 287b4f7138SNikolay Aleksandrov# IGMPv3 is_ex report: grp 239.10.10.10 is_exclude 192.0.2.20,192.0.2.30 297b4f7138SNikolay AleksandrovMZPKT_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" 30735af7beSNikolay Aleksandrov# IGMPv3 to_ex report: grp 239.10.10.10 to_exclude 192.0.2.1,192.0.2.20,192.0.2.30 31735af7beSNikolay AleksandrovMZPKT_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" 3280899f1bSNikolay Aleksandrov# IGMPv3 block report: grp 239.10.10.10 block 192.0.2.1,192.0.2.20,192.0.2.30 3380899f1bSNikolay AleksandrovMZPKT_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" 3498ae11cfSNikolay Aleksandrov 35f1054c65SNikolay Aleksandrovsource lib.sh 36f1054c65SNikolay Aleksandrov 37f1054c65SNikolay Aleksandrovh1_create() 38f1054c65SNikolay Aleksandrov{ 39f1054c65SNikolay Aleksandrov simple_if_init $h1 192.0.2.1/24 2001:db8:1::1/64 40f1054c65SNikolay Aleksandrov} 41f1054c65SNikolay Aleksandrov 42f1054c65SNikolay Aleksandrovh1_destroy() 43f1054c65SNikolay Aleksandrov{ 44f1054c65SNikolay Aleksandrov simple_if_fini $h1 192.0.2.1/24 2001:db8:1::1/64 45f1054c65SNikolay Aleksandrov} 46f1054c65SNikolay Aleksandrov 47f1054c65SNikolay Aleksandrovh2_create() 48f1054c65SNikolay Aleksandrov{ 49f1054c65SNikolay Aleksandrov simple_if_init $h2 192.0.2.2/24 2001:db8:1::2/64 50f1054c65SNikolay Aleksandrov} 51f1054c65SNikolay Aleksandrov 52f1054c65SNikolay Aleksandrovh2_destroy() 53f1054c65SNikolay Aleksandrov{ 54f1054c65SNikolay Aleksandrov simple_if_fini $h2 192.0.2.2/24 2001:db8:1::2/64 55f1054c65SNikolay Aleksandrov} 56f1054c65SNikolay Aleksandrov 57f1054c65SNikolay Aleksandrovswitch_create() 58f1054c65SNikolay Aleksandrov{ 59f1054c65SNikolay Aleksandrov ip link add dev br0 type bridge mcast_snooping 1 mcast_querier 1 60f1054c65SNikolay Aleksandrov 61f1054c65SNikolay Aleksandrov ip link set dev $swp1 master br0 62f1054c65SNikolay Aleksandrov ip link set dev $swp2 master br0 63f1054c65SNikolay Aleksandrov 64f1054c65SNikolay Aleksandrov ip link set dev br0 up 65f1054c65SNikolay Aleksandrov ip link set dev $swp1 up 66f1054c65SNikolay Aleksandrov ip link set dev $swp2 up 67f1054c65SNikolay Aleksandrov} 68f1054c65SNikolay Aleksandrov 69f1054c65SNikolay Aleksandrovswitch_destroy() 70f1054c65SNikolay Aleksandrov{ 71f1054c65SNikolay Aleksandrov ip link set dev $swp2 down 72f1054c65SNikolay Aleksandrov ip link set dev $swp1 down 73f1054c65SNikolay Aleksandrov 74f1054c65SNikolay Aleksandrov ip link del dev br0 75f1054c65SNikolay Aleksandrov} 76f1054c65SNikolay Aleksandrov 77f1054c65SNikolay Aleksandrovsetup_prepare() 78f1054c65SNikolay Aleksandrov{ 79f1054c65SNikolay Aleksandrov h1=${NETIFS[p1]} 80f1054c65SNikolay Aleksandrov swp1=${NETIFS[p2]} 81f1054c65SNikolay Aleksandrov 82f1054c65SNikolay Aleksandrov swp2=${NETIFS[p3]} 83f1054c65SNikolay Aleksandrov h2=${NETIFS[p4]} 84f1054c65SNikolay Aleksandrov 85f1054c65SNikolay Aleksandrov vrf_prepare 86f1054c65SNikolay Aleksandrov 87f1054c65SNikolay Aleksandrov h1_create 88f1054c65SNikolay Aleksandrov h2_create 89f1054c65SNikolay Aleksandrov 90f1054c65SNikolay Aleksandrov switch_create 91f1054c65SNikolay Aleksandrov} 92f1054c65SNikolay Aleksandrov 93f1054c65SNikolay Aleksandrovcleanup() 94f1054c65SNikolay Aleksandrov{ 95f1054c65SNikolay Aleksandrov pre_cleanup 96f1054c65SNikolay Aleksandrov 97f1054c65SNikolay Aleksandrov switch_destroy 98f1054c65SNikolay Aleksandrov 99f1054c65SNikolay Aleksandrov h2_destroy 100f1054c65SNikolay Aleksandrov h1_destroy 101f1054c65SNikolay Aleksandrov 102f1054c65SNikolay Aleksandrov vrf_cleanup 103f1054c65SNikolay Aleksandrov} 104f1054c65SNikolay Aleksandrov 1057afc9d8fSNikolay Aleksandrovv2reportleave_test() 106f1054c65SNikolay Aleksandrov{ 107f1054c65SNikolay Aleksandrov RET=0 108f1054c65SNikolay Aleksandrov ip address add dev $h2 $TEST_GROUP/32 autojoin 109f1054c65SNikolay Aleksandrov check_err $? "Could not join $TEST_GROUP" 110f1054c65SNikolay Aleksandrov 111f1054c65SNikolay Aleksandrov sleep 5 112f1054c65SNikolay Aleksandrov bridge mdb show dev br0 | grep $TEST_GROUP 1>/dev/null 1137afc9d8fSNikolay Aleksandrov check_err $? "IGMPv2 report didn't create mdb entry for $TEST_GROUP" 114f1054c65SNikolay Aleksandrov 11579ae3e25SNikolay Aleksandrov mcast_packet_test $TEST_GROUP_MAC 192.0.2.1 $TEST_GROUP $h1 $h2 116f1054c65SNikolay Aleksandrov check_fail $? "Traffic to $TEST_GROUP wasn't forwarded" 117f1054c65SNikolay Aleksandrov 1187afc9d8fSNikolay Aleksandrov log_test "IGMPv2 report $TEST_GROUP" 119f1054c65SNikolay Aleksandrov 120f1054c65SNikolay Aleksandrov RET=0 121f1054c65SNikolay Aleksandrov bridge mdb show dev br0 | grep $TEST_GROUP 1>/dev/null 122f1054c65SNikolay Aleksandrov check_err $? "mdb entry for $TEST_GROUP is missing" 123f1054c65SNikolay Aleksandrov 124f1054c65SNikolay Aleksandrov ip address del dev $h2 $TEST_GROUP/32 125f1054c65SNikolay Aleksandrov check_err $? "Could not leave $TEST_GROUP" 126f1054c65SNikolay Aleksandrov 127f1054c65SNikolay Aleksandrov sleep 5 128f1054c65SNikolay Aleksandrov bridge mdb show dev br0 | grep $TEST_GROUP 1>/dev/null 129f1054c65SNikolay Aleksandrov check_fail $? "Leave didn't delete mdb entry for $TEST_GROUP" 130f1054c65SNikolay Aleksandrov 13179ae3e25SNikolay Aleksandrov mcast_packet_test $TEST_GROUP_MAC 192.0.2.1 $TEST_GROUP $h1 $h2 132f1054c65SNikolay Aleksandrov check_err $? "Traffic to $TEST_GROUP was forwarded without mdb entry" 133f1054c65SNikolay Aleksandrov 1347afc9d8fSNikolay Aleksandrov log_test "IGMPv2 leave $TEST_GROUP" 135f1054c65SNikolay Aleksandrov} 136f1054c65SNikolay Aleksandrov 13798ae11cfSNikolay Aleksandrovv3include_prepare() 13898ae11cfSNikolay Aleksandrov{ 13998ae11cfSNikolay Aleksandrov local host1_if=$1 14098ae11cfSNikolay Aleksandrov local mac=$2 14198ae11cfSNikolay Aleksandrov local group=$3 14298ae11cfSNikolay Aleksandrov local X=("192.0.2.1" "192.0.2.2" "192.0.2.3") 14398ae11cfSNikolay Aleksandrov 14498ae11cfSNikolay Aleksandrov ip link set dev br0 type bridge mcast_igmp_version 3 14598ae11cfSNikolay Aleksandrov check_err $? "Could not change bridge IGMP version to 3" 14698ae11cfSNikolay Aleksandrov 14798ae11cfSNikolay Aleksandrov $MZ $host1_if -b $mac -c 1 -B $group -t ip "proto=2,p=$MZPKT_IS_INC" -q 14898ae11cfSNikolay Aleksandrov sleep 1 14998ae11cfSNikolay Aleksandrov bridge -j -d -s mdb show dev br0 \ 15098ae11cfSNikolay Aleksandrov | jq -e ".[].mdb[] | \ 15198ae11cfSNikolay Aleksandrov select(.grp == \"$TEST_GROUP\" and .source_list != null)" &>/dev/null 15298ae11cfSNikolay Aleksandrov check_err $? "Missing *,G entry with source list" 15398ae11cfSNikolay Aleksandrov bridge -j -d -s mdb show dev br0 \ 15498ae11cfSNikolay Aleksandrov | jq -e ".[].mdb[] | \ 15598ae11cfSNikolay Aleksandrov select(.grp == \"$TEST_GROUP\" and \ 15698ae11cfSNikolay Aleksandrov .source_list != null and .filter_mode == \"include\")" &>/dev/null 15798ae11cfSNikolay Aleksandrov check_err $? "Wrong *,G entry filter mode" 15895e6f430SNikolay Aleksandrov brmcast_check_sg_entries "is_include" "${X[@]}" 15998ae11cfSNikolay Aleksandrov} 16098ae11cfSNikolay Aleksandrov 161eecd8cfdSNikolay Aleksandrovv3exclude_prepare() 162eecd8cfdSNikolay Aleksandrov{ 163eecd8cfdSNikolay Aleksandrov local host1_if=$1 164eecd8cfdSNikolay Aleksandrov local mac=$2 165eecd8cfdSNikolay Aleksandrov local group=$3 166eecd8cfdSNikolay Aleksandrov local pkt=$4 167eecd8cfdSNikolay Aleksandrov local X=("192.0.2.1" "192.0.2.2") 168eecd8cfdSNikolay Aleksandrov local Y=("192.0.2.20" "192.0.2.21") 169eecd8cfdSNikolay Aleksandrov 170eecd8cfdSNikolay Aleksandrov v3include_prepare $host1_if $mac $group 171eecd8cfdSNikolay Aleksandrov 172eecd8cfdSNikolay Aleksandrov $MZ $host1_if -c 1 -b $mac -B $group -t ip "proto=2,p=$MZPKT_IS_EXC" -q 173eecd8cfdSNikolay Aleksandrov sleep 1 174eecd8cfdSNikolay Aleksandrov bridge -j -d -s mdb show dev br0 \ 175eecd8cfdSNikolay Aleksandrov | jq -e ".[].mdb[] | \ 176eecd8cfdSNikolay Aleksandrov select(.grp == \"$TEST_GROUP\" and \ 177eecd8cfdSNikolay Aleksandrov .source_list != null and .filter_mode == \"exclude\")" &>/dev/null 178eecd8cfdSNikolay Aleksandrov check_err $? "Wrong *,G entry filter mode" 179eecd8cfdSNikolay Aleksandrov 18095e6f430SNikolay Aleksandrov brmcast_check_sg_entries "is_exclude" "${X[@]}" "${Y[@]}" 181eecd8cfdSNikolay Aleksandrov 18295e6f430SNikolay Aleksandrov brmcast_check_sg_state 0 "${X[@]}" 18395e6f430SNikolay Aleksandrov brmcast_check_sg_state 1 "${Y[@]}" 184eecd8cfdSNikolay Aleksandrov 185eecd8cfdSNikolay Aleksandrov bridge -j -d -s mdb show dev br0 \ 186eecd8cfdSNikolay Aleksandrov | jq -e ".[].mdb[] | \ 187eecd8cfdSNikolay Aleksandrov select(.grp == \"$TEST_GROUP\" and \ 188eecd8cfdSNikolay Aleksandrov .source_list != null and 189eecd8cfdSNikolay Aleksandrov .source_list[].address == \"192.0.2.3\")" &>/dev/null 190eecd8cfdSNikolay Aleksandrov check_fail $? "Wrong *,G entry source list, 192.0.2.3 entry still exists" 191eecd8cfdSNikolay Aleksandrov} 192eecd8cfdSNikolay Aleksandrov 19398ae11cfSNikolay Aleksandrovv3cleanup() 19498ae11cfSNikolay Aleksandrov{ 19598ae11cfSNikolay Aleksandrov local port=$1 19698ae11cfSNikolay Aleksandrov local group=$2 19798ae11cfSNikolay Aleksandrov 19898ae11cfSNikolay Aleksandrov bridge mdb del dev br0 port $port grp $group 19998ae11cfSNikolay Aleksandrov ip link set dev br0 type bridge mcast_igmp_version 2 20098ae11cfSNikolay Aleksandrov} 20198ae11cfSNikolay Aleksandrov 20298ae11cfSNikolay Aleksandrovv3include_test() 20398ae11cfSNikolay Aleksandrov{ 20498ae11cfSNikolay Aleksandrov RET=0 20598ae11cfSNikolay Aleksandrov local X=("192.0.2.1" "192.0.2.2" "192.0.2.3") 20698ae11cfSNikolay Aleksandrov 20798ae11cfSNikolay Aleksandrov v3include_prepare $h1 $ALL_MAC $ALL_GROUP 20898ae11cfSNikolay Aleksandrov 20995e6f430SNikolay Aleksandrov brmcast_check_sg_state 0 "${X[@]}" 21098ae11cfSNikolay Aleksandrov 21195e6f430SNikolay Aleksandrov brmcast_check_sg_fwding 1 "${X[@]}" 21295e6f430SNikolay Aleksandrov brmcast_check_sg_fwding 0 "192.0.2.100" 21398ae11cfSNikolay Aleksandrov 21498ae11cfSNikolay Aleksandrov log_test "IGMPv3 report $TEST_GROUP is_include" 21598ae11cfSNikolay Aleksandrov 21698ae11cfSNikolay Aleksandrov v3cleanup $swp1 $TEST_GROUP 21798ae11cfSNikolay Aleksandrov} 21898ae11cfSNikolay Aleksandrov 21998ae11cfSNikolay Aleksandrovv3inc_allow_test() 22098ae11cfSNikolay Aleksandrov{ 22198ae11cfSNikolay Aleksandrov RET=0 22298ae11cfSNikolay Aleksandrov local X=("192.0.2.10" "192.0.2.11" "192.0.2.12") 22398ae11cfSNikolay Aleksandrov 22498ae11cfSNikolay Aleksandrov v3include_prepare $h1 $ALL_MAC $ALL_GROUP 22598ae11cfSNikolay Aleksandrov 22698ae11cfSNikolay Aleksandrov $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_ALLOW" -q 22798ae11cfSNikolay Aleksandrov sleep 1 22895e6f430SNikolay Aleksandrov brmcast_check_sg_entries "allow" "${X[@]}" 22998ae11cfSNikolay Aleksandrov 23095e6f430SNikolay Aleksandrov brmcast_check_sg_state 0 "${X[@]}" 23198ae11cfSNikolay Aleksandrov 23295e6f430SNikolay Aleksandrov brmcast_check_sg_fwding 1 "${X[@]}" 23395e6f430SNikolay Aleksandrov brmcast_check_sg_fwding 0 "192.0.2.100" 23498ae11cfSNikolay Aleksandrov 23598ae11cfSNikolay Aleksandrov log_test "IGMPv3 report $TEST_GROUP include -> allow" 23698ae11cfSNikolay Aleksandrov 23798ae11cfSNikolay Aleksandrov v3cleanup $swp1 $TEST_GROUP 23898ae11cfSNikolay Aleksandrov} 23998ae11cfSNikolay Aleksandrov 24047021771SNikolay Aleksandrovv3inc_is_include_test() 24147021771SNikolay Aleksandrov{ 24247021771SNikolay Aleksandrov RET=0 24347021771SNikolay Aleksandrov local X=("192.0.2.10" "192.0.2.11" "192.0.2.12") 24447021771SNikolay Aleksandrov 24547021771SNikolay Aleksandrov v3include_prepare $h1 $ALL_MAC $ALL_GROUP 24647021771SNikolay Aleksandrov 24747021771SNikolay Aleksandrov $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_IS_INC2" -q 24847021771SNikolay Aleksandrov sleep 1 24995e6f430SNikolay Aleksandrov brmcast_check_sg_entries "is_include" "${X[@]}" 25047021771SNikolay Aleksandrov 25195e6f430SNikolay Aleksandrov brmcast_check_sg_state 0 "${X[@]}" 25247021771SNikolay Aleksandrov 25395e6f430SNikolay Aleksandrov brmcast_check_sg_fwding 1 "${X[@]}" 25495e6f430SNikolay Aleksandrov brmcast_check_sg_fwding 0 "192.0.2.100" 25547021771SNikolay Aleksandrov 25647021771SNikolay Aleksandrov log_test "IGMPv3 report $TEST_GROUP include -> is_include" 25747021771SNikolay Aleksandrov 25847021771SNikolay Aleksandrov v3cleanup $swp1 $TEST_GROUP 25947021771SNikolay Aleksandrov} 26047021771SNikolay Aleksandrov 2613c8b9fdaSNikolay Aleksandrovv3inc_is_exclude_test() 2623c8b9fdaSNikolay Aleksandrov{ 2633c8b9fdaSNikolay Aleksandrov RET=0 2643c8b9fdaSNikolay Aleksandrov 265eecd8cfdSNikolay Aleksandrov v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP 2663c8b9fdaSNikolay Aleksandrov 26795e6f430SNikolay Aleksandrov brmcast_check_sg_fwding 1 "${X[@]}" 192.0.2.100 26895e6f430SNikolay Aleksandrov brmcast_check_sg_fwding 0 "${Y[@]}" 2693c8b9fdaSNikolay Aleksandrov 2703c8b9fdaSNikolay Aleksandrov log_test "IGMPv3 report $TEST_GROUP include -> is_exclude" 2713c8b9fdaSNikolay Aleksandrov 2723c8b9fdaSNikolay Aleksandrov v3cleanup $swp1 $TEST_GROUP 2733c8b9fdaSNikolay Aleksandrov} 2743c8b9fdaSNikolay Aleksandrov 275735af7beSNikolay Aleksandrovv3inc_to_exclude_test() 276735af7beSNikolay Aleksandrov{ 277735af7beSNikolay Aleksandrov RET=0 278735af7beSNikolay Aleksandrov local X=("192.0.2.1") 279735af7beSNikolay Aleksandrov local Y=("192.0.2.20" "192.0.2.30") 280735af7beSNikolay Aleksandrov 281735af7beSNikolay Aleksandrov v3include_prepare $h1 $ALL_MAC $ALL_GROUP 282735af7beSNikolay Aleksandrov 283735af7beSNikolay Aleksandrov ip link set dev br0 type bridge mcast_last_member_interval 500 284735af7beSNikolay Aleksandrov check_err $? "Could not change mcast_last_member_interval to 5s" 285735af7beSNikolay Aleksandrov 286735af7beSNikolay Aleksandrov $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_TO_EXC" -q 287735af7beSNikolay Aleksandrov sleep 1 288735af7beSNikolay Aleksandrov bridge -j -d -s mdb show dev br0 \ 289735af7beSNikolay Aleksandrov | jq -e ".[].mdb[] | \ 290735af7beSNikolay Aleksandrov select(.grp == \"$TEST_GROUP\" and \ 291735af7beSNikolay Aleksandrov .source_list != null and .filter_mode == \"exclude\")" &>/dev/null 292735af7beSNikolay Aleksandrov check_err $? "Wrong *,G entry filter mode" 293735af7beSNikolay Aleksandrov 29495e6f430SNikolay Aleksandrov brmcast_check_sg_entries "to_exclude" "${X[@]}" "${Y[@]}" 295735af7beSNikolay Aleksandrov 29695e6f430SNikolay Aleksandrov brmcast_check_sg_state 0 "${X[@]}" 29795e6f430SNikolay Aleksandrov brmcast_check_sg_state 1 "${Y[@]}" 298735af7beSNikolay Aleksandrov 299735af7beSNikolay Aleksandrov bridge -j -d -s mdb show dev br0 \ 300735af7beSNikolay Aleksandrov | jq -e ".[].mdb[] | \ 301735af7beSNikolay Aleksandrov select(.grp == \"$TEST_GROUP\" and \ 302735af7beSNikolay Aleksandrov .source_list != null and 303735af7beSNikolay Aleksandrov .source_list[].address == \"192.0.2.2\")" &>/dev/null 304735af7beSNikolay Aleksandrov check_fail $? "Wrong *,G entry source list, 192.0.2.2 entry still exists" 305735af7beSNikolay Aleksandrov bridge -j -d -s mdb show dev br0 \ 306735af7beSNikolay Aleksandrov | jq -e ".[].mdb[] | \ 307735af7beSNikolay Aleksandrov select(.grp == \"$TEST_GROUP\" and \ 308735af7beSNikolay Aleksandrov .source_list != null and 309735af7beSNikolay Aleksandrov .source_list[].address == \"192.0.2.21\")" &>/dev/null 310735af7beSNikolay Aleksandrov check_fail $? "Wrong *,G entry source list, 192.0.2.21 entry still exists" 311735af7beSNikolay Aleksandrov 31295e6f430SNikolay Aleksandrov brmcast_check_sg_fwding 1 "${X[@]}" 192.0.2.100 31395e6f430SNikolay Aleksandrov brmcast_check_sg_fwding 0 "${Y[@]}" 314735af7beSNikolay Aleksandrov 315735af7beSNikolay Aleksandrov log_test "IGMPv3 report $TEST_GROUP include -> to_exclude" 316735af7beSNikolay Aleksandrov 317735af7beSNikolay Aleksandrov ip link set dev br0 type bridge mcast_last_member_interval 100 318735af7beSNikolay Aleksandrov 319735af7beSNikolay Aleksandrov v3cleanup $swp1 $TEST_GROUP 320735af7beSNikolay Aleksandrov} 321735af7beSNikolay Aleksandrov 322eecd8cfdSNikolay Aleksandrovv3exc_allow_test() 323eecd8cfdSNikolay Aleksandrov{ 324eecd8cfdSNikolay Aleksandrov RET=0 325eecd8cfdSNikolay Aleksandrov local X=("192.0.2.1" "192.0.2.2" "192.0.2.20" "192.0.2.30") 326eecd8cfdSNikolay Aleksandrov local Y=("192.0.2.21") 327eecd8cfdSNikolay Aleksandrov 328eecd8cfdSNikolay Aleksandrov v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP 329eecd8cfdSNikolay Aleksandrov 330eecd8cfdSNikolay Aleksandrov $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_ALLOW2" -q 331eecd8cfdSNikolay Aleksandrov sleep 1 33295e6f430SNikolay Aleksandrov brmcast_check_sg_entries "allow" "${X[@]}" "${Y[@]}" 333eecd8cfdSNikolay Aleksandrov 33495e6f430SNikolay Aleksandrov brmcast_check_sg_state 0 "${X[@]}" 33595e6f430SNikolay Aleksandrov brmcast_check_sg_state 1 "${Y[@]}" 336eecd8cfdSNikolay Aleksandrov 33795e6f430SNikolay Aleksandrov brmcast_check_sg_fwding 1 "${X[@]}" 192.0.2.100 33895e6f430SNikolay Aleksandrov brmcast_check_sg_fwding 0 "${Y[@]}" 339eecd8cfdSNikolay Aleksandrov 340eecd8cfdSNikolay Aleksandrov log_test "IGMPv3 report $TEST_GROUP exclude -> allow" 341eecd8cfdSNikolay Aleksandrov 342eecd8cfdSNikolay Aleksandrov v3cleanup $swp1 $TEST_GROUP 343eecd8cfdSNikolay Aleksandrov} 344eecd8cfdSNikolay Aleksandrov 345e7e7ab7cSNikolay Aleksandrovv3exc_is_include_test() 346e7e7ab7cSNikolay Aleksandrov{ 347e7e7ab7cSNikolay Aleksandrov RET=0 348e7e7ab7cSNikolay Aleksandrov local X=("192.0.2.1" "192.0.2.2" "192.0.2.20" "192.0.2.30") 349e7e7ab7cSNikolay Aleksandrov local Y=("192.0.2.21") 350e7e7ab7cSNikolay Aleksandrov 351e7e7ab7cSNikolay Aleksandrov v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP 352e7e7ab7cSNikolay Aleksandrov 353e7e7ab7cSNikolay Aleksandrov $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_IS_INC3" -q 354e7e7ab7cSNikolay Aleksandrov sleep 1 35595e6f430SNikolay Aleksandrov brmcast_check_sg_entries "is_include" "${X[@]}" "${Y[@]}" 356e7e7ab7cSNikolay Aleksandrov 35795e6f430SNikolay Aleksandrov brmcast_check_sg_state 0 "${X[@]}" 35895e6f430SNikolay Aleksandrov brmcast_check_sg_state 1 "${Y[@]}" 359e7e7ab7cSNikolay Aleksandrov 36095e6f430SNikolay Aleksandrov brmcast_check_sg_fwding 1 "${X[@]}" 192.0.2.100 36195e6f430SNikolay Aleksandrov brmcast_check_sg_fwding 0 "${Y[@]}" 362e7e7ab7cSNikolay Aleksandrov 363e7e7ab7cSNikolay Aleksandrov log_test "IGMPv3 report $TEST_GROUP exclude -> is_include" 364e7e7ab7cSNikolay Aleksandrov 365e7e7ab7cSNikolay Aleksandrov v3cleanup $swp1 $TEST_GROUP 366e7e7ab7cSNikolay Aleksandrov} 367e7e7ab7cSNikolay Aleksandrov 3687b4f7138SNikolay Aleksandrovv3exc_is_exclude_test() 3697b4f7138SNikolay Aleksandrov{ 3707b4f7138SNikolay Aleksandrov RET=0 3717b4f7138SNikolay Aleksandrov local X=("192.0.2.30") 3727b4f7138SNikolay Aleksandrov local Y=("192.0.2.20") 3737b4f7138SNikolay Aleksandrov 3747b4f7138SNikolay Aleksandrov v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP 3757b4f7138SNikolay Aleksandrov 3767b4f7138SNikolay Aleksandrov $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_IS_EXC2" -q 3777b4f7138SNikolay Aleksandrov sleep 1 37895e6f430SNikolay Aleksandrov brmcast_check_sg_entries "is_exclude" "${X[@]}" "${Y[@]}" 3797b4f7138SNikolay Aleksandrov 38095e6f430SNikolay Aleksandrov brmcast_check_sg_state 0 "${X[@]}" 38195e6f430SNikolay Aleksandrov brmcast_check_sg_state 1 "${Y[@]}" 3827b4f7138SNikolay Aleksandrov 38395e6f430SNikolay Aleksandrov brmcast_check_sg_fwding 1 "${X[@]}" 192.0.2.100 38495e6f430SNikolay Aleksandrov brmcast_check_sg_fwding 0 "${Y[@]}" 3857b4f7138SNikolay Aleksandrov 3867b4f7138SNikolay Aleksandrov log_test "IGMPv3 report $TEST_GROUP exclude -> is_exclude" 3877b4f7138SNikolay Aleksandrov 3887b4f7138SNikolay Aleksandrov v3cleanup $swp1 $TEST_GROUP 3897b4f7138SNikolay Aleksandrov} 3907b4f7138SNikolay Aleksandrov 39165bfc146SNikolay Aleksandrovv3exc_to_exclude_test() 39265bfc146SNikolay Aleksandrov{ 39365bfc146SNikolay Aleksandrov RET=0 39465bfc146SNikolay Aleksandrov local X=("192.0.2.1" "192.0.2.30") 39565bfc146SNikolay Aleksandrov local Y=("192.0.2.20") 39665bfc146SNikolay Aleksandrov 39765bfc146SNikolay Aleksandrov v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP 39865bfc146SNikolay Aleksandrov 39965bfc146SNikolay Aleksandrov ip link set dev br0 type bridge mcast_last_member_interval 500 40065bfc146SNikolay Aleksandrov check_err $? "Could not change mcast_last_member_interval to 5s" 40165bfc146SNikolay Aleksandrov 40265bfc146SNikolay Aleksandrov $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_TO_EXC" -q 40365bfc146SNikolay Aleksandrov sleep 1 40495e6f430SNikolay Aleksandrov brmcast_check_sg_entries "to_exclude" "${X[@]}" "${Y[@]}" 40565bfc146SNikolay Aleksandrov 40695e6f430SNikolay Aleksandrov brmcast_check_sg_state 0 "${X[@]}" 40795e6f430SNikolay Aleksandrov brmcast_check_sg_state 1 "${Y[@]}" 40865bfc146SNikolay Aleksandrov 40995e6f430SNikolay Aleksandrov brmcast_check_sg_fwding 1 "${X[@]}" 192.0.2.100 41095e6f430SNikolay Aleksandrov brmcast_check_sg_fwding 0 "${Y[@]}" 41165bfc146SNikolay Aleksandrov 41265bfc146SNikolay Aleksandrov log_test "IGMPv3 report $TEST_GROUP exclude -> to_exclude" 41365bfc146SNikolay Aleksandrov 41465bfc146SNikolay Aleksandrov ip link set dev br0 type bridge mcast_last_member_interval 100 41565bfc146SNikolay Aleksandrov 41665bfc146SNikolay Aleksandrov v3cleanup $swp1 $TEST_GROUP 41765bfc146SNikolay Aleksandrov} 41865bfc146SNikolay Aleksandrov 41980899f1bSNikolay Aleksandrovv3inc_block_test() 42080899f1bSNikolay Aleksandrov{ 42180899f1bSNikolay Aleksandrov RET=0 42280899f1bSNikolay Aleksandrov local X=("192.0.2.2" "192.0.2.3") 42380899f1bSNikolay Aleksandrov 42480899f1bSNikolay Aleksandrov v3include_prepare $h1 $ALL_MAC $ALL_GROUP 42580899f1bSNikolay Aleksandrov 42680899f1bSNikolay Aleksandrov $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_BLOCK" -q 42780899f1bSNikolay Aleksandrov # make sure the lowered timers have expired (by default 2 seconds) 42880899f1bSNikolay Aleksandrov sleep 3 42995e6f430SNikolay Aleksandrov brmcast_check_sg_entries "block" "${X[@]}" 43080899f1bSNikolay Aleksandrov 43195e6f430SNikolay Aleksandrov brmcast_check_sg_state 0 "${X[@]}" 43280899f1bSNikolay Aleksandrov 43380899f1bSNikolay Aleksandrov bridge -j -d -s mdb show dev br0 \ 43480899f1bSNikolay Aleksandrov | jq -e ".[].mdb[] | \ 43580899f1bSNikolay Aleksandrov select(.grp == \"$TEST_GROUP\" and \ 43680899f1bSNikolay Aleksandrov .source_list != null and 43780899f1bSNikolay Aleksandrov .source_list[].address == \"192.0.2.1\")" &>/dev/null 43880899f1bSNikolay Aleksandrov check_fail $? "Wrong *,G entry source list, 192.0.2.1 entry still exists" 43980899f1bSNikolay Aleksandrov 44095e6f430SNikolay Aleksandrov brmcast_check_sg_fwding 1 "${X[@]}" 44195e6f430SNikolay Aleksandrov brmcast_check_sg_fwding 0 "192.0.2.100" 44280899f1bSNikolay Aleksandrov 44380899f1bSNikolay Aleksandrov log_test "IGMPv3 report $TEST_GROUP include -> block" 44480899f1bSNikolay Aleksandrov 44580899f1bSNikolay Aleksandrov v3cleanup $swp1 $TEST_GROUP 44680899f1bSNikolay Aleksandrov} 44780899f1bSNikolay Aleksandrov 4489eb58e07SNikolay Aleksandrovv3exc_block_test() 4499eb58e07SNikolay Aleksandrov{ 4509eb58e07SNikolay Aleksandrov RET=0 4519eb58e07SNikolay Aleksandrov local X=("192.0.2.1" "192.0.2.2" "192.0.2.30") 4529eb58e07SNikolay Aleksandrov local Y=("192.0.2.20" "192.0.2.21") 4539eb58e07SNikolay Aleksandrov 4549eb58e07SNikolay Aleksandrov v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP 4559eb58e07SNikolay Aleksandrov 4569eb58e07SNikolay Aleksandrov ip link set dev br0 type bridge mcast_last_member_interval 500 4579eb58e07SNikolay Aleksandrov check_err $? "Could not change mcast_last_member_interval to 5s" 4589eb58e07SNikolay Aleksandrov 4599eb58e07SNikolay Aleksandrov $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_BLOCK" -q 4609eb58e07SNikolay Aleksandrov sleep 1 46195e6f430SNikolay Aleksandrov brmcast_check_sg_entries "block" "${X[@]}" "${Y[@]}" 4629eb58e07SNikolay Aleksandrov 46395e6f430SNikolay Aleksandrov brmcast_check_sg_state 0 "${X[@]}" 46495e6f430SNikolay Aleksandrov brmcast_check_sg_state 1 "${Y[@]}" 4659eb58e07SNikolay Aleksandrov 46695e6f430SNikolay Aleksandrov brmcast_check_sg_fwding 1 "${X[@]}" 192.0.2.100 46795e6f430SNikolay Aleksandrov brmcast_check_sg_fwding 0 "${Y[@]}" 4689eb58e07SNikolay Aleksandrov 4699eb58e07SNikolay Aleksandrov log_test "IGMPv3 report $TEST_GROUP exclude -> block" 4709eb58e07SNikolay Aleksandrov 4719eb58e07SNikolay Aleksandrov ip link set dev br0 type bridge mcast_last_member_interval 100 4729eb58e07SNikolay Aleksandrov 4739eb58e07SNikolay Aleksandrov v3cleanup $swp1 $TEST_GROUP 4749eb58e07SNikolay Aleksandrov} 4759eb58e07SNikolay Aleksandrov 47618f66c96SNikolay Aleksandrovv3exc_timeout_test() 47718f66c96SNikolay Aleksandrov{ 47818f66c96SNikolay Aleksandrov RET=0 47918f66c96SNikolay Aleksandrov local X=("192.0.2.20" "192.0.2.30") 48018f66c96SNikolay Aleksandrov 481*76282afaSNikolay Aleksandrov # GMI should be 5 seconds 48234d7ecb3SNikolay Aleksandrov ip link set dev br0 type bridge mcast_query_interval 100 \ 48334d7ecb3SNikolay Aleksandrov mcast_query_response_interval 100 \ 484*76282afaSNikolay Aleksandrov mcast_membership_interval 500 48518f66c96SNikolay Aleksandrov 48618f66c96SNikolay Aleksandrov v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP 48734d7ecb3SNikolay Aleksandrov ip link set dev br0 type bridge mcast_query_interval 500 \ 48834d7ecb3SNikolay Aleksandrov mcast_query_response_interval 500 \ 48934d7ecb3SNikolay Aleksandrov mcast_membership_interval 1500 49034d7ecb3SNikolay Aleksandrov 49118f66c96SNikolay Aleksandrov $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_ALLOW2" -q 492*76282afaSNikolay Aleksandrov sleep 5 49318f66c96SNikolay Aleksandrov bridge -j -d -s mdb show dev br0 \ 49418f66c96SNikolay Aleksandrov | jq -e ".[].mdb[] | \ 49518f66c96SNikolay Aleksandrov select(.grp == \"$TEST_GROUP\" and \ 49618f66c96SNikolay Aleksandrov .source_list != null and .filter_mode == \"include\")" &>/dev/null 49718f66c96SNikolay Aleksandrov check_err $? "Wrong *,G entry filter mode" 49818f66c96SNikolay Aleksandrov 49918f66c96SNikolay Aleksandrov bridge -j -d -s mdb show dev br0 \ 50018f66c96SNikolay Aleksandrov | jq -e ".[].mdb[] | \ 50118f66c96SNikolay Aleksandrov select(.grp == \"$TEST_GROUP\" and \ 50218f66c96SNikolay Aleksandrov .source_list != null and 50318f66c96SNikolay Aleksandrov .source_list[].address == \"192.0.2.1\")" &>/dev/null 50418f66c96SNikolay Aleksandrov check_fail $? "Wrong *,G entry source list, 192.0.2.1 entry still exists" 50518f66c96SNikolay Aleksandrov bridge -j -d -s mdb show dev br0 \ 50618f66c96SNikolay Aleksandrov | jq -e ".[].mdb[] | \ 50718f66c96SNikolay Aleksandrov select(.grp == \"$TEST_GROUP\" and \ 50818f66c96SNikolay Aleksandrov .source_list != null and 50918f66c96SNikolay Aleksandrov .source_list[].address == \"192.0.2.2\")" &>/dev/null 51018f66c96SNikolay Aleksandrov check_fail $? "Wrong *,G entry source list, 192.0.2.2 entry still exists" 51118f66c96SNikolay Aleksandrov 51295e6f430SNikolay Aleksandrov brmcast_check_sg_entries "allow" "${X[@]}" 51318f66c96SNikolay Aleksandrov 51495e6f430SNikolay Aleksandrov brmcast_check_sg_state 0 "${X[@]}" 51518f66c96SNikolay Aleksandrov 51695e6f430SNikolay Aleksandrov brmcast_check_sg_fwding 1 "${X[@]}" 51795e6f430SNikolay Aleksandrov brmcast_check_sg_fwding 0 192.0.2.100 51818f66c96SNikolay Aleksandrov 51918f66c96SNikolay Aleksandrov log_test "IGMPv3 group $TEST_GROUP exclude timeout" 52018f66c96SNikolay Aleksandrov 52118f66c96SNikolay Aleksandrov ip link set dev br0 type bridge mcast_query_interval 12500 \ 52234d7ecb3SNikolay Aleksandrov mcast_query_response_interval 1000 \ 52334d7ecb3SNikolay Aleksandrov mcast_membership_interval 26000 52418f66c96SNikolay Aleksandrov 52518f66c96SNikolay Aleksandrov v3cleanup $swp1 $TEST_GROUP 52618f66c96SNikolay Aleksandrov} 52718f66c96SNikolay Aleksandrov 528414ea375SNikolay Aleksandrovv3star_ex_auto_add_test() 529414ea375SNikolay Aleksandrov{ 530414ea375SNikolay Aleksandrov RET=0 531414ea375SNikolay Aleksandrov 532414ea375SNikolay Aleksandrov v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP 533414ea375SNikolay Aleksandrov 534414ea375SNikolay Aleksandrov $MZ $h2 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_IS_INC" -q 535414ea375SNikolay Aleksandrov sleep 1 536414ea375SNikolay Aleksandrov bridge -j -d -s mdb show dev br0 \ 537414ea375SNikolay Aleksandrov | jq -e ".[].mdb[] | \ 538414ea375SNikolay Aleksandrov select(.grp == \"$TEST_GROUP\" and .src == \"192.0.2.3\" and \ 539414ea375SNikolay Aleksandrov .port == \"$swp1\")" &>/dev/null 540414ea375SNikolay Aleksandrov check_err $? "S,G entry for *,G port doesn't exist" 541414ea375SNikolay Aleksandrov 542414ea375SNikolay Aleksandrov bridge -j -d -s mdb show dev br0 \ 543414ea375SNikolay Aleksandrov | jq -e ".[].mdb[] | \ 544414ea375SNikolay Aleksandrov select(.grp == \"$TEST_GROUP\" and .src == \"192.0.2.3\" and \ 545414ea375SNikolay Aleksandrov .port == \"$swp1\" and \ 546414ea375SNikolay Aleksandrov .flags[] == \"added_by_star_ex\")" &>/dev/null 547414ea375SNikolay Aleksandrov check_err $? "Auto-added S,G entry doesn't have added_by_star_ex flag" 548414ea375SNikolay Aleksandrov 54995e6f430SNikolay Aleksandrov brmcast_check_sg_fwding 1 192.0.2.3 550414ea375SNikolay Aleksandrov 551414ea375SNikolay Aleksandrov log_test "IGMPv3 S,G port entry automatic add to a *,G port" 552414ea375SNikolay Aleksandrov 553414ea375SNikolay Aleksandrov v3cleanup $swp1 $TEST_GROUP 554414ea375SNikolay Aleksandrov v3cleanup $swp2 $TEST_GROUP 555414ea375SNikolay Aleksandrov} 556414ea375SNikolay Aleksandrov 557f1054c65SNikolay Aleksandrovtrap cleanup EXIT 558f1054c65SNikolay Aleksandrov 559f1054c65SNikolay Aleksandrovsetup_prepare 560f1054c65SNikolay Aleksandrovsetup_wait 561f1054c65SNikolay Aleksandrov 562f1054c65SNikolay Aleksandrovtests_run 563f1054c65SNikolay Aleksandrov 564f1054c65SNikolay Aleksandrovexit $EXIT_STATUS 565