1*3ed61b89SJustin Iurman#!/bin/bash
2*3ed61b89SJustin Iurman# SPDX-License-Identifier: GPL-2.0+
3*3ed61b89SJustin Iurman#
4*3ed61b89SJustin Iurman# Author: Justin Iurman <[email protected]>
5*3ed61b89SJustin Iurman#
6*3ed61b89SJustin Iurman# WARNING
7*3ed61b89SJustin Iurman# -------
8*3ed61b89SJustin Iurman# This is just a dummy script that triggers encap cases with possible dst cache
9*3ed61b89SJustin Iurman# reference loops in affected lwt users (see list below). Some cases are
10*3ed61b89SJustin Iurman# pathological configurations for simplicity, others are valid. Overall, we
11*3ed61b89SJustin Iurman# don't want this issue to happen, no matter what. In order to catch any
12*3ed61b89SJustin Iurman# reference loops, kmemleak MUST be used. The results alone are always blindly
13*3ed61b89SJustin Iurman# successful, don't rely on them. Note that the following tests may crash the
14*3ed61b89SJustin Iurman# kernel if the fix to prevent lwtunnel_{input|output|xmit}() reentry loops is
15*3ed61b89SJustin Iurman# not present.
16*3ed61b89SJustin Iurman#
17*3ed61b89SJustin Iurman# Affected lwt users so far (please update accordingly if needed):
18*3ed61b89SJustin Iurman#  - ila_lwt (output only)
19*3ed61b89SJustin Iurman#  - ioam6_iptunnel (output only)
20*3ed61b89SJustin Iurman#  - rpl_iptunnel (both input and output)
21*3ed61b89SJustin Iurman#  - seg6_iptunnel (both input and output)
22*3ed61b89SJustin Iurman
23*3ed61b89SJustin Iurmansource lib.sh
24*3ed61b89SJustin Iurman
25*3ed61b89SJustin Iurmancheck_compatibility()
26*3ed61b89SJustin Iurman{
27*3ed61b89SJustin Iurman	setup_ns tmp_node &>/dev/null
28*3ed61b89SJustin Iurman	if [ $? != 0 ]; then
29*3ed61b89SJustin Iurman		echo "SKIP: Cannot create netns."
30*3ed61b89SJustin Iurman		exit $ksft_skip
31*3ed61b89SJustin Iurman	fi
32*3ed61b89SJustin Iurman
33*3ed61b89SJustin Iurman	ip link add name veth0 netns $tmp_node type veth \
34*3ed61b89SJustin Iurman		peer name veth1 netns $tmp_node &>/dev/null
35*3ed61b89SJustin Iurman	local ret=$?
36*3ed61b89SJustin Iurman
37*3ed61b89SJustin Iurman	ip -netns $tmp_node link set veth0 up &>/dev/null
38*3ed61b89SJustin Iurman	ret=$((ret + $?))
39*3ed61b89SJustin Iurman
40*3ed61b89SJustin Iurman	ip -netns $tmp_node link set veth1 up &>/dev/null
41*3ed61b89SJustin Iurman	ret=$((ret + $?))
42*3ed61b89SJustin Iurman
43*3ed61b89SJustin Iurman	if [ $ret != 0 ]; then
44*3ed61b89SJustin Iurman		echo "SKIP: Cannot configure links."
45*3ed61b89SJustin Iurman		cleanup_ns $tmp_node
46*3ed61b89SJustin Iurman		exit $ksft_skip
47*3ed61b89SJustin Iurman	fi
48*3ed61b89SJustin Iurman
49*3ed61b89SJustin Iurman	lsmod 2>/dev/null | grep -q "ila"
50*3ed61b89SJustin Iurman	ila_lsmod=$?
51*3ed61b89SJustin Iurman	[ $ila_lsmod != 0 ] && modprobe ila &>/dev/null
52*3ed61b89SJustin Iurman
53*3ed61b89SJustin Iurman	ip -netns $tmp_node route add 2001:db8:1::/64 \
54*3ed61b89SJustin Iurman		encap ila 1:2:3:4 csum-mode no-action ident-type luid \
55*3ed61b89SJustin Iurman			hook-type output \
56*3ed61b89SJustin Iurman		dev veth0 &>/dev/null
57*3ed61b89SJustin Iurman
58*3ed61b89SJustin Iurman	ip -netns $tmp_node route add 2001:db8:2::/64 \
59*3ed61b89SJustin Iurman		encap ioam6 trace prealloc type 0x800000 ns 0 size 4 \
60*3ed61b89SJustin Iurman		dev veth0 &>/dev/null
61*3ed61b89SJustin Iurman
62*3ed61b89SJustin Iurman	ip -netns $tmp_node route add 2001:db8:3::/64 \
63*3ed61b89SJustin Iurman		encap rpl segs 2001:db8:3::1 dev veth0 &>/dev/null
64*3ed61b89SJustin Iurman
65*3ed61b89SJustin Iurman	ip -netns $tmp_node route add 2001:db8:4::/64 \
66*3ed61b89SJustin Iurman		encap seg6 mode inline segs 2001:db8:4::1 dev veth0 &>/dev/null
67*3ed61b89SJustin Iurman
68*3ed61b89SJustin Iurman	ip -netns $tmp_node -6 route 2>/dev/null | grep -q "encap ila"
69*3ed61b89SJustin Iurman	skip_ila=$?
70*3ed61b89SJustin Iurman
71*3ed61b89SJustin Iurman	ip -netns $tmp_node -6 route 2>/dev/null | grep -q "encap ioam6"
72*3ed61b89SJustin Iurman	skip_ioam6=$?
73*3ed61b89SJustin Iurman
74*3ed61b89SJustin Iurman	ip -netns $tmp_node -6 route 2>/dev/null | grep -q "encap rpl"
75*3ed61b89SJustin Iurman	skip_rpl=$?
76*3ed61b89SJustin Iurman
77*3ed61b89SJustin Iurman	ip -netns $tmp_node -6 route 2>/dev/null | grep -q "encap seg6"
78*3ed61b89SJustin Iurman	skip_seg6=$?
79*3ed61b89SJustin Iurman
80*3ed61b89SJustin Iurman	cleanup_ns $tmp_node
81*3ed61b89SJustin Iurman}
82*3ed61b89SJustin Iurman
83*3ed61b89SJustin Iurmansetup()
84*3ed61b89SJustin Iurman{
85*3ed61b89SJustin Iurman	setup_ns alpha beta gamma &>/dev/null
86*3ed61b89SJustin Iurman
87*3ed61b89SJustin Iurman	ip link add name veth-alpha netns $alpha type veth \
88*3ed61b89SJustin Iurman		peer name veth-betaL netns $beta &>/dev/null
89*3ed61b89SJustin Iurman
90*3ed61b89SJustin Iurman	ip link add name veth-betaR netns $beta type veth \
91*3ed61b89SJustin Iurman		peer name veth-gamma netns $gamma &>/dev/null
92*3ed61b89SJustin Iurman
93*3ed61b89SJustin Iurman	ip -netns $alpha link set veth-alpha name veth0 &>/dev/null
94*3ed61b89SJustin Iurman	ip -netns $beta link set veth-betaL name veth0 &>/dev/null
95*3ed61b89SJustin Iurman	ip -netns $beta link set veth-betaR name veth1 &>/dev/null
96*3ed61b89SJustin Iurman	ip -netns $gamma link set veth-gamma name veth0 &>/dev/null
97*3ed61b89SJustin Iurman
98*3ed61b89SJustin Iurman	ip -netns $alpha addr add 2001:db8:1::2/64 dev veth0 &>/dev/null
99*3ed61b89SJustin Iurman	ip -netns $alpha link set veth0 up &>/dev/null
100*3ed61b89SJustin Iurman	ip -netns $alpha link set lo up &>/dev/null
101*3ed61b89SJustin Iurman	ip -netns $alpha route add 2001:db8:2::/64 \
102*3ed61b89SJustin Iurman		via 2001:db8:1::1 dev veth0 &>/dev/null
103*3ed61b89SJustin Iurman
104*3ed61b89SJustin Iurman	ip -netns $beta addr add 2001:db8:1::1/64 dev veth0 &>/dev/null
105*3ed61b89SJustin Iurman	ip -netns $beta addr add 2001:db8:2::1/64 dev veth1 &>/dev/null
106*3ed61b89SJustin Iurman	ip -netns $beta link set veth0 up &>/dev/null
107*3ed61b89SJustin Iurman	ip -netns $beta link set veth1 up &>/dev/null
108*3ed61b89SJustin Iurman	ip -netns $beta link set lo up &>/dev/null
109*3ed61b89SJustin Iurman	ip -netns $beta route del 2001:db8:2::/64
110*3ed61b89SJustin Iurman	ip -netns $beta route add 2001:db8:2::/64 dev veth1
111*3ed61b89SJustin Iurman	ip netns exec $beta \
112*3ed61b89SJustin Iurman		sysctl -wq net.ipv6.conf.all.forwarding=1 &>/dev/null
113*3ed61b89SJustin Iurman
114*3ed61b89SJustin Iurman	ip -netns $gamma addr add 2001:db8:2::2/64 dev veth0 &>/dev/null
115*3ed61b89SJustin Iurman	ip -netns $gamma link set veth0 up &>/dev/null
116*3ed61b89SJustin Iurman	ip -netns $gamma link set lo up &>/dev/null
117*3ed61b89SJustin Iurman	ip -netns $gamma route add 2001:db8:1::/64 \
118*3ed61b89SJustin Iurman		via 2001:db8:2::1 dev veth0 &>/dev/null
119*3ed61b89SJustin Iurman
120*3ed61b89SJustin Iurman	sleep 1
121*3ed61b89SJustin Iurman
122*3ed61b89SJustin Iurman	ip netns exec $alpha ping6 -c 5 -W 1 2001:db8:2::2 &>/dev/null
123*3ed61b89SJustin Iurman	if [ $? != 0 ]; then
124*3ed61b89SJustin Iurman		echo "SKIP: Setup failed."
125*3ed61b89SJustin Iurman		exit $ksft_skip
126*3ed61b89SJustin Iurman	fi
127*3ed61b89SJustin Iurman
128*3ed61b89SJustin Iurman	sleep 1
129*3ed61b89SJustin Iurman}
130*3ed61b89SJustin Iurman
131*3ed61b89SJustin Iurmancleanup()
132*3ed61b89SJustin Iurman{
133*3ed61b89SJustin Iurman	cleanup_ns $alpha $beta $gamma
134*3ed61b89SJustin Iurman	[ $ila_lsmod != 0 ] && modprobe -r ila &>/dev/null
135*3ed61b89SJustin Iurman}
136*3ed61b89SJustin Iurman
137*3ed61b89SJustin Iurmanrun_ila()
138*3ed61b89SJustin Iurman{
139*3ed61b89SJustin Iurman	if [ $skip_ila != 0 ]; then
140*3ed61b89SJustin Iurman		echo "SKIP: ila (output)"
141*3ed61b89SJustin Iurman		return
142*3ed61b89SJustin Iurman	fi
143*3ed61b89SJustin Iurman
144*3ed61b89SJustin Iurman	ip -netns $beta route del 2001:db8:2::/64
145*3ed61b89SJustin Iurman	ip -netns $beta route add 2001:db8:2:0:0:0:0:2/128 \
146*3ed61b89SJustin Iurman		encap ila 2001:db8:2:0 csum-mode no-action ident-type luid \
147*3ed61b89SJustin Iurman			hook-type output \
148*3ed61b89SJustin Iurman		dev veth1 &>/dev/null
149*3ed61b89SJustin Iurman	sleep 1
150*3ed61b89SJustin Iurman
151*3ed61b89SJustin Iurman	echo "TEST: ila (output)"
152*3ed61b89SJustin Iurman	ip netns exec $beta ping6 -c 2 -W 1 2001:db8:2::2 &>/dev/null
153*3ed61b89SJustin Iurman	sleep 1
154*3ed61b89SJustin Iurman
155*3ed61b89SJustin Iurman	ip -netns $beta route del 2001:db8:2:0:0:0:0:2/128
156*3ed61b89SJustin Iurman	ip -netns $beta route add 2001:db8:2::/64 dev veth1
157*3ed61b89SJustin Iurman	sleep 1
158*3ed61b89SJustin Iurman}
159*3ed61b89SJustin Iurman
160*3ed61b89SJustin Iurmanrun_ioam6()
161*3ed61b89SJustin Iurman{
162*3ed61b89SJustin Iurman	if [ $skip_ioam6 != 0 ]; then
163*3ed61b89SJustin Iurman		echo "SKIP: ioam6 (output)"
164*3ed61b89SJustin Iurman		return
165*3ed61b89SJustin Iurman	fi
166*3ed61b89SJustin Iurman
167*3ed61b89SJustin Iurman	ip -netns $beta route change 2001:db8:2::/64 \
168*3ed61b89SJustin Iurman		encap ioam6 trace prealloc type 0x800000 ns 1 size 4 \
169*3ed61b89SJustin Iurman		dev veth1 &>/dev/null
170*3ed61b89SJustin Iurman	sleep 1
171*3ed61b89SJustin Iurman
172*3ed61b89SJustin Iurman	echo "TEST: ioam6 (output)"
173*3ed61b89SJustin Iurman	ip netns exec $beta ping6 -c 2 -W 1 2001:db8:2::2 &>/dev/null
174*3ed61b89SJustin Iurman	sleep 1
175*3ed61b89SJustin Iurman}
176*3ed61b89SJustin Iurman
177*3ed61b89SJustin Iurmanrun_rpl()
178*3ed61b89SJustin Iurman{
179*3ed61b89SJustin Iurman	if [ $skip_rpl != 0 ]; then
180*3ed61b89SJustin Iurman		echo "SKIP: rpl (input)"
181*3ed61b89SJustin Iurman		echo "SKIP: rpl (output)"
182*3ed61b89SJustin Iurman		return
183*3ed61b89SJustin Iurman	fi
184*3ed61b89SJustin Iurman
185*3ed61b89SJustin Iurman	ip -netns $beta route change 2001:db8:2::/64 \
186*3ed61b89SJustin Iurman		encap rpl segs 2001:db8:2::2 \
187*3ed61b89SJustin Iurman		dev veth1 &>/dev/null
188*3ed61b89SJustin Iurman	sleep 1
189*3ed61b89SJustin Iurman
190*3ed61b89SJustin Iurman	echo "TEST: rpl (input)"
191*3ed61b89SJustin Iurman	ip netns exec $alpha ping6 -c 2 -W 1 2001:db8:2::2 &>/dev/null
192*3ed61b89SJustin Iurman	sleep 1
193*3ed61b89SJustin Iurman
194*3ed61b89SJustin Iurman	echo "TEST: rpl (output)"
195*3ed61b89SJustin Iurman	ip netns exec $beta ping6 -c 2 -W 1 2001:db8:2::2 &>/dev/null
196*3ed61b89SJustin Iurman	sleep 1
197*3ed61b89SJustin Iurman}
198*3ed61b89SJustin Iurman
199*3ed61b89SJustin Iurmanrun_seg6()
200*3ed61b89SJustin Iurman{
201*3ed61b89SJustin Iurman	if [ $skip_seg6 != 0 ]; then
202*3ed61b89SJustin Iurman		echo "SKIP: seg6 (input)"
203*3ed61b89SJustin Iurman		echo "SKIP: seg6 (output)"
204*3ed61b89SJustin Iurman		return
205*3ed61b89SJustin Iurman	fi
206*3ed61b89SJustin Iurman
207*3ed61b89SJustin Iurman	ip -netns $beta route change 2001:db8:2::/64 \
208*3ed61b89SJustin Iurman		encap seg6 mode inline segs 2001:db8:2::2 \
209*3ed61b89SJustin Iurman		dev veth1 &>/dev/null
210*3ed61b89SJustin Iurman	sleep 1
211*3ed61b89SJustin Iurman
212*3ed61b89SJustin Iurman	echo "TEST: seg6 (input)"
213*3ed61b89SJustin Iurman	ip netns exec $alpha ping6 -c 2 -W 1 2001:db8:2::2 &>/dev/null
214*3ed61b89SJustin Iurman	sleep 1
215*3ed61b89SJustin Iurman
216*3ed61b89SJustin Iurman	echo "TEST: seg6 (output)"
217*3ed61b89SJustin Iurman	ip netns exec $beta ping6 -c 2 -W 1 2001:db8:2::2 &>/dev/null
218*3ed61b89SJustin Iurman	sleep 1
219*3ed61b89SJustin Iurman}
220*3ed61b89SJustin Iurman
221*3ed61b89SJustin Iurmanrun()
222*3ed61b89SJustin Iurman{
223*3ed61b89SJustin Iurman	run_ila
224*3ed61b89SJustin Iurman	run_ioam6
225*3ed61b89SJustin Iurman	run_rpl
226*3ed61b89SJustin Iurman	run_seg6
227*3ed61b89SJustin Iurman}
228*3ed61b89SJustin Iurman
229*3ed61b89SJustin Iurmanif [ "$(id -u)" -ne 0 ]; then
230*3ed61b89SJustin Iurman	echo "SKIP: Need root privileges."
231*3ed61b89SJustin Iurman	exit $ksft_skip
232*3ed61b89SJustin Iurmanfi
233*3ed61b89SJustin Iurman
234*3ed61b89SJustin Iurmanif [ ! -x "$(command -v ip)" ]; then
235*3ed61b89SJustin Iurman	echo "SKIP: Could not run test without ip tool."
236*3ed61b89SJustin Iurman	exit $ksft_skip
237*3ed61b89SJustin Iurmanfi
238*3ed61b89SJustin Iurman
239*3ed61b89SJustin Iurmancheck_compatibility
240*3ed61b89SJustin Iurman
241*3ed61b89SJustin Iurmantrap cleanup EXIT
242*3ed61b89SJustin Iurman
243*3ed61b89SJustin Iurmansetup
244*3ed61b89SJustin Iurmanrun
245*3ed61b89SJustin Iurman
246*3ed61b89SJustin Iurmanexit $ksft_pass
247