1728b3525SAmit Cohen#!/bin/bash
2728b3525SAmit Cohen# SPDX-License-Identifier: GPL-2.0
3728b3525SAmit Cohen
4728b3525SAmit Cohen# +-----------------------+                          +------------------------+
5728b3525SAmit Cohen# | H1 (vrf)              |                          | H2 (vrf)               |
6728b3525SAmit Cohen# | + $h1.10              |                          | + $h2.10               |
7728b3525SAmit Cohen# | | 192.0.2.1/28        |                          | | 192.0.2.2/28         |
8728b3525SAmit Cohen# | | 2001:db8:1::1/64    |                          | | 2001:db8:1::2/64     |
9728b3525SAmit Cohen# | |                     |                          | |                      |
10728b3525SAmit Cohen# | |  + $h1.20           |                          | |  + $h2.20            |
11728b3525SAmit Cohen# | \  | 198.51.100.1/24  |                          | \  | 198.51.100.2/24   |
12728b3525SAmit Cohen# |  \ | 2001:db8:2::1/64 |                          |  \ | 2001:db8:2::2/64  |
13728b3525SAmit Cohen# |   \|                  |                          |   \|                   |
14728b3525SAmit Cohen# |    + $h1              |                          |    + $h2               |
15728b3525SAmit Cohen# +----|------------------+                          +----|-------------------+
16728b3525SAmit Cohen#      |                                                  |
17728b3525SAmit Cohen# +----|--------------------------------------------------|-------------------+
18728b3525SAmit Cohen# | SW |                                                  |                   |
19728b3525SAmit Cohen# | +--|--------------------------------------------------|-----------------+ |
20728b3525SAmit Cohen# | |  + $swp1                   BR1 (802.1q)             + $swp2           | |
21728b3525SAmit Cohen# | |     vid 10                                             vid 10         | |
22728b3525SAmit Cohen# | |     vid 20                                             vid 20         | |
23728b3525SAmit Cohen# | |                                                                       | |
24728b3525SAmit Cohen# | |  + vx10 (vxlan)                        + vx20 (vxlan)                 | |
25728b3525SAmit Cohen# | |    local:                                local:                       | |
26728b3525SAmit Cohen# | |    2001:db8:3::1                         2001:db8:3::1                | |
27728b3525SAmit Cohen# | |    remote:                               remote:                      | |
28728b3525SAmit Cohen# | |    2001:db8:4::1 2001:db8:5::1           2001:db8:4::1 2001:db8:5::1  | |
29728b3525SAmit Cohen# | |    id 1000 dstport $VXPORT               id 2000 dstport $VXPORT      | |
30728b3525SAmit Cohen# | |    vid 10 pvid untagged                  vid 20 pvid untagged         | |
31728b3525SAmit Cohen# | +-----------------------------------------------------------------------+ |
32728b3525SAmit Cohen# |                                                                           |
33728b3525SAmit Cohen# |  2001:db8:4::0/64 via 2001:db8:3::2                                       |
34728b3525SAmit Cohen# |  2001:db8:5::0/64 via 2001:db8:3::2                                       |
35728b3525SAmit Cohen# |                                                                           |
36728b3525SAmit Cohen# |    + $rp1                                                                 |
37728b3525SAmit Cohen# |    | 2001:db8:3::1/64                                                     |
38728b3525SAmit Cohen# +----|----------------------------------------------------------------------+
39728b3525SAmit Cohen#      |
40728b3525SAmit Cohen# +----|----------------------------------------------------------+
41728b3525SAmit Cohen# |    |                                             VRP2 (vrf)   |
42728b3525SAmit Cohen# |    + $rp2                                                     |
43728b3525SAmit Cohen# |      2001:db8:3::2/64                                         |
44728b3525SAmit Cohen# |                                                               |  (maybe) HW
45728b3525SAmit Cohen# =============================================================================
46728b3525SAmit Cohen# |                                                               |  (likely) SW
47728b3525SAmit Cohen# |    + v1 (veth)                             + v3 (veth)        |
48728b3525SAmit Cohen# |    | 2001:db8:4::2/64                      | 2001:db8:5::2/64 |
49728b3525SAmit Cohen# +----|---------------------------------------|------------------+
50728b3525SAmit Cohen#      |                                       |
51728b3525SAmit Cohen# +----|--------------------------------+ +----|-------------------------------+
52728b3525SAmit Cohen# |    + v2 (veth)        NS1 (netns)   | |    + v4 (veth)        NS2 (netns)  |
53728b3525SAmit Cohen# |      2001:db8:4::1/64               | |      2001:db8:5::1/64              |
54728b3525SAmit Cohen# |                                     | |                                    |
55728b3525SAmit Cohen# | 2001:db8:3::0/64 via 2001:db8:4::2  | | 2001:db8:3::0/64 via 2001:db8:5::2 |
56728b3525SAmit Cohen# | 2001:db8:5::1/128 via 2001:db8:4::2 | | 2001:db8:4::1/128 via              |
57728b3525SAmit Cohen# |                                     | |         2001:db8:5::2              |
58728b3525SAmit Cohen# |                                     | |                                    |
59728b3525SAmit Cohen# | +-------------------------------+   | | +-------------------------------+  |
60728b3525SAmit Cohen# | |                  BR2 (802.1q) |   | | |                  BR2 (802.1q) |  |
61728b3525SAmit Cohen# | |  + vx10 (vxlan)               |   | | |  + vx10 (vxlan)               |  |
62728b3525SAmit Cohen# | |    local 2001:db8:4::1        |   | | |    local 2001:db8:5::1        |  |
63728b3525SAmit Cohen# | |    remote 2001:db8:3::1       |   | | |    remote 2001:db8:3::1       |  |
64728b3525SAmit Cohen# | |    remote 2001:db8:5::1       |   | | |    remote 2001:db8:4::1       |  |
65728b3525SAmit Cohen# | |    id 1000 dstport $VXPORT    |   | | |    id 1000 dstport $VXPORT    |  |
66728b3525SAmit Cohen# | |    vid 10 pvid untagged       |   | | |    vid 10 pvid untagged       |  |
67728b3525SAmit Cohen# | |                               |   | | |                               |  |
68728b3525SAmit Cohen# | |  + vx20 (vxlan)               |   | | |  + vx20 (vxlan)               |  |
69728b3525SAmit Cohen# | |    local 2001:db8:4::1        |   | | |    local 2001:db8:5::1        |  |
70728b3525SAmit Cohen# | |    remote 2001:db8:3::1       |   | | |    remote 2001:db8:3::1       |  |
71728b3525SAmit Cohen# | |    remote 2001:db8:5::1       |   | | |    remote 2001:db8:4::1       |  |
72728b3525SAmit Cohen# | |    id 2000 dstport $VXPORT    |   | | |    id 2000 dstport $VXPORT    |  |
73728b3525SAmit Cohen# | |    vid 20 pvid untagged       |   | | |    vid 20 pvid untagged       |  |
74728b3525SAmit Cohen# | |                               |   | | |                               |  |
75728b3525SAmit Cohen# | |  + w1 (veth)                  |   | | |  + w1 (veth)                  |  |
76728b3525SAmit Cohen# | |  | vid 10                     |   | | |  | vid 10                     |  |
77728b3525SAmit Cohen# | |  | vid 20                     |   | | |  | vid 20                     |  |
78728b3525SAmit Cohen# | +--|----------------------------+   | | +--|----------------------------+  |
79728b3525SAmit Cohen# |    |                                | |    |                               |
80728b3525SAmit Cohen# | +--|----------------------------+   | | +--|----------------------------+  |
81728b3525SAmit Cohen# | |  + w2 (veth)        VW2 (vrf) |   | | |  + w2 (veth)        VW2 (vrf) |  |
82728b3525SAmit Cohen# | |  |\                           |   | | |  |\                           |  |
83728b3525SAmit Cohen# | |  | + w2.10                    |   | | |  | + w2.10                    |  |
84728b3525SAmit Cohen# | |  |   192.0.2.3/28             |   | | |  |   192.0.2.4/28             |  |
85728b3525SAmit Cohen# | |  |   2001:db8:1::3/64         |   | | |  |   2001:db8:1::4/64         |  |
86728b3525SAmit Cohen# | |  |                            |   | | |  |                            |  |
87728b3525SAmit Cohen# | |  + w2.20                      |   | | |  + w2.20                      |  |
88728b3525SAmit Cohen# | |    198.51.100.3/24            |   | | |    198.51.100.4/24            |  |
89728b3525SAmit Cohen# | |    2001:db8:2::3/64           |   | | |    2001:db8:2::4/64           |  |
90728b3525SAmit Cohen# | +-------------------------------+   | | +-------------------------------+  |
91728b3525SAmit Cohen# +-------------------------------------+ +------------------------------------+
92728b3525SAmit Cohen
93728b3525SAmit Cohen: ${VXPORT:=4789}
94728b3525SAmit Cohenexport VXPORT
95728b3525SAmit Cohen
96728b3525SAmit Cohen: ${ALL_TESTS:="
97728b3525SAmit Cohen	ping_ipv4
98728b3525SAmit Cohen	ping_ipv6
99728b3525SAmit Cohen	test_flood
100728b3525SAmit Cohen	test_unicast
101728b3525SAmit Cohen	reapply_config
102728b3525SAmit Cohen	ping_ipv4
103728b3525SAmit Cohen	ping_ipv6
104728b3525SAmit Cohen	test_flood
105728b3525SAmit Cohen	test_unicast
106728b3525SAmit Cohen	test_pvid
107728b3525SAmit Cohen	ping_ipv4
108728b3525SAmit Cohen	ping_ipv6
109728b3525SAmit Cohen	test_flood
110728b3525SAmit Cohen	test_pvid
111728b3525SAmit Cohen"}
112728b3525SAmit Cohen
113728b3525SAmit CohenNUM_NETIFS=6
114728b3525SAmit Cohensource lib.sh
115728b3525SAmit Cohensource tc_common.sh
116728b3525SAmit Cohen
117728b3525SAmit Cohenh1_create()
118728b3525SAmit Cohen{
119728b3525SAmit Cohen	simple_if_init $h1
120728b3525SAmit Cohen	tc qdisc add dev $h1 clsact
121728b3525SAmit Cohen	vlan_create $h1 10 v$h1 192.0.2.1/28 2001:db8:1::1/64
122728b3525SAmit Cohen	vlan_create $h1 20 v$h1 198.51.100.1/24 2001:db8:2::1/64
123728b3525SAmit Cohen}
124728b3525SAmit Cohen
125728b3525SAmit Cohenh1_destroy()
126728b3525SAmit Cohen{
127728b3525SAmit Cohen	vlan_destroy $h1 20
128728b3525SAmit Cohen	vlan_destroy $h1 10
129728b3525SAmit Cohen	tc qdisc del dev $h1 clsact
130728b3525SAmit Cohen	simple_if_fini $h1
131728b3525SAmit Cohen}
132728b3525SAmit Cohen
133728b3525SAmit Cohenh2_create()
134728b3525SAmit Cohen{
135728b3525SAmit Cohen	simple_if_init $h2
136728b3525SAmit Cohen	tc qdisc add dev $h2 clsact
137728b3525SAmit Cohen	vlan_create $h2 10 v$h2 192.0.2.2/28 2001:db8:1::2/64
138728b3525SAmit Cohen	vlan_create $h2 20 v$h2 198.51.100.2/24 2001:db8:2::2/64
139728b3525SAmit Cohen}
140728b3525SAmit Cohen
141728b3525SAmit Cohenh2_destroy()
142728b3525SAmit Cohen{
143728b3525SAmit Cohen	vlan_destroy $h2 20
144728b3525SAmit Cohen	vlan_destroy $h2 10
145728b3525SAmit Cohen	tc qdisc del dev $h2 clsact
146728b3525SAmit Cohen	simple_if_fini $h2
147728b3525SAmit Cohen}
148728b3525SAmit Cohen
149728b3525SAmit Cohenrp1_set_addr()
150728b3525SAmit Cohen{
151728b3525SAmit Cohen	ip address add dev $rp1 2001:db8:3::1/64
152728b3525SAmit Cohen
153728b3525SAmit Cohen	ip route add 2001:db8:4::0/64 nexthop via 2001:db8:3::2
154728b3525SAmit Cohen	ip route add 2001:db8:5::0/64 nexthop via 2001:db8:3::2
155728b3525SAmit Cohen}
156728b3525SAmit Cohen
157728b3525SAmit Cohenrp1_unset_addr()
158728b3525SAmit Cohen{
159728b3525SAmit Cohen	ip route del 2001:db8:5::0/64 nexthop via 2001:db8:3::2
160728b3525SAmit Cohen	ip route del 2001:db8:4::0/64 nexthop via 2001:db8:3::2
161728b3525SAmit Cohen
162728b3525SAmit Cohen	ip address del dev $rp1 2001:db8:3::1/64
163728b3525SAmit Cohen}
164728b3525SAmit Cohen
165728b3525SAmit Cohenswitch_create()
166728b3525SAmit Cohen{
167728b3525SAmit Cohen	ip link add name br1 type bridge vlan_filtering 1 vlan_default_pvid 0 \
168728b3525SAmit Cohen		mcast_snooping 0
169728b3525SAmit Cohen	# Make sure the bridge uses the MAC address of the local port and not
170728b3525SAmit Cohen	# that of the VxLAN's device.
171728b3525SAmit Cohen	ip link set dev br1 address $(mac_get $swp1)
172728b3525SAmit Cohen	ip link set dev br1 up
173728b3525SAmit Cohen
174728b3525SAmit Cohen	ip link set dev $rp1 up
175728b3525SAmit Cohen	rp1_set_addr
176728b3525SAmit Cohen	tc qdisc add dev $rp1 clsact
177728b3525SAmit Cohen
178728b3525SAmit Cohen	ip link add name vx10 type vxlan id 1000 local 2001:db8:3::1 \
179728b3525SAmit Cohen		dstport "$VXPORT" nolearning udp6zerocsumrx udp6zerocsumtx \
180728b3525SAmit Cohen		tos inherit ttl 100
181728b3525SAmit Cohen	ip link set dev vx10 up
182728b3525SAmit Cohen
183728b3525SAmit Cohen	ip link set dev vx10 master br1
184728b3525SAmit Cohen	bridge vlan add vid 10 dev vx10 pvid untagged
185728b3525SAmit Cohen
186728b3525SAmit Cohen	ip link add name vx20 type vxlan id 2000 local 2001:db8:3::1 \
187728b3525SAmit Cohen		dstport "$VXPORT" nolearning udp6zerocsumrx udp6zerocsumtx \
188728b3525SAmit Cohen		tos inherit ttl 100
189728b3525SAmit Cohen	ip link set dev vx20 up
190728b3525SAmit Cohen
191728b3525SAmit Cohen	ip link set dev vx20 master br1
192728b3525SAmit Cohen	bridge vlan add vid 20 dev vx20 pvid untagged
193728b3525SAmit Cohen
194728b3525SAmit Cohen	ip link set dev $swp1 master br1
195728b3525SAmit Cohen	ip link set dev $swp1 up
196728b3525SAmit Cohen	tc qdisc add dev $swp1 clsact
197728b3525SAmit Cohen	bridge vlan add vid 10 dev $swp1
198728b3525SAmit Cohen	bridge vlan add vid 20 dev $swp1
199728b3525SAmit Cohen
200728b3525SAmit Cohen	ip link set dev $swp2 master br1
201728b3525SAmit Cohen	ip link set dev $swp2 up
202728b3525SAmit Cohen	bridge vlan add vid 10 dev $swp2
203728b3525SAmit Cohen	bridge vlan add vid 20 dev $swp2
204728b3525SAmit Cohen
205728b3525SAmit Cohen	bridge fdb append dev vx10 00:00:00:00:00:00 dst 2001:db8:4::1 self
206728b3525SAmit Cohen	bridge fdb append dev vx10 00:00:00:00:00:00 dst 2001:db8:5::1 self
207728b3525SAmit Cohen
208728b3525SAmit Cohen	bridge fdb append dev vx20 00:00:00:00:00:00 dst 2001:db8:4::1 self
209728b3525SAmit Cohen	bridge fdb append dev vx20 00:00:00:00:00:00 dst 2001:db8:5::1 self
210728b3525SAmit Cohen}
211728b3525SAmit Cohen
212728b3525SAmit Cohenswitch_destroy()
213728b3525SAmit Cohen{
214728b3525SAmit Cohen	bridge fdb del dev vx20 00:00:00:00:00:00 dst 2001:db8:5::1 self
215728b3525SAmit Cohen	bridge fdb del dev vx20 00:00:00:00:00:00 dst 2001:db8:4::1 self
216728b3525SAmit Cohen
217728b3525SAmit Cohen	bridge fdb del dev vx10 00:00:00:00:00:00 dst 2001:db8:5::1 self
218728b3525SAmit Cohen	bridge fdb del dev vx10 00:00:00:00:00:00 dst 2001:db8:4::1 self
219728b3525SAmit Cohen
220728b3525SAmit Cohen	bridge vlan del vid 20 dev $swp2
221728b3525SAmit Cohen	bridge vlan del vid 10 dev $swp2
222728b3525SAmit Cohen	ip link set dev $swp2 down
223728b3525SAmit Cohen	ip link set dev $swp2 nomaster
224728b3525SAmit Cohen
225728b3525SAmit Cohen	bridge vlan del vid 20 dev $swp1
226728b3525SAmit Cohen	bridge vlan del vid 10 dev $swp1
227728b3525SAmit Cohen	tc qdisc del dev $swp1 clsact
228728b3525SAmit Cohen	ip link set dev $swp1 down
229728b3525SAmit Cohen	ip link set dev $swp1 nomaster
230728b3525SAmit Cohen
231728b3525SAmit Cohen	bridge vlan del vid 20 dev vx20
232728b3525SAmit Cohen	ip link set dev vx20 nomaster
233728b3525SAmit Cohen
234728b3525SAmit Cohen	ip link set dev vx20 down
235728b3525SAmit Cohen	ip link del dev vx20
236728b3525SAmit Cohen
237728b3525SAmit Cohen	bridge vlan del vid 10 dev vx10
238728b3525SAmit Cohen	ip link set dev vx10 nomaster
239728b3525SAmit Cohen
240728b3525SAmit Cohen	ip link set dev vx10 down
241728b3525SAmit Cohen	ip link del dev vx10
242728b3525SAmit Cohen
243728b3525SAmit Cohen	tc qdisc del dev $rp1 clsact
244728b3525SAmit Cohen	rp1_unset_addr
245728b3525SAmit Cohen	ip link set dev $rp1 down
246728b3525SAmit Cohen
247728b3525SAmit Cohen	ip link set dev br1 down
248728b3525SAmit Cohen	ip link del dev br1
249728b3525SAmit Cohen}
250728b3525SAmit Cohen
251728b3525SAmit Cohenvrp2_create()
252728b3525SAmit Cohen{
253728b3525SAmit Cohen	simple_if_init $rp2 2001:db8:3::2/64
254728b3525SAmit Cohen	__simple_if_init v1 v$rp2 2001:db8:4::2/64
255728b3525SAmit Cohen	__simple_if_init v3 v$rp2 2001:db8:5::2/64
256728b3525SAmit Cohen	tc qdisc add dev v1 clsact
257728b3525SAmit Cohen}
258728b3525SAmit Cohen
259728b3525SAmit Cohenvrp2_destroy()
260728b3525SAmit Cohen{
261728b3525SAmit Cohen	tc qdisc del dev v1 clsact
262728b3525SAmit Cohen	__simple_if_fini v3 2001:db8:5::2/64
263728b3525SAmit Cohen	__simple_if_fini v1 2001:db8:4::2/64
264728b3525SAmit Cohen	simple_if_fini $rp2 2001:db8:3::2/64
265728b3525SAmit Cohen}
266728b3525SAmit Cohen
267728b3525SAmit Cohenns_init_common()
268728b3525SAmit Cohen{
269728b3525SAmit Cohen	local in_if=$1; shift
270728b3525SAmit Cohen	local in_addr=$1; shift
271728b3525SAmit Cohen	local other_in_addr=$1; shift
272728b3525SAmit Cohen	local nh_addr=$1; shift
273728b3525SAmit Cohen	local host_addr1_ipv4=$1; shift
274728b3525SAmit Cohen	local host_addr1_ipv6=$1; shift
275728b3525SAmit Cohen	local host_addr2_ipv4=$1; shift
276728b3525SAmit Cohen	local host_addr2_ipv6=$1; shift
277728b3525SAmit Cohen
278728b3525SAmit Cohen	ip link set dev $in_if up
279728b3525SAmit Cohen	ip address add dev $in_if $in_addr/64
280728b3525SAmit Cohen	tc qdisc add dev $in_if clsact
281728b3525SAmit Cohen
282728b3525SAmit Cohen	ip link add name br2 type bridge vlan_filtering 1 vlan_default_pvid 0
283728b3525SAmit Cohen	ip link set dev br2 up
284728b3525SAmit Cohen
285728b3525SAmit Cohen	ip link add name w1 type veth peer name w2
286728b3525SAmit Cohen
287728b3525SAmit Cohen	ip link set dev w1 master br2
288728b3525SAmit Cohen	ip link set dev w1 up
289728b3525SAmit Cohen
290728b3525SAmit Cohen	bridge vlan add vid 10 dev w1
291728b3525SAmit Cohen	bridge vlan add vid 20 dev w1
292728b3525SAmit Cohen
293728b3525SAmit Cohen	ip link add name vx10 type vxlan id 1000 local $in_addr \
294728b3525SAmit Cohen		dstport "$VXPORT" udp6zerocsumrx
295728b3525SAmit Cohen	ip link set dev vx10 up
296728b3525SAmit Cohen	bridge fdb append dev vx10 00:00:00:00:00:00 dst 2001:db8:3::1 self
297728b3525SAmit Cohen	bridge fdb append dev vx10 00:00:00:00:00:00 dst $other_in_addr self
298728b3525SAmit Cohen
299728b3525SAmit Cohen	ip link set dev vx10 master br2
300728b3525SAmit Cohen	tc qdisc add dev vx10 clsact
301728b3525SAmit Cohen
302728b3525SAmit Cohen	bridge vlan add vid 10 dev vx10 pvid untagged
303728b3525SAmit Cohen
304728b3525SAmit Cohen	ip link add name vx20 type vxlan id 2000 local $in_addr \
305728b3525SAmit Cohen		dstport "$VXPORT" udp6zerocsumrx
306728b3525SAmit Cohen	ip link set dev vx20 up
307728b3525SAmit Cohen	bridge fdb append dev vx20 00:00:00:00:00:00 dst 2001:db8:3::1 self
308728b3525SAmit Cohen	bridge fdb append dev vx20 00:00:00:00:00:00 dst $other_in_addr self
309728b3525SAmit Cohen
310728b3525SAmit Cohen	ip link set dev vx20 master br2
311728b3525SAmit Cohen	tc qdisc add dev vx20 clsact
312728b3525SAmit Cohen
313728b3525SAmit Cohen	bridge vlan add vid 20 dev vx20 pvid untagged
314728b3525SAmit Cohen
315728b3525SAmit Cohen	simple_if_init w2
316728b3525SAmit Cohen        vlan_create w2 10 vw2 $host_addr1_ipv4/28 $host_addr1_ipv6/64
317728b3525SAmit Cohen        vlan_create w2 20 vw2 $host_addr2_ipv4/24 $host_addr2_ipv6/64
318728b3525SAmit Cohen
319728b3525SAmit Cohen	ip route add 2001:db8:3::0/64 nexthop via $nh_addr
320728b3525SAmit Cohen	ip route add $other_in_addr/128 nexthop via $nh_addr
321728b3525SAmit Cohen}
322728b3525SAmit Cohenexport -f ns_init_common
323728b3525SAmit Cohen
324728b3525SAmit Cohenns1_create()
325728b3525SAmit Cohen{
326728b3525SAmit Cohen	ip netns add ns1
327728b3525SAmit Cohen	ip link set dev v2 netns ns1
328728b3525SAmit Cohen	in_ns ns1 \
329728b3525SAmit Cohen	      ns_init_common v2 2001:db8:4::1 2001:db8:5::1 2001:db8:4::2 \
330728b3525SAmit Cohen	      192.0.2.3 2001:db8:1::3 198.51.100.3 2001:db8:2::3
331728b3525SAmit Cohen}
332728b3525SAmit Cohen
333728b3525SAmit Cohenns1_destroy()
334728b3525SAmit Cohen{
335728b3525SAmit Cohen	ip netns exec ns1 ip link set dev v2 netns 1
336728b3525SAmit Cohen	ip netns del ns1
337728b3525SAmit Cohen}
338728b3525SAmit Cohen
339728b3525SAmit Cohenns2_create()
340728b3525SAmit Cohen{
341728b3525SAmit Cohen	ip netns add ns2
342728b3525SAmit Cohen	ip link set dev v4 netns ns2
343728b3525SAmit Cohen	in_ns ns2 \
344728b3525SAmit Cohen	      ns_init_common v4 2001:db8:5::1 2001:db8:4::1 2001:db8:5::2 \
345728b3525SAmit Cohen	      192.0.2.4 2001:db8:1::4 198.51.100.4 2001:db8:2::4
346728b3525SAmit Cohen}
347728b3525SAmit Cohen
348728b3525SAmit Cohenns2_destroy()
349728b3525SAmit Cohen{
350728b3525SAmit Cohen	ip netns exec ns2 ip link set dev v4 netns 1
351728b3525SAmit Cohen	ip netns del ns2
352728b3525SAmit Cohen}
353728b3525SAmit Cohen
354728b3525SAmit Cohensetup_prepare()
355728b3525SAmit Cohen{
356728b3525SAmit Cohen	h1=${NETIFS[p1]}
357728b3525SAmit Cohen	swp1=${NETIFS[p2]}
358728b3525SAmit Cohen
359728b3525SAmit Cohen	swp2=${NETIFS[p3]}
360728b3525SAmit Cohen	h2=${NETIFS[p4]}
361728b3525SAmit Cohen
362728b3525SAmit Cohen	rp1=${NETIFS[p5]}
363728b3525SAmit Cohen	rp2=${NETIFS[p6]}
364728b3525SAmit Cohen
365728b3525SAmit Cohen	vrf_prepare
366728b3525SAmit Cohen	forwarding_enable
367728b3525SAmit Cohen
368728b3525SAmit Cohen	h1_create
369728b3525SAmit Cohen	h2_create
370728b3525SAmit Cohen	switch_create
371728b3525SAmit Cohen
372728b3525SAmit Cohen	ip link add name v1 type veth peer name v2
373728b3525SAmit Cohen	ip link add name v3 type veth peer name v4
374728b3525SAmit Cohen	vrp2_create
375728b3525SAmit Cohen	ns1_create
376728b3525SAmit Cohen	ns2_create
377728b3525SAmit Cohen
378728b3525SAmit Cohen	r1_mac=$(in_ns ns1 mac_get w2)
379728b3525SAmit Cohen	r2_mac=$(in_ns ns2 mac_get w2)
380728b3525SAmit Cohen	h2_mac=$(mac_get $h2)
381728b3525SAmit Cohen}
382728b3525SAmit Cohen
383728b3525SAmit Cohencleanup()
384728b3525SAmit Cohen{
385728b3525SAmit Cohen	pre_cleanup
386728b3525SAmit Cohen
387728b3525SAmit Cohen	ns2_destroy
388728b3525SAmit Cohen	ns1_destroy
389728b3525SAmit Cohen	vrp2_destroy
390728b3525SAmit Cohen	ip link del dev v3
391728b3525SAmit Cohen	ip link del dev v1
392728b3525SAmit Cohen
393728b3525SAmit Cohen	switch_destroy
394728b3525SAmit Cohen	h2_destroy
395728b3525SAmit Cohen	h1_destroy
396728b3525SAmit Cohen
397728b3525SAmit Cohen	forwarding_restore
398728b3525SAmit Cohen	vrf_cleanup
399728b3525SAmit Cohen}
400728b3525SAmit Cohen
401728b3525SAmit Cohen# For the first round of tests, vx10 and vx20 were the first devices to get
402728b3525SAmit Cohen# attached to the bridge, and at that point the local IP is already
403728b3525SAmit Cohen# configured. Try the other scenario of attaching these devices to a bridge
404728b3525SAmit Cohen# that already has local ports members, and only then assign the local IP.
405728b3525SAmit Cohenreapply_config()
406728b3525SAmit Cohen{
407728b3525SAmit Cohen	log_info "Reapplying configuration"
408728b3525SAmit Cohen
409728b3525SAmit Cohen	bridge fdb del dev vx20 00:00:00:00:00:00 dst 2001:db8:5::1 self
410728b3525SAmit Cohen	bridge fdb del dev vx20 00:00:00:00:00:00 dst 2001:db8:4::1 self
411728b3525SAmit Cohen
412728b3525SAmit Cohen	bridge fdb del dev vx10 00:00:00:00:00:00 dst 2001:db8:5::1 self
413728b3525SAmit Cohen	bridge fdb del dev vx10 00:00:00:00:00:00 dst 2001:db8:4::1 self
414728b3525SAmit Cohen
415728b3525SAmit Cohen	ip link set dev vx20 nomaster
416728b3525SAmit Cohen	ip link set dev vx10 nomaster
417728b3525SAmit Cohen
418728b3525SAmit Cohen	rp1_unset_addr
419728b3525SAmit Cohen	sleep 5
420728b3525SAmit Cohen
421728b3525SAmit Cohen	ip link set dev vx10 master br1
422728b3525SAmit Cohen	bridge vlan add vid 10 dev vx10 pvid untagged
423728b3525SAmit Cohen
424728b3525SAmit Cohen	ip link set dev vx20 master br1
425728b3525SAmit Cohen	bridge vlan add vid 20 dev vx20 pvid untagged
426728b3525SAmit Cohen
427728b3525SAmit Cohen	bridge fdb append dev vx10 00:00:00:00:00:00 dst 2001:db8:4::1 self
428728b3525SAmit Cohen	bridge fdb append dev vx10 00:00:00:00:00:00 dst 2001:db8:5::1 self
429728b3525SAmit Cohen
430728b3525SAmit Cohen	bridge fdb append dev vx20 00:00:00:00:00:00 dst 2001:db8:4::1 self
431728b3525SAmit Cohen	bridge fdb append dev vx20 00:00:00:00:00:00 dst 2001:db8:5::1 self
432728b3525SAmit Cohen
433728b3525SAmit Cohen	rp1_set_addr
434728b3525SAmit Cohen	sleep 5
435728b3525SAmit Cohen}
436728b3525SAmit Cohen
437728b3525SAmit Cohen__ping_ipv4()
438728b3525SAmit Cohen{
439728b3525SAmit Cohen	local vxlan_local_ip=$1; shift
440728b3525SAmit Cohen	local vxlan_remote_ip=$1; shift
441728b3525SAmit Cohen	local src_ip=$1; shift
442728b3525SAmit Cohen	local dst_ip=$1; shift
443728b3525SAmit Cohen	local dev=$1; shift
444728b3525SAmit Cohen	local info=$1; shift
445728b3525SAmit Cohen
446728b3525SAmit Cohen	RET=0
447728b3525SAmit Cohen
448728b3525SAmit Cohen	tc filter add dev $rp1 egress protocol ipv6 pref 1 handle 101 \
449728b3525SAmit Cohen		flower ip_proto udp src_ip $vxlan_local_ip \
450728b3525SAmit Cohen		dst_ip $vxlan_remote_ip dst_port $VXPORT $TC_FLAG action pass
451728b3525SAmit Cohen	# Match ICMP-reply packets after decapsulation, so source IP is
452728b3525SAmit Cohen	# destination IP of the ping and destination IP is source IP of the
453728b3525SAmit Cohen	# ping.
454728b3525SAmit Cohen	tc filter add dev $swp1 egress protocol 802.1q pref 1 handle 101 \
455728b3525SAmit Cohen		flower vlan_ethtype ipv4 src_ip $dst_ip dst_ip $src_ip \
456728b3525SAmit Cohen		$TC_FLAG action pass
457728b3525SAmit Cohen
458728b3525SAmit Cohen	# Send 100 packets and verify that at least 100 packets hit the rule,
459728b3525SAmit Cohen	# to overcome ARP noise.
460*b6dfcdbcSIdo Schimmel	PING_COUNT=100 PING_TIMEOUT=20 ping_do $dev $dst_ip
461728b3525SAmit Cohen	check_err $? "Ping failed"
462728b3525SAmit Cohen
463728b3525SAmit Cohen	tc_check_at_least_x_packets "dev $rp1 egress" 101 10 100
464728b3525SAmit Cohen	check_err $? "Encapsulated packets did not go through router"
465728b3525SAmit Cohen
466728b3525SAmit Cohen	tc_check_at_least_x_packets "dev $swp1 egress" 101 10 100
467728b3525SAmit Cohen	check_err $? "Decapsulated packets did not go through switch"
468728b3525SAmit Cohen
469728b3525SAmit Cohen	log_test "ping: $info"
470728b3525SAmit Cohen
471728b3525SAmit Cohen	tc filter del dev $swp1 egress
472728b3525SAmit Cohen	tc filter del dev $rp1 egress
473728b3525SAmit Cohen}
474728b3525SAmit Cohen
475728b3525SAmit Cohenping_ipv4()
476728b3525SAmit Cohen{
477728b3525SAmit Cohen	RET=0
478728b3525SAmit Cohen
479728b3525SAmit Cohen	local local_sw_ip=2001:db8:3::1
480728b3525SAmit Cohen	local remote_ns1_ip=2001:db8:4::1
481728b3525SAmit Cohen	local remote_ns2_ip=2001:db8:5::1
482728b3525SAmit Cohen	local h1_10_ip=192.0.2.1
483728b3525SAmit Cohen	local h1_20_ip=198.51.100.1
484728b3525SAmit Cohen	local w2_10_ns1_ip=192.0.2.3
485728b3525SAmit Cohen	local w2_10_ns2_ip=192.0.2.4
486728b3525SAmit Cohen	local w2_20_ns1_ip=198.51.100.3
487728b3525SAmit Cohen	local w2_20_ns2_ip=198.51.100.4
488728b3525SAmit Cohen
489728b3525SAmit Cohen	ping_test $h1.10 192.0.2.2 ": local->local vid 10"
490728b3525SAmit Cohen	ping_test $h1.20 198.51.100.2 ": local->local vid 20"
491728b3525SAmit Cohen
492728b3525SAmit Cohen	__ping_ipv4 $local_sw_ip $remote_ns1_ip $h1_10_ip $w2_10_ns1_ip $h1.10 \
493728b3525SAmit Cohen		"local->remote 1 vid 10"
494728b3525SAmit Cohen	__ping_ipv4 $local_sw_ip $remote_ns2_ip $h1_10_ip $w2_10_ns2_ip $h1.10 \
495728b3525SAmit Cohen		"local->remote 2 vid 10"
496728b3525SAmit Cohen	__ping_ipv4 $local_sw_ip $remote_ns1_ip $h1_20_ip $w2_20_ns1_ip $h1.20 \
497728b3525SAmit Cohen		"local->remote 1 vid 20"
498728b3525SAmit Cohen	__ping_ipv4 $local_sw_ip $remote_ns2_ip $h1_20_ip $w2_20_ns2_ip $h1.20 \
499728b3525SAmit Cohen		"local->remote 2 vid 20"
500728b3525SAmit Cohen}
501728b3525SAmit Cohen
502728b3525SAmit Cohen__ping_ipv6()
503728b3525SAmit Cohen{
504728b3525SAmit Cohen	local vxlan_local_ip=$1; shift
505728b3525SAmit Cohen	local vxlan_remote_ip=$1; shift
506728b3525SAmit Cohen	local src_ip=$1; shift
507728b3525SAmit Cohen	local dst_ip=$1; shift
508728b3525SAmit Cohen	local dev=$1; shift
509728b3525SAmit Cohen	local info=$1; shift
510728b3525SAmit Cohen
511728b3525SAmit Cohen	RET=0
512728b3525SAmit Cohen
513728b3525SAmit Cohen	tc filter add dev $rp1 egress protocol ipv6 pref 1 handle 101 \
514728b3525SAmit Cohen		flower ip_proto udp src_ip $vxlan_local_ip \
515728b3525SAmit Cohen		dst_ip $vxlan_remote_ip dst_port $VXPORT $TC_FLAG action pass
516728b3525SAmit Cohen	# Match ICMP-reply packets after decapsulation, so source IP is
517728b3525SAmit Cohen	# destination IP of the ping and destination IP is source IP of the
518728b3525SAmit Cohen	# ping.
519728b3525SAmit Cohen	tc filter add dev $swp1 egress protocol 802.1q pref 1 handle 101 \
520728b3525SAmit Cohen		flower vlan_ethtype ipv6 src_ip $dst_ip dst_ip $src_ip \
521728b3525SAmit Cohen		$TC_FLAG action pass
522728b3525SAmit Cohen
523728b3525SAmit Cohen	# Send 100 packets and verify that at least 100 packets hit the rule,
524728b3525SAmit Cohen	# to overcome neighbor discovery noise.
525*b6dfcdbcSIdo Schimmel	PING_COUNT=100 PING_TIMEOUT=20 ping6_do $dev $dst_ip
526728b3525SAmit Cohen	check_err $? "Ping failed"
527728b3525SAmit Cohen
528728b3525SAmit Cohen	tc_check_at_least_x_packets "dev $rp1 egress" 101 100
529728b3525SAmit Cohen	check_err $? "Encapsulated packets did not go through router"
530728b3525SAmit Cohen
531728b3525SAmit Cohen	tc_check_at_least_x_packets "dev $swp1 egress" 101 100
532728b3525SAmit Cohen	check_err $? "Decapsulated packets did not go through switch"
533728b3525SAmit Cohen
534728b3525SAmit Cohen	log_test "ping6: $info"
535728b3525SAmit Cohen
536728b3525SAmit Cohen	tc filter del dev $swp1 egress
537728b3525SAmit Cohen	tc filter del dev $rp1 egress
538728b3525SAmit Cohen}
539728b3525SAmit Cohen
540728b3525SAmit Cohenping_ipv6()
541728b3525SAmit Cohen{
542728b3525SAmit Cohen	RET=0
543728b3525SAmit Cohen
544728b3525SAmit Cohen	local local_sw_ip=2001:db8:3::1
545728b3525SAmit Cohen	local remote_ns1_ip=2001:db8:4::1
546728b3525SAmit Cohen	local remote_ns2_ip=2001:db8:5::1
547728b3525SAmit Cohen	local h1_10_ip=2001:db8:1::1
548728b3525SAmit Cohen	local h1_20_ip=2001:db8:2::1
549728b3525SAmit Cohen	local w2_10_ns1_ip=2001:db8:1::3
550728b3525SAmit Cohen	local w2_10_ns2_ip=2001:db8:1::4
551728b3525SAmit Cohen	local w2_20_ns1_ip=2001:db8:2::3
552728b3525SAmit Cohen	local w2_20_ns2_ip=2001:db8:2::4
553728b3525SAmit Cohen
554728b3525SAmit Cohen	ping6_test $h1.10 2001:db8:1::2 ": local->local vid 10"
555728b3525SAmit Cohen	ping6_test $h1.20 2001:db8:2::2 ": local->local vid 20"
556728b3525SAmit Cohen
557728b3525SAmit Cohen	__ping_ipv6 $local_sw_ip $remote_ns1_ip $h1_10_ip $w2_10_ns1_ip $h1.10 \
558728b3525SAmit Cohen		"local->remote 1 vid 10"
559728b3525SAmit Cohen	__ping_ipv6 $local_sw_ip $remote_ns2_ip $h1_10_ip $w2_10_ns2_ip $h1.10 \
560728b3525SAmit Cohen		"local->remote 2 vid 10"
561728b3525SAmit Cohen	__ping_ipv6 $local_sw_ip $remote_ns1_ip $h1_20_ip $w2_20_ns1_ip $h1.20 \
562728b3525SAmit Cohen		"local->remote 1 vid 20"
563728b3525SAmit Cohen	__ping_ipv6 $local_sw_ip $remote_ns2_ip $h1_20_ip $w2_20_ns2_ip $h1.20 \
564728b3525SAmit Cohen		"local->remote 2 vid 20"
565728b3525SAmit Cohen}
566728b3525SAmit Cohen
567728b3525SAmit Cohenmaybe_in_ns()
568728b3525SAmit Cohen{
569728b3525SAmit Cohen	echo ${1:+in_ns} $1
570728b3525SAmit Cohen}
571728b3525SAmit Cohen
572728b3525SAmit Cohen__flood_counter_add_del()
573728b3525SAmit Cohen{
574728b3525SAmit Cohen	local add_del=$1; shift
575728b3525SAmit Cohen	local dst_ip=$1; shift
576728b3525SAmit Cohen	local dev=$1; shift
577728b3525SAmit Cohen	local ns=$1; shift
578728b3525SAmit Cohen
579728b3525SAmit Cohen	# Putting the ICMP capture both to HW and to SW will end up
580728b3525SAmit Cohen	# double-counting the packets that are trapped to slow path, such as for
581728b3525SAmit Cohen	# the unicast test. Adding either skip_hw or skip_sw fixes this problem,
582728b3525SAmit Cohen	# but with skip_hw, the flooded packets are not counted at all, because
583728b3525SAmit Cohen	# those are dropped due to MAC address mismatch; and skip_sw is a no-go
584728b3525SAmit Cohen	# for veth-based topologies.
585728b3525SAmit Cohen	#
586728b3525SAmit Cohen	# So try to install with skip_sw and fall back to skip_sw if that fails.
587728b3525SAmit Cohen
588728b3525SAmit Cohen	$(maybe_in_ns $ns) tc filter $add_del dev "$dev" ingress \
589728b3525SAmit Cohen	   proto ipv6 pref 100 flower dst_ip $dst_ip ip_proto \
590728b3525SAmit Cohen	   icmpv6 skip_sw action pass 2>/dev/null || \
591728b3525SAmit Cohen	$(maybe_in_ns $ns) tc filter $add_del dev "$dev" ingress \
592728b3525SAmit Cohen	   proto ipv6 pref 100 flower dst_ip $dst_ip ip_proto \
593728b3525SAmit Cohen	   icmpv6 skip_hw action pass
594728b3525SAmit Cohen}
595728b3525SAmit Cohen
596728b3525SAmit Cohenflood_counter_install()
597728b3525SAmit Cohen{
598728b3525SAmit Cohen	__flood_counter_add_del add "$@"
599728b3525SAmit Cohen}
600728b3525SAmit Cohen
601728b3525SAmit Cohenflood_counter_uninstall()
602728b3525SAmit Cohen{
603728b3525SAmit Cohen	__flood_counter_add_del del "$@"
604728b3525SAmit Cohen}
605728b3525SAmit Cohen
606728b3525SAmit Cohenflood_fetch_stat()
607728b3525SAmit Cohen{
608728b3525SAmit Cohen	local dev=$1; shift
609728b3525SAmit Cohen	local ns=$1; shift
610728b3525SAmit Cohen
611728b3525SAmit Cohen	$(maybe_in_ns $ns) tc_rule_stats_get $dev 100 ingress
612728b3525SAmit Cohen}
613728b3525SAmit Cohen
614728b3525SAmit Cohenflood_fetch_stats()
615728b3525SAmit Cohen{
616728b3525SAmit Cohen	local counters=("${@}")
617728b3525SAmit Cohen	local counter
618728b3525SAmit Cohen
619728b3525SAmit Cohen	for counter in "${counters[@]}"; do
620728b3525SAmit Cohen		flood_fetch_stat $counter
621728b3525SAmit Cohen	done
622728b3525SAmit Cohen}
623728b3525SAmit Cohen
624728b3525SAmit Cohenvxlan_flood_test()
625728b3525SAmit Cohen{
626728b3525SAmit Cohen	local mac=$1; shift
627728b3525SAmit Cohen	local dst=$1; shift
628728b3525SAmit Cohen	local vid=$1; shift
629728b3525SAmit Cohen	local -a expects=("${@}")
630728b3525SAmit Cohen
631728b3525SAmit Cohen	local -a counters=($h2 "vx10 ns1" "vx20 ns1" "vx10 ns2" "vx20 ns2")
632728b3525SAmit Cohen	local counter
633728b3525SAmit Cohen	local key
634728b3525SAmit Cohen
635728b3525SAmit Cohen	# Packets reach the local host tagged whereas they reach the VxLAN
636728b3525SAmit Cohen	# devices untagged. In order to be able to use the same filter for
637728b3525SAmit Cohen	# all counters, make sure the packets also reach the local host
638728b3525SAmit Cohen	# untagged
639728b3525SAmit Cohen	bridge vlan add vid $vid dev $swp2 untagged
640728b3525SAmit Cohen	for counter in "${counters[@]}"; do
641728b3525SAmit Cohen		flood_counter_install $dst $counter
642728b3525SAmit Cohen	done
643728b3525SAmit Cohen
644728b3525SAmit Cohen	local -a t0s=($(flood_fetch_stats "${counters[@]}"))
645728b3525SAmit Cohen	$MZ -6 $h1 -Q $vid -c 10 -d 100msec -p 64 -b $mac -B $dst -t icmp6 type=128 -q
646728b3525SAmit Cohen	sleep 1
647728b3525SAmit Cohen	local -a t1s=($(flood_fetch_stats "${counters[@]}"))
648728b3525SAmit Cohen
649728b3525SAmit Cohen	for key in ${!t0s[@]}; do
650728b3525SAmit Cohen		local delta=$((t1s[$key] - t0s[$key]))
651728b3525SAmit Cohen		local expect=${expects[$key]}
652728b3525SAmit Cohen
653728b3525SAmit Cohen		((expect == delta))
654728b3525SAmit Cohen		check_err $? "${counters[$key]}: Expected to capture $expect packets, got $delta."
655728b3525SAmit Cohen	done
656728b3525SAmit Cohen
657728b3525SAmit Cohen	for counter in "${counters[@]}"; do
658728b3525SAmit Cohen		flood_counter_uninstall $dst $counter
659728b3525SAmit Cohen	done
660728b3525SAmit Cohen	bridge vlan add vid $vid dev $swp2
661728b3525SAmit Cohen}
662728b3525SAmit Cohen
663728b3525SAmit Cohen__test_flood()
664728b3525SAmit Cohen{
665728b3525SAmit Cohen	local mac=$1; shift
666728b3525SAmit Cohen	local dst=$1; shift
667728b3525SAmit Cohen	local vid=$1; shift
668728b3525SAmit Cohen	local what=$1; shift
669728b3525SAmit Cohen	local -a expects=("${@}")
670728b3525SAmit Cohen
671728b3525SAmit Cohen	RET=0
672728b3525SAmit Cohen
673728b3525SAmit Cohen	vxlan_flood_test $mac $dst $vid "${expects[@]}"
674728b3525SAmit Cohen
675728b3525SAmit Cohen	log_test "VXLAN: $what"
676728b3525SAmit Cohen}
677728b3525SAmit Cohen
678728b3525SAmit Cohentest_flood()
679728b3525SAmit Cohen{
680728b3525SAmit Cohen	__test_flood de:ad:be:ef:13:37 2001:db8:1::100 10 "flood vlan 10" \
681728b3525SAmit Cohen		10 10 0 10 0
682728b3525SAmit Cohen	__test_flood ca:fe:be:ef:13:37 2001:db8:2::100 20 "flood vlan 20" \
683728b3525SAmit Cohen		10 0 10 0 10
684728b3525SAmit Cohen}
685728b3525SAmit Cohen
686728b3525SAmit Cohenvxlan_fdb_add_del()
687728b3525SAmit Cohen{
688728b3525SAmit Cohen	local add_del=$1; shift
689728b3525SAmit Cohen	local vid=$1; shift
690728b3525SAmit Cohen	local mac=$1; shift
691728b3525SAmit Cohen	local dev=$1; shift
692728b3525SAmit Cohen	local dst=$1; shift
693728b3525SAmit Cohen
694728b3525SAmit Cohen	bridge fdb $add_del dev $dev $mac self static permanent \
695728b3525SAmit Cohen		${dst:+dst} $dst 2>/dev/null
696728b3525SAmit Cohen	bridge fdb $add_del dev $dev $mac master static vlan $vid 2>/dev/null
697728b3525SAmit Cohen}
698728b3525SAmit Cohen
699728b3525SAmit Cohen__test_unicast()
700728b3525SAmit Cohen{
701728b3525SAmit Cohen	local mac=$1; shift
702728b3525SAmit Cohen	local dst=$1; shift
703728b3525SAmit Cohen	local hit_idx=$1; shift
704728b3525SAmit Cohen	local vid=$1; shift
705728b3525SAmit Cohen	local what=$1; shift
706728b3525SAmit Cohen
707728b3525SAmit Cohen	RET=0
708728b3525SAmit Cohen
709728b3525SAmit Cohen	local -a expects=(0 0 0 0 0)
710728b3525SAmit Cohen	expects[$hit_idx]=10
711728b3525SAmit Cohen
712728b3525SAmit Cohen	vxlan_flood_test $mac $dst $vid "${expects[@]}"
713728b3525SAmit Cohen
714728b3525SAmit Cohen	log_test "VXLAN: $what"
715728b3525SAmit Cohen}
716728b3525SAmit Cohen
717728b3525SAmit Cohentest_unicast()
718728b3525SAmit Cohen{
719728b3525SAmit Cohen	local -a targets=("$h2_mac $h2"
720728b3525SAmit Cohen			  "$r1_mac vx10 2001:db8:4::1"
721728b3525SAmit Cohen			  "$r2_mac vx10 2001:db8:5::1")
722728b3525SAmit Cohen	local target
723728b3525SAmit Cohen
724728b3525SAmit Cohen	log_info "unicast vlan 10"
725728b3525SAmit Cohen
726728b3525SAmit Cohen	for target in "${targets[@]}"; do
727728b3525SAmit Cohen		vxlan_fdb_add_del add 10 $target
728728b3525SAmit Cohen	done
729728b3525SAmit Cohen
730728b3525SAmit Cohen	__test_unicast $h2_mac 2001:db8:1::2 0 10 "local MAC unicast"
731728b3525SAmit Cohen	__test_unicast $r1_mac 2001:db8:1::3 1 10 "remote MAC 1 unicast"
732728b3525SAmit Cohen	__test_unicast $r2_mac 2001:db8:1::4 3 10 "remote MAC 2 unicast"
733728b3525SAmit Cohen
734728b3525SAmit Cohen	for target in "${targets[@]}"; do
735728b3525SAmit Cohen		vxlan_fdb_add_del del 10 $target
736728b3525SAmit Cohen	done
737728b3525SAmit Cohen
738728b3525SAmit Cohen	log_info "unicast vlan 20"
739728b3525SAmit Cohen
740728b3525SAmit Cohen	targets=("$h2_mac $h2" "$r1_mac vx20 2001:db8:4::1" \
741728b3525SAmit Cohen		 "$r2_mac vx20 2001:db8:5::1")
742728b3525SAmit Cohen
743728b3525SAmit Cohen	for target in "${targets[@]}"; do
744728b3525SAmit Cohen		vxlan_fdb_add_del add 20 $target
745728b3525SAmit Cohen	done
746728b3525SAmit Cohen
747728b3525SAmit Cohen	__test_unicast $h2_mac 2001:db8:2::2 0 20 "local MAC unicast"
748728b3525SAmit Cohen	__test_unicast $r1_mac 2001:db8:2::3 2 20 "remote MAC 1 unicast"
749728b3525SAmit Cohen	__test_unicast $r2_mac 2001:db8:2::4 4 20 "remote MAC 2 unicast"
750728b3525SAmit Cohen
751728b3525SAmit Cohen	for target in "${targets[@]}"; do
752728b3525SAmit Cohen		vxlan_fdb_add_del del 20 $target
753728b3525SAmit Cohen	done
754728b3525SAmit Cohen}
755728b3525SAmit Cohen
756728b3525SAmit Cohentest_pvid()
757728b3525SAmit Cohen{
758728b3525SAmit Cohen	local -a expects=(0 0 0 0 0)
759728b3525SAmit Cohen	local mac=de:ad:be:ef:13:37
760728b3525SAmit Cohen	local dst=2001:db8:1::100
761728b3525SAmit Cohen	local vid=10
762728b3525SAmit Cohen
763728b3525SAmit Cohen	# Check that flooding works
764728b3525SAmit Cohen	RET=0
765728b3525SAmit Cohen
766728b3525SAmit Cohen	expects[0]=10; expects[1]=10; expects[3]=10
767728b3525SAmit Cohen	vxlan_flood_test $mac $dst $vid "${expects[@]}"
768728b3525SAmit Cohen
769728b3525SAmit Cohen	log_test "VXLAN: flood before pvid off"
770728b3525SAmit Cohen
771728b3525SAmit Cohen	# Toggle PVID off and test that flood to remote hosts does not work
772728b3525SAmit Cohen	RET=0
773728b3525SAmit Cohen
774728b3525SAmit Cohen	bridge vlan add vid 10 dev vx10
775728b3525SAmit Cohen
776728b3525SAmit Cohen	expects[0]=10; expects[1]=0; expects[3]=0
777728b3525SAmit Cohen	vxlan_flood_test $mac $dst $vid "${expects[@]}"
778728b3525SAmit Cohen
779728b3525SAmit Cohen	log_test "VXLAN: flood after pvid off"
780728b3525SAmit Cohen
781728b3525SAmit Cohen	# Toggle PVID on and test that flood to remote hosts does work
782728b3525SAmit Cohen	RET=0
783728b3525SAmit Cohen
784728b3525SAmit Cohen	bridge vlan add vid 10 dev vx10 pvid untagged
785728b3525SAmit Cohen
786728b3525SAmit Cohen	expects[0]=10; expects[1]=10; expects[3]=10
787728b3525SAmit Cohen	vxlan_flood_test $mac $dst $vid "${expects[@]}"
788728b3525SAmit Cohen
789728b3525SAmit Cohen	log_test "VXLAN: flood after pvid on"
790728b3525SAmit Cohen
791728b3525SAmit Cohen	# Add a new VLAN and test that it does not affect flooding
792728b3525SAmit Cohen	RET=0
793728b3525SAmit Cohen
794728b3525SAmit Cohen	bridge vlan add vid 30 dev vx10
795728b3525SAmit Cohen
796728b3525SAmit Cohen	expects[0]=10; expects[1]=10; expects[3]=10
797728b3525SAmit Cohen	vxlan_flood_test $mac $dst $vid "${expects[@]}"
798728b3525SAmit Cohen
799728b3525SAmit Cohen	bridge vlan del vid 30 dev vx10
800728b3525SAmit Cohen
801728b3525SAmit Cohen	log_test "VXLAN: flood after vlan add"
802728b3525SAmit Cohen
803728b3525SAmit Cohen	# Remove currently mapped VLAN and test that flood to remote hosts does
804728b3525SAmit Cohen	# not work
805728b3525SAmit Cohen	RET=0
806728b3525SAmit Cohen
807728b3525SAmit Cohen	bridge vlan del vid 10 dev vx10
808728b3525SAmit Cohen
809728b3525SAmit Cohen	expects[0]=10; expects[1]=0; expects[3]=0
810728b3525SAmit Cohen	vxlan_flood_test $mac $dst $vid "${expects[@]}"
811728b3525SAmit Cohen
812728b3525SAmit Cohen	log_test "VXLAN: flood after vlan delete"
813728b3525SAmit Cohen
814728b3525SAmit Cohen	# Re-add the VLAN and test that flood to remote hosts does work
815728b3525SAmit Cohen	RET=0
816728b3525SAmit Cohen
817728b3525SAmit Cohen	bridge vlan add vid 10 dev vx10 pvid untagged
818728b3525SAmit Cohen
819728b3525SAmit Cohen	expects[0]=10; expects[1]=10; expects[3]=10
820728b3525SAmit Cohen	vxlan_flood_test $mac $dst $vid "${expects[@]}"
821728b3525SAmit Cohen
822728b3525SAmit Cohen	log_test "VXLAN: flood after vlan re-add"
823728b3525SAmit Cohen}
824728b3525SAmit Cohen
825728b3525SAmit Cohentest_all()
826728b3525SAmit Cohen{
827728b3525SAmit Cohen	log_info "Running tests with UDP port $VXPORT"
828728b3525SAmit Cohen	tests_run
829728b3525SAmit Cohen}
830728b3525SAmit Cohen
831728b3525SAmit Cohentrap cleanup EXIT
832728b3525SAmit Cohen
833728b3525SAmit Cohensetup_prepare
834728b3525SAmit Cohensetup_wait
835728b3525SAmit Cohentest_all
836728b3525SAmit Cohen
837728b3525SAmit Cohenexit $EXIT_STATUS
838