File Index
Files and directories
Sign in
FILE

test_vxlan_mdb.sh

File preview with syntax highlighting.

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