2563 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03#4# This test is for checking VXLAN MDB functionality. The topology consists of5# two sets of namespaces: One for the testing of IPv4 underlay and another for6# IPv6. In both cases, both IPv4 and IPv6 overlay traffic are tested.7#8# Data path functionality is tested by sending traffic from one of the upper9# namespaces and checking using ingress tc filters that the expected traffic10# was received by one of the lower namespaces.11#12# +------------------------------------+ +------------------------------------+13# | ns1_v4 | | ns1_v6 |14# | | | |15# | br0.10 br0.4000 br0.20 | | br0.10 br0.4000 br0.20 |16# | + + + | | + + + |17# | | | | | | | | | |18# | | | | | | | | | |19# | +---------+---------+ | | +---------+---------+ |20# | | | | | |21# | | | | | |22# | + | | + |23# | br0 | | br0 |24# | + | | + |25# | | | | | |26# | | | | | |27# | + | | + |28# | vx0 | | vx0 |29# | | | |30# | | | |31# | veth0 | | veth0 |32# | + | | + |33# +-----------------|------------------+ +-----------------|------------------+34# | |35# +-----------------|------------------+ +-----------------|------------------+36# | + | | + |37# | veth0 | | veth0 |38# | | | |39# | | | |40# | vx0 | | vx0 |41# | + | | + |42# | | | | | |43# | | | | | |44# | + | | + |45# | br0 | | br0 |46# | + | | + |47# | | | | | |48# | | | | | |49# | +---------+---------+ | | +---------+---------+ |50# | | | | | | | | | |51# | | | | | | | | | |52# | + + + | | + + + |53# | br0.10 br0.4000 br0.10 | | br0.10 br0.4000 br0.20 |54# | | | |55# | ns2_v4 | | ns2_v6 |56# +------------------------------------+ +------------------------------------+57 58source lib.sh59ret=060 61CONTROL_PATH_TESTS="62 basic_star_g_ipv4_ipv463 basic_star_g_ipv6_ipv464 basic_star_g_ipv4_ipv665 basic_star_g_ipv6_ipv666 basic_sg_ipv4_ipv467 basic_sg_ipv6_ipv468 basic_sg_ipv4_ipv669 basic_sg_ipv6_ipv670 star_g_ipv4_ipv471 star_g_ipv6_ipv472 star_g_ipv4_ipv673 star_g_ipv6_ipv674 sg_ipv4_ipv475 sg_ipv6_ipv476 sg_ipv4_ipv677 sg_ipv6_ipv678 dump_ipv4_ipv479 dump_ipv6_ipv480 dump_ipv4_ipv681 dump_ipv6_ipv682 flush83"84 85DATA_PATH_TESTS="86 encap_params_ipv4_ipv487 encap_params_ipv6_ipv488 encap_params_ipv4_ipv689 encap_params_ipv6_ipv690 starg_exclude_ir_ipv4_ipv491 starg_exclude_ir_ipv6_ipv492 starg_exclude_ir_ipv4_ipv693 starg_exclude_ir_ipv6_ipv694 starg_include_ir_ipv4_ipv495 starg_include_ir_ipv6_ipv496 starg_include_ir_ipv4_ipv697 starg_include_ir_ipv6_ipv698 starg_exclude_p2mp_ipv4_ipv499 starg_exclude_p2mp_ipv6_ipv4100 starg_exclude_p2mp_ipv4_ipv6101 starg_exclude_p2mp_ipv6_ipv6102 starg_include_p2mp_ipv4_ipv4103 starg_include_p2mp_ipv6_ipv4104 starg_include_p2mp_ipv4_ipv6105 starg_include_p2mp_ipv6_ipv6106 egress_vni_translation_ipv4_ipv4107 egress_vni_translation_ipv6_ipv4108 egress_vni_translation_ipv4_ipv6109 egress_vni_translation_ipv6_ipv6110 all_zeros_mdb_ipv4111 all_zeros_mdb_ipv6112 mdb_fdb_ipv4_ipv4113 mdb_fdb_ipv6_ipv4114 mdb_fdb_ipv4_ipv6115 mdb_fdb_ipv6_ipv6116 mdb_torture_ipv4_ipv4117 mdb_torture_ipv6_ipv4118 mdb_torture_ipv4_ipv6119 mdb_torture_ipv6_ipv6120"121 122# All tests in this script. Can be overridden with -t option.123TESTS="124 $CONTROL_PATH_TESTS125 $DATA_PATH_TESTS126"127VERBOSE=0128PAUSE_ON_FAIL=no129PAUSE=no130 131################################################################################132# Utilities133 134log_test()135{136 local rc=$1137 local expected=$2138 local msg="$3"139 140 if [ ${rc} -eq ${expected} ]; then141 printf "TEST: %-60s [ OK ]\n" "${msg}"142 nsuccess=$((nsuccess+1))143 else144 ret=1145 nfail=$((nfail+1))146 printf "TEST: %-60s [FAIL]\n" "${msg}"147 if [ "$VERBOSE" = "1" ]; then148 echo " rc=$rc, expected $expected"149 fi150 151 if [ "${PAUSE_ON_FAIL}" = "yes" ]; then152 echo153 echo "hit enter to continue, 'q' to quit"154 read a155 [ "$a" = "q" ] && exit 1156 fi157 fi158 159 if [ "${PAUSE}" = "yes" ]; then160 echo161 echo "hit enter to continue, 'q' to quit"162 read a163 [ "$a" = "q" ] && exit 1164 fi165 166 [ "$VERBOSE" = "1" ] && echo167}168 169run_cmd()170{171 local cmd="$1"172 local out173 local stderr="2>/dev/null"174 175 if [ "$VERBOSE" = "1" ]; then176 printf "COMMAND: $cmd\n"177 stderr=178 fi179 180 out=$(eval $cmd $stderr)181 rc=$?182 if [ "$VERBOSE" = "1" -a -n "$out" ]; then183 echo " $out"184 fi185 186 return $rc187}188 189tc_check_packets()190{191 local ns=$1; shift192 local id=$1; shift193 local handle=$1; shift194 local count=$1; shift195 local pkts196 197 sleep 0.1198 pkts=$(tc -n $ns -j -s filter show $id \199 | jq ".[] | select(.options.handle == $handle) | \200 .options.actions[0].stats.packets")201 [[ $pkts == $count ]]202}203 204################################################################################205# Setup206 207setup_common_ns()208{209 local ns=$1; shift210 local local_addr=$1; shift211 212 ip netns exec $ns sysctl -qw net.ipv4.ip_forward=1213 ip netns exec $ns sysctl -qw net.ipv4.fib_multipath_use_neigh=1214 ip netns exec $ns sysctl -qw net.ipv4.conf.default.ignore_routes_with_linkdown=1215 ip netns exec $ns sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1216 ip netns exec $ns sysctl -qw net.ipv6.conf.all.forwarding=1217 ip netns exec $ns sysctl -qw net.ipv6.conf.default.forwarding=1218 ip netns exec $ns sysctl -qw net.ipv6.conf.default.ignore_routes_with_linkdown=1219 ip netns exec $ns sysctl -qw net.ipv6.conf.all.accept_dad=0220 ip netns exec $ns sysctl -qw net.ipv6.conf.default.accept_dad=0221 222 ip -n $ns link set dev lo up223 ip -n $ns address add $local_addr dev lo224 225 ip -n $ns link set dev veth0 up226 227 ip -n $ns link add name br0 up type bridge vlan_filtering 1 \228 vlan_default_pvid 0 mcast_snooping 0229 230 ip -n $ns link add link br0 name br0.10 up type vlan id 10231 bridge -n $ns vlan add vid 10 dev br0 self232 233 ip -n $ns link add link br0 name br0.20 up type vlan id 20234 bridge -n $ns vlan add vid 20 dev br0 self235 236 ip -n $ns link add link br0 name br0.4000 up type vlan id 4000237 bridge -n $ns vlan add vid 4000 dev br0 self238 239 ip -n $ns link add name vx0 up master br0 type vxlan \240 local $local_addr dstport 4789 external vnifilter241 bridge -n $ns link set dev vx0 vlan_tunnel on242 243 bridge -n $ns vlan add vid 10 dev vx0244 bridge -n $ns vlan add vid 10 dev vx0 tunnel_info id 10010245 bridge -n $ns vni add vni 10010 dev vx0246 247 bridge -n $ns vlan add vid 20 dev vx0248 bridge -n $ns vlan add vid 20 dev vx0 tunnel_info id 10020249 bridge -n $ns vni add vni 10020 dev vx0250 251 bridge -n $ns vlan add vid 4000 dev vx0 pvid252 bridge -n $ns vlan add vid 4000 dev vx0 tunnel_info id 14000253 bridge -n $ns vni add vni 14000 dev vx0254}255 256setup_common()257{258 local ns1=$1; shift259 local ns2=$1; shift260 local local_addr1=$1; shift261 local local_addr2=$1; shift262 263 ip link add name veth0 type veth peer name veth1264 ip link set dev veth0 netns $ns1 name veth0265 ip link set dev veth1 netns $ns2 name veth0266 267 setup_common_ns $ns1 $local_addr1268 setup_common_ns $ns2 $local_addr2269}270 271setup_v4()272{273 setup_ns ns1_v4 ns2_v4274 setup_common $ns1_v4 $ns2_v4 192.0.2.1 192.0.2.2275 276 ip -n $ns1_v4 address add 192.0.2.17/28 dev veth0277 ip -n $ns2_v4 address add 192.0.2.18/28 dev veth0278 279 ip -n $ns1_v4 route add default via 192.0.2.18280 ip -n $ns2_v4 route add default via 192.0.2.17281}282 283cleanup_v4()284{285 cleanup_ns $ns2_v4 $ns1_v4286}287 288setup_v6()289{290 setup_ns ns1_v6 ns2_v6291 setup_common $ns1_v6 $ns2_v6 2001:db8:1::1 2001:db8:1::2292 293 ip -n $ns1_v6 address add 2001:db8:2::1/64 dev veth0 nodad294 ip -n $ns2_v6 address add 2001:db8:2::2/64 dev veth0 nodad295 296 ip -n $ns1_v6 route add default via 2001:db8:2::2297 ip -n $ns2_v6 route add default via 2001:db8:2::1298}299 300cleanup_v6()301{302 cleanup_ns $ns2_v6 $ns1_v6303}304 305setup()306{307 set -e308 309 setup_v4310 setup_v6311 312 sleep 5313 314 set +e315}316 317cleanup()318{319 cleanup_v6 &> /dev/null320 cleanup_v4 &> /dev/null321}322 323################################################################################324# Tests - Control path325 326basic_common()327{328 local ns1=$1; shift329 local grp_key=$1; shift330 local vtep_ip=$1; shift331 332 # Test basic control path operations common to all MDB entry types.333 334 # Basic add, replace and delete behavior.335 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"336 log_test $? 0 "MDB entry addition"337 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010"338 log_test $? 0 "MDB entry presence after addition"339 340 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"341 log_test $? 0 "MDB entry replacement"342 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010"343 log_test $? 0 "MDB entry presence after replacement"344 345 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"346 log_test $? 0 "MDB entry deletion"347 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010"348 log_test $? 254 "MDB entry presence after deletion"349 350 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"351 log_test $? 255 "Non-existent MDB entry deletion"352 353 # Default protocol and replacement.354 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"355 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010 | grep \"proto static\""356 log_test $? 0 "MDB entry default protocol"357 358 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 $grp_key permanent proto 123 dst $vtep_ip src_vni 10010"359 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010 | grep \"proto 123\""360 log_test $? 0 "MDB entry protocol replacement"361 362 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"363 364 # Default destination port and replacement.365 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"366 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010 | grep \" dst_port \""367 log_test $? 1 "MDB entry default destination port"368 369 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 $grp_key permanent dst $vtep_ip dst_port 1234 src_vni 10010"370 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010 | grep \"dst_port 1234\""371 log_test $? 0 "MDB entry destination port replacement"372 373 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"374 375 # Default destination VNI and replacement.376 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"377 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010 | grep \" vni \""378 log_test $? 1 "MDB entry default destination VNI"379 380 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 $grp_key permanent dst $vtep_ip vni 1234 src_vni 10010"381 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010 | grep \"vni 1234\""382 log_test $? 0 "MDB entry destination VNI replacement"383 384 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"385 386 # Default outgoing interface and replacement.387 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"388 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010 | grep \" via \""389 log_test $? 1 "MDB entry default outgoing interface"390 391 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010 via veth0"392 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010 | grep \"via veth0\""393 log_test $? 0 "MDB entry outgoing interface replacement"394 395 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"396 397 # Common error cases.398 run_cmd "bridge -n $ns1 mdb add dev vx0 port veth0 $grp_key permanent dst $vtep_ip src_vni 10010"399 log_test $? 255 "MDB entry with mismatch between device and port"400 401 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key temp dst $vtep_ip src_vni 10010"402 log_test $? 255 "MDB entry with temp state"403 404 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent vid 10 dst $vtep_ip src_vni 10010"405 log_test $? 255 "MDB entry with VLAN"406 407 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp 01:02:03:04:05:06 permanent dst $vtep_ip src_vni 10010"408 log_test $? 255 "MDB entry MAC address"409 410 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent"411 log_test $? 255 "MDB entry without extended parameters"412 413 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent proto 3 dst $vtep_ip src_vni 10010"414 log_test $? 255 "MDB entry with an invalid protocol"415 416 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip vni $((2 ** 24)) src_vni 10010"417 log_test $? 255 "MDB entry with an invalid destination VNI"418 419 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni $((2 ** 24))"420 log_test $? 255 "MDB entry with an invalid source VNI"421 422 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent src_vni 10010"423 log_test $? 255 "MDB entry without a remote destination IP"424 425 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"426 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"427 log_test $? 255 "Duplicate MDB entries"428 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"429}430 431basic_star_g_ipv4_ipv4()432{433 local ns1=$ns1_v4434 local grp_key="grp 239.1.1.1"435 local vtep_ip=198.51.100.100436 437 echo438 echo "Control path: Basic (*, G) operations - IPv4 overlay / IPv4 underlay"439 echo "--------------------------------------------------------------------"440 441 basic_common $ns1 "$grp_key" $vtep_ip442}443 444basic_star_g_ipv6_ipv4()445{446 local ns1=$ns1_v4447 local grp_key="grp ff0e::1"448 local vtep_ip=198.51.100.100449 450 echo451 echo "Control path: Basic (*, G) operations - IPv6 overlay / IPv4 underlay"452 echo "--------------------------------------------------------------------"453 454 basic_common $ns1 "$grp_key" $vtep_ip455}456 457basic_star_g_ipv4_ipv6()458{459 local ns1=$ns1_v6460 local grp_key="grp 239.1.1.1"461 local vtep_ip=2001:db8:1000::1462 463 echo464 echo "Control path: Basic (*, G) operations - IPv4 overlay / IPv6 underlay"465 echo "--------------------------------------------------------------------"466 467 basic_common $ns1 "$grp_key" $vtep_ip468}469 470basic_star_g_ipv6_ipv6()471{472 local ns1=$ns1_v6473 local grp_key="grp ff0e::1"474 local vtep_ip=2001:db8:1000::1475 476 echo477 echo "Control path: Basic (*, G) operations - IPv6 overlay / IPv6 underlay"478 echo "--------------------------------------------------------------------"479 480 basic_common $ns1 "$grp_key" $vtep_ip481}482 483basic_sg_ipv4_ipv4()484{485 local ns1=$ns1_v4486 local grp_key="grp 239.1.1.1 src 192.0.2.129"487 local vtep_ip=198.51.100.100488 489 echo490 echo "Control path: Basic (S, G) operations - IPv4 overlay / IPv4 underlay"491 echo "--------------------------------------------------------------------"492 493 basic_common $ns1 "$grp_key" $vtep_ip494}495 496basic_sg_ipv6_ipv4()497{498 local ns1=$ns1_v4499 local grp_key="grp ff0e::1 src 2001:db8:100::1"500 local vtep_ip=198.51.100.100501 502 echo503 echo "Control path: Basic (S, G) operations - IPv6 overlay / IPv4 underlay"504 echo "---------------------------------------------------------------------"505 506 basic_common $ns1 "$grp_key" $vtep_ip507}508 509basic_sg_ipv4_ipv6()510{511 local ns1=$ns1_v6512 local grp_key="grp 239.1.1.1 src 192.0.2.129"513 local vtep_ip=2001:db8:1000::1514 515 echo516 echo "Control path: Basic (S, G) operations - IPv4 overlay / IPv6 underlay"517 echo "--------------------------------------------------------------------"518 519 basic_common $ns1 "$grp_key" $vtep_ip520}521 522basic_sg_ipv6_ipv6()523{524 local ns1=$ns1_v6525 local grp_key="grp ff0e::1 src 2001:db8:100::1"526 local vtep_ip=2001:db8:1000::1527 528 echo529 echo "Control path: Basic (S, G) operations - IPv6 overlay / IPv6 underlay"530 echo "--------------------------------------------------------------------"531 532 basic_common $ns1 "$grp_key" $vtep_ip533}534 535star_g_common()536{537 local ns1=$1; shift538 local grp=$1; shift539 local src1=$1; shift540 local src2=$1; shift541 local src3=$1; shift542 local vtep_ip=$1; shift543 local all_zeros_grp=$1; shift544 545 # Test control path operations specific to (*, G) entries.546 547 # Basic add, replace and delete behavior.548 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip src_vni 10010"549 log_test $? 0 "(*, G) MDB entry addition with source list"550 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010"551 log_test $? 0 "(*, G) MDB entry presence after addition"552 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010"553 log_test $? 0 "(S, G) MDB entry presence after addition"554 555 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip src_vni 10010"556 log_test $? 0 "(*, G) MDB entry replacement with source list"557 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010"558 log_test $? 0 "(*, G) MDB entry presence after replacement"559 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010"560 log_test $? 0 "(S, G) MDB entry presence after replacement"561 562 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"563 log_test $? 0 "(*, G) MDB entry deletion"564 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010"565 log_test $? 254 "(*, G) MDB entry presence after deletion"566 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010"567 log_test $? 254 "(S, G) MDB entry presence after deletion"568 569 # Default filter mode and replacement.570 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent dst $vtep_ip src_vni 10010"571 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep exclude"572 log_test $? 0 "(*, G) MDB entry default filter mode"573 574 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode include source_list $src1 dst $vtep_ip src_vni 10010"575 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep include"576 log_test $? 0 "(*, G) MDB entry after replacing filter mode to \"include\""577 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010"578 log_test $? 0 "(S, G) MDB entry after replacing filter mode to \"include\""579 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep blocked"580 log_test $? 1 "\"blocked\" flag after replacing filter mode to \"include\""581 582 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip src_vni 10010"583 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep exclude"584 log_test $? 0 "(*, G) MDB entry after replacing filter mode to \"exclude\""585 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grep grp $grp src $src1 src_vni 10010"586 log_test $? 0 "(S, G) MDB entry after replacing filter mode to \"exclude\""587 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep blocked"588 log_test $? 0 "\"blocked\" flag after replacing filter mode to \"exclude\""589 590 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"591 592 # Default source list and replacement.593 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent dst $vtep_ip src_vni 10010"594 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep source_list"595 log_test $? 1 "(*, G) MDB entry default source list"596 597 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1,$src2,$src3 dst $vtep_ip src_vni 10010"598 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010"599 log_test $? 0 "(S, G) MDB entry of 1st source after replacing source list"600 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src2 src_vni 10010"601 log_test $? 0 "(S, G) MDB entry of 2nd source after replacing source list"602 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src3 src_vni 10010"603 log_test $? 0 "(S, G) MDB entry of 3rd source after replacing source list"604 605 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1,$src3 dst $vtep_ip src_vni 10010"606 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010"607 log_test $? 0 "(S, G) MDB entry of 1st source after removing source"608 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src2 src_vni 10010"609 log_test $? 254 "(S, G) MDB entry of 2nd source after removing source"610 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src3 src_vni 10010"611 log_test $? 0 "(S, G) MDB entry of 3rd source after removing source"612 613 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"614 615 # Default protocol and replacement.616 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip src_vni 10010"617 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep \"proto static\""618 log_test $? 0 "(*, G) MDB entry default protocol"619 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep \"proto static\""620 log_test $? 0 "(S, G) MDB entry default protocol"621 622 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 proto bgp dst $vtep_ip src_vni 10010"623 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep \"proto bgp\""624 log_test $? 0 "(*, G) MDB entry protocol after replacement"625 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep \"proto bgp\""626 log_test $? 0 "(S, G) MDB entry protocol after replacement"627 628 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"629 630 # Default destination port and replacement.631 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip src_vni 10010"632 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep \" dst_port \""633 log_test $? 1 "(*, G) MDB entry default destination port"634 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep \" dst_port \""635 log_test $? 1 "(S, G) MDB entry default destination port"636 637 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip dst_port 1234 src_vni 10010"638 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep \" dst_port 1234 \""639 log_test $? 0 "(*, G) MDB entry destination port after replacement"640 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep \" dst_port 1234 \""641 log_test $? 0 "(S, G) MDB entry destination port after replacement"642 643 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"644 645 # Default destination VNI and replacement.646 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip src_vni 10010"647 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep \" vni \""648 log_test $? 1 "(*, G) MDB entry default destination VNI"649 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep \" vni \""650 log_test $? 1 "(S, G) MDB entry default destination VNI"651 652 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip vni 1234 src_vni 10010"653 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep \" vni 1234 \""654 log_test $? 0 "(*, G) MDB entry destination VNI after replacement"655 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep \" vni 1234 \""656 log_test $? 0 "(S, G) MDB entry destination VNI after replacement"657 658 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"659 660 # Default outgoing interface and replacement.661 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip src_vni 10010"662 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep \" via \""663 log_test $? 1 "(*, G) MDB entry default outgoing interface"664 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep \" via \""665 log_test $? 1 "(S, G) MDB entry default outgoing interface"666 667 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip src_vni 10010 via veth0"668 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep \" via veth0 \""669 log_test $? 0 "(*, G) MDB entry outgoing interface after replacement"670 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep \" via veth0 \""671 log_test $? 0 "(S, G) MDB entry outgoing interface after replacement"672 673 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"674 675 # Error cases.676 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $all_zeros_grp permanent filter_mode exclude dst $vtep_ip src_vni 10010"677 log_test $? 255 "All-zeros group with filter mode"678 679 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $all_zeros_grp permanent source_list $src1 dst $vtep_ip src_vni 10010"680 log_test $? 255 "All-zeros group with source list"681 682 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent filter_mode include dst $vtep_ip src_vni 10010"683 log_test $? 255 "(*, G) INCLUDE with an empty source list"684 685 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $grp dst $vtep_ip src_vni 10010"686 log_test $? 255 "Invalid source in source list"687 688 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent source_list $src1 dst $vtep_ip src_vni 10010"689 log_test $? 255 "Source list without filter mode"690}691 692star_g_ipv4_ipv4()693{694 local ns1=$ns1_v4695 local grp=239.1.1.1696 local src1=192.0.2.129697 local src2=192.0.2.130698 local src3=192.0.2.131699 local vtep_ip=198.51.100.100700 local all_zeros_grp=0.0.0.0701 702 echo703 echo "Control path: (*, G) operations - IPv4 overlay / IPv4 underlay"704 echo "--------------------------------------------------------------"705 706 star_g_common $ns1 $grp $src1 $src2 $src3 $vtep_ip $all_zeros_grp707}708 709star_g_ipv6_ipv4()710{711 local ns1=$ns1_v4712 local grp=ff0e::1713 local src1=2001:db8:100::1714 local src2=2001:db8:100::2715 local src3=2001:db8:100::3716 local vtep_ip=198.51.100.100717 local all_zeros_grp=::718 719 echo720 echo "Control path: (*, G) operations - IPv6 overlay / IPv4 underlay"721 echo "--------------------------------------------------------------"722 723 star_g_common $ns1 $grp $src1 $src2 $src3 $vtep_ip $all_zeros_grp724}725 726star_g_ipv4_ipv6()727{728 local ns1=$ns1_v6729 local grp=239.1.1.1730 local src1=192.0.2.129731 local src2=192.0.2.130732 local src3=192.0.2.131733 local vtep_ip=2001:db8:1000::1734 local all_zeros_grp=0.0.0.0735 736 echo737 echo "Control path: (*, G) operations - IPv4 overlay / IPv6 underlay"738 echo "--------------------------------------------------------------"739 740 star_g_common $ns1 $grp $src1 $src2 $src3 $vtep_ip $all_zeros_grp741}742 743star_g_ipv6_ipv6()744{745 local ns1=$ns1_v6746 local grp=ff0e::1747 local src1=2001:db8:100::1748 local src2=2001:db8:100::2749 local src3=2001:db8:100::3750 local vtep_ip=2001:db8:1000::1751 local all_zeros_grp=::752 753 echo754 echo "Control path: (*, G) operations - IPv6 overlay / IPv6 underlay"755 echo "--------------------------------------------------------------"756 757 star_g_common $ns1 $grp $src1 $src2 $src3 $vtep_ip $all_zeros_grp758}759 760sg_common()761{762 local ns1=$1; shift763 local grp=$1; shift764 local src=$1; shift765 local vtep_ip=$1; shift766 local all_zeros_grp=$1; shift767 768 # Test control path operations specific to (S, G) entries.769 770 # Default filter mode.771 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp src $src permanent dst $vtep_ip src_vni 10010"772 run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src src_vni 10010 | grep include"773 log_test $? 0 "(S, G) MDB entry default filter mode"774 775 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp src $src permanent dst $vtep_ip src_vni 10010"776 777 # Error cases.778 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp src $src permanent filter_mode include dst $vtep_ip src_vni 10010"779 log_test $? 255 "(S, G) with filter mode"780 781 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp src $src permanent source_list $src dst $vtep_ip src_vni 10010"782 log_test $? 255 "(S, G) with source list"783 784 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp src $grp permanent dst $vtep_ip src_vni 10010"785 log_test $? 255 "(S, G) with an invalid source list"786 787 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $all_zeros_grp src $src permanent dst $vtep_ip src_vni 10010"788 log_test $? 255 "All-zeros group with source"789}790 791sg_ipv4_ipv4()792{793 local ns1=$ns1_v4794 local grp=239.1.1.1795 local src=192.0.2.129796 local vtep_ip=198.51.100.100797 local all_zeros_grp=0.0.0.0798 799 echo800 echo "Control path: (S, G) operations - IPv4 overlay / IPv4 underlay"801 echo "--------------------------------------------------------------"802 803 sg_common $ns1 $grp $src $vtep_ip $all_zeros_grp804}805 806sg_ipv6_ipv4()807{808 local ns1=$ns1_v4809 local grp=ff0e::1810 local src=2001:db8:100::1811 local vtep_ip=198.51.100.100812 local all_zeros_grp=::813 814 echo815 echo "Control path: (S, G) operations - IPv6 overlay / IPv4 underlay"816 echo "--------------------------------------------------------------"817 818 sg_common $ns1 $grp $src $vtep_ip $all_zeros_grp819}820 821sg_ipv4_ipv6()822{823 local ns1=$ns1_v6824 local grp=239.1.1.1825 local src=192.0.2.129826 local vtep_ip=2001:db8:1000::1827 local all_zeros_grp=0.0.0.0828 829 echo830 echo "Control path: (S, G) operations - IPv4 overlay / IPv6 underlay"831 echo "--------------------------------------------------------------"832 833 sg_common $ns1 $grp $src $vtep_ip $all_zeros_grp834}835 836sg_ipv6_ipv6()837{838 local ns1=$ns1_v6839 local grp=ff0e::1840 local src=2001:db8:100::1841 local vtep_ip=2001:db8:1000::1842 local all_zeros_grp=::843 844 echo845 echo "Control path: (S, G) operations - IPv6 overlay / IPv6 underlay"846 echo "--------------------------------------------------------------"847 848 sg_common $ns1 $grp $src $vtep_ip $all_zeros_grp849}850 851ipv4_grps_get()852{853 local max_grps=$1; shift854 local i855 856 for i in $(seq 0 $((max_grps - 1))); do857 echo "239.1.1.$i"858 done859}860 861ipv6_grps_get()862{863 local max_grps=$1; shift864 local i865 866 for i in $(seq 0 $((max_grps - 1))); do867 echo "ff0e::$(printf %x $i)"868 done869}870 871dump_common()872{873 local ns1=$1; shift874 local local_addr=$1; shift875 local remote_prefix=$1; shift876 local fn=$1; shift877 local max_vxlan_devs=2878 local max_remotes=64879 local max_grps=256880 local num_entries881 local batch_file882 local grp883 local i j884 885 # The kernel maintains various markers for the MDB dump. Add a test for886 # large scale MDB dump to make sure that all the configured entries are887 # dumped and that the markers are used correctly.888 889 # Create net devices.890 for i in $(seq 1 $max_vxlan_devs); do891 ip -n $ns1 link add name vx-test${i} up type vxlan \892 local $local_addr dstport 4789 external vnifilter893 done894 895 # Create batch file with MDB entries.896 batch_file=$(mktemp)897 for i in $(seq 1 $max_vxlan_devs); do898 for j in $(seq 1 $max_remotes); do899 for grp in $($fn $max_grps); do900 echo "mdb add dev vx-test${i} port vx-test${i} grp $grp permanent dst ${remote_prefix}${j}" >> $batch_file901 done902 done903 done904 905 # Program the batch file and check for expected number of entries.906 bridge -n $ns1 -b $batch_file907 for i in $(seq 1 $max_vxlan_devs); do908 num_entries=$(bridge -n $ns1 mdb show dev vx-test${i} | grep "permanent" | wc -l)909 [[ $num_entries -eq $((max_grps * max_remotes)) ]]910 log_test $? 0 "Large scale dump - VXLAN device #$i"911 done912 913 rm -rf $batch_file914}915 916dump_ipv4_ipv4()917{918 local ns1=$ns1_v4919 local local_addr=192.0.2.1920 local remote_prefix=198.51.100.921 local fn=ipv4_grps_get922 923 echo924 echo "Control path: Large scale MDB dump - IPv4 overlay / IPv4 underlay"925 echo "-----------------------------------------------------------------"926 927 dump_common $ns1 $local_addr $remote_prefix $fn928}929 930dump_ipv6_ipv4()931{932 local ns1=$ns1_v4933 local local_addr=192.0.2.1934 local remote_prefix=198.51.100.935 local fn=ipv6_grps_get936 937 echo938 echo "Control path: Large scale MDB dump - IPv6 overlay / IPv4 underlay"939 echo "-----------------------------------------------------------------"940 941 dump_common $ns1 $local_addr $remote_prefix $fn942}943 944dump_ipv4_ipv6()945{946 local ns1=$ns1_v6947 local local_addr=2001:db8:1::1948 local remote_prefix=2001:db8:1000::949 local fn=ipv4_grps_get950 951 echo952 echo "Control path: Large scale MDB dump - IPv4 overlay / IPv6 underlay"953 echo "-----------------------------------------------------------------"954 955 dump_common $ns1 $local_addr $remote_prefix $fn956}957 958dump_ipv6_ipv6()959{960 local ns1=$ns1_v6961 local local_addr=2001:db8:1::1962 local remote_prefix=2001:db8:1000::963 local fn=ipv6_grps_get964 965 echo966 echo "Control path: Large scale MDB dump - IPv6 overlay / IPv6 underlay"967 echo "-----------------------------------------------------------------"968 969 dump_common $ns1 $local_addr $remote_prefix $fn970}971 972flush()973{974 local num_entries975 976 echo977 echo "Control path: Flush"978 echo "-------------------"979 980 # Add entries with different attributes and check that they are all981 # flushed when the flush command is given with no parameters.982 983 # Different source VNI.984 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.1 src_vni 10010"985 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.2 permanent dst 198.51.100.1 src_vni 10011"986 987 # Different routing protocol.988 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.3 permanent proto bgp dst 198.51.100.1 src_vni 10010"989 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.4 permanent proto zebra dst 198.51.100.1 src_vni 10010"990 991 # Different destination IP.992 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.5 permanent dst 198.51.100.1 src_vni 10010"993 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.6 permanent dst 198.51.100.2 src_vni 10010"994 995 # Different destination port.996 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.7 permanent dst 198.51.100.1 dst_port 11111 src_vni 10010"997 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.8 permanent dst 198.51.100.1 dst_port 22222 src_vni 10010"998 999 # Different VNI.1000 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.9 permanent dst 198.51.100.1 vni 10010 src_vni 10010"1001 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.10 permanent dst 198.51.100.1 vni 10020 src_vni 10010"1002 1003 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"1004 num_entries=$(bridge -n $ns1_v4 mdb show dev vx0 | wc -l)1005 [[ $num_entries -eq 0 ]]1006 log_test $? 0 "Flush all"1007 1008 # Check that entries are flushed when port is specified as the VXLAN1009 # device and that an error is returned when port is specified as a1010 # different net device.1011 1012 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.1 src_vni 10010"1013 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.2 src_vni 10010"1014 1015 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 port vx0"1016 run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010"1017 log_test $? 254 "Flush by port - matching"1018 1019 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 port veth0"1020 log_test $? 255 "Flush by port - non-matching"1021 1022 # Check that when flushing by source VNI only entries programmed with1023 # the specified source VNI are flushed and the rest are not.1024 1025 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.1 src_vni 10010"1026 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.2 src_vni 10010"1027 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.1 src_vni 10011"1028 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.2 src_vni 10011"1029 1030 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 src_vni 10010"1031 1032 run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010"1033 log_test $? 254 "Flush by source VNI - matching"1034 run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10011"1035 log_test $? 0 "Flush by source VNI - non-matching"1036 1037 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"1038 1039 # Check that all entries are flushed when "permanent" is specified and1040 # that an error is returned when "nopermanent" is specified.1041 1042 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.1 src_vni 10010"1043 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.2 src_vni 10010"1044 1045 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 permanent"1046 run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010"1047 log_test $? 254 "Flush by \"permanent\" state"1048 1049 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 nopermanent"1050 log_test $? 255 "Flush by \"nopermanent\" state"1051 1052 # Check that when flushing by routing protocol only entries programmed1053 # with the specified routing protocol are flushed and the rest are not.1054 1055 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent proto bgp dst 198.51.100.1 src_vni 10010"1056 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent proto zebra dst 198.51.100.2 src_vni 10010"1057 1058 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 proto bgp"1059 1060 run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep \"proto bgp\""1061 log_test $? 1 "Flush by routing protocol - matching"1062 run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep \"proto zebra\""1063 log_test $? 0 "Flush by routing protocol - non-matching"1064 1065 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"1066 1067 # Check that when flushing by destination IP only entries programmed1068 # with the specified destination IP are flushed and the rest are not.1069 1070 # IPv4.1071 1072 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.1 src_vni 10010"1073 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.2 src_vni 10010"1074 1075 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 dst 198.51.100.2"1076 1077 run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep 198.51.100.2"1078 log_test $? 1 "Flush by IPv4 destination IP - matching"1079 run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep 198.51.100.1"1080 log_test $? 0 "Flush by IPv4 destination IP - non-matching"1081 1082 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"1083 1084 # IPv6.1085 1086 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 2001:db8:1000::1 src_vni 10010"1087 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 2001:db8:1000::2 src_vni 10010"1088 1089 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 dst 2001:db8:1000::2"1090 1091 run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep 2001:db8:1000::2"1092 log_test $? 1 "Flush by IPv6 destination IP - matching"1093 run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep 2001:db8:1000::1"1094 log_test $? 0 "Flush by IPv6 destination IP - non-matching"1095 1096 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"1097 1098 # Check that when flushing by UDP destination port only entries1099 # programmed with the specified port are flushed and the rest are not.1100 1101 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst_port 11111 dst 198.51.100.1 src_vni 10010"1102 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst_port 22222 dst 198.51.100.2 src_vni 10010"1103 1104 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 dst_port 11111"1105 1106 run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep \"dst_port 11111\""1107 log_test $? 1 "Flush by UDP destination port - matching"1108 run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep \"dst_port 22222\""1109 log_test $? 0 "Flush by UDP destination port - non-matching"1110 1111 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"1112 1113 # When not specifying a UDP destination port for an entry, traffic is1114 # encapsulated with the device's UDP destination port. Check that when1115 # flushing by the device's UDP destination port only entries programmed1116 # with this port are flushed and the rest are not.1117 1118 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.1 src_vni 10010"1119 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst_port 22222 dst 198.51.100.2 src_vni 10010"1120 1121 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 dst_port 4789"1122 1123 run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep 198.51.100.1"1124 log_test $? 1 "Flush by device's UDP destination port - matching"1125 run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep 198.51.100.2"1126 log_test $? 0 "Flush by device's UDP destination port - non-matching"1127 1128 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"1129 1130 # Check that when flushing by destination VNI only entries programmed1131 # with the specified destination VNI are flushed and the rest are not.1132 1133 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent vni 20010 dst 198.51.100.1 src_vni 10010"1134 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent vni 20011 dst 198.51.100.2 src_vni 10010"1135 1136 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 vni 20010"1137 1138 run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep \" vni 20010\""1139 log_test $? 1 "Flush by destination VNI - matching"1140 run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep \" vni 20011\""1141 log_test $? 0 "Flush by destination VNI - non-matching"1142 1143 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"1144 1145 # When not specifying a destination VNI for an entry, traffic is1146 # encapsulated with the source VNI. Check that when flushing by a1147 # destination VNI that is equal to the source VNI only such entries are1148 # flushed and the rest are not.1149 1150 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.1 src_vni 10010"1151 run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent vni 20010 dst 198.51.100.2 src_vni 10010"1152 1153 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 vni 10010"1154 1155 run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep 198.51.100.1"1156 log_test $? 1 "Flush by destination VNI equal to source VNI - matching"1157 run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep 198.51.100.2"1158 log_test $? 0 "Flush by destination VNI equal to source VNI - non-matching"1159 1160 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"1161 1162 # Test that an error is returned when trying to flush using VLAN ID.1163 1164 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 vid 10"1165 log_test $? 255 "Flush by VLAN ID"1166}1167 1168################################################################################1169# Tests - Data path1170 1171encap_params_common()1172{1173 local ns1=$1; shift1174 local ns2=$1; shift1175 local vtep1_ip=$1; shift1176 local vtep2_ip=$1; shift1177 local plen=$1; shift1178 local enc_ethtype=$1; shift1179 local grp=$1; shift1180 local grp_dmac=$1; shift1181 local src=$1; shift1182 local mz=$1; shift1183 1184 # Test that packets forwarded by the VXLAN MDB are encapsulated with1185 # the correct parameters. Transmit packets from the first namespace and1186 # check that they hit the corresponding filters on the ingress of the1187 # second namespace.1188 1189 run_cmd "tc -n $ns2 qdisc replace dev veth0 clsact"1190 run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"1191 run_cmd "ip -n $ns2 address replace $vtep1_ip/$plen dev lo"1192 run_cmd "ip -n $ns2 address replace $vtep2_ip/$plen dev lo"1193 1194 # Check destination IP.1195 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip src_vni 10010"1196 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep2_ip src_vni 10020"1197 1198 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $vtep1_ip action pass"1199 run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"1200 tc_check_packets "$ns2" "dev vx0 ingress" 101 11201 log_test $? 0 "Destination IP - match"1202 1203 run_cmd "ip netns exec $ns1 $mz br0.20 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"1204 tc_check_packets "$ns2" "dev vx0 ingress" 101 11205 log_test $? 0 "Destination IP - no match"1206 1207 run_cmd "tc -n $ns2 filter del dev vx0 ingress pref 1 handle 101 flower"1208 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep2_ip src_vni 10020"1209 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10010"1210 1211 # Check destination port.1212 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip src_vni 10010"1213 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip dst_port 1111 src_vni 10020"1214 1215 run_cmd "tc -n $ns2 filter replace dev veth0 ingress pref 1 handle 101 proto $enc_ethtype flower ip_proto udp dst_port 4789 action pass"1216 run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"1217 tc_check_packets "$ns2" "dev veth0 ingress" 101 11218 log_test $? 0 "Default destination port - match"1219 1220 run_cmd "ip netns exec $ns1 $mz br0.20 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"1221 tc_check_packets "$ns2" "dev veth0 ingress" 101 11222 log_test $? 0 "Default destination port - no match"1223 1224 run_cmd "tc -n $ns2 filter replace dev veth0 ingress pref 1 handle 101 proto $enc_ethtype flower ip_proto udp dst_port 1111 action pass"1225 run_cmd "ip netns exec $ns1 $mz br0.20 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"1226 tc_check_packets "$ns2" "dev veth0 ingress" 101 11227 log_test $? 0 "Non-default destination port - match"1228 1229 run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"1230 tc_check_packets "$ns2" "dev veth0 ingress" 101 11231 log_test $? 0 "Non-default destination port - no match"1232 1233 run_cmd "tc -n $ns2 filter del dev veth0 ingress pref 1 handle 101 flower"1234 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10020"1235 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10010"1236 1237 # Check default VNI.1238 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip src_vni 10010"1239 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip src_vni 10020"1240 1241 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_key_id 10010 action pass"1242 run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"1243 tc_check_packets "$ns2" "dev vx0 ingress" 101 11244 log_test $? 0 "Default destination VNI - match"1245 1246 run_cmd "ip netns exec $ns1 $mz br0.20 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"1247 tc_check_packets "$ns2" "dev vx0 ingress" 101 11248 log_test $? 0 "Default destination VNI - no match"1249 1250 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip vni 10020 src_vni 10010"1251 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip vni 10010 src_vni 10020"1252 1253 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_key_id 10020 action pass"1254 run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"1255 tc_check_packets "$ns2" "dev vx0 ingress" 101 11256 log_test $? 0 "Non-default destination VNI - match"1257 1258 run_cmd "ip netns exec $ns1 $mz br0.20 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"1259 tc_check_packets "$ns2" "dev vx0 ingress" 101 11260 log_test $? 0 "Non-default destination VNI - no match"1261 1262 run_cmd "tc -n $ns2 filter del dev vx0 ingress pref 1 handle 101 flower"1263 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10020"1264 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10010"1265}1266 1267encap_params_ipv4_ipv4()1268{1269 local ns1=$ns1_v41270 local ns2=$ns2_v41271 local vtep1_ip=198.51.100.1001272 local vtep2_ip=198.51.100.2001273 local plen=321274 local enc_ethtype="ip"1275 local grp=239.1.1.11276 local grp_dmac=01:00:5e:01:01:011277 local src=192.0.2.1291278 1279 echo1280 echo "Data path: Encapsulation parameters - IPv4 overlay / IPv4 underlay"1281 echo "------------------------------------------------------------------"1282 1283 encap_params_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $enc_ethtype \1284 $grp $grp_dmac $src "mausezahn"1285}1286 1287encap_params_ipv6_ipv4()1288{1289 local ns1=$ns1_v41290 local ns2=$ns2_v41291 local vtep1_ip=198.51.100.1001292 local vtep2_ip=198.51.100.2001293 local plen=321294 local enc_ethtype="ip"1295 local grp=ff0e::11296 local grp_dmac=33:33:00:00:00:011297 local src=2001:db8:100::11298 1299 echo1300 echo "Data path: Encapsulation parameters - IPv6 overlay / IPv4 underlay"1301 echo "------------------------------------------------------------------"1302 1303 encap_params_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $enc_ethtype \1304 $grp $grp_dmac $src "mausezahn -6"1305}1306 1307encap_params_ipv4_ipv6()1308{1309 local ns1=$ns1_v61310 local ns2=$ns2_v61311 local vtep1_ip=2001:db8:1000::11312 local vtep2_ip=2001:db8:2000::11313 local plen=1281314 local enc_ethtype="ipv6"1315 local grp=239.1.1.11316 local grp_dmac=01:00:5e:01:01:011317 local src=192.0.2.1291318 1319 echo1320 echo "Data path: Encapsulation parameters - IPv4 overlay / IPv6 underlay"1321 echo "------------------------------------------------------------------"1322 1323 encap_params_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $enc_ethtype \1324 $grp $grp_dmac $src "mausezahn"1325}1326 1327encap_params_ipv6_ipv6()1328{1329 local ns1=$ns1_v61330 local ns2=$ns2_v61331 local vtep1_ip=2001:db8:1000::11332 local vtep2_ip=2001:db8:2000::11333 local plen=1281334 local enc_ethtype="ipv6"1335 local grp=ff0e::11336 local grp_dmac=33:33:00:00:00:011337 local src=2001:db8:100::11338 1339 echo1340 echo "Data path: Encapsulation parameters - IPv6 overlay / IPv6 underlay"1341 echo "------------------------------------------------------------------"1342 1343 encap_params_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $enc_ethtype \1344 $grp $grp_dmac $src "mausezahn -6"1345}1346 1347starg_exclude_ir_common()1348{1349 local ns1=$1; shift1350 local ns2=$1; shift1351 local vtep1_ip=$1; shift1352 local vtep2_ip=$1; shift1353 local plen=$1; shift1354 local grp=$1; shift1355 local grp_dmac=$1; shift1356 local valid_src=$1; shift1357 local invalid_src=$1; shift1358 local mz=$1; shift1359 1360 # Install a (*, G) EXCLUDE MDB entry with one source and two remote1361 # VTEPs. Make sure that the source in the source list is not forwarded1362 # and that a source not in the list is forwarded. Remove one of the1363 # VTEPs from the entry and make sure that packets are only forwarded to1364 # the remaining VTEP.1365 1366 run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"1367 run_cmd "ip -n $ns2 address replace $vtep1_ip/$plen dev lo"1368 run_cmd "ip -n $ns2 address replace $vtep2_ip/$plen dev lo"1369 1370 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $vtep1_ip action pass"1371 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 102 proto all flower enc_dst_ip $vtep2_ip action pass"1372 1373 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $invalid_src dst $vtep1_ip src_vni 10010"1374 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $invalid_src dst $vtep2_ip src_vni 10010"1375 1376 # Check that invalid source is not forwarded to any VTEP.1377 run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"1378 tc_check_packets "$ns2" "dev vx0 ingress" 101 01379 log_test $? 0 "Block excluded source - first VTEP"1380 tc_check_packets "$ns2" "dev vx0 ingress" 102 01381 log_test $? 0 "Block excluded source - second VTEP"1382 1383 # Check that valid source is forwarded to both VTEPs.1384 run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"1385 tc_check_packets "$ns2" "dev vx0 ingress" 101 11386 log_test $? 0 "Forward valid source - first VTEP"1387 tc_check_packets "$ns2" "dev vx0 ingress" 102 11388 log_test $? 0 "Forward valid source - second VTEP"1389 1390 # Remove second VTEP.1391 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep2_ip src_vni 10010"1392 1393 # Check that invalid source is not forwarded to any VTEP.1394 run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"1395 tc_check_packets "$ns2" "dev vx0 ingress" 101 11396 log_test $? 0 "Block excluded source after removal - first VTEP"1397 tc_check_packets "$ns2" "dev vx0 ingress" 102 11398 log_test $? 0 "Block excluded source after removal - second VTEP"1399 1400 # Check that valid source is forwarded to the remaining VTEP.1401 run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"1402 tc_check_packets "$ns2" "dev vx0 ingress" 101 21403 log_test $? 0 "Forward valid source after removal - first VTEP"1404 tc_check_packets "$ns2" "dev vx0 ingress" 102 11405 log_test $? 0 "Forward valid source after removal - second VTEP"1406}1407 1408starg_exclude_ir_ipv4_ipv4()1409{1410 local ns1=$ns1_v41411 local ns2=$ns2_v41412 local vtep1_ip=198.51.100.1001413 local vtep2_ip=198.51.100.2001414 local plen=321415 local grp=239.1.1.11416 local grp_dmac=01:00:5e:01:01:011417 local valid_src=192.0.2.1291418 local invalid_src=192.0.2.1451419 1420 echo1421 echo "Data path: (*, G) EXCLUDE - IR - IPv4 overlay / IPv4 underlay"1422 echo "-------------------------------------------------------------"1423 1424 starg_exclude_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \1425 $grp_dmac $valid_src $invalid_src "mausezahn"1426}1427 1428starg_exclude_ir_ipv6_ipv4()1429{1430 local ns1=$ns1_v41431 local ns2=$ns2_v41432 local vtep1_ip=198.51.100.1001433 local vtep2_ip=198.51.100.2001434 local plen=321435 local grp=ff0e::11436 local grp_dmac=33:33:00:00:00:011437 local valid_src=2001:db8:100::11438 local invalid_src=2001:db8:200::11439 1440 echo1441 echo "Data path: (*, G) EXCLUDE - IR - IPv6 overlay / IPv4 underlay"1442 echo "-------------------------------------------------------------"1443 1444 starg_exclude_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \1445 $grp_dmac $valid_src $invalid_src "mausezahn -6"1446}1447 1448starg_exclude_ir_ipv4_ipv6()1449{1450 local ns1=$ns1_v61451 local ns2=$ns2_v61452 local vtep1_ip=2001:db8:1000::11453 local vtep2_ip=2001:db8:2000::11454 local plen=1281455 local grp=239.1.1.11456 local grp_dmac=01:00:5e:01:01:011457 local valid_src=192.0.2.1291458 local invalid_src=192.0.2.1451459 1460 echo1461 echo "Data path: (*, G) EXCLUDE - IR - IPv4 overlay / IPv6 underlay"1462 echo "-------------------------------------------------------------"1463 1464 starg_exclude_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \1465 $grp_dmac $valid_src $invalid_src "mausezahn"1466}1467 1468starg_exclude_ir_ipv6_ipv6()1469{1470 local ns1=$ns1_v61471 local ns2=$ns2_v61472 local vtep1_ip=2001:db8:1000::11473 local vtep2_ip=2001:db8:2000::11474 local plen=1281475 local grp=ff0e::11476 local grp_dmac=33:33:00:00:00:011477 local valid_src=2001:db8:100::11478 local invalid_src=2001:db8:200::11479 1480 echo1481 echo "Data path: (*, G) EXCLUDE - IR - IPv6 overlay / IPv6 underlay"1482 echo "-------------------------------------------------------------"1483 1484 starg_exclude_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \1485 $grp_dmac $valid_src $invalid_src "mausezahn -6"1486}1487 1488starg_include_ir_common()1489{1490 local ns1=$1; shift1491 local ns2=$1; shift1492 local vtep1_ip=$1; shift1493 local vtep2_ip=$1; shift1494 local plen=$1; shift1495 local grp=$1; shift1496 local grp_dmac=$1; shift1497 local valid_src=$1; shift1498 local invalid_src=$1; shift1499 local mz=$1; shift1500 1501 # Install a (*, G) INCLUDE MDB entry with one source and two remote1502 # VTEPs. Make sure that the source in the source list is forwarded and1503 # that a source not in the list is not forwarded. Remove one of the1504 # VTEPs from the entry and make sure that packets are only forwarded to1505 # the remaining VTEP.1506 1507 run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"1508 run_cmd "ip -n $ns2 address replace $vtep1_ip/$plen dev lo"1509 run_cmd "ip -n $ns2 address replace $vtep2_ip/$plen dev lo"1510 1511 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $vtep1_ip action pass"1512 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 102 proto all flower enc_dst_ip $vtep2_ip action pass"1513 1514 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode include source_list $valid_src dst $vtep1_ip src_vni 10010"1515 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode include source_list $valid_src dst $vtep2_ip src_vni 10010"1516 1517 # Check that invalid source is not forwarded to any VTEP.1518 run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"1519 tc_check_packets "$ns2" "dev vx0 ingress" 101 01520 log_test $? 0 "Block excluded source - first VTEP"1521 tc_check_packets "$ns2" "dev vx0 ingress" 102 01522 log_test $? 0 "Block excluded source - second VTEP"1523 1524 # Check that valid source is forwarded to both VTEPs.1525 run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"1526 tc_check_packets "$ns2" "dev vx0 ingress" 101 11527 log_test $? 0 "Forward valid source - first VTEP"1528 tc_check_packets "$ns2" "dev vx0 ingress" 102 11529 log_test $? 0 "Forward valid source - second VTEP"1530 1531 # Remove second VTEP.1532 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep2_ip src_vni 10010"1533 1534 # Check that invalid source is not forwarded to any VTEP.1535 run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"1536 tc_check_packets "$ns2" "dev vx0 ingress" 101 11537 log_test $? 0 "Block excluded source after removal - first VTEP"1538 tc_check_packets "$ns2" "dev vx0 ingress" 102 11539 log_test $? 0 "Block excluded source after removal - second VTEP"1540 1541 # Check that valid source is forwarded to the remaining VTEP.1542 run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"1543 tc_check_packets "$ns2" "dev vx0 ingress" 101 21544 log_test $? 0 "Forward valid source after removal - first VTEP"1545 tc_check_packets "$ns2" "dev vx0 ingress" 102 11546 log_test $? 0 "Forward valid source after removal - second VTEP"1547}1548 1549starg_include_ir_ipv4_ipv4()1550{1551 local ns1=$ns1_v41552 local ns2=$ns2_v41553 local vtep1_ip=198.51.100.1001554 local vtep2_ip=198.51.100.2001555 local plen=321556 local grp=239.1.1.11557 local grp_dmac=01:00:5e:01:01:011558 local valid_src=192.0.2.1291559 local invalid_src=192.0.2.1451560 1561 echo1562 echo "Data path: (*, G) INCLUDE - IR - IPv4 overlay / IPv4 underlay"1563 echo "-------------------------------------------------------------"1564 1565 starg_include_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \1566 $grp_dmac $valid_src $invalid_src "mausezahn"1567}1568 1569starg_include_ir_ipv6_ipv4()1570{1571 local ns1=$ns1_v41572 local ns2=$ns2_v41573 local vtep1_ip=198.51.100.1001574 local vtep2_ip=198.51.100.2001575 local plen=321576 local grp=ff0e::11577 local grp_dmac=33:33:00:00:00:011578 local valid_src=2001:db8:100::11579 local invalid_src=2001:db8:200::11580 1581 echo1582 echo "Data path: (*, G) INCLUDE - IR - IPv6 overlay / IPv4 underlay"1583 echo "-------------------------------------------------------------"1584 1585 starg_include_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \1586 $grp_dmac $valid_src $invalid_src "mausezahn -6"1587}1588 1589starg_include_ir_ipv4_ipv6()1590{1591 local ns1=$ns1_v61592 local ns2=$ns2_v61593 local vtep1_ip=2001:db8:1000::11594 local vtep2_ip=2001:db8:2000::11595 local plen=1281596 local grp=239.1.1.11597 local grp_dmac=01:00:5e:01:01:011598 local valid_src=192.0.2.1291599 local invalid_src=192.0.2.1451600 1601 echo1602 echo "Data path: (*, G) INCLUDE - IR - IPv4 overlay / IPv6 underlay"1603 echo "-------------------------------------------------------------"1604 1605 starg_include_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \1606 $grp_dmac $valid_src $invalid_src "mausezahn"1607}1608 1609starg_include_ir_ipv6_ipv6()1610{1611 local ns1=$ns1_v61612 local ns2=$ns2_v61613 local vtep1_ip=2001:db8:1000::11614 local vtep2_ip=2001:db8:2000::11615 local plen=1281616 local grp=ff0e::11617 local grp_dmac=33:33:00:00:00:011618 local valid_src=2001:db8:100::11619 local invalid_src=2001:db8:200::11620 1621 echo1622 echo "Data path: (*, G) INCLUDE - IR - IPv6 overlay / IPv6 underlay"1623 echo "-------------------------------------------------------------"1624 1625 starg_include_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \1626 $grp_dmac $valid_src $invalid_src "mausezahn -6"1627}1628 1629starg_exclude_p2mp_common()1630{1631 local ns1=$1; shift1632 local ns2=$1; shift1633 local mcast_grp=$1; shift1634 local plen=$1; shift1635 local grp=$1; shift1636 local grp_dmac=$1; shift1637 local valid_src=$1; shift1638 local invalid_src=$1; shift1639 local mz=$1; shift1640 1641 # Install a (*, G) EXCLUDE MDB entry with one source and one multicast1642 # group to which packets are sent. Make sure that the source in the1643 # source list is not forwarded and that a source not in the list is1644 # forwarded.1645 1646 run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"1647 run_cmd "ip -n $ns2 address replace $mcast_grp/$plen dev veth0 autojoin"1648 1649 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $mcast_grp action pass"1650 1651 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $invalid_src dst $mcast_grp src_vni 10010 via veth0"1652 1653 # Check that invalid source is not forwarded.1654 run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"1655 tc_check_packets "$ns2" "dev vx0 ingress" 101 01656 log_test $? 0 "Block excluded source"1657 1658 # Check that valid source is forwarded.1659 run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"1660 tc_check_packets "$ns2" "dev vx0 ingress" 101 11661 log_test $? 0 "Forward valid source"1662 1663 # Remove the VTEP from the multicast group.1664 run_cmd "ip -n $ns2 address del $mcast_grp/$plen dev veth0"1665 1666 # Check that valid source is not received anymore.1667 run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"1668 tc_check_packets "$ns2" "dev vx0 ingress" 101 11669 log_test $? 0 "Receive of valid source after removal from group"1670}1671 1672starg_exclude_p2mp_ipv4_ipv4()1673{1674 local ns1=$ns1_v41675 local ns2=$ns2_v41676 local mcast_grp=238.1.1.11677 local plen=321678 local grp=239.1.1.11679 local grp_dmac=01:00:5e:01:01:011680 local valid_src=192.0.2.1291681 local invalid_src=192.0.2.1451682 1683 echo1684 echo "Data path: (*, G) EXCLUDE - P2MP - IPv4 overlay / IPv4 underlay"1685 echo "---------------------------------------------------------------"1686 1687 starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp $grp_dmac \1688 $valid_src $invalid_src "mausezahn"1689}1690 1691starg_exclude_p2mp_ipv6_ipv4()1692{1693 local ns1=$ns1_v41694 local ns2=$ns2_v41695 local mcast_grp=238.1.1.11696 local plen=321697 local grp=ff0e::11698 local grp_dmac=33:33:00:00:00:011699 local valid_src=2001:db8:100::11700 local invalid_src=2001:db8:200::11701 1702 echo1703 echo "Data path: (*, G) EXCLUDE - P2MP - IPv6 overlay / IPv4 underlay"1704 echo "---------------------------------------------------------------"1705 1706 starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp $grp_dmac \1707 $valid_src $invalid_src "mausezahn -6"1708}1709 1710starg_exclude_p2mp_ipv4_ipv6()1711{1712 local ns1=$ns1_v61713 local ns2=$ns2_v61714 local mcast_grp=ff0e::21715 local plen=1281716 local grp=239.1.1.11717 local grp_dmac=01:00:5e:01:01:011718 local valid_src=192.0.2.1291719 local invalid_src=192.0.2.1451720 1721 echo1722 echo "Data path: (*, G) EXCLUDE - P2MP - IPv4 overlay / IPv6 underlay"1723 echo "---------------------------------------------------------------"1724 1725 starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp $grp_dmac \1726 $valid_src $invalid_src "mausezahn"1727}1728 1729starg_exclude_p2mp_ipv6_ipv6()1730{1731 local ns1=$ns1_v61732 local ns2=$ns2_v61733 local mcast_grp=ff0e::21734 local plen=1281735 local grp=ff0e::11736 local grp_dmac=33:33:00:00:00:011737 local valid_src=2001:db8:100::11738 local invalid_src=2001:db8:200::11739 1740 echo1741 echo "Data path: (*, G) EXCLUDE - P2MP - IPv6 overlay / IPv6 underlay"1742 echo "---------------------------------------------------------------"1743 1744 starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp $grp_dmac \1745 $valid_src $invalid_src "mausezahn -6"1746}1747 1748starg_include_p2mp_common()1749{1750 local ns1=$1; shift1751 local ns2=$1; shift1752 local mcast_grp=$1; shift1753 local plen=$1; shift1754 local grp=$1; shift1755 local grp_dmac=$1; shift1756 local valid_src=$1; shift1757 local invalid_src=$1; shift1758 local mz=$1; shift1759 1760 # Install a (*, G) INCLUDE MDB entry with one source and one multicast1761 # group to which packets are sent. Make sure that the source in the1762 # source list is forwarded and that a source not in the list is not1763 # forwarded.1764 1765 run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"1766 run_cmd "ip -n $ns2 address replace $mcast_grp/$plen dev veth0 autojoin"1767 1768 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $mcast_grp action pass"1769 1770 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode include source_list $valid_src dst $mcast_grp src_vni 10010 via veth0"1771 1772 # Check that invalid source is not forwarded.1773 run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"1774 tc_check_packets "$ns2" "dev vx0 ingress" 101 01775 log_test $? 0 "Block excluded source"1776 1777 # Check that valid source is forwarded.1778 run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"1779 tc_check_packets "$ns2" "dev vx0 ingress" 101 11780 log_test $? 0 "Forward valid source"1781 1782 # Remove the VTEP from the multicast group.1783 run_cmd "ip -n $ns2 address del $mcast_grp/$plen dev veth0"1784 1785 # Check that valid source is not received anymore.1786 run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"1787 tc_check_packets "$ns2" "dev vx0 ingress" 101 11788 log_test $? 0 "Receive of valid source after removal from group"1789}1790 1791starg_include_p2mp_ipv4_ipv4()1792{1793 local ns1=$ns1_v41794 local ns2=$ns2_v41795 local mcast_grp=238.1.1.11796 local plen=321797 local grp=239.1.1.11798 local grp_dmac=01:00:5e:01:01:011799 local valid_src=192.0.2.1291800 local invalid_src=192.0.2.1451801 1802 echo1803 echo "Data path: (*, G) INCLUDE - P2MP - IPv4 overlay / IPv4 underlay"1804 echo "---------------------------------------------------------------"1805 1806 starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp $grp_dmac \1807 $valid_src $invalid_src "mausezahn"1808}1809 1810starg_include_p2mp_ipv6_ipv4()1811{1812 local ns1=$ns1_v41813 local ns2=$ns2_v41814 local mcast_grp=238.1.1.11815 local plen=321816 local grp=ff0e::11817 local grp_dmac=33:33:00:00:00:011818 local valid_src=2001:db8:100::11819 local invalid_src=2001:db8:200::11820 1821 echo1822 echo "Data path: (*, G) INCLUDE - P2MP - IPv6 overlay / IPv4 underlay"1823 echo "---------------------------------------------------------------"1824 1825 starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp $grp_dmac \1826 $valid_src $invalid_src "mausezahn -6"1827}1828 1829starg_include_p2mp_ipv4_ipv6()1830{1831 local ns1=$ns1_v61832 local ns2=$ns2_v61833 local mcast_grp=ff0e::21834 local plen=1281835 local grp=239.1.1.11836 local grp_dmac=01:00:5e:01:01:011837 local valid_src=192.0.2.1291838 local invalid_src=192.0.2.1451839 1840 echo1841 echo "Data path: (*, G) INCLUDE - P2MP - IPv4 overlay / IPv6 underlay"1842 echo "---------------------------------------------------------------"1843 1844 starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp $grp_dmac \1845 $valid_src $invalid_src "mausezahn"1846}1847 1848starg_include_p2mp_ipv6_ipv6()1849{1850 local ns1=$ns1_v61851 local ns2=$ns2_v61852 local mcast_grp=ff0e::21853 local plen=1281854 local grp=ff0e::11855 local grp_dmac=33:33:00:00:00:011856 local valid_src=2001:db8:100::11857 local invalid_src=2001:db8:200::11858 1859 echo1860 echo "Data path: (*, G) INCLUDE - P2MP - IPv6 overlay / IPv6 underlay"1861 echo "---------------------------------------------------------------"1862 1863 starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp $grp_dmac \1864 $valid_src $invalid_src "mausezahn -6"1865}1866 1867egress_vni_translation_common()1868{1869 local ns1=$1; shift1870 local ns2=$1; shift1871 local mcast_grp=$1; shift1872 local plen=$1; shift1873 local proto=$1; shift1874 local grp=$1; shift1875 local grp_dmac=$1; shift1876 local src=$1; shift1877 local mz=$1; shift1878 1879 # When P2MP tunnels are used with optimized inter-subnet multicast1880 # (OISM) [1], the ingress VTEP does not perform VNI translation and1881 # uses the VNI of the source broadcast domain (BD). If the egress VTEP1882 # is a member in the source BD, then no VNI translation is needed.1883 # Otherwise, the egress VTEP needs to translate the VNI to the1884 # supplementary broadcast domain (SBD) VNI, which is usually the L3VNI.1885 #1886 # In this test, remove the VTEP in the second namespace from VLAN 101887 # (VNI 10010) and make sure that a packet sent from this VLAN on the1888 # first VTEP is received by the SVI corresponding to the L3VNI (14000 /1889 # VLAN 4000) on the second VTEP.1890 #1891 # The second VTEP will be able to decapsulate the packet with VNI 100101892 # because this VNI is configured on its shared VXLAN device. Later,1893 # when ingressing the bridge, the VNI to VLAN lookup will fail because1894 # the VTEP is not a member in VLAN 10, which will cause the packet to1895 # be tagged with VLAN 4000 since it is configured as PVID.1896 #1897 # [1] https://datatracker.ietf.org/doc/html/draft-ietf-bess-evpn-irb-mcast1898 1899 run_cmd "tc -n $ns2 qdisc replace dev br0.4000 clsact"1900 run_cmd "ip -n $ns2 address replace $mcast_grp/$plen dev veth0 autojoin"1901 run_cmd "tc -n $ns2 filter replace dev br0.4000 ingress pref 1 handle 101 proto $proto flower src_ip $src dst_ip $grp action pass"1902 1903 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp src $src permanent dst $mcast_grp src_vni 10010 via veth0"1904 1905 # Remove the second VTEP from VLAN 10.1906 run_cmd "bridge -n $ns2 vlan del vid 10 dev vx0"1907 1908 # Make sure that packets sent from the first VTEP over VLAN 10 are1909 # received by the SVI corresponding to the L3VNI (14000 / VLAN 4000) on1910 # the second VTEP, since it is configured as PVID.1911 run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"1912 tc_check_packets "$ns2" "dev br0.4000 ingress" 101 11913 log_test $? 0 "Egress VNI translation - PVID configured"1914 1915 # Remove PVID flag from VLAN 4000 on the second VTEP and make sure1916 # packets are no longer received by the SVI interface.1917 run_cmd "bridge -n $ns2 vlan add vid 4000 dev vx0"1918 run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"1919 tc_check_packets "$ns2" "dev br0.4000 ingress" 101 11920 log_test $? 0 "Egress VNI translation - no PVID configured"1921 1922 # Reconfigure the PVID and make sure packets are received again.1923 run_cmd "bridge -n $ns2 vlan add vid 4000 dev vx0 pvid"1924 run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"1925 tc_check_packets "$ns2" "dev br0.4000 ingress" 101 21926 log_test $? 0 "Egress VNI translation - PVID reconfigured"1927}1928 1929egress_vni_translation_ipv4_ipv4()1930{1931 local ns1=$ns1_v41932 local ns2=$ns2_v41933 local mcast_grp=238.1.1.11934 local plen=321935 local proto="ipv4"1936 local grp=239.1.1.11937 local grp_dmac=01:00:5e:01:01:011938 local src=192.0.2.1291939 1940 echo1941 echo "Data path: Egress VNI translation - IPv4 overlay / IPv4 underlay"1942 echo "----------------------------------------------------------------"1943 1944 egress_vni_translation_common $ns1 $ns2 $mcast_grp $plen $proto $grp \1945 $grp_dmac $src "mausezahn"1946}1947 1948egress_vni_translation_ipv6_ipv4()1949{1950 local ns1=$ns1_v41951 local ns2=$ns2_v41952 local mcast_grp=238.1.1.11953 local plen=321954 local proto="ipv6"1955 local grp=ff0e::11956 local grp_dmac=33:33:00:00:00:011957 local src=2001:db8:100::11958 1959 echo1960 echo "Data path: Egress VNI translation - IPv6 overlay / IPv4 underlay"1961 echo "----------------------------------------------------------------"1962 1963 egress_vni_translation_common $ns1 $ns2 $mcast_grp $plen $proto $grp \1964 $grp_dmac $src "mausezahn -6"1965}1966 1967egress_vni_translation_ipv4_ipv6()1968{1969 local ns1=$ns1_v61970 local ns2=$ns2_v61971 local mcast_grp=ff0e::21972 local plen=1281973 local proto="ipv4"1974 local grp=239.1.1.11975 local grp_dmac=01:00:5e:01:01:011976 local src=192.0.2.1291977 1978 echo1979 echo "Data path: Egress VNI translation - IPv4 overlay / IPv6 underlay"1980 echo "----------------------------------------------------------------"1981 1982 egress_vni_translation_common $ns1 $ns2 $mcast_grp $plen $proto $grp \1983 $grp_dmac $src "mausezahn"1984}1985 1986egress_vni_translation_ipv6_ipv6()1987{1988 local ns1=$ns1_v61989 local ns2=$ns2_v61990 local mcast_grp=ff0e::21991 local plen=1281992 local proto="ipv6"1993 local grp=ff0e::11994 local grp_dmac=33:33:00:00:00:011995 local src=2001:db8:100::11996 1997 echo1998 echo "Data path: Egress VNI translation - IPv6 overlay / IPv6 underlay"1999 echo "----------------------------------------------------------------"2000 2001 egress_vni_translation_common $ns1 $ns2 $mcast_grp $plen $proto $grp \2002 $grp_dmac $src "mausezahn -6"2003}2004 2005all_zeros_mdb_common()2006{2007 local ns1=$1; shift2008 local ns2=$1; shift2009 local vtep1_ip=$1; shift2010 local vtep2_ip=$1; shift2011 local vtep3_ip=$1; shift2012 local vtep4_ip=$1; shift2013 local plen=$1; shift2014 local ipv4_grp=239.1.1.12015 local ipv4_grp_dmac=01:00:5e:01:01:012016 local ipv4_unreg_grp=239.2.2.22017 local ipv4_unreg_grp_dmac=01:00:5e:02:02:022018 local ipv4_ll_grp=224.0.0.1002019 local ipv4_ll_grp_dmac=01:00:5e:00:00:642020 local ipv4_src=192.0.2.1292021 local ipv6_grp=ff0e::12022 local ipv6_grp_dmac=33:33:00:00:00:012023 local ipv6_unreg_grp=ff0e::22024 local ipv6_unreg_grp_dmac=33:33:00:00:00:022025 local ipv6_ll_grp=ff02::12026 local ipv6_ll_grp_dmac=33:33:00:00:00:012027 local ipv6_src=2001:db8:100::12028 2029 # Install all-zeros (catchall) MDB entries for IPv4 and IPv6 traffic2030 # and make sure they only forward unregistered IP multicast traffic2031 # which is not link-local. Also make sure that each entry only forwards2032 # traffic from the matching address family.2033 2034 # Associate two different VTEPs with one all-zeros MDB entry: Two with2035 # the IPv4 entry (0.0.0.0) and another two with the IPv6 one (::).2036 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp 0.0.0.0 permanent dst $vtep1_ip src_vni 10010"2037 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp 0.0.0.0 permanent dst $vtep2_ip src_vni 10010"2038 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp :: permanent dst $vtep3_ip src_vni 10010"2039 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp :: permanent dst $vtep4_ip src_vni 10010"2040 2041 # Associate one VTEP from each set with a regular MDB entry: One with2042 # an IPv4 entry and another with an IPv6 one.2043 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $ipv4_grp permanent dst $vtep1_ip src_vni 10010"2044 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $ipv6_grp permanent dst $vtep3_ip src_vni 10010"2045 2046 # Add filters to match on decapsulated traffic in the second namespace.2047 run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"2048 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $vtep1_ip action pass"2049 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 102 proto all flower enc_dst_ip $vtep2_ip action pass"2050 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 103 proto all flower enc_dst_ip $vtep3_ip action pass"2051 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 104 proto all flower enc_dst_ip $vtep4_ip action pass"2052 2053 # Configure the VTEP addresses in the second namespace to enable2054 # decapsulation.2055 run_cmd "ip -n $ns2 address replace $vtep1_ip/$plen dev lo"2056 run_cmd "ip -n $ns2 address replace $vtep2_ip/$plen dev lo"2057 run_cmd "ip -n $ns2 address replace $vtep3_ip/$plen dev lo"2058 run_cmd "ip -n $ns2 address replace $vtep4_ip/$plen dev lo"2059 2060 # Send registered IPv4 multicast and make sure it only arrives to the2061 # first VTEP.2062 run_cmd "ip netns exec $ns1 mausezahn br0.10 -a own -b $ipv4_grp_dmac -A $ipv4_src -B $ipv4_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"2063 tc_check_packets "$ns2" "dev vx0 ingress" 101 12064 log_test $? 0 "Registered IPv4 multicast - first VTEP"2065 tc_check_packets "$ns2" "dev vx0 ingress" 102 02066 log_test $? 0 "Registered IPv4 multicast - second VTEP"2067 2068 # Send unregistered IPv4 multicast that is not link-local and make sure2069 # it arrives to the first and second VTEPs.2070 run_cmd "ip netns exec $ns1 mausezahn br0.10 -a own -b $ipv4_unreg_grp_dmac -A $ipv4_src -B $ipv4_unreg_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"2071 tc_check_packets "$ns2" "dev vx0 ingress" 101 22072 log_test $? 0 "Unregistered IPv4 multicast - first VTEP"2073 tc_check_packets "$ns2" "dev vx0 ingress" 102 12074 log_test $? 0 "Unregistered IPv4 multicast - second VTEP"2075 2076 # Send IPv4 link-local multicast traffic and make sure it does not2077 # arrive to any VTEP.2078 run_cmd "ip netns exec $ns1 mausezahn br0.10 -a own -b $ipv4_ll_grp_dmac -A $ipv4_src -B $ipv4_ll_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"2079 tc_check_packets "$ns2" "dev vx0 ingress" 101 22080 log_test $? 0 "Link-local IPv4 multicast - first VTEP"2081 tc_check_packets "$ns2" "dev vx0 ingress" 102 12082 log_test $? 0 "Link-local IPv4 multicast - second VTEP"2083 2084 # Send registered IPv4 multicast using a unicast MAC address and make2085 # sure it does not arrive to any VTEP.2086 run_cmd "ip netns exec $ns1 mausezahn br0.10 -a own -b 00:11:22:33:44:55 -A $ipv4_src -B $ipv4_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"2087 tc_check_packets "$ns2" "dev vx0 ingress" 101 22088 log_test $? 0 "Registered IPv4 multicast with a unicast MAC - first VTEP"2089 tc_check_packets "$ns2" "dev vx0 ingress" 102 12090 log_test $? 0 "Registered IPv4 multicast with a unicast MAC - second VTEP"2091 2092 # Send registered IPv4 multicast using a broadcast MAC address and make2093 # sure it does not arrive to any VTEP.2094 run_cmd "ip netns exec $ns1 mausezahn br0.10 -a own -b bcast -A $ipv4_src -B $ipv4_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"2095 tc_check_packets "$ns2" "dev vx0 ingress" 101 22096 log_test $? 0 "Registered IPv4 multicast with a broadcast MAC - first VTEP"2097 tc_check_packets "$ns2" "dev vx0 ingress" 102 12098 log_test $? 0 "Registered IPv4 multicast with a broadcast MAC - second VTEP"2099 2100 # Make sure IPv4 traffic did not reach the VTEPs associated with2101 # IPv6 entries.2102 tc_check_packets "$ns2" "dev vx0 ingress" 103 02103 log_test $? 0 "IPv4 traffic - third VTEP"2104 tc_check_packets "$ns2" "dev vx0 ingress" 104 02105 log_test $? 0 "IPv4 traffic - fourth VTEP"2106 2107 # Reset IPv4 filters before testing IPv6 traffic.2108 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $vtep1_ip action pass"2109 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 102 proto all flower enc_dst_ip $vtep2_ip action pass"2110 2111 # Send registered IPv6 multicast and make sure it only arrives to the2112 # third VTEP.2113 run_cmd "ip netns exec $ns1 mausezahn -6 br0.10 -a own -b $ipv6_grp_dmac -A $ipv6_src -B $ipv6_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"2114 tc_check_packets "$ns2" "dev vx0 ingress" 103 12115 log_test $? 0 "Registered IPv6 multicast - third VTEP"2116 tc_check_packets "$ns2" "dev vx0 ingress" 104 02117 log_test $? 0 "Registered IPv6 multicast - fourth VTEP"2118 2119 # Send unregistered IPv6 multicast that is not link-local and make sure2120 # it arrives to the third and fourth VTEPs.2121 run_cmd "ip netns exec $ns1 mausezahn -6 br0.10 -a own -b $ipv6_unreg_grp_dmac -A $ipv6_src -B $ipv6_unreg_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"2122 tc_check_packets "$ns2" "dev vx0 ingress" 103 22123 log_test $? 0 "Unregistered IPv6 multicast - third VTEP"2124 tc_check_packets "$ns2" "dev vx0 ingress" 104 12125 log_test $? 0 "Unregistered IPv6 multicast - fourth VTEP"2126 2127 # Send IPv6 link-local multicast traffic and make sure it does not2128 # arrive to any VTEP.2129 run_cmd "ip netns exec $ns1 mausezahn -6 br0.10 -a own -b $ipv6_ll_grp_dmac -A $ipv6_src -B $ipv6_ll_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"2130 tc_check_packets "$ns2" "dev vx0 ingress" 103 22131 log_test $? 0 "Link-local IPv6 multicast - third VTEP"2132 tc_check_packets "$ns2" "dev vx0 ingress" 104 12133 log_test $? 0 "Link-local IPv6 multicast - fourth VTEP"2134 2135 # Send registered IPv6 multicast using a unicast MAC address and make2136 # sure it does not arrive to any VTEP.2137 run_cmd "ip netns exec $ns1 mausezahn -6 br0.10 -a own -b 00:11:22:33:44:55 -A $ipv6_src -B $ipv6_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"2138 tc_check_packets "$ns2" "dev vx0 ingress" 103 22139 log_test $? 0 "Registered IPv6 multicast with a unicast MAC - third VTEP"2140 tc_check_packets "$ns2" "dev vx0 ingress" 104 12141 log_test $? 0 "Registered IPv6 multicast with a unicast MAC - fourth VTEP"2142 2143 # Send registered IPv6 multicast using a broadcast MAC address and make2144 # sure it does not arrive to any VTEP.2145 run_cmd "ip netns exec $ns1 mausezahn -6 br0.10 -a own -b bcast -A $ipv6_src -B $ipv6_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"2146 tc_check_packets "$ns2" "dev vx0 ingress" 103 22147 log_test $? 0 "Registered IPv6 multicast with a broadcast MAC - third VTEP"2148 tc_check_packets "$ns2" "dev vx0 ingress" 104 12149 log_test $? 0 "Registered IPv6 multicast with a broadcast MAC - fourth VTEP"2150 2151 # Make sure IPv6 traffic did not reach the VTEPs associated with2152 # IPv4 entries.2153 tc_check_packets "$ns2" "dev vx0 ingress" 101 02154 log_test $? 0 "IPv6 traffic - first VTEP"2155 tc_check_packets "$ns2" "dev vx0 ingress" 102 02156 log_test $? 0 "IPv6 traffic - second VTEP"2157}2158 2159all_zeros_mdb_ipv4()2160{2161 local ns1=$ns1_v42162 local ns2=$ns2_v42163 local vtep1_ip=198.51.100.1012164 local vtep2_ip=198.51.100.1022165 local vtep3_ip=198.51.100.1032166 local vtep4_ip=198.51.100.1042167 local plen=322168 2169 echo2170 echo "Data path: All-zeros MDB entry - IPv4 underlay"2171 echo "----------------------------------------------"2172 2173 all_zeros_mdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $vtep3_ip \2174 $vtep4_ip $plen2175}2176 2177all_zeros_mdb_ipv6()2178{2179 local ns1=$ns1_v62180 local ns2=$ns2_v62181 local vtep1_ip=2001:db8:1000::12182 local vtep2_ip=2001:db8:2000::12183 local vtep3_ip=2001:db8:3000::12184 local vtep4_ip=2001:db8:4000::12185 local plen=1282186 2187 echo2188 echo "Data path: All-zeros MDB entry - IPv6 underlay"2189 echo "----------------------------------------------"2190 2191 all_zeros_mdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $vtep3_ip \2192 $vtep4_ip $plen2193}2194 2195mdb_fdb_common()2196{2197 local ns1=$1; shift2198 local ns2=$1; shift2199 local vtep1_ip=$1; shift2200 local vtep2_ip=$1; shift2201 local plen=$1; shift2202 local proto=$1; shift2203 local grp=$1; shift2204 local grp_dmac=$1; shift2205 local src=$1; shift2206 local mz=$1; shift2207 2208 # Install an MDB entry and an FDB entry and make sure that the FDB2209 # entry only forwards traffic that was not forwarded by the MDB.2210 2211 # Associate the MDB entry with one VTEP and the FDB entry with another2212 # VTEP.2213 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip src_vni 10010"2214 run_cmd "bridge -n $ns1 fdb add 00:00:00:00:00:00 dev vx0 self static dst $vtep2_ip src_vni 10010"2215 2216 # Add filters to match on decapsulated traffic in the second namespace.2217 run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"2218 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto $proto flower ip_proto udp dst_port 54321 enc_dst_ip $vtep1_ip action pass"2219 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 102 proto $proto flower ip_proto udp dst_port 54321 enc_dst_ip $vtep2_ip action pass"2220 2221 # Configure the VTEP addresses in the second namespace to enable2222 # decapsulation.2223 run_cmd "ip -n $ns2 address replace $vtep1_ip/$plen dev lo"2224 run_cmd "ip -n $ns2 address replace $vtep2_ip/$plen dev lo"2225 2226 # Send IP multicast traffic and make sure it is forwarded by the MDB2227 # and only arrives to the first VTEP.2228 run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"2229 tc_check_packets "$ns2" "dev vx0 ingress" 101 12230 log_test $? 0 "IP multicast - first VTEP"2231 tc_check_packets "$ns2" "dev vx0 ingress" 102 02232 log_test $? 0 "IP multicast - second VTEP"2233 2234 # Send broadcast traffic and make sure it is forwarded by the FDB and2235 # only arrives to the second VTEP.2236 run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b bcast -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"2237 tc_check_packets "$ns2" "dev vx0 ingress" 101 12238 log_test $? 0 "Broadcast - first VTEP"2239 tc_check_packets "$ns2" "dev vx0 ingress" 102 12240 log_test $? 0 "Broadcast - second VTEP"2241 2242 # Remove the MDB entry and make sure that IP multicast is now forwarded2243 # by the FDB to the second VTEP.2244 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10010"2245 run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b $grp_dmac -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"2246 tc_check_packets "$ns2" "dev vx0 ingress" 101 12247 log_test $? 0 "IP multicast after removal - first VTEP"2248 tc_check_packets "$ns2" "dev vx0 ingress" 102 22249 log_test $? 0 "IP multicast after removal - second VTEP"2250}2251 2252mdb_fdb_ipv4_ipv4()2253{2254 local ns1=$ns1_v42255 local ns2=$ns2_v42256 local vtep1_ip=198.51.100.1002257 local vtep2_ip=198.51.100.2002258 local plen=322259 local proto="ipv4"2260 local grp=239.1.1.12261 local grp_dmac=01:00:5e:01:01:012262 local src=192.0.2.1292263 2264 echo2265 echo "Data path: MDB with FDB - IPv4 overlay / IPv4 underlay"2266 echo "------------------------------------------------------"2267 2268 mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp \2269 $grp_dmac $src "mausezahn"2270}2271 2272mdb_fdb_ipv6_ipv4()2273{2274 local ns1=$ns1_v42275 local ns2=$ns2_v42276 local vtep1_ip=198.51.100.1002277 local vtep2_ip=198.51.100.2002278 local plen=322279 local proto="ipv6"2280 local grp=ff0e::12281 local grp_dmac=33:33:00:00:00:012282 local src=2001:db8:100::12283 2284 echo2285 echo "Data path: MDB with FDB - IPv6 overlay / IPv4 underlay"2286 echo "------------------------------------------------------"2287 2288 mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp \2289 $grp_dmac $src "mausezahn -6"2290}2291 2292mdb_fdb_ipv4_ipv6()2293{2294 local ns1=$ns1_v62295 local ns2=$ns2_v62296 local vtep1_ip=2001:db8:1000::12297 local vtep2_ip=2001:db8:2000::12298 local plen=1282299 local proto="ipv4"2300 local grp=239.1.1.12301 local grp_dmac=01:00:5e:01:01:012302 local src=192.0.2.1292303 2304 echo2305 echo "Data path: MDB with FDB - IPv4 overlay / IPv6 underlay"2306 echo "------------------------------------------------------"2307 2308 mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp \2309 $grp_dmac $src "mausezahn"2310}2311 2312mdb_fdb_ipv6_ipv6()2313{2314 local ns1=$ns1_v62315 local ns2=$ns2_v62316 local vtep1_ip=2001:db8:1000::12317 local vtep2_ip=2001:db8:2000::12318 local plen=1282319 local proto="ipv6"2320 local grp=ff0e::12321 local grp_dmac=33:33:00:00:00:012322 local src=2001:db8:100::12323 2324 echo2325 echo "Data path: MDB with FDB - IPv6 overlay / IPv6 underlay"2326 echo "------------------------------------------------------"2327 2328 mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp \2329 $grp_dmac $src "mausezahn -6"2330}2331 2332mdb_grp1_loop()2333{2334 local ns1=$1; shift2335 local vtep1_ip=$1; shift2336 local grp1=$1; shift2337 2338 while true; do2339 bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp1 dst $vtep1_ip src_vni 100102340 bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp1 permanent dst $vtep1_ip src_vni 100102341 done >/dev/null 2>&12342}2343 2344mdb_grp2_loop()2345{2346 local ns1=$1; shift2347 local vtep1_ip=$1; shift2348 local vtep2_ip=$1; shift2349 local grp2=$1; shift2350 2351 while true; do2352 bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp2 dst $vtep1_ip src_vni 100102353 bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp2 permanent dst $vtep1_ip src_vni 100102354 bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp2 permanent dst $vtep2_ip src_vni 100102355 done >/dev/null 2>&12356}2357 2358mdb_torture_common()2359{2360 local ns1=$1; shift2361 local vtep1_ip=$1; shift2362 local vtep2_ip=$1; shift2363 local grp1=$1; shift2364 local grp1_dmac=$1; shift2365 local grp2=$1; shift2366 local grp2_dmac=$1; shift2367 local src=$1; shift2368 local mz=$1; shift2369 local pid12370 local pid22371 local pid32372 local pid42373 2374 # Continuously send two streams that are forwarded by two different MDB2375 # entries. The first entry will be added and deleted in a loop. This2376 # allows us to test that the data path does not use freed MDB entry2377 # memory. The second entry will have two remotes, one that is added and2378 # deleted in a loop and another that is replaced in a loop. This allows2379 # us to test that the data path does not use freed remote entry memory.2380 # The test is considered successful if nothing crashed.2381 2382 # Create the MDB entries that will be continuously deleted / replaced.2383 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp1 permanent dst $vtep1_ip src_vni 10010"2384 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp2 permanent dst $vtep1_ip src_vni 10010"2385 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp2 permanent dst $vtep2_ip src_vni 10010"2386 2387 mdb_grp1_loop $ns1 $vtep1_ip $grp1 &2388 pid1=$!2389 mdb_grp2_loop $ns1 $vtep1_ip $vtep2_ip $grp2 &2390 pid2=$!2391 ip netns exec $ns1 $mz br0.10 -a own -b $grp1_dmac -A $src -B $grp1 -t udp sp=12345,dp=54321 -p 100 -c 0 -q &2392 pid3=$!2393 ip netns exec $ns1 $mz br0.10 -a own -b $grp2_dmac -A $src -B $grp2 -t udp sp=12345,dp=54321 -p 100 -c 0 -q &2394 pid4=$!2395 2396 sleep 302397 kill -9 $pid1 $pid2 $pid3 $pid42398 wait $pid1 $pid2 $pid3 $pid4 2>/dev/null2399 2400 log_test 0 0 "Torture test"2401}2402 2403mdb_torture_ipv4_ipv4()2404{2405 local ns1=$ns1_v42406 local vtep1_ip=198.51.100.1002407 local vtep2_ip=198.51.100.2002408 local grp1=239.1.1.12409 local grp1_dmac=01:00:5e:01:01:012410 local grp2=239.2.2.22411 local grp2_dmac=01:00:5e:02:02:022412 local src=192.0.2.1292413 2414 echo2415 echo "Data path: MDB torture test - IPv4 overlay / IPv4 underlay"2416 echo "----------------------------------------------------------"2417 2418 mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp1_dmac $grp2 \2419 $grp2_dmac $src "mausezahn"2420}2421 2422mdb_torture_ipv6_ipv4()2423{2424 local ns1=$ns1_v42425 local vtep1_ip=198.51.100.1002426 local vtep2_ip=198.51.100.2002427 local grp1=ff0e::12428 local grp1_dmac=33:33:00:00:00:012429 local grp2=ff0e::22430 local grp2_dmac=33:33:00:00:00:022431 local src=2001:db8:100::12432 2433 echo2434 echo "Data path: MDB torture test - IPv6 overlay / IPv4 underlay"2435 echo "----------------------------------------------------------"2436 2437 mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp1_dmac $grp2 \2438 $grp2_dmac $src "mausezahn -6"2439}2440 2441mdb_torture_ipv4_ipv6()2442{2443 local ns1=$ns1_v62444 local vtep1_ip=2001:db8:1000::12445 local vtep2_ip=2001:db8:2000::12446 local grp1=239.1.1.12447 local grp1_dmac=01:00:5e:01:01:012448 local grp2=239.2.2.22449 local grp2_dmac=01:00:5e:02:02:022450 local src=192.0.2.1292451 2452 echo2453 echo "Data path: MDB torture test - IPv4 overlay / IPv6 underlay"2454 echo "----------------------------------------------------------"2455 2456 mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp1_dmac $grp2 \2457 $grp2_dmac $src "mausezahn"2458}2459 2460mdb_torture_ipv6_ipv6()2461{2462 local ns1=$ns1_v62463 local vtep1_ip=2001:db8:1000::12464 local vtep2_ip=2001:db8:2000::12465 local grp1=ff0e::12466 local grp1_dmac=33:33:00:00:00:012467 local grp2=ff0e::22468 local grp2_dmac=33:33:00:00:00:022469 local src=2001:db8:100::12470 2471 echo2472 echo "Data path: MDB torture test - IPv6 overlay / IPv6 underlay"2473 echo "----------------------------------------------------------"2474 2475 mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp1_dmac $grp2 \2476 $grp2_dmac $src "mausezahn -6"2477}2478 2479################################################################################2480# Usage2481 2482usage()2483{2484 cat <<EOF2485usage: ${0##*/} OPTS2486 2487 -t <test> Test(s) to run (default: all)2488 (options: $TESTS)2489 -c Control path tests only2490 -d Data path tests only2491 -p Pause on fail2492 -P Pause after each test before cleanup2493 -v Verbose mode (show commands and output)2494EOF2495}2496 2497################################################################################2498# Main2499 2500trap cleanup EXIT2501 2502while getopts ":t:cdpPvh" opt; do2503 case $opt in2504 t) TESTS=$OPTARG;;2505 c) TESTS=${CONTROL_PATH_TESTS};;2506 d) TESTS=${DATA_PATH_TESTS};;2507 p) PAUSE_ON_FAIL=yes;;2508 P) PAUSE=yes;;2509 v) VERBOSE=$(($VERBOSE + 1));;2510 h) usage; exit 0;;2511 *) usage; exit 1;;2512 esac2513done2514 2515# Make sure we don't pause twice.2516[ "${PAUSE}" = "yes" ] && PAUSE_ON_FAIL=no2517 2518if [ "$(id -u)" -ne 0 ];then2519 echo "SKIP: Need root privileges"2520 exit $ksft_skip;2521fi2522 2523if [ ! -x "$(command -v ip)" ]; then2524 echo "SKIP: Could not run test without ip tool"2525 exit $ksft_skip2526fi2527 2528if [ ! -x "$(command -v bridge)" ]; then2529 echo "SKIP: Could not run test without bridge tool"2530 exit $ksft_skip2531fi2532 2533if [ ! -x "$(command -v mausezahn)" ]; then2534 echo "SKIP: Could not run test without mausezahn tool"2535 exit $ksft_skip2536fi2537 2538if [ ! -x "$(command -v jq)" ]; then2539 echo "SKIP: Could not run test without jq tool"2540 exit $ksft_skip2541fi2542 2543bridge mdb help 2>&1 | grep -q "flush"2544if [ $? -ne 0 ]; then2545 echo "SKIP: iproute2 bridge too old, missing VXLAN MDB flush support"2546 exit $ksft_skip2547fi2548 2549# Start clean.2550cleanup2551 2552for t in $TESTS2553do2554 setup; $t; cleanup;2555done2556 2557if [ "$TESTS" != "none" ]; then2558 printf "\nTests passed: %3d\n" ${nsuccess}2559 printf "Tests failed: %3d\n" ${nfail}2560fi2561 2562exit $ret2563