xref: /linux/tools/testing/selftests/net/forwarding/vxlan_bridge_1q_mc_ul.sh (revision f2161d5f1aae21a42b0a64d87e10cb31db423f42)
1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4# +-----------------------------------------+
5# | + $h1.10             + $h1.20           |
6# | | 192.0.2.1/28       | 2001:db8:1::1/64 |
7# | \________   ________/                   |
8# |          \ /                            |
9# |           + $h1                H1 (vrf) |
10# +-----------|-----------------------------+
11#             |
12# +-----------|----------------------------------------------------------------+
13# | +---------|--------------------------------------+       SWITCH (main vrf) |
14# | |         + $swp1                   BR1 (802.1q) |                         |
15# | |            vid 10 20                           |                         |
16# | |                                                |                         |
17# | |  + vx10 (vxlan)         + vx20 (vxlan)         |      + lo10 (dummy)     |
18# | |    local 192.0.2.100      local 2001:db8:4::1  |        192.0.2.100/28   |
19# | |    group 233.252.0.1      group ff0e::1:2:3    |        2001:db8:4::1/64 |
20# | |    id 1000                id 2000              |                         |
21# | |    vid 10 pvid untagged   vid 20 pvid untagged |                         |
22# | +------------------------------------------------+                         |
23# |                                                                            |
24# |   + $swp2                                                        $swp3 +   |
25# |   | 192.0.2.33/28                                        192.0.2.65/28 |   |
26# |   | 2001:db8:2::1/64                                  2001:db8:3::1/64 |   |
27# |   |                                                                    |   |
28# +---|--------------------------------------------------------------------|---+
29#     |                                                                    |
30# +---|--------------------------------+  +--------------------------------|---+
31# |   |                      H2 (vrf)  |  | H3 (vrf)                       |   |
32# | +-|----------------------------+   |  |  +-----------------------------|-+ |
33# | | + $h2           BR2 (802.1d) |   |  |  | BR3 (802.1d)            $h3 + | |
34# | |                              |   |  |  |                               | |
35# | | + v1$h2 (veth)               |   |  |  |                v1$h3 (veth) + | |
36# | +-|----------------------------+   |  |  +-----------------------------|-+ |
37# |   |                                |  |                                |   |
38# +---|--------------------------------+  +--------------------------------|---+
39#     |                                                                    |
40# +---|--------------------------------+  +--------------------------------|---+
41# |   + v2$h2 (veth)       NS2 (netns) |  | NS3 (netns)       v2$h3 (veth) +   |
42# |     192.0.2.34/28                  |  |                  192.0.2.66/28     |
43# |     2001:db8:2::2/64               |  |               2001:db8:3::2/64     |
44# |                                    |  |                                    |
45# | +--------------------------------+ |  | +--------------------------------+ |
46# | |                  BR1 (802.1q)  | |  | |                   BR1 (802.1q) | |
47# | |  + vx10 (vxlan)                | |  | |  + vx10 (vxlan)                | |
48# | |    local 192.0.2.34            | |  | |    local 192.0.2.50            | |
49# | |    group 233.252.0.1 dev v2$h2 | |  | |    group 233.252.0.1 dev v2$h3 | |
50# | |    id 1000 dstport $VXPORT     | |  | |    id 1000 dstport $VXPORT     | |
51# | |    vid 10 pvid untagged        | |  | |    vid 10 pvid untagged        | |
52# | |                                | |  | |                                | |
53# | |  + vx20 (vxlan)                | |  | |  + vx20 (vxlan)                | |
54# | |    local 2001:db8:2::2         | |  | |    local 2001:db8:3::2         | |
55# | |    group ff0e::1:2:3 dev v2$h2 | |  | |    group ff0e::1:2:3 dev v2$h3 | |
56# | |    id 2000 dstport $VXPORT     | |  | |    id 2000 dstport $VXPORT     | |
57# | |    vid 20 pvid untagged        | |  | |    vid 20 pvid untagged        | |
58# | |                                | |  | |                                | |
59# | |  + w1 (veth)                   | |  | |  + w1 (veth)                   | |
60# | |  | vid 10 20                   | |  | |  | vid 10 20                   | |
61# | +--|-----------------------------+ |  | +--|-----------------------------+ |
62# |    |                               |  |    |                               |
63# | +--|-----------------------------+ |  | +--|-----------------------------+ |
64# | |  + w2 (veth)        VW2 (vrf)  | |  | |  + w2 (veth)        VW2 (vrf)  | |
65# | |  |\                            | |  | |  |\                            | |
66# | |  | + w2.10                     | |  | |  | + w2.10                     | |
67# | |  |   192.0.2.3/28              | |  | |  |   192.0.2.4/28              | |
68# | |  |                             | |  | |  |                             | |
69# | |  + w2.20                       | |  | |  + w2.20                       | |
70# | |    2001:db8:1::3/64            | |  | |    2001:db8:1::4/64            | |
71# | +--------------------------------+ |  | +--------------------------------+ |
72# +------------------------------------+  +------------------------------------+
73#
74#shellcheck disable=SC2317 # SC doesn't see our uses of functions.
75
76: "${VXPORT:=4789}"
77export VXPORT
78
79: "${GROUP4:=233.252.0.1}"
80export GROUP4
81
82: "${GROUP6:=ff0e::1:2:3}"
83export GROUP6
84
85: "${IPMR:=lo10}"
86
87ALL_TESTS="
88	ipv4_nomcroute
89	ipv4_mcroute
90	ipv4_mcroute_changelink
91	ipv4_mcroute_starg
92	ipv4_mcroute_noroute
93	ipv4_mcroute_fdb
94	ipv4_mcroute_fdb_oif0
95	ipv4_mcroute_fdb_oif0_sep
96
97	ipv6_nomcroute
98	ipv6_mcroute
99	ipv6_mcroute_changelink
100	ipv6_mcroute_starg
101	ipv6_mcroute_noroute
102	ipv6_mcroute_fdb
103	ipv6_mcroute_fdb_oif0
104
105	ipv4_nomcroute_rx
106	ipv4_mcroute_rx
107	ipv4_mcroute_starg_rx
108	ipv4_mcroute_fdb_oif0_sep_rx
109	ipv4_mcroute_fdb_sep_rx
110
111	ipv6_nomcroute_rx
112	ipv6_mcroute_rx
113	ipv6_mcroute_starg_rx
114	ipv6_mcroute_fdb_sep_rx
115"
116
117NUM_NETIFS=6
118source lib.sh
119
120h1_create()
121{
122	adf_simple_if_init "$h1"
123
124	adf_ip_link_add "$h1.10" master "v$h1" link "$h1" type vlan id 10
125	adf_ip_link_set_up "$h1.10"
126	adf_ip_addr_add "$h1.10" 192.0.2.1/28
127
128	adf_ip_link_add "$h1.20" master "v$h1" link "$h1" type vlan id 20
129	adf_ip_link_set_up "$h1.20"
130	adf_ip_addr_add "$h1.20" 2001:db8:1::1/64
131}
132
133install_capture()
134{
135	local dev=$1; shift
136
137	tc qdisc add dev "$dev" clsact
138	defer tc qdisc del dev "$dev" clsact
139
140	tc filter add dev "$dev" ingress proto ip pref 104 \
141	   u32 match ip protocol 0x11 0xff \
142	       match u16 "$VXPORT" 0xffff at 0x16 \
143	       match u16 0x0800 0xffff at 0x30 \
144	       action pass
145	defer tc filter del dev "$dev" ingress proto ip pref 104
146
147	tc filter add dev "$dev" ingress proto ipv6 pref 106 \
148	   u32 match ip6 protocol 0x11 0xff \
149	       match u16 "$VXPORT" 0xffff at 0x2a \
150	       match u16 0x86dd 0xffff at 0x44 \
151	       match u8 0x11 0xff at 0x4c \
152	       action pass
153	defer tc filter del dev "$dev" ingress proto ipv6 pref 106
154}
155
156h2_create()
157{
158	# $h2
159	adf_ip_link_set_up "$h2"
160
161	# H2
162	vrf_create "v$h2"
163	defer vrf_destroy "v$h2"
164
165	adf_ip_link_set_up "v$h2"
166
167	# br2
168	adf_ip_link_add br2 type bridge vlan_filtering 0 mcast_snooping 0
169	adf_ip_link_set_master br2 "v$h2"
170	adf_ip_link_set_up br2
171
172	# $h2
173	adf_ip_link_set_master "$h2" br2
174	install_capture "$h2"
175
176	# v1$h2
177	adf_ip_link_set_up "v1$h2"
178	adf_ip_link_set_master "v1$h2" br2
179}
180
181h3_create()
182{
183	# $h3
184	adf_ip_link_set_up "$h3"
185
186	# H3
187	vrf_create "v$h3"
188	defer vrf_destroy "v$h3"
189
190	adf_ip_link_set_up "v$h3"
191
192	# br3
193	adf_ip_link_add br3 type bridge vlan_filtering 0 mcast_snooping 0
194	adf_ip_link_set_master br3 "v$h3"
195	adf_ip_link_set_up br3
196
197	# $h3
198	adf_ip_link_set_master "$h3" br3
199	install_capture "$h3"
200
201	# v1$h3
202	adf_ip_link_set_up "v1$h3"
203	adf_ip_link_set_master "v1$h3" br3
204}
205
206switch_create()
207{
208	local swp1_mac
209
210	# br1
211	swp1_mac=$(mac_get "$swp1")
212	adf_ip_link_add br1 type bridge vlan_filtering 1 \
213			    vlan_default_pvid 0 mcast_snooping 0
214	adf_ip_link_set_addr br1 "$swp1_mac"
215	adf_ip_link_set_up br1
216
217	# A dummy to force the IPv6 OIF=0 test to install a suitable MC route on
218	# $IPMR to be deterministic. Also used for the IPv6 RX!=TX ping test.
219	adf_ip_link_add "X$IPMR" up type dummy
220
221	# IPMR
222	adf_ip_link_add "$IPMR" up type dummy
223	adf_ip_addr_add "$IPMR" 192.0.2.100/28
224	adf_ip_addr_add "$IPMR" 2001:db8:4::1/64
225
226	# $swp1
227	adf_ip_link_set_up "$swp1"
228	adf_ip_link_set_master "$swp1" br1
229	adf_bridge_vlan_add vid 10 dev "$swp1"
230	adf_bridge_vlan_add vid 20 dev "$swp1"
231
232	# $swp2
233	adf_ip_link_set_up "$swp2"
234	adf_ip_addr_add "$swp2" 192.0.2.33/28
235	adf_ip_addr_add "$swp2" 2001:db8:2::1/64
236
237	# $swp3
238	adf_ip_link_set_up "$swp3"
239	adf_ip_addr_add "$swp3" 192.0.2.65/28
240	adf_ip_addr_add "$swp3" 2001:db8:3::1/64
241}
242
243vx_create()
244{
245	local name=$1; shift
246	local vid=$1; shift
247
248	adf_ip_link_add "$name" up type vxlan dstport "$VXPORT" \
249		nolearning noudpcsum tos inherit ttl 16 \
250		"$@"
251	adf_ip_link_set_master "$name" br1
252	adf_bridge_vlan_add vid "$vid" dev "$name" pvid untagged
253}
254export -f vx_create
255
256vx10_create()
257{
258	vx_create vx10 10 id 1000 "$@"
259}
260export -f vx10_create
261
262vx20_create()
263{
264	vx_create vx20 20 id 2000 "$@"
265}
266export -f vx20_create
267
268ns_init_common()
269{
270	local ns=$1; shift
271	local if_in=$1; shift
272	local ipv4_in=$1; shift
273	local ipv6_in=$1; shift
274	local ipv4_host=$1; shift
275	local ipv6_host=$1; shift
276
277	# v2$h2 / v2$h3
278	adf_ip_link_set_up "$if_in"
279	adf_ip_addr_add "$if_in" "$ipv4_in"
280	adf_ip_addr_add "$if_in" "$ipv6_in"
281
282	# br1
283	adf_ip_link_add br1 type bridge vlan_filtering 1 \
284		    vlan_default_pvid 0 mcast_snooping 0
285	adf_ip_link_set_up br1
286
287	# vx10, vx20
288	vx10_create local "${ipv4_in%/*}" group "$GROUP4" dev "$if_in"
289	vx20_create local "${ipv6_in%/*}" group "$GROUP6" dev "$if_in"
290
291	# w1
292	adf_ip_link_add w1 type veth peer name w2
293	adf_ip_link_set_master w1 br1
294	adf_ip_link_set_up w1
295	adf_bridge_vlan_add vid 10 dev w1
296	adf_bridge_vlan_add vid 20 dev w1
297
298	# w2
299	adf_simple_if_init w2
300
301	# w2.10
302	adf_ip_link_add w2.10 master vw2 link w2 type vlan id 10
303	adf_ip_link_set_up w2.10
304	adf_ip_addr_add w2.10 "$ipv4_host"
305
306	# w2.20
307	adf_ip_link_add w2.20 master vw2 link w2 type vlan id 20
308	adf_ip_link_set_up w2.20
309	adf_ip_addr_add w2.20 "$ipv6_host"
310}
311export -f ns_init_common
312
313ns2_create()
314{
315	# NS2
316	ip netns add ns2
317	defer ip netns del ns2
318
319	# v2$h2
320	ip link set dev "v2$h2" netns ns2
321	defer ip -n ns2 link set dev "v2$h2" netns 1
322
323	in_ns ns2 \
324	      ns_init_common ns2 "v2$h2" \
325			     192.0.2.34/28 2001:db8:2::2/64 \
326			     192.0.2.3/28  2001:db8:1::3/64
327}
328
329ns3_create()
330{
331	# NS3
332	ip netns add ns3
333	defer ip netns del ns3
334
335	# v2$h3
336	ip link set dev "v2$h3" netns ns3
337	defer ip -n ns3 link set dev "v2$h3" netns 1
338
339	ip -n ns3 link set dev "v2$h3" up
340
341	in_ns ns3 \
342	      ns_init_common ns3 "v2$h3" \
343			     192.0.2.66/28 2001:db8:3::2/64 \
344			     192.0.2.4/28  2001:db8:1::4/64
345}
346
347setup_prepare()
348{
349	h1=${NETIFS[p1]}
350	swp1=${NETIFS[p2]}
351
352	swp2=${NETIFS[p3]}
353	h2=${NETIFS[p4]}
354
355	swp3=${NETIFS[p5]}
356	h3=${NETIFS[p6]}
357
358	adf_vrf_prepare
359	adf_forwarding_enable
360
361	adf_ip_link_add "v1$h2" type veth peer name "v2$h2"
362	adf_ip_link_add "v1$h3" type veth peer name "v2$h3"
363
364	h1_create
365	h2_create
366	h3_create
367	switch_create
368	ns2_create
369	ns3_create
370}
371
372adf_install_broken_sg()
373{
374	adf_mcd_start "$IPMR" || exit "$EXIT_STATUS"
375
376	mc_cli add "$swp2" 192.0.2.100 "$GROUP4" "$swp1" "$swp3"
377	defer mc_cli remove "$swp2" 192.0.2.100 "$GROUP4" "$swp1" "$swp3"
378
379	mc_cli add "$swp2" 2001:db8:4::1 "$GROUP6" "$swp1" "$swp3"
380	defer mc_cli remove "$swp2" 2001:db8:4::1 "$GROUP6" "$swp1" "$swp3"
381}
382
383adf_install_rx()
384{
385	mc_cli add "$swp2" 0.0.0.0 "$GROUP4" "$IPMR"
386	defer mc_cli remove "$swp2" 0.0.0.0 "$GROUP4" lo10
387
388	mc_cli add "$swp3" 0.0.0.0 "$GROUP4" "$IPMR"
389	defer mc_cli remove "$swp3" 0.0.0.0 "$GROUP4" lo10
390
391	mc_cli add "$swp2" :: "$GROUP6" "$IPMR"
392	defer mc_cli remove "$swp2" :: "$GROUP6" lo10
393
394	mc_cli add "$swp3" :: "$GROUP6" "$IPMR"
395	defer mc_cli remove "$swp3" :: "$GROUP6" lo10
396}
397
398adf_install_sg()
399{
400	adf_mcd_start "$IPMR" || exit "$EXIT_STATUS"
401
402	mc_cli add "$IPMR" 192.0.2.100 "$GROUP4" "$swp2" "$swp3"
403	defer mc_cli remove "$IPMR" 192.0.2.33 "$GROUP4" "$swp2" "$swp3"
404
405	mc_cli add "$IPMR" 2001:db8:4::1 "$GROUP6" "$swp2" "$swp3"
406	defer mc_cli remove "$IPMR" 2001:db8:4::1 "$GROUP6" "$swp2" "$swp3"
407
408	adf_install_rx
409}
410
411adf_install_sg_sep()
412{
413	adf_mcd_start lo || exit "$EXIT_STATUS"
414
415	mc_cli add lo 192.0.2.120 "$GROUP4" "$swp2" "$swp3"
416	defer mc_cli remove lo 192.0.2.120 "$GROUP4" "$swp2" "$swp3"
417
418	mc_cli add lo 2001:db8:5::1 "$GROUP6" "$swp2" "$swp3"
419	defer mc_cli remove lo 2001:db8:5::1 "$GROUP6" "$swp2" "$swp3"
420}
421
422adf_install_sg_sep_rx()
423{
424	local lo=$1; shift
425
426	adf_mcd_start "$IPMR" "$lo" || exit "$EXIT_STATUS"
427
428	mc_cli add "$lo" 192.0.2.120 "$GROUP4" "$swp2" "$swp3"
429	defer mc_cli remove "$lo" 192.0.2.120 "$GROUP4" "$swp2" "$swp3"
430
431	mc_cli add "$lo" 2001:db8:5::1 "$GROUP6" "$swp2" "$swp3"
432	defer mc_cli remove "$lo" 2001:db8:5::1 "$GROUP6" "$swp2" "$swp3"
433
434	adf_install_rx
435}
436
437adf_install_starg()
438{
439	adf_mcd_start "$IPMR" || exit "$EXIT_STATUS"
440
441	mc_cli add "$IPMR" 0.0.0.0 "$GROUP4" "$swp2" "$swp3"
442	defer mc_cli remove "$IPMR" 0.0.0.0 "$GROUP4" "$swp2" "$swp3"
443
444	mc_cli add "$IPMR" :: "$GROUP6" "$swp2" "$swp3"
445	defer mc_cli remove "$IPMR" :: "$GROUP6" "$swp2" "$swp3"
446
447	adf_install_rx
448}
449
450do_packets_v4()
451{
452	local mac
453
454	mac=$(mac_get "$h2")
455	"$MZ" "$h1" -Q 10 -c 10 -d 100msec -p 64 -a own -b "$mac" \
456	    -A 192.0.2.1 -B 192.0.2.2 -t udp sp=1234,dp=2345 -q
457}
458
459do_packets_v6()
460{
461	local mac
462
463	mac=$(mac_get "$h2")
464	"$MZ" -6 "$h1" -Q 20 -c 10 -d 100msec -p 64 -a own -b "$mac" \
465	    -A 2001:db8:1::1 -B 2001:db8:1::2 -t udp sp=1234,dp=2345 -q
466}
467
468do_test()
469{
470	local ipv=$1; shift
471	local expect_h2=$1; shift
472	local expect_h3=$1; shift
473	local what=$1; shift
474
475	local pref=$((100 + ipv))
476	local t0_h2
477	local t0_h3
478	local t1_h2
479	local t1_h3
480	local d_h2
481	local d_h3
482
483	RET=0
484
485	t0_h2=$(tc_rule_stats_get "$h2" "$pref" ingress)
486	t0_h3=$(tc_rule_stats_get "$h3" "$pref" ingress)
487
488	"do_packets_v$ipv"
489	sleep 1
490
491	t1_h2=$(tc_rule_stats_get "$h2" "$pref" ingress)
492	t1_h3=$(tc_rule_stats_get "$h3" "$pref" ingress)
493
494	d_h2=$((t1_h2 - t0_h2))
495	d_h3=$((t1_h3 - t0_h3))
496
497	((d_h2 == expect_h2))
498	check_err $? "Expected $expect_h2 packets on H2, got $d_h2"
499
500	((d_h3 == expect_h3))
501	check_err $? "Expected $expect_h3 packets on H3, got $d_h3"
502
503	log_test "VXLAN MC flood $what"
504}
505
506ipv4_do_test_rx()
507{
508	local h3_should_fail=$1; shift
509	local what=$1; shift
510
511	RET=0
512
513	ping_do "$h1.10" 192.0.2.3
514	check_err $? "H2 should respond"
515
516	ping_do "$h1.10" 192.0.2.4
517	check_err_fail "$h3_should_fail" $? "H3 responds"
518
519	log_test "VXLAN MC flood $what"
520}
521
522ipv6_do_test_rx()
523{
524	local h3_should_fail=$1; shift
525	local what=$1; shift
526
527	RET=0
528
529	ping6_do "$h1.20" 2001:db8:1::3
530	check_err $? "H2 should respond"
531
532	ping6_do "$h1.20" 2001:db8:1::4
533	check_err_fail "$h3_should_fail" $? "H3 responds"
534
535	log_test "VXLAN MC flood $what"
536}
537
538ipv4_nomcroute()
539{
540	# Install a misleading (S,G) rule to attempt to trick the system into
541	# pushing the packets elsewhere.
542	adf_install_broken_sg
543	vx10_create local 192.0.2.100 group "$GROUP4" dev "$swp2"
544	do_test 4 10 0 "IPv4 nomcroute"
545}
546
547ipv6_nomcroute()
548{
549	# Like for IPv4, install a misleading (S,G).
550	adf_install_broken_sg
551	vx20_create local 2001:db8:4::1 group "$GROUP6" dev "$swp2"
552	do_test 6 10 0 "IPv6 nomcroute"
553}
554
555ipv4_nomcroute_rx()
556{
557	vx10_create local 192.0.2.100 group "$GROUP4" dev "$swp2"
558	ipv4_do_test_rx 1 "IPv4 nomcroute ping"
559}
560
561ipv6_nomcroute_rx()
562{
563	vx20_create local 2001:db8:4::1 group "$GROUP6" dev "$swp2"
564	ipv6_do_test_rx 1 "IPv6 nomcroute ping"
565}
566
567ipv4_mcroute()
568{
569	adf_install_sg
570	vx10_create local 192.0.2.100 group "$GROUP4" dev "$IPMR" mcroute
571	do_test 4 10 10 "IPv4 mcroute"
572}
573
574ipv6_mcroute()
575{
576	adf_install_sg
577	vx20_create local 2001:db8:4::1 group "$GROUP6" dev "$IPMR" mcroute
578	do_test 6 10 10 "IPv6 mcroute"
579}
580
581ipv4_mcroute_rx()
582{
583	adf_install_sg
584	vx10_create local 192.0.2.100 group "$GROUP4" dev "$IPMR" mcroute
585	ipv4_do_test_rx 0 "IPv4 mcroute ping"
586}
587
588ipv6_mcroute_rx()
589{
590	adf_install_sg
591	vx20_create local 2001:db8:4::1 group "$GROUP6" dev "$IPMR" mcroute
592	ipv6_do_test_rx 0 "IPv6 mcroute ping"
593}
594
595ipv4_mcroute_changelink()
596{
597	adf_install_sg
598	vx10_create local 192.0.2.100 group "$GROUP4" dev "$IPMR"
599	ip link set dev vx10 type vxlan mcroute
600	sleep 1
601	do_test 4 10 10 "IPv4 mcroute changelink"
602}
603
604ipv6_mcroute_changelink()
605{
606	adf_install_sg
607	vx20_create local 2001:db8:4::1 group "$GROUP6" dev "$IPMR" mcroute
608	ip link set dev vx20 type vxlan mcroute
609	sleep 1
610	do_test 6 10 10 "IPv6 mcroute changelink"
611}
612
613ipv4_mcroute_starg()
614{
615	adf_install_starg
616	vx10_create local 192.0.2.100 group "$GROUP4" dev "$IPMR" mcroute
617	do_test 4 10 10 "IPv4 mcroute (*,G)"
618}
619
620ipv6_mcroute_starg()
621{
622	adf_install_starg
623	vx20_create local 2001:db8:4::1 group "$GROUP6" dev "$IPMR" mcroute
624	do_test 6 10 10 "IPv6 mcroute (*,G)"
625}
626
627ipv4_mcroute_starg_rx()
628{
629	adf_install_starg
630	vx10_create local 192.0.2.100 group "$GROUP4" dev "$IPMR" mcroute
631	ipv4_do_test_rx 0 "IPv4 mcroute (*,G) ping"
632}
633
634ipv6_mcroute_starg_rx()
635{
636	adf_install_starg
637	vx20_create local 2001:db8:4::1 group "$GROUP6" dev "$IPMR" mcroute
638	ipv6_do_test_rx 0 "IPv6 mcroute (*,G) ping"
639}
640
641ipv4_mcroute_noroute()
642{
643	vx10_create local 192.0.2.100 group "$GROUP4" dev "$IPMR" mcroute
644	do_test 4 0 0 "IPv4 mcroute, no route"
645}
646
647ipv6_mcroute_noroute()
648{
649	vx20_create local 2001:db8:4::1 group "$GROUP6" dev "$IPMR" mcroute
650	do_test 6 0 0 "IPv6 mcroute, no route"
651}
652
653ipv4_mcroute_fdb()
654{
655	adf_install_sg
656	vx10_create local 192.0.2.100 dev "$IPMR" mcroute
657	bridge fdb add dev vx10 \
658		00:00:00:00:00:00 self static dst "$GROUP4" via "$IPMR"
659	do_test 4 10 10 "IPv4 mcroute FDB"
660}
661
662ipv6_mcroute_fdb()
663{
664	adf_install_sg
665	vx20_create local 2001:db8:4::1 dev "$IPMR" mcroute
666	bridge -6 fdb add dev vx20 \
667		00:00:00:00:00:00 self static dst "$GROUP6" via "$IPMR"
668	do_test 6 10 10 "IPv6 mcroute FDB"
669}
670
671# Use FDB to configure VXLAN in a way where oif=0 for purposes of FIB lookup.
672ipv4_mcroute_fdb_oif0()
673{
674	adf_install_sg
675	vx10_create local 192.0.2.100 group "$GROUP4" dev "$IPMR" mcroute
676	bridge fdb del dev vx10 00:00:00:00:00:00
677	bridge fdb add dev vx10 00:00:00:00:00:00 self static dst "$GROUP4"
678	do_test 4 10 10 "IPv4 mcroute oif=0"
679}
680
681ipv6_mcroute_fdb_oif0()
682{
683	# The IPv6 tunnel lookup does not fall back to selection by source
684	# address. Instead it just does a FIB match, and that would find one of
685	# the several ff00::/8 multicast routes -- each device has one. In order
686	# to reliably force the $IPMR device, add a /128 route for the
687	# destination group address.
688	ip -6 route add table local multicast "$GROUP6/128" dev "$IPMR"
689	defer ip -6 route del table local multicast "$GROUP6/128" dev "$IPMR"
690
691	adf_install_sg
692	vx20_create local 2001:db8:4::1 group "$GROUP6" dev "$IPMR" mcroute
693	bridge -6 fdb del dev vx20 00:00:00:00:00:00
694	bridge -6 fdb add dev vx20 00:00:00:00:00:00 self static dst "$GROUP6"
695	do_test 6 10 10 "IPv6 mcroute oif=0"
696}
697
698# In oif=0 test as above, have FIB lookup resolve to loopback instead of IPMR.
699# This doesn't work with IPv6 -- a MC route on lo would be marked as RTF_REJECT.
700ipv4_mcroute_fdb_oif0_sep()
701{
702	adf_install_sg_sep
703
704	adf_ip_addr_add lo 192.0.2.120/28
705	vx10_create local 192.0.2.120 group "$GROUP4" dev "$IPMR" mcroute
706	bridge fdb del dev vx10 00:00:00:00:00:00
707	bridge fdb add dev vx10 00:00:00:00:00:00 self static dst "$GROUP4"
708	do_test 4 10 10 "IPv4 mcroute TX!=RX oif=0"
709}
710
711ipv4_mcroute_fdb_oif0_sep_rx()
712{
713	adf_install_sg_sep_rx lo
714
715	adf_ip_addr_add lo 192.0.2.120/28
716	vx10_create local 192.0.2.120 group "$GROUP4" dev "$IPMR" mcroute
717	bridge fdb del dev vx10 00:00:00:00:00:00
718	bridge fdb add dev vx10 00:00:00:00:00:00 self static dst "$GROUP4"
719	ipv4_do_test_rx 0 "IPv4 mcroute TX!=RX oif=0 ping"
720}
721
722ipv4_mcroute_fdb_sep_rx()
723{
724	adf_install_sg_sep_rx lo
725
726	adf_ip_addr_add lo 192.0.2.120/28
727	vx10_create local 192.0.2.120 group "$GROUP4" dev "$IPMR" mcroute
728	bridge fdb del dev vx10 00:00:00:00:00:00
729	bridge fdb add \
730	       dev vx10 00:00:00:00:00:00 self static dst "$GROUP4" via lo
731	ipv4_do_test_rx 0 "IPv4 mcroute TX!=RX ping"
732}
733
734ipv6_mcroute_fdb_sep_rx()
735{
736	adf_install_sg_sep_rx "X$IPMR"
737
738	adf_ip_addr_add "X$IPMR" 2001:db8:5::1/64
739	vx20_create local 2001:db8:5::1 group "$GROUP6" dev "$IPMR" mcroute
740	bridge -6 fdb del dev vx20 00:00:00:00:00:00
741	bridge -6 fdb add dev vx20 00:00:00:00:00:00 \
742			  self static dst "$GROUP6" via "X$IPMR"
743	ipv6_do_test_rx 0 "IPv6 mcroute TX!=RX ping"
744}
745
746trap cleanup EXIT
747
748setup_prepare
749setup_wait
750tests_run
751
752exit "$EXIT_STATUS"
753