1*6c6ea78aSAmit Cohen#!/bin/bash
2*6c6ea78aSAmit Cohen# SPDX-License-Identifier: GPL-2.0
3*6c6ea78aSAmit Cohen
4*6c6ea78aSAmit Cohen
5*6c6ea78aSAmit Cohen# +--------------------------------+            +-----------------------------+
6*6c6ea78aSAmit Cohen# |                         vrf-h1 |            |                      vrf-h2 |
7*6c6ea78aSAmit Cohen# |    + $h1                       |            | + $h2                       |
8*6c6ea78aSAmit Cohen# |    | 2001:db8:1::1/64          |            | | 2001:db8:2::1/64          |
9*6c6ea78aSAmit Cohen# |    | default via 2001:db8:1::3 |            | | default via 2001:db8:2::3 |
10*6c6ea78aSAmit Cohen# +----|---------------------------+            +-|---------------------------+
11*6c6ea78aSAmit Cohen#      |                                          |
12*6c6ea78aSAmit Cohen# +----|------------------------------------------|---------------------------+
13*6c6ea78aSAmit Cohen# | SW |                                          |                           |
14*6c6ea78aSAmit Cohen# | +--|------------------------------------------|-------------------------+ |
15*6c6ea78aSAmit Cohen# | |  + $swp1                         br1          + $swp2                 | |
16*6c6ea78aSAmit Cohen# | |     vid 10 pvid untagged                         vid 20 pvid untagged | |
17*6c6ea78aSAmit Cohen# | |                                                                       | |
18*6c6ea78aSAmit Cohen# | |  + vx10                                       + vx20                  | |
19*6c6ea78aSAmit Cohen# | |    local 2001:db8:3::1                          local 2001:db8:3::1   | |
20*6c6ea78aSAmit Cohen# | |    remote 2001:db8:3::2                         remote 2001:db8:3::2  | |
21*6c6ea78aSAmit Cohen# | |    id 1010                                      id 1020               | |
22*6c6ea78aSAmit Cohen# | |    dstport 4789                                 dstport 4789          | |
23*6c6ea78aSAmit Cohen# | |    vid 10 pvid untagged                         vid 20 pvid untagged  | |
24*6c6ea78aSAmit Cohen# | |                                                                       | |
25*6c6ea78aSAmit Cohen# | |                             + vx4001                                  | |
26*6c6ea78aSAmit Cohen# | |                               local 2001:db8:3::1                     | |
27*6c6ea78aSAmit Cohen# | |                               remote 2001:db8:3::2                    | |
28*6c6ea78aSAmit Cohen# | |                               id 104001                               | |
29*6c6ea78aSAmit Cohen# | |                               dstport 4789                            | |
30*6c6ea78aSAmit Cohen# | |                               vid 4001 pvid untagged                  | |
31*6c6ea78aSAmit Cohen# | |                                                                       | |
32*6c6ea78aSAmit Cohen# | +-----------------------------------+-----------------------------------+ |
33*6c6ea78aSAmit Cohen# |                                     |                                     |
34*6c6ea78aSAmit Cohen# | +-----------------------------------|-----------------------------------+ |
35*6c6ea78aSAmit Cohen# | |                                   |                                   | |
36*6c6ea78aSAmit Cohen# | |  +--------------------------------+--------------------------------+  | |
37*6c6ea78aSAmit Cohen# | |  |                                |                                |  | |
38*6c6ea78aSAmit Cohen# | |  + vlan10                         |                         vlan20 +  | |
39*6c6ea78aSAmit Cohen# | |  | 2001:db8:1::2/64               |               2001:db8:2::2/64 |  | |
40*6c6ea78aSAmit Cohen# | |  |                                |                                |  | |
41*6c6ea78aSAmit Cohen# | |  + vlan10-v (macvlan)             +             vlan20-v (macvlan) +  | |
42*6c6ea78aSAmit Cohen# | |    2001:db8:1::3/64           vlan4001            2001:db8:2::3/64    | |
43*6c6ea78aSAmit Cohen# | |    00:00:5e:00:01:01                             00:00:5e:00:01:01    | |
44*6c6ea78aSAmit Cohen# | |                               vrf-green                               | |
45*6c6ea78aSAmit Cohen# | +-----------------------------------------------------------------------+ |
46*6c6ea78aSAmit Cohen# |                                                                           |
47*6c6ea78aSAmit Cohen# |    + $rp1                                       +lo                       |
48*6c6ea78aSAmit Cohen# |    | 2001:db8:4::1/64                           2001:db8:3::1             |
49*6c6ea78aSAmit Cohen# +----|----------------------------------------------------------------------+
50*6c6ea78aSAmit Cohen#      |
51*6c6ea78aSAmit Cohen# +----|--------------------------------------------------------+
52*6c6ea78aSAmit Cohen# |    |                            vrf-spine                   |
53*6c6ea78aSAmit Cohen# |    + $rp2                                                   |
54*6c6ea78aSAmit Cohen# |      2001:db8:4::2/64                                       |
55*6c6ea78aSAmit Cohen# |                                                             |   (maybe) HW
56*6c6ea78aSAmit Cohen# =============================================================================
57*6c6ea78aSAmit Cohen# |                                                             |  (likely) SW
58*6c6ea78aSAmit Cohen# |                                                             |
59*6c6ea78aSAmit Cohen# |    + v1 (veth)                                              |
60*6c6ea78aSAmit Cohen# |    | 2001:db8:5::2/64                                       |
61*6c6ea78aSAmit Cohen# +----|--------------------------------------------------------+
62*6c6ea78aSAmit Cohen#      |
63*6c6ea78aSAmit Cohen# +----|----------------------------------------------------------------------+
64*6c6ea78aSAmit Cohen# |    + v2 (veth)                                  +lo           NS1 (netns) |
65*6c6ea78aSAmit Cohen# |      2001:db8:5::1/64                            2001:db8:3::2/128        |
66*6c6ea78aSAmit Cohen# |                                                                           |
67*6c6ea78aSAmit Cohen# | +-----------------------------------------------------------------------+ |
68*6c6ea78aSAmit Cohen# | |                               vrf-green                               | |
69*6c6ea78aSAmit Cohen# | |  + vlan10-v (macvlan)                           vlan20-v (macvlan) +  | |
70*6c6ea78aSAmit Cohen# | |  | 2001:db8:1::3/64                               2001:db8:2::3/64 |  | |
71*6c6ea78aSAmit Cohen# | |  | 00:00:5e:00:01:01                             00:00:5e:00:01:01 |  | |
72*6c6ea78aSAmit Cohen# | |  |                            vlan4001                             |  | |
73*6c6ea78aSAmit Cohen# | |  + vlan10                         +                         vlan20 +  | |
74*6c6ea78aSAmit Cohen# | |  | 2001:db8:1::3/64               |               2001:db8:2::3/64 |  | |
75*6c6ea78aSAmit Cohen# | |  |                                |                                |  | |
76*6c6ea78aSAmit Cohen# | |  +--------------------------------+--------------------------------+  | |
77*6c6ea78aSAmit Cohen# | |                                   |                                   | |
78*6c6ea78aSAmit Cohen# | +-----------------------------------|-----------------------------------+ |
79*6c6ea78aSAmit Cohen# |                                     |                                     |
80*6c6ea78aSAmit Cohen# | +-----------------------------------+-----------------------------------+ |
81*6c6ea78aSAmit Cohen# | |                                                                       | |
82*6c6ea78aSAmit Cohen# | |  + vx10                                     + vx20                    | |
83*6c6ea78aSAmit Cohen# | |    local 2001:db8:3::2                        local 2001:db8:3::2     | |
84*6c6ea78aSAmit Cohen# | |    remote 2001:db8:3::1                       remote 2001:db8:3::1    | |
85*6c6ea78aSAmit Cohen# | |    id 1010                                    id 1020                 | |
86*6c6ea78aSAmit Cohen# | |    dstport 4789                               dstport 4789            | |
87*6c6ea78aSAmit Cohen# | |    vid 10 pvid untagged                       vid 20 pvid untagged    | |
88*6c6ea78aSAmit Cohen# | |                                                                       | |
89*6c6ea78aSAmit Cohen# | |                             + vx4001                                  | |
90*6c6ea78aSAmit Cohen# | |                               local 2001:db8:3::2                     | |
91*6c6ea78aSAmit Cohen# | |                               remote 2001:db8:3::1                    | |
92*6c6ea78aSAmit Cohen# | |                               id 104001                               | |
93*6c6ea78aSAmit Cohen# | |                               dstport 4789                            | |
94*6c6ea78aSAmit Cohen# | |                               vid 4001 pvid untagged                  | |
95*6c6ea78aSAmit Cohen# | |                                                                       | |
96*6c6ea78aSAmit Cohen# | |  + w1 (veth)                                + w3 (veth)               | |
97*6c6ea78aSAmit Cohen# | |  | vid 10 pvid untagged          br1        | vid 20 pvid untagged    | |
98*6c6ea78aSAmit Cohen# | +--|------------------------------------------|-------------------------+ |
99*6c6ea78aSAmit Cohen# |    |                                          |                           |
100*6c6ea78aSAmit Cohen# |    |                                          |                           |
101*6c6ea78aSAmit Cohen# | +--|----------------------+                +--|-------------------------+ |
102*6c6ea78aSAmit Cohen# | |  |               vrf-h1 |                |  |                  vrf-h2 | |
103*6c6ea78aSAmit Cohen# | |  + w2 (veth)            |                |  + w4 (veth)               | |
104*6c6ea78aSAmit Cohen# | |    2001:db8:1::4/64     |                |    2001:db8:2::4/64        | |
105*6c6ea78aSAmit Cohen# | |    default via          |                |    default via             | |
106*6c6ea78aSAmit Cohen# | |    2001:db8:1::3/64     |                |    2001:db8:2::3/64        | |
107*6c6ea78aSAmit Cohen# | +-------------------------+                +----------------------------+ |
108*6c6ea78aSAmit Cohen# +---------------------------------------------------------------------------+
109*6c6ea78aSAmit Cohen
110*6c6ea78aSAmit CohenALL_TESTS="
111*6c6ea78aSAmit Cohen	ping_ipv6
112*6c6ea78aSAmit Cohen"
113*6c6ea78aSAmit CohenNUM_NETIFS=6
114*6c6ea78aSAmit Cohensource lib.sh
115*6c6ea78aSAmit Cohen
116*6c6ea78aSAmit Cohenhx_create()
117*6c6ea78aSAmit Cohen{
118*6c6ea78aSAmit Cohen	local vrf_name=$1; shift
119*6c6ea78aSAmit Cohen	local if_name=$1; shift
120*6c6ea78aSAmit Cohen	local ip_addr=$1; shift
121*6c6ea78aSAmit Cohen	local gw_ip=$1; shift
122*6c6ea78aSAmit Cohen
123*6c6ea78aSAmit Cohen	vrf_create $vrf_name
124*6c6ea78aSAmit Cohen	ip link set dev $if_name master $vrf_name
125*6c6ea78aSAmit Cohen	ip link set dev $vrf_name up
126*6c6ea78aSAmit Cohen	ip link set dev $if_name up
127*6c6ea78aSAmit Cohen
128*6c6ea78aSAmit Cohen	ip address add $ip_addr/64 dev $if_name
129*6c6ea78aSAmit Cohen	ip neigh replace $gw_ip lladdr 00:00:5e:00:01:01 nud permanent \
130*6c6ea78aSAmit Cohen		dev $if_name
131*6c6ea78aSAmit Cohen	ip route add default vrf $vrf_name nexthop via $gw_ip
132*6c6ea78aSAmit Cohen}
133*6c6ea78aSAmit Cohenexport -f hx_create
134*6c6ea78aSAmit Cohen
135*6c6ea78aSAmit Cohenhx_destroy()
136*6c6ea78aSAmit Cohen{
137*6c6ea78aSAmit Cohen	local vrf_name=$1; shift
138*6c6ea78aSAmit Cohen	local if_name=$1; shift
139*6c6ea78aSAmit Cohen	local ip_addr=$1; shift
140*6c6ea78aSAmit Cohen	local gw_ip=$1; shift
141*6c6ea78aSAmit Cohen
142*6c6ea78aSAmit Cohen	ip route del default vrf $vrf_name nexthop via $gw_ip
143*6c6ea78aSAmit Cohen	ip neigh del $gw_ip dev $if_name
144*6c6ea78aSAmit Cohen	ip address del $ip_addr/64 dev $if_name
145*6c6ea78aSAmit Cohen
146*6c6ea78aSAmit Cohen	ip link set dev $if_name down
147*6c6ea78aSAmit Cohen	vrf_destroy $vrf_name
148*6c6ea78aSAmit Cohen}
149*6c6ea78aSAmit Cohen
150*6c6ea78aSAmit Cohenh1_create()
151*6c6ea78aSAmit Cohen{
152*6c6ea78aSAmit Cohen	hx_create "vrf-h1" $h1 2001:db8:1::1 2001:db8:1::3
153*6c6ea78aSAmit Cohen}
154*6c6ea78aSAmit Cohen
155*6c6ea78aSAmit Cohenh1_destroy()
156*6c6ea78aSAmit Cohen{
157*6c6ea78aSAmit Cohen	hx_destroy "vrf-h1" $h1 2001:db8:1::1 2001:db8:1::3
158*6c6ea78aSAmit Cohen}
159*6c6ea78aSAmit Cohen
160*6c6ea78aSAmit Cohenh2_create()
161*6c6ea78aSAmit Cohen{
162*6c6ea78aSAmit Cohen	hx_create "vrf-h2" $h2 2001:db8:2::1 2001:db8:2::3
163*6c6ea78aSAmit Cohen}
164*6c6ea78aSAmit Cohen
165*6c6ea78aSAmit Cohenh2_destroy()
166*6c6ea78aSAmit Cohen{
167*6c6ea78aSAmit Cohen	hx_destroy "vrf-h2" $h2 2001:db8:2::1 2001:db8:2::3
168*6c6ea78aSAmit Cohen}
169*6c6ea78aSAmit Cohen
170*6c6ea78aSAmit Cohenswitch_create()
171*6c6ea78aSAmit Cohen{
172*6c6ea78aSAmit Cohen	ip link add name br1 type bridge vlan_filtering 1 vlan_default_pvid 0 \
173*6c6ea78aSAmit Cohen		mcast_snooping 0
174*6c6ea78aSAmit Cohen	# Make sure the bridge uses the MAC address of the local port and not
175*6c6ea78aSAmit Cohen	# that of the VxLAN's device.
176*6c6ea78aSAmit Cohen	ip link set dev br1 address $(mac_get $swp1)
177*6c6ea78aSAmit Cohen	ip link set dev br1 up
178*6c6ea78aSAmit Cohen
179*6c6ea78aSAmit Cohen	ip link set dev $rp1 up
180*6c6ea78aSAmit Cohen	ip address add dev $rp1 2001:db8:4::1/64
181*6c6ea78aSAmit Cohen	ip route add 2001:db8:3::2/128 nexthop via 2001:db8:4::2
182*6c6ea78aSAmit Cohen
183*6c6ea78aSAmit Cohen	ip link add name vx10 type vxlan id 1010		\
184*6c6ea78aSAmit Cohen		local 2001:db8:3::1 remote 2001:db8:3::2 dstport 4789	\
185*6c6ea78aSAmit Cohen		nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100
186*6c6ea78aSAmit Cohen	ip link set dev vx10 up
187*6c6ea78aSAmit Cohen
188*6c6ea78aSAmit Cohen	ip link set dev vx10 master br1
189*6c6ea78aSAmit Cohen	bridge vlan add vid 10 dev vx10 pvid untagged
190*6c6ea78aSAmit Cohen
191*6c6ea78aSAmit Cohen	ip link add name vx20 type vxlan id 1020		\
192*6c6ea78aSAmit Cohen		local 2001:db8:3::1 remote 2001:db8:3::2 dstport 4789	\
193*6c6ea78aSAmit Cohen		nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100
194*6c6ea78aSAmit Cohen	ip link set dev vx20 up
195*6c6ea78aSAmit Cohen
196*6c6ea78aSAmit Cohen	ip link set dev vx20 master br1
197*6c6ea78aSAmit Cohen	bridge vlan add vid 20 dev vx20 pvid untagged
198*6c6ea78aSAmit Cohen
199*6c6ea78aSAmit Cohen	ip link set dev $swp1 master br1
200*6c6ea78aSAmit Cohen	ip link set dev $swp1 up
201*6c6ea78aSAmit Cohen
202*6c6ea78aSAmit Cohen	ip link set dev $swp2 master br1
203*6c6ea78aSAmit Cohen	ip link set dev $swp2 up
204*6c6ea78aSAmit Cohen
205*6c6ea78aSAmit Cohen	ip link add name vx4001 type vxlan id 104001		\
206*6c6ea78aSAmit Cohen		local 2001:db8:3::1 dstport 4789			\
207*6c6ea78aSAmit Cohen		nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100
208*6c6ea78aSAmit Cohen	ip link set dev vx4001 up
209*6c6ea78aSAmit Cohen
210*6c6ea78aSAmit Cohen	ip link set dev vx4001 master br1
211*6c6ea78aSAmit Cohen	bridge vlan add vid 4001 dev vx4001 pvid untagged
212*6c6ea78aSAmit Cohen
213*6c6ea78aSAmit Cohen	ip address add 2001:db8:3::1/128 dev lo
214*6c6ea78aSAmit Cohen
215*6c6ea78aSAmit Cohen	# Create SVIs
216*6c6ea78aSAmit Cohen	vrf_create "vrf-green"
217*6c6ea78aSAmit Cohen	ip link set dev vrf-green up
218*6c6ea78aSAmit Cohen
219*6c6ea78aSAmit Cohen	ip link add link br1 name vlan10 up master vrf-green type vlan id 10
220*6c6ea78aSAmit Cohen	ip address add 2001:db8:1::2/64 dev vlan10
221*6c6ea78aSAmit Cohen	ip link add link vlan10 name vlan10-v up master vrf-green \
222*6c6ea78aSAmit Cohen		address 00:00:5e:00:01:01 type macvlan mode private
223*6c6ea78aSAmit Cohen	ip address add 2001:db8:1::3/64 dev vlan10-v
224*6c6ea78aSAmit Cohen
225*6c6ea78aSAmit Cohen	ip link add link br1 name vlan20 up master vrf-green type vlan id 20
226*6c6ea78aSAmit Cohen	ip address add 2001:db8:2::2/64 dev vlan20
227*6c6ea78aSAmit Cohen	ip link add link vlan20 name vlan20-v up master vrf-green \
228*6c6ea78aSAmit Cohen		address 00:00:5e:00:01:01 type macvlan mode private
229*6c6ea78aSAmit Cohen	ip address add 2001:db8:2::3/64 dev vlan20-v
230*6c6ea78aSAmit Cohen
231*6c6ea78aSAmit Cohen	ip link add link br1 name vlan4001 up master vrf-green \
232*6c6ea78aSAmit Cohen		type vlan id 4001
233*6c6ea78aSAmit Cohen
234*6c6ea78aSAmit Cohen	bridge vlan add vid 10 dev br1 self
235*6c6ea78aSAmit Cohen	bridge vlan add vid 20 dev br1 self
236*6c6ea78aSAmit Cohen	bridge vlan add vid 4001 dev br1 self
237*6c6ea78aSAmit Cohen
238*6c6ea78aSAmit Cohen	bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 10
239*6c6ea78aSAmit Cohen	bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 20
240*6c6ea78aSAmit Cohen
241*6c6ea78aSAmit Cohen	bridge vlan add vid 10 dev $swp1 pvid untagged
242*6c6ea78aSAmit Cohen	bridge vlan add vid 20 dev $swp2 pvid untagged
243*6c6ea78aSAmit Cohen}
244*6c6ea78aSAmit Cohen
245*6c6ea78aSAmit Cohenswitch_destroy()
246*6c6ea78aSAmit Cohen{
247*6c6ea78aSAmit Cohen	bridge vlan del vid 20 dev br1 self
248*6c6ea78aSAmit Cohen	bridge vlan del vid 10 dev br1 self
249*6c6ea78aSAmit Cohen
250*6c6ea78aSAmit Cohen	bridge fdb del 00:00:5e:00:01:01 dev br1 self local vlan 20
251*6c6ea78aSAmit Cohen	bridge fdb del 00:00:5e:00:01:01 dev br1 self local vlan 10
252*6c6ea78aSAmit Cohen
253*6c6ea78aSAmit Cohen	bridge vlan del vid 4001 dev br1 self
254*6c6ea78aSAmit Cohen	ip link del dev vlan4001
255*6c6ea78aSAmit Cohen
256*6c6ea78aSAmit Cohen	ip link del dev vlan20
257*6c6ea78aSAmit Cohen
258*6c6ea78aSAmit Cohen	ip link del dev vlan10
259*6c6ea78aSAmit Cohen
260*6c6ea78aSAmit Cohen	vrf_destroy "vrf-green"
261*6c6ea78aSAmit Cohen
262*6c6ea78aSAmit Cohen	ip address del 2001:db8:3::1/128 dev lo
263*6c6ea78aSAmit Cohen
264*6c6ea78aSAmit Cohen	bridge vlan del vid 20 dev $swp2
265*6c6ea78aSAmit Cohen	ip link set dev $swp2 down
266*6c6ea78aSAmit Cohen	ip link set dev $swp2 nomaster
267*6c6ea78aSAmit Cohen
268*6c6ea78aSAmit Cohen	bridge vlan del vid 10 dev $swp1
269*6c6ea78aSAmit Cohen	ip link set dev $swp1 down
270*6c6ea78aSAmit Cohen	ip link set dev $swp1 nomaster
271*6c6ea78aSAmit Cohen
272*6c6ea78aSAmit Cohen	bridge vlan del vid 4001 dev vx4001
273*6c6ea78aSAmit Cohen	ip link set dev vx4001 nomaster
274*6c6ea78aSAmit Cohen
275*6c6ea78aSAmit Cohen	ip link set dev vx4001 down
276*6c6ea78aSAmit Cohen	ip link del dev vx4001
277*6c6ea78aSAmit Cohen
278*6c6ea78aSAmit Cohen	bridge vlan del vid 20 dev vx20
279*6c6ea78aSAmit Cohen	ip link set dev vx20 nomaster
280*6c6ea78aSAmit Cohen
281*6c6ea78aSAmit Cohen	ip link set dev vx20 down
282*6c6ea78aSAmit Cohen	ip link del dev vx20
283*6c6ea78aSAmit Cohen
284*6c6ea78aSAmit Cohen	bridge vlan del vid 10 dev vx10
285*6c6ea78aSAmit Cohen	ip link set dev vx10 nomaster
286*6c6ea78aSAmit Cohen
287*6c6ea78aSAmit Cohen	ip link set dev vx10 down
288*6c6ea78aSAmit Cohen	ip link del dev vx10
289*6c6ea78aSAmit Cohen
290*6c6ea78aSAmit Cohen	ip route del 2001:db8:3::2 nexthop via 2001:db8:4::2
291*6c6ea78aSAmit Cohen	ip address del dev $rp1 2001:db8:4::1/64
292*6c6ea78aSAmit Cohen	ip link set dev $rp1 down
293*6c6ea78aSAmit Cohen
294*6c6ea78aSAmit Cohen	ip link set dev br1 down
295*6c6ea78aSAmit Cohen	ip link del dev br1
296*6c6ea78aSAmit Cohen}
297*6c6ea78aSAmit Cohen
298*6c6ea78aSAmit Cohenspine_create()
299*6c6ea78aSAmit Cohen{
300*6c6ea78aSAmit Cohen	vrf_create "vrf-spine"
301*6c6ea78aSAmit Cohen	ip link set dev $rp2 master vrf-spine
302*6c6ea78aSAmit Cohen	ip link set dev v1 master vrf-spine
303*6c6ea78aSAmit Cohen	ip link set dev vrf-spine up
304*6c6ea78aSAmit Cohen	ip link set dev $rp2 up
305*6c6ea78aSAmit Cohen	ip link set dev v1 up
306*6c6ea78aSAmit Cohen
307*6c6ea78aSAmit Cohen	ip address add 2001:db8:4::2/64 dev $rp2
308*6c6ea78aSAmit Cohen	ip address add 2001:db8:5::2/64 dev v1
309*6c6ea78aSAmit Cohen
310*6c6ea78aSAmit Cohen	ip route add 2001:db8:3::1/128 vrf vrf-spine nexthop via \
311*6c6ea78aSAmit Cohen		2001:db8:4::1
312*6c6ea78aSAmit Cohen	ip route add 2001:db8:3::2/128 vrf vrf-spine nexthop via \
313*6c6ea78aSAmit Cohen		2001:db8:5::1
314*6c6ea78aSAmit Cohen}
315*6c6ea78aSAmit Cohen
316*6c6ea78aSAmit Cohenspine_destroy()
317*6c6ea78aSAmit Cohen{
318*6c6ea78aSAmit Cohen	ip route del 2001:db8:3::2/128 vrf vrf-spine nexthop via \
319*6c6ea78aSAmit Cohen		2001:db8:5::1
320*6c6ea78aSAmit Cohen	ip route del 2001:db8:3::1/128 vrf vrf-spine nexthop via \
321*6c6ea78aSAmit Cohen		2001:db8:4::1
322*6c6ea78aSAmit Cohen
323*6c6ea78aSAmit Cohen	ip address del 2001:db8:5::2/64 dev v1
324*6c6ea78aSAmit Cohen	ip address del 2001:db8:4::2/64 dev $rp2
325*6c6ea78aSAmit Cohen
326*6c6ea78aSAmit Cohen	ip link set dev v1 down
327*6c6ea78aSAmit Cohen	ip link set dev $rp2 down
328*6c6ea78aSAmit Cohen	vrf_destroy "vrf-spine"
329*6c6ea78aSAmit Cohen}
330*6c6ea78aSAmit Cohen
331*6c6ea78aSAmit Cohenns_h1_create()
332*6c6ea78aSAmit Cohen{
333*6c6ea78aSAmit Cohen	hx_create "vrf-h1" w2 2001:db8:1::4 2001:db8:1::3
334*6c6ea78aSAmit Cohen}
335*6c6ea78aSAmit Cohenexport -f ns_h1_create
336*6c6ea78aSAmit Cohen
337*6c6ea78aSAmit Cohenns_h2_create()
338*6c6ea78aSAmit Cohen{
339*6c6ea78aSAmit Cohen	hx_create "vrf-h2" w4 2001:db8:2::4 2001:db8:2::3
340*6c6ea78aSAmit Cohen}
341*6c6ea78aSAmit Cohenexport -f ns_h2_create
342*6c6ea78aSAmit Cohen
343*6c6ea78aSAmit Cohenns_switch_create()
344*6c6ea78aSAmit Cohen{
345*6c6ea78aSAmit Cohen	ip link add name br1 type bridge vlan_filtering 1 vlan_default_pvid 0 \
346*6c6ea78aSAmit Cohen		mcast_snooping 0
347*6c6ea78aSAmit Cohen	ip link set dev br1 up
348*6c6ea78aSAmit Cohen
349*6c6ea78aSAmit Cohen	ip link set dev v2 up
350*6c6ea78aSAmit Cohen	ip address add dev v2 2001:db8:5::1/64
351*6c6ea78aSAmit Cohen	ip route add 2001:db8:3::1 nexthop via 2001:db8:5::2
352*6c6ea78aSAmit Cohen
353*6c6ea78aSAmit Cohen	ip link add name vx10 type vxlan id 1010		\
354*6c6ea78aSAmit Cohen		local 2001:db8:3::2 remote 2001:db8:3::1 dstport 4789	\
355*6c6ea78aSAmit Cohen		nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100
356*6c6ea78aSAmit Cohen	ip link set dev vx10 up
357*6c6ea78aSAmit Cohen
358*6c6ea78aSAmit Cohen	ip link set dev vx10 master br1
359*6c6ea78aSAmit Cohen	bridge vlan add vid 10 dev vx10 pvid untagged
360*6c6ea78aSAmit Cohen
361*6c6ea78aSAmit Cohen	ip link add name vx20 type vxlan id 1020		\
362*6c6ea78aSAmit Cohen		local 2001:db8:3::2 remote 2001:db8:3::1 dstport 4789	\
363*6c6ea78aSAmit Cohen		nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100
364*6c6ea78aSAmit Cohen	ip link set dev vx20 up
365*6c6ea78aSAmit Cohen
366*6c6ea78aSAmit Cohen	ip link set dev vx20 master br1
367*6c6ea78aSAmit Cohen	bridge vlan add vid 20 dev vx20 pvid untagged
368*6c6ea78aSAmit Cohen
369*6c6ea78aSAmit Cohen	ip link add name vx4001 type vxlan id 104001		\
370*6c6ea78aSAmit Cohen		local 2001:db8:3::2 dstport 4789			\
371*6c6ea78aSAmit Cohen		nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100
372*6c6ea78aSAmit Cohen	ip link set dev vx4001 up
373*6c6ea78aSAmit Cohen
374*6c6ea78aSAmit Cohen	ip link set dev vx4001 master br1
375*6c6ea78aSAmit Cohen	bridge vlan add vid 4001 dev vx4001 pvid untagged
376*6c6ea78aSAmit Cohen
377*6c6ea78aSAmit Cohen	ip link set dev w1 master br1
378*6c6ea78aSAmit Cohen	ip link set dev w1 up
379*6c6ea78aSAmit Cohen	bridge vlan add vid 10 dev w1 pvid untagged
380*6c6ea78aSAmit Cohen
381*6c6ea78aSAmit Cohen	ip link set dev w3 master br1
382*6c6ea78aSAmit Cohen	ip link set dev w3 up
383*6c6ea78aSAmit Cohen	bridge vlan add vid 20 dev w3 pvid untagged
384*6c6ea78aSAmit Cohen
385*6c6ea78aSAmit Cohen	ip address add 2001:db8:3::2/128 dev lo
386*6c6ea78aSAmit Cohen
387*6c6ea78aSAmit Cohen	# Create SVIs
388*6c6ea78aSAmit Cohen	vrf_create "vrf-green"
389*6c6ea78aSAmit Cohen	ip link set dev vrf-green up
390*6c6ea78aSAmit Cohen
391*6c6ea78aSAmit Cohen	ip link add link br1 name vlan10 up master vrf-green type vlan id 10
392*6c6ea78aSAmit Cohen	ip address add 2001:db8:1::3/64 dev vlan10
393*6c6ea78aSAmit Cohen	ip link add link vlan10 name vlan10-v up master vrf-green \
394*6c6ea78aSAmit Cohen		address 00:00:5e:00:01:01 type macvlan mode private
395*6c6ea78aSAmit Cohen	ip address add 2001:db8:1::3/64 dev vlan10-v
396*6c6ea78aSAmit Cohen
397*6c6ea78aSAmit Cohen	ip link add link br1 name vlan20 up master vrf-green type vlan id 20
398*6c6ea78aSAmit Cohen	ip address add 2001:db8:2::3/64 dev vlan20
399*6c6ea78aSAmit Cohen	ip link add link vlan20 name vlan20-v up master vrf-green \
400*6c6ea78aSAmit Cohen		address 00:00:5e:00:01:01 type macvlan mode private
401*6c6ea78aSAmit Cohen	ip address add 2001:db8:2::3/64 dev vlan20-v
402*6c6ea78aSAmit Cohen
403*6c6ea78aSAmit Cohen	ip link add link br1 name vlan4001 up master vrf-green \
404*6c6ea78aSAmit Cohen		type vlan id 4001
405*6c6ea78aSAmit Cohen
406*6c6ea78aSAmit Cohen	bridge vlan add vid 10 dev br1 self
407*6c6ea78aSAmit Cohen	bridge vlan add vid 20 dev br1 self
408*6c6ea78aSAmit Cohen	bridge vlan add vid 4001 dev br1 self
409*6c6ea78aSAmit Cohen
410*6c6ea78aSAmit Cohen	bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 10
411*6c6ea78aSAmit Cohen	bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 20
412*6c6ea78aSAmit Cohen}
413*6c6ea78aSAmit Cohenexport -f ns_switch_create
414*6c6ea78aSAmit Cohen
415*6c6ea78aSAmit Cohenns_init()
416*6c6ea78aSAmit Cohen{
417*6c6ea78aSAmit Cohen	ip link add name w1 type veth peer name w2
418*6c6ea78aSAmit Cohen	ip link add name w3 type veth peer name w4
419*6c6ea78aSAmit Cohen
420*6c6ea78aSAmit Cohen	ip link set dev lo up
421*6c6ea78aSAmit Cohen
422*6c6ea78aSAmit Cohen	ns_h1_create
423*6c6ea78aSAmit Cohen	ns_h2_create
424*6c6ea78aSAmit Cohen	ns_switch_create
425*6c6ea78aSAmit Cohen}
426*6c6ea78aSAmit Cohenexport -f ns_init
427*6c6ea78aSAmit Cohen
428*6c6ea78aSAmit Cohenns1_create()
429*6c6ea78aSAmit Cohen{
430*6c6ea78aSAmit Cohen	ip netns add ns1
431*6c6ea78aSAmit Cohen	ip link set dev v2 netns ns1
432*6c6ea78aSAmit Cohen	in_ns ns1 ns_init
433*6c6ea78aSAmit Cohen}
434*6c6ea78aSAmit Cohen
435*6c6ea78aSAmit Cohenns1_destroy()
436*6c6ea78aSAmit Cohen{
437*6c6ea78aSAmit Cohen	ip netns exec ns1 ip link set dev v2 netns 1
438*6c6ea78aSAmit Cohen	ip netns del ns1
439*6c6ea78aSAmit Cohen}
440*6c6ea78aSAmit Cohen
441*6c6ea78aSAmit Cohen__l2_vni_init()
442*6c6ea78aSAmit Cohen{
443*6c6ea78aSAmit Cohen	local mac1=$1; shift
444*6c6ea78aSAmit Cohen	local mac2=$1; shift
445*6c6ea78aSAmit Cohen	local ip1=$1; shift
446*6c6ea78aSAmit Cohen	local ip2=$1; shift
447*6c6ea78aSAmit Cohen	local dst=$1; shift
448*6c6ea78aSAmit Cohen
449*6c6ea78aSAmit Cohen	bridge fdb add $mac1 dev vx10 self master extern_learn static \
450*6c6ea78aSAmit Cohen		dst $dst vlan 10
451*6c6ea78aSAmit Cohen	bridge fdb add $mac2 dev vx20 self master extern_learn static \
452*6c6ea78aSAmit Cohen		dst $dst vlan 20
453*6c6ea78aSAmit Cohen
454*6c6ea78aSAmit Cohen	ip neigh add $ip1 lladdr $mac1 nud noarp dev vlan10 \
455*6c6ea78aSAmit Cohen		extern_learn
456*6c6ea78aSAmit Cohen	ip neigh add $ip2 lladdr $mac2 nud noarp dev vlan20 \
457*6c6ea78aSAmit Cohen		extern_learn
458*6c6ea78aSAmit Cohen}
459*6c6ea78aSAmit Cohenexport -f __l2_vni_init
460*6c6ea78aSAmit Cohen
461*6c6ea78aSAmit Cohenl2_vni_init()
462*6c6ea78aSAmit Cohen{
463*6c6ea78aSAmit Cohen	local h1_ns_mac=$(in_ns ns1 mac_get w2)
464*6c6ea78aSAmit Cohen	local h2_ns_mac=$(in_ns ns1 mac_get w4)
465*6c6ea78aSAmit Cohen	local h1_mac=$(mac_get $h1)
466*6c6ea78aSAmit Cohen	local h2_mac=$(mac_get $h2)
467*6c6ea78aSAmit Cohen
468*6c6ea78aSAmit Cohen	__l2_vni_init $h1_ns_mac $h2_ns_mac 2001:db8:1::4 2001:db8:2::4 \
469*6c6ea78aSAmit Cohen	       2001:db8:3::2
470*6c6ea78aSAmit Cohen	in_ns ns1 __l2_vni_init $h1_mac $h2_mac 2001:db8:1::1 2001:db8:2::1 \
471*6c6ea78aSAmit Cohen	       2001:db8:3::1
472*6c6ea78aSAmit Cohen}
473*6c6ea78aSAmit Cohen
474*6c6ea78aSAmit Cohen__l3_vni_init()
475*6c6ea78aSAmit Cohen{
476*6c6ea78aSAmit Cohen	local mac=$1; shift
477*6c6ea78aSAmit Cohen	local vtep_ip=$1; shift
478*6c6ea78aSAmit Cohen	local host1_ip=$1; shift
479*6c6ea78aSAmit Cohen	local host2_ip=$1; shift
480*6c6ea78aSAmit Cohen
481*6c6ea78aSAmit Cohen	bridge fdb add $mac dev vx4001 self master extern_learn static \
482*6c6ea78aSAmit Cohen		dst $vtep_ip vlan 4001
483*6c6ea78aSAmit Cohen
484*6c6ea78aSAmit Cohen	ip neigh add $vtep_ip lladdr $mac nud noarp dev vlan4001 extern_learn
485*6c6ea78aSAmit Cohen
486*6c6ea78aSAmit Cohen	ip route add $host1_ip/128 vrf vrf-green nexthop via $vtep_ip \
487*6c6ea78aSAmit Cohen		dev vlan4001 onlink
488*6c6ea78aSAmit Cohen	ip route add $host2_ip/128 vrf vrf-green nexthop via $vtep_ip \
489*6c6ea78aSAmit Cohen		dev vlan4001 onlink
490*6c6ea78aSAmit Cohen}
491*6c6ea78aSAmit Cohenexport -f __l3_vni_init
492*6c6ea78aSAmit Cohen
493*6c6ea78aSAmit Cohenl3_vni_init()
494*6c6ea78aSAmit Cohen{
495*6c6ea78aSAmit Cohen	local vlan4001_ns_mac=$(in_ns ns1 mac_get vlan4001)
496*6c6ea78aSAmit Cohen	local vlan4001_mac=$(mac_get vlan4001)
497*6c6ea78aSAmit Cohen
498*6c6ea78aSAmit Cohen	__l3_vni_init $vlan4001_ns_mac 2001:db8:3::2 2001:db8:1::4 \
499*6c6ea78aSAmit Cohen		2001:db8:2::4
500*6c6ea78aSAmit Cohen	in_ns ns1 __l3_vni_init $vlan4001_mac 2001:db8:3::1 2001:db8:1::1 \
501*6c6ea78aSAmit Cohen		2001:db8:2::1
502*6c6ea78aSAmit Cohen}
503*6c6ea78aSAmit Cohen
504*6c6ea78aSAmit Cohensetup_prepare()
505*6c6ea78aSAmit Cohen{
506*6c6ea78aSAmit Cohen	h1=${NETIFS[p1]}
507*6c6ea78aSAmit Cohen	swp1=${NETIFS[p2]}
508*6c6ea78aSAmit Cohen
509*6c6ea78aSAmit Cohen	swp2=${NETIFS[p3]}
510*6c6ea78aSAmit Cohen	h2=${NETIFS[p4]}
511*6c6ea78aSAmit Cohen
512*6c6ea78aSAmit Cohen	rp1=${NETIFS[p5]}
513*6c6ea78aSAmit Cohen	rp2=${NETIFS[p6]}
514*6c6ea78aSAmit Cohen
515*6c6ea78aSAmit Cohen	vrf_prepare
516*6c6ea78aSAmit Cohen	forwarding_enable
517*6c6ea78aSAmit Cohen
518*6c6ea78aSAmit Cohen	h1_create
519*6c6ea78aSAmit Cohen	h2_create
520*6c6ea78aSAmit Cohen	switch_create
521*6c6ea78aSAmit Cohen
522*6c6ea78aSAmit Cohen	ip link add name v1 type veth peer name v2
523*6c6ea78aSAmit Cohen	spine_create
524*6c6ea78aSAmit Cohen	ns1_create
525*6c6ea78aSAmit Cohen	in_ns ns1 forwarding_enable
526*6c6ea78aSAmit Cohen
527*6c6ea78aSAmit Cohen	l2_vni_init
528*6c6ea78aSAmit Cohen	l3_vni_init
529*6c6ea78aSAmit Cohen}
530*6c6ea78aSAmit Cohen
531*6c6ea78aSAmit Cohencleanup()
532*6c6ea78aSAmit Cohen{
533*6c6ea78aSAmit Cohen	pre_cleanup
534*6c6ea78aSAmit Cohen
535*6c6ea78aSAmit Cohen	ns1_destroy
536*6c6ea78aSAmit Cohen	spine_destroy
537*6c6ea78aSAmit Cohen	ip link del dev v1
538*6c6ea78aSAmit Cohen
539*6c6ea78aSAmit Cohen	switch_destroy
540*6c6ea78aSAmit Cohen	h2_destroy
541*6c6ea78aSAmit Cohen	h1_destroy
542*6c6ea78aSAmit Cohen
543*6c6ea78aSAmit Cohen	forwarding_restore
544*6c6ea78aSAmit Cohen	vrf_cleanup
545*6c6ea78aSAmit Cohen}
546*6c6ea78aSAmit Cohen
547*6c6ea78aSAmit Cohenping_ipv6()
548*6c6ea78aSAmit Cohen{
549*6c6ea78aSAmit Cohen	ping6_test $h1 2001:db8:2::1 ": local->local vid 10->vid 20"
550*6c6ea78aSAmit Cohen	ping6_test $h1 2001:db8:1::4 ": local->remote vid 10->vid 10"
551*6c6ea78aSAmit Cohen	ping6_test $h2 2001:db8:2::4 ": local->remote vid 20->vid 20"
552*6c6ea78aSAmit Cohen	ping6_test $h1 2001:db8:2::4 ": local->remote vid 10->vid 20"
553*6c6ea78aSAmit Cohen	ping6_test $h2 2001:db8:1::4 ": local->remote vid 20->vid 10"
554*6c6ea78aSAmit Cohen}
555*6c6ea78aSAmit Cohen
556*6c6ea78aSAmit Cohentrap cleanup EXIT
557*6c6ea78aSAmit Cohen
558*6c6ea78aSAmit Cohensetup_prepare
559*6c6ea78aSAmit Cohensetup_wait
560*6c6ea78aSAmit Cohen
561*6c6ea78aSAmit Cohentests_run
562*6c6ea78aSAmit Cohen
563*6c6ea78aSAmit Cohenexit $EXIT_STATUS
564