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