brintos

brintos / linux-shallow public Read only

0
0
Text · 92.6 KiB · 58da5de Raw
2563 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03#4# This test is for checking VXLAN MDB functionality. The topology consists of5# two sets of namespaces: One for the testing of IPv4 underlay and another for6# 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 upper9# namespaces and checking using ingress tc filters that the expected traffic10# 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.sh59ret=060 61CONTROL_PATH_TESTS="62	basic_star_g_ipv4_ipv463	basic_star_g_ipv6_ipv464	basic_star_g_ipv4_ipv665	basic_star_g_ipv6_ipv666	basic_sg_ipv4_ipv467	basic_sg_ipv6_ipv468	basic_sg_ipv4_ipv669	basic_sg_ipv6_ipv670	star_g_ipv4_ipv471	star_g_ipv6_ipv472	star_g_ipv4_ipv673	star_g_ipv6_ipv674	sg_ipv4_ipv475	sg_ipv6_ipv476	sg_ipv4_ipv677	sg_ipv6_ipv678	dump_ipv4_ipv479	dump_ipv6_ipv480	dump_ipv4_ipv681	dump_ipv6_ipv682	flush83"84 85DATA_PATH_TESTS="86	encap_params_ipv4_ipv487	encap_params_ipv6_ipv488	encap_params_ipv4_ipv689	encap_params_ipv6_ipv690	starg_exclude_ir_ipv4_ipv491	starg_exclude_ir_ipv6_ipv492	starg_exclude_ir_ipv4_ipv693	starg_exclude_ir_ipv6_ipv694	starg_include_ir_ipv4_ipv495	starg_include_ir_ipv6_ipv496	starg_include_ir_ipv4_ipv697	starg_include_ir_ipv6_ipv698	starg_exclude_p2mp_ipv4_ipv499	starg_exclude_p2mp_ipv6_ipv4100	starg_exclude_p2mp_ipv4_ipv6101	starg_exclude_p2mp_ipv6_ipv6102	starg_include_p2mp_ipv4_ipv4103	starg_include_p2mp_ipv6_ipv4104	starg_include_p2mp_ipv4_ipv6105	starg_include_p2mp_ipv6_ipv6106	egress_vni_translation_ipv4_ipv4107	egress_vni_translation_ipv6_ipv4108	egress_vni_translation_ipv4_ipv6109	egress_vni_translation_ipv6_ipv6110	all_zeros_mdb_ipv4111	all_zeros_mdb_ipv6112	mdb_fdb_ipv4_ipv4113	mdb_fdb_ipv6_ipv4114	mdb_fdb_ipv4_ipv6115	mdb_fdb_ipv6_ipv6116	mdb_torture_ipv4_ipv4117	mdb_torture_ipv6_ipv4118	mdb_torture_ipv4_ipv6119	mdb_torture_ipv6_ipv6120"121 122# All tests in this script. Can be overridden with -t option.123TESTS="124	$CONTROL_PATH_TESTS125	$DATA_PATH_TESTS126"127VERBOSE=0128PAUSE_ON_FAIL=no129PAUSE=no130 131################################################################################132# Utilities133 134log_test()135{136	local rc=$1137	local expected=$2138	local msg="$3"139 140	if [ ${rc} -eq ${expected} ]; then141		printf "TEST: %-60s  [ OK ]\n" "${msg}"142		nsuccess=$((nsuccess+1))143	else144		ret=1145		nfail=$((nfail+1))146		printf "TEST: %-60s  [FAIL]\n" "${msg}"147		if [ "$VERBOSE" = "1" ]; then148			echo "    rc=$rc, expected $expected"149		fi150 151		if [ "${PAUSE_ON_FAIL}" = "yes" ]; then152		echo153			echo "hit enter to continue, 'q' to quit"154			read a155			[ "$a" = "q" ] && exit 1156		fi157	fi158 159	if [ "${PAUSE}" = "yes" ]; then160		echo161		echo "hit enter to continue, 'q' to quit"162		read a163		[ "$a" = "q" ] && exit 1164	fi165 166	[ "$VERBOSE" = "1" ] && echo167}168 169run_cmd()170{171	local cmd="$1"172	local out173	local stderr="2>/dev/null"174 175	if [ "$VERBOSE" = "1" ]; then176		printf "COMMAND: $cmd\n"177		stderr=178	fi179 180	out=$(eval $cmd $stderr)181	rc=$?182	if [ "$VERBOSE" = "1" -a -n "$out" ]; then183		echo "    $out"184	fi185 186	return $rc187}188 189tc_check_packets()190{191	local ns=$1; shift192	local id=$1; shift193	local handle=$1; shift194	local count=$1; shift195	local pkts196 197	sleep 0.1198	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# Setup206 207setup_common_ns()208{209	local ns=$1; shift210	local local_addr=$1; shift211 212	ip netns exec $ns sysctl -qw net.ipv4.ip_forward=1213	ip netns exec $ns sysctl -qw net.ipv4.fib_multipath_use_neigh=1214	ip netns exec $ns sysctl -qw net.ipv4.conf.default.ignore_routes_with_linkdown=1215	ip netns exec $ns sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1216	ip netns exec $ns sysctl -qw net.ipv6.conf.all.forwarding=1217	ip netns exec $ns sysctl -qw net.ipv6.conf.default.forwarding=1218	ip netns exec $ns sysctl -qw net.ipv6.conf.default.ignore_routes_with_linkdown=1219	ip netns exec $ns sysctl -qw net.ipv6.conf.all.accept_dad=0220	ip netns exec $ns sysctl -qw net.ipv6.conf.default.accept_dad=0221 222	ip -n $ns link set dev lo up223	ip -n $ns address add $local_addr dev lo224 225	ip -n $ns link set dev veth0 up226 227	ip -n $ns link add name br0 up type bridge vlan_filtering 1 \228		vlan_default_pvid 0 mcast_snooping 0229 230	ip -n $ns link add link br0 name br0.10 up type vlan id 10231	bridge -n $ns vlan add vid 10 dev br0 self232 233	ip -n $ns link add link br0 name br0.20 up type vlan id 20234	bridge -n $ns vlan add vid 20 dev br0 self235 236	ip -n $ns link add link br0 name br0.4000 up type vlan id 4000237	bridge -n $ns vlan add vid 4000 dev br0 self238 239	ip -n $ns link add name vx0 up master br0 type vxlan \240		local $local_addr dstport 4789 external vnifilter241	bridge -n $ns link set dev vx0 vlan_tunnel on242 243	bridge -n $ns vlan add vid 10 dev vx0244	bridge -n $ns vlan add vid 10 dev vx0 tunnel_info id 10010245	bridge -n $ns vni add vni 10010 dev vx0246 247	bridge -n $ns vlan add vid 20 dev vx0248	bridge -n $ns vlan add vid 20 dev vx0 tunnel_info id 10020249	bridge -n $ns vni add vni 10020 dev vx0250 251	bridge -n $ns vlan add vid 4000 dev vx0 pvid252	bridge -n $ns vlan add vid 4000 dev vx0 tunnel_info id 14000253	bridge -n $ns vni add vni 14000 dev vx0254}255 256setup_common()257{258	local ns1=$1; shift259	local ns2=$1; shift260	local local_addr1=$1; shift261	local local_addr2=$1; shift262 263	ip link add name veth0 type veth peer name veth1264	ip link set dev veth0 netns $ns1 name veth0265	ip link set dev veth1 netns $ns2 name veth0266 267	setup_common_ns $ns1 $local_addr1268	setup_common_ns $ns2 $local_addr2269}270 271setup_v4()272{273	setup_ns ns1_v4 ns2_v4274	setup_common $ns1_v4 $ns2_v4 192.0.2.1 192.0.2.2275 276	ip -n $ns1_v4 address add 192.0.2.17/28 dev veth0277	ip -n $ns2_v4 address add 192.0.2.18/28 dev veth0278 279	ip -n $ns1_v4 route add default via 192.0.2.18280	ip -n $ns2_v4 route add default via 192.0.2.17281}282 283cleanup_v4()284{285	cleanup_ns $ns2_v4 $ns1_v4286}287 288setup_v6()289{290	setup_ns ns1_v6 ns2_v6291	setup_common $ns1_v6 $ns2_v6 2001:db8:1::1 2001:db8:1::2292 293	ip -n $ns1_v6 address add 2001:db8:2::1/64 dev veth0 nodad294	ip -n $ns2_v6 address add 2001:db8:2::2/64 dev veth0 nodad295 296	ip -n $ns1_v6 route add default via 2001:db8:2::2297	ip -n $ns2_v6 route add default via 2001:db8:2::1298}299 300cleanup_v6()301{302	cleanup_ns $ns2_v6 $ns1_v6303}304 305setup()306{307	set -e308 309	setup_v4310	setup_v6311 312	sleep 5313 314	set +e315}316 317cleanup()318{319	cleanup_v6 &> /dev/null320	cleanup_v4 &> /dev/null321}322 323################################################################################324# Tests - Control path325 326basic_common()327{328	local ns1=$1; shift329	local grp_key=$1; shift330	local vtep_ip=$1; shift331 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_v4434	local grp_key="grp 239.1.1.1"435	local vtep_ip=198.51.100.100436 437	echo438	echo "Control path: Basic (*, G) operations - IPv4 overlay / IPv4 underlay"439	echo "--------------------------------------------------------------------"440 441	basic_common $ns1 "$grp_key" $vtep_ip442}443 444basic_star_g_ipv6_ipv4()445{446	local ns1=$ns1_v4447	local grp_key="grp ff0e::1"448	local vtep_ip=198.51.100.100449 450	echo451	echo "Control path: Basic (*, G) operations - IPv6 overlay / IPv4 underlay"452	echo "--------------------------------------------------------------------"453 454	basic_common $ns1 "$grp_key" $vtep_ip455}456 457basic_star_g_ipv4_ipv6()458{459	local ns1=$ns1_v6460	local grp_key="grp 239.1.1.1"461	local vtep_ip=2001:db8:1000::1462 463	echo464	echo "Control path: Basic (*, G) operations - IPv4 overlay / IPv6 underlay"465	echo "--------------------------------------------------------------------"466 467	basic_common $ns1 "$grp_key" $vtep_ip468}469 470basic_star_g_ipv6_ipv6()471{472	local ns1=$ns1_v6473	local grp_key="grp ff0e::1"474	local vtep_ip=2001:db8:1000::1475 476	echo477	echo "Control path: Basic (*, G) operations - IPv6 overlay / IPv6 underlay"478	echo "--------------------------------------------------------------------"479 480	basic_common $ns1 "$grp_key" $vtep_ip481}482 483basic_sg_ipv4_ipv4()484{485	local ns1=$ns1_v4486	local grp_key="grp 239.1.1.1 src 192.0.2.129"487	local vtep_ip=198.51.100.100488 489	echo490	echo "Control path: Basic (S, G) operations - IPv4 overlay / IPv4 underlay"491	echo "--------------------------------------------------------------------"492 493	basic_common $ns1 "$grp_key" $vtep_ip494}495 496basic_sg_ipv6_ipv4()497{498	local ns1=$ns1_v4499	local grp_key="grp ff0e::1 src 2001:db8:100::1"500	local vtep_ip=198.51.100.100501 502	echo503	echo "Control path: Basic (S, G) operations - IPv6 overlay / IPv4 underlay"504	echo "---------------------------------------------------------------------"505 506	basic_common $ns1 "$grp_key" $vtep_ip507}508 509basic_sg_ipv4_ipv6()510{511	local ns1=$ns1_v6512	local grp_key="grp 239.1.1.1 src 192.0.2.129"513	local vtep_ip=2001:db8:1000::1514 515	echo516	echo "Control path: Basic (S, G) operations - IPv4 overlay / IPv6 underlay"517	echo "--------------------------------------------------------------------"518 519	basic_common $ns1 "$grp_key" $vtep_ip520}521 522basic_sg_ipv6_ipv6()523{524	local ns1=$ns1_v6525	local grp_key="grp ff0e::1 src 2001:db8:100::1"526	local vtep_ip=2001:db8:1000::1527 528	echo529	echo "Control path: Basic (S, G) operations - IPv6 overlay / IPv6 underlay"530	echo "--------------------------------------------------------------------"531 532	basic_common $ns1 "$grp_key" $vtep_ip533}534 535star_g_common()536{537	local ns1=$1; shift538	local grp=$1; shift539	local src1=$1; shift540	local src2=$1; shift541	local src3=$1; shift542	local vtep_ip=$1; shift543	local all_zeros_grp=$1; shift544 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_v4695	local grp=239.1.1.1696	local src1=192.0.2.129697	local src2=192.0.2.130698	local src3=192.0.2.131699	local vtep_ip=198.51.100.100700	local all_zeros_grp=0.0.0.0701 702	echo703	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_grp707}708 709star_g_ipv6_ipv4()710{711	local ns1=$ns1_v4712	local grp=ff0e::1713	local src1=2001:db8:100::1714	local src2=2001:db8:100::2715	local src3=2001:db8:100::3716	local vtep_ip=198.51.100.100717	local all_zeros_grp=::718 719	echo720	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_grp724}725 726star_g_ipv4_ipv6()727{728	local ns1=$ns1_v6729	local grp=239.1.1.1730	local src1=192.0.2.129731	local src2=192.0.2.130732	local src3=192.0.2.131733	local vtep_ip=2001:db8:1000::1734	local all_zeros_grp=0.0.0.0735 736	echo737	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_grp741}742 743star_g_ipv6_ipv6()744{745	local ns1=$ns1_v6746	local grp=ff0e::1747	local src1=2001:db8:100::1748	local src2=2001:db8:100::2749	local src3=2001:db8:100::3750	local vtep_ip=2001:db8:1000::1751	local all_zeros_grp=::752 753	echo754	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_grp758}759 760sg_common()761{762	local ns1=$1; shift763	local grp=$1; shift764	local src=$1; shift765	local vtep_ip=$1; shift766	local all_zeros_grp=$1; shift767 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_v4794	local grp=239.1.1.1795	local src=192.0.2.129796	local vtep_ip=198.51.100.100797	local all_zeros_grp=0.0.0.0798 799	echo800	echo "Control path: (S, G) operations - IPv4 overlay / IPv4 underlay"801	echo "--------------------------------------------------------------"802 803	sg_common $ns1 $grp $src $vtep_ip $all_zeros_grp804}805 806sg_ipv6_ipv4()807{808	local ns1=$ns1_v4809	local grp=ff0e::1810	local src=2001:db8:100::1811	local vtep_ip=198.51.100.100812	local all_zeros_grp=::813 814	echo815	echo "Control path: (S, G) operations - IPv6 overlay / IPv4 underlay"816	echo "--------------------------------------------------------------"817 818	sg_common $ns1 $grp $src $vtep_ip $all_zeros_grp819}820 821sg_ipv4_ipv6()822{823	local ns1=$ns1_v6824	local grp=239.1.1.1825	local src=192.0.2.129826	local vtep_ip=2001:db8:1000::1827	local all_zeros_grp=0.0.0.0828 829	echo830	echo "Control path: (S, G) operations - IPv4 overlay / IPv6 underlay"831	echo "--------------------------------------------------------------"832 833	sg_common $ns1 $grp $src $vtep_ip $all_zeros_grp834}835 836sg_ipv6_ipv6()837{838	local ns1=$ns1_v6839	local grp=ff0e::1840	local src=2001:db8:100::1841	local vtep_ip=2001:db8:1000::1842	local all_zeros_grp=::843 844	echo845	echo "Control path: (S, G) operations - IPv6 overlay / IPv6 underlay"846	echo "--------------------------------------------------------------"847 848	sg_common $ns1 $grp $src $vtep_ip $all_zeros_grp849}850 851ipv4_grps_get()852{853	local max_grps=$1; shift854	local i855 856	for i in $(seq 0 $((max_grps - 1))); do857		echo "239.1.1.$i"858	done859}860 861ipv6_grps_get()862{863	local max_grps=$1; shift864	local i865 866	for i in $(seq 0 $((max_grps - 1))); do867		echo "ff0e::$(printf %x $i)"868	done869}870 871dump_common()872{873	local ns1=$1; shift874	local local_addr=$1; shift875	local remote_prefix=$1; shift876	local fn=$1; shift877	local max_vxlan_devs=2878	local max_remotes=64879	local max_grps=256880	local num_entries881	local batch_file882	local grp883	local i j884 885	# The kernel maintains various markers for the MDB dump. Add a test for886	# large scale MDB dump to make sure that all the configured entries are887	# dumped and that the markers are used correctly.888 889	# Create net devices.890	for i in $(seq 1 $max_vxlan_devs); do891		ip -n $ns1 link add name vx-test${i} up type vxlan \892			local $local_addr dstport 4789 external vnifilter893	done894 895	# Create batch file with MDB entries.896	batch_file=$(mktemp)897	for i in $(seq 1 $max_vxlan_devs); do898		for j in $(seq 1 $max_remotes); do899			for grp in $($fn $max_grps); do900				echo "mdb add dev vx-test${i} port vx-test${i} grp $grp permanent dst ${remote_prefix}${j}" >> $batch_file901			done902		done903	done904 905	# Program the batch file and check for expected number of entries.906	bridge -n $ns1 -b $batch_file907	for i in $(seq 1 $max_vxlan_devs); do908		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	done912 913	rm -rf $batch_file914}915 916dump_ipv4_ipv4()917{918	local ns1=$ns1_v4919	local local_addr=192.0.2.1920	local remote_prefix=198.51.100.921	local fn=ipv4_grps_get922 923	echo924	echo "Control path: Large scale MDB dump - IPv4 overlay / IPv4 underlay"925	echo "-----------------------------------------------------------------"926 927	dump_common $ns1 $local_addr $remote_prefix $fn928}929 930dump_ipv6_ipv4()931{932	local ns1=$ns1_v4933	local local_addr=192.0.2.1934	local remote_prefix=198.51.100.935	local fn=ipv6_grps_get936 937	echo938	echo "Control path: Large scale MDB dump - IPv6 overlay / IPv4 underlay"939	echo "-----------------------------------------------------------------"940 941	dump_common $ns1 $local_addr $remote_prefix $fn942}943 944dump_ipv4_ipv6()945{946	local ns1=$ns1_v6947	local local_addr=2001:db8:1::1948	local remote_prefix=2001:db8:1000::949	local fn=ipv4_grps_get950 951	echo952	echo "Control path: Large scale MDB dump - IPv4 overlay / IPv6 underlay"953	echo "-----------------------------------------------------------------"954 955	dump_common $ns1 $local_addr $remote_prefix $fn956}957 958dump_ipv6_ipv6()959{960	local ns1=$ns1_v6961	local local_addr=2001:db8:1::1962	local remote_prefix=2001:db8:1000::963	local fn=ipv6_grps_get964 965	echo966	echo "Control path: Large scale MDB dump - IPv6 overlay / IPv6 underlay"967	echo "-----------------------------------------------------------------"968 969	dump_common $ns1 $local_addr $remote_prefix $fn970}971 972flush()973{974	local num_entries975 976	echo977	echo "Control path: Flush"978	echo "-------------------"979 980	# Add entries with different attributes and check that they are all981	# 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 VXLAN1009	# device and that an error is returned when port is specified as a1010	# 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 with1023	# 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 and1040	# 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 programmed1053	# 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 programmed1068	# 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 entries1099	# 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 is1114	# encapsulated with the device's UDP destination port. Check that when1115	# flushing by the device's UDP destination port only entries programmed1116	# 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 programmed1131	# 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 is1146	# encapsulated with the source VNI. Check that when flushing by a1147	# destination VNI that is equal to the source VNI only such entries are1148	# 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 path1170 1171encap_params_common()1172{1173	local ns1=$1; shift1174	local ns2=$1; shift1175	local vtep1_ip=$1; shift1176	local vtep2_ip=$1; shift1177	local plen=$1; shift1178	local enc_ethtype=$1; shift1179	local grp=$1; shift1180	local grp_dmac=$1; shift1181	local src=$1; shift1182	local mz=$1; shift1183 1184	# Test that packets forwarded by the VXLAN MDB are encapsulated with1185	# the correct parameters. Transmit packets from the first namespace and1186	# check that they hit the corresponding filters on the ingress of the1187	# 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 11201	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 11205	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 11218	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 11222	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 11227	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 11231	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 11244	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 11248	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 11256	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 11260	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_v41270	local ns2=$ns2_v41271	local vtep1_ip=198.51.100.1001272	local vtep2_ip=198.51.100.2001273	local plen=321274	local enc_ethtype="ip"1275	local grp=239.1.1.11276	local grp_dmac=01:00:5e:01:01:011277	local src=192.0.2.1291278 1279	echo1280	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_v41290	local ns2=$ns2_v41291	local vtep1_ip=198.51.100.1001292	local vtep2_ip=198.51.100.2001293	local plen=321294	local enc_ethtype="ip"1295	local grp=ff0e::11296	local grp_dmac=33:33:00:00:00:011297	local src=2001:db8:100::11298 1299	echo1300	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_v61310	local ns2=$ns2_v61311	local vtep1_ip=2001:db8:1000::11312	local vtep2_ip=2001:db8:2000::11313	local plen=1281314	local enc_ethtype="ipv6"1315	local grp=239.1.1.11316	local grp_dmac=01:00:5e:01:01:011317	local src=192.0.2.1291318 1319	echo1320	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_v61330	local ns2=$ns2_v61331	local vtep1_ip=2001:db8:1000::11332	local vtep2_ip=2001:db8:2000::11333	local plen=1281334	local enc_ethtype="ipv6"1335	local grp=ff0e::11336	local grp_dmac=33:33:00:00:00:011337	local src=2001:db8:100::11338 1339	echo1340	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; shift1350	local ns2=$1; shift1351	local vtep1_ip=$1; shift1352	local vtep2_ip=$1; shift1353	local plen=$1; shift1354	local grp=$1; shift1355	local grp_dmac=$1; shift1356	local valid_src=$1; shift1357	local invalid_src=$1; shift1358	local mz=$1; shift1359 1360	# Install a (*, G) EXCLUDE MDB entry with one source and two remote1361	# VTEPs. Make sure that the source in the source list is not forwarded1362	# and that a source not in the list is forwarded. Remove one of the1363	# VTEPs from the entry and make sure that packets are only forwarded to1364	# 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 01379	log_test $? 0 "Block excluded source - first VTEP"1380	tc_check_packets "$ns2" "dev vx0 ingress" 102 01381	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 11386	log_test $? 0 "Forward valid source - first VTEP"1387	tc_check_packets "$ns2" "dev vx0 ingress" 102 11388	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 11396	log_test $? 0 "Block excluded source after removal - first VTEP"1397	tc_check_packets "$ns2" "dev vx0 ingress" 102 11398	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 21403	log_test $? 0 "Forward valid source after removal - first VTEP"1404	tc_check_packets "$ns2" "dev vx0 ingress" 102 11405	log_test $? 0 "Forward valid source after removal - second VTEP"1406}1407 1408starg_exclude_ir_ipv4_ipv4()1409{1410	local ns1=$ns1_v41411	local ns2=$ns2_v41412	local vtep1_ip=198.51.100.1001413	local vtep2_ip=198.51.100.2001414	local plen=321415	local grp=239.1.1.11416	local grp_dmac=01:00:5e:01:01:011417	local valid_src=192.0.2.1291418	local invalid_src=192.0.2.1451419 1420	echo1421	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_v41431	local ns2=$ns2_v41432	local vtep1_ip=198.51.100.1001433	local vtep2_ip=198.51.100.2001434	local plen=321435	local grp=ff0e::11436	local grp_dmac=33:33:00:00:00:011437	local valid_src=2001:db8:100::11438	local invalid_src=2001:db8:200::11439 1440	echo1441	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_v61451	local ns2=$ns2_v61452	local vtep1_ip=2001:db8:1000::11453	local vtep2_ip=2001:db8:2000::11454	local plen=1281455	local grp=239.1.1.11456	local grp_dmac=01:00:5e:01:01:011457	local valid_src=192.0.2.1291458	local invalid_src=192.0.2.1451459 1460	echo1461	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_v61471	local ns2=$ns2_v61472	local vtep1_ip=2001:db8:1000::11473	local vtep2_ip=2001:db8:2000::11474	local plen=1281475	local grp=ff0e::11476	local grp_dmac=33:33:00:00:00:011477	local valid_src=2001:db8:100::11478	local invalid_src=2001:db8:200::11479 1480	echo1481	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; shift1491	local ns2=$1; shift1492	local vtep1_ip=$1; shift1493	local vtep2_ip=$1; shift1494	local plen=$1; shift1495	local grp=$1; shift1496	local grp_dmac=$1; shift1497	local valid_src=$1; shift1498	local invalid_src=$1; shift1499	local mz=$1; shift1500 1501	# Install a (*, G) INCLUDE MDB entry with one source and two remote1502	# VTEPs. Make sure that the source in the source list is forwarded and1503	# that a source not in the list is not forwarded. Remove one of the1504	# VTEPs from the entry and make sure that packets are only forwarded to1505	# 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 01520	log_test $? 0 "Block excluded source - first VTEP"1521	tc_check_packets "$ns2" "dev vx0 ingress" 102 01522	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 11527	log_test $? 0 "Forward valid source - first VTEP"1528	tc_check_packets "$ns2" "dev vx0 ingress" 102 11529	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 11537	log_test $? 0 "Block excluded source after removal - first VTEP"1538	tc_check_packets "$ns2" "dev vx0 ingress" 102 11539	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 21544	log_test $? 0 "Forward valid source after removal - first VTEP"1545	tc_check_packets "$ns2" "dev vx0 ingress" 102 11546	log_test $? 0 "Forward valid source after removal - second VTEP"1547}1548 1549starg_include_ir_ipv4_ipv4()1550{1551	local ns1=$ns1_v41552	local ns2=$ns2_v41553	local vtep1_ip=198.51.100.1001554	local vtep2_ip=198.51.100.2001555	local plen=321556	local grp=239.1.1.11557	local grp_dmac=01:00:5e:01:01:011558	local valid_src=192.0.2.1291559	local invalid_src=192.0.2.1451560 1561	echo1562	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_v41572	local ns2=$ns2_v41573	local vtep1_ip=198.51.100.1001574	local vtep2_ip=198.51.100.2001575	local plen=321576	local grp=ff0e::11577	local grp_dmac=33:33:00:00:00:011578	local valid_src=2001:db8:100::11579	local invalid_src=2001:db8:200::11580 1581	echo1582	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_v61592	local ns2=$ns2_v61593	local vtep1_ip=2001:db8:1000::11594	local vtep2_ip=2001:db8:2000::11595	local plen=1281596	local grp=239.1.1.11597	local grp_dmac=01:00:5e:01:01:011598	local valid_src=192.0.2.1291599	local invalid_src=192.0.2.1451600 1601	echo1602	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_v61612	local ns2=$ns2_v61613	local vtep1_ip=2001:db8:1000::11614	local vtep2_ip=2001:db8:2000::11615	local plen=1281616	local grp=ff0e::11617	local grp_dmac=33:33:00:00:00:011618	local valid_src=2001:db8:100::11619	local invalid_src=2001:db8:200::11620 1621	echo1622	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; shift1632	local ns2=$1; shift1633	local mcast_grp=$1; shift1634	local plen=$1; shift1635	local grp=$1; shift1636	local grp_dmac=$1; shift1637	local valid_src=$1; shift1638	local invalid_src=$1; shift1639	local mz=$1; shift1640 1641	# Install a (*, G) EXCLUDE MDB entry with one source and one multicast1642	# group to which packets are sent. Make sure that the source in the1643	# source list is not forwarded and that a source not in the list is1644	# 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 01656	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 11661	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 11669	log_test $? 0 "Receive of valid source after removal from group"1670}1671 1672starg_exclude_p2mp_ipv4_ipv4()1673{1674	local ns1=$ns1_v41675	local ns2=$ns2_v41676	local mcast_grp=238.1.1.11677	local plen=321678	local grp=239.1.1.11679	local grp_dmac=01:00:5e:01:01:011680	local valid_src=192.0.2.1291681	local invalid_src=192.0.2.1451682 1683	echo1684	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_v41694	local ns2=$ns2_v41695	local mcast_grp=238.1.1.11696	local plen=321697	local grp=ff0e::11698	local grp_dmac=33:33:00:00:00:011699	local valid_src=2001:db8:100::11700	local invalid_src=2001:db8:200::11701 1702	echo1703	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_v61713	local ns2=$ns2_v61714	local mcast_grp=ff0e::21715	local plen=1281716	local grp=239.1.1.11717	local grp_dmac=01:00:5e:01:01:011718	local valid_src=192.0.2.1291719	local invalid_src=192.0.2.1451720 1721	echo1722	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_v61732	local ns2=$ns2_v61733	local mcast_grp=ff0e::21734	local plen=1281735	local grp=ff0e::11736	local grp_dmac=33:33:00:00:00:011737	local valid_src=2001:db8:100::11738	local invalid_src=2001:db8:200::11739 1740	echo1741	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; shift1751	local ns2=$1; shift1752	local mcast_grp=$1; shift1753	local plen=$1; shift1754	local grp=$1; shift1755	local grp_dmac=$1; shift1756	local valid_src=$1; shift1757	local invalid_src=$1; shift1758	local mz=$1; shift1759 1760	# Install a (*, G) INCLUDE MDB entry with one source and one multicast1761	# group to which packets are sent. Make sure that the source in the1762	# source list is forwarded and that a source not in the list is not1763	# 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 01775	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 11780	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 11788	log_test $? 0 "Receive of valid source after removal from group"1789}1790 1791starg_include_p2mp_ipv4_ipv4()1792{1793	local ns1=$ns1_v41794	local ns2=$ns2_v41795	local mcast_grp=238.1.1.11796	local plen=321797	local grp=239.1.1.11798	local grp_dmac=01:00:5e:01:01:011799	local valid_src=192.0.2.1291800	local invalid_src=192.0.2.1451801 1802	echo1803	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_v41813	local ns2=$ns2_v41814	local mcast_grp=238.1.1.11815	local plen=321816	local grp=ff0e::11817	local grp_dmac=33:33:00:00:00:011818	local valid_src=2001:db8:100::11819	local invalid_src=2001:db8:200::11820 1821	echo1822	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_v61832	local ns2=$ns2_v61833	local mcast_grp=ff0e::21834	local plen=1281835	local grp=239.1.1.11836	local grp_dmac=01:00:5e:01:01:011837	local valid_src=192.0.2.1291838	local invalid_src=192.0.2.1451839 1840	echo1841	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_v61851	local ns2=$ns2_v61852	local mcast_grp=ff0e::21853	local plen=1281854	local grp=ff0e::11855	local grp_dmac=33:33:00:00:00:011856	local valid_src=2001:db8:100::11857	local invalid_src=2001:db8:200::11858 1859	echo1860	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; shift1870	local ns2=$1; shift1871	local mcast_grp=$1; shift1872	local plen=$1; shift1873	local proto=$1; shift1874	local grp=$1; shift1875	local grp_dmac=$1; shift1876	local src=$1; shift1877	local mz=$1; shift1878 1879	# When P2MP tunnels are used with optimized inter-subnet multicast1880	# (OISM) [1], the ingress VTEP does not perform VNI translation and1881	# uses the VNI of the source broadcast domain (BD). If the egress VTEP1882	# is a member in the source BD, then no VNI translation is needed.1883	# Otherwise, the egress VTEP needs to translate the VNI to the1884	# supplementary broadcast domain (SBD) VNI, which is usually the L3VNI.1885	#1886	# In this test, remove the VTEP in the second namespace from VLAN 101887	# (VNI 10010) and make sure that a packet sent from this VLAN on the1888	# 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 100101892	# because this VNI is configured on its shared VXLAN device. Later,1893	# when ingressing the bridge, the VNI to VLAN lookup will fail because1894	# the VTEP is not a member in VLAN 10, which will cause the packet to1895	# 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-mcast1898 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 are1909	# received by the SVI corresponding to the L3VNI (14000 / VLAN 4000) on1910	# 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 11913	log_test $? 0 "Egress VNI translation - PVID configured"1914 1915	# Remove PVID flag from VLAN 4000 on the second VTEP and make sure1916	# 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 11920	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 21926	log_test $? 0 "Egress VNI translation - PVID reconfigured"1927}1928 1929egress_vni_translation_ipv4_ipv4()1930{1931	local ns1=$ns1_v41932	local ns2=$ns2_v41933	local mcast_grp=238.1.1.11934	local plen=321935	local proto="ipv4"1936	local grp=239.1.1.11937	local grp_dmac=01:00:5e:01:01:011938	local src=192.0.2.1291939 1940	echo1941	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_v41951	local ns2=$ns2_v41952	local mcast_grp=238.1.1.11953	local plen=321954	local proto="ipv6"1955	local grp=ff0e::11956	local grp_dmac=33:33:00:00:00:011957	local src=2001:db8:100::11958 1959	echo1960	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_v61970	local ns2=$ns2_v61971	local mcast_grp=ff0e::21972	local plen=1281973	local proto="ipv4"1974	local grp=239.1.1.11975	local grp_dmac=01:00:5e:01:01:011976	local src=192.0.2.1291977 1978	echo1979	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_v61989	local ns2=$ns2_v61990	local mcast_grp=ff0e::21991	local plen=1281992	local proto="ipv6"1993	local grp=ff0e::11994	local grp_dmac=33:33:00:00:00:011995	local src=2001:db8:100::11996 1997	echo1998	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; shift2008	local ns2=$1; shift2009	local vtep1_ip=$1; shift2010	local vtep2_ip=$1; shift2011	local vtep3_ip=$1; shift2012	local vtep4_ip=$1; shift2013	local plen=$1; shift2014	local ipv4_grp=239.1.1.12015	local ipv4_grp_dmac=01:00:5e:01:01:012016	local ipv4_unreg_grp=239.2.2.22017	local ipv4_unreg_grp_dmac=01:00:5e:02:02:022018	local ipv4_ll_grp=224.0.0.1002019	local ipv4_ll_grp_dmac=01:00:5e:00:00:642020	local ipv4_src=192.0.2.1292021	local ipv6_grp=ff0e::12022	local ipv6_grp_dmac=33:33:00:00:00:012023	local ipv6_unreg_grp=ff0e::22024	local ipv6_unreg_grp_dmac=33:33:00:00:00:022025	local ipv6_ll_grp=ff02::12026	local ipv6_ll_grp_dmac=33:33:00:00:00:012027	local ipv6_src=2001:db8:100::12028 2029	# Install all-zeros (catchall) MDB entries for IPv4 and IPv6 traffic2030	# and make sure they only forward unregistered IP multicast traffic2031	# which is not link-local. Also make sure that each entry only forwards2032	# traffic from the matching address family.2033 2034	# Associate two different VTEPs with one all-zeros MDB entry: Two with2035	# 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 with2042	# 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 enable2054	# 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 the2061	# 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 12064	log_test $? 0 "Registered IPv4 multicast - first VTEP"2065	tc_check_packets "$ns2" "dev vx0 ingress" 102 02066	log_test $? 0 "Registered IPv4 multicast - second VTEP"2067 2068	# Send unregistered IPv4 multicast that is not link-local and make sure2069	# 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 22072	log_test $? 0 "Unregistered IPv4 multicast - first VTEP"2073	tc_check_packets "$ns2" "dev vx0 ingress" 102 12074	log_test $? 0 "Unregistered IPv4 multicast - second VTEP"2075 2076	# Send IPv4 link-local multicast traffic and make sure it does not2077	# 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 22080	log_test $? 0 "Link-local IPv4 multicast - first VTEP"2081	tc_check_packets "$ns2" "dev vx0 ingress" 102 12082	log_test $? 0 "Link-local IPv4 multicast - second VTEP"2083 2084	# Send registered IPv4 multicast using a unicast MAC address and make2085	# 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 22088	log_test $? 0 "Registered IPv4 multicast with a unicast MAC - first VTEP"2089	tc_check_packets "$ns2" "dev vx0 ingress" 102 12090	log_test $? 0 "Registered IPv4 multicast with a unicast MAC - second VTEP"2091 2092	# Send registered IPv4 multicast using a broadcast MAC address and make2093	# 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 22096	log_test $? 0 "Registered IPv4 multicast with a broadcast MAC - first VTEP"2097	tc_check_packets "$ns2" "dev vx0 ingress" 102 12098	log_test $? 0 "Registered IPv4 multicast with a broadcast MAC - second VTEP"2099 2100	# Make sure IPv4 traffic did not reach the VTEPs associated with2101	# IPv6 entries.2102	tc_check_packets "$ns2" "dev vx0 ingress" 103 02103	log_test $? 0 "IPv4 traffic - third VTEP"2104	tc_check_packets "$ns2" "dev vx0 ingress" 104 02105	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 the2112	# 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 12115	log_test $? 0 "Registered IPv6 multicast - third VTEP"2116	tc_check_packets "$ns2" "dev vx0 ingress" 104 02117	log_test $? 0 "Registered IPv6 multicast - fourth VTEP"2118 2119	# Send unregistered IPv6 multicast that is not link-local and make sure2120	# 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 22123	log_test $? 0 "Unregistered IPv6 multicast - third VTEP"2124	tc_check_packets "$ns2" "dev vx0 ingress" 104 12125	log_test $? 0 "Unregistered IPv6 multicast - fourth VTEP"2126 2127	# Send IPv6 link-local multicast traffic and make sure it does not2128	# 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 22131	log_test $? 0 "Link-local IPv6 multicast - third VTEP"2132	tc_check_packets "$ns2" "dev vx0 ingress" 104 12133	log_test $? 0 "Link-local IPv6 multicast - fourth VTEP"2134 2135	# Send registered IPv6 multicast using a unicast MAC address and make2136	# 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 22139	log_test $? 0 "Registered IPv6 multicast with a unicast MAC - third VTEP"2140	tc_check_packets "$ns2" "dev vx0 ingress" 104 12141	log_test $? 0 "Registered IPv6 multicast with a unicast MAC - fourth VTEP"2142 2143	# Send registered IPv6 multicast using a broadcast MAC address and make2144	# 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 22147	log_test $? 0 "Registered IPv6 multicast with a broadcast MAC - third VTEP"2148	tc_check_packets "$ns2" "dev vx0 ingress" 104 12149	log_test $? 0 "Registered IPv6 multicast with a broadcast MAC - fourth VTEP"2150 2151	# Make sure IPv6 traffic did not reach the VTEPs associated with2152	# IPv4 entries.2153	tc_check_packets "$ns2" "dev vx0 ingress" 101 02154	log_test $? 0 "IPv6 traffic - first VTEP"2155	tc_check_packets "$ns2" "dev vx0 ingress" 102 02156	log_test $? 0 "IPv6 traffic - second VTEP"2157}2158 2159all_zeros_mdb_ipv4()2160{2161	local ns1=$ns1_v42162	local ns2=$ns2_v42163	local vtep1_ip=198.51.100.1012164	local vtep2_ip=198.51.100.1022165	local vtep3_ip=198.51.100.1032166	local vtep4_ip=198.51.100.1042167	local plen=322168 2169	echo2170	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 $plen2175}2176 2177all_zeros_mdb_ipv6()2178{2179	local ns1=$ns1_v62180	local ns2=$ns2_v62181	local vtep1_ip=2001:db8:1000::12182	local vtep2_ip=2001:db8:2000::12183	local vtep3_ip=2001:db8:3000::12184	local vtep4_ip=2001:db8:4000::12185	local plen=1282186 2187	echo2188	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 $plen2193}2194 2195mdb_fdb_common()2196{2197	local ns1=$1; shift2198	local ns2=$1; shift2199	local vtep1_ip=$1; shift2200	local vtep2_ip=$1; shift2201	local plen=$1; shift2202	local proto=$1; shift2203	local grp=$1; shift2204	local grp_dmac=$1; shift2205	local src=$1; shift2206	local mz=$1; shift2207 2208	# Install an MDB entry and an FDB entry and make sure that the FDB2209	# 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 another2212	# 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 enable2222	# 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 MDB2227	# 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 12230	log_test $? 0 "IP multicast - first VTEP"2231	tc_check_packets "$ns2" "dev vx0 ingress" 102 02232	log_test $? 0 "IP multicast - second VTEP"2233 2234	# Send broadcast traffic and make sure it is forwarded by the FDB and2235	# 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 12238	log_test $? 0 "Broadcast - first VTEP"2239	tc_check_packets "$ns2" "dev vx0 ingress" 102 12240	log_test $? 0 "Broadcast - second VTEP"2241 2242	# Remove the MDB entry and make sure that IP multicast is now forwarded2243	# 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 12247	log_test $? 0 "IP multicast after removal - first VTEP"2248	tc_check_packets "$ns2" "dev vx0 ingress" 102 22249	log_test $? 0 "IP multicast after removal - second VTEP"2250}2251 2252mdb_fdb_ipv4_ipv4()2253{2254	local ns1=$ns1_v42255	local ns2=$ns2_v42256	local vtep1_ip=198.51.100.1002257	local vtep2_ip=198.51.100.2002258	local plen=322259	local proto="ipv4"2260	local grp=239.1.1.12261	local grp_dmac=01:00:5e:01:01:012262	local src=192.0.2.1292263 2264	echo2265	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_v42275	local ns2=$ns2_v42276	local vtep1_ip=198.51.100.1002277	local vtep2_ip=198.51.100.2002278	local plen=322279	local proto="ipv6"2280	local grp=ff0e::12281	local grp_dmac=33:33:00:00:00:012282	local src=2001:db8:100::12283 2284	echo2285	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_v62295	local ns2=$ns2_v62296	local vtep1_ip=2001:db8:1000::12297	local vtep2_ip=2001:db8:2000::12298	local plen=1282299	local proto="ipv4"2300	local grp=239.1.1.12301	local grp_dmac=01:00:5e:01:01:012302	local src=192.0.2.1292303 2304	echo2305	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_v62315	local ns2=$ns2_v62316	local vtep1_ip=2001:db8:1000::12317	local vtep2_ip=2001:db8:2000::12318	local plen=1282319	local proto="ipv6"2320	local grp=ff0e::12321	local grp_dmac=33:33:00:00:00:012322	local src=2001:db8:100::12323 2324	echo2325	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; shift2335	local vtep1_ip=$1; shift2336	local grp1=$1; shift2337 2338	while true; do2339		bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp1 dst $vtep1_ip src_vni 100102340		bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp1 permanent dst $vtep1_ip src_vni 100102341	done >/dev/null 2>&12342}2343 2344mdb_grp2_loop()2345{2346	local ns1=$1; shift2347	local vtep1_ip=$1; shift2348	local vtep2_ip=$1; shift2349	local grp2=$1; shift2350 2351	while true; do2352		bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp2 dst $vtep1_ip src_vni 100102353		bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp2 permanent dst $vtep1_ip src_vni 100102354		bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp2 permanent dst $vtep2_ip src_vni 100102355	done >/dev/null 2>&12356}2357 2358mdb_torture_common()2359{2360	local ns1=$1; shift2361	local vtep1_ip=$1; shift2362	local vtep2_ip=$1; shift2363	local grp1=$1; shift2364	local grp1_dmac=$1; shift2365	local grp2=$1; shift2366	local grp2_dmac=$1; shift2367	local src=$1; shift2368	local mz=$1; shift2369	local pid12370	local pid22371	local pid32372	local pid42373 2374	# Continuously send two streams that are forwarded by two different MDB2375	# entries. The first entry will be added and deleted in a loop. This2376	# allows us to test that the data path does not use freed MDB entry2377	# memory. The second entry will have two remotes, one that is added and2378	# deleted in a loop and another that is replaced in a loop. This allows2379	# 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 302397	kill -9 $pid1 $pid2 $pid3 $pid42398	wait $pid1 $pid2 $pid3 $pid4 2>/dev/null2399 2400	log_test 0 0 "Torture test"2401}2402 2403mdb_torture_ipv4_ipv4()2404{2405	local ns1=$ns1_v42406	local vtep1_ip=198.51.100.1002407	local vtep2_ip=198.51.100.2002408	local grp1=239.1.1.12409	local grp1_dmac=01:00:5e:01:01:012410	local grp2=239.2.2.22411	local grp2_dmac=01:00:5e:02:02:022412	local src=192.0.2.1292413 2414	echo2415	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_v42425	local vtep1_ip=198.51.100.1002426	local vtep2_ip=198.51.100.2002427	local grp1=ff0e::12428	local grp1_dmac=33:33:00:00:00:012429	local grp2=ff0e::22430	local grp2_dmac=33:33:00:00:00:022431	local src=2001:db8:100::12432 2433	echo2434	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_v62444	local vtep1_ip=2001:db8:1000::12445	local vtep2_ip=2001:db8:2000::12446	local grp1=239.1.1.12447	local grp1_dmac=01:00:5e:01:01:012448	local grp2=239.2.2.22449	local grp2_dmac=01:00:5e:02:02:022450	local src=192.0.2.1292451 2452	echo2453	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_v62463	local vtep1_ip=2001:db8:1000::12464	local vtep2_ip=2001:db8:2000::12465	local grp1=ff0e::12466	local grp1_dmac=33:33:00:00:00:012467	local grp2=ff0e::22468	local grp2_dmac=33:33:00:00:00:022469	local src=2001:db8:100::12470 2471	echo2472	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# Usage2481 2482usage()2483{2484	cat <<EOF2485usage: ${0##*/} OPTS2486 2487        -t <test>   Test(s) to run (default: all)2488                    (options: $TESTS)2489        -c          Control path tests only2490        -d          Data path tests only2491        -p          Pause on fail2492        -P          Pause after each test before cleanup2493        -v          Verbose mode (show commands and output)2494EOF2495}2496 2497################################################################################2498# Main2499 2500trap cleanup EXIT2501 2502while getopts ":t:cdpPvh" opt; do2503	case $opt in2504		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	esac2513done2514 2515# Make sure we don't pause twice.2516[ "${PAUSE}" = "yes" ] && PAUSE_ON_FAIL=no2517 2518if [ "$(id -u)" -ne 0 ];then2519	echo "SKIP: Need root privileges"2520	exit $ksft_skip;2521fi2522 2523if [ ! -x "$(command -v ip)" ]; then2524	echo "SKIP: Could not run test without ip tool"2525	exit $ksft_skip2526fi2527 2528if [ ! -x "$(command -v bridge)" ]; then2529	echo "SKIP: Could not run test without bridge tool"2530	exit $ksft_skip2531fi2532 2533if [ ! -x "$(command -v mausezahn)" ]; then2534	echo "SKIP: Could not run test without mausezahn tool"2535	exit $ksft_skip2536fi2537 2538if [ ! -x "$(command -v jq)" ]; then2539	echo "SKIP: Could not run test without jq tool"2540	exit $ksft_skip2541fi2542 2543bridge mdb help 2>&1 | grep -q "flush"2544if [ $? -ne 0 ]; then2545   echo "SKIP: iproute2 bridge too old, missing VXLAN MDB flush support"2546   exit $ksft_skip2547fi2548 2549# Start clean.2550cleanup2551 2552for t in $TESTS2553do2554	setup; $t; cleanup;2555done2556 2557if [ "$TESTS" != "none" ]; then2558	printf "\nTests passed: %3d\n" ${nsuccess}2559	printf "Tests failed: %3d\n"   ${nfail}2560fi2561 2562exit $ret2563