xref: /openbmc/linux/tools/testing/selftests/net/forwarding/ipip_lib.sh (revision 597473720f4dc69749542bfcfed4a927a43d935e)
1*fed926d4SNir Dotan#!/bin/bash
2*fed926d4SNir Dotan# SPDX-License-Identifier: GPL-2.0
3*fed926d4SNir Dotan
4*fed926d4SNir Dotan# Handles creation and destruction of IP-in-IP or GRE tunnels over the given
5*fed926d4SNir Dotan# topology. Supports both flat and hierarchical models.
6*fed926d4SNir Dotan#
7*fed926d4SNir Dotan# Flat Model:
8*fed926d4SNir Dotan# Overlay and underlay share the same VRF.
9*fed926d4SNir Dotan# SW1 uses default VRF so tunnel has no bound dev.
10*fed926d4SNir Dotan# SW2 uses non-default VRF tunnel has a bound dev.
11*fed926d4SNir Dotan# +-------------------------+
12*fed926d4SNir Dotan# | H1                      |
13*fed926d4SNir Dotan# |               $h1 +     |
14*fed926d4SNir Dotan# |      192.0.2.1/28 |     |
15*fed926d4SNir Dotan# +-------------------|-----+
16*fed926d4SNir Dotan#                     |
17*fed926d4SNir Dotan# +-------------------|-----+
18*fed926d4SNir Dotan# | SW1               |     |
19*fed926d4SNir Dotan# |              $ol1 +     |
20*fed926d4SNir Dotan# |      192.0.2.2/28       |
21*fed926d4SNir Dotan# |                         |
22*fed926d4SNir Dotan# |  + g1a (gre)            |
23*fed926d4SNir Dotan# |    loc=192.0.2.65       |
24*fed926d4SNir Dotan# |    rem=192.0.2.66 --.   |
25*fed926d4SNir Dotan# |    tos=inherit      |   |
26*fed926d4SNir Dotan# |  .------------------'   |
27*fed926d4SNir Dotan# |  |                      |
28*fed926d4SNir Dotan# |  v                      |
29*fed926d4SNir Dotan# |  + $ul1.111 (vlan)      |
30*fed926d4SNir Dotan# |  | 192.0.2.129/28       |
31*fed926d4SNir Dotan# |   \                     |
32*fed926d4SNir Dotan# |    \_______             |
33*fed926d4SNir Dotan# |            |            |
34*fed926d4SNir Dotan# |VRF default + $ul1       |
35*fed926d4SNir Dotan# +------------|------------+
36*fed926d4SNir Dotan#              |
37*fed926d4SNir Dotan# +------------|------------+
38*fed926d4SNir Dotan# | SW2        + $ul2       |
39*fed926d4SNir Dotan# |     _______|            |
40*fed926d4SNir Dotan# |    /                    |
41*fed926d4SNir Dotan# |   /                     |
42*fed926d4SNir Dotan# |  + $ul2.111 (vlan)      |
43*fed926d4SNir Dotan# |  ^ 192.0.2.130/28       |
44*fed926d4SNir Dotan# |  |                      |
45*fed926d4SNir Dotan# |  |                      |
46*fed926d4SNir Dotan# |  '------------------.   |
47*fed926d4SNir Dotan# |  + g2a (gre)        |   |
48*fed926d4SNir Dotan# |    loc=192.0.2.66   |   |
49*fed926d4SNir Dotan# |    rem=192.0.2.65 --'   |
50*fed926d4SNir Dotan# |    tos=inherit          |
51*fed926d4SNir Dotan# |                         |
52*fed926d4SNir Dotan# |              $ol2 +     |
53*fed926d4SNir Dotan# |     192.0.2.17/28 |     |
54*fed926d4SNir Dotan# | VRF v$ol2         |     |
55*fed926d4SNir Dotan# +-------------------|-----+
56*fed926d4SNir Dotan#                     |
57*fed926d4SNir Dotan# +-------------------|-----+
58*fed926d4SNir Dotan# | H2                |     |
59*fed926d4SNir Dotan# |               $h2 +     |
60*fed926d4SNir Dotan# |     192.0.2.18/28       |
61*fed926d4SNir Dotan# +-------------------------+
62*fed926d4SNir Dotan#
63*fed926d4SNir Dotan# Hierarchical model:
64*fed926d4SNir Dotan# The tunnel is bound to a device in a different VRF
65*fed926d4SNir Dotan#
66*fed926d4SNir Dotan# +---------------------------+
67*fed926d4SNir Dotan# | H1                        |
68*fed926d4SNir Dotan# |               $h1 +       |
69*fed926d4SNir Dotan# |      192.0.2.1/28 |       |
70*fed926d4SNir Dotan# +-------------------|-------+
71*fed926d4SNir Dotan#                     |
72*fed926d4SNir Dotan# +-------------------|-------+
73*fed926d4SNir Dotan# | SW1               |       |
74*fed926d4SNir Dotan# | +-----------------|-----+ |
75*fed926d4SNir Dotan# | |            $ol1 +     | |
76*fed926d4SNir Dotan# | |     192.0.2.2/28      | |
77*fed926d4SNir Dotan# | |                       | |
78*fed926d4SNir Dotan# | |    + g1a (gre)        | |
79*fed926d4SNir Dotan# | |    rem=192.0.2.66     | |
80*fed926d4SNir Dotan# | |    tos=inherit        | |
81*fed926d4SNir Dotan# | |    loc=192.0.2.65     | |
82*fed926d4SNir Dotan# | |           ^           | |
83*fed926d4SNir Dotan# | | VRF v$ol1 |           | |
84*fed926d4SNir Dotan# | +-----------|-----------+ |
85*fed926d4SNir Dotan# |             |             |
86*fed926d4SNir Dotan# | +-----------|-----------+ |
87*fed926d4SNir Dotan# | | VRF v$ul1 |           | |
88*fed926d4SNir Dotan# | |           |           | |
89*fed926d4SNir Dotan# | |           |           | |
90*fed926d4SNir Dotan# | |           v           | |
91*fed926d4SNir Dotan# | |    dummy1 +           | |
92*fed926d4SNir Dotan# | |   192.0.2.65          | |
93*fed926d4SNir Dotan# | |   .-------'           | |
94*fed926d4SNir Dotan# | |   |                   | |
95*fed926d4SNir Dotan# | |   v                   | |
96*fed926d4SNir Dotan# | |   + $ul1.111 (vlan)   | |
97*fed926d4SNir Dotan# | |   | 192.0.2.129/28    | |
98*fed926d4SNir Dotan# | |   \                   | |
99*fed926d4SNir Dotan# | |    \_____             | |
100*fed926d4SNir Dotan# | |          |            | |
101*fed926d4SNir Dotan# | |          + $ul1       | |
102*fed926d4SNir Dotan# | +----------|------------+ |
103*fed926d4SNir Dotan# +------------|--------------+
104*fed926d4SNir Dotan#              |
105*fed926d4SNir Dotan# +------------|--------------+
106*fed926d4SNir Dotan# | SW2        |              |
107*fed926d4SNir Dotan# | +----------|------------+ |
108*fed926d4SNir Dotan# | |          + $ul2       | |
109*fed926d4SNir Dotan# | |     _____|            | |
110*fed926d4SNir Dotan# | |    /                  | |
111*fed926d4SNir Dotan# | |   /                   | |
112*fed926d4SNir Dotan# | |   | $ul2.111 (vlan)   | |
113*fed926d4SNir Dotan# | |   + 192.0.2.130/28    | |
114*fed926d4SNir Dotan# | |   ^                   | |
115*fed926d4SNir Dotan# | |   |                   | |
116*fed926d4SNir Dotan# | |   '-------.           | |
117*fed926d4SNir Dotan# | |    dummy2 +           | |
118*fed926d4SNir Dotan# | |    192.0.2.66         | |
119*fed926d4SNir Dotan# | |           ^           | |
120*fed926d4SNir Dotan# | |           |           | |
121*fed926d4SNir Dotan# | |           |           | |
122*fed926d4SNir Dotan# | | VRF v$ul2 |           | |
123*fed926d4SNir Dotan# | +-----------|-----------+ |
124*fed926d4SNir Dotan# |             |             |
125*fed926d4SNir Dotan# | +-----------|-----------+ |
126*fed926d4SNir Dotan# | | VRF v$ol2 |           | |
127*fed926d4SNir Dotan# | |           |           | |
128*fed926d4SNir Dotan# | |           v           | |
129*fed926d4SNir Dotan# | |  g2a (gre)+           | |
130*fed926d4SNir Dotan# | |  loc=192.0.2.66       | |
131*fed926d4SNir Dotan# | |  rem=192.0.2.65       | |
132*fed926d4SNir Dotan# | |  tos=inherit          | |
133*fed926d4SNir Dotan# | |                       | |
134*fed926d4SNir Dotan# | |            $ol2 +     | |
135*fed926d4SNir Dotan# | |   192.0.2.17/28 |     | |
136*fed926d4SNir Dotan# | +-----------------|-----+ |
137*fed926d4SNir Dotan# +-------------------|-------+
138*fed926d4SNir Dotan#                     |
139*fed926d4SNir Dotan# +-------------------|-------+
140*fed926d4SNir Dotan# | H2                |       |
141*fed926d4SNir Dotan# |               $h2 +       |
142*fed926d4SNir Dotan# |     192.0.2.18/28         |
143*fed926d4SNir Dotan# +---------------------------+
144*fed926d4SNir Dotansource lib.sh
145*fed926d4SNir Dotan
146*fed926d4SNir Dotanh1_create()
147*fed926d4SNir Dotan{
148*fed926d4SNir Dotan	simple_if_init $h1 192.0.2.1/28 2001:db8:1::1/64
149*fed926d4SNir Dotan	ip route add vrf v$h1 192.0.2.16/28 via 192.0.2.2
150*fed926d4SNir Dotan}
151*fed926d4SNir Dotan
152*fed926d4SNir Dotanh1_destroy()
153*fed926d4SNir Dotan{
154*fed926d4SNir Dotan	ip route del vrf v$h1 192.0.2.16/28 via 192.0.2.2
155*fed926d4SNir Dotan	simple_if_fini $h1 192.0.2.1/28
156*fed926d4SNir Dotan}
157*fed926d4SNir Dotan
158*fed926d4SNir Dotanh2_create()
159*fed926d4SNir Dotan{
160*fed926d4SNir Dotan	simple_if_init $h2 192.0.2.18/28
161*fed926d4SNir Dotan	ip route add vrf v$h2 192.0.2.0/28 via 192.0.2.17
162*fed926d4SNir Dotan}
163*fed926d4SNir Dotan
164*fed926d4SNir Dotanh2_destroy()
165*fed926d4SNir Dotan{
166*fed926d4SNir Dotan	ip route del vrf v$h2 192.0.2.0/28 via 192.0.2.17
167*fed926d4SNir Dotan	simple_if_fini $h2 192.0.2.18/28
168*fed926d4SNir Dotan}
169*fed926d4SNir Dotan
170*fed926d4SNir Dotansw1_flat_create()
171*fed926d4SNir Dotan{
172*fed926d4SNir Dotan	local type=$1; shift
173*fed926d4SNir Dotan	local ol1=$1; shift
174*fed926d4SNir Dotan	local ul1=$1; shift
175*fed926d4SNir Dotan
176*fed926d4SNir Dotan	ip link set dev $ol1 up
177*fed926d4SNir Dotan        __addr_add_del $ol1 add "192.0.2.2/28"
178*fed926d4SNir Dotan
179*fed926d4SNir Dotan	ip link set dev $ul1 up
180*fed926d4SNir Dotan	vlan_create $ul1 111 "" 192.0.2.129/28
181*fed926d4SNir Dotan
182*fed926d4SNir Dotan	tunnel_create g1a $type 192.0.2.65 192.0.2.66 tos inherit "$@"
183*fed926d4SNir Dotan	ip link set dev g1a up
184*fed926d4SNir Dotan        __addr_add_del g1a add "192.0.2.65/32"
185*fed926d4SNir Dotan
186*fed926d4SNir Dotan	ip route add 192.0.2.66/32 via 192.0.2.130
187*fed926d4SNir Dotan
188*fed926d4SNir Dotan	ip route add 192.0.2.16/28 nexthop dev g1a
189*fed926d4SNir Dotan}
190*fed926d4SNir Dotan
191*fed926d4SNir Dotansw1_flat_destroy()
192*fed926d4SNir Dotan{
193*fed926d4SNir Dotan	local ol1=$1; shift
194*fed926d4SNir Dotan	local ul1=$1; shift
195*fed926d4SNir Dotan
196*fed926d4SNir Dotan	ip route del 192.0.2.16/28
197*fed926d4SNir Dotan
198*fed926d4SNir Dotan	ip route del 192.0.2.66/32 via 192.0.2.130
199*fed926d4SNir Dotan	__simple_if_fini g1a 192.0.2.65/32
200*fed926d4SNir Dotan	tunnel_destroy g1a
201*fed926d4SNir Dotan
202*fed926d4SNir Dotan	vlan_destroy $ul1 111
203*fed926d4SNir Dotan	__simple_if_fini $ul1
204*fed926d4SNir Dotan	__simple_if_fini $ol1 192.0.2.2/28
205*fed926d4SNir Dotan}
206*fed926d4SNir Dotan
207*fed926d4SNir Dotansw2_flat_create()
208*fed926d4SNir Dotan{
209*fed926d4SNir Dotan	local type=$1; shift
210*fed926d4SNir Dotan	local ol2=$1; shift
211*fed926d4SNir Dotan	local ul2=$1; shift
212*fed926d4SNir Dotan
213*fed926d4SNir Dotan	simple_if_init $ol2 192.0.2.17/28
214*fed926d4SNir Dotan	__simple_if_init $ul2 v$ol2
215*fed926d4SNir Dotan	vlan_create $ul2 111 v$ol2 192.0.2.130/28
216*fed926d4SNir Dotan
217*fed926d4SNir Dotan	tunnel_create g2a $type 192.0.2.66 192.0.2.65 tos inherit dev v$ol2 \
218*fed926d4SNir Dotan		"$@"
219*fed926d4SNir Dotan	__simple_if_init g2a v$ol2 192.0.2.66/32
220*fed926d4SNir Dotan
221*fed926d4SNir Dotan	ip route add vrf v$ol2 192.0.2.65/32 via 192.0.2.129
222*fed926d4SNir Dotan	ip route add vrf v$ol2 192.0.2.0/28 nexthop dev g2a
223*fed926d4SNir Dotan}
224*fed926d4SNir Dotan
225*fed926d4SNir Dotansw2_flat_destroy()
226*fed926d4SNir Dotan{
227*fed926d4SNir Dotan	local ol2=$1; shift
228*fed926d4SNir Dotan	local ul2=$1; shift
229*fed926d4SNir Dotan
230*fed926d4SNir Dotan	ip route del vrf v$ol2 192.0.2.0/28
231*fed926d4SNir Dotan
232*fed926d4SNir Dotan	ip route del vrf v$ol2 192.0.2.65/32 via 192.0.2.129
233*fed926d4SNir Dotan	__simple_if_fini g2a 192.0.2.66/32
234*fed926d4SNir Dotan	tunnel_destroy g2a
235*fed926d4SNir Dotan
236*fed926d4SNir Dotan	vlan_destroy $ul2 111
237*fed926d4SNir Dotan	__simple_if_fini $ul2
238*fed926d4SNir Dotan	simple_if_fini $ol2 192.0.2.17/28
239*fed926d4SNir Dotan}
240*fed926d4SNir Dotan
241*fed926d4SNir Dotansw1_hierarchical_create()
242*fed926d4SNir Dotan{
243*fed926d4SNir Dotan	local type=$1; shift
244*fed926d4SNir Dotan	local ol1=$1; shift
245*fed926d4SNir Dotan	local ul1=$1; shift
246*fed926d4SNir Dotan
247*fed926d4SNir Dotan	simple_if_init $ol1 192.0.2.2/28
248*fed926d4SNir Dotan	simple_if_init $ul1
249*fed926d4SNir Dotan	ip link add name dummy1 type dummy
250*fed926d4SNir Dotan	__simple_if_init dummy1 v$ul1 192.0.2.65/32
251*fed926d4SNir Dotan
252*fed926d4SNir Dotan	vlan_create $ul1 111 v$ul1 192.0.2.129/28
253*fed926d4SNir Dotan	tunnel_create g1a $type 192.0.2.65 192.0.2.66 tos inherit dev dummy1 \
254*fed926d4SNir Dotan		"$@"
255*fed926d4SNir Dotan	ip link set dev g1a master v$ol1
256*fed926d4SNir Dotan
257*fed926d4SNir Dotan	ip route add vrf v$ul1 192.0.2.66/32 via 192.0.2.130
258*fed926d4SNir Dotan	ip route add vrf v$ol1 192.0.2.16/28 nexthop dev g1a
259*fed926d4SNir Dotan}
260*fed926d4SNir Dotan
261*fed926d4SNir Dotansw1_hierarchical_destroy()
262*fed926d4SNir Dotan{
263*fed926d4SNir Dotan	local ol1=$1; shift
264*fed926d4SNir Dotan	local ul1=$1; shift
265*fed926d4SNir Dotan
266*fed926d4SNir Dotan	ip route del vrf v$ol1 192.0.2.16/28
267*fed926d4SNir Dotan	ip route del vrf v$ul1 192.0.2.66/32
268*fed926d4SNir Dotan
269*fed926d4SNir Dotan	tunnel_destroy g1a
270*fed926d4SNir Dotan	vlan_destroy $ul1 111
271*fed926d4SNir Dotan
272*fed926d4SNir Dotan	__simple_if_fini dummy1 192.0.2.65/32
273*fed926d4SNir Dotan	ip link del dev dummy1
274*fed926d4SNir Dotan
275*fed926d4SNir Dotan	simple_if_fini $ul1
276*fed926d4SNir Dotan	simple_if_fini $ol1 192.0.2.2/28
277*fed926d4SNir Dotan}
278*fed926d4SNir Dotan
279*fed926d4SNir Dotansw2_hierarchical_create()
280*fed926d4SNir Dotan{
281*fed926d4SNir Dotan	local type=$1; shift
282*fed926d4SNir Dotan	local ol2=$1; shift
283*fed926d4SNir Dotan	local ul2=$1; shift
284*fed926d4SNir Dotan
285*fed926d4SNir Dotan	simple_if_init $ol2 192.0.2.17/28
286*fed926d4SNir Dotan	simple_if_init $ul2
287*fed926d4SNir Dotan
288*fed926d4SNir Dotan	ip link add name dummy2 type dummy
289*fed926d4SNir Dotan	__simple_if_init dummy2 v$ul2 192.0.2.66/32
290*fed926d4SNir Dotan
291*fed926d4SNir Dotan	vlan_create $ul2 111 v$ul2 192.0.2.130/28
292*fed926d4SNir Dotan	tunnel_create g2a $type 192.0.2.66 192.0.2.65 tos inherit dev dummy2 \
293*fed926d4SNir Dotan		"$@"
294*fed926d4SNir Dotan	ip link set dev g2a master v$ol2
295*fed926d4SNir Dotan
296*fed926d4SNir Dotan	ip route add vrf v$ul2 192.0.2.65/32 via 192.0.2.129
297*fed926d4SNir Dotan	ip route add vrf v$ol2 192.0.2.0/28 nexthop dev g2a
298*fed926d4SNir Dotan}
299*fed926d4SNir Dotan
300*fed926d4SNir Dotansw2_hierarchical_destroy()
301*fed926d4SNir Dotan{
302*fed926d4SNir Dotan	local ol2=$1; shift
303*fed926d4SNir Dotan	local ul2=$1; shift
304*fed926d4SNir Dotan
305*fed926d4SNir Dotan	ip route del vrf v$ol2 192.0.2.0/28
306*fed926d4SNir Dotan	ip route del vrf v$ul2 192.0.2.65/32
307*fed926d4SNir Dotan
308*fed926d4SNir Dotan	tunnel_destroy g2a
309*fed926d4SNir Dotan	vlan_destroy $ul2 111
310*fed926d4SNir Dotan
311*fed926d4SNir Dotan	__simple_if_fini dummy2 192.0.2.66/32
312*fed926d4SNir Dotan	ip link del dev dummy2
313*fed926d4SNir Dotan
314*fed926d4SNir Dotan	simple_if_fini $ul2
315*fed926d4SNir Dotan	simple_if_fini $ol2 192.0.2.17/28
316*fed926d4SNir Dotan}
317*fed926d4SNir Dotan
318*fed926d4SNir Dotantopo_mtu_change()
319*fed926d4SNir Dotan{
320*fed926d4SNir Dotan	local mtu=$1
321*fed926d4SNir Dotan
322*fed926d4SNir Dotan	ip link set mtu $mtu dev $h1
323*fed926d4SNir Dotan	ip link set mtu $mtu dev $ol1
324*fed926d4SNir Dotan	ip link set mtu $mtu dev g1a
325*fed926d4SNir Dotan	ip link set mtu $mtu dev $ul1
326*fed926d4SNir Dotan	ip link set mtu $mtu dev $ul1.111
327*fed926d4SNir Dotan	ip link set mtu $mtu dev $h2
328*fed926d4SNir Dotan	ip link set mtu $mtu dev $ol2
329*fed926d4SNir Dotan	ip link set mtu $mtu dev g2a
330*fed926d4SNir Dotan	ip link set mtu $mtu dev $ul2
331*fed926d4SNir Dotan	ip link set mtu $mtu dev $ul2.111
332*fed926d4SNir Dotan}
333*fed926d4SNir Dotan
334*fed926d4SNir Dotantest_mtu_change()
335*fed926d4SNir Dotan{
336*fed926d4SNir Dotan	local encap=$1; shift
337*fed926d4SNir Dotan
338*fed926d4SNir Dotan	RET=0
339*fed926d4SNir Dotan
340*fed926d4SNir Dotan	ping_do $h1 192.0.2.18 "-s 1800	-w 3"
341*fed926d4SNir Dotan	check_fail $? "ping $encap should not pass with size 1800"
342*fed926d4SNir Dotan
343*fed926d4SNir Dotan	RET=0
344*fed926d4SNir Dotan
345*fed926d4SNir Dotan	topo_mtu_change	2000
346*fed926d4SNir Dotan	ping_do	$h1 192.0.2.18 "-s 1800	-w 3"
347*fed926d4SNir Dotan	check_err $?
348*fed926d4SNir Dotan	log_test "ping $encap packet size 1800 after MTU change"
349*fed926d4SNir Dotan}
350