1b5166d7aSIdo Schimmel#!/bin/bash
2b5166d7aSIdo Schimmel# SPDX-License-Identifier: GPL-2.0
3b5166d7aSIdo Schimmel
4b5166d7aSIdo Schimmel# +-----------------------+                          +------------------------+
5b5166d7aSIdo Schimmel# | H1 (vrf)              |                          | H2 (vrf)               |
6b5166d7aSIdo Schimmel# |  + $h1.10             |                          |  + $h2.10              |
7b5166d7aSIdo Schimmel# |  | 192.0.2.1/28       |                          |  | 192.0.2.2/28        |
8b5166d7aSIdo Schimmel# |  |                    |                          |  |                     |
9b5166d7aSIdo Schimmel# |  | + $h1.20           |                          |  | + $h2.20            |
10b5166d7aSIdo Schimmel# |  \ | 198.51.100.1/24  |                          |  \ | 198.51.100.2/24   |
11b5166d7aSIdo Schimmel# |   \|                  |                          |   \|                   |
12b5166d7aSIdo Schimmel# |    + $h1              |                          |    + $h2               |
13b5166d7aSIdo Schimmel# +----|------------------+                          +----|-------------------+
14b5166d7aSIdo Schimmel#      |                                                  |
15b5166d7aSIdo Schimmel# +----|--------------------------------------------------|-------------------+
16b5166d7aSIdo Schimmel# | SW |                                                  |                   |
17b5166d7aSIdo Schimmel# | +--|--------------------------------------------------|-----------------+ |
18b5166d7aSIdo Schimmel# | |  + $swp1                   BR1 (802.1q)             + $swp2           | |
19b5166d7aSIdo Schimmel# | |     vid 10                                             vid 10         | |
20b5166d7aSIdo Schimmel# | |     vid 20                                             vid 20         | |
21b5166d7aSIdo Schimmel# | |                                                                       | |
22b5166d7aSIdo Schimmel# | |  + vx10 (vxlan)                        + vx20 (vxlan)                 | |
23b5166d7aSIdo Schimmel# | |    local 192.0.2.17                      local 192.0.2.17             | |
24b5166d7aSIdo Schimmel# | |    remote 192.0.2.34 192.0.2.50          remote 192.0.2.34 192.0.2.50 | |
25b5166d7aSIdo Schimmel# | |    id 1000 dstport $VXPORT               id 2000 dstport $VXPORT      | |
26b5166d7aSIdo Schimmel# | |    vid 10 pvid untagged                  vid 20 pvid untagged         | |
27b5166d7aSIdo Schimmel# | +-----------------------------------------------------------------------+ |
28b5166d7aSIdo Schimmel# |                                                                           |
29b5166d7aSIdo Schimmel# |  192.0.2.32/28 via 192.0.2.18                                             |
30b5166d7aSIdo Schimmel# |  192.0.2.48/28 via 192.0.2.18                                             |
31b5166d7aSIdo Schimmel# |                                                                           |
32b5166d7aSIdo Schimmel# |    + $rp1                                                                 |
33b5166d7aSIdo Schimmel# |    | 192.0.2.17/28                                                        |
34b5166d7aSIdo Schimmel# +----|----------------------------------------------------------------------+
35b5166d7aSIdo Schimmel#      |
36b5166d7aSIdo Schimmel# +----|--------------------------------------------------------+
37b5166d7aSIdo Schimmel# |    |                                             VRP2 (vrf) |
38b5166d7aSIdo Schimmel# |    + $rp2                                                   |
39b5166d7aSIdo Schimmel# |      192.0.2.18/28                                          |
40b5166d7aSIdo Schimmel# |                                                             |   (maybe) HW
41b5166d7aSIdo Schimmel# =============================================================================
42b5166d7aSIdo Schimmel# |                                                             |  (likely) SW
43b5166d7aSIdo Schimmel# |    + v1 (veth)                             + v3 (veth)      |
44b5166d7aSIdo Schimmel# |    | 192.0.2.33/28                         | 192.0.2.49/28  |
45b5166d7aSIdo Schimmel# +----|---------------------------------------|----------------+
46b5166d7aSIdo Schimmel#      |                                       |
47b5166d7aSIdo Schimmel# +----|------------------------------+   +----|------------------------------+
48b5166d7aSIdo Schimmel# |    + v2 (veth)        NS1 (netns) |   |    + v4 (veth)        NS2 (netns) |
49b5166d7aSIdo Schimmel# |      192.0.2.34/28                |   |      192.0.2.50/28                |
50b5166d7aSIdo Schimmel# |                                   |   |                                   |
51b5166d7aSIdo Schimmel# |   192.0.2.16/28 via 192.0.2.33    |   |   192.0.2.16/28 via 192.0.2.49    |
52b5166d7aSIdo Schimmel# |   192.0.2.50/32 via 192.0.2.33    |   |   192.0.2.34/32 via 192.0.2.49    |
53b5166d7aSIdo Schimmel# |                                   |   |                                   |
54b5166d7aSIdo Schimmel# | +-------------------------------+ |   | +-------------------------------+ |
55b5166d7aSIdo Schimmel# | |                  BR2 (802.1q) | |   | |                  BR2 (802.1q) | |
56b5166d7aSIdo Schimmel# | |  + vx10 (vxlan)               | |   | |  + vx10 (vxlan)               | |
57b5166d7aSIdo Schimmel# | |    local 192.0.2.34           | |   | |    local 192.0.2.50           | |
58b5166d7aSIdo Schimmel# | |    remote 192.0.2.17          | |   | |    remote 192.0.2.17          | |
59b5166d7aSIdo Schimmel# | |    remote 192.0.2.50          | |   | |    remote 192.0.2.34          | |
60b5166d7aSIdo Schimmel# | |    id 1000 dstport $VXPORT    | |   | |    id 1000 dstport $VXPORT    | |
61b5166d7aSIdo Schimmel# | |    vid 10 pvid untagged       | |   | |    vid 10 pvid untagged       | |
62b5166d7aSIdo Schimmel# | |                               | |   | |                               | |
63b5166d7aSIdo Schimmel# | |  + vx20 (vxlan)               | |   | |  + vx20 (vxlan)               | |
64b5166d7aSIdo Schimmel# | |    local 192.0.2.34           | |   | |    local 192.0.2.50           | |
65b5166d7aSIdo Schimmel# | |    remote 192.0.2.17          | |   | |    remote 192.0.2.17          | |
66b5166d7aSIdo Schimmel# | |    remote 192.0.2.50          | |   | |    remote 192.0.2.34          | |
67b5166d7aSIdo Schimmel# | |    id 2000 dstport $VXPORT    | |   | |    id 2000 dstport $VXPORT    | |
68b5166d7aSIdo Schimmel# | |    vid 20 pvid untagged       | |   | |    vid 20 pvid untagged       | |
69b5166d7aSIdo Schimmel# | |                               | |   | |                               | |
70b5166d7aSIdo Schimmel# | |  + w1 (veth)                  | |   | |  + w1 (veth)                  | |
71b5166d7aSIdo Schimmel# | |  | vid 10                     | |   | |  | vid 10                     | |
72b5166d7aSIdo Schimmel# | |  | vid 20                     | |   | |  | vid 20                     | |
73b5166d7aSIdo Schimmel# | +--|----------------------------+ |   | +--|----------------------------+ |
74b5166d7aSIdo Schimmel# |    |                              |   |    |                              |
75b5166d7aSIdo Schimmel# | +--|----------------------------+ |   | +--|----------------------------+ |
76b5166d7aSIdo Schimmel# | |  + w2 (veth)        VW2 (vrf) | |   | |  + w2 (veth)        VW2 (vrf) | |
77b5166d7aSIdo Schimmel# | |  |\                           | |   | |  |\                           | |
78b5166d7aSIdo Schimmel# | |  | + w2.10                    | |   | |  | + w2.10                    | |
79b5166d7aSIdo Schimmel# | |  |   192.0.2.3/28             | |   | |  |   192.0.2.4/28             | |
80b5166d7aSIdo Schimmel# | |  |                            | |   | |  |                            | |
81b5166d7aSIdo Schimmel# | |  + w2.20                      | |   | |  + w2.20                      | |
82b5166d7aSIdo Schimmel# | |    198.51.100.3/24            | |   | |    198.51.100.4/24            | |
83b5166d7aSIdo Schimmel# | +-------------------------------+ |   | +-------------------------------+ |
84b5166d7aSIdo Schimmel# +-----------------------------------+   +-----------------------------------+
85b5166d7aSIdo Schimmel
86b5166d7aSIdo Schimmel: ${VXPORT:=4789}
87b5166d7aSIdo Schimmelexport VXPORT
88b5166d7aSIdo Schimmel
89b5166d7aSIdo Schimmel: ${ALL_TESTS:="
90b5166d7aSIdo Schimmel	ping_ipv4
91b5166d7aSIdo Schimmel	test_flood
92b5166d7aSIdo Schimmel	test_unicast
93b5166d7aSIdo Schimmel	reapply_config
94b5166d7aSIdo Schimmel	ping_ipv4
95b5166d7aSIdo Schimmel	test_flood
96b5166d7aSIdo Schimmel	test_unicast
97b5166d7aSIdo Schimmel	test_learning
9855939b26SIdo Schimmel	test_pvid
99b5166d7aSIdo Schimmel    "}
100b5166d7aSIdo Schimmel
101b5166d7aSIdo SchimmelNUM_NETIFS=6
102b5166d7aSIdo Schimmelsource lib.sh
103b5166d7aSIdo Schimmel
104b5166d7aSIdo Schimmelh1_create()
105b5166d7aSIdo Schimmel{
106b5166d7aSIdo Schimmel	simple_if_init $h1
107b5166d7aSIdo Schimmel	tc qdisc add dev $h1 clsact
108b5166d7aSIdo Schimmel	vlan_create $h1 10 v$h1 192.0.2.1/28
109b5166d7aSIdo Schimmel	vlan_create $h1 20 v$h1 198.51.100.1/24
110b5166d7aSIdo Schimmel}
111b5166d7aSIdo Schimmel
112b5166d7aSIdo Schimmelh1_destroy()
113b5166d7aSIdo Schimmel{
114b5166d7aSIdo Schimmel	vlan_destroy $h1 20
115b5166d7aSIdo Schimmel	vlan_destroy $h1 10
116b5166d7aSIdo Schimmel	tc qdisc del dev $h1 clsact
117b5166d7aSIdo Schimmel	simple_if_fini $h1
118b5166d7aSIdo Schimmel}
119b5166d7aSIdo Schimmel
120b5166d7aSIdo Schimmelh2_create()
121b5166d7aSIdo Schimmel{
122b5166d7aSIdo Schimmel	simple_if_init $h2
123b5166d7aSIdo Schimmel	tc qdisc add dev $h2 clsact
124b5166d7aSIdo Schimmel	vlan_create $h2 10 v$h2 192.0.2.2/28
125b5166d7aSIdo Schimmel	vlan_create $h2 20 v$h2 198.51.100.2/24
126b5166d7aSIdo Schimmel}
127b5166d7aSIdo Schimmel
128b5166d7aSIdo Schimmelh2_destroy()
129b5166d7aSIdo Schimmel{
130b5166d7aSIdo Schimmel	vlan_destroy $h2 20
131b5166d7aSIdo Schimmel	vlan_destroy $h2 10
132b5166d7aSIdo Schimmel	tc qdisc del dev $h2 clsact
133b5166d7aSIdo Schimmel	simple_if_fini $h2
134b5166d7aSIdo Schimmel}
135b5166d7aSIdo Schimmel
136b5166d7aSIdo Schimmelrp1_set_addr()
137b5166d7aSIdo Schimmel{
138b5166d7aSIdo Schimmel	ip address add dev $rp1 192.0.2.17/28
139b5166d7aSIdo Schimmel
140b5166d7aSIdo Schimmel	ip route add 192.0.2.32/28 nexthop via 192.0.2.18
141b5166d7aSIdo Schimmel	ip route add 192.0.2.48/28 nexthop via 192.0.2.18
142b5166d7aSIdo Schimmel}
143b5166d7aSIdo Schimmel
144b5166d7aSIdo Schimmelrp1_unset_addr()
145b5166d7aSIdo Schimmel{
146b5166d7aSIdo Schimmel	ip route del 192.0.2.48/28 nexthop via 192.0.2.18
147b5166d7aSIdo Schimmel	ip route del 192.0.2.32/28 nexthop via 192.0.2.18
148b5166d7aSIdo Schimmel
149b5166d7aSIdo Schimmel	ip address del dev $rp1 192.0.2.17/28
150b5166d7aSIdo Schimmel}
151b5166d7aSIdo Schimmel
152b5166d7aSIdo Schimmelswitch_create()
153b5166d7aSIdo Schimmel{
154b5166d7aSIdo Schimmel	ip link add name br1 type bridge vlan_filtering 1 vlan_default_pvid 0 \
155b5166d7aSIdo Schimmel		mcast_snooping 0
156b5166d7aSIdo Schimmel	# Make sure the bridge uses the MAC address of the local port and not
157b5166d7aSIdo Schimmel	# that of the VxLAN's device.
158b5166d7aSIdo Schimmel	ip link set dev br1 address $(mac_get $swp1)
159b5166d7aSIdo Schimmel	ip link set dev br1 up
160b5166d7aSIdo Schimmel
161b5166d7aSIdo Schimmel	ip link set dev $rp1 up
162b5166d7aSIdo Schimmel	rp1_set_addr
163b5166d7aSIdo Schimmel
164b5166d7aSIdo Schimmel	ip link add name vx10 type vxlan id 1000	\
165b5166d7aSIdo Schimmel		local 192.0.2.17 dstport "$VXPORT"	\
166b5166d7aSIdo Schimmel		nolearning noudpcsum tos inherit ttl 100
167b5166d7aSIdo Schimmel	ip link set dev vx10 up
168b5166d7aSIdo Schimmel
169b5166d7aSIdo Schimmel	ip link set dev vx10 master br1
170b5166d7aSIdo Schimmel	bridge vlan add vid 10 dev vx10 pvid untagged
171b5166d7aSIdo Schimmel
172b5166d7aSIdo Schimmel	ip link add name vx20 type vxlan id 2000	\
173b5166d7aSIdo Schimmel		local 192.0.2.17 dstport "$VXPORT"	\
174b5166d7aSIdo Schimmel		nolearning noudpcsum tos inherit ttl 100
175b5166d7aSIdo Schimmel	ip link set dev vx20 up
176b5166d7aSIdo Schimmel
177b5166d7aSIdo Schimmel	ip link set dev vx20 master br1
178b5166d7aSIdo Schimmel	bridge vlan add vid 20 dev vx20 pvid untagged
179b5166d7aSIdo Schimmel
180b5166d7aSIdo Schimmel	ip link set dev $swp1 master br1
181b5166d7aSIdo Schimmel	ip link set dev $swp1 up
182b5166d7aSIdo Schimmel	bridge vlan add vid 10 dev $swp1
183b5166d7aSIdo Schimmel	bridge vlan add vid 20 dev $swp1
184b5166d7aSIdo Schimmel
185b5166d7aSIdo Schimmel	ip link set dev $swp2 master br1
186b5166d7aSIdo Schimmel	ip link set dev $swp2 up
187b5166d7aSIdo Schimmel	bridge vlan add vid 10 dev $swp2
188b5166d7aSIdo Schimmel	bridge vlan add vid 20 dev $swp2
189b5166d7aSIdo Schimmel
190b5166d7aSIdo Schimmel	bridge fdb append dev vx10 00:00:00:00:00:00 dst 192.0.2.34 self
191b5166d7aSIdo Schimmel	bridge fdb append dev vx10 00:00:00:00:00:00 dst 192.0.2.50 self
192b5166d7aSIdo Schimmel
193b5166d7aSIdo Schimmel	bridge fdb append dev vx20 00:00:00:00:00:00 dst 192.0.2.34 self
194b5166d7aSIdo Schimmel	bridge fdb append dev vx20 00:00:00:00:00:00 dst 192.0.2.50 self
195b5166d7aSIdo Schimmel}
196b5166d7aSIdo Schimmel
197b5166d7aSIdo Schimmelswitch_destroy()
198b5166d7aSIdo Schimmel{
199b5166d7aSIdo Schimmel	bridge fdb del dev vx20 00:00:00:00:00:00 dst 192.0.2.50 self
200b5166d7aSIdo Schimmel	bridge fdb del dev vx20 00:00:00:00:00:00 dst 192.0.2.34 self
201b5166d7aSIdo Schimmel
202b5166d7aSIdo Schimmel	bridge fdb del dev vx10 00:00:00:00:00:00 dst 192.0.2.50 self
203b5166d7aSIdo Schimmel	bridge fdb del dev vx10 00:00:00:00:00:00 dst 192.0.2.34 self
204b5166d7aSIdo Schimmel
205b5166d7aSIdo Schimmel	bridge vlan del vid 20 dev $swp2
206b5166d7aSIdo Schimmel	bridge vlan del vid 10 dev $swp2
207b5166d7aSIdo Schimmel	ip link set dev $swp2 down
208b5166d7aSIdo Schimmel	ip link set dev $swp2 nomaster
209b5166d7aSIdo Schimmel
210b5166d7aSIdo Schimmel	bridge vlan del vid 20 dev $swp1
211b5166d7aSIdo Schimmel	bridge vlan del vid 10 dev $swp1
212b5166d7aSIdo Schimmel	ip link set dev $swp1 down
213b5166d7aSIdo Schimmel	ip link set dev $swp1 nomaster
214b5166d7aSIdo Schimmel
215b5166d7aSIdo Schimmel	bridge vlan del vid 20 dev vx20
216b5166d7aSIdo Schimmel	ip link set dev vx20 nomaster
217b5166d7aSIdo Schimmel
218b5166d7aSIdo Schimmel	ip link set dev vx20 down
219b5166d7aSIdo Schimmel	ip link del dev vx20
220b5166d7aSIdo Schimmel
221b5166d7aSIdo Schimmel	bridge vlan del vid 10 dev vx10
222b5166d7aSIdo Schimmel	ip link set dev vx10 nomaster
223b5166d7aSIdo Schimmel
224b5166d7aSIdo Schimmel	ip link set dev vx10 down
225b5166d7aSIdo Schimmel	ip link del dev vx10
226b5166d7aSIdo Schimmel
227b5166d7aSIdo Schimmel	rp1_unset_addr
228b5166d7aSIdo Schimmel	ip link set dev $rp1 down
229b5166d7aSIdo Schimmel
230b5166d7aSIdo Schimmel	ip link set dev br1 down
231b5166d7aSIdo Schimmel	ip link del dev br1
232b5166d7aSIdo Schimmel}
233b5166d7aSIdo Schimmel
234b5166d7aSIdo Schimmelvrp2_create()
235b5166d7aSIdo Schimmel{
236b5166d7aSIdo Schimmel	simple_if_init $rp2 192.0.2.18/28
237b5166d7aSIdo Schimmel	__simple_if_init v1 v$rp2 192.0.2.33/28
238b5166d7aSIdo Schimmel	__simple_if_init v3 v$rp2 192.0.2.49/28
239b5166d7aSIdo Schimmel	tc qdisc add dev v1 clsact
240b5166d7aSIdo Schimmel}
241b5166d7aSIdo Schimmel
242b5166d7aSIdo Schimmelvrp2_destroy()
243b5166d7aSIdo Schimmel{
244b5166d7aSIdo Schimmel	tc qdisc del dev v1 clsact
245b5166d7aSIdo Schimmel	__simple_if_fini v3 192.0.2.49/28
246b5166d7aSIdo Schimmel	__simple_if_fini v1 192.0.2.33/28
247b5166d7aSIdo Schimmel	simple_if_fini $rp2 192.0.2.18/28
248b5166d7aSIdo Schimmel}
249b5166d7aSIdo Schimmel
250b5166d7aSIdo Schimmelns_init_common()
251b5166d7aSIdo Schimmel{
252b5166d7aSIdo Schimmel	local in_if=$1; shift
253b5166d7aSIdo Schimmel	local in_addr=$1; shift
254b5166d7aSIdo Schimmel	local other_in_addr=$1; shift
255b5166d7aSIdo Schimmel	local nh_addr=$1; shift
256b5166d7aSIdo Schimmel	local host_addr1=$1; shift
257b5166d7aSIdo Schimmel	local host_addr2=$1; shift
258b5166d7aSIdo Schimmel
259b5166d7aSIdo Schimmel	ip link set dev $in_if up
260b5166d7aSIdo Schimmel	ip address add dev $in_if $in_addr/28
261b5166d7aSIdo Schimmel	tc qdisc add dev $in_if clsact
262b5166d7aSIdo Schimmel
263b5166d7aSIdo Schimmel	ip link add name br2 type bridge vlan_filtering 1 vlan_default_pvid 0
264b5166d7aSIdo Schimmel	ip link set dev br2 up
265b5166d7aSIdo Schimmel
266b5166d7aSIdo Schimmel	ip link add name w1 type veth peer name w2
267b5166d7aSIdo Schimmel
268b5166d7aSIdo Schimmel	ip link set dev w1 master br2
269b5166d7aSIdo Schimmel	ip link set dev w1 up
270b5166d7aSIdo Schimmel
271b5166d7aSIdo Schimmel	bridge vlan add vid 10 dev w1
272b5166d7aSIdo Schimmel	bridge vlan add vid 20 dev w1
273b5166d7aSIdo Schimmel
274b5166d7aSIdo Schimmel	ip link add name vx10 type vxlan id 1000 local $in_addr \
275b5166d7aSIdo Schimmel		dstport "$VXPORT"
276b5166d7aSIdo Schimmel	ip link set dev vx10 up
277b5166d7aSIdo Schimmel	bridge fdb append dev vx10 00:00:00:00:00:00 dst 192.0.2.17 self
278b5166d7aSIdo Schimmel	bridge fdb append dev vx10 00:00:00:00:00:00 dst $other_in_addr self
279b5166d7aSIdo Schimmel
280b5166d7aSIdo Schimmel	ip link set dev vx10 master br2
281b5166d7aSIdo Schimmel	tc qdisc add dev vx10 clsact
282b5166d7aSIdo Schimmel
283b5166d7aSIdo Schimmel	bridge vlan add vid 10 dev vx10 pvid untagged
284b5166d7aSIdo Schimmel
285b5166d7aSIdo Schimmel	ip link add name vx20 type vxlan id 2000 local $in_addr \
286b5166d7aSIdo Schimmel		dstport "$VXPORT"
287b5166d7aSIdo Schimmel	ip link set dev vx20 up
288b5166d7aSIdo Schimmel	bridge fdb append dev vx20 00:00:00:00:00:00 dst 192.0.2.17 self
289b5166d7aSIdo Schimmel	bridge fdb append dev vx20 00:00:00:00:00:00 dst $other_in_addr self
290b5166d7aSIdo Schimmel
291b5166d7aSIdo Schimmel	ip link set dev vx20 master br2
292b5166d7aSIdo Schimmel	tc qdisc add dev vx20 clsact
293b5166d7aSIdo Schimmel
294b5166d7aSIdo Schimmel	bridge vlan add vid 20 dev vx20 pvid untagged
295b5166d7aSIdo Schimmel
296b5166d7aSIdo Schimmel	simple_if_init w2
297b5166d7aSIdo Schimmel        vlan_create w2 10 vw2 $host_addr1/28
298b5166d7aSIdo Schimmel        vlan_create w2 20 vw2 $host_addr2/24
299b5166d7aSIdo Schimmel
300b5166d7aSIdo Schimmel	ip route add 192.0.2.16/28 nexthop via $nh_addr
301b5166d7aSIdo Schimmel	ip route add $other_in_addr/32 nexthop via $nh_addr
302b5166d7aSIdo Schimmel}
303b5166d7aSIdo Schimmelexport -f ns_init_common
304b5166d7aSIdo Schimmel
305b5166d7aSIdo Schimmelns1_create()
306b5166d7aSIdo Schimmel{
307b5166d7aSIdo Schimmel	ip netns add ns1
308b5166d7aSIdo Schimmel	ip link set dev v2 netns ns1
309b5166d7aSIdo Schimmel	in_ns ns1 \
310b5166d7aSIdo Schimmel	      ns_init_common v2 192.0.2.34 192.0.2.50 192.0.2.33 192.0.2.3 \
311b5166d7aSIdo Schimmel	      198.51.100.3
312b5166d7aSIdo Schimmel}
313b5166d7aSIdo Schimmel
314b5166d7aSIdo Schimmelns1_destroy()
315b5166d7aSIdo Schimmel{
316b5166d7aSIdo Schimmel	ip netns exec ns1 ip link set dev v2 netns 1
317b5166d7aSIdo Schimmel	ip netns del ns1
318b5166d7aSIdo Schimmel}
319b5166d7aSIdo Schimmel
320b5166d7aSIdo Schimmelns2_create()
321b5166d7aSIdo Schimmel{
322b5166d7aSIdo Schimmel	ip netns add ns2
323b5166d7aSIdo Schimmel	ip link set dev v4 netns ns2
324b5166d7aSIdo Schimmel	in_ns ns2 \
325b5166d7aSIdo Schimmel	      ns_init_common v4 192.0.2.50 192.0.2.34 192.0.2.49 192.0.2.4 \
326b5166d7aSIdo Schimmel	      198.51.100.4
327b5166d7aSIdo Schimmel}
328b5166d7aSIdo Schimmel
329b5166d7aSIdo Schimmelns2_destroy()
330b5166d7aSIdo Schimmel{
331b5166d7aSIdo Schimmel	ip netns exec ns2 ip link set dev v4 netns 1
332b5166d7aSIdo Schimmel	ip netns del ns2
333b5166d7aSIdo Schimmel}
334b5166d7aSIdo Schimmel
335b5166d7aSIdo Schimmelsetup_prepare()
336b5166d7aSIdo Schimmel{
337b5166d7aSIdo Schimmel	h1=${NETIFS[p1]}
338b5166d7aSIdo Schimmel	swp1=${NETIFS[p2]}
339b5166d7aSIdo Schimmel
340b5166d7aSIdo Schimmel	swp2=${NETIFS[p3]}
341b5166d7aSIdo Schimmel	h2=${NETIFS[p4]}
342b5166d7aSIdo Schimmel
343b5166d7aSIdo Schimmel	rp1=${NETIFS[p5]}
344b5166d7aSIdo Schimmel	rp2=${NETIFS[p6]}
345b5166d7aSIdo Schimmel
346b5166d7aSIdo Schimmel	vrf_prepare
347b5166d7aSIdo Schimmel	forwarding_enable
348b5166d7aSIdo Schimmel
349b5166d7aSIdo Schimmel	h1_create
350b5166d7aSIdo Schimmel	h2_create
351b5166d7aSIdo Schimmel	switch_create
352b5166d7aSIdo Schimmel
353b5166d7aSIdo Schimmel	ip link add name v1 type veth peer name v2
354b5166d7aSIdo Schimmel	ip link add name v3 type veth peer name v4
355b5166d7aSIdo Schimmel	vrp2_create
356b5166d7aSIdo Schimmel	ns1_create
357b5166d7aSIdo Schimmel	ns2_create
358b5166d7aSIdo Schimmel
359b5166d7aSIdo Schimmel	r1_mac=$(in_ns ns1 mac_get w2)
360b5166d7aSIdo Schimmel	r2_mac=$(in_ns ns2 mac_get w2)
361b5166d7aSIdo Schimmel	h2_mac=$(mac_get $h2)
362b5166d7aSIdo Schimmel}
363b5166d7aSIdo Schimmel
364b5166d7aSIdo Schimmelcleanup()
365b5166d7aSIdo Schimmel{
366b5166d7aSIdo Schimmel	pre_cleanup
367b5166d7aSIdo Schimmel
368b5166d7aSIdo Schimmel	ns2_destroy
369b5166d7aSIdo Schimmel	ns1_destroy
370b5166d7aSIdo Schimmel	vrp2_destroy
371b5166d7aSIdo Schimmel	ip link del dev v3
372b5166d7aSIdo Schimmel	ip link del dev v1
373b5166d7aSIdo Schimmel
374b5166d7aSIdo Schimmel	switch_destroy
375b5166d7aSIdo Schimmel	h2_destroy
376b5166d7aSIdo Schimmel	h1_destroy
377b5166d7aSIdo Schimmel
378b5166d7aSIdo Schimmel	forwarding_restore
379b5166d7aSIdo Schimmel	vrf_cleanup
380b5166d7aSIdo Schimmel}
381b5166d7aSIdo Schimmel
382b5166d7aSIdo Schimmel# For the first round of tests, vx10 and vx20 were the first devices to get
383b5166d7aSIdo Schimmel# attached to the bridge, and that at the point that the local IP is already
384b5166d7aSIdo Schimmel# configured. Try the other scenario of attaching these devices to a bridge
385b5166d7aSIdo Schimmel# that already has local ports members, and only then assign the local IP.
386b5166d7aSIdo Schimmelreapply_config()
387b5166d7aSIdo Schimmel{
388b5166d7aSIdo Schimmel	log_info "Reapplying configuration"
389b5166d7aSIdo Schimmel
390b5166d7aSIdo Schimmel	bridge fdb del dev vx20 00:00:00:00:00:00 dst 192.0.2.50 self
391b5166d7aSIdo Schimmel	bridge fdb del dev vx20 00:00:00:00:00:00 dst 192.0.2.34 self
392b5166d7aSIdo Schimmel
393b5166d7aSIdo Schimmel	bridge fdb del dev vx10 00:00:00:00:00:00 dst 192.0.2.50 self
394b5166d7aSIdo Schimmel	bridge fdb del dev vx10 00:00:00:00:00:00 dst 192.0.2.34 self
395b5166d7aSIdo Schimmel
396b5166d7aSIdo Schimmel	ip link set dev vx20 nomaster
397b5166d7aSIdo Schimmel	ip link set dev vx10 nomaster
398b5166d7aSIdo Schimmel
399b5166d7aSIdo Schimmel	rp1_unset_addr
400b5166d7aSIdo Schimmel	sleep 5
401b5166d7aSIdo Schimmel
402b5166d7aSIdo Schimmel	ip link set dev vx10 master br1
403b5166d7aSIdo Schimmel	bridge vlan add vid 10 dev vx10 pvid untagged
404b5166d7aSIdo Schimmel
405b5166d7aSIdo Schimmel	ip link set dev vx20 master br1
406b5166d7aSIdo Schimmel	bridge vlan add vid 20 dev vx20 pvid untagged
407b5166d7aSIdo Schimmel
408b5166d7aSIdo Schimmel	bridge fdb append dev vx10 00:00:00:00:00:00 dst 192.0.2.34 self
409b5166d7aSIdo Schimmel	bridge fdb append dev vx10 00:00:00:00:00:00 dst 192.0.2.50 self
410b5166d7aSIdo Schimmel
411b5166d7aSIdo Schimmel	bridge fdb append dev vx20 00:00:00:00:00:00 dst 192.0.2.34 self
412b5166d7aSIdo Schimmel	bridge fdb append dev vx20 00:00:00:00:00:00 dst 192.0.2.50 self
413b5166d7aSIdo Schimmel
414b5166d7aSIdo Schimmel	rp1_set_addr
415b5166d7aSIdo Schimmel	sleep 5
416b5166d7aSIdo Schimmel}
417b5166d7aSIdo Schimmel
418b5166d7aSIdo Schimmelping_ipv4()
419b5166d7aSIdo Schimmel{
420b5166d7aSIdo Schimmel	ping_test $h1.10 192.0.2.2 ": local->local vid 10"
421b5166d7aSIdo Schimmel	ping_test $h1.20 198.51.100.2 ": local->local vid 20"
422b5166d7aSIdo Schimmel	ping_test $h1.10 192.0.2.3 ": local->remote 1 vid 10"
423b5166d7aSIdo Schimmel	ping_test $h1.10 192.0.2.4 ": local->remote 2 vid 10"
424b5166d7aSIdo Schimmel	ping_test $h1.20 198.51.100.3 ": local->remote 1 vid 20"
425b5166d7aSIdo Schimmel	ping_test $h1.20 198.51.100.4 ": local->remote 2 vid 20"
426b5166d7aSIdo Schimmel}
427b5166d7aSIdo Schimmel
428b5166d7aSIdo Schimmelmaybe_in_ns()
429b5166d7aSIdo Schimmel{
430b5166d7aSIdo Schimmel	echo ${1:+in_ns} $1
431b5166d7aSIdo Schimmel}
432b5166d7aSIdo Schimmel
433b5166d7aSIdo Schimmel__flood_counter_add_del()
434b5166d7aSIdo Schimmel{
435b5166d7aSIdo Schimmel	local add_del=$1; shift
436b5166d7aSIdo Schimmel	local dev=$1; shift
437b5166d7aSIdo Schimmel	local ns=$1; shift
438b5166d7aSIdo Schimmel
439b5166d7aSIdo Schimmel	# Putting the ICMP capture both to HW and to SW will end up
440b5166d7aSIdo Schimmel	# double-counting the packets that are trapped to slow path, such as for
441b5166d7aSIdo Schimmel	# the unicast test. Adding either skip_hw or skip_sw fixes this problem,
442b5166d7aSIdo Schimmel	# but with skip_hw, the flooded packets are not counted at all, because
443b5166d7aSIdo Schimmel	# those are dropped due to MAC address mismatch; and skip_sw is a no-go
444b5166d7aSIdo Schimmel	# for veth-based topologies.
445b5166d7aSIdo Schimmel	#
446b5166d7aSIdo Schimmel	# So try to install with skip_sw and fall back to skip_sw if that fails.
447b5166d7aSIdo Schimmel
448b5166d7aSIdo Schimmel	$(maybe_in_ns $ns) __icmp_capture_add_del          \
449b5166d7aSIdo Schimmel			   $add_del 100 "" $dev skip_sw 2>/dev/null || \
450b5166d7aSIdo Schimmel	$(maybe_in_ns $ns) __icmp_capture_add_del          \
451b5166d7aSIdo Schimmel			   $add_del 100 "" $dev skip_hw
452b5166d7aSIdo Schimmel}
453b5166d7aSIdo Schimmel
454b5166d7aSIdo Schimmelflood_counter_install()
455b5166d7aSIdo Schimmel{
456b5166d7aSIdo Schimmel	__flood_counter_add_del add "$@"
457b5166d7aSIdo Schimmel}
458b5166d7aSIdo Schimmel
459b5166d7aSIdo Schimmelflood_counter_uninstall()
460b5166d7aSIdo Schimmel{
461b5166d7aSIdo Schimmel	__flood_counter_add_del del "$@"
462b5166d7aSIdo Schimmel}
463b5166d7aSIdo Schimmel
464b5166d7aSIdo Schimmelflood_fetch_stat()
465b5166d7aSIdo Schimmel{
466b5166d7aSIdo Schimmel	local dev=$1; shift
467b5166d7aSIdo Schimmel	local ns=$1; shift
468b5166d7aSIdo Schimmel
469b5166d7aSIdo Schimmel	$(maybe_in_ns $ns) tc_rule_stats_get $dev 100 ingress
470b5166d7aSIdo Schimmel}
471b5166d7aSIdo Schimmel
472b5166d7aSIdo Schimmelflood_fetch_stats()
473b5166d7aSIdo Schimmel{
474b5166d7aSIdo Schimmel	local counters=("${@}")
475b5166d7aSIdo Schimmel	local counter
476b5166d7aSIdo Schimmel
477b5166d7aSIdo Schimmel	for counter in "${counters[@]}"; do
478b5166d7aSIdo Schimmel		flood_fetch_stat $counter
479b5166d7aSIdo Schimmel	done
480b5166d7aSIdo Schimmel}
481b5166d7aSIdo Schimmel
482b5166d7aSIdo Schimmelvxlan_flood_test()
483b5166d7aSIdo Schimmel{
484b5166d7aSIdo Schimmel	local mac=$1; shift
485b5166d7aSIdo Schimmel	local dst=$1; shift
486b5166d7aSIdo Schimmel	local vid=$1; shift
487b5166d7aSIdo Schimmel	local -a expects=("${@}")
488b5166d7aSIdo Schimmel
489b5166d7aSIdo Schimmel	local -a counters=($h2 "vx10 ns1" "vx20 ns1" "vx10 ns2" "vx20 ns2")
490b5166d7aSIdo Schimmel	local counter
491b5166d7aSIdo Schimmel	local key
492b5166d7aSIdo Schimmel
493b5166d7aSIdo Schimmel	# Packets reach the local host tagged whereas they reach the VxLAN
494b5166d7aSIdo Schimmel	# devices untagged. In order to be able to use the same filter for
495b5166d7aSIdo Schimmel	# all counters, make sure the packets also reach the local host
496b5166d7aSIdo Schimmel	# untagged
497b5166d7aSIdo Schimmel	bridge vlan add vid $vid dev $swp2 untagged
498b5166d7aSIdo Schimmel	for counter in "${counters[@]}"; do
499b5166d7aSIdo Schimmel		flood_counter_install $counter
500b5166d7aSIdo Schimmel	done
501b5166d7aSIdo Schimmel
502b5166d7aSIdo Schimmel	local -a t0s=($(flood_fetch_stats "${counters[@]}"))
503b5166d7aSIdo Schimmel	$MZ $h1 -Q $vid -c 10 -d 100msec -p 64 -b $mac -B $dst -t icmp -q
504b5166d7aSIdo Schimmel	sleep 1
505b5166d7aSIdo Schimmel	local -a t1s=($(flood_fetch_stats "${counters[@]}"))
506b5166d7aSIdo Schimmel
507b5166d7aSIdo Schimmel	for key in ${!t0s[@]}; do
508b5166d7aSIdo Schimmel		local delta=$((t1s[$key] - t0s[$key]))
509b5166d7aSIdo Schimmel		local expect=${expects[$key]}
510b5166d7aSIdo Schimmel
511b5166d7aSIdo Schimmel		((expect == delta))
512b5166d7aSIdo Schimmel		check_err $? "${counters[$key]}: Expected to capture $expect packets, got $delta."
513b5166d7aSIdo Schimmel	done
514b5166d7aSIdo Schimmel
515b5166d7aSIdo Schimmel	for counter in "${counters[@]}"; do
516b5166d7aSIdo Schimmel		flood_counter_uninstall $counter
517b5166d7aSIdo Schimmel	done
518b5166d7aSIdo Schimmel	bridge vlan add vid $vid dev $swp2
519b5166d7aSIdo Schimmel}
520b5166d7aSIdo Schimmel
521b5166d7aSIdo Schimmel__test_flood()
522b5166d7aSIdo Schimmel{
523b5166d7aSIdo Schimmel	local mac=$1; shift
524b5166d7aSIdo Schimmel	local dst=$1; shift
525b5166d7aSIdo Schimmel	local vid=$1; shift
526b5166d7aSIdo Schimmel	local what=$1; shift
527b5166d7aSIdo Schimmel	local -a expects=("${@}")
528b5166d7aSIdo Schimmel
529b5166d7aSIdo Schimmel	RET=0
530b5166d7aSIdo Schimmel
531b5166d7aSIdo Schimmel	vxlan_flood_test $mac $dst $vid "${expects[@]}"
532b5166d7aSIdo Schimmel
533b5166d7aSIdo Schimmel	log_test "VXLAN: $what"
534b5166d7aSIdo Schimmel}
535b5166d7aSIdo Schimmel
536b5166d7aSIdo Schimmeltest_flood()
537b5166d7aSIdo Schimmel{
538b5166d7aSIdo Schimmel	__test_flood de:ad:be:ef:13:37 192.0.2.100 10 "flood vlan 10" \
539b5166d7aSIdo Schimmel		10 10 0 10 0
540b5166d7aSIdo Schimmel	__test_flood ca:fe:be:ef:13:37 198.51.100.100 20 "flood vlan 20" \
541b5166d7aSIdo Schimmel		10 0 10 0 10
542b5166d7aSIdo Schimmel}
543b5166d7aSIdo Schimmel
544b5166d7aSIdo Schimmelvxlan_fdb_add_del()
545b5166d7aSIdo Schimmel{
546b5166d7aSIdo Schimmel	local add_del=$1; shift
547b5166d7aSIdo Schimmel	local vid=$1; shift
548b5166d7aSIdo Schimmel	local mac=$1; shift
549b5166d7aSIdo Schimmel	local dev=$1; shift
550b5166d7aSIdo Schimmel	local dst=$1; shift
551b5166d7aSIdo Schimmel
552b5166d7aSIdo Schimmel	bridge fdb $add_del dev $dev $mac self static permanent \
553b5166d7aSIdo Schimmel		${dst:+dst} $dst 2>/dev/null
554b5166d7aSIdo Schimmel	bridge fdb $add_del dev $dev $mac master static vlan $vid 2>/dev/null
555b5166d7aSIdo Schimmel}
556b5166d7aSIdo Schimmel
557b5166d7aSIdo Schimmel__test_unicast()
558b5166d7aSIdo Schimmel{
559b5166d7aSIdo Schimmel	local mac=$1; shift
560b5166d7aSIdo Schimmel	local dst=$1; shift
561b5166d7aSIdo Schimmel	local hit_idx=$1; shift
562b5166d7aSIdo Schimmel	local vid=$1; shift
563b5166d7aSIdo Schimmel	local what=$1; shift
564b5166d7aSIdo Schimmel
565b5166d7aSIdo Schimmel	RET=0
566b5166d7aSIdo Schimmel
567b5166d7aSIdo Schimmel	local -a expects=(0 0 0 0 0)
568b5166d7aSIdo Schimmel	expects[$hit_idx]=10
569b5166d7aSIdo Schimmel
570b5166d7aSIdo Schimmel	vxlan_flood_test $mac $dst $vid "${expects[@]}"
571b5166d7aSIdo Schimmel
572b5166d7aSIdo Schimmel	log_test "VXLAN: $what"
573b5166d7aSIdo Schimmel}
574b5166d7aSIdo Schimmel
575b5166d7aSIdo Schimmeltest_unicast()
576b5166d7aSIdo Schimmel{
577b5166d7aSIdo Schimmel	local -a targets=("$h2_mac $h2"
578b5166d7aSIdo Schimmel			  "$r1_mac vx10 192.0.2.34"
579b5166d7aSIdo Schimmel			  "$r2_mac vx10 192.0.2.50")
580b5166d7aSIdo Schimmel	local target
581b5166d7aSIdo Schimmel
582b5166d7aSIdo Schimmel	log_info "unicast vlan 10"
583b5166d7aSIdo Schimmel
584b5166d7aSIdo Schimmel	for target in "${targets[@]}"; do
585b5166d7aSIdo Schimmel		vxlan_fdb_add_del add 10 $target
586b5166d7aSIdo Schimmel	done
587b5166d7aSIdo Schimmel
588b5166d7aSIdo Schimmel	__test_unicast $h2_mac 192.0.2.2 0 10 "local MAC unicast"
589b5166d7aSIdo Schimmel	__test_unicast $r1_mac 192.0.2.3 1 10 "remote MAC 1 unicast"
590b5166d7aSIdo Schimmel	__test_unicast $r2_mac 192.0.2.4 3 10 "remote MAC 2 unicast"
591b5166d7aSIdo Schimmel
592b5166d7aSIdo Schimmel	for target in "${targets[@]}"; do
593b5166d7aSIdo Schimmel		vxlan_fdb_add_del del 10 $target
594b5166d7aSIdo Schimmel	done
595b5166d7aSIdo Schimmel
596b5166d7aSIdo Schimmel	log_info "unicast vlan 20"
597b5166d7aSIdo Schimmel
598b5166d7aSIdo Schimmel	targets=("$h2_mac $h2" "$r1_mac vx20 192.0.2.34" \
599b5166d7aSIdo Schimmel		 "$r2_mac vx20 192.0.2.50")
600b5166d7aSIdo Schimmel
601b5166d7aSIdo Schimmel	for target in "${targets[@]}"; do
602b5166d7aSIdo Schimmel		vxlan_fdb_add_del add 20 $target
603b5166d7aSIdo Schimmel	done
604b5166d7aSIdo Schimmel
605b5166d7aSIdo Schimmel	__test_unicast $h2_mac 198.51.100.2 0 20 "local MAC unicast"
606b5166d7aSIdo Schimmel	__test_unicast $r1_mac 198.51.100.3 2 20 "remote MAC 1 unicast"
607b5166d7aSIdo Schimmel	__test_unicast $r2_mac 198.51.100.4 4 20 "remote MAC 2 unicast"
608b5166d7aSIdo Schimmel
609b5166d7aSIdo Schimmel	for target in "${targets[@]}"; do
610b5166d7aSIdo Schimmel		vxlan_fdb_add_del del 20 $target
611b5166d7aSIdo Schimmel	done
612b5166d7aSIdo Schimmel}
613b5166d7aSIdo Schimmel
61455939b26SIdo Schimmeltest_pvid()
61555939b26SIdo Schimmel{
61655939b26SIdo Schimmel	local -a expects=(0 0 0 0 0)
61755939b26SIdo Schimmel	local mac=de:ad:be:ef:13:37
61855939b26SIdo Schimmel	local dst=192.0.2.100
61955939b26SIdo Schimmel	local vid=10
62055939b26SIdo Schimmel
62155939b26SIdo Schimmel	# Check that flooding works
62255939b26SIdo Schimmel	RET=0
62355939b26SIdo Schimmel
62455939b26SIdo Schimmel	expects[0]=10; expects[1]=10; expects[3]=10
62555939b26SIdo Schimmel	vxlan_flood_test $mac $dst $vid "${expects[@]}"
62655939b26SIdo Schimmel
62755939b26SIdo Schimmel	log_test "VXLAN: flood before pvid off"
62855939b26SIdo Schimmel
62955939b26SIdo Schimmel	# Toggle PVID off and test that flood to remote hosts does not work
63055939b26SIdo Schimmel	RET=0
63155939b26SIdo Schimmel
63255939b26SIdo Schimmel	bridge vlan add vid 10 dev vx10
63355939b26SIdo Schimmel
63455939b26SIdo Schimmel	expects[0]=10; expects[1]=0; expects[3]=0
63555939b26SIdo Schimmel	vxlan_flood_test $mac $dst $vid "${expects[@]}"
63655939b26SIdo Schimmel
63755939b26SIdo Schimmel	log_test "VXLAN: flood after pvid off"
63855939b26SIdo Schimmel
63955939b26SIdo Schimmel	# Toggle PVID on and test that flood to remote hosts does work
64055939b26SIdo Schimmel	RET=0
64155939b26SIdo Schimmel
64255939b26SIdo Schimmel	bridge vlan add vid 10 dev vx10 pvid untagged
64355939b26SIdo Schimmel
64455939b26SIdo Schimmel	expects[0]=10; expects[1]=10; expects[3]=10
64555939b26SIdo Schimmel	vxlan_flood_test $mac $dst $vid "${expects[@]}"
64655939b26SIdo Schimmel
64755939b26SIdo Schimmel	log_test "VXLAN: flood after pvid on"
64855939b26SIdo Schimmel
64955939b26SIdo Schimmel	# Add a new VLAN and test that it does not affect flooding
65055939b26SIdo Schimmel	RET=0
65155939b26SIdo Schimmel
65255939b26SIdo Schimmel	bridge vlan add vid 30 dev vx10
65355939b26SIdo Schimmel
65455939b26SIdo Schimmel	expects[0]=10; expects[1]=10; expects[3]=10
65555939b26SIdo Schimmel	vxlan_flood_test $mac $dst $vid "${expects[@]}"
65655939b26SIdo Schimmel
65755939b26SIdo Schimmel	bridge vlan del vid 30 dev vx10
65855939b26SIdo Schimmel
65955939b26SIdo Schimmel	log_test "VXLAN: flood after vlan add"
66055939b26SIdo Schimmel
66155939b26SIdo Schimmel	# Remove currently mapped VLAN and test that flood to remote hosts does
66255939b26SIdo Schimmel	# not work
66355939b26SIdo Schimmel	RET=0
66455939b26SIdo Schimmel
66555939b26SIdo Schimmel	bridge vlan del vid 10 dev vx10
66655939b26SIdo Schimmel
66755939b26SIdo Schimmel	expects[0]=10; expects[1]=0; expects[3]=0
66855939b26SIdo Schimmel	vxlan_flood_test $mac $dst $vid "${expects[@]}"
66955939b26SIdo Schimmel
67055939b26SIdo Schimmel	log_test "VXLAN: flood after vlan delete"
67155939b26SIdo Schimmel
67255939b26SIdo Schimmel	# Re-add the VLAN and test that flood to remote hosts does work
67355939b26SIdo Schimmel	RET=0
67455939b26SIdo Schimmel
67555939b26SIdo Schimmel	bridge vlan add vid 10 dev vx10 pvid untagged
67655939b26SIdo Schimmel
67755939b26SIdo Schimmel	expects[0]=10; expects[1]=10; expects[3]=10
67855939b26SIdo Schimmel	vxlan_flood_test $mac $dst $vid "${expects[@]}"
67955939b26SIdo Schimmel
68055939b26SIdo Schimmel	log_test "VXLAN: flood after vlan re-add"
68155939b26SIdo Schimmel}
68255939b26SIdo Schimmel
683b5166d7aSIdo Schimmel__test_learning()
684b5166d7aSIdo Schimmel{
685b5166d7aSIdo Schimmel	local -a expects=(0 0 0 0 0)
686b5166d7aSIdo Schimmel	local mac=$1; shift
687b5166d7aSIdo Schimmel	local dst=$1; shift
688b5166d7aSIdo Schimmel	local vid=$1; shift
689b5166d7aSIdo Schimmel	local idx1=$1; shift
690b5166d7aSIdo Schimmel	local idx2=$1; shift
691b5166d7aSIdo Schimmel	local vx=vx$vid
692b5166d7aSIdo Schimmel
693b5166d7aSIdo Schimmel	# Check that flooding works
694b5166d7aSIdo Schimmel	RET=0
695b5166d7aSIdo Schimmel
696b5166d7aSIdo Schimmel	expects[0]=10; expects[$idx1]=10; expects[$idx2]=10
697b5166d7aSIdo Schimmel	vxlan_flood_test $mac $dst $vid "${expects[@]}"
698b5166d7aSIdo Schimmel
699b5166d7aSIdo Schimmel	log_test "VXLAN: flood before learning"
700b5166d7aSIdo Schimmel
701b5166d7aSIdo Schimmel	# Send a packet with source mac set to $mac from host w2 and check that
702b5166d7aSIdo Schimmel	# a corresponding entry is created in the VxLAN device
703b5166d7aSIdo Schimmel	RET=0
704b5166d7aSIdo Schimmel
705b5166d7aSIdo Schimmel	in_ns ns1 $MZ w2 -Q $vid -c 1 -p 64 -a $mac -b ff:ff:ff:ff:ff:ff \
706b5166d7aSIdo Schimmel		-B $dst -t icmp -q
707b5166d7aSIdo Schimmel	sleep 1
708b5166d7aSIdo Schimmel
709b5166d7aSIdo Schimmel	bridge fdb show brport $vx | grep $mac | grep -q self
710b5166d7aSIdo Schimmel	check_err $?
711b5166d7aSIdo Schimmel	bridge fdb show brport $vx | grep $mac | grep "vlan $vid" \
712b5166d7aSIdo Schimmel		| grep -q -v self
713b5166d7aSIdo Schimmel	check_err $?
714b5166d7aSIdo Schimmel
715b5166d7aSIdo Schimmel	log_test "VXLAN: show learned FDB entry"
716b5166d7aSIdo Schimmel
717b5166d7aSIdo Schimmel	# Repeat first test and check that packets only reach host w2 in ns1
718b5166d7aSIdo Schimmel	RET=0
719b5166d7aSIdo Schimmel
720b5166d7aSIdo Schimmel	expects[0]=0; expects[$idx1]=10; expects[$idx2]=0
721b5166d7aSIdo Schimmel	vxlan_flood_test $mac $dst $vid "${expects[@]}"
722b5166d7aSIdo Schimmel
723b5166d7aSIdo Schimmel	log_test "VXLAN: learned FDB entry"
724b5166d7aSIdo Schimmel
725b5166d7aSIdo Schimmel	# Delete the learned FDB entry from the VxLAN and bridge devices and
726b5166d7aSIdo Schimmel	# check that packets are flooded
727b5166d7aSIdo Schimmel	RET=0
728b5166d7aSIdo Schimmel
729b5166d7aSIdo Schimmel	bridge fdb del dev $vx $mac master self vlan $vid
730b5166d7aSIdo Schimmel	sleep 1
731b5166d7aSIdo Schimmel
732b5166d7aSIdo Schimmel	expects[0]=10; expects[$idx1]=10; expects[$idx2]=10
733b5166d7aSIdo Schimmel	vxlan_flood_test $mac $dst $vid "${expects[@]}"
734b5166d7aSIdo Schimmel
735b5166d7aSIdo Schimmel	log_test "VXLAN: deletion of learned FDB entry"
736b5166d7aSIdo Schimmel
737b5166d7aSIdo Schimmel	# Re-learn the first FDB entry and check that it is correctly aged-out
738b5166d7aSIdo Schimmel	RET=0
739b5166d7aSIdo Schimmel
740b5166d7aSIdo Schimmel	in_ns ns1 $MZ w2 -Q $vid -c 1 -p 64 -a $mac -b ff:ff:ff:ff:ff:ff \
741b5166d7aSIdo Schimmel		-B $dst -t icmp -q
742b5166d7aSIdo Schimmel	sleep 1
743b5166d7aSIdo Schimmel
744b5166d7aSIdo Schimmel	bridge fdb show brport $vx | grep $mac | grep -q self
745b5166d7aSIdo Schimmel	check_err $?
746b5166d7aSIdo Schimmel	bridge fdb show brport $vx | grep $mac | grep "vlan $vid" \
747b5166d7aSIdo Schimmel		| grep -q -v self
748b5166d7aSIdo Schimmel	check_err $?
749b5166d7aSIdo Schimmel
750b5166d7aSIdo Schimmel	expects[0]=0; expects[$idx1]=10; expects[$idx2]=0
751b5166d7aSIdo Schimmel	vxlan_flood_test $mac $dst $vid "${expects[@]}"
752b5166d7aSIdo Schimmel
753b5166d7aSIdo Schimmel	sleep 20
754b5166d7aSIdo Schimmel
755b5166d7aSIdo Schimmel	bridge fdb show brport $vx | grep $mac | grep -q self
756b5166d7aSIdo Schimmel	check_fail $?
757b5166d7aSIdo Schimmel	bridge fdb show brport $vx | grep $mac | grep "vlan $vid" \
758b5166d7aSIdo Schimmel		| grep -q -v self
759b5166d7aSIdo Schimmel	check_fail $?
760b5166d7aSIdo Schimmel
761b5166d7aSIdo Schimmel	expects[0]=10; expects[$idx1]=10; expects[$idx2]=10
762b5166d7aSIdo Schimmel	vxlan_flood_test $mac $dst $vid "${expects[@]}"
763b5166d7aSIdo Schimmel
764b5166d7aSIdo Schimmel	log_test "VXLAN: Ageing of learned FDB entry"
765b5166d7aSIdo Schimmel
766b5166d7aSIdo Schimmel	# Toggle learning on the bridge port and check that the bridge's FDB
767b5166d7aSIdo Schimmel	# is populated only when it should
768b5166d7aSIdo Schimmel	RET=0
769b5166d7aSIdo Schimmel
770b5166d7aSIdo Schimmel	ip link set dev $vx type bridge_slave learning off
771b5166d7aSIdo Schimmel
772b5166d7aSIdo Schimmel	in_ns ns1 $MZ w2 -Q $vid -c 1 -p 64 -a $mac -b ff:ff:ff:ff:ff:ff \
773b5166d7aSIdo Schimmel		-B $dst -t icmp -q
774b5166d7aSIdo Schimmel	sleep 1
775b5166d7aSIdo Schimmel
776b5166d7aSIdo Schimmel	bridge fdb show brport $vx | grep $mac | grep "vlan $vid" \
777b5166d7aSIdo Schimmel		| grep -q -v self
778b5166d7aSIdo Schimmel	check_fail $?
779b5166d7aSIdo Schimmel
780b5166d7aSIdo Schimmel	ip link set dev $vx type bridge_slave learning on
781b5166d7aSIdo Schimmel
782b5166d7aSIdo Schimmel	in_ns ns1 $MZ w2 -Q $vid -c 1 -p 64 -a $mac -b ff:ff:ff:ff:ff:ff \
783b5166d7aSIdo Schimmel		-B $dst -t icmp -q
784b5166d7aSIdo Schimmel	sleep 1
785b5166d7aSIdo Schimmel
786b5166d7aSIdo Schimmel	bridge fdb show brport $vx | grep $mac | grep "vlan $vid" \
787b5166d7aSIdo Schimmel		| grep -q -v self
788b5166d7aSIdo Schimmel	check_err $?
789b5166d7aSIdo Schimmel
790b5166d7aSIdo Schimmel	log_test "VXLAN: learning toggling on bridge port"
791b5166d7aSIdo Schimmel}
792b5166d7aSIdo Schimmel
793b5166d7aSIdo Schimmeltest_learning()
794b5166d7aSIdo Schimmel{
795b5166d7aSIdo Schimmel	local mac=de:ad:be:ef:13:37
796b5166d7aSIdo Schimmel	local dst=192.0.2.100
797b5166d7aSIdo Schimmel	local vid=10
798b5166d7aSIdo Schimmel
799b5166d7aSIdo Schimmel	# Enable learning on the VxLAN devices and set ageing time to 10 seconds
800b5166d7aSIdo Schimmel	ip link set dev br1 type bridge ageing_time 1000
801b5166d7aSIdo Schimmel	ip link set dev vx10 type vxlan ageing 10
802b5166d7aSIdo Schimmel	ip link set dev vx10 type vxlan learning
803b5166d7aSIdo Schimmel	ip link set dev vx20 type vxlan ageing 10
804b5166d7aSIdo Schimmel	ip link set dev vx20 type vxlan learning
805b5166d7aSIdo Schimmel	reapply_config
806b5166d7aSIdo Schimmel
807b5166d7aSIdo Schimmel	log_info "learning vlan 10"
808b5166d7aSIdo Schimmel
809b5166d7aSIdo Schimmel	__test_learning $mac $dst $vid 1 3
810b5166d7aSIdo Schimmel
811b5166d7aSIdo Schimmel	log_info "learning vlan 20"
812b5166d7aSIdo Schimmel
813b5166d7aSIdo Schimmel	mac=ca:fe:be:ef:13:37
814b5166d7aSIdo Schimmel	dst=198.51.100.100
815b5166d7aSIdo Schimmel	vid=20
816b5166d7aSIdo Schimmel
817b5166d7aSIdo Schimmel	__test_learning $mac $dst $vid 2 4
818b5166d7aSIdo Schimmel
819b5166d7aSIdo Schimmel	# Restore previous settings
820b5166d7aSIdo Schimmel	ip link set dev vx20 type vxlan nolearning
821b5166d7aSIdo Schimmel	ip link set dev vx20 type vxlan ageing 300
822b5166d7aSIdo Schimmel	ip link set dev vx10 type vxlan nolearning
823b5166d7aSIdo Schimmel	ip link set dev vx10 type vxlan ageing 300
824b5166d7aSIdo Schimmel	ip link set dev br1 type bridge ageing_time 30000
825b5166d7aSIdo Schimmel	reapply_config
826b5166d7aSIdo Schimmel}
827b5166d7aSIdo Schimmel
828b5166d7aSIdo Schimmeltest_all()
829b5166d7aSIdo Schimmel{
830b5166d7aSIdo Schimmel	log_info "Running tests with UDP port $VXPORT"
831b5166d7aSIdo Schimmel	tests_run
832b5166d7aSIdo Schimmel}
833b5166d7aSIdo Schimmel
834b5166d7aSIdo Schimmeltrap cleanup EXIT
835b5166d7aSIdo Schimmel
836b5166d7aSIdo Schimmelsetup_prepare
837b5166d7aSIdo Schimmelsetup_wait
838b5166d7aSIdo Schimmeltest_all
839b5166d7aSIdo Schimmel
840b5166d7aSIdo Schimmelexit $EXIT_STATUS
841