2 # SPDX-License-Identifier: GPL-2.0
4 # This test is for checking VXLAN MDB functionality. The topology consists of
5 # two sets of namespaces: One for the testing of IPv4 underlay and another for
6 # IPv6. In both cases, both IPv4 and IPv6 overlay traffic are tested.
8 # Data path functionality is tested by sending traffic from one of the upper
9 # namespaces and checking using ingress tc filters that the expected traffic
10 # was received by one of the lower namespaces.
12 # +------------------------------------+ +------------------------------------+
13 # | ns1_v4 | | ns1_v6 |
15 # | br0.10 br0.4000 br0.20 | | br0.10 br0.4000 br0.20 |
19 # | +---------+---------+ | | +---------+---------+ |
33 # +-----------------|------------------+ +-----------------|------------------+
35 # +-----------------|------------------+ +-----------------|------------------+
49 # | +---------+---------+ | | +---------+---------+ |
53 # | br0.10 br0.4000 br0.10 | | br0.10 br0.4000 br0.20 |
55 # | ns2_v4 | | ns2_v6 |
56 # +------------------------------------+ +------------------------------------+
59 # Kselftest framework requirement - SKIP code is 4.
63 basic_star_g_ipv4_ipv4
64 basic_star_g_ipv6_ipv4
65 basic_star_g_ipv4_ipv6
66 basic_star_g_ipv6_ipv6
86 encap_params_ipv4_ipv4
87 encap_params_ipv6_ipv4
88 encap_params_ipv4_ipv6
89 encap_params_ipv6_ipv6
90 starg_exclude_ir_ipv4_ipv4
91 starg_exclude_ir_ipv6_ipv4
92 starg_exclude_ir_ipv4_ipv6
93 starg_exclude_ir_ipv6_ipv6
94 starg_include_ir_ipv4_ipv4
95 starg_include_ir_ipv6_ipv4
96 starg_include_ir_ipv4_ipv6
97 starg_include_ir_ipv6_ipv6
98 starg_exclude_p2mp_ipv4_ipv4
99 starg_exclude_p2mp_ipv6_ipv4
100 starg_exclude_p2mp_ipv4_ipv6
101 starg_exclude_p2mp_ipv6_ipv6
102 starg_include_p2mp_ipv4_ipv4
103 starg_include_p2mp_ipv6_ipv4
104 starg_include_p2mp_ipv4_ipv6
105 starg_include_p2mp_ipv6_ipv6
106 egress_vni_translation_ipv4_ipv4
107 egress_vni_translation_ipv6_ipv4
108 egress_vni_translation_ipv4_ipv6
109 egress_vni_translation_ipv6_ipv6
116 mdb_torture_ipv4_ipv4
117 mdb_torture_ipv6_ipv4
118 mdb_torture_ipv4_ipv6
119 mdb_torture_ipv6_ipv6
122 # All tests in this script. Can be overridden with -t option.
131 ################################################################################
140 if [ ${rc} -eq ${expected} ]; then
141 printf "TEST: %-60s [ OK ]\n" "${msg}"
142 nsuccess=$((nsuccess+1))
146 printf "TEST: %-60s [FAIL]\n" "${msg}"
147 if [ "$VERBOSE" = "1" ]; then
148 echo " rc=$rc, expected $expected"
151 if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
153 echo "hit enter to continue, 'q' to quit"
155 [ "$a" = "q" ] && exit 1
159 if [ "${PAUSE}" = "yes" ]; then
161 echo "hit enter to continue, 'q' to quit"
163 [ "$a" = "q" ] && exit 1
166 [ "$VERBOSE" = "1" ] && echo
173 local stderr="2>/dev/null"
175 if [ "$VERBOSE" = "1" ]; then
176 printf "COMMAND: $cmd\n"
180 out=$(eval $cmd $stderr)
182 if [ "$VERBOSE" = "1" -a -n "$out" ]; then
193 local handle=$1; shift
194 local count=$1; shift
198 pkts=$(tc -n $ns -j -s filter show $id \
199 | jq ".[] | select(.options.handle == $handle) | \
200 .options.actions[0].stats.packets")
201 [[ $pkts == $count ]]
204 ################################################################################
210 local local_addr=$1; shift
212 ip netns exec $ns sysctl -qw net.ipv4.ip_forward=1
213 ip netns exec $ns sysctl -qw net.ipv4.fib_multipath_use_neigh=1
214 ip netns exec $ns sysctl -qw net.ipv4.conf.default.ignore_routes_with_linkdown=1
215 ip netns exec $ns sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1
216 ip netns exec $ns sysctl -qw net.ipv6.conf.all.forwarding=1
217 ip netns exec $ns sysctl -qw net.ipv6.conf.default.forwarding=1
218 ip netns exec $ns sysctl -qw net.ipv6.conf.default.ignore_routes_with_linkdown=1
219 ip netns exec $ns sysctl -qw net.ipv6.conf.all.accept_dad=0
220 ip netns exec $ns sysctl -qw net.ipv6.conf.default.accept_dad=0
222 ip -n $ns link set dev lo up
223 ip -n $ns address add $local_addr dev lo
225 ip -n $ns link set dev veth0 up
227 ip -n $ns link add name br0 up type bridge vlan_filtering 1 \
228 vlan_default_pvid 0 mcast_snooping 0
230 ip -n $ns link add link br0 name br0.10 up type vlan id 10
231 bridge -n $ns vlan add vid 10 dev br0 self
233 ip -n $ns link add link br0 name br0.20 up type vlan id 20
234 bridge -n $ns vlan add vid 20 dev br0 self
236 ip -n $ns link add link br0 name br0.4000 up type vlan id 4000
237 bridge -n $ns vlan add vid 4000 dev br0 self
239 ip -n $ns link add name vx0 up master br0 type vxlan \
240 local $local_addr dstport 4789 external vnifilter
241 bridge -n $ns link set dev vx0 vlan_tunnel on
243 bridge -n $ns vlan add vid 10 dev vx0
244 bridge -n $ns vlan add vid 10 dev vx0 tunnel_info id 10010
245 bridge -n $ns vni add vni 10010 dev vx0
247 bridge -n $ns vlan add vid 20 dev vx0
248 bridge -n $ns vlan add vid 20 dev vx0 tunnel_info id 10020
249 bridge -n $ns vni add vni 10020 dev vx0
251 bridge -n $ns vlan add vid 4000 dev vx0 pvid
252 bridge -n $ns vlan add vid 4000 dev vx0 tunnel_info id 14000
253 bridge -n $ns vni add vni 14000 dev vx0
260 local local_addr1=$1; shift
261 local local_addr2=$1; shift
266 ip link add name veth0 type veth peer name veth1
267 ip link set dev veth0 netns $ns1 name veth0
268 ip link set dev veth1 netns $ns2 name veth0
270 setup_common_ns $ns1 $local_addr1
271 setup_common_ns $ns2 $local_addr2
276 setup_common ns1_v4 ns2_v4 192.0.2.1 192.0.2.2
278 ip -n ns1_v4 address add 192.0.2.17/28 dev veth0
279 ip -n ns2_v4 address add 192.0.2.18/28 dev veth0
281 ip -n ns1_v4 route add default via 192.0.2.18
282 ip -n ns2_v4 route add default via 192.0.2.17
293 setup_common ns1_v6 ns2_v6 2001:db8:1::1 2001:db8:1::2
295 ip -n ns1_v6 address add 2001:db8:2::1/64 dev veth0 nodad
296 ip -n ns2_v6 address add 2001:db8:2::2/64 dev veth0 nodad
298 ip -n ns1_v6 route add default via 2001:db8:2::2
299 ip -n ns2_v6 route add default via 2001:db8:2::1
322 cleanup_v6 &> /dev/null
323 cleanup_v4 &> /dev/null
326 ################################################################################
327 # Tests - Control path
332 local grp_key=$1; shift
333 local vtep_ip=$1; shift
335 # Test basic control path operations common to all MDB entry types.
337 # Basic add, replace and delete behavior.
338 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"
339 log_test $? 0 "MDB entry addition"
340 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep \"$grp_key\""
341 log_test $? 0 "MDB entry presence after addition"
343 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"
344 log_test $? 0 "MDB entry replacement"
345 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep \"$grp_key\""
346 log_test $? 0 "MDB entry presence after replacement"
348 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
349 log_test $? 0 "MDB entry deletion"
350 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep \"$grp_key\""
351 log_test $? 1 "MDB entry presence after deletion"
353 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
354 log_test $? 255 "Non-existent MDB entry deletion"
356 # Default protocol and replacement.
357 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"
358 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep \"$grp_key\" | grep \"proto static\""
359 log_test $? 0 "MDB entry default protocol"
361 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 $grp_key permanent proto 123 dst $vtep_ip src_vni 10010"
362 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep \"$grp_key\" | grep \"proto 123\""
363 log_test $? 0 "MDB entry protocol replacement"
365 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
367 # Default destination port and replacement.
368 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"
369 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep \"$grp_key\" | grep \" dst_port \""
370 log_test $? 1 "MDB entry default destination port"
372 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 $grp_key permanent dst $vtep_ip dst_port 1234 src_vni 10010"
373 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep \"$grp_key\" | grep \"dst_port 1234\""
374 log_test $? 0 "MDB entry destination port replacement"
376 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
378 # Default destination VNI and replacement.
379 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"
380 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep \"$grp_key\" | grep \" vni \""
381 log_test $? 1 "MDB entry default destination VNI"
383 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 $grp_key permanent dst $vtep_ip vni 1234 src_vni 10010"
384 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep \"$grp_key\" | grep \"vni 1234\""
385 log_test $? 0 "MDB entry destination VNI replacement"
387 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
389 # Default outgoing interface and replacement.
390 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"
391 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep \"$grp_key\" | grep \" via \""
392 log_test $? 1 "MDB entry default outgoing interface"
394 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010 via veth0"
395 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep \"$grp_key\" | grep \"via veth0\""
396 log_test $? 0 "MDB entry outgoing interface replacement"
398 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
400 # Common error cases.
401 run_cmd "bridge -n $ns1 mdb add dev vx0 port veth0 $grp_key permanent dst $vtep_ip src_vni 10010"
402 log_test $? 255 "MDB entry with mismatch between device and port"
404 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key temp dst $vtep_ip src_vni 10010"
405 log_test $? 255 "MDB entry with temp state"
407 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent vid 10 dst $vtep_ip src_vni 10010"
408 log_test $? 255 "MDB entry with VLAN"
410 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"
411 log_test $? 255 "MDB entry MAC address"
413 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent"
414 log_test $? 255 "MDB entry without extended parameters"
416 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent proto 3 dst $vtep_ip src_vni 10010"
417 log_test $? 255 "MDB entry with an invalid protocol"
419 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip vni $((2 ** 24)) src_vni 10010"
420 log_test $? 255 "MDB entry with an invalid destination VNI"
422 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni $((2 ** 24))"
423 log_test $? 255 "MDB entry with an invalid source VNI"
425 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent src_vni 10010"
426 log_test $? 255 "MDB entry without a remote destination IP"
428 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"
429 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"
430 log_test $? 255 "Duplicate MDB entries"
431 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
434 basic_star_g_ipv4_ipv4()
437 local grp_key="grp 239.1.1.1"
438 local vtep_ip=198.51.100.100
441 echo "Control path: Basic (*, G) operations - IPv4 overlay / IPv4 underlay"
442 echo "--------------------------------------------------------------------"
444 basic_common $ns1 "$grp_key" $vtep_ip
447 basic_star_g_ipv6_ipv4()
450 local grp_key="grp ff0e::1"
451 local vtep_ip=198.51.100.100
454 echo "Control path: Basic (*, G) operations - IPv6 overlay / IPv4 underlay"
455 echo "--------------------------------------------------------------------"
457 basic_common $ns1 "$grp_key" $vtep_ip
460 basic_star_g_ipv4_ipv6()
463 local grp_key="grp 239.1.1.1"
464 local vtep_ip=2001:db8:1000::1
467 echo "Control path: Basic (*, G) operations - IPv4 overlay / IPv6 underlay"
468 echo "--------------------------------------------------------------------"
470 basic_common $ns1 "$grp_key" $vtep_ip
473 basic_star_g_ipv6_ipv6()
476 local grp_key="grp ff0e::1"
477 local vtep_ip=2001:db8:1000::1
480 echo "Control path: Basic (*, G) operations - IPv6 overlay / IPv6 underlay"
481 echo "--------------------------------------------------------------------"
483 basic_common $ns1 "$grp_key" $vtep_ip
489 local grp_key="grp 239.1.1.1 src 192.0.2.129"
490 local vtep_ip=198.51.100.100
493 echo "Control path: Basic (S, G) operations - IPv4 overlay / IPv4 underlay"
494 echo "--------------------------------------------------------------------"
496 basic_common $ns1 "$grp_key" $vtep_ip
502 local grp_key="grp ff0e::1 src 2001:db8:100::1"
503 local vtep_ip=198.51.100.100
506 echo "Control path: Basic (S, G) operations - IPv6 overlay / IPv4 underlay"
507 echo "---------------------------------------------------------------------"
509 basic_common $ns1 "$grp_key" $vtep_ip
515 local grp_key="grp 239.1.1.1 src 192.0.2.129"
516 local vtep_ip=2001:db8:1000::1
519 echo "Control path: Basic (S, G) operations - IPv4 overlay / IPv6 underlay"
520 echo "--------------------------------------------------------------------"
522 basic_common $ns1 "$grp_key" $vtep_ip
528 local grp_key="grp ff0e::1 src 2001:db8:100::1"
529 local vtep_ip=2001:db8:1000::1
532 echo "Control path: Basic (S, G) operations - IPv6 overlay / IPv6 underlay"
533 echo "--------------------------------------------------------------------"
535 basic_common $ns1 "$grp_key" $vtep_ip
545 local vtep_ip=$1; shift
546 local all_zeros_grp=$1; shift
548 # Test control path operations specific to (*, G) entries.
550 # Basic add, replace and delete behavior.
551 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"
552 log_test $? 0 "(*, G) MDB entry addition with source list"
553 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep -v \" src \""
554 log_test $? 0 "(*, G) MDB entry presence after addition"
555 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep \"src $src1\""
556 log_test $? 0 "(S, G) MDB entry presence after addition"
558 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"
559 log_test $? 0 "(*, G) MDB entry replacement with source list"
560 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep -v \" src \""
561 log_test $? 0 "(*, G) MDB entry presence after replacement"
562 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep \"src $src1\""
563 log_test $? 0 "(S, G) MDB entry presence after replacement"
565 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
566 log_test $? 0 "(*, G) MDB entry deletion"
567 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep -v \" src \""
568 log_test $? 1 "(*, G) MDB entry presence after deletion"
569 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep \"src $src1\""
570 log_test $? 1 "(S, G) MDB entry presence after deletion"
572 # Default filter mode and replacement.
573 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent dst $vtep_ip src_vni 10010"
574 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep exclude"
575 log_test $? 0 "(*, G) MDB entry default filter mode"
577 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"
578 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep include"
579 log_test $? 0 "(*, G) MDB entry after replacing filter mode to \"include\""
580 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep \"src $src1\""
581 log_test $? 0 "(S, G) MDB entry after replacing filter mode to \"include\""
582 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep \"src $src1\" | grep blocked"
583 log_test $? 1 "\"blocked\" flag after replacing filter mode to \"include\""
585 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"
586 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep exclude"
587 log_test $? 0 "(*, G) MDB entry after replacing filter mode to \"exclude\""
588 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep \"src $src1\""
589 log_test $? 0 "(S, G) MDB entry after replacing filter mode to \"exclude\""
590 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep \"src $src1\" | grep blocked"
591 log_test $? 0 "\"blocked\" flag after replacing filter mode to \"exclude\""
593 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
595 # Default source list and replacement.
596 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent dst $vtep_ip src_vni 10010"
597 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep source_list"
598 log_test $? 1 "(*, G) MDB entry default source list"
600 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"
601 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep \"src $src1\""
602 log_test $? 0 "(S, G) MDB entry of 1st source after replacing source list"
603 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep \"src $src2\""
604 log_test $? 0 "(S, G) MDB entry of 2nd source after replacing source list"
605 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep \"src $src3\""
606 log_test $? 0 "(S, G) MDB entry of 3rd source after replacing source list"
608 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"
609 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep \"src $src1\""
610 log_test $? 0 "(S, G) MDB entry of 1st source after removing source"
611 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep \"src $src2\""
612 log_test $? 1 "(S, G) MDB entry of 2nd source after removing source"
613 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep \"src $src3\""
614 log_test $? 0 "(S, G) MDB entry of 3rd source after removing source"
616 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
618 # Default protocol and replacement.
619 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"
620 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep -v \" src \" | grep \"proto static\""
621 log_test $? 0 "(*, G) MDB entry default protocol"
622 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep \" src \" | grep \"proto static\""
623 log_test $? 0 "(S, G) MDB entry default protocol"
625 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"
626 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep -v \" src \" | grep \"proto bgp\""
627 log_test $? 0 "(*, G) MDB entry protocol after replacement"
628 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep \" src \" | grep \"proto bgp\""
629 log_test $? 0 "(S, G) MDB entry protocol after replacement"
631 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
633 # Default destination port and replacement.
634 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"
635 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep -v \" src \" | grep \" dst_port \""
636 log_test $? 1 "(*, G) MDB entry default destination port"
637 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep \" src \" | grep \" dst_port \""
638 log_test $? 1 "(S, G) MDB entry default destination port"
640 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"
641 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep -v \" src \" | grep \" dst_port 1234 \""
642 log_test $? 0 "(*, G) MDB entry destination port after replacement"
643 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep \" src \" | grep \" dst_port 1234 \""
644 log_test $? 0 "(S, G) MDB entry destination port after replacement"
646 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
648 # Default destination VNI and replacement.
649 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"
650 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep -v \" src \" | grep \" vni \""
651 log_test $? 1 "(*, G) MDB entry default destination VNI"
652 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep \" src \" | grep \" vni \""
653 log_test $? 1 "(S, G) MDB entry default destination VNI"
655 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"
656 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep -v \" src \" | grep \" vni 1234 \""
657 log_test $? 0 "(*, G) MDB entry destination VNI after replacement"
658 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep \" src \" | grep \" vni 1234 \""
659 log_test $? 0 "(S, G) MDB entry destination VNI after replacement"
661 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
663 # Default outgoing interface and replacement.
664 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"
665 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep -v \" src \" | grep \" via \""
666 log_test $? 1 "(*, G) MDB entry default outgoing interface"
667 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep \" src \" | grep \" via \""
668 log_test $? 1 "(S, G) MDB entry default outgoing interface"
670 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"
671 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep -v \" src \" | grep \" via veth0 \""
672 log_test $? 0 "(*, G) MDB entry outgoing interface after replacement"
673 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep \" src \" | grep \" via veth0 \""
674 log_test $? 0 "(S, G) MDB entry outgoing interface after replacement"
676 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
679 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"
680 log_test $? 255 "All-zeros group with filter mode"
682 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"
683 log_test $? 255 "All-zeros group with source list"
685 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent filter_mode include dst $vtep_ip src_vni 10010"
686 log_test $? 255 "(*, G) INCLUDE with an empty source list"
688 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"
689 log_test $? 255 "Invalid source in source list"
691 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent source_list $src1 dst $vtep_ip src_vni 10010"
692 log_test $? 255 "Source list without filter mode"
699 local src1=192.0.2.129
700 local src2=192.0.2.130
701 local src3=192.0.2.131
702 local vtep_ip=198.51.100.100
703 local all_zeros_grp=0.0.0.0
706 echo "Control path: (*, G) operations - IPv4 overlay / IPv4 underlay"
707 echo "--------------------------------------------------------------"
709 star_g_common $ns1 $grp $src1 $src2 $src3 $vtep_ip $all_zeros_grp
716 local src1=2001:db8:100::1
717 local src2=2001:db8:100::2
718 local src3=2001:db8:100::3
719 local vtep_ip=198.51.100.100
720 local all_zeros_grp=::
723 echo "Control path: (*, G) operations - IPv6 overlay / IPv4 underlay"
724 echo "--------------------------------------------------------------"
726 star_g_common $ns1 $grp $src1 $src2 $src3 $vtep_ip $all_zeros_grp
733 local src1=192.0.2.129
734 local src2=192.0.2.130
735 local src3=192.0.2.131
736 local vtep_ip=2001:db8:1000::1
737 local all_zeros_grp=0.0.0.0
740 echo "Control path: (*, G) operations - IPv4 overlay / IPv6 underlay"
741 echo "--------------------------------------------------------------"
743 star_g_common $ns1 $grp $src1 $src2 $src3 $vtep_ip $all_zeros_grp
750 local src1=2001:db8:100::1
751 local src2=2001:db8:100::2
752 local src3=2001:db8:100::3
753 local vtep_ip=2001:db8:1000::1
754 local all_zeros_grp=::
757 echo "Control path: (*, G) operations - IPv6 overlay / IPv6 underlay"
758 echo "--------------------------------------------------------------"
760 star_g_common $ns1 $grp $src1 $src2 $src3 $vtep_ip $all_zeros_grp
768 local vtep_ip=$1; shift
769 local all_zeros_grp=$1; shift
771 # Test control path operations specific to (S, G) entries.
773 # Default filter mode.
774 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp src $src permanent dst $vtep_ip src_vni 10010"
775 run_cmd "bridge -n $ns1 -d -s mdb show dev vx0 | grep $grp | grep include"
776 log_test $? 0 "(S, G) MDB entry default filter mode"
778 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp src $src permanent dst $vtep_ip src_vni 10010"
781 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"
782 log_test $? 255 "(S, G) with filter mode"
784 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"
785 log_test $? 255 "(S, G) with source list"
787 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp src $grp permanent dst $vtep_ip src_vni 10010"
788 log_test $? 255 "(S, G) with an invalid source list"
790 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $all_zeros_grp src $src permanent dst $vtep_ip src_vni 10010"
791 log_test $? 255 "All-zeros group with source"
798 local src=192.0.2.129
799 local vtep_ip=198.51.100.100
800 local all_zeros_grp=0.0.0.0
803 echo "Control path: (S, G) operations - IPv4 overlay / IPv4 underlay"
804 echo "--------------------------------------------------------------"
806 sg_common $ns1 $grp $src $vtep_ip $all_zeros_grp
813 local src=2001:db8:100::1
814 local vtep_ip=198.51.100.100
815 local all_zeros_grp=::
818 echo "Control path: (S, G) operations - IPv6 overlay / IPv4 underlay"
819 echo "--------------------------------------------------------------"
821 sg_common $ns1 $grp $src $vtep_ip $all_zeros_grp
828 local src=192.0.2.129
829 local vtep_ip=2001:db8:1000::1
830 local all_zeros_grp=0.0.0.0
833 echo "Control path: (S, G) operations - IPv4 overlay / IPv6 underlay"
834 echo "--------------------------------------------------------------"
836 sg_common $ns1 $grp $src $vtep_ip $all_zeros_grp
843 local src=2001:db8:100::1
844 local vtep_ip=2001:db8:1000::1
845 local all_zeros_grp=::
848 echo "Control path: (S, G) operations - IPv6 overlay / IPv6 underlay"
849 echo "--------------------------------------------------------------"
851 sg_common $ns1 $grp $src $vtep_ip $all_zeros_grp
856 local max_grps=$1; shift
859 for i in $(seq 0 $((max_grps - 1))); do
866 local max_grps=$1; shift
869 for i in $(seq 0 $((max_grps - 1))); do
870 echo "ff0e::$(printf %x $i)"
877 local local_addr=$1; shift
878 local remote_prefix=$1; shift
880 local max_vxlan_devs=2
888 # The kernel maintains various markers for the MDB dump. Add a test for
889 # large scale MDB dump to make sure that all the configured entries are
890 # dumped and that the markers are used correctly.
892 # Create net devices.
893 for i in $(seq 1 $max_vxlan_devs); do
894 ip -n $ns1 link add name vx-test${i} up type vxlan \
895 local $local_addr dstport 4789 external vnifilter
898 # Create batch file with MDB entries.
900 for i in $(seq 1 $max_vxlan_devs); do
901 for j in $(seq 1 $max_remotes); do
902 for grp in $($fn $max_grps); do
903 echo "mdb add dev vx-test${i} port vx-test${i} grp $grp permanent dst ${remote_prefix}${j}" >> $batch_file
908 # Program the batch file and check for expected number of entries.
909 bridge -n $ns1 -b $batch_file
910 for i in $(seq 1 $max_vxlan_devs); do
911 num_entries=$(bridge -n $ns1 mdb show dev vx-test${i} | grep "permanent" | wc -l)
912 [[ $num_entries -eq $((max_grps * max_remotes)) ]]
913 log_test $? 0 "Large scale dump - VXLAN device #$i"
922 local local_addr=192.0.2.1
923 local remote_prefix=198.51.100.
924 local fn=ipv4_grps_get
927 echo "Control path: Large scale MDB dump - IPv4 overlay / IPv4 underlay"
928 echo "-----------------------------------------------------------------"
930 dump_common $ns1 $local_addr $remote_prefix $fn
936 local local_addr=192.0.2.1
937 local remote_prefix=198.51.100.
938 local fn=ipv6_grps_get
941 echo "Control path: Large scale MDB dump - IPv6 overlay / IPv4 underlay"
942 echo "-----------------------------------------------------------------"
944 dump_common $ns1 $local_addr $remote_prefix $fn
950 local local_addr=2001:db8:1::1
951 local remote_prefix=2001:db8:1000::
952 local fn=ipv4_grps_get
955 echo "Control path: Large scale MDB dump - IPv4 overlay / IPv6 underlay"
956 echo "-----------------------------------------------------------------"
958 dump_common $ns1 $local_addr $remote_prefix $fn
964 local local_addr=2001:db8:1::1
965 local remote_prefix=2001:db8:1000::
966 local fn=ipv6_grps_get
969 echo "Control path: Large scale MDB dump - IPv6 overlay / IPv6 underlay"
970 echo "-----------------------------------------------------------------"
972 dump_common $ns1 $local_addr $remote_prefix $fn
975 ################################################################################
978 encap_params_common()
982 local vtep1_ip=$1; shift
983 local vtep2_ip=$1; shift
985 local enc_ethtype=$1; shift
990 # Test that packets forwarded by the VXLAN MDB are encapsulated with
991 # the correct parameters. Transmit packets from the first namespace and
992 # check that they hit the corresponding filters on the ingress of the
995 run_cmd "tc -n $ns2 qdisc replace dev veth0 clsact"
996 run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"
997 run_cmd "ip -n $ns2 address replace $vtep1_ip/$plen dev lo"
998 run_cmd "ip -n $ns2 address replace $vtep2_ip/$plen dev lo"
1000 # Check destination IP.
1001 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip src_vni 10010"
1002 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep2_ip src_vni 10020"
1004 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $vtep1_ip action pass"
1005 run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1006 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1007 log_test $? 0 "Destination IP - match"
1009 run_cmd "ip netns exec $ns1 $mz br0.20 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1010 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1011 log_test $? 0 "Destination IP - no match"
1013 run_cmd "tc -n $ns2 filter del dev vx0 ingress pref 1 handle 101 flower"
1014 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep2_ip src_vni 10020"
1015 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10010"
1017 # Check destination port.
1018 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip src_vni 10010"
1019 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip dst_port 1111 src_vni 10020"
1021 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"
1022 run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1023 tc_check_packets "$ns2" "dev veth0 ingress" 101 1
1024 log_test $? 0 "Default destination port - match"
1026 run_cmd "ip netns exec $ns1 $mz br0.20 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1027 tc_check_packets "$ns2" "dev veth0 ingress" 101 1
1028 log_test $? 0 "Default destination port - no match"
1030 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"
1031 run_cmd "ip netns exec $ns1 $mz br0.20 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1032 tc_check_packets "$ns2" "dev veth0 ingress" 101 1
1033 log_test $? 0 "Non-default destination port - match"
1035 run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1036 tc_check_packets "$ns2" "dev veth0 ingress" 101 1
1037 log_test $? 0 "Non-default destination port - no match"
1039 run_cmd "tc -n $ns2 filter del dev veth0 ingress pref 1 handle 101 flower"
1040 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10020"
1041 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10010"
1043 # Check default VNI.
1044 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip src_vni 10010"
1045 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip src_vni 10020"
1047 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_key_id 10010 action pass"
1048 run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1049 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1050 log_test $? 0 "Default destination VNI - match"
1052 run_cmd "ip netns exec $ns1 $mz br0.20 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1053 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1054 log_test $? 0 "Default destination VNI - no match"
1056 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip vni 10020 src_vni 10010"
1057 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip vni 10010 src_vni 10020"
1059 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_key_id 10020 action pass"
1060 run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1061 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1062 log_test $? 0 "Non-default destination VNI - match"
1064 run_cmd "ip netns exec $ns1 $mz br0.20 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1065 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1066 log_test $? 0 "Non-default destination VNI - no match"
1068 run_cmd "tc -n $ns2 filter del dev vx0 ingress pref 1 handle 101 flower"
1069 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10020"
1070 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10010"
1073 encap_params_ipv4_ipv4()
1077 local vtep1_ip=198.51.100.100
1078 local vtep2_ip=198.51.100.200
1080 local enc_ethtype="ip"
1082 local src=192.0.2.129
1085 echo "Data path: Encapsulation parameters - IPv4 overlay / IPv4 underlay"
1086 echo "------------------------------------------------------------------"
1088 encap_params_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $enc_ethtype \
1089 $grp $src "mausezahn"
1092 encap_params_ipv6_ipv4()
1096 local vtep1_ip=198.51.100.100
1097 local vtep2_ip=198.51.100.200
1099 local enc_ethtype="ip"
1101 local src=2001:db8:100::1
1104 echo "Data path: Encapsulation parameters - IPv6 overlay / IPv4 underlay"
1105 echo "------------------------------------------------------------------"
1107 encap_params_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $enc_ethtype \
1108 $grp $src "mausezahn -6"
1111 encap_params_ipv4_ipv6()
1115 local vtep1_ip=2001:db8:1000::1
1116 local vtep2_ip=2001:db8:2000::1
1118 local enc_ethtype="ipv6"
1120 local src=192.0.2.129
1123 echo "Data path: Encapsulation parameters - IPv4 overlay / IPv6 underlay"
1124 echo "------------------------------------------------------------------"
1126 encap_params_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $enc_ethtype \
1127 $grp $src "mausezahn"
1130 encap_params_ipv6_ipv6()
1134 local vtep1_ip=2001:db8:1000::1
1135 local vtep2_ip=2001:db8:2000::1
1137 local enc_ethtype="ipv6"
1139 local src=2001:db8:100::1
1142 echo "Data path: Encapsulation parameters - IPv6 overlay / IPv6 underlay"
1143 echo "------------------------------------------------------------------"
1145 encap_params_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $enc_ethtype \
1146 $grp $src "mausezahn -6"
1149 starg_exclude_ir_common()
1153 local vtep1_ip=$1; shift
1154 local vtep2_ip=$1; shift
1155 local plen=$1; shift
1157 local valid_src=$1; shift
1158 local invalid_src=$1; shift
1161 # Install a (*, G) EXCLUDE MDB entry with one source and two remote
1162 # VTEPs. Make sure that the source in the source list is not forwarded
1163 # and that a source not in the list is forwarded. Remove one of the
1164 # VTEPs from the entry and make sure that packets are only forwarded to
1165 # the remaining VTEP.
1167 run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"
1168 run_cmd "ip -n $ns2 address replace $vtep1_ip/$plen dev lo"
1169 run_cmd "ip -n $ns2 address replace $vtep2_ip/$plen dev lo"
1171 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $vtep1_ip action pass"
1172 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 102 proto all flower enc_dst_ip $vtep2_ip action pass"
1174 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"
1175 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"
1177 # Check that invalid source is not forwarded to any VTEP.
1178 run_cmd "ip netns exec $ns1 $mz br0.10 -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1179 tc_check_packets "$ns2" "dev vx0 ingress" 101 0
1180 log_test $? 0 "Block excluded source - first VTEP"
1181 tc_check_packets "$ns2" "dev vx0 ingress" 102 0
1182 log_test $? 0 "Block excluded source - second VTEP"
1184 # Check that valid source is forwarded to both VTEPs.
1185 run_cmd "ip netns exec $ns1 $mz br0.10 -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1186 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1187 log_test $? 0 "Forward valid source - first VTEP"
1188 tc_check_packets "$ns2" "dev vx0 ingress" 102 1
1189 log_test $? 0 "Forward valid source - second VTEP"
1191 # Remove second VTEP.
1192 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep2_ip src_vni 10010"
1194 # Check that invalid source is not forwarded to any VTEP.
1195 run_cmd "ip netns exec $ns1 $mz br0.10 -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1196 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1197 log_test $? 0 "Block excluded source after removal - first VTEP"
1198 tc_check_packets "$ns2" "dev vx0 ingress" 102 1
1199 log_test $? 0 "Block excluded source after removal - second VTEP"
1201 # Check that valid source is forwarded to the remaining VTEP.
1202 run_cmd "ip netns exec $ns1 $mz br0.10 -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1203 tc_check_packets "$ns2" "dev vx0 ingress" 101 2
1204 log_test $? 0 "Forward valid source after removal - first VTEP"
1205 tc_check_packets "$ns2" "dev vx0 ingress" 102 1
1206 log_test $? 0 "Forward valid source after removal - second VTEP"
1209 starg_exclude_ir_ipv4_ipv4()
1213 local vtep1_ip=198.51.100.100
1214 local vtep2_ip=198.51.100.200
1217 local valid_src=192.0.2.129
1218 local invalid_src=192.0.2.145
1221 echo "Data path: (*, G) EXCLUDE - IR - IPv4 overlay / IPv4 underlay"
1222 echo "-------------------------------------------------------------"
1224 starg_exclude_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1225 $valid_src $invalid_src "mausezahn"
1228 starg_exclude_ir_ipv6_ipv4()
1232 local vtep1_ip=198.51.100.100
1233 local vtep2_ip=198.51.100.200
1236 local valid_src=2001:db8:100::1
1237 local invalid_src=2001:db8:200::1
1240 echo "Data path: (*, G) EXCLUDE - IR - IPv6 overlay / IPv4 underlay"
1241 echo "-------------------------------------------------------------"
1243 starg_exclude_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1244 $valid_src $invalid_src "mausezahn -6"
1247 starg_exclude_ir_ipv4_ipv6()
1251 local vtep1_ip=2001:db8:1000::1
1252 local vtep2_ip=2001:db8:2000::1
1255 local valid_src=192.0.2.129
1256 local invalid_src=192.0.2.145
1259 echo "Data path: (*, G) EXCLUDE - IR - IPv4 overlay / IPv6 underlay"
1260 echo "-------------------------------------------------------------"
1262 starg_exclude_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1263 $valid_src $invalid_src "mausezahn"
1266 starg_exclude_ir_ipv6_ipv6()
1270 local vtep1_ip=2001:db8:1000::1
1271 local vtep2_ip=2001:db8:2000::1
1274 local valid_src=2001:db8:100::1
1275 local invalid_src=2001:db8:200::1
1278 echo "Data path: (*, G) EXCLUDE - IR - IPv6 overlay / IPv6 underlay"
1279 echo "-------------------------------------------------------------"
1281 starg_exclude_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1282 $valid_src $invalid_src "mausezahn -6"
1285 starg_include_ir_common()
1289 local vtep1_ip=$1; shift
1290 local vtep2_ip=$1; shift
1291 local plen=$1; shift
1293 local valid_src=$1; shift
1294 local invalid_src=$1; shift
1297 # Install a (*, G) INCLUDE MDB entry with one source and two remote
1298 # VTEPs. Make sure that the source in the source list is forwarded and
1299 # that a source not in the list is not forwarded. Remove one of the
1300 # VTEPs from the entry and make sure that packets are only forwarded to
1301 # the remaining VTEP.
1303 run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"
1304 run_cmd "ip -n $ns2 address replace $vtep1_ip/$plen dev lo"
1305 run_cmd "ip -n $ns2 address replace $vtep2_ip/$plen dev lo"
1307 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $vtep1_ip action pass"
1308 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 102 proto all flower enc_dst_ip $vtep2_ip action pass"
1310 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"
1311 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"
1313 # Check that invalid source is not forwarded to any VTEP.
1314 run_cmd "ip netns exec $ns1 $mz br0.10 -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1315 tc_check_packets "$ns2" "dev vx0 ingress" 101 0
1316 log_test $? 0 "Block excluded source - first VTEP"
1317 tc_check_packets "$ns2" "dev vx0 ingress" 102 0
1318 log_test $? 0 "Block excluded source - second VTEP"
1320 # Check that valid source is forwarded to both VTEPs.
1321 run_cmd "ip netns exec $ns1 $mz br0.10 -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1322 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1323 log_test $? 0 "Forward valid source - first VTEP"
1324 tc_check_packets "$ns2" "dev vx0 ingress" 102 1
1325 log_test $? 0 "Forward valid source - second VTEP"
1327 # Remove second VTEP.
1328 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep2_ip src_vni 10010"
1330 # Check that invalid source is not forwarded to any VTEP.
1331 run_cmd "ip netns exec $ns1 $mz br0.10 -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1332 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1333 log_test $? 0 "Block excluded source after removal - first VTEP"
1334 tc_check_packets "$ns2" "dev vx0 ingress" 102 1
1335 log_test $? 0 "Block excluded source after removal - second VTEP"
1337 # Check that valid source is forwarded to the remaining VTEP.
1338 run_cmd "ip netns exec $ns1 $mz br0.10 -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1339 tc_check_packets "$ns2" "dev vx0 ingress" 101 2
1340 log_test $? 0 "Forward valid source after removal - first VTEP"
1341 tc_check_packets "$ns2" "dev vx0 ingress" 102 1
1342 log_test $? 0 "Forward valid source after removal - second VTEP"
1345 starg_include_ir_ipv4_ipv4()
1349 local vtep1_ip=198.51.100.100
1350 local vtep2_ip=198.51.100.200
1353 local valid_src=192.0.2.129
1354 local invalid_src=192.0.2.145
1357 echo "Data path: (*, G) INCLUDE - IR - IPv4 overlay / IPv4 underlay"
1358 echo "-------------------------------------------------------------"
1360 starg_include_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1361 $valid_src $invalid_src "mausezahn"
1364 starg_include_ir_ipv6_ipv4()
1368 local vtep1_ip=198.51.100.100
1369 local vtep2_ip=198.51.100.200
1372 local valid_src=2001:db8:100::1
1373 local invalid_src=2001:db8:200::1
1376 echo "Data path: (*, G) INCLUDE - IR - IPv6 overlay / IPv4 underlay"
1377 echo "-------------------------------------------------------------"
1379 starg_include_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1380 $valid_src $invalid_src "mausezahn -6"
1383 starg_include_ir_ipv4_ipv6()
1387 local vtep1_ip=2001:db8:1000::1
1388 local vtep2_ip=2001:db8:2000::1
1391 local valid_src=192.0.2.129
1392 local invalid_src=192.0.2.145
1395 echo "Data path: (*, G) INCLUDE - IR - IPv4 overlay / IPv6 underlay"
1396 echo "-------------------------------------------------------------"
1398 starg_include_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1399 $valid_src $invalid_src "mausezahn"
1402 starg_include_ir_ipv6_ipv6()
1406 local vtep1_ip=2001:db8:1000::1
1407 local vtep2_ip=2001:db8:2000::1
1410 local valid_src=2001:db8:100::1
1411 local invalid_src=2001:db8:200::1
1414 echo "Data path: (*, G) INCLUDE - IR - IPv6 overlay / IPv6 underlay"
1415 echo "-------------------------------------------------------------"
1417 starg_include_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1418 $valid_src $invalid_src "mausezahn -6"
1421 starg_exclude_p2mp_common()
1425 local mcast_grp=$1; shift
1426 local plen=$1; shift
1428 local valid_src=$1; shift
1429 local invalid_src=$1; shift
1432 # Install a (*, G) EXCLUDE MDB entry with one source and one multicast
1433 # group to which packets are sent. Make sure that the source in the
1434 # source list is not forwarded and that a source not in the list is
1437 run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"
1438 run_cmd "ip -n $ns2 address replace $mcast_grp/$plen dev veth0 autojoin"
1440 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $mcast_grp action pass"
1442 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"
1444 # Check that invalid source is not forwarded.
1445 run_cmd "ip netns exec $ns1 $mz br0.10 -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1446 tc_check_packets "$ns2" "dev vx0 ingress" 101 0
1447 log_test $? 0 "Block excluded source"
1449 # Check that valid source is forwarded.
1450 run_cmd "ip netns exec $ns1 $mz br0.10 -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1451 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1452 log_test $? 0 "Forward valid source"
1454 # Remove the VTEP from the multicast group.
1455 run_cmd "ip -n $ns2 address del $mcast_grp/$plen dev veth0"
1457 # Check that valid source is not received anymore.
1458 run_cmd "ip netns exec $ns1 $mz br0.10 -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1459 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1460 log_test $? 0 "Receive of valid source after removal from group"
1463 starg_exclude_p2mp_ipv4_ipv4()
1467 local mcast_grp=238.1.1.1
1470 local valid_src=192.0.2.129
1471 local invalid_src=192.0.2.145
1474 echo "Data path: (*, G) EXCLUDE - P2MP - IPv4 overlay / IPv4 underlay"
1475 echo "---------------------------------------------------------------"
1477 starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
1478 $valid_src $invalid_src "mausezahn"
1481 starg_exclude_p2mp_ipv6_ipv4()
1485 local mcast_grp=238.1.1.1
1488 local valid_src=2001:db8:100::1
1489 local invalid_src=2001:db8:200::1
1492 echo "Data path: (*, G) EXCLUDE - P2MP - IPv6 overlay / IPv4 underlay"
1493 echo "---------------------------------------------------------------"
1495 starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
1496 $valid_src $invalid_src "mausezahn -6"
1499 starg_exclude_p2mp_ipv4_ipv6()
1503 local mcast_grp=ff0e::2
1506 local valid_src=192.0.2.129
1507 local invalid_src=192.0.2.145
1510 echo "Data path: (*, G) EXCLUDE - P2MP - IPv4 overlay / IPv6 underlay"
1511 echo "---------------------------------------------------------------"
1513 starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
1514 $valid_src $invalid_src "mausezahn"
1517 starg_exclude_p2mp_ipv6_ipv6()
1521 local mcast_grp=ff0e::2
1524 local valid_src=2001:db8:100::1
1525 local invalid_src=2001:db8:200::1
1528 echo "Data path: (*, G) EXCLUDE - P2MP - IPv6 overlay / IPv6 underlay"
1529 echo "---------------------------------------------------------------"
1531 starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
1532 $valid_src $invalid_src "mausezahn -6"
1535 starg_include_p2mp_common()
1539 local mcast_grp=$1; shift
1540 local plen=$1; shift
1542 local valid_src=$1; shift
1543 local invalid_src=$1; shift
1546 # Install a (*, G) INCLUDE MDB entry with one source and one multicast
1547 # group to which packets are sent. Make sure that the source in the
1548 # source list is forwarded and that a source not in the list is not
1551 run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"
1552 run_cmd "ip -n $ns2 address replace $mcast_grp/$plen dev veth0 autojoin"
1554 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $mcast_grp action pass"
1556 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"
1558 # Check that invalid source is not forwarded.
1559 run_cmd "ip netns exec $ns1 $mz br0.10 -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1560 tc_check_packets "$ns2" "dev vx0 ingress" 101 0
1561 log_test $? 0 "Block excluded source"
1563 # Check that valid source is forwarded.
1564 run_cmd "ip netns exec $ns1 $mz br0.10 -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1565 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1566 log_test $? 0 "Forward valid source"
1568 # Remove the VTEP from the multicast group.
1569 run_cmd "ip -n $ns2 address del $mcast_grp/$plen dev veth0"
1571 # Check that valid source is not received anymore.
1572 run_cmd "ip netns exec $ns1 $mz br0.10 -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1573 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1574 log_test $? 0 "Receive of valid source after removal from group"
1577 starg_include_p2mp_ipv4_ipv4()
1581 local mcast_grp=238.1.1.1
1584 local valid_src=192.0.2.129
1585 local invalid_src=192.0.2.145
1588 echo "Data path: (*, G) INCLUDE - P2MP - IPv4 overlay / IPv4 underlay"
1589 echo "---------------------------------------------------------------"
1591 starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
1592 $valid_src $invalid_src "mausezahn"
1595 starg_include_p2mp_ipv6_ipv4()
1599 local mcast_grp=238.1.1.1
1602 local valid_src=2001:db8:100::1
1603 local invalid_src=2001:db8:200::1
1606 echo "Data path: (*, G) INCLUDE - P2MP - IPv6 overlay / IPv4 underlay"
1607 echo "---------------------------------------------------------------"
1609 starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
1610 $valid_src $invalid_src "mausezahn -6"
1613 starg_include_p2mp_ipv4_ipv6()
1617 local mcast_grp=ff0e::2
1620 local valid_src=192.0.2.129
1621 local invalid_src=192.0.2.145
1624 echo "Data path: (*, G) INCLUDE - P2MP - IPv4 overlay / IPv6 underlay"
1625 echo "---------------------------------------------------------------"
1627 starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
1628 $valid_src $invalid_src "mausezahn"
1631 starg_include_p2mp_ipv6_ipv6()
1635 local mcast_grp=ff0e::2
1638 local valid_src=2001:db8:100::1
1639 local invalid_src=2001:db8:200::1
1642 echo "Data path: (*, G) INCLUDE - P2MP - IPv6 overlay / IPv6 underlay"
1643 echo "---------------------------------------------------------------"
1645 starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
1646 $valid_src $invalid_src "mausezahn -6"
1649 egress_vni_translation_common()
1653 local mcast_grp=$1; shift
1654 local plen=$1; shift
1655 local proto=$1; shift
1660 # When P2MP tunnels are used with optimized inter-subnet multicast
1661 # (OISM) [1], the ingress VTEP does not perform VNI translation and
1662 # uses the VNI of the source broadcast domain (BD). If the egress VTEP
1663 # is a member in the source BD, then no VNI translation is needed.
1664 # Otherwise, the egress VTEP needs to translate the VNI to the
1665 # supplementary broadcast domain (SBD) VNI, which is usually the L3VNI.
1667 # In this test, remove the VTEP in the second namespace from VLAN 10
1668 # (VNI 10010) and make sure that a packet sent from this VLAN on the
1669 # first VTEP is received by the SVI corresponding to the L3VNI (14000 /
1670 # VLAN 4000) on the second VTEP.
1672 # The second VTEP will be able to decapsulate the packet with VNI 10010
1673 # because this VNI is configured on its shared VXLAN device. Later,
1674 # when ingressing the bridge, the VNI to VLAN lookup will fail because
1675 # the VTEP is not a member in VLAN 10, which will cause the packet to
1676 # be tagged with VLAN 4000 since it is configured as PVID.
1678 # [1] https://datatracker.ietf.org/doc/html/draft-ietf-bess-evpn-irb-mcast
1680 run_cmd "tc -n $ns2 qdisc replace dev br0.4000 clsact"
1681 run_cmd "ip -n $ns2 address replace $mcast_grp/$plen dev veth0 autojoin"
1682 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"
1684 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp src $src permanent dst $mcast_grp src_vni 10010 via veth0"
1686 # Remove the second VTEP from VLAN 10.
1687 run_cmd "bridge -n $ns2 vlan del vid 10 dev vx0"
1689 # Make sure that packets sent from the first VTEP over VLAN 10 are
1690 # received by the SVI corresponding to the L3VNI (14000 / VLAN 4000) on
1691 # the second VTEP, since it is configured as PVID.
1692 run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1693 tc_check_packets "$ns2" "dev br0.4000 ingress" 101 1
1694 log_test $? 0 "Egress VNI translation - PVID configured"
1696 # Remove PVID flag from VLAN 4000 on the second VTEP and make sure
1697 # packets are no longer received by the SVI interface.
1698 run_cmd "bridge -n $ns2 vlan add vid 4000 dev vx0"
1699 run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1700 tc_check_packets "$ns2" "dev br0.4000 ingress" 101 1
1701 log_test $? 0 "Egress VNI translation - no PVID configured"
1703 # Reconfigure the PVID and make sure packets are received again.
1704 run_cmd "bridge -n $ns2 vlan add vid 4000 dev vx0 pvid"
1705 run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1706 tc_check_packets "$ns2" "dev br0.4000 ingress" 101 2
1707 log_test $? 0 "Egress VNI translation - PVID reconfigured"
1710 egress_vni_translation_ipv4_ipv4()
1714 local mcast_grp=238.1.1.1
1718 local src=192.0.2.129
1721 echo "Data path: Egress VNI translation - IPv4 overlay / IPv4 underlay"
1722 echo "----------------------------------------------------------------"
1724 egress_vni_translation_common $ns1 $ns2 $mcast_grp $plen $proto $grp \
1728 egress_vni_translation_ipv6_ipv4()
1732 local mcast_grp=238.1.1.1
1736 local src=2001:db8:100::1
1739 echo "Data path: Egress VNI translation - IPv6 overlay / IPv4 underlay"
1740 echo "----------------------------------------------------------------"
1742 egress_vni_translation_common $ns1 $ns2 $mcast_grp $plen $proto $grp \
1746 egress_vni_translation_ipv4_ipv6()
1750 local mcast_grp=ff0e::2
1754 local src=192.0.2.129
1757 echo "Data path: Egress VNI translation - IPv4 overlay / IPv6 underlay"
1758 echo "----------------------------------------------------------------"
1760 egress_vni_translation_common $ns1 $ns2 $mcast_grp $plen $proto $grp \
1764 egress_vni_translation_ipv6_ipv6()
1768 local mcast_grp=ff0e::2
1772 local src=2001:db8:100::1
1775 echo "Data path: Egress VNI translation - IPv6 overlay / IPv6 underlay"
1776 echo "----------------------------------------------------------------"
1778 egress_vni_translation_common $ns1 $ns2 $mcast_grp $plen $proto $grp \
1782 all_zeros_mdb_common()
1786 local vtep1_ip=$1; shift
1787 local vtep2_ip=$1; shift
1788 local vtep3_ip=$1; shift
1789 local vtep4_ip=$1; shift
1790 local plen=$1; shift
1791 local ipv4_grp=239.1.1.1
1792 local ipv4_unreg_grp=239.2.2.2
1793 local ipv4_ll_grp=224.0.0.100
1794 local ipv4_src=192.0.2.129
1795 local ipv6_grp=ff0e::1
1796 local ipv6_unreg_grp=ff0e::2
1797 local ipv6_ll_grp=ff02::1
1798 local ipv6_src=2001:db8:100::1
1800 # Install all-zeros (catchall) MDB entries for IPv4 and IPv6 traffic
1801 # and make sure they only forward unregistered IP multicast traffic
1802 # which is not link-local. Also make sure that each entry only forwards
1803 # traffic from the matching address family.
1805 # Associate two different VTEPs with one all-zeros MDB entry: Two with
1806 # the IPv4 entry (0.0.0.0) and another two with the IPv6 one (::).
1807 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp 0.0.0.0 permanent dst $vtep1_ip src_vni 10010"
1808 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp 0.0.0.0 permanent dst $vtep2_ip src_vni 10010"
1809 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp :: permanent dst $vtep3_ip src_vni 10010"
1810 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp :: permanent dst $vtep4_ip src_vni 10010"
1812 # Associate one VTEP from each set with a regular MDB entry: One with
1813 # an IPv4 entry and another with an IPv6 one.
1814 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $ipv4_grp permanent dst $vtep1_ip src_vni 10010"
1815 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $ipv6_grp permanent dst $vtep3_ip src_vni 10010"
1817 # Add filters to match on decapsulated traffic in the second namespace.
1818 run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"
1819 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $vtep1_ip action pass"
1820 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 102 proto all flower enc_dst_ip $vtep2_ip action pass"
1821 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 103 proto all flower enc_dst_ip $vtep3_ip action pass"
1822 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 104 proto all flower enc_dst_ip $vtep4_ip action pass"
1824 # Configure the VTEP addresses in the second namespace to enable
1826 run_cmd "ip -n $ns2 address replace $vtep1_ip/$plen dev lo"
1827 run_cmd "ip -n $ns2 address replace $vtep2_ip/$plen dev lo"
1828 run_cmd "ip -n $ns2 address replace $vtep3_ip/$plen dev lo"
1829 run_cmd "ip -n $ns2 address replace $vtep4_ip/$plen dev lo"
1831 # Send registered IPv4 multicast and make sure it only arrives to the
1833 run_cmd "ip netns exec $ns1 mausezahn br0.10 -A $ipv4_src -B $ipv4_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1834 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1835 log_test $? 0 "Registered IPv4 multicast - first VTEP"
1836 tc_check_packets "$ns2" "dev vx0 ingress" 102 0
1837 log_test $? 0 "Registered IPv4 multicast - second VTEP"
1839 # Send unregistered IPv4 multicast that is not link-local and make sure
1840 # it arrives to the first and second VTEPs.
1841 run_cmd "ip netns exec $ns1 mausezahn br0.10 -A $ipv4_src -B $ipv4_unreg_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1842 tc_check_packets "$ns2" "dev vx0 ingress" 101 2
1843 log_test $? 0 "Unregistered IPv4 multicast - first VTEP"
1844 tc_check_packets "$ns2" "dev vx0 ingress" 102 1
1845 log_test $? 0 "Unregistered IPv4 multicast - second VTEP"
1847 # Send IPv4 link-local multicast traffic and make sure it does not
1848 # arrive to any VTEP.
1849 run_cmd "ip netns exec $ns1 mausezahn br0.10 -A $ipv4_src -B $ipv4_ll_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1850 tc_check_packets "$ns2" "dev vx0 ingress" 101 2
1851 log_test $? 0 "Link-local IPv4 multicast - first VTEP"
1852 tc_check_packets "$ns2" "dev vx0 ingress" 102 1
1853 log_test $? 0 "Link-local IPv4 multicast - second VTEP"
1855 # Send registered IPv4 multicast using a unicast MAC address and make
1856 # sure it does not arrive to any VTEP.
1857 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"
1858 tc_check_packets "$ns2" "dev vx0 ingress" 101 2
1859 log_test $? 0 "Registered IPv4 multicast with a unicast MAC - first VTEP"
1860 tc_check_packets "$ns2" "dev vx0 ingress" 102 1
1861 log_test $? 0 "Registered IPv4 multicast with a unicast MAC - second VTEP"
1863 # Send registered IPv4 multicast using a broadcast MAC address and make
1864 # sure it does not arrive to any VTEP.
1865 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"
1866 tc_check_packets "$ns2" "dev vx0 ingress" 101 2
1867 log_test $? 0 "Registered IPv4 multicast with a broadcast MAC - first VTEP"
1868 tc_check_packets "$ns2" "dev vx0 ingress" 102 1
1869 log_test $? 0 "Registered IPv4 multicast with a broadcast MAC - second VTEP"
1871 # Make sure IPv4 traffic did not reach the VTEPs associated with
1873 tc_check_packets "$ns2" "dev vx0 ingress" 103 0
1874 log_test $? 0 "IPv4 traffic - third VTEP"
1875 tc_check_packets "$ns2" "dev vx0 ingress" 104 0
1876 log_test $? 0 "IPv4 traffic - fourth VTEP"
1878 # Reset IPv4 filters before testing IPv6 traffic.
1879 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $vtep1_ip action pass"
1880 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 102 proto all flower enc_dst_ip $vtep2_ip action pass"
1882 # Send registered IPv6 multicast and make sure it only arrives to the
1884 run_cmd "ip netns exec $ns1 mausezahn -6 br0.10 -A $ipv6_src -B $ipv6_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1885 tc_check_packets "$ns2" "dev vx0 ingress" 103 1
1886 log_test $? 0 "Registered IPv6 multicast - third VTEP"
1887 tc_check_packets "$ns2" "dev vx0 ingress" 104 0
1888 log_test $? 0 "Registered IPv6 multicast - fourth VTEP"
1890 # Send unregistered IPv6 multicast that is not link-local and make sure
1891 # it arrives to the third and fourth VTEPs.
1892 run_cmd "ip netns exec $ns1 mausezahn -6 br0.10 -A $ipv6_src -B $ipv6_unreg_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1893 tc_check_packets "$ns2" "dev vx0 ingress" 103 2
1894 log_test $? 0 "Unregistered IPv6 multicast - third VTEP"
1895 tc_check_packets "$ns2" "dev vx0 ingress" 104 1
1896 log_test $? 0 "Unregistered IPv6 multicast - fourth VTEP"
1898 # Send IPv6 link-local multicast traffic and make sure it does not
1899 # arrive to any VTEP.
1900 run_cmd "ip netns exec $ns1 mausezahn -6 br0.10 -A $ipv6_src -B $ipv6_ll_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1901 tc_check_packets "$ns2" "dev vx0 ingress" 103 2
1902 log_test $? 0 "Link-local IPv6 multicast - third VTEP"
1903 tc_check_packets "$ns2" "dev vx0 ingress" 104 1
1904 log_test $? 0 "Link-local IPv6 multicast - fourth VTEP"
1906 # Send registered IPv6 multicast using a unicast MAC address and make
1907 # sure it does not arrive to any VTEP.
1908 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"
1909 tc_check_packets "$ns2" "dev vx0 ingress" 103 2
1910 log_test $? 0 "Registered IPv6 multicast with a unicast MAC - third VTEP"
1911 tc_check_packets "$ns2" "dev vx0 ingress" 104 1
1912 log_test $? 0 "Registered IPv6 multicast with a unicast MAC - fourth VTEP"
1914 # Send registered IPv6 multicast using a broadcast MAC address and make
1915 # sure it does not arrive to any VTEP.
1916 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"
1917 tc_check_packets "$ns2" "dev vx0 ingress" 103 2
1918 log_test $? 0 "Registered IPv6 multicast with a broadcast MAC - third VTEP"
1919 tc_check_packets "$ns2" "dev vx0 ingress" 104 1
1920 log_test $? 0 "Registered IPv6 multicast with a broadcast MAC - fourth VTEP"
1922 # Make sure IPv6 traffic did not reach the VTEPs associated with
1924 tc_check_packets "$ns2" "dev vx0 ingress" 101 0
1925 log_test $? 0 "IPv6 traffic - first VTEP"
1926 tc_check_packets "$ns2" "dev vx0 ingress" 102 0
1927 log_test $? 0 "IPv6 traffic - second VTEP"
1930 all_zeros_mdb_ipv4()
1934 local vtep1_ip=198.51.100.101
1935 local vtep2_ip=198.51.100.102
1936 local vtep3_ip=198.51.100.103
1937 local vtep4_ip=198.51.100.104
1941 echo "Data path: All-zeros MDB entry - IPv4 underlay"
1942 echo "----------------------------------------------"
1944 all_zeros_mdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $vtep3_ip \
1948 all_zeros_mdb_ipv6()
1952 local vtep1_ip=2001:db8:1000::1
1953 local vtep2_ip=2001:db8:2000::1
1954 local vtep3_ip=2001:db8:3000::1
1955 local vtep4_ip=2001:db8:4000::1
1959 echo "Data path: All-zeros MDB entry - IPv6 underlay"
1960 echo "----------------------------------------------"
1962 all_zeros_mdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $vtep3_ip \
1970 local vtep1_ip=$1; shift
1971 local vtep2_ip=$1; shift
1972 local plen=$1; shift
1973 local proto=$1; shift
1978 # Install an MDB entry and an FDB entry and make sure that the FDB
1979 # entry only forwards traffic that was not forwarded by the MDB.
1981 # Associate the MDB entry with one VTEP and the FDB entry with another
1983 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip src_vni 10010"
1984 run_cmd "bridge -n $ns1 fdb add 00:00:00:00:00:00 dev vx0 self static dst $vtep2_ip src_vni 10010"
1986 # Add filters to match on decapsulated traffic in the second namespace.
1987 run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"
1988 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"
1989 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"
1991 # Configure the VTEP addresses in the second namespace to enable
1993 run_cmd "ip -n $ns2 address replace $vtep1_ip/$plen dev lo"
1994 run_cmd "ip -n $ns2 address replace $vtep2_ip/$plen dev lo"
1996 # Send IP multicast traffic and make sure it is forwarded by the MDB
1997 # and only arrives to the first VTEP.
1998 run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1999 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
2000 log_test $? 0 "IP multicast - first VTEP"
2001 tc_check_packets "$ns2" "dev vx0 ingress" 102 0
2002 log_test $? 0 "IP multicast - second VTEP"
2004 # Send broadcast traffic and make sure it is forwarded by the FDB and
2005 # only arrives to the second VTEP.
2006 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"
2007 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
2008 log_test $? 0 "Broadcast - first VTEP"
2009 tc_check_packets "$ns2" "dev vx0 ingress" 102 1
2010 log_test $? 0 "Broadcast - second VTEP"
2012 # Remove the MDB entry and make sure that IP multicast is now forwarded
2013 # by the FDB to the second VTEP.
2014 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10010"
2015 run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
2016 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
2017 log_test $? 0 "IP multicast after removal - first VTEP"
2018 tc_check_packets "$ns2" "dev vx0 ingress" 102 2
2019 log_test $? 0 "IP multicast after removal - second VTEP"
2026 local vtep1_ip=198.51.100.100
2027 local vtep2_ip=198.51.100.200
2031 local src=192.0.2.129
2034 echo "Data path: MDB with FDB - IPv4 overlay / IPv4 underlay"
2035 echo "------------------------------------------------------"
2037 mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp $src \
2045 local vtep1_ip=198.51.100.100
2046 local vtep2_ip=198.51.100.200
2050 local src=2001:db8:100::1
2053 echo "Data path: MDB with FDB - IPv6 overlay / IPv4 underlay"
2054 echo "------------------------------------------------------"
2056 mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp $src \
2064 local vtep1_ip=2001:db8:1000::1
2065 local vtep2_ip=2001:db8:2000::1
2069 local src=192.0.2.129
2072 echo "Data path: MDB with FDB - IPv4 overlay / IPv6 underlay"
2073 echo "------------------------------------------------------"
2075 mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp $src \
2083 local vtep1_ip=2001:db8:1000::1
2084 local vtep2_ip=2001:db8:2000::1
2088 local src=2001:db8:100::1
2091 echo "Data path: MDB with FDB - IPv6 overlay / IPv6 underlay"
2092 echo "------------------------------------------------------"
2094 mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp $src \
2101 local vtep1_ip=$1; shift
2102 local grp1=$1; shift
2105 bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp1 dst $vtep1_ip src_vni 10010
2106 bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp1 permanent dst $vtep1_ip src_vni 10010
2107 done >/dev/null 2>&1
2113 local vtep1_ip=$1; shift
2114 local vtep2_ip=$1; shift
2115 local grp2=$1; shift
2118 bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp2 dst $vtep1_ip src_vni 10010
2119 bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp2 permanent dst $vtep1_ip src_vni 10010
2120 bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp2 permanent dst $vtep2_ip src_vni 10010
2121 done >/dev/null 2>&1
2124 mdb_torture_common()
2127 local vtep1_ip=$1; shift
2128 local vtep2_ip=$1; shift
2129 local grp1=$1; shift
2130 local grp2=$1; shift
2138 # Continuously send two streams that are forwarded by two different MDB
2139 # entries. The first entry will be added and deleted in a loop. This
2140 # allows us to test that the data path does not use freed MDB entry
2141 # memory. The second entry will have two remotes, one that is added and
2142 # deleted in a loop and another that is replaced in a loop. This allows
2143 # us to test that the data path does not use freed remote entry memory.
2144 # The test is considered successful if nothing crashed.
2146 # Create the MDB entries that will be continuously deleted / replaced.
2147 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp1 permanent dst $vtep1_ip src_vni 10010"
2148 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp2 permanent dst $vtep1_ip src_vni 10010"
2149 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp2 permanent dst $vtep2_ip src_vni 10010"
2151 mdb_grp1_loop $ns1 $vtep1_ip $grp1 &
2153 mdb_grp2_loop $ns1 $vtep1_ip $vtep2_ip $grp2 &
2155 ip netns exec $ns1 $mz br0.10 -A $src -B $grp1 -t udp sp=12345,dp=54321 -p 100 -c 0 -q &
2157 ip netns exec $ns1 $mz br0.10 -A $src -B $grp2 -t udp sp=12345,dp=54321 -p 100 -c 0 -q &
2161 kill -9 $pid1 $pid2 $pid3 $pid4
2162 wait $pid1 $pid2 $pid3 $pid4 2>/dev/null
2164 log_test 0 0 "Torture test"
2167 mdb_torture_ipv4_ipv4()
2170 local vtep1_ip=198.51.100.100
2171 local vtep2_ip=198.51.100.200
2172 local grp1=239.1.1.1
2173 local grp2=239.2.2.2
2174 local src=192.0.2.129
2177 echo "Data path: MDB torture test - IPv4 overlay / IPv4 underlay"
2178 echo "----------------------------------------------------------"
2180 mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp2 $src \
2184 mdb_torture_ipv6_ipv4()
2187 local vtep1_ip=198.51.100.100
2188 local vtep2_ip=198.51.100.200
2191 local src=2001:db8:100::1
2194 echo "Data path: MDB torture test - IPv6 overlay / IPv4 underlay"
2195 echo "----------------------------------------------------------"
2197 mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp2 $src \
2201 mdb_torture_ipv4_ipv6()
2204 local vtep1_ip=2001:db8:1000::1
2205 local vtep2_ip=2001:db8:2000::1
2206 local grp1=239.1.1.1
2207 local grp2=239.2.2.2
2208 local src=192.0.2.129
2211 echo "Data path: MDB torture test - IPv4 overlay / IPv6 underlay"
2212 echo "----------------------------------------------------------"
2214 mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp2 $src \
2218 mdb_torture_ipv6_ipv6()
2221 local vtep1_ip=2001:db8:1000::1
2222 local vtep2_ip=2001:db8:2000::1
2225 local src=2001:db8:100::1
2228 echo "Data path: MDB torture test - IPv6 overlay / IPv6 underlay"
2229 echo "----------------------------------------------------------"
2231 mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp2 $src \
2235 ################################################################################
2241 usage: ${0##*/} OPTS
2243 -t <test> Test(s) to run (default: all)
2245 -c Control path tests only
2246 -d Data path tests only
2248 -P Pause after each test before cleanup
2249 -v Verbose mode (show commands and output)
2253 ################################################################################
2258 while getopts ":t:cdpPvh" opt; do
2261 c) TESTS=${CONTROL_PATH_TESTS};;
2262 d) TESTS=${DATA_PATH_TESTS};;
2263 p) PAUSE_ON_FAIL=yes;;
2265 v) VERBOSE=$(($VERBOSE + 1));;
2271 # Make sure we don't pause twice.
2272 [ "${PAUSE}" = "yes" ] && PAUSE_ON_FAIL=no
2274 if [ "$(id -u)" -ne 0 ];then
2275 echo "SKIP: Need root privileges"
2279 if [ ! -x "$(command -v ip)" ]; then
2280 echo "SKIP: Could not run test without ip tool"
2284 if [ ! -x "$(command -v bridge)" ]; then
2285 echo "SKIP: Could not run test without bridge tool"
2289 if [ ! -x "$(command -v mausezahn)" ]; then
2290 echo "SKIP: Could not run test without mausezahn tool"
2294 if [ ! -x "$(command -v jq)" ]; then
2295 echo "SKIP: Could not run test without jq tool"
2299 bridge mdb help 2>&1 | grep -q "src_vni"
2300 if [ $? -ne 0 ]; then
2301 echo "SKIP: iproute2 bridge too old, missing VXLAN MDB support"
2313 if [ "$TESTS" != "none" ]; then
2314 printf "\nTests passed: %3d\n" ${nsuccess}
2315 printf "Tests failed: %3d\n" ${nfail}