xref: /openbmc/linux/tools/testing/selftests/net/forwarding/bridge_mdb.sh (revision c595db6d7c8bcf87ef42204391fa890e5950e566)
1b6d00da0SIdo Schimmel#!/bin/bash
2b6d00da0SIdo Schimmel# SPDX-License-Identifier: GPL-2.0
3b6d00da0SIdo Schimmel
4b6d00da0SIdo Schimmel# +-----------------------+                          +------------------------+
5b6d00da0SIdo Schimmel# | H1 (vrf)              |                          | H2 (vrf)               |
6b6d00da0SIdo Schimmel# | + $h1.10              |                          | + $h2.10               |
7b6d00da0SIdo Schimmel# | | 192.0.2.1/28        |                          | | 192.0.2.2/28         |
8b6d00da0SIdo Schimmel# | | 2001:db8:1::1/64    |                          | | 2001:db8:1::2/64     |
9b6d00da0SIdo Schimmel# | |                     |                          | |                      |
10b6d00da0SIdo Schimmel# | |  + $h1.20           |                          | |  + $h2.20            |
11b6d00da0SIdo Schimmel# | \  | 198.51.100.1/24  |                          | \  | 198.51.100.2/24   |
12b6d00da0SIdo Schimmel# |  \ | 2001:db8:2::1/64 |                          |  \ | 2001:db8:2::2/64  |
13b6d00da0SIdo Schimmel# |   \|                  |                          |   \|                   |
14b6d00da0SIdo Schimmel# |    + $h1              |                          |    + $h2               |
15b6d00da0SIdo Schimmel# +----|------------------+                          +----|-------------------+
16b6d00da0SIdo Schimmel#      |                                                  |
17b6d00da0SIdo Schimmel# +----|--------------------------------------------------|-------------------+
18b6d00da0SIdo Schimmel# | SW |                                                  |                   |
19b6d00da0SIdo Schimmel# | +--|--------------------------------------------------|-----------------+ |
20b6d00da0SIdo Schimmel# | |  + $swp1                   BR0 (802.1q)             + $swp2           | |
21b6d00da0SIdo Schimmel# | |     vid 10                                             vid 10         | |
22b6d00da0SIdo Schimmel# | |     vid 20                                             vid 20         | |
23b6d00da0SIdo Schimmel# | |                                                                       | |
24b6d00da0SIdo Schimmel# | +-----------------------------------------------------------------------+ |
25b6d00da0SIdo Schimmel# +---------------------------------------------------------------------------+
26b6d00da0SIdo Schimmel
27b6d00da0SIdo SchimmelALL_TESTS="
28b6d00da0SIdo Schimmel	cfg_test
29b6d00da0SIdo Schimmel	fwd_test
30b6d00da0SIdo Schimmel	ctrl_test
31b6d00da0SIdo Schimmel"
32b6d00da0SIdo Schimmel
33b6d00da0SIdo SchimmelNUM_NETIFS=4
34b6d00da0SIdo Schimmelsource lib.sh
35b6d00da0SIdo Schimmelsource tc_common.sh
36b6d00da0SIdo Schimmel
37b6d00da0SIdo Schimmelh1_create()
38b6d00da0SIdo Schimmel{
39b6d00da0SIdo Schimmel	simple_if_init $h1
40b6d00da0SIdo Schimmel	vlan_create $h1 10 v$h1 192.0.2.1/28 2001:db8:1::1/64
41b6d00da0SIdo Schimmel	vlan_create $h1 20 v$h1 198.51.100.1/24 2001:db8:2::1/64
42b6d00da0SIdo Schimmel}
43b6d00da0SIdo Schimmel
44b6d00da0SIdo Schimmelh1_destroy()
45b6d00da0SIdo Schimmel{
46b6d00da0SIdo Schimmel	vlan_destroy $h1 20
47b6d00da0SIdo Schimmel	vlan_destroy $h1 10
48b6d00da0SIdo Schimmel	simple_if_fini $h1
49b6d00da0SIdo Schimmel}
50b6d00da0SIdo Schimmel
51b6d00da0SIdo Schimmelh2_create()
52b6d00da0SIdo Schimmel{
53b6d00da0SIdo Schimmel	simple_if_init $h2
54b6d00da0SIdo Schimmel	vlan_create $h2 10 v$h2 192.0.2.2/28
55b6d00da0SIdo Schimmel	vlan_create $h2 20 v$h2 198.51.100.2/24
56b6d00da0SIdo Schimmel}
57b6d00da0SIdo Schimmel
58b6d00da0SIdo Schimmelh2_destroy()
59b6d00da0SIdo Schimmel{
60b6d00da0SIdo Schimmel	vlan_destroy $h2 20
61b6d00da0SIdo Schimmel	vlan_destroy $h2 10
62b6d00da0SIdo Schimmel	simple_if_fini $h2
63b6d00da0SIdo Schimmel}
64b6d00da0SIdo Schimmel
65b6d00da0SIdo Schimmelswitch_create()
66b6d00da0SIdo Schimmel{
67b6d00da0SIdo Schimmel	ip link add name br0 type bridge vlan_filtering 1 vlan_default_pvid 0 \
68b6d00da0SIdo Schimmel		mcast_snooping 1 mcast_igmp_version 3 mcast_mld_version 2
69b6d00da0SIdo Schimmel	bridge vlan add vid 10 dev br0 self
70b6d00da0SIdo Schimmel	bridge vlan add vid 20 dev br0 self
71b6d00da0SIdo Schimmel	ip link set dev br0 up
72b6d00da0SIdo Schimmel
73b6d00da0SIdo Schimmel	ip link set dev $swp1 master br0
74b6d00da0SIdo Schimmel	ip link set dev $swp1 up
75b6d00da0SIdo Schimmel	bridge vlan add vid 10 dev $swp1
76b6d00da0SIdo Schimmel	bridge vlan add vid 20 dev $swp1
77b6d00da0SIdo Schimmel
78b6d00da0SIdo Schimmel	ip link set dev $swp2 master br0
79b6d00da0SIdo Schimmel	ip link set dev $swp2 up
80b6d00da0SIdo Schimmel	bridge vlan add vid 10 dev $swp2
81b6d00da0SIdo Schimmel	bridge vlan add vid 20 dev $swp2
82b6d00da0SIdo Schimmel
83b6d00da0SIdo Schimmel	tc qdisc add dev br0 clsact
84b6d00da0SIdo Schimmel	tc qdisc add dev $h2 clsact
85b6d00da0SIdo Schimmel}
86b6d00da0SIdo Schimmel
87b6d00da0SIdo Schimmelswitch_destroy()
88b6d00da0SIdo Schimmel{
89b6d00da0SIdo Schimmel	tc qdisc del dev $h2 clsact
90b6d00da0SIdo Schimmel	tc qdisc del dev br0 clsact
91b6d00da0SIdo Schimmel
92b6d00da0SIdo Schimmel	bridge vlan del vid 20 dev $swp2
93b6d00da0SIdo Schimmel	bridge vlan del vid 10 dev $swp2
94b6d00da0SIdo Schimmel	ip link set dev $swp2 down
95b6d00da0SIdo Schimmel	ip link set dev $swp2 nomaster
96b6d00da0SIdo Schimmel
97b6d00da0SIdo Schimmel	bridge vlan del vid 20 dev $swp1
98b6d00da0SIdo Schimmel	bridge vlan del vid 10 dev $swp1
99b6d00da0SIdo Schimmel	ip link set dev $swp1 down
100b6d00da0SIdo Schimmel	ip link set dev $swp1 nomaster
101b6d00da0SIdo Schimmel
102b6d00da0SIdo Schimmel	ip link set dev br0 down
103b6d00da0SIdo Schimmel	bridge vlan del vid 20 dev br0 self
104b6d00da0SIdo Schimmel	bridge vlan del vid 10 dev br0 self
105b6d00da0SIdo Schimmel	ip link del dev br0
106b6d00da0SIdo Schimmel}
107b6d00da0SIdo Schimmel
108b6d00da0SIdo Schimmelsetup_prepare()
109b6d00da0SIdo Schimmel{
110b6d00da0SIdo Schimmel	h1=${NETIFS[p1]}
111b6d00da0SIdo Schimmel	swp1=${NETIFS[p2]}
112b6d00da0SIdo Schimmel
113b6d00da0SIdo Schimmel	swp2=${NETIFS[p3]}
114b6d00da0SIdo Schimmel	h2=${NETIFS[p4]}
115b6d00da0SIdo Schimmel
116b6d00da0SIdo Schimmel	vrf_prepare
117b6d00da0SIdo Schimmel	forwarding_enable
118b6d00da0SIdo Schimmel
119b6d00da0SIdo Schimmel	h1_create
120b6d00da0SIdo Schimmel	h2_create
121b6d00da0SIdo Schimmel	switch_create
122b6d00da0SIdo Schimmel}
123b6d00da0SIdo Schimmel
124b6d00da0SIdo Schimmelcleanup()
125b6d00da0SIdo Schimmel{
126b6d00da0SIdo Schimmel	pre_cleanup
127b6d00da0SIdo Schimmel
128b6d00da0SIdo Schimmel	switch_destroy
129b6d00da0SIdo Schimmel	h2_destroy
130b6d00da0SIdo Schimmel	h1_destroy
131b6d00da0SIdo Schimmel
132b6d00da0SIdo Schimmel	forwarding_restore
133b6d00da0SIdo Schimmel	vrf_cleanup
134b6d00da0SIdo Schimmel}
135b6d00da0SIdo Schimmel
136b6d00da0SIdo Schimmelcfg_test_host_common()
137b6d00da0SIdo Schimmel{
138b6d00da0SIdo Schimmel	local name=$1; shift
139b6d00da0SIdo Schimmel	local grp=$1; shift
140b6d00da0SIdo Schimmel	local src=$1; shift
141b6d00da0SIdo Schimmel	local state=$1; shift
142b6d00da0SIdo Schimmel	local invalid_state=$1; shift
143b6d00da0SIdo Schimmel
144b6d00da0SIdo Schimmel	RET=0
145b6d00da0SIdo Schimmel
146b6d00da0SIdo Schimmel	# Check basic add, replace and delete behavior.
147b6d00da0SIdo Schimmel	bridge mdb add dev br0 port br0 grp $grp $state vid 10
148925fd1a0SIdo Schimmel	bridge mdb get dev br0 grp $grp vid 10 &> /dev/null
149b6d00da0SIdo Schimmel	check_err $? "Failed to add $name host entry"
150b6d00da0SIdo Schimmel
151b6d00da0SIdo Schimmel	bridge mdb replace dev br0 port br0 grp $grp $state vid 10 &> /dev/null
152b6d00da0SIdo Schimmel	check_fail $? "Managed to replace $name host entry"
153b6d00da0SIdo Schimmel
154b6d00da0SIdo Schimmel	bridge mdb del dev br0 port br0 grp $grp $state vid 10
155925fd1a0SIdo Schimmel	bridge mdb get dev br0 grp $grp vid 10 &> /dev/null
156b6d00da0SIdo Schimmel	check_fail $? "Failed to delete $name host entry"
157b6d00da0SIdo Schimmel
158b6d00da0SIdo Schimmel	# Check error cases.
159b6d00da0SIdo Schimmel	bridge mdb add dev br0 port br0 grp $grp $invalid_state vid 10 \
160b6d00da0SIdo Schimmel		&> /dev/null
161b6d00da0SIdo Schimmel	check_fail $? "Managed to add $name host entry with a $invalid_state state"
162b6d00da0SIdo Schimmel
163b6d00da0SIdo Schimmel	bridge mdb add dev br0 port br0 grp $grp src $src $state vid 10 \
164b6d00da0SIdo Schimmel		&> /dev/null
165b6d00da0SIdo Schimmel	check_fail $? "Managed to add $name host entry with a source"
166b6d00da0SIdo Schimmel
167b6d00da0SIdo Schimmel	bridge mdb add dev br0 port br0 grp $grp $state vid 10 \
168b6d00da0SIdo Schimmel		filter_mode exclude &> /dev/null
169b6d00da0SIdo Schimmel	check_fail $? "Managed to add $name host entry with a filter mode"
170b6d00da0SIdo Schimmel
171b6d00da0SIdo Schimmel	bridge mdb add dev br0 port br0 grp $grp $state vid 10 \
172b6d00da0SIdo Schimmel		source_list $src &> /dev/null
173b6d00da0SIdo Schimmel	check_fail $? "Managed to add $name host entry with a source list"
174b6d00da0SIdo Schimmel
175b6d00da0SIdo Schimmel	bridge mdb add dev br0 port br0 grp $grp $state vid 10 \
176b6d00da0SIdo Schimmel		proto 123 &> /dev/null
177b6d00da0SIdo Schimmel	check_fail $? "Managed to add $name host entry with a protocol"
178b6d00da0SIdo Schimmel
179b6d00da0SIdo Schimmel	log_test "Common host entries configuration tests ($name)"
180b6d00da0SIdo Schimmel}
181b6d00da0SIdo Schimmel
182b6d00da0SIdo Schimmel# Check configuration of host entries from all types.
183b6d00da0SIdo Schimmelcfg_test_host()
184b6d00da0SIdo Schimmel{
185b6d00da0SIdo Schimmel	echo
186b6d00da0SIdo Schimmel	log_info "# Host entries configuration tests"
187b6d00da0SIdo Schimmel
188b6d00da0SIdo Schimmel	cfg_test_host_common "IPv4" "239.1.1.1" "192.0.2.1" "temp" "permanent"
189b6d00da0SIdo Schimmel	cfg_test_host_common "IPv6" "ff0e::1" "2001:db8:1::1" "temp" "permanent"
190b6d00da0SIdo Schimmel	cfg_test_host_common "L2" "01:02:03:04:05:06" "00:00:00:00:00:01" \
191b6d00da0SIdo Schimmel		"permanent" "temp"
192b6d00da0SIdo Schimmel}
193b6d00da0SIdo Schimmel
194b6d00da0SIdo Schimmelcfg_test_port_common()
195b6d00da0SIdo Schimmel{
196b6d00da0SIdo Schimmel	local name=$1;shift
197b6d00da0SIdo Schimmel	local grp_key=$1; shift
198b6d00da0SIdo Schimmel
199b6d00da0SIdo Schimmel	RET=0
200b6d00da0SIdo Schimmel
201b6d00da0SIdo Schimmel	# Check basic add, replace and delete behavior.
202b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 $grp_key permanent vid 10
203925fd1a0SIdo Schimmel	bridge mdb get dev br0 $grp_key vid 10 &> /dev/null
204b6d00da0SIdo Schimmel	check_err $? "Failed to add $name entry"
205b6d00da0SIdo Schimmel
206b6d00da0SIdo Schimmel	bridge mdb replace dev br0 port $swp1 $grp_key permanent vid 10 \
207b6d00da0SIdo Schimmel		&> /dev/null
208b6d00da0SIdo Schimmel	check_err $? "Failed to replace $name entry"
209b6d00da0SIdo Schimmel
210b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 $grp_key permanent vid 10
211925fd1a0SIdo Schimmel	bridge mdb get dev br0 $grp_key vid 10 &> /dev/null
212b6d00da0SIdo Schimmel	check_fail $? "Failed to delete $name entry"
213b6d00da0SIdo Schimmel
214b6d00da0SIdo Schimmel	# Check default protocol and replacement.
215b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 $grp_key permanent vid 10
216925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 $grp_key vid 10 | grep -q "static"
217b6d00da0SIdo Schimmel	check_err $? "$name entry not added with default \"static\" protocol"
218b6d00da0SIdo Schimmel
219b6d00da0SIdo Schimmel	bridge mdb replace dev br0 port $swp1 $grp_key permanent vid 10 \
220b6d00da0SIdo Schimmel		proto 123
221925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 $grp_key vid 10 | grep -q "123"
222b6d00da0SIdo Schimmel	check_err $? "Failed to replace protocol of $name entry"
223b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 $grp_key permanent vid 10
224b6d00da0SIdo Schimmel
225b6d00da0SIdo Schimmel	# Check behavior when VLAN is not specified.
226b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 $grp_key permanent
227925fd1a0SIdo Schimmel	bridge mdb get dev br0 $grp_key vid 10 &> /dev/null
228b6d00da0SIdo Schimmel	check_err $? "$name entry with VLAN 10 not added when VLAN was not specified"
229925fd1a0SIdo Schimmel	bridge mdb get dev br0 $grp_key vid 20 &> /dev/null
230b6d00da0SIdo Schimmel	check_err $? "$name entry with VLAN 20 not added when VLAN was not specified"
231b6d00da0SIdo Schimmel
232b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 $grp_key permanent
233925fd1a0SIdo Schimmel	bridge mdb get dev br0 $grp_key vid 10 &> /dev/null
234b6d00da0SIdo Schimmel	check_fail $? "$name entry with VLAN 10 not deleted when VLAN was not specified"
235925fd1a0SIdo Schimmel	bridge mdb get dev br0 $grp_key vid 20 &> /dev/null
236b6d00da0SIdo Schimmel	check_fail $? "$name entry with VLAN 20 not deleted when VLAN was not specified"
237b6d00da0SIdo Schimmel
238b6d00da0SIdo Schimmel	# Check behavior when bridge port is down.
239b6d00da0SIdo Schimmel	ip link set dev $swp1 down
240b6d00da0SIdo Schimmel
241b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 $grp_key permanent vid 10
242b6d00da0SIdo Schimmel	check_err $? "Failed to add $name permanent entry when bridge port is down"
243b6d00da0SIdo Schimmel
244b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 $grp_key permanent vid 10
245b6d00da0SIdo Schimmel
246b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 $grp_key temp vid 10 &> /dev/null
247b6d00da0SIdo Schimmel	check_fail $? "Managed to add $name temporary entry when bridge port is down"
248b6d00da0SIdo Schimmel
249b6d00da0SIdo Schimmel	ip link set dev $swp1 up
250b6d00da0SIdo Schimmel	setup_wait_dev $swp1
251b6d00da0SIdo Schimmel
252b6d00da0SIdo Schimmel	# Check error cases.
253b6d00da0SIdo Schimmel	ip link set dev br0 down
254b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 $grp_key permanent vid 10 \
255b6d00da0SIdo Schimmel		&> /dev/null
256b6d00da0SIdo Schimmel	check_fail $? "Managed to add $name entry when bridge is down"
257b6d00da0SIdo Schimmel	ip link set dev br0 up
258b6d00da0SIdo Schimmel
259b6d00da0SIdo Schimmel	ip link set dev br0 type bridge mcast_snooping 0
260b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 $grp_key permanent vid \
261b6d00da0SIdo Schimmel		10 &> /dev/null
262b6d00da0SIdo Schimmel	check_fail $? "Managed to add $name entry when multicast snooping is disabled"
263b6d00da0SIdo Schimmel	ip link set dev br0 type bridge mcast_snooping 1
264b6d00da0SIdo Schimmel
265b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 $grp_key permanent vid 5000 \
266b6d00da0SIdo Schimmel		&> /dev/null
267b6d00da0SIdo Schimmel	check_fail $? "Managed to add $name entry with an invalid VLAN"
268b6d00da0SIdo Schimmel
269b6d00da0SIdo Schimmel	log_test "Common port group entries configuration tests ($name)"
270b6d00da0SIdo Schimmel}
271b6d00da0SIdo Schimmel
272b6d00da0SIdo Schimmelsrc_list_create()
273b6d00da0SIdo Schimmel{
274b6d00da0SIdo Schimmel	local src_prefix=$1; shift
275b6d00da0SIdo Schimmel	local num_srcs=$1; shift
276b6d00da0SIdo Schimmel	local src_list
277b6d00da0SIdo Schimmel	local i
278b6d00da0SIdo Schimmel
279b6d00da0SIdo Schimmel	for i in $(seq 1 $num_srcs); do
280b6d00da0SIdo Schimmel		src_list=${src_list},${src_prefix}${i}
281b6d00da0SIdo Schimmel	done
282b6d00da0SIdo Schimmel
283b6d00da0SIdo Schimmel	echo $src_list | cut -c 2-
284b6d00da0SIdo Schimmel}
285b6d00da0SIdo Schimmel
286b6d00da0SIdo Schimmel__cfg_test_port_ip_star_g()
287b6d00da0SIdo Schimmel{
288b6d00da0SIdo Schimmel	local name=$1; shift
289b6d00da0SIdo Schimmel	local grp=$1; shift
290b6d00da0SIdo Schimmel	local invalid_grp=$1; shift
291b6d00da0SIdo Schimmel	local src_prefix=$1; shift
292b6d00da0SIdo Schimmel	local src1=${src_prefix}1
293b6d00da0SIdo Schimmel	local src2=${src_prefix}2
294b6d00da0SIdo Schimmel	local src3=${src_prefix}3
295b6d00da0SIdo Schimmel	local max_srcs=31
296b6d00da0SIdo Schimmel	local num_srcs
297b6d00da0SIdo Schimmel
298b6d00da0SIdo Schimmel	RET=0
299b6d00da0SIdo Schimmel
300b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp $grp vid 10
301925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp vid 10 | grep -q "exclude"
302b6d00da0SIdo Schimmel	check_err $? "Default filter mode is not \"exclude\""
303b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 grp $grp vid 10
304b6d00da0SIdo Schimmel
305b6d00da0SIdo Schimmel	# Check basic add and delete behavior.
306b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp $grp vid 10 filter_mode exclude \
307b6d00da0SIdo Schimmel		source_list $src1
308925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp vid 10 &> /dev/null
309b6d00da0SIdo Schimmel	check_err $? "(*, G) entry not created"
310925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp src $src1 vid 10 &> /dev/null
311b6d00da0SIdo Schimmel	check_err $? "(S, G) entry not created"
312b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 grp $grp vid 10
313925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp vid 10 &> /dev/null
314b6d00da0SIdo Schimmel	check_fail $? "(*, G) entry not deleted"
315925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp src $src1 vid 10 &> /dev/null
316b6d00da0SIdo Schimmel	check_fail $? "(S, G) entry not deleted"
317b6d00da0SIdo Schimmel
318b6d00da0SIdo Schimmel	## State (permanent / temp) tests.
319b6d00da0SIdo Schimmel
320b6d00da0SIdo Schimmel	# Check that group and source timer are not set for permanent entries.
321b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp $grp permanent vid 10 \
322b6d00da0SIdo Schimmel		filter_mode exclude source_list $src1
323b6d00da0SIdo Schimmel
324925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp vid 10 | grep -q "permanent"
325b6d00da0SIdo Schimmel	check_err $? "(*, G) entry not added as \"permanent\" when should"
326925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp src $src1 vid 10 | \
327b6d00da0SIdo Schimmel		grep -q "permanent"
328b6d00da0SIdo Schimmel	check_err $? "(S, G) entry not added as \"permanent\" when should"
329b6d00da0SIdo Schimmel
330925fd1a0SIdo Schimmel	bridge -d -s mdb get dev br0 grp $grp vid 10 | grep -q " 0.00"
331b6d00da0SIdo Schimmel	check_err $? "(*, G) \"permanent\" entry has a pending group timer"
332*d8893ac8SIdo Schimmel	bridge -d -s mdb get dev br0 grp $grp vid 10 | grep -q "/0.00"
333b6d00da0SIdo Schimmel	check_err $? "\"permanent\" source entry has a pending source timer"
334b6d00da0SIdo Schimmel
335b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 grp $grp vid 10
336b6d00da0SIdo Schimmel
337b6d00da0SIdo Schimmel	# Check that group timer is set for temporary (*, G) EXCLUDE, but not
338b6d00da0SIdo Schimmel	# the source timer.
339b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp $grp temp vid 10 \
340b6d00da0SIdo Schimmel		filter_mode exclude source_list $src1
341b6d00da0SIdo Schimmel
342925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp vid 10 | grep -q "temp"
343b6d00da0SIdo Schimmel	check_err $? "(*, G) EXCLUDE entry not added as \"temp\" when should"
344925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp src $src1 vid 10 | grep -q "temp"
345b6d00da0SIdo Schimmel	check_err $? "(S, G) \"blocked\" entry not added as \"temp\" when should"
346b6d00da0SIdo Schimmel
347925fd1a0SIdo Schimmel	bridge -d -s mdb get dev br0 grp $grp vid 10 | grep -q " 0.00"
348b6d00da0SIdo Schimmel	check_fail $? "(*, G) EXCLUDE entry does not have a pending group timer"
349*d8893ac8SIdo Schimmel	bridge -d -s mdb get dev br0 grp $grp vid 10 | grep -q "/0.00"
350b6d00da0SIdo Schimmel	check_err $? "\"blocked\" source entry has a pending source timer"
351b6d00da0SIdo Schimmel
352b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 grp $grp vid 10
353b6d00da0SIdo Schimmel
354b6d00da0SIdo Schimmel	# Check that group timer is not set for temporary (*, G) INCLUDE, but
355b6d00da0SIdo Schimmel	# that the source timer is set.
356b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp $grp temp vid 10 \
357b6d00da0SIdo Schimmel		filter_mode include source_list $src1
358b6d00da0SIdo Schimmel
359925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp vid 10 | grep -q "temp"
360b6d00da0SIdo Schimmel	check_err $? "(*, G) INCLUDE entry not added as \"temp\" when should"
361925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp src $src1 vid 10 | grep -q "temp"
362b6d00da0SIdo Schimmel	check_err $? "(S, G) entry not added as \"temp\" when should"
363b6d00da0SIdo Schimmel
364925fd1a0SIdo Schimmel	bridge -d -s mdb get dev br0 grp $grp vid 10 | grep -q " 0.00"
365b6d00da0SIdo Schimmel	check_err $? "(*, G) INCLUDE entry has a pending group timer"
366*d8893ac8SIdo Schimmel	bridge -d -s mdb get dev br0 grp $grp vid 10 | grep -q "/0.00"
367b6d00da0SIdo Schimmel	check_fail $? "Source entry does not have a pending source timer"
368b6d00da0SIdo Schimmel
369b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 grp $grp vid 10
370b6d00da0SIdo Schimmel
371b6d00da0SIdo Schimmel	# Check that group timer is never set for (S, G) entries.
372b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp $grp temp vid 10 \
373b6d00da0SIdo Schimmel		filter_mode include source_list $src1
374b6d00da0SIdo Schimmel
375925fd1a0SIdo Schimmel	bridge -d -s mdb get dev br0 grp $grp src $src1 vid 10 | grep -q " 0.00"
376b6d00da0SIdo Schimmel	check_err $? "(S, G) entry has a pending group timer"
377b6d00da0SIdo Schimmel
378b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 grp $grp vid 10
379b6d00da0SIdo Schimmel
380b6d00da0SIdo Schimmel	## Filter mode (include / exclude) tests.
381b6d00da0SIdo Schimmel
382b6d00da0SIdo Schimmel	# Check that (*, G) INCLUDE entries are added with correct filter mode
383b6d00da0SIdo Schimmel	# and that (S, G) entries are not marked as "blocked".
384b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp $grp vid 10 \
385b6d00da0SIdo Schimmel		filter_mode include source_list $src1
386b6d00da0SIdo Schimmel
387925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp vid 10 | grep -q "include"
388b6d00da0SIdo Schimmel	check_err $? "(*, G) INCLUDE not added with \"include\" filter mode"
389925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp src $src1 vid 10 | grep -q "blocked"
390b6d00da0SIdo Schimmel	check_fail $? "(S, G) entry marked as \"blocked\" when should not"
391b6d00da0SIdo Schimmel
392b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 grp $grp vid 10
393b6d00da0SIdo Schimmel
394b6d00da0SIdo Schimmel	# Check that (*, G) EXCLUDE entries are added with correct filter mode
395b6d00da0SIdo Schimmel	# and that (S, G) entries are marked as "blocked".
396b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp $grp vid 10 \
397b6d00da0SIdo Schimmel		filter_mode exclude source_list $src1
398b6d00da0SIdo Schimmel
399925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp vid 10 | grep -q "exclude"
400b6d00da0SIdo Schimmel	check_err $? "(*, G) EXCLUDE not added with \"exclude\" filter mode"
401925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp src $src1 vid 10 | grep -q "blocked"
402b6d00da0SIdo Schimmel	check_err $? "(S, G) entry not marked as \"blocked\" when should"
403b6d00da0SIdo Schimmel
404b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 grp $grp vid 10
405b6d00da0SIdo Schimmel
406b6d00da0SIdo Schimmel	## Protocol tests.
407b6d00da0SIdo Schimmel
408b6d00da0SIdo Schimmel	# Check that (*, G) and (S, G) entries are added with the specified
409b6d00da0SIdo Schimmel	# protocol.
410b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp $grp vid 10 \
411b6d00da0SIdo Schimmel		filter_mode exclude source_list $src1 proto zebra
412b6d00da0SIdo Schimmel
413925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp vid 10 | grep -q "zebra"
414b6d00da0SIdo Schimmel	check_err $? "(*, G) entry not added with \"zebra\" protocol"
415925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp src $src1 vid 10 | grep -q "zebra"
416b6d00da0SIdo Schimmel	check_err $? "(S, G) entry not marked added with \"zebra\" protocol"
417b6d00da0SIdo Schimmel
418b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 grp $grp vid 10
419b6d00da0SIdo Schimmel
420b6d00da0SIdo Schimmel	## Replace tests.
421b6d00da0SIdo Schimmel
422b6d00da0SIdo Schimmel	# Check that state can be modified.
423b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp $grp temp vid 10 \
424b6d00da0SIdo Schimmel		filter_mode exclude source_list $src1
425b6d00da0SIdo Schimmel
426b6d00da0SIdo Schimmel	bridge mdb replace dev br0 port $swp1 grp $grp permanent vid 10 \
427b6d00da0SIdo Schimmel		filter_mode exclude source_list $src1
428925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp vid 10 | grep -q "permanent"
429b6d00da0SIdo Schimmel	check_err $? "(*, G) entry not marked as \"permanent\" after replace"
430925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp src $src1 vid 10 | grep -q "permanent"
431b6d00da0SIdo Schimmel	check_err $? "(S, G) entry not marked as \"permanent\" after replace"
432b6d00da0SIdo Schimmel
433b6d00da0SIdo Schimmel	bridge mdb replace dev br0 port $swp1 grp $grp temp vid 10 \
434b6d00da0SIdo Schimmel		filter_mode exclude source_list $src1
435925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp vid 10 | grep -q "temp"
436b6d00da0SIdo Schimmel	check_err $? "(*, G) entry not marked as \"temp\" after replace"
437925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp src $src1 vid 10 | grep -q "temp"
438b6d00da0SIdo Schimmel	check_err $? "(S, G) entry not marked as \"temp\" after replace"
439b6d00da0SIdo Schimmel
440b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 grp $grp vid 10
441b6d00da0SIdo Schimmel
442b6d00da0SIdo Schimmel	# Check that filter mode can be modified.
443b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp $grp temp vid 10 \
444b6d00da0SIdo Schimmel		filter_mode exclude source_list $src1
445b6d00da0SIdo Schimmel
446b6d00da0SIdo Schimmel	bridge mdb replace dev br0 port $swp1 grp $grp temp vid 10 \
447b6d00da0SIdo Schimmel		filter_mode include source_list $src1
448925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp vid 10 | grep -q "include"
449b6d00da0SIdo Schimmel	check_err $? "(*, G) not marked with \"include\" filter mode after replace"
450925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp src $src1 vid 10 | grep -q "blocked"
451b6d00da0SIdo Schimmel	check_fail $? "(S, G) marked as \"blocked\" after replace"
452b6d00da0SIdo Schimmel
453b6d00da0SIdo Schimmel	bridge mdb replace dev br0 port $swp1 grp $grp temp vid 10 \
454b6d00da0SIdo Schimmel		filter_mode exclude source_list $src1
455925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp vid 10 | grep -q "exclude"
456b6d00da0SIdo Schimmel	check_err $? "(*, G) not marked with \"exclude\" filter mode after replace"
457925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp src $src1 vid 10 | grep -q "blocked"
458b6d00da0SIdo Schimmel	check_err $? "(S, G) not marked as \"blocked\" after replace"
459b6d00da0SIdo Schimmel
460b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 grp $grp vid 10
461b6d00da0SIdo Schimmel
462b6d00da0SIdo Schimmel	# Check that sources can be added to and removed from the source list.
463b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp $grp temp vid 10 \
464b6d00da0SIdo Schimmel		filter_mode exclude source_list $src1
465b6d00da0SIdo Schimmel
466b6d00da0SIdo Schimmel	bridge mdb replace dev br0 port $swp1 grp $grp temp vid 10 \
467b6d00da0SIdo Schimmel		filter_mode exclude source_list $src1,$src2,$src3
468925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp src $src1 vid 10 &> /dev/null
469b6d00da0SIdo Schimmel	check_err $? "(S, G) entry for source $src1 not created after replace"
470925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp src $src2 vid 10 &> /dev/null
471b6d00da0SIdo Schimmel	check_err $? "(S, G) entry for source $src2 not created after replace"
472925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp src $src3 vid 10 &> /dev/null
473b6d00da0SIdo Schimmel	check_err $? "(S, G) entry for source $src3 not created after replace"
474b6d00da0SIdo Schimmel
475b6d00da0SIdo Schimmel	bridge mdb replace dev br0 port $swp1 grp $grp temp vid 10 \
476b6d00da0SIdo Schimmel		filter_mode exclude source_list $src1,$src3
477925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp src $src1 vid 10 &> /dev/null
478b6d00da0SIdo Schimmel	check_err $? "(S, G) entry for source $src1 not created after second replace"
479925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp src $src2 vid 10 &> /dev/null
480b6d00da0SIdo Schimmel	check_fail $? "(S, G) entry for source $src2 created after second replace"
481925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp src $src3 vid 10 &> /dev/null
482b6d00da0SIdo Schimmel	check_err $? "(S, G) entry for source $src3 not created after second replace"
483b6d00da0SIdo Schimmel
484b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 grp $grp vid 10
485b6d00da0SIdo Schimmel
486b6d00da0SIdo Schimmel	# Check that protocol can be modified.
487b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp $grp temp vid 10 \
488b6d00da0SIdo Schimmel		filter_mode exclude source_list $src1 proto zebra
489b6d00da0SIdo Schimmel
490b6d00da0SIdo Schimmel	bridge mdb replace dev br0 port $swp1 grp $grp temp vid 10 \
491b6d00da0SIdo Schimmel		filter_mode exclude source_list $src1 proto bgp
492925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp vid 10 | grep -q "bgp"
493b6d00da0SIdo Schimmel	check_err $? "(*, G) protocol not changed to \"bgp\" after replace"
494925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp src $src1 vid 10 | grep -q "bgp"
495b6d00da0SIdo Schimmel	check_err $? "(S, G) protocol not changed to \"bgp\" after replace"
496b6d00da0SIdo Schimmel
497b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 grp $grp vid 10
498b6d00da0SIdo Schimmel
499b6d00da0SIdo Schimmel	## Star exclude tests.
500b6d00da0SIdo Schimmel
501b6d00da0SIdo Schimmel	# Check star exclude functionality. When adding a new EXCLUDE (*, G),
502b6d00da0SIdo Schimmel	# it needs to be also added to all (S, G) entries for proper
503b6d00da0SIdo Schimmel	# replication.
504b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp2 grp $grp vid 10 \
505b6d00da0SIdo Schimmel		filter_mode include source_list $src1
506b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp $grp vid 10
507925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp $grp src $src1 vid 10 | grep "$swp1" | \
508925fd1a0SIdo Schimmel		grep -q "added_by_star_ex"
509b6d00da0SIdo Schimmel	check_err $? "\"added_by_star_ex\" entry not created after adding (*, G) entry"
510b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 grp $grp vid 10
511b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp2 grp $grp src $src1 vid 10
512b6d00da0SIdo Schimmel
513b6d00da0SIdo Schimmel	## Error cases tests.
514b6d00da0SIdo Schimmel
515b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp $invalid_grp vid 10 &> /dev/null
516b6d00da0SIdo Schimmel	check_fail $? "Managed to add an entry with an invalid group"
517b6d00da0SIdo Schimmel
518b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp $grp vid 10 filter_mode include \
519b6d00da0SIdo Schimmel		&> /dev/null
520b6d00da0SIdo Schimmel	check_fail $? "Managed to add an INCLUDE entry with an empty source list"
521b6d00da0SIdo Schimmel
522b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp $grp vid 10 filter_mode include \
523b6d00da0SIdo Schimmel		source_list $grp &> /dev/null
524b6d00da0SIdo Schimmel	check_fail $? "Managed to add an entry with an invalid source in source list"
525b6d00da0SIdo Schimmel
526b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp $grp vid 10 \
527b6d00da0SIdo Schimmel		source_list $src &> /dev/null
528b6d00da0SIdo Schimmel	check_fail $? "Managed to add an entry with a source list and no filter mode"
529b6d00da0SIdo Schimmel
530b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp $grp vid 10 filter_mode include \
531b6d00da0SIdo Schimmel		source_list $src1
532b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp $grp vid 10 filter_mode exclude \
533b6d00da0SIdo Schimmel		source_list $src1 &> /dev/null
534b6d00da0SIdo Schimmel	check_fail $? "Managed to replace an entry without using replace"
535b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 grp $grp vid 10
536b6d00da0SIdo Schimmel
537b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp $grp src $src2 vid 10
538b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp $grp vid 10 filter_mode include \
539b6d00da0SIdo Schimmel		source_list $src1,$src2,$src3 &> /dev/null
540b6d00da0SIdo Schimmel	check_fail $? "Managed to add a source that already has a forwarding entry"
541b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 grp $grp src $src2 vid 10
542b6d00da0SIdo Schimmel
543b6d00da0SIdo Schimmel	# Check maximum number of sources.
544b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp $grp vid 10 filter_mode exclude \
545b6d00da0SIdo Schimmel		source_list $(src_list_create $src_prefix $max_srcs)
546b6d00da0SIdo Schimmel	num_srcs=$(bridge -d mdb show dev br0 vid 10 | grep "$grp" | \
547b6d00da0SIdo Schimmel		grep "src" | wc -l)
548b6d00da0SIdo Schimmel	[[ $num_srcs -eq $max_srcs ]]
549b6d00da0SIdo Schimmel	check_err $? "Failed to configure maximum number of sources ($max_srcs)"
550b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 grp $grp vid 10
551b6d00da0SIdo Schimmel
552b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp $grp vid 10 filter_mode exclude \
553b6d00da0SIdo Schimmel		source_list $(src_list_create $src_prefix $((max_srcs + 1))) \
554b6d00da0SIdo Schimmel		&> /dev/null
555b6d00da0SIdo Schimmel	check_fail $? "Managed to exceed maximum number of sources ($max_srcs)"
556b6d00da0SIdo Schimmel
557b6d00da0SIdo Schimmel	log_test "$name (*, G) port group entries configuration tests"
558b6d00da0SIdo Schimmel}
559b6d00da0SIdo Schimmel
560b6d00da0SIdo Schimmelcfg_test_port_ip_star_g()
561b6d00da0SIdo Schimmel{
562b6d00da0SIdo Schimmel	echo
563b6d00da0SIdo Schimmel	log_info "# Port group entries configuration tests - (*, G)"
564b6d00da0SIdo Schimmel
565b6d00da0SIdo Schimmel	cfg_test_port_common "IPv4 (*, G)" "grp 239.1.1.1"
566b6d00da0SIdo Schimmel	cfg_test_port_common "IPv6 (*, G)" "grp ff0e::1"
567b6d00da0SIdo Schimmel	__cfg_test_port_ip_star_g "IPv4" "239.1.1.1" "224.0.0.1" "192.0.2."
568b6d00da0SIdo Schimmel	__cfg_test_port_ip_star_g "IPv6" "ff0e::1" "ff02::1" "2001:db8:1::"
569b6d00da0SIdo Schimmel}
570b6d00da0SIdo Schimmel
571b6d00da0SIdo Schimmel__cfg_test_port_ip_sg()
572b6d00da0SIdo Schimmel{
573b6d00da0SIdo Schimmel	local name=$1; shift
574b6d00da0SIdo Schimmel	local grp=$1; shift
575b6d00da0SIdo Schimmel	local src=$1; shift
576b6d00da0SIdo Schimmel	local grp_key="grp $grp src $src"
577b6d00da0SIdo Schimmel
578b6d00da0SIdo Schimmel	RET=0
579b6d00da0SIdo Schimmel
580b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 $grp_key vid 10
581925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 $grp_key vid 10 | grep -q "include"
582b6d00da0SIdo Schimmel	check_err $? "Default filter mode is not \"include\""
583b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 $grp_key vid 10
584b6d00da0SIdo Schimmel
585b6d00da0SIdo Schimmel	# Check that entries can be added as both permanent and temp and that
586b6d00da0SIdo Schimmel	# group timer is set correctly.
587b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 $grp_key permanent vid 10
588925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 $grp_key vid 10 | grep -q "permanent"
589b6d00da0SIdo Schimmel	check_err $? "Entry not added as \"permanent\" when should"
590925fd1a0SIdo Schimmel	bridge -d -s mdb get dev br0 $grp_key vid 10 | grep -q " 0.00"
591b6d00da0SIdo Schimmel	check_err $? "\"permanent\" entry has a pending group timer"
592b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 $grp_key vid 10
593b6d00da0SIdo Schimmel
594b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 $grp_key temp vid 10
595925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 $grp_key vid 10 | grep -q "temp"
596b6d00da0SIdo Schimmel	check_err $? "Entry not added as \"temp\" when should"
597925fd1a0SIdo Schimmel	bridge -d -s mdb get dev br0 $grp_key vid 10 | grep -q " 0.00"
598b6d00da0SIdo Schimmel	check_fail $? "\"temp\" entry has an unpending group timer"
599b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 $grp_key vid 10
600b6d00da0SIdo Schimmel
601b6d00da0SIdo Schimmel	# Check error cases.
602b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 $grp_key vid 10 \
603b6d00da0SIdo Schimmel		filter_mode include &> /dev/null
604b6d00da0SIdo Schimmel	check_fail $? "Managed to add an entry with a filter mode"
605b6d00da0SIdo Schimmel
606b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 $grp_key vid 10 \
607b6d00da0SIdo Schimmel		filter_mode include source_list $src &> /dev/null
608b6d00da0SIdo Schimmel	check_fail $? "Managed to add an entry with a source list"
609b6d00da0SIdo Schimmel
610b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp $grp src $grp vid 10 &> /dev/null
611b6d00da0SIdo Schimmel	check_fail $? "Managed to add an entry with an invalid source"
612b6d00da0SIdo Schimmel
613b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 $grp_key vid 10 temp
614b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 $grp_key vid 10 permanent &> /dev/null
615b6d00da0SIdo Schimmel	check_fail $? "Managed to replace an entry without using replace"
616b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 $grp_key vid 10
617b6d00da0SIdo Schimmel
618b6d00da0SIdo Schimmel	# Check that we can replace available attributes.
619b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 $grp_key vid 10 proto 123
620b6d00da0SIdo Schimmel	bridge mdb replace dev br0 port $swp1 $grp_key vid 10 proto 111
621925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 $grp_key vid 10 | grep -q "111"
622b6d00da0SIdo Schimmel	check_err $? "Failed to replace protocol"
623b6d00da0SIdo Schimmel
624b6d00da0SIdo Schimmel	bridge mdb replace dev br0 port $swp1 $grp_key vid 10 permanent
625925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 $grp_key vid 10 | grep -q "permanent"
626b6d00da0SIdo Schimmel	check_err $? "Entry not marked as \"permanent\" after replace"
627925fd1a0SIdo Schimmel	bridge -d -s mdb get dev br0 $grp_key vid 10 | grep -q " 0.00"
628b6d00da0SIdo Schimmel	check_err $? "Entry has a pending group timer after replace"
629b6d00da0SIdo Schimmel
630b6d00da0SIdo Schimmel	bridge mdb replace dev br0 port $swp1 $grp_key vid 10 temp
631925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 $grp_key vid 10 | grep -q "temp"
632b6d00da0SIdo Schimmel	check_err $? "Entry not marked as \"temp\" after replace"
633925fd1a0SIdo Schimmel	bridge -d -s mdb get dev br0 $grp_key vid 10 | grep -q " 0.00"
634b6d00da0SIdo Schimmel	check_fail $? "Entry has an unpending group timer after replace"
635b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 $grp_key vid 10
636b6d00da0SIdo Schimmel
637b6d00da0SIdo Schimmel	# Check star exclude functionality. When adding a (S, G), all matching
638b6d00da0SIdo Schimmel	# (*, G) ports need to be added to it.
639b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp2 grp $grp vid 10
640b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 $grp_key vid 10
641925fd1a0SIdo Schimmel	bridge mdb get dev br0 $grp_key vid 10 | grep $swp2 | \
642b6d00da0SIdo Schimmel		grep -q "added_by_star_ex"
643b6d00da0SIdo Schimmel	check_err $? "\"added_by_star_ex\" entry not created after adding (S, G) entry"
644b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 $grp_key vid 10
645b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp2 grp $grp vid 10
646b6d00da0SIdo Schimmel
647b6d00da0SIdo Schimmel	log_test "$name (S, G) port group entries configuration tests"
648b6d00da0SIdo Schimmel}
649b6d00da0SIdo Schimmel
650b6d00da0SIdo Schimmelcfg_test_port_ip_sg()
651b6d00da0SIdo Schimmel{
652b6d00da0SIdo Schimmel	echo
653b6d00da0SIdo Schimmel	log_info "# Port group entries configuration tests - (S, G)"
654b6d00da0SIdo Schimmel
655b6d00da0SIdo Schimmel	cfg_test_port_common "IPv4 (S, G)" "grp 239.1.1.1 src 192.0.2.1"
656b6d00da0SIdo Schimmel	cfg_test_port_common "IPv6 (S, G)" "grp ff0e::1 src 2001:db8:1::1"
657b6d00da0SIdo Schimmel	__cfg_test_port_ip_sg "IPv4" "239.1.1.1" "192.0.2.1"
658b6d00da0SIdo Schimmel	__cfg_test_port_ip_sg "IPv6" "ff0e::1" "2001:db8:1::1"
659b6d00da0SIdo Schimmel}
660b6d00da0SIdo Schimmel
661b6d00da0SIdo Schimmelcfg_test_port_ip()
662b6d00da0SIdo Schimmel{
663b6d00da0SIdo Schimmel	cfg_test_port_ip_star_g
664b6d00da0SIdo Schimmel	cfg_test_port_ip_sg
665b6d00da0SIdo Schimmel}
666b6d00da0SIdo Schimmel
667b6d00da0SIdo Schimmel__cfg_test_port_l2()
668b6d00da0SIdo Schimmel{
669b6d00da0SIdo Schimmel	local grp="01:02:03:04:05:06"
670b6d00da0SIdo Schimmel
671b6d00da0SIdo Schimmel	RET=0
672b6d00da0SIdo Schimmel
673b6d00da0SIdo Schimmel	bridge meb add dev br0 port $swp grp 00:01:02:03:04:05 \
674b6d00da0SIdo Schimmel		permanent vid 10 &> /dev/null
675b6d00da0SIdo Schimmel	check_fail $? "Managed to add an entry with unicast MAC"
676b6d00da0SIdo Schimmel
677b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp grp $grp src 00:01:02:03:04:05 \
678b6d00da0SIdo Schimmel		permanent vid 10 &> /dev/null
679b6d00da0SIdo Schimmel	check_fail $? "Managed to add an entry with a source"
680b6d00da0SIdo Schimmel
681b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp $grp permanent vid 10 \
682b6d00da0SIdo Schimmel		filter_mode include &> /dev/null
683b6d00da0SIdo Schimmel	check_fail $? "Managed to add an entry with a filter mode"
684b6d00da0SIdo Schimmel
685b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp $grp permanent vid 10 \
686b6d00da0SIdo Schimmel		source_list 00:01:02:03:04:05 &> /dev/null
687b6d00da0SIdo Schimmel	check_fail $? "Managed to add an entry with a source list"
688b6d00da0SIdo Schimmel
689b6d00da0SIdo Schimmel	log_test "L2 (*, G) port group entries configuration tests"
690b6d00da0SIdo Schimmel}
691b6d00da0SIdo Schimmel
692b6d00da0SIdo Schimmelcfg_test_port_l2()
693b6d00da0SIdo Schimmel{
694b6d00da0SIdo Schimmel	echo
695b6d00da0SIdo Schimmel	log_info "# Port group entries configuration tests - L2"
696b6d00da0SIdo Schimmel
697b6d00da0SIdo Schimmel	cfg_test_port_common "L2 (*, G)" "grp 01:02:03:04:05:06"
698b6d00da0SIdo Schimmel	__cfg_test_port_l2
699b6d00da0SIdo Schimmel}
700b6d00da0SIdo Schimmel
701b6d00da0SIdo Schimmel# Check configuration of regular (port) entries of all types.
702b6d00da0SIdo Schimmelcfg_test_port()
703b6d00da0SIdo Schimmel{
704b6d00da0SIdo Schimmel	cfg_test_port_ip
705b6d00da0SIdo Schimmel	cfg_test_port_l2
706b6d00da0SIdo Schimmel}
707b6d00da0SIdo Schimmel
70804913912SIdo Schimmelipv4_grps_get()
70904913912SIdo Schimmel{
71004913912SIdo Schimmel	local max_grps=$1; shift
71104913912SIdo Schimmel	local i
71204913912SIdo Schimmel
71304913912SIdo Schimmel	for i in $(seq 0 $((max_grps - 1))); do
71404913912SIdo Schimmel		echo "239.1.1.$i"
71504913912SIdo Schimmel	done
71604913912SIdo Schimmel}
71704913912SIdo Schimmel
71804913912SIdo Schimmelipv6_grps_get()
71904913912SIdo Schimmel{
72004913912SIdo Schimmel	local max_grps=$1; shift
72104913912SIdo Schimmel	local i
72204913912SIdo Schimmel
72304913912SIdo Schimmel	for i in $(seq 0 $((max_grps - 1))); do
72404913912SIdo Schimmel		echo "ff0e::$(printf %x $i)"
72504913912SIdo Schimmel	done
72604913912SIdo Schimmel}
72704913912SIdo Schimmel
72804913912SIdo Schimmell2_grps_get()
72904913912SIdo Schimmel{
73004913912SIdo Schimmel	local max_grps=$1; shift
73104913912SIdo Schimmel	local i
73204913912SIdo Schimmel
73304913912SIdo Schimmel	for i in $(seq 0 $((max_grps - 1))); do
73404913912SIdo Schimmel		echo "01:00:00:00:00:$(printf %02x $i)"
73504913912SIdo Schimmel	done
73604913912SIdo Schimmel}
73704913912SIdo Schimmel
73804913912SIdo Schimmelcfg_test_dump_common()
73904913912SIdo Schimmel{
74004913912SIdo Schimmel	local name=$1; shift
74104913912SIdo Schimmel	local fn=$1; shift
74204913912SIdo Schimmel	local max_bridges=2
74304913912SIdo Schimmel	local max_grps=256
74404913912SIdo Schimmel	local max_ports=32
74504913912SIdo Schimmel	local num_entries
74604913912SIdo Schimmel	local batch_file
74704913912SIdo Schimmel	local grp
74804913912SIdo Schimmel	local i j
74904913912SIdo Schimmel
75004913912SIdo Schimmel	RET=0
75104913912SIdo Schimmel
75204913912SIdo Schimmel	# Create net devices.
75304913912SIdo Schimmel	for i in $(seq 1 $max_bridges); do
75404913912SIdo Schimmel		ip link add name br-test${i} up type bridge vlan_filtering 1 \
75504913912SIdo Schimmel			mcast_snooping 1
75604913912SIdo Schimmel		for j in $(seq 1 $max_ports); do
75704913912SIdo Schimmel			ip link add name br-test${i}-du${j} up \
75804913912SIdo Schimmel				master br-test${i} type dummy
75904913912SIdo Schimmel		done
76004913912SIdo Schimmel	done
76104913912SIdo Schimmel
76204913912SIdo Schimmel	# Create batch file with MDB entries.
76304913912SIdo Schimmel	batch_file=$(mktemp)
76404913912SIdo Schimmel	for i in $(seq 1 $max_bridges); do
76504913912SIdo Schimmel		for j in $(seq 1 $max_ports); do
76604913912SIdo Schimmel			for grp in $($fn $max_grps); do
76704913912SIdo Schimmel				echo "mdb add dev br-test${i} \
76804913912SIdo Schimmel					port br-test${i}-du${j} grp $grp \
76904913912SIdo Schimmel					permanent vid 1" >> $batch_file
77004913912SIdo Schimmel			done
77104913912SIdo Schimmel		done
77204913912SIdo Schimmel	done
77304913912SIdo Schimmel
77404913912SIdo Schimmel	# Program the batch file and check for expected number of entries.
77504913912SIdo Schimmel	bridge -b $batch_file
77604913912SIdo Schimmel	for i in $(seq 1 $max_bridges); do
77704913912SIdo Schimmel		num_entries=$(bridge mdb show dev br-test${i} | \
77804913912SIdo Schimmel			grep "permanent" | wc -l)
77904913912SIdo Schimmel		[[ $num_entries -eq $((max_grps * max_ports)) ]]
78004913912SIdo Schimmel		check_err $? "Wrong number of entries in br-test${i}"
78104913912SIdo Schimmel	done
78204913912SIdo Schimmel
78304913912SIdo Schimmel	# Cleanup.
78404913912SIdo Schimmel	rm $batch_file
78504913912SIdo Schimmel	for i in $(seq 1 $max_bridges); do
78604913912SIdo Schimmel		ip link del dev br-test${i}
78704913912SIdo Schimmel		for j in $(seq $max_ports); do
78804913912SIdo Schimmel			ip link del dev br-test${i}-du${j}
78904913912SIdo Schimmel		done
79004913912SIdo Schimmel	done
79104913912SIdo Schimmel
79204913912SIdo Schimmel	log_test "$name large scale dump tests"
79304913912SIdo Schimmel}
79404913912SIdo Schimmel
79504913912SIdo Schimmel# Check large scale dump.
79604913912SIdo Schimmelcfg_test_dump()
79704913912SIdo Schimmel{
79804913912SIdo Schimmel	echo
79904913912SIdo Schimmel	log_info "# Large scale dump tests"
80004913912SIdo Schimmel
80104913912SIdo Schimmel	cfg_test_dump_common "IPv4" ipv4_grps_get
80204913912SIdo Schimmel	cfg_test_dump_common "IPv6" ipv6_grps_get
80304913912SIdo Schimmel	cfg_test_dump_common "L2" l2_grps_get
80404913912SIdo Schimmel}
80504913912SIdo Schimmel
806b6d00da0SIdo Schimmelcfg_test()
807b6d00da0SIdo Schimmel{
808b6d00da0SIdo Schimmel	cfg_test_host
809b6d00da0SIdo Schimmel	cfg_test_port
81004913912SIdo Schimmel	cfg_test_dump
811b6d00da0SIdo Schimmel}
812b6d00da0SIdo Schimmel
813b6d00da0SIdo Schimmel__fwd_test_host_ip()
814b6d00da0SIdo Schimmel{
815b6d00da0SIdo Schimmel	local grp=$1; shift
816e98e195dSIdo Schimmel	local dmac=$1; shift
817b6d00da0SIdo Schimmel	local src=$1; shift
818b6d00da0SIdo Schimmel	local mode=$1; shift
819b6d00da0SIdo Schimmel	local name
820b6d00da0SIdo Schimmel	local eth_type
821b6d00da0SIdo Schimmel
822b6d00da0SIdo Schimmel	RET=0
823b6d00da0SIdo Schimmel
824b6d00da0SIdo Schimmel	if [[ $mode == "-4" ]]; then
825b6d00da0SIdo Schimmel		name="IPv4"
826b6d00da0SIdo Schimmel		eth_type="ipv4"
827b6d00da0SIdo Schimmel	else
828b6d00da0SIdo Schimmel		name="IPv6"
829b6d00da0SIdo Schimmel		eth_type="ipv6"
830b6d00da0SIdo Schimmel	fi
831b6d00da0SIdo Schimmel
832b6d00da0SIdo Schimmel	tc filter add dev br0 ingress protocol 802.1q pref 1 handle 1 flower \
833b6d00da0SIdo Schimmel		vlan_ethtype $eth_type vlan_id 10 dst_ip $grp src_ip $src \
834b6d00da0SIdo Schimmel		action drop
835b6d00da0SIdo Schimmel
836b6d00da0SIdo Schimmel	# Packet should only be flooded to multicast router ports when there is
837b6d00da0SIdo Schimmel	# no matching MDB entry. The bridge is not configured as a multicast
838b6d00da0SIdo Schimmel	# router port.
839e98e195dSIdo Schimmel	$MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $src -B $grp -t udp -q
840b6d00da0SIdo Schimmel	tc_check_packets "dev br0 ingress" 1 0
841b6d00da0SIdo Schimmel	check_err $? "Packet locally received after flood"
842b6d00da0SIdo Schimmel
843b6d00da0SIdo Schimmel	# Install a regular port group entry and expect the packet to not be
844b6d00da0SIdo Schimmel	# locally received.
845b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp2 grp $grp temp vid 10
846e98e195dSIdo Schimmel	$MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $src -B $grp -t udp -q
847b6d00da0SIdo Schimmel	tc_check_packets "dev br0 ingress" 1 0
848b6d00da0SIdo Schimmel	check_err $? "Packet locally received after installing a regular entry"
849b6d00da0SIdo Schimmel
850b6d00da0SIdo Schimmel	# Add a host entry and expect the packet to be locally received.
851b6d00da0SIdo Schimmel	bridge mdb add dev br0 port br0 grp $grp temp vid 10
852e98e195dSIdo Schimmel	$MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $src -B $grp -t udp -q
853b6d00da0SIdo Schimmel	tc_check_packets "dev br0 ingress" 1 1
854b6d00da0SIdo Schimmel	check_err $? "Packet not locally received after adding a host entry"
855b6d00da0SIdo Schimmel
856b6d00da0SIdo Schimmel	# Remove the host entry and expect the packet to not be locally
857b6d00da0SIdo Schimmel	# received.
858b6d00da0SIdo Schimmel	bridge mdb del dev br0 port br0 grp $grp vid 10
859e98e195dSIdo Schimmel	$MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $src -B $grp -t udp -q
860b6d00da0SIdo Schimmel	tc_check_packets "dev br0 ingress" 1 1
861b6d00da0SIdo Schimmel	check_err $? "Packet locally received after removing a host entry"
862b6d00da0SIdo Schimmel
863b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp2 grp $grp vid 10
864b6d00da0SIdo Schimmel
865b6d00da0SIdo Schimmel	tc filter del dev br0 ingress protocol 802.1q pref 1 handle 1 flower
866b6d00da0SIdo Schimmel
867b6d00da0SIdo Schimmel	log_test "$name host entries forwarding tests"
868b6d00da0SIdo Schimmel}
869b6d00da0SIdo Schimmel
870b6d00da0SIdo Schimmelfwd_test_host_ip()
871b6d00da0SIdo Schimmel{
872e98e195dSIdo Schimmel	__fwd_test_host_ip "239.1.1.1" "01:00:5e:01:01:01" "192.0.2.1" "-4"
873e98e195dSIdo Schimmel	__fwd_test_host_ip "ff0e::1" "33:33:00:00:00:01" "2001:db8:1::1" "-6"
874b6d00da0SIdo Schimmel}
875b6d00da0SIdo Schimmel
876b6d00da0SIdo Schimmelfwd_test_host_l2()
877b6d00da0SIdo Schimmel{
878b6d00da0SIdo Schimmel	local dmac=01:02:03:04:05:06
879b6d00da0SIdo Schimmel
880b6d00da0SIdo Schimmel	RET=0
881b6d00da0SIdo Schimmel
882b6d00da0SIdo Schimmel	tc filter add dev br0 ingress protocol all pref 1 handle 1 flower \
883b6d00da0SIdo Schimmel		dst_mac $dmac action drop
884b6d00da0SIdo Schimmel
885b6d00da0SIdo Schimmel	# Packet should be flooded and locally received when there is no
886b6d00da0SIdo Schimmel	# matching MDB entry.
887b6d00da0SIdo Schimmel	$MZ $h1.10 -c 1 -p 128 -a own -b $dmac -q
888b6d00da0SIdo Schimmel	tc_check_packets "dev br0 ingress" 1 1
889b6d00da0SIdo Schimmel	check_err $? "Packet not locally received after flood"
890b6d00da0SIdo Schimmel
891b6d00da0SIdo Schimmel	# Install a regular port group entry and expect the packet to not be
892b6d00da0SIdo Schimmel	# locally received.
893b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp2 grp $dmac permanent vid 10
894b6d00da0SIdo Schimmel	$MZ $h1.10 -c 1 -p 128 -a own -b $dmac -q
895b6d00da0SIdo Schimmel	tc_check_packets "dev br0 ingress" 1 1
896b6d00da0SIdo Schimmel	check_err $? "Packet locally received after installing a regular entry"
897b6d00da0SIdo Schimmel
898b6d00da0SIdo Schimmel	# Add a host entry and expect the packet to be locally received.
899b6d00da0SIdo Schimmel	bridge mdb add dev br0 port br0 grp $dmac permanent vid 10
900b6d00da0SIdo Schimmel	$MZ $h1.10 -c 1 -p 128 -a own -b $dmac -q
901b6d00da0SIdo Schimmel	tc_check_packets "dev br0 ingress" 1 2
902b6d00da0SIdo Schimmel	check_err $? "Packet not locally received after adding a host entry"
903b6d00da0SIdo Schimmel
904b6d00da0SIdo Schimmel	# Remove the host entry and expect the packet to not be locally
905b6d00da0SIdo Schimmel	# received.
906b6d00da0SIdo Schimmel	bridge mdb del dev br0 port br0 grp $dmac permanent vid 10
907b6d00da0SIdo Schimmel	$MZ $h1.10 -c 1 -p 128 -a own -b $dmac -q
908b6d00da0SIdo Schimmel	tc_check_packets "dev br0 ingress" 1 2
909b6d00da0SIdo Schimmel	check_err $? "Packet locally received after removing a host entry"
910b6d00da0SIdo Schimmel
911b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp2 grp $dmac permanent vid 10
912b6d00da0SIdo Schimmel
913b6d00da0SIdo Schimmel	tc filter del dev br0 ingress protocol all pref 1 handle 1 flower
914b6d00da0SIdo Schimmel
915b6d00da0SIdo Schimmel	log_test "L2 host entries forwarding tests"
916b6d00da0SIdo Schimmel}
917b6d00da0SIdo Schimmel
918b6d00da0SIdo Schimmelfwd_test_host()
919b6d00da0SIdo Schimmel{
920b6d00da0SIdo Schimmel	# Disable multicast router on the bridge to ensure that packets are
921b6d00da0SIdo Schimmel	# only locally received when a matching host entry is present.
922b6d00da0SIdo Schimmel	ip link set dev br0 type bridge mcast_router 0
923b6d00da0SIdo Schimmel
924b6d00da0SIdo Schimmel	fwd_test_host_ip
925b6d00da0SIdo Schimmel	fwd_test_host_l2
926b6d00da0SIdo Schimmel
927b6d00da0SIdo Schimmel	ip link set dev br0 type bridge mcast_router 1
928b6d00da0SIdo Schimmel}
929b6d00da0SIdo Schimmel
930b6d00da0SIdo Schimmel__fwd_test_port_ip()
931b6d00da0SIdo Schimmel{
932b6d00da0SIdo Schimmel	local grp=$1; shift
933e98e195dSIdo Schimmel	local dmac=$1; shift
934b6d00da0SIdo Schimmel	local valid_src=$1; shift
935b6d00da0SIdo Schimmel	local invalid_src=$1; shift
936b6d00da0SIdo Schimmel	local mode=$1; shift
937b6d00da0SIdo Schimmel	local filter_mode=$1; shift
938b6d00da0SIdo Schimmel	local name
939b6d00da0SIdo Schimmel	local eth_type
940b6d00da0SIdo Schimmel	local src_list
941b6d00da0SIdo Schimmel
942b6d00da0SIdo Schimmel	RET=0
943b6d00da0SIdo Schimmel
944b6d00da0SIdo Schimmel	if [[ $mode == "-4" ]]; then
945b6d00da0SIdo Schimmel		name="IPv4"
946b6d00da0SIdo Schimmel		eth_type="ipv4"
947b6d00da0SIdo Schimmel	else
948b6d00da0SIdo Schimmel		name="IPv6"
949b6d00da0SIdo Schimmel		eth_type="ipv6"
950b6d00da0SIdo Schimmel	fi
951b6d00da0SIdo Schimmel
952b6d00da0SIdo Schimmel	# The valid source is the one we expect to get packets from after
953b6d00da0SIdo Schimmel	# adding the entry.
954b6d00da0SIdo Schimmel	if [[ $filter_mode == "include" ]]; then
955b6d00da0SIdo Schimmel		src_list=$valid_src
956b6d00da0SIdo Schimmel	else
957b6d00da0SIdo Schimmel		src_list=$invalid_src
958b6d00da0SIdo Schimmel	fi
959b6d00da0SIdo Schimmel
960b6d00da0SIdo Schimmel	tc filter add dev $h2 ingress protocol 802.1q pref 1 handle 1 flower \
961b6d00da0SIdo Schimmel		vlan_ethtype $eth_type vlan_id 10 dst_ip $grp \
962b6d00da0SIdo Schimmel		src_ip $valid_src action drop
963b6d00da0SIdo Schimmel	tc filter add dev $h2 ingress protocol 802.1q pref 1 handle 2 flower \
964b6d00da0SIdo Schimmel		vlan_ethtype $eth_type vlan_id 10 dst_ip $grp \
965b6d00da0SIdo Schimmel		src_ip $invalid_src action drop
966b6d00da0SIdo Schimmel
967e98e195dSIdo Schimmel	$MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $valid_src -B $grp -t udp -q
968b6d00da0SIdo Schimmel	tc_check_packets "dev $h2 ingress" 1 0
969b6d00da0SIdo Schimmel	check_err $? "Packet from valid source received on H2 before adding entry"
970b6d00da0SIdo Schimmel
971e98e195dSIdo Schimmel	$MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $invalid_src -B $grp -t udp -q
972b6d00da0SIdo Schimmel	tc_check_packets "dev $h2 ingress" 2 0
973b6d00da0SIdo Schimmel	check_err $? "Packet from invalid source received on H2 before adding entry"
974b6d00da0SIdo Schimmel
975b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp2 grp $grp vid 10 \
976b6d00da0SIdo Schimmel		filter_mode $filter_mode source_list $src_list
977b6d00da0SIdo Schimmel
978e98e195dSIdo Schimmel	$MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $valid_src -B $grp -t udp -q
979b6d00da0SIdo Schimmel	tc_check_packets "dev $h2 ingress" 1 1
980b6d00da0SIdo Schimmel	check_err $? "Packet from valid source not received on H2 after adding entry"
981b6d00da0SIdo Schimmel
982e98e195dSIdo Schimmel	$MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $invalid_src -B $grp -t udp -q
983b6d00da0SIdo Schimmel	tc_check_packets "dev $h2 ingress" 2 0
984b6d00da0SIdo Schimmel	check_err $? "Packet from invalid source received on H2 after adding entry"
985b6d00da0SIdo Schimmel
986b6d00da0SIdo Schimmel	bridge mdb replace dev br0 port $swp2 grp $grp vid 10 \
987b6d00da0SIdo Schimmel		filter_mode exclude
988b6d00da0SIdo Schimmel
989e98e195dSIdo Schimmel	$MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $valid_src -B $grp -t udp -q
990b6d00da0SIdo Schimmel	tc_check_packets "dev $h2 ingress" 1 2
991b6d00da0SIdo Schimmel	check_err $? "Packet from valid source not received on H2 after allowing all sources"
992b6d00da0SIdo Schimmel
993e98e195dSIdo Schimmel	$MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $invalid_src -B $grp -t udp -q
994b6d00da0SIdo Schimmel	tc_check_packets "dev $h2 ingress" 2 1
995b6d00da0SIdo Schimmel	check_err $? "Packet from invalid source not received on H2 after allowing all sources"
996b6d00da0SIdo Schimmel
997b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp2 grp $grp vid 10
998b6d00da0SIdo Schimmel
999e98e195dSIdo Schimmel	$MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $valid_src -B $grp -t udp -q
1000b6d00da0SIdo Schimmel	tc_check_packets "dev $h2 ingress" 1 2
1001b6d00da0SIdo Schimmel	check_err $? "Packet from valid source received on H2 after deleting entry"
1002b6d00da0SIdo Schimmel
1003e98e195dSIdo Schimmel	$MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $invalid_src -B $grp -t udp -q
1004b6d00da0SIdo Schimmel	tc_check_packets "dev $h2 ingress" 2 1
1005b6d00da0SIdo Schimmel	check_err $? "Packet from invalid source received on H2 after deleting entry"
1006b6d00da0SIdo Schimmel
1007b6d00da0SIdo Schimmel	tc filter del dev $h2 ingress protocol 802.1q pref 1 handle 2 flower
1008b6d00da0SIdo Schimmel	tc filter del dev $h2 ingress protocol 802.1q pref 1 handle 1 flower
1009b6d00da0SIdo Schimmel
1010b6d00da0SIdo Schimmel	log_test "$name port group \"$filter_mode\" entries forwarding tests"
1011b6d00da0SIdo Schimmel}
1012b6d00da0SIdo Schimmel
1013b6d00da0SIdo Schimmelfwd_test_port_ip()
1014b6d00da0SIdo Schimmel{
1015e98e195dSIdo Schimmel	__fwd_test_port_ip "239.1.1.1" "01:00:5e:01:01:01" "192.0.2.1" "192.0.2.2" "-4" "exclude"
1016e98e195dSIdo Schimmel	__fwd_test_port_ip "ff0e::1" "33:33:00:00:00:01" "2001:db8:1::1" "2001:db8:1::2" "-6" \
1017b6d00da0SIdo Schimmel		"exclude"
1018e98e195dSIdo Schimmel	__fwd_test_port_ip "239.1.1.1" "01:00:5e:01:01:01" "192.0.2.1" "192.0.2.2" "-4" "include"
1019e98e195dSIdo Schimmel	__fwd_test_port_ip "ff0e::1" "33:33:00:00:00:01" "2001:db8:1::1" "2001:db8:1::2" "-6" \
1020b6d00da0SIdo Schimmel		"include"
1021b6d00da0SIdo Schimmel}
1022b6d00da0SIdo Schimmel
1023b6d00da0SIdo Schimmelfwd_test_port_l2()
1024b6d00da0SIdo Schimmel{
1025b6d00da0SIdo Schimmel	local dmac=01:02:03:04:05:06
1026b6d00da0SIdo Schimmel
1027b6d00da0SIdo Schimmel	RET=0
1028b6d00da0SIdo Schimmel
1029b6d00da0SIdo Schimmel	tc filter add dev $h2 ingress protocol all pref 1 handle 1 flower \
1030b6d00da0SIdo Schimmel		dst_mac $dmac action drop
1031b6d00da0SIdo Schimmel
1032b6d00da0SIdo Schimmel	$MZ $h1.10 -c 1 -p 128 -a own -b $dmac -q
1033b6d00da0SIdo Schimmel	tc_check_packets "dev $h2 ingress" 1 0
1034b6d00da0SIdo Schimmel	check_err $? "Packet received on H2 before adding entry"
1035b6d00da0SIdo Schimmel
1036b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp2 grp $dmac permanent vid 10
1037b6d00da0SIdo Schimmel	$MZ $h1.10 -c 1 -p 128 -a own -b $dmac -q
1038b6d00da0SIdo Schimmel	tc_check_packets "dev $h2 ingress" 1 1
1039b6d00da0SIdo Schimmel	check_err $? "Packet not received on H2 after adding entry"
1040b6d00da0SIdo Schimmel
1041b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp2 grp $dmac permanent vid 10
1042b6d00da0SIdo Schimmel	$MZ $h1.10 -c 1 -p 128 -a own -b $dmac -q
1043b6d00da0SIdo Schimmel	tc_check_packets "dev $h2 ingress" 1 1
1044b6d00da0SIdo Schimmel	check_err $? "Packet received on H2 after deleting entry"
1045b6d00da0SIdo Schimmel
1046b6d00da0SIdo Schimmel	tc filter del dev $h2 ingress protocol all pref 1 handle 1 flower
1047b6d00da0SIdo Schimmel
1048b6d00da0SIdo Schimmel	log_test "L2 port entries forwarding tests"
1049b6d00da0SIdo Schimmel}
1050b6d00da0SIdo Schimmel
1051b6d00da0SIdo Schimmelfwd_test_port()
1052b6d00da0SIdo Schimmel{
1053b6d00da0SIdo Schimmel	# Disable multicast flooding to ensure that packets are only forwarded
1054b6d00da0SIdo Schimmel	# out of a port when a matching port group entry is present.
1055b6d00da0SIdo Schimmel	bridge link set dev $swp2 mcast_flood off
1056b6d00da0SIdo Schimmel
1057b6d00da0SIdo Schimmel	fwd_test_port_ip
1058b6d00da0SIdo Schimmel	fwd_test_port_l2
1059b6d00da0SIdo Schimmel
1060b6d00da0SIdo Schimmel	bridge link set dev $swp2 mcast_flood on
1061b6d00da0SIdo Schimmel}
1062b6d00da0SIdo Schimmel
1063b6d00da0SIdo Schimmelfwd_test()
1064b6d00da0SIdo Schimmel{
1065b6d00da0SIdo Schimmel	echo
1066b6d00da0SIdo Schimmel	log_info "# Forwarding tests"
1067b6d00da0SIdo Schimmel
1068c3e0cfe7SIdo Schimmel	# Set the Max Response Delay to 100 centiseconds (1 second) so that the
1069c3e0cfe7SIdo Schimmel	# bridge will start forwarding according to its MDB soon after a
1070c3e0cfe7SIdo Schimmel	# multicast querier is enabled.
1071c3e0cfe7SIdo Schimmel	ip link set dev br0 type bridge mcast_query_response_interval 100
1072c3e0cfe7SIdo Schimmel
1073b6d00da0SIdo Schimmel	# Forwarding according to MDB entries only takes place when the bridge
1074b6d00da0SIdo Schimmel	# detects that there is a valid querier in the network. Set the bridge
1075b6d00da0SIdo Schimmel	# as the querier and assign it a valid IPv6 link-local address to be
1076b6d00da0SIdo Schimmel	# used as the source address for MLD queries.
1077b6d00da0SIdo Schimmel	ip -6 address add fe80::1/64 nodad dev br0
1078b6d00da0SIdo Schimmel	ip link set dev br0 type bridge mcast_querier 1
1079b6d00da0SIdo Schimmel	sleep 10
1080b6d00da0SIdo Schimmel
1081b6d00da0SIdo Schimmel	fwd_test_host
1082b6d00da0SIdo Schimmel	fwd_test_port
1083b6d00da0SIdo Schimmel
1084b6d00da0SIdo Schimmel	ip link set dev br0 type bridge mcast_querier 0
1085b6d00da0SIdo Schimmel	ip -6 address del fe80::1/64 dev br0
1086c3e0cfe7SIdo Schimmel	ip link set dev br0 type bridge mcast_query_response_interval 1000
1087b6d00da0SIdo Schimmel}
1088b6d00da0SIdo Schimmel
1089b6d00da0SIdo Schimmelctrl_igmpv3_is_in_test()
1090b6d00da0SIdo Schimmel{
1091b6d00da0SIdo Schimmel	RET=0
1092b6d00da0SIdo Schimmel
1093b6d00da0SIdo Schimmel	# Add a permanent entry and check that it is not affected by the
1094b6d00da0SIdo Schimmel	# received IGMP packet.
1095b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp 239.1.1.1 permanent vid 10 \
1096b6d00da0SIdo Schimmel		filter_mode include source_list 192.0.2.1
1097b6d00da0SIdo Schimmel
1098b6d00da0SIdo Schimmel	# IS_IN ( 192.0.2.2 )
1099e98e195dSIdo Schimmel	$MZ $h1.10 -c 1 -a own -b 01:00:5e:01:01:01 -A 192.0.2.1 -B 239.1.1.1 \
1100506a1ac9SPetr Machata		-t ip proto=2,p=$(igmpv3_is_in_get 239.1.1.1 192.0.2.2) -q
1101b6d00da0SIdo Schimmel
1102925fd1a0SIdo Schimmel	bridge mdb get dev br0 grp 239.1.1.1 src 192.0.2.2 vid 10 &> /dev/null
1103b6d00da0SIdo Schimmel	check_fail $? "Permanent entry affected by IGMP packet"
1104b6d00da0SIdo Schimmel
1105b6d00da0SIdo Schimmel	# Replace the permanent entry with a temporary one and check that after
1106b6d00da0SIdo Schimmel	# processing the IGMP packet, a new source is added to the list along
1107b6d00da0SIdo Schimmel	# with a new forwarding entry.
1108b6d00da0SIdo Schimmel	bridge mdb replace dev br0 port $swp1 grp 239.1.1.1 temp vid 10 \
1109b6d00da0SIdo Schimmel		filter_mode include source_list 192.0.2.1
1110b6d00da0SIdo Schimmel
1111b6d00da0SIdo Schimmel	# IS_IN ( 192.0.2.2 )
1112e98e195dSIdo Schimmel	$MZ $h1.10 -a own -b 01:00:5e:01:01:01 -c 1 -A 192.0.2.1 -B 239.1.1.1 \
1113506a1ac9SPetr Machata		-t ip proto=2,p=$(igmpv3_is_in_get 239.1.1.1 192.0.2.2) -q
1114b6d00da0SIdo Schimmel
1115925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp 239.1.1.1 vid 10 | grep -q 192.0.2.2
1116b6d00da0SIdo Schimmel	check_err $? "Source not add to source list"
1117b6d00da0SIdo Schimmel
1118925fd1a0SIdo Schimmel	bridge mdb get dev br0 grp 239.1.1.1 src 192.0.2.2 vid 10 &> /dev/null
1119b6d00da0SIdo Schimmel	check_err $? "(S, G) entry not created for new source"
1120b6d00da0SIdo Schimmel
1121b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 grp 239.1.1.1 vid 10
1122b6d00da0SIdo Schimmel
1123f7ccf60cSPetr Machata	log_test "IGMPv3 MODE_IS_INCLUDE tests"
1124b6d00da0SIdo Schimmel}
1125b6d00da0SIdo Schimmel
1126b6d00da0SIdo Schimmelctrl_mldv2_is_in_test()
1127b6d00da0SIdo Schimmel{
1128b6d00da0SIdo Schimmel	RET=0
1129b6d00da0SIdo Schimmel
1130b6d00da0SIdo Schimmel	# Add a permanent entry and check that it is not affected by the
1131b6d00da0SIdo Schimmel	# received MLD packet.
1132b6d00da0SIdo Schimmel	bridge mdb add dev br0 port $swp1 grp ff0e::1 permanent vid 10 \
1133b6d00da0SIdo Schimmel		filter_mode include source_list 2001:db8:1::1
1134b6d00da0SIdo Schimmel
1135b6d00da0SIdo Schimmel	# IS_IN ( 2001:db8:1::2 )
1136506a1ac9SPetr Machata	local p=$(mldv2_is_in_get fe80::1 ff0e::1 2001:db8:1::2)
1137e98e195dSIdo Schimmel	$MZ -6 $h1.10 -a own -b 33:33:00:00:00:01 -c 1 -A fe80::1 -B ff0e::1 \
1138506a1ac9SPetr Machata		-t ip hop=1,next=0,p="$p" -q
1139b6d00da0SIdo Schimmel
1140925fd1a0SIdo Schimmel	bridge mdb get dev br0 grp ff0e::1 src 2001:db8:1::2 vid 10 &> /dev/null
1141b6d00da0SIdo Schimmel	check_fail $? "Permanent entry affected by MLD packet"
1142b6d00da0SIdo Schimmel
1143b6d00da0SIdo Schimmel	# Replace the permanent entry with a temporary one and check that after
1144b6d00da0SIdo Schimmel	# processing the MLD packet, a new source is added to the list along
1145b6d00da0SIdo Schimmel	# with a new forwarding entry.
1146b6d00da0SIdo Schimmel	bridge mdb replace dev br0 port $swp1 grp ff0e::1 temp vid 10 \
1147b6d00da0SIdo Schimmel		filter_mode include source_list 2001:db8:1::1
1148b6d00da0SIdo Schimmel
1149b6d00da0SIdo Schimmel	# IS_IN ( 2001:db8:1::2 )
1150e98e195dSIdo Schimmel	$MZ -6 $h1.10 -a own -b 33:33:00:00:00:01 -c 1 -A fe80::1 -B ff0e::1 \
1151506a1ac9SPetr Machata		-t ip hop=1,next=0,p="$p" -q
1152b6d00da0SIdo Schimmel
1153925fd1a0SIdo Schimmel	bridge -d mdb get dev br0 grp ff0e::1 vid 10 | grep -q 2001:db8:1::2
1154b6d00da0SIdo Schimmel	check_err $? "Source not add to source list"
1155b6d00da0SIdo Schimmel
1156925fd1a0SIdo Schimmel	bridge mdb get dev br0 grp ff0e::1 src 2001:db8:1::2 vid 10 &> /dev/null
1157b6d00da0SIdo Schimmel	check_err $? "(S, G) entry not created for new source"
1158b6d00da0SIdo Schimmel
1159b6d00da0SIdo Schimmel	bridge mdb del dev br0 port $swp1 grp ff0e::1 vid 10
1160b6d00da0SIdo Schimmel
1161b6d00da0SIdo Schimmel	log_test "MLDv2 MODE_IS_INCLUDE tests"
1162b6d00da0SIdo Schimmel}
1163b6d00da0SIdo Schimmel
1164b6d00da0SIdo Schimmelctrl_test()
1165b6d00da0SIdo Schimmel{
1166b6d00da0SIdo Schimmel	echo
1167b6d00da0SIdo Schimmel	log_info "# Control packets tests"
1168b6d00da0SIdo Schimmel
1169b6d00da0SIdo Schimmel	ctrl_igmpv3_is_in_test
1170b6d00da0SIdo Schimmel	ctrl_mldv2_is_in_test
1171b6d00da0SIdo Schimmel}
1172b6d00da0SIdo Schimmel
1173925fd1a0SIdo Schimmelif ! bridge mdb help 2>&1 | grep -q "get"; then
1174925fd1a0SIdo Schimmel	echo "SKIP: iproute2 too old, missing bridge mdb get support"
1175ab2eda04SIdo Schimmel	exit $ksft_skip
1176ab2eda04SIdo Schimmelfi
1177ab2eda04SIdo Schimmel
1178b6d00da0SIdo Schimmeltrap cleanup EXIT
1179b6d00da0SIdo Schimmel
1180b6d00da0SIdo Schimmelsetup_prepare
1181b6d00da0SIdo Schimmelsetup_wait
1182b6d00da0SIdo Schimmeltests_run
1183b6d00da0SIdo Schimmel
1184b6d00da0SIdo Schimmelexit $EXIT_STATUS
1185