1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3#
4# This test is for checking VXLAN MDB functionality. The topology consists of
5# two sets of namespaces: One for the testing of IPv4 underlay and another for
6# IPv6. In both cases, both IPv4 and IPv6 overlay traffic are tested.
7#
8# Data path functionality is tested by sending traffic from one of the upper
9# namespaces and checking using ingress tc filters that the expected traffic
10# was received by one of the lower namespaces.
11#
12# +------------------------------------+ +------------------------------------+
13# | ns1_v4                             | | ns1_v6                             |
14# |                                    | |                                    |
15# |    br0.10    br0.4000  br0.20      | |    br0.10    br0.4000  br0.20      |
16# |       +         +         +        | |       +         +         +        |
17# |       |         |         |        | |       |         |         |        |
18# |       |         |         |        | |       |         |         |        |
19# |       +---------+---------+        | |       +---------+---------+        |
20# |                 |                  | |                 |                  |
21# |                 |                  | |                 |                  |
22# |                 +                  | |                 +                  |
23# |                br0                 | |                br0                 |
24# |                 +                  | |                 +                  |
25# |                 |                  | |                 |                  |
26# |                 |                  | |                 |                  |
27# |                 +                  | |                 +                  |
28# |                vx0                 | |                vx0                 |
29# |                                    | |                                    |
30# |                                    | |                                    |
31# |               veth0                | |               veth0                |
32# |                 +                  | |                 +                  |
33# +-----------------|------------------+ +-----------------|------------------+
34#                   |                                      |
35# +-----------------|------------------+ +-----------------|------------------+
36# |                 +                  | |                 +                  |
37# |               veth0                | |               veth0                |
38# |                                    | |                                    |
39# |                                    | |                                    |
40# |                vx0                 | |                vx0                 |
41# |                 +                  | |                 +                  |
42# |                 |                  | |                 |                  |
43# |                 |                  | |                 |                  |
44# |                 +                  | |                 +                  |
45# |                br0                 | |                br0                 |
46# |                 +                  | |                 +                  |
47# |                 |                  | |                 |                  |
48# |                 |                  | |                 |                  |
49# |       +---------+---------+        | |       +---------+---------+        |
50# |       |         |         |        | |       |         |         |        |
51# |       |         |         |        | |       |         |         |        |
52# |       +         +         +        | |       +         +         +        |
53# |    br0.10    br0.4000  br0.10      | |    br0.10    br0.4000  br0.20      |
54# |                                    | |                                    |
55# | ns2_v4                             | | ns2_v6                             |
56# +------------------------------------+ +------------------------------------+
57
58source lib.sh
59ret=0
60
61CONTROL_PATH_TESTS="
62	basic_star_g_ipv4_ipv4
63	basic_star_g_ipv6_ipv4
64	basic_star_g_ipv4_ipv6
65	basic_star_g_ipv6_ipv6
66	basic_sg_ipv4_ipv4
67	basic_sg_ipv6_ipv4
68	basic_sg_ipv4_ipv6
69	basic_sg_ipv6_ipv6
70	star_g_ipv4_ipv4
71	star_g_ipv6_ipv4
72	star_g_ipv4_ipv6
73	star_g_ipv6_ipv6
74	sg_ipv4_ipv4
75	sg_ipv6_ipv4
76	sg_ipv4_ipv6
77	sg_ipv6_ipv6
78	dump_ipv4_ipv4
79	dump_ipv6_ipv4
80	dump_ipv4_ipv6
81	dump_ipv6_ipv6
82	flush
83"
84
85DATA_PATH_TESTS="
86	encap_params_ipv4_ipv4
87	encap_params_ipv6_ipv4
88	encap_params_ipv4_ipv6
89	encap_params_ipv6_ipv6
90	starg_exclude_ir_ipv4_ipv4
91	starg_exclude_ir_ipv6_ipv4
92	starg_exclude_ir_ipv4_ipv6
93	starg_exclude_ir_ipv6_ipv6
94	starg_include_ir_ipv4_ipv4
95	starg_include_ir_ipv6_ipv4
96	starg_include_ir_ipv4_ipv6
97	starg_include_ir_ipv6_ipv6
98	starg_exclude_p2mp_ipv4_ipv4
99	starg_exclude_p2mp_ipv6_ipv4
100	starg_exclude_p2mp_ipv4_ipv6
101	starg_exclude_p2mp_ipv6_ipv6
102	starg_include_p2mp_ipv4_ipv4
103	starg_include_p2mp_ipv6_ipv4
104	starg_include_p2mp_ipv4_ipv6
105	starg_include_p2mp_ipv6_ipv6
106	egress_vni_translation_ipv4_ipv4
107	egress_vni_translation_ipv6_ipv4
108	egress_vni_translation_ipv4_ipv6
109	egress_vni_translation_ipv6_ipv6
110	all_zeros_mdb_ipv4
111	all_zeros_mdb_ipv6
112	mdb_fdb_ipv4_ipv4
113	mdb_fdb_ipv6_ipv4
114	mdb_fdb_ipv4_ipv6
115	mdb_fdb_ipv6_ipv6
116	mdb_torture_ipv4_ipv4
117	mdb_torture_ipv6_ipv4
118	mdb_torture_ipv4_ipv6
119	mdb_torture_ipv6_ipv6
120"
121
122# All tests in this script. Can be overridden with -t option.
123TESTS="
124	$CONTROL_PATH_TESTS
125	$DATA_PATH_TESTS
126"
127VERBOSE=0
128PAUSE_ON_FAIL=no
129PAUSE=no
130
131################################################################################
132# Utilities
133
134log_test()
135{
136	local rc=$1
137	local expected=$2
138	local msg="$3"
139
140	if [ ${rc} -eq ${expected} ]; then
141		printf "TEST: %-60s  [ OK ]\n" "${msg}"
142		nsuccess=$((nsuccess+1))
143	else
144		ret=1
145		nfail=$((nfail+1))
146		printf "TEST: %-60s  [FAIL]\n" "${msg}"
147		if [ "$VERBOSE" = "1" ]; then
148			echo "    rc=$rc, expected $expected"
149		fi
150
151		if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
152		echo
153			echo "hit enter to continue, 'q' to quit"
154			read a
155			[ "$a" = "q" ] && exit 1
156		fi
157	fi
158
159	if [ "${PAUSE}" = "yes" ]; then
160		echo
161		echo "hit enter to continue, 'q' to quit"
162		read a
163		[ "$a" = "q" ] && exit 1
164	fi
165
166	[ "$VERBOSE" = "1" ] && echo
167}
168
169run_cmd()
170{
171	local cmd="$1"
172	local out
173	local stderr="2>/dev/null"
174
175	if [ "$VERBOSE" = "1" ]; then
176		printf "COMMAND: $cmd\n"
177		stderr=
178	fi
179
180	out=$(eval $cmd $stderr)
181	rc=$?
182	if [ "$VERBOSE" = "1" -a -n "$out" ]; then
183		echo "    $out"
184	fi
185
186	return $rc
187}
188
189tc_check_packets()
190{
191	local ns=$1; shift
192	local id=$1; shift
193	local handle=$1; shift
194	local count=$1; shift
195	local pkts
196
197	sleep 0.1
198	pkts=$(tc -n $ns -j -s filter show $id \
199		| jq ".[] | select(.options.handle == $handle) | \
200		.options.actions[0].stats.packets")
201	[[ $pkts == $count ]]
202}
203
204################################################################################
205# Setup
206
207setup_common_ns()
208{
209	local ns=$1; shift
210	local local_addr=$1; shift
211
212	ip netns exec $ns sysctl -qw net.ipv4.ip_forward=1
213	ip netns exec $ns sysctl -qw net.ipv4.fib_multipath_use_neigh=1
214	ip netns exec $ns sysctl -qw net.ipv4.conf.default.ignore_routes_with_linkdown=1
215	ip netns exec $ns sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1
216	ip netns exec $ns sysctl -qw net.ipv6.conf.all.forwarding=1
217	ip netns exec $ns sysctl -qw net.ipv6.conf.default.forwarding=1
218	ip netns exec $ns sysctl -qw net.ipv6.conf.default.ignore_routes_with_linkdown=1
219	ip netns exec $ns sysctl -qw net.ipv6.conf.all.accept_dad=0
220	ip netns exec $ns sysctl -qw net.ipv6.conf.default.accept_dad=0
221
222	ip -n $ns link set dev lo up
223	ip -n $ns address add $local_addr dev lo
224
225	ip -n $ns link set dev veth0 up
226
227	ip -n $ns link add name br0 up type bridge vlan_filtering 1 \
228		vlan_default_pvid 0 mcast_snooping 0
229
230	ip -n $ns link add link br0 name br0.10 up type vlan id 10
231	bridge -n $ns vlan add vid 10 dev br0 self
232
233	ip -n $ns link add link br0 name br0.20 up type vlan id 20
234	bridge -n $ns vlan add vid 20 dev br0 self
235
236	ip -n $ns link add link br0 name br0.4000 up type vlan id 4000
237	bridge -n $ns vlan add vid 4000 dev br0 self
238
239	ip -n $ns link add name vx0 up master br0 type vxlan \
240		local $local_addr dstport 4789 external vnifilter
241	bridge -n $ns link set dev vx0 vlan_tunnel on
242
243	bridge -n $ns vlan add vid 10 dev vx0
244	bridge -n $ns vlan add vid 10 dev vx0 tunnel_info id 10010
245	bridge -n $ns vni add vni 10010 dev vx0
246
247	bridge -n $ns vlan add vid 20 dev vx0
248	bridge -n $ns vlan add vid 20 dev vx0 tunnel_info id 10020
249	bridge -n $ns vni add vni 10020 dev vx0
250
251	bridge -n $ns vlan add vid 4000 dev vx0 pvid
252	bridge -n $ns vlan add vid 4000 dev vx0 tunnel_info id 14000
253	bridge -n $ns vni add vni 14000 dev vx0
254}
255
256setup_common()
257{
258	local ns1=$1; shift
259	local ns2=$1; shift
260	local local_addr1=$1; shift
261	local local_addr2=$1; shift
262
263	ip link add name veth0 type veth peer name veth1
264	ip link set dev veth0 netns $ns1 name veth0
265	ip link set dev veth1 netns $ns2 name veth0
266
267	setup_common_ns $ns1 $local_addr1
268	setup_common_ns $ns2 $local_addr2
269}
270
271setup_v4()
272{
273	setup_ns ns1_v4 ns2_v4
274	setup_common $ns1_v4 $ns2_v4 192.0.2.1 192.0.2.2
275
276	ip -n $ns1_v4 address add 192.0.2.17/28 dev veth0
277	ip -n $ns2_v4 address add 192.0.2.18/28 dev veth0
278
279	ip -n $ns1_v4 route add default via 192.0.2.18
280	ip -n $ns2_v4 route add default via 192.0.2.17
281}
282
283cleanup_v4()
284{
285	cleanup_ns $ns2_v4 $ns1_v4
286}
287
288setup_v6()
289{
290	setup_ns ns1_v6 ns2_v6
291	setup_common $ns1_v6 $ns2_v6 2001:db8:1::1 2001:db8:1::2
292
293	ip -n $ns1_v6 address add 2001:db8:2::1/64 dev veth0 nodad
294	ip -n $ns2_v6 address add 2001:db8:2::2/64 dev veth0 nodad
295
296	ip -n $ns1_v6 route add default via 2001:db8:2::2
297	ip -n $ns2_v6 route add default via 2001:db8:2::1
298}
299
300cleanup_v6()
301{
302	cleanup_ns $ns2_v6 $ns1_v6
303}
304
305setup()
306{
307	set -e
308
309	setup_v4
310	setup_v6
311
312	sleep 5
313
314	set +e
315}
316
317cleanup()
318{
319	cleanup_v6 &> /dev/null
320	cleanup_v4 &> /dev/null
321}
322
323################################################################################
324# Tests - Control path
325
326basic_common()
327{
328	local ns1=$1; shift
329	local grp_key=$1; shift
330	local vtep_ip=$1; shift
331
332	# Test basic control path operations common to all MDB entry types.
333
334	# Basic add, replace and delete behavior.
335	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"
336	log_test $? 0 "MDB entry addition"
337	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010"
338	log_test $? 0 "MDB entry presence after addition"
339
340	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"
341	log_test $? 0 "MDB entry replacement"
342	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010"
343	log_test $? 0 "MDB entry presence after replacement"
344
345	run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
346	log_test $? 0 "MDB entry deletion"
347	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010"
348	log_test $? 254 "MDB entry presence after deletion"
349
350	run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
351	log_test $? 255 "Non-existent MDB entry deletion"
352
353	# Default protocol and replacement.
354	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"
355	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010 | grep \"proto static\""
356	log_test $? 0 "MDB entry default protocol"
357
358	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 $grp_key permanent proto 123 dst $vtep_ip src_vni 10010"
359	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010 | grep \"proto 123\""
360	log_test $? 0 "MDB entry protocol replacement"
361
362	run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
363
364	# Default destination port and replacement.
365	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"
366	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010 | grep \" dst_port \""
367	log_test $? 1 "MDB entry default destination port"
368
369	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 $grp_key permanent dst $vtep_ip dst_port 1234 src_vni 10010"
370	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010 | grep \"dst_port 1234\""
371	log_test $? 0 "MDB entry destination port replacement"
372
373	run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
374
375	# Default destination VNI and replacement.
376	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"
377	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010 | grep \" vni \""
378	log_test $? 1 "MDB entry default destination VNI"
379
380	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 $grp_key permanent dst $vtep_ip vni 1234 src_vni 10010"
381	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010 | grep \"vni 1234\""
382	log_test $? 0 "MDB entry destination VNI replacement"
383
384	run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
385
386	# Default outgoing interface and replacement.
387	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"
388	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010 | grep \" via \""
389	log_test $? 1 "MDB entry default outgoing interface"
390
391	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010 via veth0"
392	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010 | grep \"via veth0\""
393	log_test $? 0 "MDB entry outgoing interface replacement"
394
395	run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
396
397	# Common error cases.
398	run_cmd "bridge -n $ns1 mdb add dev vx0 port veth0 $grp_key permanent dst $vtep_ip src_vni 10010"
399	log_test $? 255 "MDB entry with mismatch between device and port"
400
401	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key temp dst $vtep_ip src_vni 10010"
402	log_test $? 255 "MDB entry with temp state"
403
404	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent vid 10 dst $vtep_ip src_vni 10010"
405	log_test $? 255 "MDB entry with VLAN"
406
407	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp 01:02:03:04:05:06 permanent dst $vtep_ip src_vni 10010"
408	log_test $? 255 "MDB entry MAC address"
409
410	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent"
411	log_test $? 255 "MDB entry without extended parameters"
412
413	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent proto 3 dst $vtep_ip src_vni 10010"
414	log_test $? 255 "MDB entry with an invalid protocol"
415
416	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip vni $((2 ** 24)) src_vni 10010"
417	log_test $? 255 "MDB entry with an invalid destination VNI"
418
419	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni $((2 ** 24))"
420	log_test $? 255 "MDB entry with an invalid source VNI"
421
422	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent src_vni 10010"
423	log_test $? 255 "MDB entry without a remote destination IP"
424
425	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"
426	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"
427	log_test $? 255 "Duplicate MDB entries"
428	run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
429}
430
431basic_star_g_ipv4_ipv4()
432{
433	local ns1=$ns1_v4
434	local grp_key="grp 239.1.1.1"
435	local vtep_ip=198.51.100.100
436
437	echo
438	echo "Control path: Basic (*, G) operations - IPv4 overlay / IPv4 underlay"
439	echo "--------------------------------------------------------------------"
440
441	basic_common $ns1 "$grp_key" $vtep_ip
442}
443
444basic_star_g_ipv6_ipv4()
445{
446	local ns1=$ns1_v4
447	local grp_key="grp ff0e::1"
448	local vtep_ip=198.51.100.100
449
450	echo
451	echo "Control path: Basic (*, G) operations - IPv6 overlay / IPv4 underlay"
452	echo "--------------------------------------------------------------------"
453
454	basic_common $ns1 "$grp_key" $vtep_ip
455}
456
457basic_star_g_ipv4_ipv6()
458{
459	local ns1=$ns1_v6
460	local grp_key="grp 239.1.1.1"
461	local vtep_ip=2001:db8:1000::1
462
463	echo
464	echo "Control path: Basic (*, G) operations - IPv4 overlay / IPv6 underlay"
465	echo "--------------------------------------------------------------------"
466
467	basic_common $ns1 "$grp_key" $vtep_ip
468}
469
470basic_star_g_ipv6_ipv6()
471{
472	local ns1=$ns1_v6
473	local grp_key="grp ff0e::1"
474	local vtep_ip=2001:db8:1000::1
475
476	echo
477	echo "Control path: Basic (*, G) operations - IPv6 overlay / IPv6 underlay"
478	echo "--------------------------------------------------------------------"
479
480	basic_common $ns1 "$grp_key" $vtep_ip
481}
482
483basic_sg_ipv4_ipv4()
484{
485	local ns1=$ns1_v4
486	local grp_key="grp 239.1.1.1 src 192.0.2.129"
487	local vtep_ip=198.51.100.100
488
489	echo
490	echo "Control path: Basic (S, G) operations - IPv4 overlay / IPv4 underlay"
491	echo "--------------------------------------------------------------------"
492
493	basic_common $ns1 "$grp_key" $vtep_ip
494}
495
496basic_sg_ipv6_ipv4()
497{
498	local ns1=$ns1_v4
499	local grp_key="grp ff0e::1 src 2001:db8:100::1"
500	local vtep_ip=198.51.100.100
501
502	echo
503	echo "Control path: Basic (S, G) operations - IPv6 overlay / IPv4 underlay"
504	echo "---------------------------------------------------------------------"
505
506	basic_common $ns1 "$grp_key" $vtep_ip
507}
508
509basic_sg_ipv4_ipv6()
510{
511	local ns1=$ns1_v6
512	local grp_key="grp 239.1.1.1 src 192.0.2.129"
513	local vtep_ip=2001:db8:1000::1
514
515	echo
516	echo "Control path: Basic (S, G) operations - IPv4 overlay / IPv6 underlay"
517	echo "--------------------------------------------------------------------"
518
519	basic_common $ns1 "$grp_key" $vtep_ip
520}
521
522basic_sg_ipv6_ipv6()
523{
524	local ns1=$ns1_v6
525	local grp_key="grp ff0e::1 src 2001:db8:100::1"
526	local vtep_ip=2001:db8:1000::1
527
528	echo
529	echo "Control path: Basic (S, G) operations - IPv6 overlay / IPv6 underlay"
530	echo "--------------------------------------------------------------------"
531
532	basic_common $ns1 "$grp_key" $vtep_ip
533}
534
535star_g_common()
536{
537	local ns1=$1; shift
538	local grp=$1; shift
539	local src1=$1; shift
540	local src2=$1; shift
541	local src3=$1; shift
542	local vtep_ip=$1; shift
543	local all_zeros_grp=$1; shift
544
545	# Test control path operations specific to (*, G) entries.
546
547	# Basic add, replace and delete behavior.
548	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip src_vni 10010"
549	log_test $? 0 "(*, G) MDB entry addition with source list"
550	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010"
551	log_test $? 0 "(*, G) MDB entry presence after addition"
552	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010"
553	log_test $? 0 "(S, G) MDB entry presence after addition"
554
555	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip src_vni 10010"
556	log_test $? 0 "(*, G) MDB entry replacement with source list"
557	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010"
558	log_test $? 0 "(*, G) MDB entry presence after replacement"
559	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010"
560	log_test $? 0 "(S, G) MDB entry presence after replacement"
561
562	run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
563	log_test $? 0 "(*, G) MDB entry deletion"
564	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010"
565	log_test $? 254 "(*, G) MDB entry presence after deletion"
566	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010"
567	log_test $? 254 "(S, G) MDB entry presence after deletion"
568
569	# Default filter mode and replacement.
570	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent dst $vtep_ip src_vni 10010"
571	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep exclude"
572	log_test $? 0 "(*, G) MDB entry default filter mode"
573
574	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode include source_list $src1 dst $vtep_ip src_vni 10010"
575	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep include"
576	log_test $? 0 "(*, G) MDB entry after replacing filter mode to \"include\""
577	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010"
578	log_test $? 0 "(S, G) MDB entry after replacing filter mode to \"include\""
579	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep blocked"
580	log_test $? 1 "\"blocked\" flag after replacing filter mode to \"include\""
581
582	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip src_vni 10010"
583	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep exclude"
584	log_test $? 0 "(*, G) MDB entry after replacing filter mode to \"exclude\""
585	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grep grp $grp src $src1 src_vni 10010"
586	log_test $? 0 "(S, G) MDB entry after replacing filter mode to \"exclude\""
587	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep blocked"
588	log_test $? 0 "\"blocked\" flag after replacing filter mode to \"exclude\""
589
590	run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
591
592	# Default source list and replacement.
593	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent dst $vtep_ip src_vni 10010"
594	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep source_list"
595	log_test $? 1 "(*, G) MDB entry default source list"
596
597	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1,$src2,$src3 dst $vtep_ip src_vni 10010"
598	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010"
599	log_test $? 0 "(S, G) MDB entry of 1st source after replacing source list"
600	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src2 src_vni 10010"
601	log_test $? 0 "(S, G) MDB entry of 2nd source after replacing source list"
602	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src3 src_vni 10010"
603	log_test $? 0 "(S, G) MDB entry of 3rd source after replacing source list"
604
605	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1,$src3 dst $vtep_ip src_vni 10010"
606	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010"
607	log_test $? 0 "(S, G) MDB entry of 1st source after removing source"
608	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src2 src_vni 10010"
609	log_test $? 254 "(S, G) MDB entry of 2nd source after removing source"
610	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src3 src_vni 10010"
611	log_test $? 0 "(S, G) MDB entry of 3rd source after removing source"
612
613	run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
614
615	# Default protocol and replacement.
616	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip src_vni 10010"
617	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep \"proto static\""
618	log_test $? 0 "(*, G) MDB entry default protocol"
619	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep \"proto static\""
620	log_test $? 0 "(S, G) MDB entry default protocol"
621
622	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 proto bgp dst $vtep_ip src_vni 10010"
623	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep \"proto bgp\""
624	log_test $? 0 "(*, G) MDB entry protocol after replacement"
625	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep \"proto bgp\""
626	log_test $? 0 "(S, G) MDB entry protocol after replacement"
627
628	run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
629
630	# Default destination port and replacement.
631	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip src_vni 10010"
632	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep \" dst_port \""
633	log_test $? 1 "(*, G) MDB entry default destination port"
634	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep \" dst_port \""
635	log_test $? 1 "(S, G) MDB entry default destination port"
636
637	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip dst_port 1234 src_vni 10010"
638	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep \" dst_port 1234 \""
639	log_test $? 0 "(*, G) MDB entry destination port after replacement"
640	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep \" dst_port 1234 \""
641	log_test $? 0 "(S, G) MDB entry destination port after replacement"
642
643	run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
644
645	# Default destination VNI and replacement.
646	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip src_vni 10010"
647	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep \" vni \""
648	log_test $? 1 "(*, G) MDB entry default destination VNI"
649	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep \" vni \""
650	log_test $? 1 "(S, G) MDB entry default destination VNI"
651
652	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip vni 1234 src_vni 10010"
653	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep \" vni 1234 \""
654	log_test $? 0 "(*, G) MDB entry destination VNI after replacement"
655	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep \" vni 1234 \""
656	log_test $? 0 "(S, G) MDB entry destination VNI after replacement"
657
658	run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
659
660	# Default outgoing interface and replacement.
661	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip src_vni 10010"
662	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep \" via \""
663	log_test $? 1 "(*, G) MDB entry default outgoing interface"
664	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep \" via \""
665	log_test $? 1 "(S, G) MDB entry default outgoing interface"
666
667	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip src_vni 10010 via veth0"
668	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep \" via veth0 \""
669	log_test $? 0 "(*, G) MDB entry outgoing interface after replacement"
670	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep \" via veth0 \""
671	log_test $? 0 "(S, G) MDB entry outgoing interface after replacement"
672
673	run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
674
675	# Error cases.
676	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $all_zeros_grp permanent filter_mode exclude dst $vtep_ip src_vni 10010"
677	log_test $? 255 "All-zeros group with filter mode"
678
679	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $all_zeros_grp permanent source_list $src1 dst $vtep_ip src_vni 10010"
680	log_test $? 255 "All-zeros group with source list"
681
682	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent filter_mode include dst $vtep_ip src_vni 10010"
683	log_test $? 255 "(*, G) INCLUDE with an empty source list"
684
685	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $grp dst $vtep_ip src_vni 10010"
686	log_test $? 255 "Invalid source in source list"
687
688	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent source_list $src1 dst $vtep_ip src_vni 10010"
689	log_test $? 255 "Source list without filter mode"
690}
691
692star_g_ipv4_ipv4()
693{
694	local ns1=$ns1_v4
695	local grp=239.1.1.1
696	local src1=192.0.2.129
697	local src2=192.0.2.130
698	local src3=192.0.2.131
699	local vtep_ip=198.51.100.100
700	local all_zeros_grp=0.0.0.0
701
702	echo
703	echo "Control path: (*, G) operations - IPv4 overlay / IPv4 underlay"
704	echo "--------------------------------------------------------------"
705
706	star_g_common $ns1 $grp $src1 $src2 $src3 $vtep_ip $all_zeros_grp
707}
708
709star_g_ipv6_ipv4()
710{
711	local ns1=$ns1_v4
712	local grp=ff0e::1
713	local src1=2001:db8:100::1
714	local src2=2001:db8:100::2
715	local src3=2001:db8:100::3
716	local vtep_ip=198.51.100.100
717	local all_zeros_grp=::
718
719	echo
720	echo "Control path: (*, G) operations - IPv6 overlay / IPv4 underlay"
721	echo "--------------------------------------------------------------"
722
723	star_g_common $ns1 $grp $src1 $src2 $src3 $vtep_ip $all_zeros_grp
724}
725
726star_g_ipv4_ipv6()
727{
728	local ns1=$ns1_v6
729	local grp=239.1.1.1
730	local src1=192.0.2.129
731	local src2=192.0.2.130
732	local src3=192.0.2.131
733	local vtep_ip=2001:db8:1000::1
734	local all_zeros_grp=0.0.0.0
735
736	echo
737	echo "Control path: (*, G) operations - IPv4 overlay / IPv6 underlay"
738	echo "--------------------------------------------------------------"
739
740	star_g_common $ns1 $grp $src1 $src2 $src3 $vtep_ip $all_zeros_grp
741}
742
743star_g_ipv6_ipv6()
744{
745	local ns1=$ns1_v6
746	local grp=ff0e::1
747	local src1=2001:db8:100::1
748	local src2=2001:db8:100::2
749	local src3=2001:db8:100::3
750	local vtep_ip=2001:db8:1000::1
751	local all_zeros_grp=::
752
753	echo
754	echo "Control path: (*, G) operations - IPv6 overlay / IPv6 underlay"
755	echo "--------------------------------------------------------------"
756
757	star_g_common $ns1 $grp $src1 $src2 $src3 $vtep_ip $all_zeros_grp
758}
759
760sg_common()
761{
762	local ns1=$1; shift
763	local grp=$1; shift
764	local src=$1; shift
765	local vtep_ip=$1; shift
766	local all_zeros_grp=$1; shift
767
768	# Test control path operations specific to (S, G) entries.
769
770	# Default filter mode.
771	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp src $src permanent dst $vtep_ip src_vni 10010"
772	run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src src_vni 10010 | grep include"
773	log_test $? 0 "(S, G) MDB entry default filter mode"
774
775	run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp src $src permanent dst $vtep_ip src_vni 10010"
776
777	# Error cases.
778	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp src $src permanent filter_mode include dst $vtep_ip src_vni 10010"
779	log_test $? 255 "(S, G) with filter mode"
780
781	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp src $src permanent source_list $src dst $vtep_ip src_vni 10010"
782	log_test $? 255 "(S, G) with source list"
783
784	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp src $grp permanent dst $vtep_ip src_vni 10010"
785	log_test $? 255 "(S, G) with an invalid source list"
786
787	run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $all_zeros_grp src $src permanent dst $vtep_ip src_vni 10010"
788	log_test $? 255 "All-zeros group with source"
789}
790
791sg_ipv4_ipv4()
792{
793	local ns1=$ns1_v4
794	local grp=239.1.1.1
795	local src=192.0.2.129
796	local vtep_ip=198.51.100.100
797	local all_zeros_grp=0.0.0.0
798
799	echo
800	echo "Control path: (S, G) operations - IPv4 overlay / IPv4 underlay"
801	echo "--------------------------------------------------------------"
802
803	sg_common $ns1 $grp $src $vtep_ip $all_zeros_grp
804}
805
806sg_ipv6_ipv4()
807{
808	local ns1=$ns1_v4
809	local grp=ff0e::1
810	local src=2001:db8:100::1
811	local vtep_ip=198.51.100.100
812	local all_zeros_grp=::
813
814	echo
815	echo "Control path: (S, G) operations - IPv6 overlay / IPv4 underlay"
816	echo "--------------------------------------------------------------"
817
818	sg_common $ns1 $grp $src $vtep_ip $all_zeros_grp
819}
820
821sg_ipv4_ipv6()
822{
823	local ns1=$ns1_v6
824	local grp=239.1.1.1
825	local src=192.0.2.129
826	local vtep_ip=2001:db8:1000::1
827	local all_zeros_grp=0.0.0.0
828
829	echo
830	echo "Control path: (S, G) operations - IPv4 overlay / IPv6 underlay"
831	echo "--------------------------------------------------------------"
832
833	sg_common $ns1 $grp $src $vtep_ip $all_zeros_grp
834}
835
836sg_ipv6_ipv6()
837{
838	local ns1=$ns1_v6
839	local grp=ff0e::1
840	local src=2001:db8:100::1
841	local vtep_ip=2001:db8:1000::1
842	local all_zeros_grp=::
843
844	echo
845	echo "Control path: (S, G) operations - IPv6 overlay / IPv6 underlay"
846	echo "--------------------------------------------------------------"
847
848	sg_common $ns1 $grp $src $vtep_ip $all_zeros_grp
849}
850
851ipv4_grps_get()
852{
853	local max_grps=$1; shift
854	local i
855
856	for i in $(seq 0 $((max_grps - 1))); do
857		echo "239.1.1.$i"
858	done
859}
860
861ipv6_grps_get()
862{
863	local max_grps=$1; shift
864	local i
865
866	for i in $(seq 0 $((max_grps - 1))); do
867		echo "ff0e::$(printf %x $i)"
868	done
869}
870
871dump_common()
872{
873	local ns1=$1; shift
874	local local_addr=$1; shift
875	local remote_prefix=$1; shift
876	local fn=$1; shift
877	local max_vxlan_devs=2
878	local max_remotes=64
879	local max_grps=256
880	local num_entries
881	local batch_file
882	local grp
883	local i j
884
885	# The kernel maintains various markers for the MDB dump. Add a test for
886	# large scale MDB dump to make sure that all the configured entries are
887	# dumped and that the markers are used correctly.
888
889	# Create net devices.
890	for i in $(seq 1 $max_vxlan_devs); do
891		ip -n $ns1 link add name vx-test${i} up type vxlan \
892			local $local_addr dstport 4789 external vnifilter
893	done
894
895	# Create batch file with MDB entries.
896	batch_file=$(mktemp)
897	for i in $(seq 1 $max_vxlan_devs); do
898		for j in $(seq 1 $max_remotes); do
899			for grp in $($fn $max_grps); do
900				echo "mdb add dev vx-test${i} port vx-test${i} grp $grp permanent dst ${remote_prefix}${j}" >> $batch_file
901			done
902		done
903	done
904
905	# Program the batch file and check for expected number of entries.
906	bridge -n $ns1 -b $batch_file
907	for i in $(seq 1 $max_vxlan_devs); do
908		num_entries=$(bridge -n $ns1 mdb show dev vx-test${i} | grep "permanent" | wc -l)
909		[[ $num_entries -eq $((max_grps * max_remotes)) ]]
910		log_test $? 0 "Large scale dump - VXLAN device #$i"
911	done
912
913	rm -rf $batch_file
914}
915
916dump_ipv4_ipv4()
917{
918	local ns1=$ns1_v4
919	local local_addr=192.0.2.1
920	local remote_prefix=198.51.100.
921	local fn=ipv4_grps_get
922
923	echo
924	echo "Control path: Large scale MDB dump - IPv4 overlay / IPv4 underlay"
925	echo "-----------------------------------------------------------------"
926
927	dump_common $ns1 $local_addr $remote_prefix $fn
928}
929
930dump_ipv6_ipv4()
931{
932	local ns1=$ns1_v4
933	local local_addr=192.0.2.1
934	local remote_prefix=198.51.100.
935	local fn=ipv6_grps_get
936
937	echo
938	echo "Control path: Large scale MDB dump - IPv6 overlay / IPv4 underlay"
939	echo "-----------------------------------------------------------------"
940
941	dump_common $ns1 $local_addr $remote_prefix $fn
942}
943
944dump_ipv4_ipv6()
945{
946	local ns1=$ns1_v6
947	local local_addr=2001:db8:1::1
948	local remote_prefix=2001:db8:1000::
949	local fn=ipv4_grps_get
950
951	echo
952	echo "Control path: Large scale MDB dump - IPv4 overlay / IPv6 underlay"
953	echo "-----------------------------------------------------------------"
954
955	dump_common $ns1 $local_addr $remote_prefix $fn
956}
957
958dump_ipv6_ipv6()
959{
960	local ns1=$ns1_v6
961	local local_addr=2001:db8:1::1
962	local remote_prefix=2001:db8:1000::
963	local fn=ipv6_grps_get
964
965	echo
966	echo "Control path: Large scale MDB dump - IPv6 overlay / IPv6 underlay"
967	echo "-----------------------------------------------------------------"
968
969	dump_common $ns1 $local_addr $remote_prefix $fn
970}
971
972flush()
973{
974	local num_entries
975
976	echo
977	echo "Control path: Flush"
978	echo "-------------------"
979
980	# Add entries with different attributes and check that they are all
981	# flushed when the flush command is given with no parameters.
982
983	# Different source VNI.
984	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.1 src_vni 10010"
985	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.2 permanent dst 198.51.100.1 src_vni 10011"
986
987	# Different routing protocol.
988	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.3 permanent proto bgp dst 198.51.100.1 src_vni 10010"
989	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.4 permanent proto zebra dst 198.51.100.1 src_vni 10010"
990
991	# Different destination IP.
992	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.5 permanent dst 198.51.100.1 src_vni 10010"
993	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.6 permanent dst 198.51.100.2 src_vni 10010"
994
995	# Different destination port.
996	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.7 permanent dst 198.51.100.1 dst_port 11111 src_vni 10010"
997	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.8 permanent dst 198.51.100.1 dst_port 22222 src_vni 10010"
998
999	# Different VNI.
1000	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.9 permanent dst 198.51.100.1 vni 10010 src_vni 10010"
1001	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.10 permanent dst 198.51.100.1 vni 10020 src_vni 10010"
1002
1003	run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"
1004	num_entries=$(bridge -n $ns1_v4 mdb show dev vx0 | wc -l)
1005	[[ $num_entries -eq 0 ]]
1006	log_test $? 0 "Flush all"
1007
1008	# Check that entries are flushed when port is specified as the VXLAN
1009	# device and that an error is returned when port is specified as a
1010	# different net device.
1011
1012	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.1 src_vni 10010"
1013	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.2 src_vni 10010"
1014
1015	run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 port vx0"
1016	run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010"
1017	log_test $? 254 "Flush by port - matching"
1018
1019	run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 port veth0"
1020	log_test $? 255 "Flush by port - non-matching"
1021
1022	# Check that when flushing by source VNI only entries programmed with
1023	# the specified source VNI are flushed and the rest are not.
1024
1025	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.1 src_vni 10010"
1026	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.2 src_vni 10010"
1027	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.1 src_vni 10011"
1028	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.2 src_vni 10011"
1029
1030	run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 src_vni 10010"
1031
1032	run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010"
1033	log_test $? 254 "Flush by source VNI - matching"
1034	run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10011"
1035	log_test $? 0 "Flush by source VNI - non-matching"
1036
1037	run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"
1038
1039	# Check that all entries are flushed when "permanent" is specified and
1040	# that an error is returned when "nopermanent" is specified.
1041
1042	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.1 src_vni 10010"
1043	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.2 src_vni 10010"
1044
1045	run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 permanent"
1046	run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010"
1047	log_test $? 254 "Flush by \"permanent\" state"
1048
1049	run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 nopermanent"
1050	log_test $? 255 "Flush by \"nopermanent\" state"
1051
1052	# Check that when flushing by routing protocol only entries programmed
1053	# with the specified routing protocol are flushed and the rest are not.
1054
1055	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent proto bgp dst 198.51.100.1 src_vni 10010"
1056	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent proto zebra dst 198.51.100.2 src_vni 10010"
1057
1058	run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 proto bgp"
1059
1060	run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep \"proto bgp\""
1061	log_test $? 1 "Flush by routing protocol - matching"
1062	run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep \"proto zebra\""
1063	log_test $? 0 "Flush by routing protocol - non-matching"
1064
1065	run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"
1066
1067	# Check that when flushing by destination IP only entries programmed
1068	# with the specified destination IP are flushed and the rest are not.
1069
1070	# IPv4.
1071
1072	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.1 src_vni 10010"
1073	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.2 src_vni 10010"
1074
1075	run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 dst 198.51.100.2"
1076
1077	run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep 198.51.100.2"
1078	log_test $? 1 "Flush by IPv4 destination IP - matching"
1079	run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep 198.51.100.1"
1080	log_test $? 0 "Flush by IPv4 destination IP - non-matching"
1081
1082	run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"
1083
1084	# IPv6.
1085
1086	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 2001:db8:1000::1 src_vni 10010"
1087	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 2001:db8:1000::2 src_vni 10010"
1088
1089	run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 dst 2001:db8:1000::2"
1090
1091	run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep 2001:db8:1000::2"
1092	log_test $? 1 "Flush by IPv6 destination IP - matching"
1093	run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep 2001:db8:1000::1"
1094	log_test $? 0 "Flush by IPv6 destination IP - non-matching"
1095
1096	run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"
1097
1098	# Check that when flushing by UDP destination port only entries
1099	# programmed with the specified port are flushed and the rest are not.
1100
1101	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst_port 11111 dst 198.51.100.1 src_vni 10010"
1102	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst_port 22222 dst 198.51.100.2 src_vni 10010"
1103
1104	run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 dst_port 11111"
1105
1106	run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep \"dst_port 11111\""
1107	log_test $? 1 "Flush by UDP destination port - matching"
1108	run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep \"dst_port 22222\""
1109	log_test $? 0 "Flush by UDP destination port - non-matching"
1110
1111	run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"
1112
1113	# When not specifying a UDP destination port for an entry, traffic is
1114	# encapsulated with the device's UDP destination port. Check that when
1115	# flushing by the device's UDP destination port only entries programmed
1116	# with this port are flushed and the rest are not.
1117
1118	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.1 src_vni 10010"
1119	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst_port 22222 dst 198.51.100.2 src_vni 10010"
1120
1121	run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 dst_port 4789"
1122
1123	run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep 198.51.100.1"
1124	log_test $? 1 "Flush by device's UDP destination port - matching"
1125	run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep 198.51.100.2"
1126	log_test $? 0 "Flush by device's UDP destination port - non-matching"
1127
1128	run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"
1129
1130	# Check that when flushing by destination VNI only entries programmed
1131	# with the specified destination VNI are flushed and the rest are not.
1132
1133	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent vni 20010 dst 198.51.100.1 src_vni 10010"
1134	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent vni 20011 dst 198.51.100.2 src_vni 10010"
1135
1136	run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 vni 20010"
1137
1138	run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep \" vni 20010\""
1139	log_test $? 1 "Flush by destination VNI - matching"
1140	run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep \" vni 20011\""
1141	log_test $? 0 "Flush by destination VNI - non-matching"
1142
1143	run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"
1144
1145	# When not specifying a destination VNI for an entry, traffic is
1146	# encapsulated with the source VNI. Check that when flushing by a
1147	# destination VNI that is equal to the source VNI only such entries are
1148	# flushed and the rest are not.
1149
1150	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.1 src_vni 10010"
1151	run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent vni 20010 dst 198.51.100.2 src_vni 10010"
1152
1153	run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 vni 10010"
1154
1155	run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep 198.51.100.1"
1156	log_test $? 1 "Flush by destination VNI equal to source VNI - matching"
1157	run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep 198.51.100.2"
1158	log_test $? 0 "Flush by destination VNI equal to source VNI - non-matching"
1159
1160	run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"
1161
1162	# Test that an error is returned when trying to flush using VLAN ID.
1163
1164	run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 vid 10"
1165	log_test $? 255 "Flush by VLAN ID"
1166}
1167
1168################################################################################
1169# Tests - Data path
1170
1171encap_params_common()
1172{
1173	local ns1=$1; shift
1174	local ns2=$1; shift
1175	local vtep1_ip=$1; shift
1176	local vtep2_ip=$1; shift
1177	local plen=$1; shift
1178	local enc_ethtype=$1; shift
1179	local grp=$1; shift
1180	local grp_dmac=$1; shift
1181	local src=$1; shift
1182	local mz=$1; shift
1183
1184	# Test that packets forwarded by the VXLAN MDB are encapsulated with
1185	# the correct parameters. Transmit packets from the first namespace and
1186	# check that they hit the corresponding filters on the ingress of the
1187	# second namespace.
1188
1189	run_cmd "tc -n $ns2 qdisc replace dev veth0 clsact"
1190	run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"
1191	run_cmd "ip -n $ns2 address replace $vtep1_ip/$plen dev lo"
1192	run_cmd "ip -n $ns2 address replace $vtep2_ip/$plen dev lo"
1193
1194	# Check destination IP.
1195	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip src_vni 10010"
1196	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep2_ip src_vni 10020"
1197
1198	run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $vtep1_ip action pass"
1199	run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1200	tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1201	log_test $? 0 "Destination IP - match"
1202
1203	run_cmd "ip netns exec $ns1 $mz br0.20 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1204	tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1205	log_test $? 0 "Destination IP - no match"
1206
1207	run_cmd "tc -n $ns2 filter del dev vx0 ingress pref 1 handle 101 flower"
1208	run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep2_ip src_vni 10020"
1209	run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10010"
1210
1211	# Check destination port.
1212	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip src_vni 10010"
1213	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip dst_port 1111 src_vni 10020"
1214
1215	run_cmd "tc -n $ns2 filter replace dev veth0 ingress pref 1 handle 101 proto $enc_ethtype flower ip_proto udp dst_port 4789 action pass"
1216	run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1217	tc_check_packets "$ns2" "dev veth0 ingress" 101 1
1218	log_test $? 0 "Default destination port - match"
1219
1220	run_cmd "ip netns exec $ns1 $mz br0.20 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1221	tc_check_packets "$ns2" "dev veth0 ingress" 101 1
1222	log_test $? 0 "Default destination port - no match"
1223
1224	run_cmd "tc -n $ns2 filter replace dev veth0 ingress pref 1 handle 101 proto $enc_ethtype flower ip_proto udp dst_port 1111 action pass"
1225	run_cmd "ip netns exec $ns1 $mz br0.20 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1226	tc_check_packets "$ns2" "dev veth0 ingress" 101 1
1227	log_test $? 0 "Non-default destination port - match"
1228
1229	run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1230	tc_check_packets "$ns2" "dev veth0 ingress" 101 1
1231	log_test $? 0 "Non-default destination port - no match"
1232
1233	run_cmd "tc -n $ns2 filter del dev veth0 ingress pref 1 handle 101 flower"
1234	run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10020"
1235	run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10010"
1236
1237	# Check default VNI.
1238	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip src_vni 10010"
1239	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip src_vni 10020"
1240
1241	run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_key_id 10010 action pass"
1242	run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1243	tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1244	log_test $? 0 "Default destination VNI - match"
1245
1246	run_cmd "ip netns exec $ns1 $mz br0.20 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1247	tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1248	log_test $? 0 "Default destination VNI - no match"
1249
1250	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip vni 10020 src_vni 10010"
1251	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip vni 10010 src_vni 10020"
1252
1253	run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_key_id 10020 action pass"
1254	run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1255	tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1256	log_test $? 0 "Non-default destination VNI - match"
1257
1258	run_cmd "ip netns exec $ns1 $mz br0.20 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1259	tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1260	log_test $? 0 "Non-default destination VNI - no match"
1261
1262	run_cmd "tc -n $ns2 filter del dev vx0 ingress pref 1 handle 101 flower"
1263	run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10020"
1264	run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10010"
1265}
1266
1267encap_params_ipv4_ipv4()
1268{
1269	local ns1=$ns1_v4
1270	local ns2=$ns2_v4
1271	local vtep1_ip=198.51.100.100
1272	local vtep2_ip=198.51.100.200
1273	local plen=32
1274	local enc_ethtype="ip"
1275	local grp=239.1.1.1
1276	local grp_dmac=01:00:5e:01:01:01
1277	local src=192.0.2.129
1278
1279	echo
1280	echo "Data path: Encapsulation parameters - IPv4 overlay / IPv4 underlay"
1281	echo "------------------------------------------------------------------"
1282
1283	encap_params_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $enc_ethtype \
1284		$grp $grp_dmac $src "mausezahn"
1285}
1286
1287encap_params_ipv6_ipv4()
1288{
1289	local ns1=$ns1_v4
1290	local ns2=$ns2_v4
1291	local vtep1_ip=198.51.100.100
1292	local vtep2_ip=198.51.100.200
1293	local plen=32
1294	local enc_ethtype="ip"
1295	local grp=ff0e::1
1296	local grp_dmac=33:33:00:00:00:01
1297	local src=2001:db8:100::1
1298
1299	echo
1300	echo "Data path: Encapsulation parameters - IPv6 overlay / IPv4 underlay"
1301	echo "------------------------------------------------------------------"
1302
1303	encap_params_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $enc_ethtype \
1304		$grp $grp_dmac $src "mausezahn -6"
1305}
1306
1307encap_params_ipv4_ipv6()
1308{
1309	local ns1=$ns1_v6
1310	local ns2=$ns2_v6
1311	local vtep1_ip=2001:db8:1000::1
1312	local vtep2_ip=2001:db8:2000::1
1313	local plen=128
1314	local enc_ethtype="ipv6"
1315	local grp=239.1.1.1
1316	local grp_dmac=01:00:5e:01:01:01
1317	local src=192.0.2.129
1318
1319	echo
1320	echo "Data path: Encapsulation parameters - IPv4 overlay / IPv6 underlay"
1321	echo "------------------------------------------------------------------"
1322
1323	encap_params_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $enc_ethtype \
1324		$grp $grp_dmac $src "mausezahn"
1325}
1326
1327encap_params_ipv6_ipv6()
1328{
1329	local ns1=$ns1_v6
1330	local ns2=$ns2_v6
1331	local vtep1_ip=2001:db8:1000::1
1332	local vtep2_ip=2001:db8:2000::1
1333	local plen=128
1334	local enc_ethtype="ipv6"
1335	local grp=ff0e::1
1336	local grp_dmac=33:33:00:00:00:01
1337	local src=2001:db8:100::1
1338
1339	echo
1340	echo "Data path: Encapsulation parameters - IPv6 overlay / IPv6 underlay"
1341	echo "------------------------------------------------------------------"
1342
1343	encap_params_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $enc_ethtype \
1344		$grp $grp_dmac $src "mausezahn -6"
1345}
1346
1347starg_exclude_ir_common()
1348{
1349	local ns1=$1; shift
1350	local ns2=$1; shift
1351	local vtep1_ip=$1; shift
1352	local vtep2_ip=$1; shift
1353	local plen=$1; shift
1354	local grp=$1; shift
1355	local grp_dmac=$1; shift
1356	local valid_src=$1; shift
1357	local invalid_src=$1; shift
1358	local mz=$1; shift
1359
1360	# Install a (*, G) EXCLUDE MDB entry with one source and two remote
1361	# VTEPs. Make sure that the source in the source list is not forwarded
1362	# and that a source not in the list is forwarded. Remove one of the
1363	# VTEPs from the entry and make sure that packets are only forwarded to
1364	# the remaining VTEP.
1365
1366	run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"
1367	run_cmd "ip -n $ns2 address replace $vtep1_ip/$plen dev lo"
1368	run_cmd "ip -n $ns2 address replace $vtep2_ip/$plen dev lo"
1369
1370	run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $vtep1_ip action pass"
1371	run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 102 proto all flower enc_dst_ip $vtep2_ip action pass"
1372
1373	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $invalid_src dst $vtep1_ip src_vni 10010"
1374	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $invalid_src dst $vtep2_ip src_vni 10010"
1375
1376	# Check that invalid source is not forwarded to any VTEP.
1377	run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1378	tc_check_packets "$ns2" "dev vx0 ingress" 101 0
1379	log_test $? 0 "Block excluded source - first VTEP"
1380	tc_check_packets "$ns2" "dev vx0 ingress" 102 0
1381	log_test $? 0 "Block excluded source - second VTEP"
1382
1383	# Check that valid source is forwarded to both VTEPs.
1384	run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1385	tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1386	log_test $? 0 "Forward valid source - first VTEP"
1387	tc_check_packets "$ns2" "dev vx0 ingress" 102 1
1388	log_test $? 0 "Forward valid source - second VTEP"
1389
1390	# Remove second VTEP.
1391	run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep2_ip src_vni 10010"
1392
1393	# Check that invalid source is not forwarded to any VTEP.
1394	run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1395	tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1396	log_test $? 0 "Block excluded source after removal - first VTEP"
1397	tc_check_packets "$ns2" "dev vx0 ingress" 102 1
1398	log_test $? 0 "Block excluded source after removal - second VTEP"
1399
1400	# Check that valid source is forwarded to the remaining VTEP.
1401	run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1402	tc_check_packets "$ns2" "dev vx0 ingress" 101 2
1403	log_test $? 0 "Forward valid source after removal - first VTEP"
1404	tc_check_packets "$ns2" "dev vx0 ingress" 102 1
1405	log_test $? 0 "Forward valid source after removal - second VTEP"
1406}
1407
1408starg_exclude_ir_ipv4_ipv4()
1409{
1410	local ns1=$ns1_v4
1411	local ns2=$ns2_v4
1412	local vtep1_ip=198.51.100.100
1413	local vtep2_ip=198.51.100.200
1414	local plen=32
1415	local grp=239.1.1.1
1416	local grp_dmac=01:00:5e:01:01:01
1417	local valid_src=192.0.2.129
1418	local invalid_src=192.0.2.145
1419
1420	echo
1421	echo "Data path: (*, G) EXCLUDE - IR - IPv4 overlay / IPv4 underlay"
1422	echo "-------------------------------------------------------------"
1423
1424	starg_exclude_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1425		$grp_dmac $valid_src $invalid_src "mausezahn"
1426}
1427
1428starg_exclude_ir_ipv6_ipv4()
1429{
1430	local ns1=$ns1_v4
1431	local ns2=$ns2_v4
1432	local vtep1_ip=198.51.100.100
1433	local vtep2_ip=198.51.100.200
1434	local plen=32
1435	local grp=ff0e::1
1436	local grp_dmac=33:33:00:00:00:01
1437	local valid_src=2001:db8:100::1
1438	local invalid_src=2001:db8:200::1
1439
1440	echo
1441	echo "Data path: (*, G) EXCLUDE - IR - IPv6 overlay / IPv4 underlay"
1442	echo "-------------------------------------------------------------"
1443
1444	starg_exclude_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1445		$grp_dmac $valid_src $invalid_src "mausezahn -6"
1446}
1447
1448starg_exclude_ir_ipv4_ipv6()
1449{
1450	local ns1=$ns1_v6
1451	local ns2=$ns2_v6
1452	local vtep1_ip=2001:db8:1000::1
1453	local vtep2_ip=2001:db8:2000::1
1454	local plen=128
1455	local grp=239.1.1.1
1456	local grp_dmac=01:00:5e:01:01:01
1457	local valid_src=192.0.2.129
1458	local invalid_src=192.0.2.145
1459
1460	echo
1461	echo "Data path: (*, G) EXCLUDE - IR - IPv4 overlay / IPv6 underlay"
1462	echo "-------------------------------------------------------------"
1463
1464	starg_exclude_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1465		$grp_dmac $valid_src $invalid_src "mausezahn"
1466}
1467
1468starg_exclude_ir_ipv6_ipv6()
1469{
1470	local ns1=$ns1_v6
1471	local ns2=$ns2_v6
1472	local vtep1_ip=2001:db8:1000::1
1473	local vtep2_ip=2001:db8:2000::1
1474	local plen=128
1475	local grp=ff0e::1
1476	local grp_dmac=33:33:00:00:00:01
1477	local valid_src=2001:db8:100::1
1478	local invalid_src=2001:db8:200::1
1479
1480	echo
1481	echo "Data path: (*, G) EXCLUDE - IR - IPv6 overlay / IPv6 underlay"
1482	echo "-------------------------------------------------------------"
1483
1484	starg_exclude_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1485		$grp_dmac $valid_src $invalid_src "mausezahn -6"
1486}
1487
1488starg_include_ir_common()
1489{
1490	local ns1=$1; shift
1491	local ns2=$1; shift
1492	local vtep1_ip=$1; shift
1493	local vtep2_ip=$1; shift
1494	local plen=$1; shift
1495	local grp=$1; shift
1496	local grp_dmac=$1; shift
1497	local valid_src=$1; shift
1498	local invalid_src=$1; shift
1499	local mz=$1; shift
1500
1501	# Install a (*, G) INCLUDE MDB entry with one source and two remote
1502	# VTEPs. Make sure that the source in the source list is forwarded and
1503	# that a source not in the list is not forwarded. Remove one of the
1504	# VTEPs from the entry and make sure that packets are only forwarded to
1505	# the remaining VTEP.
1506
1507	run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"
1508	run_cmd "ip -n $ns2 address replace $vtep1_ip/$plen dev lo"
1509	run_cmd "ip -n $ns2 address replace $vtep2_ip/$plen dev lo"
1510
1511	run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $vtep1_ip action pass"
1512	run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 102 proto all flower enc_dst_ip $vtep2_ip action pass"
1513
1514	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode include source_list $valid_src dst $vtep1_ip src_vni 10010"
1515	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode include source_list $valid_src dst $vtep2_ip src_vni 10010"
1516
1517	# Check that invalid source is not forwarded to any VTEP.
1518	run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1519	tc_check_packets "$ns2" "dev vx0 ingress" 101 0
1520	log_test $? 0 "Block excluded source - first VTEP"
1521	tc_check_packets "$ns2" "dev vx0 ingress" 102 0
1522	log_test $? 0 "Block excluded source - second VTEP"
1523
1524	# Check that valid source is forwarded to both VTEPs.
1525	run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1526	tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1527	log_test $? 0 "Forward valid source - first VTEP"
1528	tc_check_packets "$ns2" "dev vx0 ingress" 102 1
1529	log_test $? 0 "Forward valid source - second VTEP"
1530
1531	# Remove second VTEP.
1532	run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep2_ip src_vni 10010"
1533
1534	# Check that invalid source is not forwarded to any VTEP.
1535	run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1536	tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1537	log_test $? 0 "Block excluded source after removal - first VTEP"
1538	tc_check_packets "$ns2" "dev vx0 ingress" 102 1
1539	log_test $? 0 "Block excluded source after removal - second VTEP"
1540
1541	# Check that valid source is forwarded to the remaining VTEP.
1542	run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1543	tc_check_packets "$ns2" "dev vx0 ingress" 101 2
1544	log_test $? 0 "Forward valid source after removal - first VTEP"
1545	tc_check_packets "$ns2" "dev vx0 ingress" 102 1
1546	log_test $? 0 "Forward valid source after removal - second VTEP"
1547}
1548
1549starg_include_ir_ipv4_ipv4()
1550{
1551	local ns1=$ns1_v4
1552	local ns2=$ns2_v4
1553	local vtep1_ip=198.51.100.100
1554	local vtep2_ip=198.51.100.200
1555	local plen=32
1556	local grp=239.1.1.1
1557	local grp_dmac=01:00:5e:01:01:01
1558	local valid_src=192.0.2.129
1559	local invalid_src=192.0.2.145
1560
1561	echo
1562	echo "Data path: (*, G) INCLUDE - IR - IPv4 overlay / IPv4 underlay"
1563	echo "-------------------------------------------------------------"
1564
1565	starg_include_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1566		$grp_dmac $valid_src $invalid_src "mausezahn"
1567}
1568
1569starg_include_ir_ipv6_ipv4()
1570{
1571	local ns1=$ns1_v4
1572	local ns2=$ns2_v4
1573	local vtep1_ip=198.51.100.100
1574	local vtep2_ip=198.51.100.200
1575	local plen=32
1576	local grp=ff0e::1
1577	local grp_dmac=33:33:00:00:00:01
1578	local valid_src=2001:db8:100::1
1579	local invalid_src=2001:db8:200::1
1580
1581	echo
1582	echo "Data path: (*, G) INCLUDE - IR - IPv6 overlay / IPv4 underlay"
1583	echo "-------------------------------------------------------------"
1584
1585	starg_include_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1586		$grp_dmac $valid_src $invalid_src "mausezahn -6"
1587}
1588
1589starg_include_ir_ipv4_ipv6()
1590{
1591	local ns1=$ns1_v6
1592	local ns2=$ns2_v6
1593	local vtep1_ip=2001:db8:1000::1
1594	local vtep2_ip=2001:db8:2000::1
1595	local plen=128
1596	local grp=239.1.1.1
1597	local grp_dmac=01:00:5e:01:01:01
1598	local valid_src=192.0.2.129
1599	local invalid_src=192.0.2.145
1600
1601	echo
1602	echo "Data path: (*, G) INCLUDE - IR - IPv4 overlay / IPv6 underlay"
1603	echo "-------------------------------------------------------------"
1604
1605	starg_include_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1606		$grp_dmac $valid_src $invalid_src "mausezahn"
1607}
1608
1609starg_include_ir_ipv6_ipv6()
1610{
1611	local ns1=$ns1_v6
1612	local ns2=$ns2_v6
1613	local vtep1_ip=2001:db8:1000::1
1614	local vtep2_ip=2001:db8:2000::1
1615	local plen=128
1616	local grp=ff0e::1
1617	local grp_dmac=33:33:00:00:00:01
1618	local valid_src=2001:db8:100::1
1619	local invalid_src=2001:db8:200::1
1620
1621	echo
1622	echo "Data path: (*, G) INCLUDE - IR - IPv6 overlay / IPv6 underlay"
1623	echo "-------------------------------------------------------------"
1624
1625	starg_include_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1626		$grp_dmac $valid_src $invalid_src "mausezahn -6"
1627}
1628
1629starg_exclude_p2mp_common()
1630{
1631	local ns1=$1; shift
1632	local ns2=$1; shift
1633	local mcast_grp=$1; shift
1634	local plen=$1; shift
1635	local grp=$1; shift
1636	local grp_dmac=$1; shift
1637	local valid_src=$1; shift
1638	local invalid_src=$1; shift
1639	local mz=$1; shift
1640
1641	# Install a (*, G) EXCLUDE MDB entry with one source and one multicast
1642	# group to which packets are sent. Make sure that the source in the
1643	# source list is not forwarded and that a source not in the list is
1644	# forwarded.
1645
1646	run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"
1647	run_cmd "ip -n $ns2 address replace $mcast_grp/$plen dev veth0 autojoin"
1648
1649	run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $mcast_grp action pass"
1650
1651	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $invalid_src dst $mcast_grp src_vni 10010 via veth0"
1652
1653	# Check that invalid source is not forwarded.
1654	run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1655	tc_check_packets "$ns2" "dev vx0 ingress" 101 0
1656	log_test $? 0 "Block excluded source"
1657
1658	# Check that valid source is forwarded.
1659	run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1660	tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1661	log_test $? 0 "Forward valid source"
1662
1663	# Remove the VTEP from the multicast group.
1664	run_cmd "ip -n $ns2 address del $mcast_grp/$plen dev veth0"
1665
1666	# Check that valid source is not received anymore.
1667	run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1668	tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1669	log_test $? 0 "Receive of valid source after removal from group"
1670}
1671
1672starg_exclude_p2mp_ipv4_ipv4()
1673{
1674	local ns1=$ns1_v4
1675	local ns2=$ns2_v4
1676	local mcast_grp=238.1.1.1
1677	local plen=32
1678	local grp=239.1.1.1
1679	local grp_dmac=01:00:5e:01:01:01
1680	local valid_src=192.0.2.129
1681	local invalid_src=192.0.2.145
1682
1683	echo
1684	echo "Data path: (*, G) EXCLUDE - P2MP - IPv4 overlay / IPv4 underlay"
1685	echo "---------------------------------------------------------------"
1686
1687	starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp $grp_dmac \
1688		$valid_src $invalid_src "mausezahn"
1689}
1690
1691starg_exclude_p2mp_ipv6_ipv4()
1692{
1693	local ns1=$ns1_v4
1694	local ns2=$ns2_v4
1695	local mcast_grp=238.1.1.1
1696	local plen=32
1697	local grp=ff0e::1
1698	local grp_dmac=33:33:00:00:00:01
1699	local valid_src=2001:db8:100::1
1700	local invalid_src=2001:db8:200::1
1701
1702	echo
1703	echo "Data path: (*, G) EXCLUDE - P2MP - IPv6 overlay / IPv4 underlay"
1704	echo "---------------------------------------------------------------"
1705
1706	starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp $grp_dmac \
1707		$valid_src $invalid_src "mausezahn -6"
1708}
1709
1710starg_exclude_p2mp_ipv4_ipv6()
1711{
1712	local ns1=$ns1_v6
1713	local ns2=$ns2_v6
1714	local mcast_grp=ff0e::2
1715	local plen=128
1716	local grp=239.1.1.1
1717	local grp_dmac=01:00:5e:01:01:01
1718	local valid_src=192.0.2.129
1719	local invalid_src=192.0.2.145
1720
1721	echo
1722	echo "Data path: (*, G) EXCLUDE - P2MP - IPv4 overlay / IPv6 underlay"
1723	echo "---------------------------------------------------------------"
1724
1725	starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp $grp_dmac \
1726		$valid_src $invalid_src "mausezahn"
1727}
1728
1729starg_exclude_p2mp_ipv6_ipv6()
1730{
1731	local ns1=$ns1_v6
1732	local ns2=$ns2_v6
1733	local mcast_grp=ff0e::2
1734	local plen=128
1735	local grp=ff0e::1
1736	local grp_dmac=33:33:00:00:00:01
1737	local valid_src=2001:db8:100::1
1738	local invalid_src=2001:db8:200::1
1739
1740	echo
1741	echo "Data path: (*, G) EXCLUDE - P2MP - IPv6 overlay / IPv6 underlay"
1742	echo "---------------------------------------------------------------"
1743
1744	starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp $grp_dmac \
1745		$valid_src $invalid_src "mausezahn -6"
1746}
1747
1748starg_include_p2mp_common()
1749{
1750	local ns1=$1; shift
1751	local ns2=$1; shift
1752	local mcast_grp=$1; shift
1753	local plen=$1; shift
1754	local grp=$1; shift
1755	local grp_dmac=$1; shift
1756	local valid_src=$1; shift
1757	local invalid_src=$1; shift
1758	local mz=$1; shift
1759
1760	# Install a (*, G) INCLUDE MDB entry with one source and one multicast
1761	# group to which packets are sent. Make sure that the source in the
1762	# source list is forwarded and that a source not in the list is not
1763	# forwarded.
1764
1765	run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"
1766	run_cmd "ip -n $ns2 address replace $mcast_grp/$plen dev veth0 autojoin"
1767
1768	run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $mcast_grp action pass"
1769
1770	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode include source_list $valid_src dst $mcast_grp src_vni 10010 via veth0"
1771
1772	# Check that invalid source is not forwarded.
1773	run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1774	tc_check_packets "$ns2" "dev vx0 ingress" 101 0
1775	log_test $? 0 "Block excluded source"
1776
1777	# Check that valid source is forwarded.
1778	run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1779	tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1780	log_test $? 0 "Forward valid source"
1781
1782	# Remove the VTEP from the multicast group.
1783	run_cmd "ip -n $ns2 address del $mcast_grp/$plen dev veth0"
1784
1785	# Check that valid source is not received anymore.
1786	run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1787	tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1788	log_test $? 0 "Receive of valid source after removal from group"
1789}
1790
1791starg_include_p2mp_ipv4_ipv4()
1792{
1793	local ns1=$ns1_v4
1794	local ns2=$ns2_v4
1795	local mcast_grp=238.1.1.1
1796	local plen=32
1797	local grp=239.1.1.1
1798	local grp_dmac=01:00:5e:01:01:01
1799	local valid_src=192.0.2.129
1800	local invalid_src=192.0.2.145
1801
1802	echo
1803	echo "Data path: (*, G) INCLUDE - P2MP - IPv4 overlay / IPv4 underlay"
1804	echo "---------------------------------------------------------------"
1805
1806	starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp $grp_dmac \
1807		$valid_src $invalid_src "mausezahn"
1808}
1809
1810starg_include_p2mp_ipv6_ipv4()
1811{
1812	local ns1=$ns1_v4
1813	local ns2=$ns2_v4
1814	local mcast_grp=238.1.1.1
1815	local plen=32
1816	local grp=ff0e::1
1817	local grp_dmac=33:33:00:00:00:01
1818	local valid_src=2001:db8:100::1
1819	local invalid_src=2001:db8:200::1
1820
1821	echo
1822	echo "Data path: (*, G) INCLUDE - P2MP - IPv6 overlay / IPv4 underlay"
1823	echo "---------------------------------------------------------------"
1824
1825	starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp $grp_dmac \
1826		$valid_src $invalid_src "mausezahn -6"
1827}
1828
1829starg_include_p2mp_ipv4_ipv6()
1830{
1831	local ns1=$ns1_v6
1832	local ns2=$ns2_v6
1833	local mcast_grp=ff0e::2
1834	local plen=128
1835	local grp=239.1.1.1
1836	local grp_dmac=01:00:5e:01:01:01
1837	local valid_src=192.0.2.129
1838	local invalid_src=192.0.2.145
1839
1840	echo
1841	echo "Data path: (*, G) INCLUDE - P2MP - IPv4 overlay / IPv6 underlay"
1842	echo "---------------------------------------------------------------"
1843
1844	starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp $grp_dmac \
1845		$valid_src $invalid_src "mausezahn"
1846}
1847
1848starg_include_p2mp_ipv6_ipv6()
1849{
1850	local ns1=$ns1_v6
1851	local ns2=$ns2_v6
1852	local mcast_grp=ff0e::2
1853	local plen=128
1854	local grp=ff0e::1
1855	local grp_dmac=33:33:00:00:00:01
1856	local valid_src=2001:db8:100::1
1857	local invalid_src=2001:db8:200::1
1858
1859	echo
1860	echo "Data path: (*, G) INCLUDE - P2MP - IPv6 overlay / IPv6 underlay"
1861	echo "---------------------------------------------------------------"
1862
1863	starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp $grp_dmac \
1864		$valid_src $invalid_src "mausezahn -6"
1865}
1866
1867egress_vni_translation_common()
1868{
1869	local ns1=$1; shift
1870	local ns2=$1; shift
1871	local mcast_grp=$1; shift
1872	local plen=$1; shift
1873	local proto=$1; shift
1874	local grp=$1; shift
1875	local grp_dmac=$1; shift
1876	local src=$1; shift
1877	local mz=$1; shift
1878
1879	# When P2MP tunnels are used with optimized inter-subnet multicast
1880	# (OISM) [1], the ingress VTEP does not perform VNI translation and
1881	# uses the VNI of the source broadcast domain (BD). If the egress VTEP
1882	# is a member in the source BD, then no VNI translation is needed.
1883	# Otherwise, the egress VTEP needs to translate the VNI to the
1884	# supplementary broadcast domain (SBD) VNI, which is usually the L3VNI.
1885	#
1886	# In this test, remove the VTEP in the second namespace from VLAN 10
1887	# (VNI 10010) and make sure that a packet sent from this VLAN on the
1888	# first VTEP is received by the SVI corresponding to the L3VNI (14000 /
1889	# VLAN 4000) on the second VTEP.
1890	#
1891	# The second VTEP will be able to decapsulate the packet with VNI 10010
1892	# because this VNI is configured on its shared VXLAN device. Later,
1893	# when ingressing the bridge, the VNI to VLAN lookup will fail because
1894	# the VTEP is not a member in VLAN 10, which will cause the packet to
1895	# be tagged with VLAN 4000 since it is configured as PVID.
1896	#
1897	# [1] https://datatracker.ietf.org/doc/html/draft-ietf-bess-evpn-irb-mcast
1898
1899	run_cmd "tc -n $ns2 qdisc replace dev br0.4000 clsact"
1900	run_cmd "ip -n $ns2 address replace $mcast_grp/$plen dev veth0 autojoin"
1901	run_cmd "tc -n $ns2 filter replace dev br0.4000 ingress pref 1 handle 101 proto $proto flower src_ip $src dst_ip $grp action pass"
1902
1903	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp src $src permanent dst $mcast_grp src_vni 10010 via veth0"
1904
1905	# Remove the second VTEP from VLAN 10.
1906	run_cmd "bridge -n $ns2 vlan del vid 10 dev vx0"
1907
1908	# Make sure that packets sent from the first VTEP over VLAN 10 are
1909	# received by the SVI corresponding to the L3VNI (14000 / VLAN 4000) on
1910	# the second VTEP, since it is configured as PVID.
1911	run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1912	tc_check_packets "$ns2" "dev br0.4000 ingress" 101 1
1913	log_test $? 0 "Egress VNI translation - PVID configured"
1914
1915	# Remove PVID flag from VLAN 4000 on the second VTEP and make sure
1916	# packets are no longer received by the SVI interface.
1917	run_cmd "bridge -n $ns2 vlan add vid 4000 dev vx0"
1918	run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1919	tc_check_packets "$ns2" "dev br0.4000 ingress" 101 1
1920	log_test $? 0 "Egress VNI translation - no PVID configured"
1921
1922	# Reconfigure the PVID and make sure packets are received again.
1923	run_cmd "bridge -n $ns2 vlan add vid 4000 dev vx0 pvid"
1924	run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1925	tc_check_packets "$ns2" "dev br0.4000 ingress" 101 2
1926	log_test $? 0 "Egress VNI translation - PVID reconfigured"
1927}
1928
1929egress_vni_translation_ipv4_ipv4()
1930{
1931	local ns1=$ns1_v4
1932	local ns2=$ns2_v4
1933	local mcast_grp=238.1.1.1
1934	local plen=32
1935	local proto="ipv4"
1936	local grp=239.1.1.1
1937	local grp_dmac=01:00:5e:01:01:01
1938	local src=192.0.2.129
1939
1940	echo
1941	echo "Data path: Egress VNI translation - IPv4 overlay / IPv4 underlay"
1942	echo "----------------------------------------------------------------"
1943
1944	egress_vni_translation_common $ns1 $ns2 $mcast_grp $plen $proto $grp \
1945		$grp_dmac $src "mausezahn"
1946}
1947
1948egress_vni_translation_ipv6_ipv4()
1949{
1950	local ns1=$ns1_v4
1951	local ns2=$ns2_v4
1952	local mcast_grp=238.1.1.1
1953	local plen=32
1954	local proto="ipv6"
1955	local grp=ff0e::1
1956	local grp_dmac=33:33:00:00:00:01
1957	local src=2001:db8:100::1
1958
1959	echo
1960	echo "Data path: Egress VNI translation - IPv6 overlay / IPv4 underlay"
1961	echo "----------------------------------------------------------------"
1962
1963	egress_vni_translation_common $ns1 $ns2 $mcast_grp $plen $proto $grp \
1964		$grp_dmac $src "mausezahn -6"
1965}
1966
1967egress_vni_translation_ipv4_ipv6()
1968{
1969	local ns1=$ns1_v6
1970	local ns2=$ns2_v6
1971	local mcast_grp=ff0e::2
1972	local plen=128
1973	local proto="ipv4"
1974	local grp=239.1.1.1
1975	local grp_dmac=01:00:5e:01:01:01
1976	local src=192.0.2.129
1977
1978	echo
1979	echo "Data path: Egress VNI translation - IPv4 overlay / IPv6 underlay"
1980	echo "----------------------------------------------------------------"
1981
1982	egress_vni_translation_common $ns1 $ns2 $mcast_grp $plen $proto $grp \
1983		$grp_dmac $src "mausezahn"
1984}
1985
1986egress_vni_translation_ipv6_ipv6()
1987{
1988	local ns1=$ns1_v6
1989	local ns2=$ns2_v6
1990	local mcast_grp=ff0e::2
1991	local plen=128
1992	local proto="ipv6"
1993	local grp=ff0e::1
1994	local grp_dmac=33:33:00:00:00:01
1995	local src=2001:db8:100::1
1996
1997	echo
1998	echo "Data path: Egress VNI translation - IPv6 overlay / IPv6 underlay"
1999	echo "----------------------------------------------------------------"
2000
2001	egress_vni_translation_common $ns1 $ns2 $mcast_grp $plen $proto $grp \
2002		$grp_dmac $src "mausezahn -6"
2003}
2004
2005all_zeros_mdb_common()
2006{
2007	local ns1=$1; shift
2008	local ns2=$1; shift
2009	local vtep1_ip=$1; shift
2010	local vtep2_ip=$1; shift
2011	local vtep3_ip=$1; shift
2012	local vtep4_ip=$1; shift
2013	local plen=$1; shift
2014	local ipv4_grp=239.1.1.1
2015	local ipv4_grp_dmac=01:00:5e:01:01:01
2016	local ipv4_unreg_grp=239.2.2.2
2017	local ipv4_unreg_grp_dmac=01:00:5e:02:02:02
2018	local ipv4_ll_grp=224.0.0.100
2019	local ipv4_ll_grp_dmac=01:00:5e:00:00:64
2020	local ipv4_src=192.0.2.129
2021	local ipv6_grp=ff0e::1
2022	local ipv6_grp_dmac=33:33:00:00:00:01
2023	local ipv6_unreg_grp=ff0e::2
2024	local ipv6_unreg_grp_dmac=33:33:00:00:00:02
2025	local ipv6_ll_grp=ff02::1
2026	local ipv6_ll_grp_dmac=33:33:00:00:00:01
2027	local ipv6_src=2001:db8:100::1
2028
2029	# Install all-zeros (catchall) MDB entries for IPv4 and IPv6 traffic
2030	# and make sure they only forward unregistered IP multicast traffic
2031	# which is not link-local. Also make sure that each entry only forwards
2032	# traffic from the matching address family.
2033
2034	# Associate two different VTEPs with one all-zeros MDB entry: Two with
2035	# the IPv4 entry (0.0.0.0) and another two with the IPv6 one (::).
2036	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp 0.0.0.0 permanent dst $vtep1_ip src_vni 10010"
2037	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp 0.0.0.0 permanent dst $vtep2_ip src_vni 10010"
2038	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp :: permanent dst $vtep3_ip src_vni 10010"
2039	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp :: permanent dst $vtep4_ip src_vni 10010"
2040
2041	# Associate one VTEP from each set with a regular MDB entry: One with
2042	# an IPv4 entry and another with an IPv6 one.
2043	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $ipv4_grp permanent dst $vtep1_ip src_vni 10010"
2044	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $ipv6_grp permanent dst $vtep3_ip src_vni 10010"
2045
2046	# Add filters to match on decapsulated traffic in the second namespace.
2047	run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"
2048	run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $vtep1_ip action pass"
2049	run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 102 proto all flower enc_dst_ip $vtep2_ip action pass"
2050	run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 103 proto all flower enc_dst_ip $vtep3_ip action pass"
2051	run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 104 proto all flower enc_dst_ip $vtep4_ip action pass"
2052
2053	# Configure the VTEP addresses in the second namespace to enable
2054	# decapsulation.
2055	run_cmd "ip -n $ns2 address replace $vtep1_ip/$plen dev lo"
2056	run_cmd "ip -n $ns2 address replace $vtep2_ip/$plen dev lo"
2057	run_cmd "ip -n $ns2 address replace $vtep3_ip/$plen dev lo"
2058	run_cmd "ip -n $ns2 address replace $vtep4_ip/$plen dev lo"
2059
2060	# Send registered IPv4 multicast and make sure it only arrives to the
2061	# first VTEP.
2062	run_cmd "ip netns exec $ns1 mausezahn br0.10 -a own -b $ipv4_grp_dmac -A $ipv4_src -B $ipv4_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
2063	tc_check_packets "$ns2" "dev vx0 ingress" 101 1
2064	log_test $? 0 "Registered IPv4 multicast - first VTEP"
2065	tc_check_packets "$ns2" "dev vx0 ingress" 102 0
2066	log_test $? 0 "Registered IPv4 multicast - second VTEP"
2067
2068	# Send unregistered IPv4 multicast that is not link-local and make sure
2069	# it arrives to the first and second VTEPs.
2070	run_cmd "ip netns exec $ns1 mausezahn br0.10 -a own -b $ipv4_unreg_grp_dmac -A $ipv4_src -B $ipv4_unreg_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
2071	tc_check_packets "$ns2" "dev vx0 ingress" 101 2
2072	log_test $? 0 "Unregistered IPv4 multicast - first VTEP"
2073	tc_check_packets "$ns2" "dev vx0 ingress" 102 1
2074	log_test $? 0 "Unregistered IPv4 multicast - second VTEP"
2075
2076	# Send IPv4 link-local multicast traffic and make sure it does not
2077	# arrive to any VTEP.
2078	run_cmd "ip netns exec $ns1 mausezahn br0.10 -a own -b $ipv4_ll_grp_dmac -A $ipv4_src -B $ipv4_ll_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
2079	tc_check_packets "$ns2" "dev vx0 ingress" 101 2
2080	log_test $? 0 "Link-local IPv4 multicast - first VTEP"
2081	tc_check_packets "$ns2" "dev vx0 ingress" 102 1
2082	log_test $? 0 "Link-local IPv4 multicast - second VTEP"
2083
2084	# Send registered IPv4 multicast using a unicast MAC address and make
2085	# sure it does not arrive to any VTEP.
2086	run_cmd "ip netns exec $ns1 mausezahn br0.10 -a own -b 00:11:22:33:44:55 -A $ipv4_src -B $ipv4_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
2087	tc_check_packets "$ns2" "dev vx0 ingress" 101 2
2088	log_test $? 0 "Registered IPv4 multicast with a unicast MAC - first VTEP"
2089	tc_check_packets "$ns2" "dev vx0 ingress" 102 1
2090	log_test $? 0 "Registered IPv4 multicast with a unicast MAC - second VTEP"
2091
2092	# Send registered IPv4 multicast using a broadcast MAC address and make
2093	# sure it does not arrive to any VTEP.
2094	run_cmd "ip netns exec $ns1 mausezahn br0.10 -a own -b bcast -A $ipv4_src -B $ipv4_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
2095	tc_check_packets "$ns2" "dev vx0 ingress" 101 2
2096	log_test $? 0 "Registered IPv4 multicast with a broadcast MAC - first VTEP"
2097	tc_check_packets "$ns2" "dev vx0 ingress" 102 1
2098	log_test $? 0 "Registered IPv4 multicast with a broadcast MAC - second VTEP"
2099
2100	# Make sure IPv4 traffic did not reach the VTEPs associated with
2101	# IPv6 entries.
2102	tc_check_packets "$ns2" "dev vx0 ingress" 103 0
2103	log_test $? 0 "IPv4 traffic - third VTEP"
2104	tc_check_packets "$ns2" "dev vx0 ingress" 104 0
2105	log_test $? 0 "IPv4 traffic - fourth VTEP"
2106
2107	# Reset IPv4 filters before testing IPv6 traffic.
2108	run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $vtep1_ip action pass"
2109	run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 102 proto all flower enc_dst_ip $vtep2_ip action pass"
2110
2111	# Send registered IPv6 multicast and make sure it only arrives to the
2112	# third VTEP.
2113	run_cmd "ip netns exec $ns1 mausezahn -6 br0.10 -a own -b $ipv6_grp_dmac -A $ipv6_src -B $ipv6_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
2114	tc_check_packets "$ns2" "dev vx0 ingress" 103 1
2115	log_test $? 0 "Registered IPv6 multicast - third VTEP"
2116	tc_check_packets "$ns2" "dev vx0 ingress" 104 0
2117	log_test $? 0 "Registered IPv6 multicast - fourth VTEP"
2118
2119	# Send unregistered IPv6 multicast that is not link-local and make sure
2120	# it arrives to the third and fourth VTEPs.
2121	run_cmd "ip netns exec $ns1 mausezahn -6 br0.10 -a own -b $ipv6_unreg_grp_dmac -A $ipv6_src -B $ipv6_unreg_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
2122	tc_check_packets "$ns2" "dev vx0 ingress" 103 2
2123	log_test $? 0 "Unregistered IPv6 multicast - third VTEP"
2124	tc_check_packets "$ns2" "dev vx0 ingress" 104 1
2125	log_test $? 0 "Unregistered IPv6 multicast - fourth VTEP"
2126
2127	# Send IPv6 link-local multicast traffic and make sure it does not
2128	# arrive to any VTEP.
2129	run_cmd "ip netns exec $ns1 mausezahn -6 br0.10 -a own -b $ipv6_ll_grp_dmac -A $ipv6_src -B $ipv6_ll_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
2130	tc_check_packets "$ns2" "dev vx0 ingress" 103 2
2131	log_test $? 0 "Link-local IPv6 multicast - third VTEP"
2132	tc_check_packets "$ns2" "dev vx0 ingress" 104 1
2133	log_test $? 0 "Link-local IPv6 multicast - fourth VTEP"
2134
2135	# Send registered IPv6 multicast using a unicast MAC address and make
2136	# sure it does not arrive to any VTEP.
2137	run_cmd "ip netns exec $ns1 mausezahn -6 br0.10 -a own -b 00:11:22:33:44:55 -A $ipv6_src -B $ipv6_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
2138	tc_check_packets "$ns2" "dev vx0 ingress" 103 2
2139	log_test $? 0 "Registered IPv6 multicast with a unicast MAC - third VTEP"
2140	tc_check_packets "$ns2" "dev vx0 ingress" 104 1
2141	log_test $? 0 "Registered IPv6 multicast with a unicast MAC - fourth VTEP"
2142
2143	# Send registered IPv6 multicast using a broadcast MAC address and make
2144	# sure it does not arrive to any VTEP.
2145	run_cmd "ip netns exec $ns1 mausezahn -6 br0.10 -a own -b bcast -A $ipv6_src -B $ipv6_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
2146	tc_check_packets "$ns2" "dev vx0 ingress" 103 2
2147	log_test $? 0 "Registered IPv6 multicast with a broadcast MAC - third VTEP"
2148	tc_check_packets "$ns2" "dev vx0 ingress" 104 1
2149	log_test $? 0 "Registered IPv6 multicast with a broadcast MAC - fourth VTEP"
2150
2151	# Make sure IPv6 traffic did not reach the VTEPs associated with
2152	# IPv4 entries.
2153	tc_check_packets "$ns2" "dev vx0 ingress" 101 0
2154	log_test $? 0 "IPv6 traffic - first VTEP"
2155	tc_check_packets "$ns2" "dev vx0 ingress" 102 0
2156	log_test $? 0 "IPv6 traffic - second VTEP"
2157}
2158
2159all_zeros_mdb_ipv4()
2160{
2161	local ns1=$ns1_v4
2162	local ns2=$ns2_v4
2163	local vtep1_ip=198.51.100.101
2164	local vtep2_ip=198.51.100.102
2165	local vtep3_ip=198.51.100.103
2166	local vtep4_ip=198.51.100.104
2167	local plen=32
2168
2169	echo
2170	echo "Data path: All-zeros MDB entry - IPv4 underlay"
2171	echo "----------------------------------------------"
2172
2173	all_zeros_mdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $vtep3_ip \
2174		$vtep4_ip $plen
2175}
2176
2177all_zeros_mdb_ipv6()
2178{
2179	local ns1=$ns1_v6
2180	local ns2=$ns2_v6
2181	local vtep1_ip=2001:db8:1000::1
2182	local vtep2_ip=2001:db8:2000::1
2183	local vtep3_ip=2001:db8:3000::1
2184	local vtep4_ip=2001:db8:4000::1
2185	local plen=128
2186
2187	echo
2188	echo "Data path: All-zeros MDB entry - IPv6 underlay"
2189	echo "----------------------------------------------"
2190
2191	all_zeros_mdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $vtep3_ip \
2192		$vtep4_ip $plen
2193}
2194
2195mdb_fdb_common()
2196{
2197	local ns1=$1; shift
2198	local ns2=$1; shift
2199	local vtep1_ip=$1; shift
2200	local vtep2_ip=$1; shift
2201	local plen=$1; shift
2202	local proto=$1; shift
2203	local grp=$1; shift
2204	local grp_dmac=$1; shift
2205	local src=$1; shift
2206	local mz=$1; shift
2207
2208	# Install an MDB entry and an FDB entry and make sure that the FDB
2209	# entry only forwards traffic that was not forwarded by the MDB.
2210
2211	# Associate the MDB entry with one VTEP and the FDB entry with another
2212	# VTEP.
2213	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip src_vni 10010"
2214	run_cmd "bridge -n $ns1 fdb add 00:00:00:00:00:00 dev vx0 self static dst $vtep2_ip src_vni 10010"
2215
2216	# Add filters to match on decapsulated traffic in the second namespace.
2217	run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"
2218	run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto $proto flower ip_proto udp dst_port 54321 enc_dst_ip $vtep1_ip action pass"
2219	run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 102 proto $proto flower ip_proto udp dst_port 54321 enc_dst_ip $vtep2_ip action pass"
2220
2221	# Configure the VTEP addresses in the second namespace to enable
2222	# decapsulation.
2223	run_cmd "ip -n $ns2 address replace $vtep1_ip/$plen dev lo"
2224	run_cmd "ip -n $ns2 address replace $vtep2_ip/$plen dev lo"
2225
2226	# Send IP multicast traffic and make sure it is forwarded by the MDB
2227	# and only arrives to the first VTEP.
2228	run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
2229	tc_check_packets "$ns2" "dev vx0 ingress" 101 1
2230	log_test $? 0 "IP multicast - first VTEP"
2231	tc_check_packets "$ns2" "dev vx0 ingress" 102 0
2232	log_test $? 0 "IP multicast - second VTEP"
2233
2234	# Send broadcast traffic and make sure it is forwarded by the FDB and
2235	# only arrives to the second VTEP.
2236	run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b bcast -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
2237	tc_check_packets "$ns2" "dev vx0 ingress" 101 1
2238	log_test $? 0 "Broadcast - first VTEP"
2239	tc_check_packets "$ns2" "dev vx0 ingress" 102 1
2240	log_test $? 0 "Broadcast - second VTEP"
2241
2242	# Remove the MDB entry and make sure that IP multicast is now forwarded
2243	# by the FDB to the second VTEP.
2244	run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10010"
2245	run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
2246	tc_check_packets "$ns2" "dev vx0 ingress" 101 1
2247	log_test $? 0 "IP multicast after removal - first VTEP"
2248	tc_check_packets "$ns2" "dev vx0 ingress" 102 2
2249	log_test $? 0 "IP multicast after removal - second VTEP"
2250}
2251
2252mdb_fdb_ipv4_ipv4()
2253{
2254	local ns1=$ns1_v4
2255	local ns2=$ns2_v4
2256	local vtep1_ip=198.51.100.100
2257	local vtep2_ip=198.51.100.200
2258	local plen=32
2259	local proto="ipv4"
2260	local grp=239.1.1.1
2261	local grp_dmac=01:00:5e:01:01:01
2262	local src=192.0.2.129
2263
2264	echo
2265	echo "Data path: MDB with FDB - IPv4 overlay / IPv4 underlay"
2266	echo "------------------------------------------------------"
2267
2268	mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp \
2269		$grp_dmac $src "mausezahn"
2270}
2271
2272mdb_fdb_ipv6_ipv4()
2273{
2274	local ns1=$ns1_v4
2275	local ns2=$ns2_v4
2276	local vtep1_ip=198.51.100.100
2277	local vtep2_ip=198.51.100.200
2278	local plen=32
2279	local proto="ipv6"
2280	local grp=ff0e::1
2281	local grp_dmac=33:33:00:00:00:01
2282	local src=2001:db8:100::1
2283
2284	echo
2285	echo "Data path: MDB with FDB - IPv6 overlay / IPv4 underlay"
2286	echo "------------------------------------------------------"
2287
2288	mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp \
2289		$grp_dmac $src "mausezahn -6"
2290}
2291
2292mdb_fdb_ipv4_ipv6()
2293{
2294	local ns1=$ns1_v6
2295	local ns2=$ns2_v6
2296	local vtep1_ip=2001:db8:1000::1
2297	local vtep2_ip=2001:db8:2000::1
2298	local plen=128
2299	local proto="ipv4"
2300	local grp=239.1.1.1
2301	local grp_dmac=01:00:5e:01:01:01
2302	local src=192.0.2.129
2303
2304	echo
2305	echo "Data path: MDB with FDB - IPv4 overlay / IPv6 underlay"
2306	echo "------------------------------------------------------"
2307
2308	mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp \
2309		$grp_dmac $src "mausezahn"
2310}
2311
2312mdb_fdb_ipv6_ipv6()
2313{
2314	local ns1=$ns1_v6
2315	local ns2=$ns2_v6
2316	local vtep1_ip=2001:db8:1000::1
2317	local vtep2_ip=2001:db8:2000::1
2318	local plen=128
2319	local proto="ipv6"
2320	local grp=ff0e::1
2321	local grp_dmac=33:33:00:00:00:01
2322	local src=2001:db8:100::1
2323
2324	echo
2325	echo "Data path: MDB with FDB - IPv6 overlay / IPv6 underlay"
2326	echo "------------------------------------------------------"
2327
2328	mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp \
2329		$grp_dmac $src "mausezahn -6"
2330}
2331
2332mdb_grp1_loop()
2333{
2334	local ns1=$1; shift
2335	local vtep1_ip=$1; shift
2336	local grp1=$1; shift
2337
2338	while true; do
2339		bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp1 dst $vtep1_ip src_vni 10010
2340		bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp1 permanent dst $vtep1_ip src_vni 10010
2341	done >/dev/null 2>&1
2342}
2343
2344mdb_grp2_loop()
2345{
2346	local ns1=$1; shift
2347	local vtep1_ip=$1; shift
2348	local vtep2_ip=$1; shift
2349	local grp2=$1; shift
2350
2351	while true; do
2352		bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp2 dst $vtep1_ip src_vni 10010
2353		bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp2 permanent dst $vtep1_ip src_vni 10010
2354		bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp2 permanent dst $vtep2_ip src_vni 10010
2355	done >/dev/null 2>&1
2356}
2357
2358mdb_torture_common()
2359{
2360	local ns1=$1; shift
2361	local vtep1_ip=$1; shift
2362	local vtep2_ip=$1; shift
2363	local grp1=$1; shift
2364	local grp1_dmac=$1; shift
2365	local grp2=$1; shift
2366	local grp2_dmac=$1; shift
2367	local src=$1; shift
2368	local mz=$1; shift
2369	local pid1
2370	local pid2
2371	local pid3
2372	local pid4
2373
2374	# Continuously send two streams that are forwarded by two different MDB
2375	# entries. The first entry will be added and deleted in a loop. This
2376	# allows us to test that the data path does not use freed MDB entry
2377	# memory. The second entry will have two remotes, one that is added and
2378	# deleted in a loop and another that is replaced in a loop. This allows
2379	# us to test that the data path does not use freed remote entry memory.
2380	# The test is considered successful if nothing crashed.
2381
2382	# Create the MDB entries that will be continuously deleted / replaced.
2383	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp1 permanent dst $vtep1_ip src_vni 10010"
2384	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp2 permanent dst $vtep1_ip src_vni 10010"
2385	run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp2 permanent dst $vtep2_ip src_vni 10010"
2386
2387	mdb_grp1_loop $ns1 $vtep1_ip $grp1 &
2388	pid1=$!
2389	mdb_grp2_loop $ns1 $vtep1_ip $vtep2_ip $grp2 &
2390	pid2=$!
2391	ip netns exec $ns1 $mz br0.10 -a own -b $grp1_dmac -A $src -B $grp1 -t udp sp=12345,dp=54321 -p 100 -c 0 -q &
2392	pid3=$!
2393	ip netns exec $ns1 $mz br0.10 -a own -b $grp2_dmac -A $src -B $grp2 -t udp sp=12345,dp=54321 -p 100 -c 0 -q &
2394	pid4=$!
2395
2396	sleep 30
2397	kill -9 $pid1 $pid2 $pid3 $pid4
2398	wait $pid1 $pid2 $pid3 $pid4 2>/dev/null
2399
2400	log_test 0 0 "Torture test"
2401}
2402
2403mdb_torture_ipv4_ipv4()
2404{
2405	local ns1=$ns1_v4
2406	local vtep1_ip=198.51.100.100
2407	local vtep2_ip=198.51.100.200
2408	local grp1=239.1.1.1
2409	local grp1_dmac=01:00:5e:01:01:01
2410	local grp2=239.2.2.2
2411	local grp2_dmac=01:00:5e:02:02:02
2412	local src=192.0.2.129
2413
2414	echo
2415	echo "Data path: MDB torture test - IPv4 overlay / IPv4 underlay"
2416	echo "----------------------------------------------------------"
2417
2418	mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp1_dmac $grp2 \
2419		$grp2_dmac $src "mausezahn"
2420}
2421
2422mdb_torture_ipv6_ipv4()
2423{
2424	local ns1=$ns1_v4
2425	local vtep1_ip=198.51.100.100
2426	local vtep2_ip=198.51.100.200
2427	local grp1=ff0e::1
2428	local grp1_dmac=33:33:00:00:00:01
2429	local grp2=ff0e::2
2430	local grp2_dmac=33:33:00:00:00:02
2431	local src=2001:db8:100::1
2432
2433	echo
2434	echo "Data path: MDB torture test - IPv6 overlay / IPv4 underlay"
2435	echo "----------------------------------------------------------"
2436
2437	mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp1_dmac $grp2 \
2438		$grp2_dmac $src "mausezahn -6"
2439}
2440
2441mdb_torture_ipv4_ipv6()
2442{
2443	local ns1=$ns1_v6
2444	local vtep1_ip=2001:db8:1000::1
2445	local vtep2_ip=2001:db8:2000::1
2446	local grp1=239.1.1.1
2447	local grp1_dmac=01:00:5e:01:01:01
2448	local grp2=239.2.2.2
2449	local grp2_dmac=01:00:5e:02:02:02
2450	local src=192.0.2.129
2451
2452	echo
2453	echo "Data path: MDB torture test - IPv4 overlay / IPv6 underlay"
2454	echo "----------------------------------------------------------"
2455
2456	mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp1_dmac $grp2 \
2457		$grp2_dmac $src "mausezahn"
2458}
2459
2460mdb_torture_ipv6_ipv6()
2461{
2462	local ns1=$ns1_v6
2463	local vtep1_ip=2001:db8:1000::1
2464	local vtep2_ip=2001:db8:2000::1
2465	local grp1=ff0e::1
2466	local grp1_dmac=33:33:00:00:00:01
2467	local grp2=ff0e::2
2468	local grp2_dmac=33:33:00:00:00:02
2469	local src=2001:db8:100::1
2470
2471	echo
2472	echo "Data path: MDB torture test - IPv6 overlay / IPv6 underlay"
2473	echo "----------------------------------------------------------"
2474
2475	mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp1_dmac $grp2 \
2476		$grp2_dmac $src "mausezahn -6"
2477}
2478
2479################################################################################
2480# Usage
2481
2482usage()
2483{
2484	cat <<EOF
2485usage: ${0##*/} OPTS
2486
2487        -t <test>   Test(s) to run (default: all)
2488                    (options: $TESTS)
2489        -c          Control path tests only
2490        -d          Data path tests only
2491        -p          Pause on fail
2492        -P          Pause after each test before cleanup
2493        -v          Verbose mode (show commands and output)
2494EOF
2495}
2496
2497################################################################################
2498# Main
2499
2500trap cleanup EXIT
2501
2502while getopts ":t:cdpPvh" opt; do
2503	case $opt in
2504		t) TESTS=$OPTARG;;
2505		c) TESTS=${CONTROL_PATH_TESTS};;
2506		d) TESTS=${DATA_PATH_TESTS};;
2507		p) PAUSE_ON_FAIL=yes;;
2508		P) PAUSE=yes;;
2509		v) VERBOSE=$(($VERBOSE + 1));;
2510		h) usage; exit 0;;
2511		*) usage; exit 1;;
2512	esac
2513done
2514
2515# Make sure we don't pause twice.
2516[ "${PAUSE}" = "yes" ] && PAUSE_ON_FAIL=no
2517
2518if [ "$(id -u)" -ne 0 ];then
2519	echo "SKIP: Need root privileges"
2520	exit $ksft_skip;
2521fi
2522
2523if [ ! -x "$(command -v ip)" ]; then
2524	echo "SKIP: Could not run test without ip tool"
2525	exit $ksft_skip
2526fi
2527
2528if [ ! -x "$(command -v bridge)" ]; then
2529	echo "SKIP: Could not run test without bridge tool"
2530	exit $ksft_skip
2531fi
2532
2533if [ ! -x "$(command -v mausezahn)" ]; then
2534	echo "SKIP: Could not run test without mausezahn tool"
2535	exit $ksft_skip
2536fi
2537
2538if [ ! -x "$(command -v jq)" ]; then
2539	echo "SKIP: Could not run test without jq tool"
2540	exit $ksft_skip
2541fi
2542
2543bridge mdb help 2>&1 | grep -q "flush"
2544if [ $? -ne 0 ]; then
2545   echo "SKIP: iproute2 bridge too old, missing VXLAN MDB flush support"
2546   exit $ksft_skip
2547fi
2548
2549# Start clean.
2550cleanup
2551
2552for t in $TESTS
2553do
2554	setup; $t; cleanup;
2555done
2556
2557if [ "$TESTS" != "none" ]; then
2558	printf "\nTests passed: %3d\n" ${nsuccess}
2559	printf "Tests failed: %3d\n"   ${nfail}
2560fi
2561
2562exit $ret
2563