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 # +------------------------------------+ +------------------------------------+
62 basic_star_g_ipv4_ipv4
63 basic_star_g_ipv6_ipv4
64 basic_star_g_ipv4_ipv6
65 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
263 ip link add name veth0 type veth peer name veth1
264 ip link set dev veth0 netns $ns1 name veth0
265 ip link set dev veth1 netns $ns2 name veth0
267 setup_common_ns $ns1 $local_addr1
268 setup_common_ns $ns2 $local_addr2
273 setup_ns ns1_v4 ns2_v4
274 setup_common $ns1_v4 $ns2_v4 192.0.2.1 192.0.2.2
276 ip -n $ns1_v4 address add 192.0.2.17/28 dev veth0
277 ip -n $ns2_v4 address add 192.0.2.18/28 dev veth0
279 ip -n $ns1_v4 route add default via 192.0.2.18
280 ip -n $ns2_v4 route add default via 192.0.2.17
285 cleanup_ns $ns2_v4 $ns1_v4
290 setup_ns ns1_v6 ns2_v6
291 setup_common $ns1_v6 $ns2_v6 2001:db8:1::1 2001:db8:1::2
293 ip -n $ns1_v6 address add 2001:db8:2::1/64 dev veth0 nodad
294 ip -n $ns2_v6 address add 2001:db8:2::2/64 dev veth0 nodad
296 ip -n $ns1_v6 route add default via 2001:db8:2::2
297 ip -n $ns2_v6 route add default via 2001:db8:2::1
302 cleanup_ns $ns2_v6 $ns1_v6
319 cleanup_v6 &> /dev/null
320 cleanup_v4 &> /dev/null
323 ################################################################################
324 # Tests - Control path
329 local grp_key=$1; shift
330 local vtep_ip=$1; shift
332 # Test basic control path operations common to all MDB entry types.
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"
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"
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"
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"
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"
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"
362 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
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"
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"
373 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
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"
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"
384 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
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"
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"
395 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
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"
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"
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"
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"
410 run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent"
411 log_test $? 255 "MDB entry without extended parameters"
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"
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"
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"
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"
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"
431 basic_star_g_ipv4_ipv4()
434 local grp_key="grp 239.1.1.1"
435 local vtep_ip=198.51.100.100
438 echo "Control path: Basic (*, G) operations - IPv4 overlay / IPv4 underlay"
439 echo "--------------------------------------------------------------------"
441 basic_common $ns1 "$grp_key" $vtep_ip
444 basic_star_g_ipv6_ipv4()
447 local grp_key="grp ff0e::1"
448 local vtep_ip=198.51.100.100
451 echo "Control path: Basic (*, G) operations - IPv6 overlay / IPv4 underlay"
452 echo "--------------------------------------------------------------------"
454 basic_common $ns1 "$grp_key" $vtep_ip
457 basic_star_g_ipv4_ipv6()
460 local grp_key="grp 239.1.1.1"
461 local vtep_ip=2001:db8:1000::1
464 echo "Control path: Basic (*, G) operations - IPv4 overlay / IPv6 underlay"
465 echo "--------------------------------------------------------------------"
467 basic_common $ns1 "$grp_key" $vtep_ip
470 basic_star_g_ipv6_ipv6()
473 local grp_key="grp ff0e::1"
474 local vtep_ip=2001:db8:1000::1
477 echo "Control path: Basic (*, G) operations - IPv6 overlay / IPv6 underlay"
478 echo "--------------------------------------------------------------------"
480 basic_common $ns1 "$grp_key" $vtep_ip
486 local grp_key="grp 239.1.1.1 src 192.0.2.129"
487 local vtep_ip=198.51.100.100
490 echo "Control path: Basic (S, G) operations - IPv4 overlay / IPv4 underlay"
491 echo "--------------------------------------------------------------------"
493 basic_common $ns1 "$grp_key" $vtep_ip
499 local grp_key="grp ff0e::1 src 2001:db8:100::1"
500 local vtep_ip=198.51.100.100
503 echo "Control path: Basic (S, G) operations - IPv6 overlay / IPv4 underlay"
504 echo "---------------------------------------------------------------------"
506 basic_common $ns1 "$grp_key" $vtep_ip
512 local grp_key="grp 239.1.1.1 src 192.0.2.129"
513 local vtep_ip=2001:db8:1000::1
516 echo "Control path: Basic (S, G) operations - IPv4 overlay / IPv6 underlay"
517 echo "--------------------------------------------------------------------"
519 basic_common $ns1 "$grp_key" $vtep_ip
525 local grp_key="grp ff0e::1 src 2001:db8:100::1"
526 local vtep_ip=2001:db8:1000::1
529 echo "Control path: Basic (S, G) operations - IPv6 overlay / IPv6 underlay"
530 echo "--------------------------------------------------------------------"
532 basic_common $ns1 "$grp_key" $vtep_ip
542 local vtep_ip=$1; shift
543 local all_zeros_grp=$1; shift
545 # Test control path operations specific to (*, G) entries.
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"
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"
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"
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"
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\""
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\""
590 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
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"
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"
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"
613 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
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"
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"
628 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
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"
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"
643 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
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"
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"
658 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
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"
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"
673 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
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"
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"
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"
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"
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"
696 local src1=192.0.2.129
697 local src2=192.0.2.130
698 local src3=192.0.2.131
699 local vtep_ip=198.51.100.100
700 local all_zeros_grp=0.0.0.0
703 echo "Control path: (*, G) operations - IPv4 overlay / IPv4 underlay"
704 echo "--------------------------------------------------------------"
706 star_g_common $ns1 $grp $src1 $src2 $src3 $vtep_ip $all_zeros_grp
713 local src1=2001:db8:100::1
714 local src2=2001:db8:100::2
715 local src3=2001:db8:100::3
716 local vtep_ip=198.51.100.100
717 local all_zeros_grp=::
720 echo "Control path: (*, G) operations - IPv6 overlay / IPv4 underlay"
721 echo "--------------------------------------------------------------"
723 star_g_common $ns1 $grp $src1 $src2 $src3 $vtep_ip $all_zeros_grp
730 local src1=192.0.2.129
731 local src2=192.0.2.130
732 local src3=192.0.2.131
733 local vtep_ip=2001:db8:1000::1
734 local all_zeros_grp=0.0.0.0
737 echo "Control path: (*, G) operations - IPv4 overlay / IPv6 underlay"
738 echo "--------------------------------------------------------------"
740 star_g_common $ns1 $grp $src1 $src2 $src3 $vtep_ip $all_zeros_grp
747 local src1=2001:db8:100::1
748 local src2=2001:db8:100::2
749 local src3=2001:db8:100::3
750 local vtep_ip=2001:db8:1000::1
751 local all_zeros_grp=::
754 echo "Control path: (*, G) operations - IPv6 overlay / IPv6 underlay"
755 echo "--------------------------------------------------------------"
757 star_g_common $ns1 $grp $src1 $src2 $src3 $vtep_ip $all_zeros_grp
765 local vtep_ip=$1; shift
766 local all_zeros_grp=$1; shift
768 # Test control path operations specific to (S, G) entries.
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"
775 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp src $src permanent dst $vtep_ip src_vni 10010"
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"
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"
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"
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"
795 local src=192.0.2.129
796 local vtep_ip=198.51.100.100
797 local all_zeros_grp=0.0.0.0
800 echo "Control path: (S, G) operations - IPv4 overlay / IPv4 underlay"
801 echo "--------------------------------------------------------------"
803 sg_common $ns1 $grp $src $vtep_ip $all_zeros_grp
810 local src=2001:db8:100::1
811 local vtep_ip=198.51.100.100
812 local all_zeros_grp=::
815 echo "Control path: (S, G) operations - IPv6 overlay / IPv4 underlay"
816 echo "--------------------------------------------------------------"
818 sg_common $ns1 $grp $src $vtep_ip $all_zeros_grp
825 local src=192.0.2.129
826 local vtep_ip=2001:db8:1000::1
827 local all_zeros_grp=0.0.0.0
830 echo "Control path: (S, G) operations - IPv4 overlay / IPv6 underlay"
831 echo "--------------------------------------------------------------"
833 sg_common $ns1 $grp $src $vtep_ip $all_zeros_grp
840 local src=2001:db8:100::1
841 local vtep_ip=2001:db8:1000::1
842 local all_zeros_grp=::
845 echo "Control path: (S, G) operations - IPv6 overlay / IPv6 underlay"
846 echo "--------------------------------------------------------------"
848 sg_common $ns1 $grp $src $vtep_ip $all_zeros_grp
853 local max_grps=$1; shift
856 for i in $(seq 0 $((max_grps - 1))); do
863 local max_grps=$1; shift
866 for i in $(seq 0 $((max_grps - 1))); do
867 echo "ff0e::$(printf %x $i)"
874 local local_addr=$1; shift
875 local remote_prefix=$1; shift
877 local max_vxlan_devs=2
885 # The kernel maintains various markers for the MDB dump. Add a test for
886 # large scale MDB dump to make sure that all the configured entries are
887 # dumped and that the markers are used correctly.
889 # Create net devices.
890 for i in $(seq 1 $max_vxlan_devs); do
891 ip -n $ns1 link add name vx-test${i} up type vxlan \
892 local $local_addr dstport 4789 external vnifilter
895 # Create batch file with MDB entries.
897 for i in $(seq 1 $max_vxlan_devs); do
898 for j in $(seq 1 $max_remotes); do
899 for grp in $($fn $max_grps); do
900 echo "mdb add dev vx-test${i} port vx-test${i} grp $grp permanent dst ${remote_prefix}${j}" >> $batch_file
905 # Program the batch file and check for expected number of entries.
906 bridge -n $ns1 -b $batch_file
907 for i in $(seq 1 $max_vxlan_devs); do
908 num_entries=$(bridge -n $ns1 mdb show dev vx-test${i} | grep "permanent" | wc -l)
909 [[ $num_entries -eq $((max_grps * max_remotes)) ]]
910 log_test $? 0 "Large scale dump - VXLAN device #$i"
919 local local_addr=192.0.2.1
920 local remote_prefix=198.51.100.
921 local fn=ipv4_grps_get
924 echo "Control path: Large scale MDB dump - IPv4 overlay / IPv4 underlay"
925 echo "-----------------------------------------------------------------"
927 dump_common $ns1 $local_addr $remote_prefix $fn
933 local local_addr=192.0.2.1
934 local remote_prefix=198.51.100.
935 local fn=ipv6_grps_get
938 echo "Control path: Large scale MDB dump - IPv6 overlay / IPv4 underlay"
939 echo "-----------------------------------------------------------------"
941 dump_common $ns1 $local_addr $remote_prefix $fn
947 local local_addr=2001:db8:1::1
948 local remote_prefix=2001:db8:1000::
949 local fn=ipv4_grps_get
952 echo "Control path: Large scale MDB dump - IPv4 overlay / IPv6 underlay"
953 echo "-----------------------------------------------------------------"
955 dump_common $ns1 $local_addr $remote_prefix $fn
961 local local_addr=2001:db8:1::1
962 local remote_prefix=2001:db8:1000::
963 local fn=ipv6_grps_get
966 echo "Control path: Large scale MDB dump - IPv6 overlay / IPv6 underlay"
967 echo "-----------------------------------------------------------------"
969 dump_common $ns1 $local_addr $remote_prefix $fn
977 echo "Control path: Flush"
978 echo "-------------------"
980 # Add entries with different attributes and check that they are all
981 # flushed when the flush command is given with no parameters.
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"
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"
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"
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"
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"
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"
1008 # Check that entries are flushed when port is specified as the VXLAN
1009 # device and that an error is returned when port is specified as a
1010 # different net device.
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"
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"
1019 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 port veth0"
1020 log_test $? 255 "Flush by port - non-matching"
1022 # Check that when flushing by source VNI only entries programmed with
1023 # the specified source VNI are flushed and the rest are not.
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"
1030 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 src_vni 10010"
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"
1037 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"
1039 # Check that all entries are flushed when "permanent" is specified and
1040 # that an error is returned when "nopermanent" is specified.
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"
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"
1049 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 nopermanent"
1050 log_test $? 255 "Flush by \"nopermanent\" state"
1052 # Check that when flushing by routing protocol only entries programmed
1053 # with the specified routing protocol are flushed and the rest are not.
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"
1058 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 proto bgp"
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"
1065 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"
1067 # Check that when flushing by destination IP only entries programmed
1068 # with the specified destination IP are flushed and the rest are not.
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"
1075 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 dst 198.51.100.2"
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"
1082 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"
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"
1089 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 dst 2001:db8:1000::2"
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"
1096 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"
1098 # Check that when flushing by UDP destination port only entries
1099 # programmed with the specified port are flushed and the rest are not.
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"
1104 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 dst_port 11111"
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"
1111 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"
1113 # When not specifying a UDP destination port for an entry, traffic is
1114 # encapsulated with the device's UDP destination port. Check that when
1115 # flushing by the device's UDP destination port only entries programmed
1116 # with this port are flushed and the rest are not.
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"
1121 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 dst_port 4789"
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"
1128 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"
1130 # Check that when flushing by destination VNI only entries programmed
1131 # with the specified destination VNI are flushed and the rest are not.
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"
1136 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 vni 20010"
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"
1143 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"
1145 # When not specifying a destination VNI for an entry, traffic is
1146 # encapsulated with the source VNI. Check that when flushing by a
1147 # destination VNI that is equal to the source VNI only such entries are
1148 # flushed and the rest are not.
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"
1153 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 vni 10010"
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"
1160 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"
1162 # Test that an error is returned when trying to flush using VLAN ID.
1164 run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 vid 10"
1165 log_test $? 255 "Flush by VLAN ID"
1168 ################################################################################
1171 encap_params_common()
1175 local vtep1_ip=$1; shift
1176 local vtep2_ip=$1; shift
1177 local plen=$1; shift
1178 local enc_ethtype=$1; shift
1183 # Test that packets forwarded by the VXLAN MDB are encapsulated with
1184 # the correct parameters. Transmit packets from the first namespace and
1185 # check that they hit the corresponding filters on the ingress of the
1188 run_cmd "tc -n $ns2 qdisc replace dev veth0 clsact"
1189 run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"
1190 run_cmd "ip -n $ns2 address replace $vtep1_ip/$plen dev lo"
1191 run_cmd "ip -n $ns2 address replace $vtep2_ip/$plen dev lo"
1193 # Check destination IP.
1194 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip src_vni 10010"
1195 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep2_ip src_vni 10020"
1197 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $vtep1_ip action pass"
1198 run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1199 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1200 log_test $? 0 "Destination IP - match"
1202 run_cmd "ip netns exec $ns1 $mz br0.20 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1203 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1204 log_test $? 0 "Destination IP - no match"
1206 run_cmd "tc -n $ns2 filter del dev vx0 ingress pref 1 handle 101 flower"
1207 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep2_ip src_vni 10020"
1208 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10010"
1210 # Check destination port.
1211 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip src_vni 10010"
1212 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip dst_port 1111 src_vni 10020"
1214 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"
1215 run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1216 tc_check_packets "$ns2" "dev veth0 ingress" 101 1
1217 log_test $? 0 "Default destination port - match"
1219 run_cmd "ip netns exec $ns1 $mz br0.20 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1220 tc_check_packets "$ns2" "dev veth0 ingress" 101 1
1221 log_test $? 0 "Default destination port - no match"
1223 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"
1224 run_cmd "ip netns exec $ns1 $mz br0.20 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1225 tc_check_packets "$ns2" "dev veth0 ingress" 101 1
1226 log_test $? 0 "Non-default destination port - match"
1228 run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1229 tc_check_packets "$ns2" "dev veth0 ingress" 101 1
1230 log_test $? 0 "Non-default destination port - no match"
1232 run_cmd "tc -n $ns2 filter del dev veth0 ingress pref 1 handle 101 flower"
1233 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10020"
1234 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10010"
1236 # Check default VNI.
1237 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip src_vni 10010"
1238 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip src_vni 10020"
1240 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_key_id 10010 action pass"
1241 run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1242 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1243 log_test $? 0 "Default destination VNI - match"
1245 run_cmd "ip netns exec $ns1 $mz br0.20 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1246 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1247 log_test $? 0 "Default destination VNI - no match"
1249 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip vni 10020 src_vni 10010"
1250 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip vni 10010 src_vni 10020"
1252 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_key_id 10020 action pass"
1253 run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1254 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1255 log_test $? 0 "Non-default destination VNI - match"
1257 run_cmd "ip netns exec $ns1 $mz br0.20 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1258 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1259 log_test $? 0 "Non-default destination VNI - no match"
1261 run_cmd "tc -n $ns2 filter del dev vx0 ingress pref 1 handle 101 flower"
1262 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10020"
1263 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10010"
1266 encap_params_ipv4_ipv4()
1270 local vtep1_ip=198.51.100.100
1271 local vtep2_ip=198.51.100.200
1273 local enc_ethtype="ip"
1275 local src=192.0.2.129
1278 echo "Data path: Encapsulation parameters - IPv4 overlay / IPv4 underlay"
1279 echo "------------------------------------------------------------------"
1281 encap_params_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $enc_ethtype \
1282 $grp $src "mausezahn"
1285 encap_params_ipv6_ipv4()
1289 local vtep1_ip=198.51.100.100
1290 local vtep2_ip=198.51.100.200
1292 local enc_ethtype="ip"
1294 local src=2001:db8:100::1
1297 echo "Data path: Encapsulation parameters - IPv6 overlay / IPv4 underlay"
1298 echo "------------------------------------------------------------------"
1300 encap_params_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $enc_ethtype \
1301 $grp $src "mausezahn -6"
1304 encap_params_ipv4_ipv6()
1308 local vtep1_ip=2001:db8:1000::1
1309 local vtep2_ip=2001:db8:2000::1
1311 local enc_ethtype="ipv6"
1313 local src=192.0.2.129
1316 echo "Data path: Encapsulation parameters - IPv4 overlay / IPv6 underlay"
1317 echo "------------------------------------------------------------------"
1319 encap_params_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $enc_ethtype \
1320 $grp $src "mausezahn"
1323 encap_params_ipv6_ipv6()
1327 local vtep1_ip=2001:db8:1000::1
1328 local vtep2_ip=2001:db8:2000::1
1330 local enc_ethtype="ipv6"
1332 local src=2001:db8:100::1
1335 echo "Data path: Encapsulation parameters - IPv6 overlay / IPv6 underlay"
1336 echo "------------------------------------------------------------------"
1338 encap_params_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $enc_ethtype \
1339 $grp $src "mausezahn -6"
1342 starg_exclude_ir_common()
1346 local vtep1_ip=$1; shift
1347 local vtep2_ip=$1; shift
1348 local plen=$1; shift
1350 local valid_src=$1; shift
1351 local invalid_src=$1; shift
1354 # Install a (*, G) EXCLUDE MDB entry with one source and two remote
1355 # VTEPs. Make sure that the source in the source list is not forwarded
1356 # and that a source not in the list is forwarded. Remove one of the
1357 # VTEPs from the entry and make sure that packets are only forwarded to
1358 # the remaining VTEP.
1360 run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"
1361 run_cmd "ip -n $ns2 address replace $vtep1_ip/$plen dev lo"
1362 run_cmd "ip -n $ns2 address replace $vtep2_ip/$plen dev lo"
1364 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $vtep1_ip action pass"
1365 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 102 proto all flower enc_dst_ip $vtep2_ip action pass"
1367 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"
1368 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"
1370 # Check that invalid source is not forwarded to any VTEP.
1371 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"
1372 tc_check_packets "$ns2" "dev vx0 ingress" 101 0
1373 log_test $? 0 "Block excluded source - first VTEP"
1374 tc_check_packets "$ns2" "dev vx0 ingress" 102 0
1375 log_test $? 0 "Block excluded source - second VTEP"
1377 # Check that valid source is forwarded to both VTEPs.
1378 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"
1379 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1380 log_test $? 0 "Forward valid source - first VTEP"
1381 tc_check_packets "$ns2" "dev vx0 ingress" 102 1
1382 log_test $? 0 "Forward valid source - second VTEP"
1384 # Remove second VTEP.
1385 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep2_ip src_vni 10010"
1387 # Check that invalid source is not forwarded to any VTEP.
1388 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"
1389 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1390 log_test $? 0 "Block excluded source after removal - first VTEP"
1391 tc_check_packets "$ns2" "dev vx0 ingress" 102 1
1392 log_test $? 0 "Block excluded source after removal - second VTEP"
1394 # Check that valid source is forwarded to the remaining VTEP.
1395 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"
1396 tc_check_packets "$ns2" "dev vx0 ingress" 101 2
1397 log_test $? 0 "Forward valid source after removal - first VTEP"
1398 tc_check_packets "$ns2" "dev vx0 ingress" 102 1
1399 log_test $? 0 "Forward valid source after removal - second VTEP"
1402 starg_exclude_ir_ipv4_ipv4()
1406 local vtep1_ip=198.51.100.100
1407 local vtep2_ip=198.51.100.200
1410 local valid_src=192.0.2.129
1411 local invalid_src=192.0.2.145
1414 echo "Data path: (*, G) EXCLUDE - IR - IPv4 overlay / IPv4 underlay"
1415 echo "-------------------------------------------------------------"
1417 starg_exclude_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1418 $valid_src $invalid_src "mausezahn"
1421 starg_exclude_ir_ipv6_ipv4()
1425 local vtep1_ip=198.51.100.100
1426 local vtep2_ip=198.51.100.200
1429 local valid_src=2001:db8:100::1
1430 local invalid_src=2001:db8:200::1
1433 echo "Data path: (*, G) EXCLUDE - IR - IPv6 overlay / IPv4 underlay"
1434 echo "-------------------------------------------------------------"
1436 starg_exclude_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1437 $valid_src $invalid_src "mausezahn -6"
1440 starg_exclude_ir_ipv4_ipv6()
1444 local vtep1_ip=2001:db8:1000::1
1445 local vtep2_ip=2001:db8:2000::1
1448 local valid_src=192.0.2.129
1449 local invalid_src=192.0.2.145
1452 echo "Data path: (*, G) EXCLUDE - IR - IPv4 overlay / IPv6 underlay"
1453 echo "-------------------------------------------------------------"
1455 starg_exclude_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1456 $valid_src $invalid_src "mausezahn"
1459 starg_exclude_ir_ipv6_ipv6()
1463 local vtep1_ip=2001:db8:1000::1
1464 local vtep2_ip=2001:db8:2000::1
1467 local valid_src=2001:db8:100::1
1468 local invalid_src=2001:db8:200::1
1471 echo "Data path: (*, G) EXCLUDE - IR - IPv6 overlay / IPv6 underlay"
1472 echo "-------------------------------------------------------------"
1474 starg_exclude_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1475 $valid_src $invalid_src "mausezahn -6"
1478 starg_include_ir_common()
1482 local vtep1_ip=$1; shift
1483 local vtep2_ip=$1; shift
1484 local plen=$1; shift
1486 local valid_src=$1; shift
1487 local invalid_src=$1; shift
1490 # Install a (*, G) INCLUDE MDB entry with one source and two remote
1491 # VTEPs. Make sure that the source in the source list is forwarded and
1492 # that a source not in the list is not forwarded. Remove one of the
1493 # VTEPs from the entry and make sure that packets are only forwarded to
1494 # the remaining VTEP.
1496 run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"
1497 run_cmd "ip -n $ns2 address replace $vtep1_ip/$plen dev lo"
1498 run_cmd "ip -n $ns2 address replace $vtep2_ip/$plen dev lo"
1500 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $vtep1_ip action pass"
1501 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 102 proto all flower enc_dst_ip $vtep2_ip action pass"
1503 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"
1504 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"
1506 # Check that invalid source is not forwarded to any VTEP.
1507 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"
1508 tc_check_packets "$ns2" "dev vx0 ingress" 101 0
1509 log_test $? 0 "Block excluded source - first VTEP"
1510 tc_check_packets "$ns2" "dev vx0 ingress" 102 0
1511 log_test $? 0 "Block excluded source - second VTEP"
1513 # Check that valid source is forwarded to both VTEPs.
1514 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"
1515 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1516 log_test $? 0 "Forward valid source - first VTEP"
1517 tc_check_packets "$ns2" "dev vx0 ingress" 102 1
1518 log_test $? 0 "Forward valid source - second VTEP"
1520 # Remove second VTEP.
1521 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep2_ip src_vni 10010"
1523 # Check that invalid source is not forwarded to any VTEP.
1524 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"
1525 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1526 log_test $? 0 "Block excluded source after removal - first VTEP"
1527 tc_check_packets "$ns2" "dev vx0 ingress" 102 1
1528 log_test $? 0 "Block excluded source after removal - second VTEP"
1530 # Check that valid source is forwarded to the remaining VTEP.
1531 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"
1532 tc_check_packets "$ns2" "dev vx0 ingress" 101 2
1533 log_test $? 0 "Forward valid source after removal - first VTEP"
1534 tc_check_packets "$ns2" "dev vx0 ingress" 102 1
1535 log_test $? 0 "Forward valid source after removal - second VTEP"
1538 starg_include_ir_ipv4_ipv4()
1542 local vtep1_ip=198.51.100.100
1543 local vtep2_ip=198.51.100.200
1546 local valid_src=192.0.2.129
1547 local invalid_src=192.0.2.145
1550 echo "Data path: (*, G) INCLUDE - IR - IPv4 overlay / IPv4 underlay"
1551 echo "-------------------------------------------------------------"
1553 starg_include_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1554 $valid_src $invalid_src "mausezahn"
1557 starg_include_ir_ipv6_ipv4()
1561 local vtep1_ip=198.51.100.100
1562 local vtep2_ip=198.51.100.200
1565 local valid_src=2001:db8:100::1
1566 local invalid_src=2001:db8:200::1
1569 echo "Data path: (*, G) INCLUDE - IR - IPv6 overlay / IPv4 underlay"
1570 echo "-------------------------------------------------------------"
1572 starg_include_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1573 $valid_src $invalid_src "mausezahn -6"
1576 starg_include_ir_ipv4_ipv6()
1580 local vtep1_ip=2001:db8:1000::1
1581 local vtep2_ip=2001:db8:2000::1
1584 local valid_src=192.0.2.129
1585 local invalid_src=192.0.2.145
1588 echo "Data path: (*, G) INCLUDE - IR - IPv4 overlay / IPv6 underlay"
1589 echo "-------------------------------------------------------------"
1591 starg_include_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1592 $valid_src $invalid_src "mausezahn"
1595 starg_include_ir_ipv6_ipv6()
1599 local vtep1_ip=2001:db8:1000::1
1600 local vtep2_ip=2001:db8:2000::1
1603 local valid_src=2001:db8:100::1
1604 local invalid_src=2001:db8:200::1
1607 echo "Data path: (*, G) INCLUDE - IR - IPv6 overlay / IPv6 underlay"
1608 echo "-------------------------------------------------------------"
1610 starg_include_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1611 $valid_src $invalid_src "mausezahn -6"
1614 starg_exclude_p2mp_common()
1618 local mcast_grp=$1; shift
1619 local plen=$1; shift
1621 local valid_src=$1; shift
1622 local invalid_src=$1; shift
1625 # Install a (*, G) EXCLUDE MDB entry with one source and one multicast
1626 # group to which packets are sent. Make sure that the source in the
1627 # source list is not forwarded and that a source not in the list is
1630 run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"
1631 run_cmd "ip -n $ns2 address replace $mcast_grp/$plen dev veth0 autojoin"
1633 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $mcast_grp action pass"
1635 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"
1637 # Check that invalid source is not forwarded.
1638 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"
1639 tc_check_packets "$ns2" "dev vx0 ingress" 101 0
1640 log_test $? 0 "Block excluded source"
1642 # Check that valid source is forwarded.
1643 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"
1644 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1645 log_test $? 0 "Forward valid source"
1647 # Remove the VTEP from the multicast group.
1648 run_cmd "ip -n $ns2 address del $mcast_grp/$plen dev veth0"
1650 # Check that valid source is not received anymore.
1651 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"
1652 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1653 log_test $? 0 "Receive of valid source after removal from group"
1656 starg_exclude_p2mp_ipv4_ipv4()
1660 local mcast_grp=238.1.1.1
1663 local valid_src=192.0.2.129
1664 local invalid_src=192.0.2.145
1667 echo "Data path: (*, G) EXCLUDE - P2MP - IPv4 overlay / IPv4 underlay"
1668 echo "---------------------------------------------------------------"
1670 starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
1671 $valid_src $invalid_src "mausezahn"
1674 starg_exclude_p2mp_ipv6_ipv4()
1678 local mcast_grp=238.1.1.1
1681 local valid_src=2001:db8:100::1
1682 local invalid_src=2001:db8:200::1
1685 echo "Data path: (*, G) EXCLUDE - P2MP - IPv6 overlay / IPv4 underlay"
1686 echo "---------------------------------------------------------------"
1688 starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
1689 $valid_src $invalid_src "mausezahn -6"
1692 starg_exclude_p2mp_ipv4_ipv6()
1696 local mcast_grp=ff0e::2
1699 local valid_src=192.0.2.129
1700 local invalid_src=192.0.2.145
1703 echo "Data path: (*, G) EXCLUDE - P2MP - IPv4 overlay / IPv6 underlay"
1704 echo "---------------------------------------------------------------"
1706 starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
1707 $valid_src $invalid_src "mausezahn"
1710 starg_exclude_p2mp_ipv6_ipv6()
1714 local mcast_grp=ff0e::2
1717 local valid_src=2001:db8:100::1
1718 local invalid_src=2001:db8:200::1
1721 echo "Data path: (*, G) EXCLUDE - P2MP - IPv6 overlay / IPv6 underlay"
1722 echo "---------------------------------------------------------------"
1724 starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
1725 $valid_src $invalid_src "mausezahn -6"
1728 starg_include_p2mp_common()
1732 local mcast_grp=$1; shift
1733 local plen=$1; shift
1735 local valid_src=$1; shift
1736 local invalid_src=$1; shift
1739 # Install a (*, G) INCLUDE MDB entry with one source and one multicast
1740 # group to which packets are sent. Make sure that the source in the
1741 # source list is forwarded and that a source not in the list is not
1744 run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"
1745 run_cmd "ip -n $ns2 address replace $mcast_grp/$plen dev veth0 autojoin"
1747 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $mcast_grp action pass"
1749 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"
1751 # Check that invalid source is not forwarded.
1752 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"
1753 tc_check_packets "$ns2" "dev vx0 ingress" 101 0
1754 log_test $? 0 "Block excluded source"
1756 # Check that valid source is forwarded.
1757 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"
1758 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1759 log_test $? 0 "Forward valid source"
1761 # Remove the VTEP from the multicast group.
1762 run_cmd "ip -n $ns2 address del $mcast_grp/$plen dev veth0"
1764 # Check that valid source is not received anymore.
1765 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"
1766 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
1767 log_test $? 0 "Receive of valid source after removal from group"
1770 starg_include_p2mp_ipv4_ipv4()
1774 local mcast_grp=238.1.1.1
1777 local valid_src=192.0.2.129
1778 local invalid_src=192.0.2.145
1781 echo "Data path: (*, G) INCLUDE - P2MP - IPv4 overlay / IPv4 underlay"
1782 echo "---------------------------------------------------------------"
1784 starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
1785 $valid_src $invalid_src "mausezahn"
1788 starg_include_p2mp_ipv6_ipv4()
1792 local mcast_grp=238.1.1.1
1795 local valid_src=2001:db8:100::1
1796 local invalid_src=2001:db8:200::1
1799 echo "Data path: (*, G) INCLUDE - P2MP - IPv6 overlay / IPv4 underlay"
1800 echo "---------------------------------------------------------------"
1802 starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
1803 $valid_src $invalid_src "mausezahn -6"
1806 starg_include_p2mp_ipv4_ipv6()
1810 local mcast_grp=ff0e::2
1813 local valid_src=192.0.2.129
1814 local invalid_src=192.0.2.145
1817 echo "Data path: (*, G) INCLUDE - P2MP - IPv4 overlay / IPv6 underlay"
1818 echo "---------------------------------------------------------------"
1820 starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
1821 $valid_src $invalid_src "mausezahn"
1824 starg_include_p2mp_ipv6_ipv6()
1828 local mcast_grp=ff0e::2
1831 local valid_src=2001:db8:100::1
1832 local invalid_src=2001:db8:200::1
1835 echo "Data path: (*, G) INCLUDE - P2MP - IPv6 overlay / IPv6 underlay"
1836 echo "---------------------------------------------------------------"
1838 starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
1839 $valid_src $invalid_src "mausezahn -6"
1842 egress_vni_translation_common()
1846 local mcast_grp=$1; shift
1847 local plen=$1; shift
1848 local proto=$1; shift
1853 # When P2MP tunnels are used with optimized inter-subnet multicast
1854 # (OISM) [1], the ingress VTEP does not perform VNI translation and
1855 # uses the VNI of the source broadcast domain (BD). If the egress VTEP
1856 # is a member in the source BD, then no VNI translation is needed.
1857 # Otherwise, the egress VTEP needs to translate the VNI to the
1858 # supplementary broadcast domain (SBD) VNI, which is usually the L3VNI.
1860 # In this test, remove the VTEP in the second namespace from VLAN 10
1861 # (VNI 10010) and make sure that a packet sent from this VLAN on the
1862 # first VTEP is received by the SVI corresponding to the L3VNI (14000 /
1863 # VLAN 4000) on the second VTEP.
1865 # The second VTEP will be able to decapsulate the packet with VNI 10010
1866 # because this VNI is configured on its shared VXLAN device. Later,
1867 # when ingressing the bridge, the VNI to VLAN lookup will fail because
1868 # the VTEP is not a member in VLAN 10, which will cause the packet to
1869 # be tagged with VLAN 4000 since it is configured as PVID.
1871 # [1] https://datatracker.ietf.org/doc/html/draft-ietf-bess-evpn-irb-mcast
1873 run_cmd "tc -n $ns2 qdisc replace dev br0.4000 clsact"
1874 run_cmd "ip -n $ns2 address replace $mcast_grp/$plen dev veth0 autojoin"
1875 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"
1877 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp src $src permanent dst $mcast_grp src_vni 10010 via veth0"
1879 # Remove the second VTEP from VLAN 10.
1880 run_cmd "bridge -n $ns2 vlan del vid 10 dev vx0"
1882 # Make sure that packets sent from the first VTEP over VLAN 10 are
1883 # received by the SVI corresponding to the L3VNI (14000 / VLAN 4000) on
1884 # the second VTEP, since it is configured as PVID.
1885 run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1886 tc_check_packets "$ns2" "dev br0.4000 ingress" 101 1
1887 log_test $? 0 "Egress VNI translation - PVID configured"
1889 # Remove PVID flag from VLAN 4000 on the second VTEP and make sure
1890 # packets are no longer received by the SVI interface.
1891 run_cmd "bridge -n $ns2 vlan add vid 4000 dev vx0"
1892 run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1893 tc_check_packets "$ns2" "dev br0.4000 ingress" 101 1
1894 log_test $? 0 "Egress VNI translation - no PVID configured"
1896 # Reconfigure the PVID and make sure packets are received again.
1897 run_cmd "bridge -n $ns2 vlan add vid 4000 dev vx0 pvid"
1898 run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
1899 tc_check_packets "$ns2" "dev br0.4000 ingress" 101 2
1900 log_test $? 0 "Egress VNI translation - PVID reconfigured"
1903 egress_vni_translation_ipv4_ipv4()
1907 local mcast_grp=238.1.1.1
1911 local src=192.0.2.129
1914 echo "Data path: Egress VNI translation - IPv4 overlay / IPv4 underlay"
1915 echo "----------------------------------------------------------------"
1917 egress_vni_translation_common $ns1 $ns2 $mcast_grp $plen $proto $grp \
1921 egress_vni_translation_ipv6_ipv4()
1925 local mcast_grp=238.1.1.1
1929 local src=2001:db8:100::1
1932 echo "Data path: Egress VNI translation - IPv6 overlay / IPv4 underlay"
1933 echo "----------------------------------------------------------------"
1935 egress_vni_translation_common $ns1 $ns2 $mcast_grp $plen $proto $grp \
1939 egress_vni_translation_ipv4_ipv6()
1943 local mcast_grp=ff0e::2
1947 local src=192.0.2.129
1950 echo "Data path: Egress VNI translation - IPv4 overlay / IPv6 underlay"
1951 echo "----------------------------------------------------------------"
1953 egress_vni_translation_common $ns1 $ns2 $mcast_grp $plen $proto $grp \
1957 egress_vni_translation_ipv6_ipv6()
1961 local mcast_grp=ff0e::2
1965 local src=2001:db8:100::1
1968 echo "Data path: Egress VNI translation - IPv6 overlay / IPv6 underlay"
1969 echo "----------------------------------------------------------------"
1971 egress_vni_translation_common $ns1 $ns2 $mcast_grp $plen $proto $grp \
1975 all_zeros_mdb_common()
1979 local vtep1_ip=$1; shift
1980 local vtep2_ip=$1; shift
1981 local vtep3_ip=$1; shift
1982 local vtep4_ip=$1; shift
1983 local plen=$1; shift
1984 local ipv4_grp=239.1.1.1
1985 local ipv4_unreg_grp=239.2.2.2
1986 local ipv4_ll_grp=224.0.0.100
1987 local ipv4_src=192.0.2.129
1988 local ipv6_grp=ff0e::1
1989 local ipv6_unreg_grp=ff0e::2
1990 local ipv6_ll_grp=ff02::1
1991 local ipv6_src=2001:db8:100::1
1993 # Install all-zeros (catchall) MDB entries for IPv4 and IPv6 traffic
1994 # and make sure they only forward unregistered IP multicast traffic
1995 # which is not link-local. Also make sure that each entry only forwards
1996 # traffic from the matching address family.
1998 # Associate two different VTEPs with one all-zeros MDB entry: Two with
1999 # the IPv4 entry (0.0.0.0) and another two with the IPv6 one (::).
2000 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp 0.0.0.0 permanent dst $vtep1_ip src_vni 10010"
2001 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp 0.0.0.0 permanent dst $vtep2_ip src_vni 10010"
2002 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp :: permanent dst $vtep3_ip src_vni 10010"
2003 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp :: permanent dst $vtep4_ip src_vni 10010"
2005 # Associate one VTEP from each set with a regular MDB entry: One with
2006 # an IPv4 entry and another with an IPv6 one.
2007 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $ipv4_grp permanent dst $vtep1_ip src_vni 10010"
2008 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $ipv6_grp permanent dst $vtep3_ip src_vni 10010"
2010 # Add filters to match on decapsulated traffic in the second namespace.
2011 run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"
2012 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $vtep1_ip action pass"
2013 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 102 proto all flower enc_dst_ip $vtep2_ip action pass"
2014 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 103 proto all flower enc_dst_ip $vtep3_ip action pass"
2015 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 104 proto all flower enc_dst_ip $vtep4_ip action pass"
2017 # Configure the VTEP addresses in the second namespace to enable
2019 run_cmd "ip -n $ns2 address replace $vtep1_ip/$plen dev lo"
2020 run_cmd "ip -n $ns2 address replace $vtep2_ip/$plen dev lo"
2021 run_cmd "ip -n $ns2 address replace $vtep3_ip/$plen dev lo"
2022 run_cmd "ip -n $ns2 address replace $vtep4_ip/$plen dev lo"
2024 # Send registered IPv4 multicast and make sure it only arrives to the
2026 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"
2027 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
2028 log_test $? 0 "Registered IPv4 multicast - first VTEP"
2029 tc_check_packets "$ns2" "dev vx0 ingress" 102 0
2030 log_test $? 0 "Registered IPv4 multicast - second VTEP"
2032 # Send unregistered IPv4 multicast that is not link-local and make sure
2033 # it arrives to the first and second VTEPs.
2034 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"
2035 tc_check_packets "$ns2" "dev vx0 ingress" 101 2
2036 log_test $? 0 "Unregistered IPv4 multicast - first VTEP"
2037 tc_check_packets "$ns2" "dev vx0 ingress" 102 1
2038 log_test $? 0 "Unregistered IPv4 multicast - second VTEP"
2040 # Send IPv4 link-local multicast traffic and make sure it does not
2041 # arrive to any VTEP.
2042 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"
2043 tc_check_packets "$ns2" "dev vx0 ingress" 101 2
2044 log_test $? 0 "Link-local IPv4 multicast - first VTEP"
2045 tc_check_packets "$ns2" "dev vx0 ingress" 102 1
2046 log_test $? 0 "Link-local IPv4 multicast - second VTEP"
2048 # Send registered IPv4 multicast using a unicast MAC address and make
2049 # sure it does not arrive to any VTEP.
2050 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"
2051 tc_check_packets "$ns2" "dev vx0 ingress" 101 2
2052 log_test $? 0 "Registered IPv4 multicast with a unicast MAC - first VTEP"
2053 tc_check_packets "$ns2" "dev vx0 ingress" 102 1
2054 log_test $? 0 "Registered IPv4 multicast with a unicast MAC - second VTEP"
2056 # Send registered IPv4 multicast using a broadcast MAC address and make
2057 # sure it does not arrive to any VTEP.
2058 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"
2059 tc_check_packets "$ns2" "dev vx0 ingress" 101 2
2060 log_test $? 0 "Registered IPv4 multicast with a broadcast MAC - first VTEP"
2061 tc_check_packets "$ns2" "dev vx0 ingress" 102 1
2062 log_test $? 0 "Registered IPv4 multicast with a broadcast MAC - second VTEP"
2064 # Make sure IPv4 traffic did not reach the VTEPs associated with
2066 tc_check_packets "$ns2" "dev vx0 ingress" 103 0
2067 log_test $? 0 "IPv4 traffic - third VTEP"
2068 tc_check_packets "$ns2" "dev vx0 ingress" 104 0
2069 log_test $? 0 "IPv4 traffic - fourth VTEP"
2071 # Reset IPv4 filters before testing IPv6 traffic.
2072 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $vtep1_ip action pass"
2073 run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 102 proto all flower enc_dst_ip $vtep2_ip action pass"
2075 # Send registered IPv6 multicast and make sure it only arrives to the
2077 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"
2078 tc_check_packets "$ns2" "dev vx0 ingress" 103 1
2079 log_test $? 0 "Registered IPv6 multicast - third VTEP"
2080 tc_check_packets "$ns2" "dev vx0 ingress" 104 0
2081 log_test $? 0 "Registered IPv6 multicast - fourth VTEP"
2083 # Send unregistered IPv6 multicast that is not link-local and make sure
2084 # it arrives to the third and fourth VTEPs.
2085 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"
2086 tc_check_packets "$ns2" "dev vx0 ingress" 103 2
2087 log_test $? 0 "Unregistered IPv6 multicast - third VTEP"
2088 tc_check_packets "$ns2" "dev vx0 ingress" 104 1
2089 log_test $? 0 "Unregistered IPv6 multicast - fourth VTEP"
2091 # Send IPv6 link-local multicast traffic and make sure it does not
2092 # arrive to any VTEP.
2093 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"
2094 tc_check_packets "$ns2" "dev vx0 ingress" 103 2
2095 log_test $? 0 "Link-local IPv6 multicast - third VTEP"
2096 tc_check_packets "$ns2" "dev vx0 ingress" 104 1
2097 log_test $? 0 "Link-local IPv6 multicast - fourth VTEP"
2099 # Send registered IPv6 multicast using a unicast MAC address and make
2100 # sure it does not arrive to any VTEP.
2101 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"
2102 tc_check_packets "$ns2" "dev vx0 ingress" 103 2
2103 log_test $? 0 "Registered IPv6 multicast with a unicast MAC - third VTEP"
2104 tc_check_packets "$ns2" "dev vx0 ingress" 104 1
2105 log_test $? 0 "Registered IPv6 multicast with a unicast MAC - fourth VTEP"
2107 # Send registered IPv6 multicast using a broadcast MAC address and make
2108 # sure it does not arrive to any VTEP.
2109 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"
2110 tc_check_packets "$ns2" "dev vx0 ingress" 103 2
2111 log_test $? 0 "Registered IPv6 multicast with a broadcast MAC - third VTEP"
2112 tc_check_packets "$ns2" "dev vx0 ingress" 104 1
2113 log_test $? 0 "Registered IPv6 multicast with a broadcast MAC - fourth VTEP"
2115 # Make sure IPv6 traffic did not reach the VTEPs associated with
2117 tc_check_packets "$ns2" "dev vx0 ingress" 101 0
2118 log_test $? 0 "IPv6 traffic - first VTEP"
2119 tc_check_packets "$ns2" "dev vx0 ingress" 102 0
2120 log_test $? 0 "IPv6 traffic - second VTEP"
2123 all_zeros_mdb_ipv4()
2127 local vtep1_ip=198.51.100.101
2128 local vtep2_ip=198.51.100.102
2129 local vtep3_ip=198.51.100.103
2130 local vtep4_ip=198.51.100.104
2134 echo "Data path: All-zeros MDB entry - IPv4 underlay"
2135 echo "----------------------------------------------"
2137 all_zeros_mdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $vtep3_ip \
2141 all_zeros_mdb_ipv6()
2145 local vtep1_ip=2001:db8:1000::1
2146 local vtep2_ip=2001:db8:2000::1
2147 local vtep3_ip=2001:db8:3000::1
2148 local vtep4_ip=2001:db8:4000::1
2152 echo "Data path: All-zeros MDB entry - IPv6 underlay"
2153 echo "----------------------------------------------"
2155 all_zeros_mdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $vtep3_ip \
2163 local vtep1_ip=$1; shift
2164 local vtep2_ip=$1; shift
2165 local plen=$1; shift
2166 local proto=$1; shift
2171 # Install an MDB entry and an FDB entry and make sure that the FDB
2172 # entry only forwards traffic that was not forwarded by the MDB.
2174 # Associate the MDB entry with one VTEP and the FDB entry with another
2176 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip src_vni 10010"
2177 run_cmd "bridge -n $ns1 fdb add 00:00:00:00:00:00 dev vx0 self static dst $vtep2_ip src_vni 10010"
2179 # Add filters to match on decapsulated traffic in the second namespace.
2180 run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"
2181 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"
2182 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"
2184 # Configure the VTEP addresses in the second namespace to enable
2186 run_cmd "ip -n $ns2 address replace $vtep1_ip/$plen dev lo"
2187 run_cmd "ip -n $ns2 address replace $vtep2_ip/$plen dev lo"
2189 # Send IP multicast traffic and make sure it is forwarded by the MDB
2190 # and only arrives to the first VTEP.
2191 run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
2192 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
2193 log_test $? 0 "IP multicast - first VTEP"
2194 tc_check_packets "$ns2" "dev vx0 ingress" 102 0
2195 log_test $? 0 "IP multicast - second VTEP"
2197 # Send broadcast traffic and make sure it is forwarded by the FDB and
2198 # only arrives to the second VTEP.
2199 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"
2200 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
2201 log_test $? 0 "Broadcast - first VTEP"
2202 tc_check_packets "$ns2" "dev vx0 ingress" 102 1
2203 log_test $? 0 "Broadcast - second VTEP"
2205 # Remove the MDB entry and make sure that IP multicast is now forwarded
2206 # by the FDB to the second VTEP.
2207 run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10010"
2208 run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
2209 tc_check_packets "$ns2" "dev vx0 ingress" 101 1
2210 log_test $? 0 "IP multicast after removal - first VTEP"
2211 tc_check_packets "$ns2" "dev vx0 ingress" 102 2
2212 log_test $? 0 "IP multicast after removal - second VTEP"
2219 local vtep1_ip=198.51.100.100
2220 local vtep2_ip=198.51.100.200
2224 local src=192.0.2.129
2227 echo "Data path: MDB with FDB - IPv4 overlay / IPv4 underlay"
2228 echo "------------------------------------------------------"
2230 mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp $src \
2238 local vtep1_ip=198.51.100.100
2239 local vtep2_ip=198.51.100.200
2243 local src=2001:db8:100::1
2246 echo "Data path: MDB with FDB - IPv6 overlay / IPv4 underlay"
2247 echo "------------------------------------------------------"
2249 mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp $src \
2257 local vtep1_ip=2001:db8:1000::1
2258 local vtep2_ip=2001:db8:2000::1
2262 local src=192.0.2.129
2265 echo "Data path: MDB with FDB - IPv4 overlay / IPv6 underlay"
2266 echo "------------------------------------------------------"
2268 mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp $src \
2276 local vtep1_ip=2001:db8:1000::1
2277 local vtep2_ip=2001:db8:2000::1
2281 local src=2001:db8:100::1
2284 echo "Data path: MDB with FDB - IPv6 overlay / IPv6 underlay"
2285 echo "------------------------------------------------------"
2287 mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp $src \
2294 local vtep1_ip=$1; shift
2295 local grp1=$1; shift
2298 bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp1 dst $vtep1_ip src_vni 10010
2299 bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp1 permanent dst $vtep1_ip src_vni 10010
2300 done >/dev/null 2>&1
2306 local vtep1_ip=$1; shift
2307 local vtep2_ip=$1; shift
2308 local grp2=$1; shift
2311 bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp2 dst $vtep1_ip src_vni 10010
2312 bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp2 permanent dst $vtep1_ip src_vni 10010
2313 bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp2 permanent dst $vtep2_ip src_vni 10010
2314 done >/dev/null 2>&1
2317 mdb_torture_common()
2320 local vtep1_ip=$1; shift
2321 local vtep2_ip=$1; shift
2322 local grp1=$1; shift
2323 local grp2=$1; shift
2331 # Continuously send two streams that are forwarded by two different MDB
2332 # entries. The first entry will be added and deleted in a loop. This
2333 # allows us to test that the data path does not use freed MDB entry
2334 # memory. The second entry will have two remotes, one that is added and
2335 # deleted in a loop and another that is replaced in a loop. This allows
2336 # us to test that the data path does not use freed remote entry memory.
2337 # The test is considered successful if nothing crashed.
2339 # Create the MDB entries that will be continuously deleted / replaced.
2340 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp1 permanent dst $vtep1_ip src_vni 10010"
2341 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp2 permanent dst $vtep1_ip src_vni 10010"
2342 run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp2 permanent dst $vtep2_ip src_vni 10010"
2344 mdb_grp1_loop $ns1 $vtep1_ip $grp1 &
2346 mdb_grp2_loop $ns1 $vtep1_ip $vtep2_ip $grp2 &
2348 ip netns exec $ns1 $mz br0.10 -A $src -B $grp1 -t udp sp=12345,dp=54321 -p 100 -c 0 -q &
2350 ip netns exec $ns1 $mz br0.10 -A $src -B $grp2 -t udp sp=12345,dp=54321 -p 100 -c 0 -q &
2354 kill -9 $pid1 $pid2 $pid3 $pid4
2355 wait $pid1 $pid2 $pid3 $pid4 2>/dev/null
2357 log_test 0 0 "Torture test"
2360 mdb_torture_ipv4_ipv4()
2363 local vtep1_ip=198.51.100.100
2364 local vtep2_ip=198.51.100.200
2365 local grp1=239.1.1.1
2366 local grp2=239.2.2.2
2367 local src=192.0.2.129
2370 echo "Data path: MDB torture test - IPv4 overlay / IPv4 underlay"
2371 echo "----------------------------------------------------------"
2373 mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp2 $src \
2377 mdb_torture_ipv6_ipv4()
2380 local vtep1_ip=198.51.100.100
2381 local vtep2_ip=198.51.100.200
2384 local src=2001:db8:100::1
2387 echo "Data path: MDB torture test - IPv6 overlay / IPv4 underlay"
2388 echo "----------------------------------------------------------"
2390 mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp2 $src \
2394 mdb_torture_ipv4_ipv6()
2397 local vtep1_ip=2001:db8:1000::1
2398 local vtep2_ip=2001:db8:2000::1
2399 local grp1=239.1.1.1
2400 local grp2=239.2.2.2
2401 local src=192.0.2.129
2404 echo "Data path: MDB torture test - IPv4 overlay / IPv6 underlay"
2405 echo "----------------------------------------------------------"
2407 mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp2 $src \
2411 mdb_torture_ipv6_ipv6()
2414 local vtep1_ip=2001:db8:1000::1
2415 local vtep2_ip=2001:db8:2000::1
2418 local src=2001:db8:100::1
2421 echo "Data path: MDB torture test - IPv6 overlay / IPv6 underlay"
2422 echo "----------------------------------------------------------"
2424 mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp2 $src \
2428 ################################################################################
2434 usage: ${0##*/} OPTS
2436 -t <test> Test(s) to run (default: all)
2438 -c Control path tests only
2439 -d Data path tests only
2441 -P Pause after each test before cleanup
2442 -v Verbose mode (show commands and output)
2446 ################################################################################
2451 while getopts ":t:cdpPvh" opt; do
2454 c) TESTS=${CONTROL_PATH_TESTS};;
2455 d) TESTS=${DATA_PATH_TESTS};;
2456 p) PAUSE_ON_FAIL=yes;;
2458 v) VERBOSE=$(($VERBOSE + 1));;
2464 # Make sure we don't pause twice.
2465 [ "${PAUSE}" = "yes" ] && PAUSE_ON_FAIL=no
2467 if [ "$(id -u)" -ne 0 ];then
2468 echo "SKIP: Need root privileges"
2472 if [ ! -x "$(command -v ip)" ]; then
2473 echo "SKIP: Could not run test without ip tool"
2477 if [ ! -x "$(command -v bridge)" ]; then
2478 echo "SKIP: Could not run test without bridge tool"
2482 if [ ! -x "$(command -v mausezahn)" ]; then
2483 echo "SKIP: Could not run test without mausezahn tool"
2487 if [ ! -x "$(command -v jq)" ]; then
2488 echo "SKIP: Could not run test without jq tool"
2492 bridge mdb help 2>&1 | grep -q "flush"
2493 if [ $? -ne 0 ]; then
2494 echo "SKIP: iproute2 bridge too old, missing VXLAN MDB flush support"
2506 if [ "$TESTS" != "none" ]; then
2507 printf "\nTests passed: %3d\n" ${nsuccess}
2508 printf "Tests failed: %3d\n" ${nfail}