selftests/net: change shebang to bash to support "source"
[platform/kernel/linux-starfive.git] / tools / testing / selftests / net / test_vxlan_mdb.sh
1 #!/bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 #
4 # This test is for checking VXLAN MDB functionality. The topology consists of
5 # two sets of namespaces: One for the testing of IPv4 underlay and another for
6 # IPv6. In both cases, both IPv4 and IPv6 overlay traffic are tested.
7 #
8 # Data path functionality is tested by sending traffic from one of the upper
9 # namespaces and checking using ingress tc filters that the expected traffic
10 # was received by one of the lower namespaces.
11 #
12 # +------------------------------------+ +------------------------------------+
13 # | ns1_v4                             | | ns1_v6                             |
14 # |                                    | |                                    |
15 # |    br0.10    br0.4000  br0.20      | |    br0.10    br0.4000  br0.20      |
16 # |       +         +         +        | |       +         +         +        |
17 # |       |         |         |        | |       |         |         |        |
18 # |       |         |         |        | |       |         |         |        |
19 # |       +---------+---------+        | |       +---------+---------+        |
20 # |                 |                  | |                 |                  |
21 # |                 |                  | |                 |                  |
22 # |                 +                  | |                 +                  |
23 # |                br0                 | |                br0                 |
24 # |                 +                  | |                 +                  |
25 # |                 |                  | |                 |                  |
26 # |                 |                  | |                 |                  |
27 # |                 +                  | |                 +                  |
28 # |                vx0                 | |                vx0                 |
29 # |                                    | |                                    |
30 # |                                    | |                                    |
31 # |               veth0                | |               veth0                |
32 # |                 +                  | |                 +                  |
33 # +-----------------|------------------+ +-----------------|------------------+
34 #                   |                                      |
35 # +-----------------|------------------+ +-----------------|------------------+
36 # |                 +                  | |                 +                  |
37 # |               veth0                | |               veth0                |
38 # |                                    | |                                    |
39 # |                                    | |                                    |
40 # |                vx0                 | |                vx0                 |
41 # |                 +                  | |                 +                  |
42 # |                 |                  | |                 |                  |
43 # |                 |                  | |                 |                  |
44 # |                 +                  | |                 +                  |
45 # |                br0                 | |                br0                 |
46 # |                 +                  | |                 +                  |
47 # |                 |                  | |                 |                  |
48 # |                 |                  | |                 |                  |
49 # |       +---------+---------+        | |       +---------+---------+        |
50 # |       |         |         |        | |       |         |         |        |
51 # |       |         |         |        | |       |         |         |        |
52 # |       +         +         +        | |       +         +         +        |
53 # |    br0.10    br0.4000  br0.10      | |    br0.10    br0.4000  br0.20      |
54 # |                                    | |                                    |
55 # | ns2_v4                             | | ns2_v6                             |
56 # +------------------------------------+ +------------------------------------+
57
58 ret=0
59 # Kselftest framework requirement - SKIP code is 4.
60 ksft_skip=4
61
62 CONTROL_PATH_TESTS="
63         basic_star_g_ipv4_ipv4
64         basic_star_g_ipv6_ipv4
65         basic_star_g_ipv4_ipv6
66         basic_star_g_ipv6_ipv6
67         basic_sg_ipv4_ipv4
68         basic_sg_ipv6_ipv4
69         basic_sg_ipv4_ipv6
70         basic_sg_ipv6_ipv6
71         star_g_ipv4_ipv4
72         star_g_ipv6_ipv4
73         star_g_ipv4_ipv6
74         star_g_ipv6_ipv6
75         sg_ipv4_ipv4
76         sg_ipv6_ipv4
77         sg_ipv4_ipv6
78         sg_ipv6_ipv6
79         dump_ipv4_ipv4
80         dump_ipv6_ipv4
81         dump_ipv4_ipv6
82         dump_ipv6_ipv6
83 "
84
85 DATA_PATH_TESTS="
86         encap_params_ipv4_ipv4
87         encap_params_ipv6_ipv4
88         encap_params_ipv4_ipv6
89         encap_params_ipv6_ipv6
90         starg_exclude_ir_ipv4_ipv4
91         starg_exclude_ir_ipv6_ipv4
92         starg_exclude_ir_ipv4_ipv6
93         starg_exclude_ir_ipv6_ipv6
94         starg_include_ir_ipv4_ipv4
95         starg_include_ir_ipv6_ipv4
96         starg_include_ir_ipv4_ipv6
97         starg_include_ir_ipv6_ipv6
98         starg_exclude_p2mp_ipv4_ipv4
99         starg_exclude_p2mp_ipv6_ipv4
100         starg_exclude_p2mp_ipv4_ipv6
101         starg_exclude_p2mp_ipv6_ipv6
102         starg_include_p2mp_ipv4_ipv4
103         starg_include_p2mp_ipv6_ipv4
104         starg_include_p2mp_ipv4_ipv6
105         starg_include_p2mp_ipv6_ipv6
106         egress_vni_translation_ipv4_ipv4
107         egress_vni_translation_ipv6_ipv4
108         egress_vni_translation_ipv4_ipv6
109         egress_vni_translation_ipv6_ipv6
110         all_zeros_mdb_ipv4
111         all_zeros_mdb_ipv6
112         mdb_fdb_ipv4_ipv4
113         mdb_fdb_ipv6_ipv4
114         mdb_fdb_ipv4_ipv6
115         mdb_fdb_ipv6_ipv6
116         mdb_torture_ipv4_ipv4
117         mdb_torture_ipv6_ipv4
118         mdb_torture_ipv4_ipv6
119         mdb_torture_ipv6_ipv6
120 "
121
122 # All tests in this script. Can be overridden with -t option.
123 TESTS="
124         $CONTROL_PATH_TESTS
125         $DATA_PATH_TESTS
126 "
127 VERBOSE=0
128 PAUSE_ON_FAIL=no
129 PAUSE=no
130
131 ################################################################################
132 # Utilities
133
134 log_test()
135 {
136         local rc=$1
137         local expected=$2
138         local msg="$3"
139
140         if [ ${rc} -eq ${expected} ]; then
141                 printf "TEST: %-60s  [ OK ]\n" "${msg}"
142                 nsuccess=$((nsuccess+1))
143         else
144                 ret=1
145                 nfail=$((nfail+1))
146                 printf "TEST: %-60s  [FAIL]\n" "${msg}"
147                 if [ "$VERBOSE" = "1" ]; then
148                         echo "    rc=$rc, expected $expected"
149                 fi
150
151                 if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
152                 echo
153                         echo "hit enter to continue, 'q' to quit"
154                         read a
155                         [ "$a" = "q" ] && exit 1
156                 fi
157         fi
158
159         if [ "${PAUSE}" = "yes" ]; then
160                 echo
161                 echo "hit enter to continue, 'q' to quit"
162                 read a
163                 [ "$a" = "q" ] && exit 1
164         fi
165
166         [ "$VERBOSE" = "1" ] && echo
167 }
168
169 run_cmd()
170 {
171         local cmd="$1"
172         local out
173         local stderr="2>/dev/null"
174
175         if [ "$VERBOSE" = "1" ]; then
176                 printf "COMMAND: $cmd\n"
177                 stderr=
178         fi
179
180         out=$(eval $cmd $stderr)
181         rc=$?
182         if [ "$VERBOSE" = "1" -a -n "$out" ]; then
183                 echo "    $out"
184         fi
185
186         return $rc
187 }
188
189 tc_check_packets()
190 {
191         local ns=$1; shift
192         local id=$1; shift
193         local handle=$1; shift
194         local count=$1; shift
195         local pkts
196
197         sleep 0.1
198         pkts=$(tc -n $ns -j -s filter show $id \
199                 | jq ".[] | select(.options.handle == $handle) | \
200                 .options.actions[0].stats.packets")
201         [[ $pkts == $count ]]
202 }
203
204 ################################################################################
205 # Setup
206
207 setup_common_ns()
208 {
209         local ns=$1; shift
210         local local_addr=$1; shift
211
212         ip netns exec $ns sysctl -qw net.ipv4.ip_forward=1
213         ip netns exec $ns sysctl -qw net.ipv4.fib_multipath_use_neigh=1
214         ip netns exec $ns sysctl -qw net.ipv4.conf.default.ignore_routes_with_linkdown=1
215         ip netns exec $ns sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1
216         ip netns exec $ns sysctl -qw net.ipv6.conf.all.forwarding=1
217         ip netns exec $ns sysctl -qw net.ipv6.conf.default.forwarding=1
218         ip netns exec $ns sysctl -qw net.ipv6.conf.default.ignore_routes_with_linkdown=1
219         ip netns exec $ns sysctl -qw net.ipv6.conf.all.accept_dad=0
220         ip netns exec $ns sysctl -qw net.ipv6.conf.default.accept_dad=0
221
222         ip -n $ns link set dev lo up
223         ip -n $ns address add $local_addr dev lo
224
225         ip -n $ns link set dev veth0 up
226
227         ip -n $ns link add name br0 up type bridge vlan_filtering 1 \
228                 vlan_default_pvid 0 mcast_snooping 0
229
230         ip -n $ns link add link br0 name br0.10 up type vlan id 10
231         bridge -n $ns vlan add vid 10 dev br0 self
232
233         ip -n $ns link add link br0 name br0.20 up type vlan id 20
234         bridge -n $ns vlan add vid 20 dev br0 self
235
236         ip -n $ns link add link br0 name br0.4000 up type vlan id 4000
237         bridge -n $ns vlan add vid 4000 dev br0 self
238
239         ip -n $ns link add name vx0 up master br0 type vxlan \
240                 local $local_addr dstport 4789 external vnifilter
241         bridge -n $ns link set dev vx0 vlan_tunnel on
242
243         bridge -n $ns vlan add vid 10 dev vx0
244         bridge -n $ns vlan add vid 10 dev vx0 tunnel_info id 10010
245         bridge -n $ns vni add vni 10010 dev vx0
246
247         bridge -n $ns vlan add vid 20 dev vx0
248         bridge -n $ns vlan add vid 20 dev vx0 tunnel_info id 10020
249         bridge -n $ns vni add vni 10020 dev vx0
250
251         bridge -n $ns vlan add vid 4000 dev vx0 pvid
252         bridge -n $ns vlan add vid 4000 dev vx0 tunnel_info id 14000
253         bridge -n $ns vni add vni 14000 dev vx0
254 }
255
256 setup_common()
257 {
258         local ns1=$1; shift
259         local ns2=$1; shift
260         local local_addr1=$1; shift
261         local local_addr2=$1; shift
262
263         ip netns add $ns1
264         ip netns add $ns2
265
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
269
270         setup_common_ns $ns1 $local_addr1
271         setup_common_ns $ns2 $local_addr2
272 }
273
274 setup_v4()
275 {
276         setup_common ns1_v4 ns2_v4 192.0.2.1 192.0.2.2
277
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
280
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
283 }
284
285 cleanup_v4()
286 {
287         ip netns del ns2_v4
288         ip netns del ns1_v4
289 }
290
291 setup_v6()
292 {
293         setup_common ns1_v6 ns2_v6 2001:db8:1::1 2001:db8:1::2
294
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
297
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
300 }
301
302 cleanup_v6()
303 {
304         ip netns del ns2_v6
305         ip netns del ns1_v6
306 }
307
308 setup()
309 {
310         set -e
311
312         setup_v4
313         setup_v6
314
315         sleep 5
316
317         set +e
318 }
319
320 cleanup()
321 {
322         cleanup_v6 &> /dev/null
323         cleanup_v4 &> /dev/null
324 }
325
326 ################################################################################
327 # Tests - Control path
328
329 basic_common()
330 {
331         local ns1=$1; shift
332         local grp_key=$1; shift
333         local vtep_ip=$1; shift
334
335         # Test basic control path operations common to all MDB entry types.
336
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"
342
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"
347
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"
352
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"
355
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"
360
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"
364
365         run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
366
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"
371
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"
375
376         run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
377
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"
382
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"
386
387         run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
388
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"
393
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"
397
398         run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
399
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"
403
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"
406
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"
409
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"
412
413         run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent"
414         log_test $? 255 "MDB entry without extended parameters"
415
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"
418
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"
421
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"
424
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"
427
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"
432 }
433
434 basic_star_g_ipv4_ipv4()
435 {
436         local ns1=ns1_v4
437         local grp_key="grp 239.1.1.1"
438         local vtep_ip=198.51.100.100
439
440         echo
441         echo "Control path: Basic (*, G) operations - IPv4 overlay / IPv4 underlay"
442         echo "--------------------------------------------------------------------"
443
444         basic_common $ns1 "$grp_key" $vtep_ip
445 }
446
447 basic_star_g_ipv6_ipv4()
448 {
449         local ns1=ns1_v4
450         local grp_key="grp ff0e::1"
451         local vtep_ip=198.51.100.100
452
453         echo
454         echo "Control path: Basic (*, G) operations - IPv6 overlay / IPv4 underlay"
455         echo "--------------------------------------------------------------------"
456
457         basic_common $ns1 "$grp_key" $vtep_ip
458 }
459
460 basic_star_g_ipv4_ipv6()
461 {
462         local ns1=ns1_v6
463         local grp_key="grp 239.1.1.1"
464         local vtep_ip=2001:db8:1000::1
465
466         echo
467         echo "Control path: Basic (*, G) operations - IPv4 overlay / IPv6 underlay"
468         echo "--------------------------------------------------------------------"
469
470         basic_common $ns1 "$grp_key" $vtep_ip
471 }
472
473 basic_star_g_ipv6_ipv6()
474 {
475         local ns1=ns1_v6
476         local grp_key="grp ff0e::1"
477         local vtep_ip=2001:db8:1000::1
478
479         echo
480         echo "Control path: Basic (*, G) operations - IPv6 overlay / IPv6 underlay"
481         echo "--------------------------------------------------------------------"
482
483         basic_common $ns1 "$grp_key" $vtep_ip
484 }
485
486 basic_sg_ipv4_ipv4()
487 {
488         local ns1=ns1_v4
489         local grp_key="grp 239.1.1.1 src 192.0.2.129"
490         local vtep_ip=198.51.100.100
491
492         echo
493         echo "Control path: Basic (S, G) operations - IPv4 overlay / IPv4 underlay"
494         echo "--------------------------------------------------------------------"
495
496         basic_common $ns1 "$grp_key" $vtep_ip
497 }
498
499 basic_sg_ipv6_ipv4()
500 {
501         local ns1=ns1_v4
502         local grp_key="grp ff0e::1 src 2001:db8:100::1"
503         local vtep_ip=198.51.100.100
504
505         echo
506         echo "Control path: Basic (S, G) operations - IPv6 overlay / IPv4 underlay"
507         echo "---------------------------------------------------------------------"
508
509         basic_common $ns1 "$grp_key" $vtep_ip
510 }
511
512 basic_sg_ipv4_ipv6()
513 {
514         local ns1=ns1_v6
515         local grp_key="grp 239.1.1.1 src 192.0.2.129"
516         local vtep_ip=2001:db8:1000::1
517
518         echo
519         echo "Control path: Basic (S, G) operations - IPv4 overlay / IPv6 underlay"
520         echo "--------------------------------------------------------------------"
521
522         basic_common $ns1 "$grp_key" $vtep_ip
523 }
524
525 basic_sg_ipv6_ipv6()
526 {
527         local ns1=ns1_v6
528         local grp_key="grp ff0e::1 src 2001:db8:100::1"
529         local vtep_ip=2001:db8:1000::1
530
531         echo
532         echo "Control path: Basic (S, G) operations - IPv6 overlay / IPv6 underlay"
533         echo "--------------------------------------------------------------------"
534
535         basic_common $ns1 "$grp_key" $vtep_ip
536 }
537
538 star_g_common()
539 {
540         local ns1=$1; shift
541         local grp=$1; shift
542         local src1=$1; shift
543         local src2=$1; shift
544         local src3=$1; shift
545         local vtep_ip=$1; shift
546         local all_zeros_grp=$1; shift
547
548         # Test control path operations specific to (*, G) entries.
549
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"
557
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"
564
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"
571
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"
576
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\""
584
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\""
592
593         run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
594
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"
599
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"
607
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"
615
616         run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
617
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"
624
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"
630
631         run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
632
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"
639
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"
645
646         run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
647
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"
654
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"
660
661         run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
662
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"
669
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"
675
676         run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
677
678         # Error cases.
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"
681
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"
684
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"
687
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"
690
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"
693 }
694
695 star_g_ipv4_ipv4()
696 {
697         local ns1=ns1_v4
698         local grp=239.1.1.1
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
704
705         echo
706         echo "Control path: (*, G) operations - IPv4 overlay / IPv4 underlay"
707         echo "--------------------------------------------------------------"
708
709         star_g_common $ns1 $grp $src1 $src2 $src3 $vtep_ip $all_zeros_grp
710 }
711
712 star_g_ipv6_ipv4()
713 {
714         local ns1=ns1_v4
715         local grp=ff0e::1
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=::
721
722         echo
723         echo "Control path: (*, G) operations - IPv6 overlay / IPv4 underlay"
724         echo "--------------------------------------------------------------"
725
726         star_g_common $ns1 $grp $src1 $src2 $src3 $vtep_ip $all_zeros_grp
727 }
728
729 star_g_ipv4_ipv6()
730 {
731         local ns1=ns1_v6
732         local grp=239.1.1.1
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
738
739         echo
740         echo "Control path: (*, G) operations - IPv4 overlay / IPv6 underlay"
741         echo "--------------------------------------------------------------"
742
743         star_g_common $ns1 $grp $src1 $src2 $src3 $vtep_ip $all_zeros_grp
744 }
745
746 star_g_ipv6_ipv6()
747 {
748         local ns1=ns1_v6
749         local grp=ff0e::1
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=::
755
756         echo
757         echo "Control path: (*, G) operations - IPv6 overlay / IPv6 underlay"
758         echo "--------------------------------------------------------------"
759
760         star_g_common $ns1 $grp $src1 $src2 $src3 $vtep_ip $all_zeros_grp
761 }
762
763 sg_common()
764 {
765         local ns1=$1; shift
766         local grp=$1; shift
767         local src=$1; shift
768         local vtep_ip=$1; shift
769         local all_zeros_grp=$1; shift
770
771         # Test control path operations specific to (S, G) entries.
772
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"
777
778         run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp src $src permanent dst $vtep_ip src_vni 10010"
779
780         # Error cases.
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"
783
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"
786
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"
789
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"
792 }
793
794 sg_ipv4_ipv4()
795 {
796         local ns1=ns1_v4
797         local grp=239.1.1.1
798         local src=192.0.2.129
799         local vtep_ip=198.51.100.100
800         local all_zeros_grp=0.0.0.0
801
802         echo
803         echo "Control path: (S, G) operations - IPv4 overlay / IPv4 underlay"
804         echo "--------------------------------------------------------------"
805
806         sg_common $ns1 $grp $src $vtep_ip $all_zeros_grp
807 }
808
809 sg_ipv6_ipv4()
810 {
811         local ns1=ns1_v4
812         local grp=ff0e::1
813         local src=2001:db8:100::1
814         local vtep_ip=198.51.100.100
815         local all_zeros_grp=::
816
817         echo
818         echo "Control path: (S, G) operations - IPv6 overlay / IPv4 underlay"
819         echo "--------------------------------------------------------------"
820
821         sg_common $ns1 $grp $src $vtep_ip $all_zeros_grp
822 }
823
824 sg_ipv4_ipv6()
825 {
826         local ns1=ns1_v6
827         local grp=239.1.1.1
828         local src=192.0.2.129
829         local vtep_ip=2001:db8:1000::1
830         local all_zeros_grp=0.0.0.0
831
832         echo
833         echo "Control path: (S, G) operations - IPv4 overlay / IPv6 underlay"
834         echo "--------------------------------------------------------------"
835
836         sg_common $ns1 $grp $src $vtep_ip $all_zeros_grp
837 }
838
839 sg_ipv6_ipv6()
840 {
841         local ns1=ns1_v6
842         local grp=ff0e::1
843         local src=2001:db8:100::1
844         local vtep_ip=2001:db8:1000::1
845         local all_zeros_grp=::
846
847         echo
848         echo "Control path: (S, G) operations - IPv6 overlay / IPv6 underlay"
849         echo "--------------------------------------------------------------"
850
851         sg_common $ns1 $grp $src $vtep_ip $all_zeros_grp
852 }
853
854 ipv4_grps_get()
855 {
856         local max_grps=$1; shift
857         local i
858
859         for i in $(seq 0 $((max_grps - 1))); do
860                 echo "239.1.1.$i"
861         done
862 }
863
864 ipv6_grps_get()
865 {
866         local max_grps=$1; shift
867         local i
868
869         for i in $(seq 0 $((max_grps - 1))); do
870                 echo "ff0e::$(printf %x $i)"
871         done
872 }
873
874 dump_common()
875 {
876         local ns1=$1; shift
877         local local_addr=$1; shift
878         local remote_prefix=$1; shift
879         local fn=$1; shift
880         local max_vxlan_devs=2
881         local max_remotes=64
882         local max_grps=256
883         local num_entries
884         local batch_file
885         local grp
886         local i j
887
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.
891
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
896         done
897
898         # Create batch file with MDB entries.
899         batch_file=$(mktemp)
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
904                         done
905                 done
906         done
907
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"
914         done
915
916         rm -rf $batch_file
917 }
918
919 dump_ipv4_ipv4()
920 {
921         local ns1=ns1_v4
922         local local_addr=192.0.2.1
923         local remote_prefix=198.51.100.
924         local fn=ipv4_grps_get
925
926         echo
927         echo "Control path: Large scale MDB dump - IPv4 overlay / IPv4 underlay"
928         echo "-----------------------------------------------------------------"
929
930         dump_common $ns1 $local_addr $remote_prefix $fn
931 }
932
933 dump_ipv6_ipv4()
934 {
935         local ns1=ns1_v4
936         local local_addr=192.0.2.1
937         local remote_prefix=198.51.100.
938         local fn=ipv6_grps_get
939
940         echo
941         echo "Control path: Large scale MDB dump - IPv6 overlay / IPv4 underlay"
942         echo "-----------------------------------------------------------------"
943
944         dump_common $ns1 $local_addr $remote_prefix $fn
945 }
946
947 dump_ipv4_ipv6()
948 {
949         local ns1=ns1_v6
950         local local_addr=2001:db8:1::1
951         local remote_prefix=2001:db8:1000::
952         local fn=ipv4_grps_get
953
954         echo
955         echo "Control path: Large scale MDB dump - IPv4 overlay / IPv6 underlay"
956         echo "-----------------------------------------------------------------"
957
958         dump_common $ns1 $local_addr $remote_prefix $fn
959 }
960
961 dump_ipv6_ipv6()
962 {
963         local ns1=ns1_v6
964         local local_addr=2001:db8:1::1
965         local remote_prefix=2001:db8:1000::
966         local fn=ipv6_grps_get
967
968         echo
969         echo "Control path: Large scale MDB dump - IPv6 overlay / IPv6 underlay"
970         echo "-----------------------------------------------------------------"
971
972         dump_common $ns1 $local_addr $remote_prefix $fn
973 }
974
975 ################################################################################
976 # Tests - Data path
977
978 encap_params_common()
979 {
980         local ns1=$1; shift
981         local ns2=$1; shift
982         local vtep1_ip=$1; shift
983         local vtep2_ip=$1; shift
984         local plen=$1; shift
985         local enc_ethtype=$1; shift
986         local grp=$1; shift
987         local src=$1; shift
988         local mz=$1; shift
989
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
993         # second namespace.
994
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"
999
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"
1003
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"
1008
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"
1012
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"
1016
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"
1020
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"
1025
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"
1029
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"
1034
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"
1038
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"
1042
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"
1046
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"
1051
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"
1055
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"
1058
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"
1063
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"
1067
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"
1071 }
1072
1073 encap_params_ipv4_ipv4()
1074 {
1075         local ns1=ns1_v4
1076         local ns2=ns2_v4
1077         local vtep1_ip=198.51.100.100
1078         local vtep2_ip=198.51.100.200
1079         local plen=32
1080         local enc_ethtype="ip"
1081         local grp=239.1.1.1
1082         local src=192.0.2.129
1083
1084         echo
1085         echo "Data path: Encapsulation parameters - IPv4 overlay / IPv4 underlay"
1086         echo "------------------------------------------------------------------"
1087
1088         encap_params_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $enc_ethtype \
1089                 $grp $src "mausezahn"
1090 }
1091
1092 encap_params_ipv6_ipv4()
1093 {
1094         local ns1=ns1_v4
1095         local ns2=ns2_v4
1096         local vtep1_ip=198.51.100.100
1097         local vtep2_ip=198.51.100.200
1098         local plen=32
1099         local enc_ethtype="ip"
1100         local grp=ff0e::1
1101         local src=2001:db8:100::1
1102
1103         echo
1104         echo "Data path: Encapsulation parameters - IPv6 overlay / IPv4 underlay"
1105         echo "------------------------------------------------------------------"
1106
1107         encap_params_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $enc_ethtype \
1108                 $grp $src "mausezahn -6"
1109 }
1110
1111 encap_params_ipv4_ipv6()
1112 {
1113         local ns1=ns1_v6
1114         local ns2=ns2_v6
1115         local vtep1_ip=2001:db8:1000::1
1116         local vtep2_ip=2001:db8:2000::1
1117         local plen=128
1118         local enc_ethtype="ipv6"
1119         local grp=239.1.1.1
1120         local src=192.0.2.129
1121
1122         echo
1123         echo "Data path: Encapsulation parameters - IPv4 overlay / IPv6 underlay"
1124         echo "------------------------------------------------------------------"
1125
1126         encap_params_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $enc_ethtype \
1127                 $grp $src "mausezahn"
1128 }
1129
1130 encap_params_ipv6_ipv6()
1131 {
1132         local ns1=ns1_v6
1133         local ns2=ns2_v6
1134         local vtep1_ip=2001:db8:1000::1
1135         local vtep2_ip=2001:db8:2000::1
1136         local plen=128
1137         local enc_ethtype="ipv6"
1138         local grp=ff0e::1
1139         local src=2001:db8:100::1
1140
1141         echo
1142         echo "Data path: Encapsulation parameters - IPv6 overlay / IPv6 underlay"
1143         echo "------------------------------------------------------------------"
1144
1145         encap_params_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $enc_ethtype \
1146                 $grp $src "mausezahn -6"
1147 }
1148
1149 starg_exclude_ir_common()
1150 {
1151         local ns1=$1; shift
1152         local ns2=$1; shift
1153         local vtep1_ip=$1; shift
1154         local vtep2_ip=$1; shift
1155         local plen=$1; shift
1156         local grp=$1; shift
1157         local valid_src=$1; shift
1158         local invalid_src=$1; shift
1159         local mz=$1; shift
1160
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.
1166
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"
1170
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"
1173
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"
1176
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"
1183
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"
1190
1191         # Remove second VTEP.
1192         run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep2_ip src_vni 10010"
1193
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"
1200
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"
1207 }
1208
1209 starg_exclude_ir_ipv4_ipv4()
1210 {
1211         local ns1=ns1_v4
1212         local ns2=ns2_v4
1213         local vtep1_ip=198.51.100.100
1214         local vtep2_ip=198.51.100.200
1215         local plen=32
1216         local grp=239.1.1.1
1217         local valid_src=192.0.2.129
1218         local invalid_src=192.0.2.145
1219
1220         echo
1221         echo "Data path: (*, G) EXCLUDE - IR - IPv4 overlay / IPv4 underlay"
1222         echo "-------------------------------------------------------------"
1223
1224         starg_exclude_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1225                 $valid_src $invalid_src "mausezahn"
1226 }
1227
1228 starg_exclude_ir_ipv6_ipv4()
1229 {
1230         local ns1=ns1_v4
1231         local ns2=ns2_v4
1232         local vtep1_ip=198.51.100.100
1233         local vtep2_ip=198.51.100.200
1234         local plen=32
1235         local grp=ff0e::1
1236         local valid_src=2001:db8:100::1
1237         local invalid_src=2001:db8:200::1
1238
1239         echo
1240         echo "Data path: (*, G) EXCLUDE - IR - IPv6 overlay / IPv4 underlay"
1241         echo "-------------------------------------------------------------"
1242
1243         starg_exclude_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1244                 $valid_src $invalid_src "mausezahn -6"
1245 }
1246
1247 starg_exclude_ir_ipv4_ipv6()
1248 {
1249         local ns1=ns1_v6
1250         local ns2=ns2_v6
1251         local vtep1_ip=2001:db8:1000::1
1252         local vtep2_ip=2001:db8:2000::1
1253         local plen=128
1254         local grp=239.1.1.1
1255         local valid_src=192.0.2.129
1256         local invalid_src=192.0.2.145
1257
1258         echo
1259         echo "Data path: (*, G) EXCLUDE - IR - IPv4 overlay / IPv6 underlay"
1260         echo "-------------------------------------------------------------"
1261
1262         starg_exclude_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1263                 $valid_src $invalid_src "mausezahn"
1264 }
1265
1266 starg_exclude_ir_ipv6_ipv6()
1267 {
1268         local ns1=ns1_v6
1269         local ns2=ns2_v6
1270         local vtep1_ip=2001:db8:1000::1
1271         local vtep2_ip=2001:db8:2000::1
1272         local plen=128
1273         local grp=ff0e::1
1274         local valid_src=2001:db8:100::1
1275         local invalid_src=2001:db8:200::1
1276
1277         echo
1278         echo "Data path: (*, G) EXCLUDE - IR - IPv6 overlay / IPv6 underlay"
1279         echo "-------------------------------------------------------------"
1280
1281         starg_exclude_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1282                 $valid_src $invalid_src "mausezahn -6"
1283 }
1284
1285 starg_include_ir_common()
1286 {
1287         local ns1=$1; shift
1288         local ns2=$1; shift
1289         local vtep1_ip=$1; shift
1290         local vtep2_ip=$1; shift
1291         local plen=$1; shift
1292         local grp=$1; shift
1293         local valid_src=$1; shift
1294         local invalid_src=$1; shift
1295         local mz=$1; shift
1296
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.
1302
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"
1306
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"
1309
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"
1312
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"
1319
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"
1326
1327         # Remove second VTEP.
1328         run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep2_ip src_vni 10010"
1329
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"
1336
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"
1343 }
1344
1345 starg_include_ir_ipv4_ipv4()
1346 {
1347         local ns1=ns1_v4
1348         local ns2=ns2_v4
1349         local vtep1_ip=198.51.100.100
1350         local vtep2_ip=198.51.100.200
1351         local plen=32
1352         local grp=239.1.1.1
1353         local valid_src=192.0.2.129
1354         local invalid_src=192.0.2.145
1355
1356         echo
1357         echo "Data path: (*, G) INCLUDE - IR - IPv4 overlay / IPv4 underlay"
1358         echo "-------------------------------------------------------------"
1359
1360         starg_include_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1361                 $valid_src $invalid_src "mausezahn"
1362 }
1363
1364 starg_include_ir_ipv6_ipv4()
1365 {
1366         local ns1=ns1_v4
1367         local ns2=ns2_v4
1368         local vtep1_ip=198.51.100.100
1369         local vtep2_ip=198.51.100.200
1370         local plen=32
1371         local grp=ff0e::1
1372         local valid_src=2001:db8:100::1
1373         local invalid_src=2001:db8:200::1
1374
1375         echo
1376         echo "Data path: (*, G) INCLUDE - IR - IPv6 overlay / IPv4 underlay"
1377         echo "-------------------------------------------------------------"
1378
1379         starg_include_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1380                 $valid_src $invalid_src "mausezahn -6"
1381 }
1382
1383 starg_include_ir_ipv4_ipv6()
1384 {
1385         local ns1=ns1_v6
1386         local ns2=ns2_v6
1387         local vtep1_ip=2001:db8:1000::1
1388         local vtep2_ip=2001:db8:2000::1
1389         local plen=128
1390         local grp=239.1.1.1
1391         local valid_src=192.0.2.129
1392         local invalid_src=192.0.2.145
1393
1394         echo
1395         echo "Data path: (*, G) INCLUDE - IR - IPv4 overlay / IPv6 underlay"
1396         echo "-------------------------------------------------------------"
1397
1398         starg_include_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1399                 $valid_src $invalid_src "mausezahn"
1400 }
1401
1402 starg_include_ir_ipv6_ipv6()
1403 {
1404         local ns1=ns1_v6
1405         local ns2=ns2_v6
1406         local vtep1_ip=2001:db8:1000::1
1407         local vtep2_ip=2001:db8:2000::1
1408         local plen=128
1409         local grp=ff0e::1
1410         local valid_src=2001:db8:100::1
1411         local invalid_src=2001:db8:200::1
1412
1413         echo
1414         echo "Data path: (*, G) INCLUDE - IR - IPv6 overlay / IPv6 underlay"
1415         echo "-------------------------------------------------------------"
1416
1417         starg_include_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
1418                 $valid_src $invalid_src "mausezahn -6"
1419 }
1420
1421 starg_exclude_p2mp_common()
1422 {
1423         local ns1=$1; shift
1424         local ns2=$1; shift
1425         local mcast_grp=$1; shift
1426         local plen=$1; shift
1427         local grp=$1; shift
1428         local valid_src=$1; shift
1429         local invalid_src=$1; shift
1430         local mz=$1; shift
1431
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
1435         # forwarded.
1436
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"
1439
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"
1441
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"
1443
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"
1448
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"
1453
1454         # Remove the VTEP from the multicast group.
1455         run_cmd "ip -n $ns2 address del $mcast_grp/$plen dev veth0"
1456
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"
1461 }
1462
1463 starg_exclude_p2mp_ipv4_ipv4()
1464 {
1465         local ns1=ns1_v4
1466         local ns2=ns2_v4
1467         local mcast_grp=238.1.1.1
1468         local plen=32
1469         local grp=239.1.1.1
1470         local valid_src=192.0.2.129
1471         local invalid_src=192.0.2.145
1472
1473         echo
1474         echo "Data path: (*, G) EXCLUDE - P2MP - IPv4 overlay / IPv4 underlay"
1475         echo "---------------------------------------------------------------"
1476
1477         starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
1478                 $valid_src $invalid_src "mausezahn"
1479 }
1480
1481 starg_exclude_p2mp_ipv6_ipv4()
1482 {
1483         local ns1=ns1_v4
1484         local ns2=ns2_v4
1485         local mcast_grp=238.1.1.1
1486         local plen=32
1487         local grp=ff0e::1
1488         local valid_src=2001:db8:100::1
1489         local invalid_src=2001:db8:200::1
1490
1491         echo
1492         echo "Data path: (*, G) EXCLUDE - P2MP - IPv6 overlay / IPv4 underlay"
1493         echo "---------------------------------------------------------------"
1494
1495         starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
1496                 $valid_src $invalid_src "mausezahn -6"
1497 }
1498
1499 starg_exclude_p2mp_ipv4_ipv6()
1500 {
1501         local ns1=ns1_v6
1502         local ns2=ns2_v6
1503         local mcast_grp=ff0e::2
1504         local plen=128
1505         local grp=239.1.1.1
1506         local valid_src=192.0.2.129
1507         local invalid_src=192.0.2.145
1508
1509         echo
1510         echo "Data path: (*, G) EXCLUDE - P2MP - IPv4 overlay / IPv6 underlay"
1511         echo "---------------------------------------------------------------"
1512
1513         starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
1514                 $valid_src $invalid_src "mausezahn"
1515 }
1516
1517 starg_exclude_p2mp_ipv6_ipv6()
1518 {
1519         local ns1=ns1_v6
1520         local ns2=ns2_v6
1521         local mcast_grp=ff0e::2
1522         local plen=128
1523         local grp=ff0e::1
1524         local valid_src=2001:db8:100::1
1525         local invalid_src=2001:db8:200::1
1526
1527         echo
1528         echo "Data path: (*, G) EXCLUDE - P2MP - IPv6 overlay / IPv6 underlay"
1529         echo "---------------------------------------------------------------"
1530
1531         starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
1532                 $valid_src $invalid_src "mausezahn -6"
1533 }
1534
1535 starg_include_p2mp_common()
1536 {
1537         local ns1=$1; shift
1538         local ns2=$1; shift
1539         local mcast_grp=$1; shift
1540         local plen=$1; shift
1541         local grp=$1; shift
1542         local valid_src=$1; shift
1543         local invalid_src=$1; shift
1544         local mz=$1; shift
1545
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
1549         # forwarded.
1550
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"
1553
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"
1555
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"
1557
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"
1562
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"
1567
1568         # Remove the VTEP from the multicast group.
1569         run_cmd "ip -n $ns2 address del $mcast_grp/$plen dev veth0"
1570
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"
1575 }
1576
1577 starg_include_p2mp_ipv4_ipv4()
1578 {
1579         local ns1=ns1_v4
1580         local ns2=ns2_v4
1581         local mcast_grp=238.1.1.1
1582         local plen=32
1583         local grp=239.1.1.1
1584         local valid_src=192.0.2.129
1585         local invalid_src=192.0.2.145
1586
1587         echo
1588         echo "Data path: (*, G) INCLUDE - P2MP - IPv4 overlay / IPv4 underlay"
1589         echo "---------------------------------------------------------------"
1590
1591         starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
1592                 $valid_src $invalid_src "mausezahn"
1593 }
1594
1595 starg_include_p2mp_ipv6_ipv4()
1596 {
1597         local ns1=ns1_v4
1598         local ns2=ns2_v4
1599         local mcast_grp=238.1.1.1
1600         local plen=32
1601         local grp=ff0e::1
1602         local valid_src=2001:db8:100::1
1603         local invalid_src=2001:db8:200::1
1604
1605         echo
1606         echo "Data path: (*, G) INCLUDE - P2MP - IPv6 overlay / IPv4 underlay"
1607         echo "---------------------------------------------------------------"
1608
1609         starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
1610                 $valid_src $invalid_src "mausezahn -6"
1611 }
1612
1613 starg_include_p2mp_ipv4_ipv6()
1614 {
1615         local ns1=ns1_v6
1616         local ns2=ns2_v6
1617         local mcast_grp=ff0e::2
1618         local plen=128
1619         local grp=239.1.1.1
1620         local valid_src=192.0.2.129
1621         local invalid_src=192.0.2.145
1622
1623         echo
1624         echo "Data path: (*, G) INCLUDE - P2MP - IPv4 overlay / IPv6 underlay"
1625         echo "---------------------------------------------------------------"
1626
1627         starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
1628                 $valid_src $invalid_src "mausezahn"
1629 }
1630
1631 starg_include_p2mp_ipv6_ipv6()
1632 {
1633         local ns1=ns1_v6
1634         local ns2=ns2_v6
1635         local mcast_grp=ff0e::2
1636         local plen=128
1637         local grp=ff0e::1
1638         local valid_src=2001:db8:100::1
1639         local invalid_src=2001:db8:200::1
1640
1641         echo
1642         echo "Data path: (*, G) INCLUDE - P2MP - IPv6 overlay / IPv6 underlay"
1643         echo "---------------------------------------------------------------"
1644
1645         starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
1646                 $valid_src $invalid_src "mausezahn -6"
1647 }
1648
1649 egress_vni_translation_common()
1650 {
1651         local ns1=$1; shift
1652         local ns2=$1; shift
1653         local mcast_grp=$1; shift
1654         local plen=$1; shift
1655         local proto=$1; shift
1656         local grp=$1; shift
1657         local src=$1; shift
1658         local mz=$1; shift
1659
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.
1666         #
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.
1671         #
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.
1677         #
1678         # [1] https://datatracker.ietf.org/doc/html/draft-ietf-bess-evpn-irb-mcast
1679
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"
1683
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"
1685
1686         # Remove the second VTEP from VLAN 10.
1687         run_cmd "bridge -n $ns2 vlan del vid 10 dev vx0"
1688
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"
1695
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"
1702
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"
1708 }
1709
1710 egress_vni_translation_ipv4_ipv4()
1711 {
1712         local ns1=ns1_v4
1713         local ns2=ns2_v4
1714         local mcast_grp=238.1.1.1
1715         local plen=32
1716         local proto="ipv4"
1717         local grp=239.1.1.1
1718         local src=192.0.2.129
1719
1720         echo
1721         echo "Data path: Egress VNI translation - IPv4 overlay / IPv4 underlay"
1722         echo "----------------------------------------------------------------"
1723
1724         egress_vni_translation_common $ns1 $ns2 $mcast_grp $plen $proto $grp \
1725                 $src "mausezahn"
1726 }
1727
1728 egress_vni_translation_ipv6_ipv4()
1729 {
1730         local ns1=ns1_v4
1731         local ns2=ns2_v4
1732         local mcast_grp=238.1.1.1
1733         local plen=32
1734         local proto="ipv6"
1735         local grp=ff0e::1
1736         local src=2001:db8:100::1
1737
1738         echo
1739         echo "Data path: Egress VNI translation - IPv6 overlay / IPv4 underlay"
1740         echo "----------------------------------------------------------------"
1741
1742         egress_vni_translation_common $ns1 $ns2 $mcast_grp $plen $proto $grp \
1743                 $src "mausezahn -6"
1744 }
1745
1746 egress_vni_translation_ipv4_ipv6()
1747 {
1748         local ns1=ns1_v6
1749         local ns2=ns2_v6
1750         local mcast_grp=ff0e::2
1751         local plen=128
1752         local proto="ipv4"
1753         local grp=239.1.1.1
1754         local src=192.0.2.129
1755
1756         echo
1757         echo "Data path: Egress VNI translation - IPv4 overlay / IPv6 underlay"
1758         echo "----------------------------------------------------------------"
1759
1760         egress_vni_translation_common $ns1 $ns2 $mcast_grp $plen $proto $grp \
1761                 $src "mausezahn"
1762 }
1763
1764 egress_vni_translation_ipv6_ipv6()
1765 {
1766         local ns1=ns1_v6
1767         local ns2=ns2_v6
1768         local mcast_grp=ff0e::2
1769         local plen=128
1770         local proto="ipv6"
1771         local grp=ff0e::1
1772         local src=2001:db8:100::1
1773
1774         echo
1775         echo "Data path: Egress VNI translation - IPv6 overlay / IPv6 underlay"
1776         echo "----------------------------------------------------------------"
1777
1778         egress_vni_translation_common $ns1 $ns2 $mcast_grp $plen $proto $grp \
1779                 $src "mausezahn -6"
1780 }
1781
1782 all_zeros_mdb_common()
1783 {
1784         local ns1=$1; shift
1785         local ns2=$1; shift
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
1799
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.
1804
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"
1811
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"
1816
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"
1823
1824         # Configure the VTEP addresses in the second namespace to enable
1825         # decapsulation.
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"
1830
1831         # Send registered IPv4 multicast and make sure it only arrives to the
1832         # first VTEP.
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"
1838
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"
1846
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"
1854
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"
1862
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"
1870
1871         # Make sure IPv4 traffic did not reach the VTEPs associated with
1872         # IPv6 entries.
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"
1877
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"
1881
1882         # Send registered IPv6 multicast and make sure it only arrives to the
1883         # third VTEP.
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"
1889
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"
1897
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"
1905
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"
1913
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"
1921
1922         # Make sure IPv6 traffic did not reach the VTEPs associated with
1923         # IPv4 entries.
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"
1928 }
1929
1930 all_zeros_mdb_ipv4()
1931 {
1932         local ns1=ns1_v4
1933         local ns2=ns2_v4
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
1938         local plen=32
1939
1940         echo
1941         echo "Data path: All-zeros MDB entry - IPv4 underlay"
1942         echo "----------------------------------------------"
1943
1944         all_zeros_mdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $vtep3_ip \
1945                 $vtep4_ip $plen
1946 }
1947
1948 all_zeros_mdb_ipv6()
1949 {
1950         local ns1=ns1_v6
1951         local ns2=ns2_v6
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
1956         local plen=128
1957
1958         echo
1959         echo "Data path: All-zeros MDB entry - IPv6 underlay"
1960         echo "----------------------------------------------"
1961
1962         all_zeros_mdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $vtep3_ip \
1963                 $vtep4_ip $plen
1964 }
1965
1966 mdb_fdb_common()
1967 {
1968         local ns1=$1; shift
1969         local ns2=$1; shift
1970         local vtep1_ip=$1; shift
1971         local vtep2_ip=$1; shift
1972         local plen=$1; shift
1973         local proto=$1; shift
1974         local grp=$1; shift
1975         local src=$1; shift
1976         local mz=$1; shift
1977
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.
1980
1981         # Associate the MDB entry with one VTEP and the FDB entry with another
1982         # VTEP.
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"
1985
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"
1990
1991         # Configure the VTEP addresses in the second namespace to enable
1992         # decapsulation.
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"
1995
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"
2003
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"
2011
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"
2020 }
2021
2022 mdb_fdb_ipv4_ipv4()
2023 {
2024         local ns1=ns1_v4
2025         local ns2=ns2_v4
2026         local vtep1_ip=198.51.100.100
2027         local vtep2_ip=198.51.100.200
2028         local plen=32
2029         local proto="ipv4"
2030         local grp=239.1.1.1
2031         local src=192.0.2.129
2032
2033         echo
2034         echo "Data path: MDB with FDB - IPv4 overlay / IPv4 underlay"
2035         echo "------------------------------------------------------"
2036
2037         mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp $src \
2038                 "mausezahn"
2039 }
2040
2041 mdb_fdb_ipv6_ipv4()
2042 {
2043         local ns1=ns1_v4
2044         local ns2=ns2_v4
2045         local vtep1_ip=198.51.100.100
2046         local vtep2_ip=198.51.100.200
2047         local plen=32
2048         local proto="ipv6"
2049         local grp=ff0e::1
2050         local src=2001:db8:100::1
2051
2052         echo
2053         echo "Data path: MDB with FDB - IPv6 overlay / IPv4 underlay"
2054         echo "------------------------------------------------------"
2055
2056         mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp $src \
2057                 "mausezahn -6"
2058 }
2059
2060 mdb_fdb_ipv4_ipv6()
2061 {
2062         local ns1=ns1_v6
2063         local ns2=ns2_v6
2064         local vtep1_ip=2001:db8:1000::1
2065         local vtep2_ip=2001:db8:2000::1
2066         local plen=128
2067         local proto="ipv4"
2068         local grp=239.1.1.1
2069         local src=192.0.2.129
2070
2071         echo
2072         echo "Data path: MDB with FDB - IPv4 overlay / IPv6 underlay"
2073         echo "------------------------------------------------------"
2074
2075         mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp $src \
2076                 "mausezahn"
2077 }
2078
2079 mdb_fdb_ipv6_ipv6()
2080 {
2081         local ns1=ns1_v6
2082         local ns2=ns2_v6
2083         local vtep1_ip=2001:db8:1000::1
2084         local vtep2_ip=2001:db8:2000::1
2085         local plen=128
2086         local proto="ipv6"
2087         local grp=ff0e::1
2088         local src=2001:db8:100::1
2089
2090         echo
2091         echo "Data path: MDB with FDB - IPv6 overlay / IPv6 underlay"
2092         echo "------------------------------------------------------"
2093
2094         mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp $src \
2095                 "mausezahn -6"
2096 }
2097
2098 mdb_grp1_loop()
2099 {
2100         local ns1=$1; shift
2101         local vtep1_ip=$1; shift
2102         local grp1=$1; shift
2103
2104         while true; do
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
2108 }
2109
2110 mdb_grp2_loop()
2111 {
2112         local ns1=$1; shift
2113         local vtep1_ip=$1; shift
2114         local vtep2_ip=$1; shift
2115         local grp2=$1; shift
2116
2117         while true; do
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
2122 }
2123
2124 mdb_torture_common()
2125 {
2126         local ns1=$1; shift
2127         local vtep1_ip=$1; shift
2128         local vtep2_ip=$1; shift
2129         local grp1=$1; shift
2130         local grp2=$1; shift
2131         local src=$1; shift
2132         local mz=$1; shift
2133         local pid1
2134         local pid2
2135         local pid3
2136         local pid4
2137
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.
2145
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"
2150
2151         mdb_grp1_loop $ns1 $vtep1_ip $grp1 &
2152         pid1=$!
2153         mdb_grp2_loop $ns1 $vtep1_ip $vtep2_ip $grp2 &
2154         pid2=$!
2155         ip netns exec $ns1 $mz br0.10 -A $src -B $grp1 -t udp sp=12345,dp=54321 -p 100 -c 0 -q &
2156         pid3=$!
2157         ip netns exec $ns1 $mz br0.10 -A $src -B $grp2 -t udp sp=12345,dp=54321 -p 100 -c 0 -q &
2158         pid4=$!
2159
2160         sleep 30
2161         kill -9 $pid1 $pid2 $pid3 $pid4
2162         wait $pid1 $pid2 $pid3 $pid4 2>/dev/null
2163
2164         log_test 0 0 "Torture test"
2165 }
2166
2167 mdb_torture_ipv4_ipv4()
2168 {
2169         local ns1=ns1_v4
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
2175
2176         echo
2177         echo "Data path: MDB torture test - IPv4 overlay / IPv4 underlay"
2178         echo "----------------------------------------------------------"
2179
2180         mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp2 $src \
2181                 "mausezahn"
2182 }
2183
2184 mdb_torture_ipv6_ipv4()
2185 {
2186         local ns1=ns1_v4
2187         local vtep1_ip=198.51.100.100
2188         local vtep2_ip=198.51.100.200
2189         local grp1=ff0e::1
2190         local grp2=ff0e::2
2191         local src=2001:db8:100::1
2192
2193         echo
2194         echo "Data path: MDB torture test - IPv6 overlay / IPv4 underlay"
2195         echo "----------------------------------------------------------"
2196
2197         mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp2 $src \
2198                 "mausezahn -6"
2199 }
2200
2201 mdb_torture_ipv4_ipv6()
2202 {
2203         local ns1=ns1_v6
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
2209
2210         echo
2211         echo "Data path: MDB torture test - IPv4 overlay / IPv6 underlay"
2212         echo "----------------------------------------------------------"
2213
2214         mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp2 $src \
2215                 "mausezahn"
2216 }
2217
2218 mdb_torture_ipv6_ipv6()
2219 {
2220         local ns1=ns1_v6
2221         local vtep1_ip=2001:db8:1000::1
2222         local vtep2_ip=2001:db8:2000::1
2223         local grp1=ff0e::1
2224         local grp2=ff0e::2
2225         local src=2001:db8:100::1
2226
2227         echo
2228         echo "Data path: MDB torture test - IPv6 overlay / IPv6 underlay"
2229         echo "----------------------------------------------------------"
2230
2231         mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp2 $src \
2232                 "mausezahn -6"
2233 }
2234
2235 ################################################################################
2236 # Usage
2237
2238 usage()
2239 {
2240         cat <<EOF
2241 usage: ${0##*/} OPTS
2242
2243         -t <test>   Test(s) to run (default: all)
2244                     (options: $TESTS)
2245         -c          Control path tests only
2246         -d          Data path tests only
2247         -p          Pause on fail
2248         -P          Pause after each test before cleanup
2249         -v          Verbose mode (show commands and output)
2250 EOF
2251 }
2252
2253 ################################################################################
2254 # Main
2255
2256 trap cleanup EXIT
2257
2258 while getopts ":t:cdpPvh" opt; do
2259         case $opt in
2260                 t) TESTS=$OPTARG;;
2261                 c) TESTS=${CONTROL_PATH_TESTS};;
2262                 d) TESTS=${DATA_PATH_TESTS};;
2263                 p) PAUSE_ON_FAIL=yes;;
2264                 P) PAUSE=yes;;
2265                 v) VERBOSE=$(($VERBOSE + 1));;
2266                 h) usage; exit 0;;
2267                 *) usage; exit 1;;
2268         esac
2269 done
2270
2271 # Make sure we don't pause twice.
2272 [ "${PAUSE}" = "yes" ] && PAUSE_ON_FAIL=no
2273
2274 if [ "$(id -u)" -ne 0 ];then
2275         echo "SKIP: Need root privileges"
2276         exit $ksft_skip;
2277 fi
2278
2279 if [ ! -x "$(command -v ip)" ]; then
2280         echo "SKIP: Could not run test without ip tool"
2281         exit $ksft_skip
2282 fi
2283
2284 if [ ! -x "$(command -v bridge)" ]; then
2285         echo "SKIP: Could not run test without bridge tool"
2286         exit $ksft_skip
2287 fi
2288
2289 if [ ! -x "$(command -v mausezahn)" ]; then
2290         echo "SKIP: Could not run test without mausezahn tool"
2291         exit $ksft_skip
2292 fi
2293
2294 if [ ! -x "$(command -v jq)" ]; then
2295         echo "SKIP: Could not run test without jq tool"
2296         exit $ksft_skip
2297 fi
2298
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"
2302    exit $ksft_skip
2303 fi
2304
2305 # Start clean.
2306 cleanup
2307
2308 for t in $TESTS
2309 do
2310         setup; $t; cleanup;
2311 done
2312
2313 if [ "$TESTS" != "none" ]; then
2314         printf "\nTests passed: %3d\n" ${nsuccess}
2315         printf "Tests failed: %3d\n"   ${nfail}
2316 fi
2317
2318 exit $ret