xref: /openbmc/linux/tools/testing/selftests/net/forwarding/bridge_igmp.sh (revision b181f7029bd71238ac2754ce7052dffd69432085)
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