xref: /OK3568_Linux_fs/kernel/tools/testing/selftests/bpf/test_tunnel.sh (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/bin/bash
2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0
3*4882a593Smuzhiyun
4*4882a593Smuzhiyun# End-to-end eBPF tunnel test suite
5*4882a593Smuzhiyun#   The script tests BPF network tunnel implementation.
6*4882a593Smuzhiyun#
7*4882a593Smuzhiyun# Topology:
8*4882a593Smuzhiyun# ---------
9*4882a593Smuzhiyun#     root namespace   |     at_ns0 namespace
10*4882a593Smuzhiyun#                      |
11*4882a593Smuzhiyun#      -----------     |     -----------
12*4882a593Smuzhiyun#      | tnl dev |     |     | tnl dev |  (overlay network)
13*4882a593Smuzhiyun#      -----------     |     -----------
14*4882a593Smuzhiyun#      metadata-mode   |     native-mode
15*4882a593Smuzhiyun#       with bpf       |
16*4882a593Smuzhiyun#                      |
17*4882a593Smuzhiyun#      ----------      |     ----------
18*4882a593Smuzhiyun#      |  veth1  | --------- |  veth0  |  (underlay network)
19*4882a593Smuzhiyun#      ----------    peer    ----------
20*4882a593Smuzhiyun#
21*4882a593Smuzhiyun#
22*4882a593Smuzhiyun# Device Configuration
23*4882a593Smuzhiyun# --------------------
24*4882a593Smuzhiyun# Root namespace with metadata-mode tunnel + BPF
25*4882a593Smuzhiyun# Device names and addresses:
26*4882a593Smuzhiyun# 	veth1 IP: 172.16.1.200, IPv6: 00::22 (underlay)
27*4882a593Smuzhiyun# 	tunnel dev <type>11, ex: gre11, IPv4: 10.1.1.200, IPv6: 1::22 (overlay)
28*4882a593Smuzhiyun#
29*4882a593Smuzhiyun# Namespace at_ns0 with native tunnel
30*4882a593Smuzhiyun# Device names and addresses:
31*4882a593Smuzhiyun# 	veth0 IPv4: 172.16.1.100, IPv6: 00::11 (underlay)
32*4882a593Smuzhiyun# 	tunnel dev <type>00, ex: gre00, IPv4: 10.1.1.100, IPv6: 1::11 (overlay)
33*4882a593Smuzhiyun#
34*4882a593Smuzhiyun#
35*4882a593Smuzhiyun# End-to-end ping packet flow
36*4882a593Smuzhiyun# ---------------------------
37*4882a593Smuzhiyun# Most of the tests start by namespace creation, device configuration,
38*4882a593Smuzhiyun# then ping the underlay and overlay network.  When doing 'ping 10.1.1.100'
39*4882a593Smuzhiyun# from root namespace, the following operations happen:
40*4882a593Smuzhiyun# 1) Route lookup shows 10.1.1.100/24 belongs to tnl dev, fwd to tnl dev.
41*4882a593Smuzhiyun# 2) Tnl device's egress BPF program is triggered and set the tunnel metadata,
42*4882a593Smuzhiyun#    with remote_ip=172.16.1.200 and others.
43*4882a593Smuzhiyun# 3) Outer tunnel header is prepended and route the packet to veth1's egress
44*4882a593Smuzhiyun# 4) veth0's ingress queue receive the tunneled packet at namespace at_ns0
45*4882a593Smuzhiyun# 5) Tunnel protocol handler, ex: vxlan_rcv, decap the packet
46*4882a593Smuzhiyun# 6) Forward the packet to the overlay tnl dev
47*4882a593Smuzhiyun
48*4882a593SmuzhiyunPING_ARG="-c 3 -w 10 -q"
49*4882a593Smuzhiyunret=0
50*4882a593SmuzhiyunGREEN='\033[0;92m'
51*4882a593SmuzhiyunRED='\033[0;31m'
52*4882a593SmuzhiyunNC='\033[0m' # No Color
53*4882a593Smuzhiyun
54*4882a593Smuzhiyunconfig_device()
55*4882a593Smuzhiyun{
56*4882a593Smuzhiyun	ip netns add at_ns0
57*4882a593Smuzhiyun	ip link add veth0 type veth peer name veth1
58*4882a593Smuzhiyun	ip link set veth0 netns at_ns0
59*4882a593Smuzhiyun	ip netns exec at_ns0 ip addr add 172.16.1.100/24 dev veth0
60*4882a593Smuzhiyun	ip netns exec at_ns0 ip link set dev veth0 up
61*4882a593Smuzhiyun	ip link set dev veth1 up mtu 1500
62*4882a593Smuzhiyun	ip addr add dev veth1 172.16.1.200/24
63*4882a593Smuzhiyun}
64*4882a593Smuzhiyun
65*4882a593Smuzhiyunadd_gre_tunnel()
66*4882a593Smuzhiyun{
67*4882a593Smuzhiyun	# at_ns0 namespace
68*4882a593Smuzhiyun	ip netns exec at_ns0 \
69*4882a593Smuzhiyun        ip link add dev $DEV_NS type $TYPE seq key 2 \
70*4882a593Smuzhiyun		local 172.16.1.100 remote 172.16.1.200
71*4882a593Smuzhiyun	ip netns exec at_ns0 ip link set dev $DEV_NS up
72*4882a593Smuzhiyun	ip netns exec at_ns0 ip addr add dev $DEV_NS 10.1.1.100/24
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun	# root namespace
75*4882a593Smuzhiyun	ip link add dev $DEV type $TYPE key 2 external
76*4882a593Smuzhiyun	ip link set dev $DEV up
77*4882a593Smuzhiyun	ip addr add dev $DEV 10.1.1.200/24
78*4882a593Smuzhiyun}
79*4882a593Smuzhiyun
80*4882a593Smuzhiyunadd_ip6gretap_tunnel()
81*4882a593Smuzhiyun{
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun	# assign ipv6 address
84*4882a593Smuzhiyun	ip netns exec at_ns0 ip addr add ::11/96 dev veth0
85*4882a593Smuzhiyun	ip netns exec at_ns0 ip link set dev veth0 up
86*4882a593Smuzhiyun	ip addr add dev veth1 ::22/96
87*4882a593Smuzhiyun	ip link set dev veth1 up
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun	# at_ns0 namespace
90*4882a593Smuzhiyun	ip netns exec at_ns0 \
91*4882a593Smuzhiyun		ip link add dev $DEV_NS type $TYPE seq flowlabel 0xbcdef key 2 \
92*4882a593Smuzhiyun		local ::11 remote ::22
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun	ip netns exec at_ns0 ip addr add dev $DEV_NS 10.1.1.100/24
95*4882a593Smuzhiyun	ip netns exec at_ns0 ip addr add dev $DEV_NS fc80::100/96
96*4882a593Smuzhiyun	ip netns exec at_ns0 ip link set dev $DEV_NS up
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun	# root namespace
99*4882a593Smuzhiyun	ip link add dev $DEV type $TYPE external
100*4882a593Smuzhiyun	ip addr add dev $DEV 10.1.1.200/24
101*4882a593Smuzhiyun	ip addr add dev $DEV fc80::200/24
102*4882a593Smuzhiyun	ip link set dev $DEV up
103*4882a593Smuzhiyun}
104*4882a593Smuzhiyun
105*4882a593Smuzhiyunadd_erspan_tunnel()
106*4882a593Smuzhiyun{
107*4882a593Smuzhiyun	# at_ns0 namespace
108*4882a593Smuzhiyun	if [ "$1" == "v1" ]; then
109*4882a593Smuzhiyun		ip netns exec at_ns0 \
110*4882a593Smuzhiyun		ip link add dev $DEV_NS type $TYPE seq key 2 \
111*4882a593Smuzhiyun		local 172.16.1.100 remote 172.16.1.200 \
112*4882a593Smuzhiyun		erspan_ver 1 erspan 123
113*4882a593Smuzhiyun	else
114*4882a593Smuzhiyun		ip netns exec at_ns0 \
115*4882a593Smuzhiyun		ip link add dev $DEV_NS type $TYPE seq key 2 \
116*4882a593Smuzhiyun		local 172.16.1.100 remote 172.16.1.200 \
117*4882a593Smuzhiyun		erspan_ver 2 erspan_dir egress erspan_hwid 3
118*4882a593Smuzhiyun	fi
119*4882a593Smuzhiyun	ip netns exec at_ns0 ip link set dev $DEV_NS up
120*4882a593Smuzhiyun	ip netns exec at_ns0 ip addr add dev $DEV_NS 10.1.1.100/24
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun	# root namespace
123*4882a593Smuzhiyun	ip link add dev $DEV type $TYPE external
124*4882a593Smuzhiyun	ip link set dev $DEV up
125*4882a593Smuzhiyun	ip addr add dev $DEV 10.1.1.200/24
126*4882a593Smuzhiyun}
127*4882a593Smuzhiyun
128*4882a593Smuzhiyunadd_ip6erspan_tunnel()
129*4882a593Smuzhiyun{
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun	# assign ipv6 address
132*4882a593Smuzhiyun	ip netns exec at_ns0 ip addr add ::11/96 dev veth0
133*4882a593Smuzhiyun	ip netns exec at_ns0 ip link set dev veth0 up
134*4882a593Smuzhiyun	ip addr add dev veth1 ::22/96
135*4882a593Smuzhiyun	ip link set dev veth1 up
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun	# at_ns0 namespace
138*4882a593Smuzhiyun	if [ "$1" == "v1" ]; then
139*4882a593Smuzhiyun		ip netns exec at_ns0 \
140*4882a593Smuzhiyun		ip link add dev $DEV_NS type $TYPE seq key 2 \
141*4882a593Smuzhiyun		local ::11 remote ::22 \
142*4882a593Smuzhiyun		erspan_ver 1 erspan 123
143*4882a593Smuzhiyun	else
144*4882a593Smuzhiyun		ip netns exec at_ns0 \
145*4882a593Smuzhiyun		ip link add dev $DEV_NS type $TYPE seq key 2 \
146*4882a593Smuzhiyun		local ::11 remote ::22 \
147*4882a593Smuzhiyun		erspan_ver 2 erspan_dir egress erspan_hwid 7
148*4882a593Smuzhiyun	fi
149*4882a593Smuzhiyun	ip netns exec at_ns0 ip addr add dev $DEV_NS 10.1.1.100/24
150*4882a593Smuzhiyun	ip netns exec at_ns0 ip link set dev $DEV_NS up
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun	# root namespace
153*4882a593Smuzhiyun	ip link add dev $DEV type $TYPE external
154*4882a593Smuzhiyun	ip addr add dev $DEV 10.1.1.200/24
155*4882a593Smuzhiyun	ip link set dev $DEV up
156*4882a593Smuzhiyun}
157*4882a593Smuzhiyun
158*4882a593Smuzhiyunadd_vxlan_tunnel()
159*4882a593Smuzhiyun{
160*4882a593Smuzhiyun	# Set static ARP entry here because iptables set-mark works
161*4882a593Smuzhiyun	# on L3 packet, as a result not applying to ARP packets,
162*4882a593Smuzhiyun	# causing errors at get_tunnel_{key/opt}.
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun	# at_ns0 namespace
165*4882a593Smuzhiyun	ip netns exec at_ns0 \
166*4882a593Smuzhiyun		ip link add dev $DEV_NS type $TYPE \
167*4882a593Smuzhiyun		id 2 dstport 4789 gbp remote 172.16.1.200
168*4882a593Smuzhiyun	ip netns exec at_ns0 \
169*4882a593Smuzhiyun		ip link set dev $DEV_NS address 52:54:00:d9:01:00 up
170*4882a593Smuzhiyun	ip netns exec at_ns0 ip addr add dev $DEV_NS 10.1.1.100/24
171*4882a593Smuzhiyun	ip netns exec at_ns0 arp -s 10.1.1.200 52:54:00:d9:02:00
172*4882a593Smuzhiyun	ip netns exec at_ns0 iptables -A OUTPUT -j MARK --set-mark 0x800FF
173*4882a593Smuzhiyun
174*4882a593Smuzhiyun	# root namespace
175*4882a593Smuzhiyun	ip link add dev $DEV type $TYPE external gbp dstport 4789
176*4882a593Smuzhiyun	ip link set dev $DEV address 52:54:00:d9:02:00 up
177*4882a593Smuzhiyun	ip addr add dev $DEV 10.1.1.200/24
178*4882a593Smuzhiyun	arp -s 10.1.1.100 52:54:00:d9:01:00
179*4882a593Smuzhiyun}
180*4882a593Smuzhiyun
181*4882a593Smuzhiyunadd_ip6vxlan_tunnel()
182*4882a593Smuzhiyun{
183*4882a593Smuzhiyun	#ip netns exec at_ns0 ip -4 addr del 172.16.1.100 dev veth0
184*4882a593Smuzhiyun	ip netns exec at_ns0 ip -6 addr add ::11/96 dev veth0
185*4882a593Smuzhiyun	ip netns exec at_ns0 ip link set dev veth0 up
186*4882a593Smuzhiyun	#ip -4 addr del 172.16.1.200 dev veth1
187*4882a593Smuzhiyun	ip -6 addr add dev veth1 ::22/96
188*4882a593Smuzhiyun	ip link set dev veth1 up
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun	# at_ns0 namespace
191*4882a593Smuzhiyun	ip netns exec at_ns0 \
192*4882a593Smuzhiyun		ip link add dev $DEV_NS type $TYPE id 22 dstport 4789 \
193*4882a593Smuzhiyun		local ::11 remote ::22
194*4882a593Smuzhiyun	ip netns exec at_ns0 ip addr add dev $DEV_NS 10.1.1.100/24
195*4882a593Smuzhiyun	ip netns exec at_ns0 ip link set dev $DEV_NS up
196*4882a593Smuzhiyun
197*4882a593Smuzhiyun	# root namespace
198*4882a593Smuzhiyun	ip link add dev $DEV type $TYPE external dstport 4789
199*4882a593Smuzhiyun	ip addr add dev $DEV 10.1.1.200/24
200*4882a593Smuzhiyun	ip link set dev $DEV up
201*4882a593Smuzhiyun}
202*4882a593Smuzhiyun
203*4882a593Smuzhiyunadd_geneve_tunnel()
204*4882a593Smuzhiyun{
205*4882a593Smuzhiyun	# at_ns0 namespace
206*4882a593Smuzhiyun	ip netns exec at_ns0 \
207*4882a593Smuzhiyun		ip link add dev $DEV_NS type $TYPE \
208*4882a593Smuzhiyun		id 2 dstport 6081 remote 172.16.1.200
209*4882a593Smuzhiyun	ip netns exec at_ns0 ip link set dev $DEV_NS up
210*4882a593Smuzhiyun	ip netns exec at_ns0 ip addr add dev $DEV_NS 10.1.1.100/24
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun	# root namespace
213*4882a593Smuzhiyun	ip link add dev $DEV type $TYPE dstport 6081 external
214*4882a593Smuzhiyun	ip link set dev $DEV up
215*4882a593Smuzhiyun	ip addr add dev $DEV 10.1.1.200/24
216*4882a593Smuzhiyun}
217*4882a593Smuzhiyun
218*4882a593Smuzhiyunadd_ip6geneve_tunnel()
219*4882a593Smuzhiyun{
220*4882a593Smuzhiyun	ip netns exec at_ns0 ip addr add ::11/96 dev veth0
221*4882a593Smuzhiyun	ip netns exec at_ns0 ip link set dev veth0 up
222*4882a593Smuzhiyun	ip addr add dev veth1 ::22/96
223*4882a593Smuzhiyun	ip link set dev veth1 up
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun	# at_ns0 namespace
226*4882a593Smuzhiyun	ip netns exec at_ns0 \
227*4882a593Smuzhiyun		ip link add dev $DEV_NS type $TYPE id 22 \
228*4882a593Smuzhiyun		remote ::22     # geneve has no local option
229*4882a593Smuzhiyun	ip netns exec at_ns0 ip addr add dev $DEV_NS 10.1.1.100/24
230*4882a593Smuzhiyun	ip netns exec at_ns0 ip link set dev $DEV_NS up
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun	# root namespace
233*4882a593Smuzhiyun	ip link add dev $DEV type $TYPE external
234*4882a593Smuzhiyun	ip addr add dev $DEV 10.1.1.200/24
235*4882a593Smuzhiyun	ip link set dev $DEV up
236*4882a593Smuzhiyun}
237*4882a593Smuzhiyun
238*4882a593Smuzhiyunadd_ipip_tunnel()
239*4882a593Smuzhiyun{
240*4882a593Smuzhiyun	# at_ns0 namespace
241*4882a593Smuzhiyun	ip netns exec at_ns0 \
242*4882a593Smuzhiyun		ip link add dev $DEV_NS type $TYPE \
243*4882a593Smuzhiyun		local 172.16.1.100 remote 172.16.1.200
244*4882a593Smuzhiyun	ip netns exec at_ns0 ip link set dev $DEV_NS up
245*4882a593Smuzhiyun	ip netns exec at_ns0 ip addr add dev $DEV_NS 10.1.1.100/24
246*4882a593Smuzhiyun
247*4882a593Smuzhiyun	# root namespace
248*4882a593Smuzhiyun	ip link add dev $DEV type $TYPE external
249*4882a593Smuzhiyun	ip link set dev $DEV up
250*4882a593Smuzhiyun	ip addr add dev $DEV 10.1.1.200/24
251*4882a593Smuzhiyun}
252*4882a593Smuzhiyun
253*4882a593Smuzhiyunadd_ip6tnl_tunnel()
254*4882a593Smuzhiyun{
255*4882a593Smuzhiyun	ip netns exec at_ns0 ip addr add ::11/96 dev veth0
256*4882a593Smuzhiyun	ip netns exec at_ns0 ip link set dev veth0 up
257*4882a593Smuzhiyun	ip addr add dev veth1 ::22/96
258*4882a593Smuzhiyun	ip link set dev veth1 up
259*4882a593Smuzhiyun
260*4882a593Smuzhiyun	# at_ns0 namespace
261*4882a593Smuzhiyun	ip netns exec at_ns0 \
262*4882a593Smuzhiyun		ip link add dev $DEV_NS type $TYPE \
263*4882a593Smuzhiyun		local ::11 remote ::22
264*4882a593Smuzhiyun	ip netns exec at_ns0 ip addr add dev $DEV_NS 10.1.1.100/24
265*4882a593Smuzhiyun	ip netns exec at_ns0 ip addr add dev $DEV_NS 1::11/96
266*4882a593Smuzhiyun	ip netns exec at_ns0 ip link set dev $DEV_NS up
267*4882a593Smuzhiyun
268*4882a593Smuzhiyun	# root namespace
269*4882a593Smuzhiyun	ip link add dev $DEV type $TYPE external
270*4882a593Smuzhiyun	ip addr add dev $DEV 10.1.1.200/24
271*4882a593Smuzhiyun	ip addr add dev $DEV 1::22/96
272*4882a593Smuzhiyun	ip link set dev $DEV up
273*4882a593Smuzhiyun}
274*4882a593Smuzhiyun
275*4882a593Smuzhiyuntest_gre()
276*4882a593Smuzhiyun{
277*4882a593Smuzhiyun	TYPE=gretap
278*4882a593Smuzhiyun	DEV_NS=gretap00
279*4882a593Smuzhiyun	DEV=gretap11
280*4882a593Smuzhiyun	ret=0
281*4882a593Smuzhiyun
282*4882a593Smuzhiyun	check $TYPE
283*4882a593Smuzhiyun	config_device
284*4882a593Smuzhiyun	add_gre_tunnel
285*4882a593Smuzhiyun	attach_bpf $DEV gre_set_tunnel gre_get_tunnel
286*4882a593Smuzhiyun	ping $PING_ARG 10.1.1.100
287*4882a593Smuzhiyun	check_err $?
288*4882a593Smuzhiyun	ip netns exec at_ns0 ping $PING_ARG 10.1.1.200
289*4882a593Smuzhiyun	check_err $?
290*4882a593Smuzhiyun	cleanup
291*4882a593Smuzhiyun
292*4882a593Smuzhiyun        if [ $ret -ne 0 ]; then
293*4882a593Smuzhiyun                echo -e ${RED}"FAIL: $TYPE"${NC}
294*4882a593Smuzhiyun                return 1
295*4882a593Smuzhiyun        fi
296*4882a593Smuzhiyun        echo -e ${GREEN}"PASS: $TYPE"${NC}
297*4882a593Smuzhiyun}
298*4882a593Smuzhiyun
299*4882a593Smuzhiyuntest_ip6gre()
300*4882a593Smuzhiyun{
301*4882a593Smuzhiyun	TYPE=ip6gre
302*4882a593Smuzhiyun	DEV_NS=ip6gre00
303*4882a593Smuzhiyun	DEV=ip6gre11
304*4882a593Smuzhiyun	ret=0
305*4882a593Smuzhiyun
306*4882a593Smuzhiyun	check $TYPE
307*4882a593Smuzhiyun	config_device
308*4882a593Smuzhiyun	# reuse the ip6gretap function
309*4882a593Smuzhiyun	add_ip6gretap_tunnel
310*4882a593Smuzhiyun	attach_bpf $DEV ip6gretap_set_tunnel ip6gretap_get_tunnel
311*4882a593Smuzhiyun	# underlay
312*4882a593Smuzhiyun	ping6 $PING_ARG ::11
313*4882a593Smuzhiyun	# overlay: ipv4 over ipv6
314*4882a593Smuzhiyun	ip netns exec at_ns0 ping $PING_ARG 10.1.1.200
315*4882a593Smuzhiyun	ping $PING_ARG 10.1.1.100
316*4882a593Smuzhiyun	check_err $?
317*4882a593Smuzhiyun	# overlay: ipv6 over ipv6
318*4882a593Smuzhiyun	ip netns exec at_ns0 ping6 $PING_ARG fc80::200
319*4882a593Smuzhiyun	check_err $?
320*4882a593Smuzhiyun	cleanup
321*4882a593Smuzhiyun
322*4882a593Smuzhiyun        if [ $ret -ne 0 ]; then
323*4882a593Smuzhiyun                echo -e ${RED}"FAIL: $TYPE"${NC}
324*4882a593Smuzhiyun                return 1
325*4882a593Smuzhiyun        fi
326*4882a593Smuzhiyun        echo -e ${GREEN}"PASS: $TYPE"${NC}
327*4882a593Smuzhiyun}
328*4882a593Smuzhiyun
329*4882a593Smuzhiyuntest_ip6gretap()
330*4882a593Smuzhiyun{
331*4882a593Smuzhiyun	TYPE=ip6gretap
332*4882a593Smuzhiyun	DEV_NS=ip6gretap00
333*4882a593Smuzhiyun	DEV=ip6gretap11
334*4882a593Smuzhiyun	ret=0
335*4882a593Smuzhiyun
336*4882a593Smuzhiyun	check $TYPE
337*4882a593Smuzhiyun	config_device
338*4882a593Smuzhiyun	add_ip6gretap_tunnel
339*4882a593Smuzhiyun	attach_bpf $DEV ip6gretap_set_tunnel ip6gretap_get_tunnel
340*4882a593Smuzhiyun	# underlay
341*4882a593Smuzhiyun	ping6 $PING_ARG ::11
342*4882a593Smuzhiyun	# overlay: ipv4 over ipv6
343*4882a593Smuzhiyun	ip netns exec at_ns0 ping $PING_ARG 10.1.1.200
344*4882a593Smuzhiyun	ping $PING_ARG 10.1.1.100
345*4882a593Smuzhiyun	check_err $?
346*4882a593Smuzhiyun	# overlay: ipv6 over ipv6
347*4882a593Smuzhiyun	ip netns exec at_ns0 ping6 $PING_ARG fc80::200
348*4882a593Smuzhiyun	check_err $?
349*4882a593Smuzhiyun	cleanup
350*4882a593Smuzhiyun
351*4882a593Smuzhiyun	if [ $ret -ne 0 ]; then
352*4882a593Smuzhiyun                echo -e ${RED}"FAIL: $TYPE"${NC}
353*4882a593Smuzhiyun                return 1
354*4882a593Smuzhiyun        fi
355*4882a593Smuzhiyun        echo -e ${GREEN}"PASS: $TYPE"${NC}
356*4882a593Smuzhiyun}
357*4882a593Smuzhiyun
358*4882a593Smuzhiyuntest_erspan()
359*4882a593Smuzhiyun{
360*4882a593Smuzhiyun	TYPE=erspan
361*4882a593Smuzhiyun	DEV_NS=erspan00
362*4882a593Smuzhiyun	DEV=erspan11
363*4882a593Smuzhiyun	ret=0
364*4882a593Smuzhiyun
365*4882a593Smuzhiyun	check $TYPE
366*4882a593Smuzhiyun	config_device
367*4882a593Smuzhiyun	add_erspan_tunnel $1
368*4882a593Smuzhiyun	attach_bpf $DEV erspan_set_tunnel erspan_get_tunnel
369*4882a593Smuzhiyun	ping $PING_ARG 10.1.1.100
370*4882a593Smuzhiyun	check_err $?
371*4882a593Smuzhiyun	ip netns exec at_ns0 ping $PING_ARG 10.1.1.200
372*4882a593Smuzhiyun	check_err $?
373*4882a593Smuzhiyun	cleanup
374*4882a593Smuzhiyun
375*4882a593Smuzhiyun	if [ $ret -ne 0 ]; then
376*4882a593Smuzhiyun                echo -e ${RED}"FAIL: $TYPE"${NC}
377*4882a593Smuzhiyun                return 1
378*4882a593Smuzhiyun        fi
379*4882a593Smuzhiyun        echo -e ${GREEN}"PASS: $TYPE"${NC}
380*4882a593Smuzhiyun}
381*4882a593Smuzhiyun
382*4882a593Smuzhiyuntest_ip6erspan()
383*4882a593Smuzhiyun{
384*4882a593Smuzhiyun	TYPE=ip6erspan
385*4882a593Smuzhiyun	DEV_NS=ip6erspan00
386*4882a593Smuzhiyun	DEV=ip6erspan11
387*4882a593Smuzhiyun	ret=0
388*4882a593Smuzhiyun
389*4882a593Smuzhiyun	check $TYPE
390*4882a593Smuzhiyun	config_device
391*4882a593Smuzhiyun	add_ip6erspan_tunnel $1
392*4882a593Smuzhiyun	attach_bpf $DEV ip4ip6erspan_set_tunnel ip4ip6erspan_get_tunnel
393*4882a593Smuzhiyun	ping6 $PING_ARG ::11
394*4882a593Smuzhiyun	ip netns exec at_ns0 ping $PING_ARG 10.1.1.200
395*4882a593Smuzhiyun	check_err $?
396*4882a593Smuzhiyun	cleanup
397*4882a593Smuzhiyun
398*4882a593Smuzhiyun	if [ $ret -ne 0 ]; then
399*4882a593Smuzhiyun                echo -e ${RED}"FAIL: $TYPE"${NC}
400*4882a593Smuzhiyun                return 1
401*4882a593Smuzhiyun        fi
402*4882a593Smuzhiyun        echo -e ${GREEN}"PASS: $TYPE"${NC}
403*4882a593Smuzhiyun}
404*4882a593Smuzhiyun
405*4882a593Smuzhiyuntest_vxlan()
406*4882a593Smuzhiyun{
407*4882a593Smuzhiyun	TYPE=vxlan
408*4882a593Smuzhiyun	DEV_NS=vxlan00
409*4882a593Smuzhiyun	DEV=vxlan11
410*4882a593Smuzhiyun	ret=0
411*4882a593Smuzhiyun
412*4882a593Smuzhiyun	check $TYPE
413*4882a593Smuzhiyun	config_device
414*4882a593Smuzhiyun	add_vxlan_tunnel
415*4882a593Smuzhiyun	attach_bpf $DEV vxlan_set_tunnel vxlan_get_tunnel
416*4882a593Smuzhiyun	ping $PING_ARG 10.1.1.100
417*4882a593Smuzhiyun	check_err $?
418*4882a593Smuzhiyun	ip netns exec at_ns0 ping $PING_ARG 10.1.1.200
419*4882a593Smuzhiyun	check_err $?
420*4882a593Smuzhiyun	cleanup
421*4882a593Smuzhiyun
422*4882a593Smuzhiyun	if [ $ret -ne 0 ]; then
423*4882a593Smuzhiyun                echo -e ${RED}"FAIL: $TYPE"${NC}
424*4882a593Smuzhiyun                return 1
425*4882a593Smuzhiyun        fi
426*4882a593Smuzhiyun        echo -e ${GREEN}"PASS: $TYPE"${NC}
427*4882a593Smuzhiyun}
428*4882a593Smuzhiyun
429*4882a593Smuzhiyuntest_ip6vxlan()
430*4882a593Smuzhiyun{
431*4882a593Smuzhiyun	TYPE=vxlan
432*4882a593Smuzhiyun	DEV_NS=ip6vxlan00
433*4882a593Smuzhiyun	DEV=ip6vxlan11
434*4882a593Smuzhiyun	ret=0
435*4882a593Smuzhiyun
436*4882a593Smuzhiyun	check $TYPE
437*4882a593Smuzhiyun	config_device
438*4882a593Smuzhiyun	add_ip6vxlan_tunnel
439*4882a593Smuzhiyun	ip link set dev veth1 mtu 1500
440*4882a593Smuzhiyun	attach_bpf $DEV ip6vxlan_set_tunnel ip6vxlan_get_tunnel
441*4882a593Smuzhiyun	# underlay
442*4882a593Smuzhiyun	ping6 $PING_ARG ::11
443*4882a593Smuzhiyun	# ip4 over ip6
444*4882a593Smuzhiyun	ping $PING_ARG 10.1.1.100
445*4882a593Smuzhiyun	check_err $?
446*4882a593Smuzhiyun	ip netns exec at_ns0 ping $PING_ARG 10.1.1.200
447*4882a593Smuzhiyun	check_err $?
448*4882a593Smuzhiyun	cleanup
449*4882a593Smuzhiyun
450*4882a593Smuzhiyun	if [ $ret -ne 0 ]; then
451*4882a593Smuzhiyun                echo -e ${RED}"FAIL: ip6$TYPE"${NC}
452*4882a593Smuzhiyun                return 1
453*4882a593Smuzhiyun        fi
454*4882a593Smuzhiyun        echo -e ${GREEN}"PASS: ip6$TYPE"${NC}
455*4882a593Smuzhiyun}
456*4882a593Smuzhiyun
457*4882a593Smuzhiyuntest_geneve()
458*4882a593Smuzhiyun{
459*4882a593Smuzhiyun	TYPE=geneve
460*4882a593Smuzhiyun	DEV_NS=geneve00
461*4882a593Smuzhiyun	DEV=geneve11
462*4882a593Smuzhiyun	ret=0
463*4882a593Smuzhiyun
464*4882a593Smuzhiyun	check $TYPE
465*4882a593Smuzhiyun	config_device
466*4882a593Smuzhiyun	add_geneve_tunnel
467*4882a593Smuzhiyun	attach_bpf $DEV geneve_set_tunnel geneve_get_tunnel
468*4882a593Smuzhiyun	ping $PING_ARG 10.1.1.100
469*4882a593Smuzhiyun	check_err $?
470*4882a593Smuzhiyun	ip netns exec at_ns0 ping $PING_ARG 10.1.1.200
471*4882a593Smuzhiyun	check_err $?
472*4882a593Smuzhiyun	cleanup
473*4882a593Smuzhiyun
474*4882a593Smuzhiyun	if [ $ret -ne 0 ]; then
475*4882a593Smuzhiyun                echo -e ${RED}"FAIL: $TYPE"${NC}
476*4882a593Smuzhiyun                return 1
477*4882a593Smuzhiyun        fi
478*4882a593Smuzhiyun        echo -e ${GREEN}"PASS: $TYPE"${NC}
479*4882a593Smuzhiyun}
480*4882a593Smuzhiyun
481*4882a593Smuzhiyuntest_ip6geneve()
482*4882a593Smuzhiyun{
483*4882a593Smuzhiyun	TYPE=geneve
484*4882a593Smuzhiyun	DEV_NS=ip6geneve00
485*4882a593Smuzhiyun	DEV=ip6geneve11
486*4882a593Smuzhiyun	ret=0
487*4882a593Smuzhiyun
488*4882a593Smuzhiyun	check $TYPE
489*4882a593Smuzhiyun	config_device
490*4882a593Smuzhiyun	add_ip6geneve_tunnel
491*4882a593Smuzhiyun	attach_bpf $DEV ip6geneve_set_tunnel ip6geneve_get_tunnel
492*4882a593Smuzhiyun	ping $PING_ARG 10.1.1.100
493*4882a593Smuzhiyun	check_err $?
494*4882a593Smuzhiyun	ip netns exec at_ns0 ping $PING_ARG 10.1.1.200
495*4882a593Smuzhiyun	check_err $?
496*4882a593Smuzhiyun	cleanup
497*4882a593Smuzhiyun
498*4882a593Smuzhiyun	if [ $ret -ne 0 ]; then
499*4882a593Smuzhiyun                echo -e ${RED}"FAIL: ip6$TYPE"${NC}
500*4882a593Smuzhiyun                return 1
501*4882a593Smuzhiyun        fi
502*4882a593Smuzhiyun        echo -e ${GREEN}"PASS: ip6$TYPE"${NC}
503*4882a593Smuzhiyun}
504*4882a593Smuzhiyun
505*4882a593Smuzhiyuntest_ipip()
506*4882a593Smuzhiyun{
507*4882a593Smuzhiyun	TYPE=ipip
508*4882a593Smuzhiyun	DEV_NS=ipip00
509*4882a593Smuzhiyun	DEV=ipip11
510*4882a593Smuzhiyun	ret=0
511*4882a593Smuzhiyun
512*4882a593Smuzhiyun	check $TYPE
513*4882a593Smuzhiyun	config_device
514*4882a593Smuzhiyun	add_ipip_tunnel
515*4882a593Smuzhiyun	ip link set dev veth1 mtu 1500
516*4882a593Smuzhiyun	attach_bpf $DEV ipip_set_tunnel ipip_get_tunnel
517*4882a593Smuzhiyun	ping $PING_ARG 10.1.1.100
518*4882a593Smuzhiyun	check_err $?
519*4882a593Smuzhiyun	ip netns exec at_ns0 ping $PING_ARG 10.1.1.200
520*4882a593Smuzhiyun	check_err $?
521*4882a593Smuzhiyun	cleanup
522*4882a593Smuzhiyun
523*4882a593Smuzhiyun	if [ $ret -ne 0 ]; then
524*4882a593Smuzhiyun                echo -e ${RED}"FAIL: $TYPE"${NC}
525*4882a593Smuzhiyun                return 1
526*4882a593Smuzhiyun        fi
527*4882a593Smuzhiyun        echo -e ${GREEN}"PASS: $TYPE"${NC}
528*4882a593Smuzhiyun}
529*4882a593Smuzhiyun
530*4882a593Smuzhiyuntest_ipip6()
531*4882a593Smuzhiyun{
532*4882a593Smuzhiyun	TYPE=ip6tnl
533*4882a593Smuzhiyun	DEV_NS=ipip6tnl00
534*4882a593Smuzhiyun	DEV=ipip6tnl11
535*4882a593Smuzhiyun	ret=0
536*4882a593Smuzhiyun
537*4882a593Smuzhiyun	check $TYPE
538*4882a593Smuzhiyun	config_device
539*4882a593Smuzhiyun	add_ip6tnl_tunnel
540*4882a593Smuzhiyun	ip link set dev veth1 mtu 1500
541*4882a593Smuzhiyun	attach_bpf $DEV ipip6_set_tunnel ipip6_get_tunnel
542*4882a593Smuzhiyun	# underlay
543*4882a593Smuzhiyun	ping6 $PING_ARG ::11
544*4882a593Smuzhiyun	# ip4 over ip6
545*4882a593Smuzhiyun	ping $PING_ARG 10.1.1.100
546*4882a593Smuzhiyun	check_err $?
547*4882a593Smuzhiyun	ip netns exec at_ns0 ping $PING_ARG 10.1.1.200
548*4882a593Smuzhiyun	check_err $?
549*4882a593Smuzhiyun	cleanup
550*4882a593Smuzhiyun
551*4882a593Smuzhiyun	if [ $ret -ne 0 ]; then
552*4882a593Smuzhiyun                echo -e ${RED}"FAIL: $TYPE"${NC}
553*4882a593Smuzhiyun                return 1
554*4882a593Smuzhiyun        fi
555*4882a593Smuzhiyun        echo -e ${GREEN}"PASS: $TYPE"${NC}
556*4882a593Smuzhiyun}
557*4882a593Smuzhiyun
558*4882a593Smuzhiyuntest_ip6ip6()
559*4882a593Smuzhiyun{
560*4882a593Smuzhiyun	TYPE=ip6tnl
561*4882a593Smuzhiyun	DEV_NS=ip6ip6tnl00
562*4882a593Smuzhiyun	DEV=ip6ip6tnl11
563*4882a593Smuzhiyun	ret=0
564*4882a593Smuzhiyun
565*4882a593Smuzhiyun	check $TYPE
566*4882a593Smuzhiyun	config_device
567*4882a593Smuzhiyun	add_ip6tnl_tunnel
568*4882a593Smuzhiyun	ip link set dev veth1 mtu 1500
569*4882a593Smuzhiyun	attach_bpf $DEV ip6ip6_set_tunnel ip6ip6_get_tunnel
570*4882a593Smuzhiyun	# underlay
571*4882a593Smuzhiyun	ping6 $PING_ARG ::11
572*4882a593Smuzhiyun	# ip6 over ip6
573*4882a593Smuzhiyun	ping6 $PING_ARG 1::11
574*4882a593Smuzhiyun	check_err $?
575*4882a593Smuzhiyun	ip netns exec at_ns0 ping6 $PING_ARG 1::22
576*4882a593Smuzhiyun	check_err $?
577*4882a593Smuzhiyun	cleanup
578*4882a593Smuzhiyun
579*4882a593Smuzhiyun	if [ $ret -ne 0 ]; then
580*4882a593Smuzhiyun                echo -e ${RED}"FAIL: ip6$TYPE"${NC}
581*4882a593Smuzhiyun                return 1
582*4882a593Smuzhiyun        fi
583*4882a593Smuzhiyun        echo -e ${GREEN}"PASS: ip6$TYPE"${NC}
584*4882a593Smuzhiyun}
585*4882a593Smuzhiyun
586*4882a593Smuzhiyunsetup_xfrm_tunnel()
587*4882a593Smuzhiyun{
588*4882a593Smuzhiyun	auth=0x$(printf '1%.0s' {1..40})
589*4882a593Smuzhiyun	enc=0x$(printf '2%.0s' {1..32})
590*4882a593Smuzhiyun	spi_in_to_out=0x1
591*4882a593Smuzhiyun	spi_out_to_in=0x2
592*4882a593Smuzhiyun	# at_ns0 namespace
593*4882a593Smuzhiyun	# at_ns0 -> root
594*4882a593Smuzhiyun	ip netns exec at_ns0 \
595*4882a593Smuzhiyun		ip xfrm state add src 172.16.1.100 dst 172.16.1.200 proto esp \
596*4882a593Smuzhiyun			spi $spi_in_to_out reqid 1 mode tunnel \
597*4882a593Smuzhiyun			auth-trunc 'hmac(sha1)' $auth 96 enc 'cbc(aes)' $enc
598*4882a593Smuzhiyun	ip netns exec at_ns0 \
599*4882a593Smuzhiyun		ip xfrm policy add src 10.1.1.100/32 dst 10.1.1.200/32 dir out \
600*4882a593Smuzhiyun		tmpl src 172.16.1.100 dst 172.16.1.200 proto esp reqid 1 \
601*4882a593Smuzhiyun		mode tunnel
602*4882a593Smuzhiyun	# root -> at_ns0
603*4882a593Smuzhiyun	ip netns exec at_ns0 \
604*4882a593Smuzhiyun		ip xfrm state add src 172.16.1.200 dst 172.16.1.100 proto esp \
605*4882a593Smuzhiyun			spi $spi_out_to_in reqid 2 mode tunnel \
606*4882a593Smuzhiyun			auth-trunc 'hmac(sha1)' $auth 96 enc 'cbc(aes)' $enc
607*4882a593Smuzhiyun	ip netns exec at_ns0 \
608*4882a593Smuzhiyun		ip xfrm policy add src 10.1.1.200/32 dst 10.1.1.100/32 dir in \
609*4882a593Smuzhiyun		tmpl src 172.16.1.200 dst 172.16.1.100 proto esp reqid 2 \
610*4882a593Smuzhiyun		mode tunnel
611*4882a593Smuzhiyun	# address & route
612*4882a593Smuzhiyun	ip netns exec at_ns0 \
613*4882a593Smuzhiyun		ip addr add dev veth0 10.1.1.100/32
614*4882a593Smuzhiyun	ip netns exec at_ns0 \
615*4882a593Smuzhiyun		ip route add 10.1.1.200 dev veth0 via 172.16.1.200 \
616*4882a593Smuzhiyun			src 10.1.1.100
617*4882a593Smuzhiyun
618*4882a593Smuzhiyun	# root namespace
619*4882a593Smuzhiyun	# at_ns0 -> root
620*4882a593Smuzhiyun	ip xfrm state add src 172.16.1.100 dst 172.16.1.200 proto esp \
621*4882a593Smuzhiyun		spi $spi_in_to_out reqid 1 mode tunnel \
622*4882a593Smuzhiyun		auth-trunc 'hmac(sha1)' $auth 96  enc 'cbc(aes)' $enc
623*4882a593Smuzhiyun	ip xfrm policy add src 10.1.1.100/32 dst 10.1.1.200/32 dir in \
624*4882a593Smuzhiyun		tmpl src 172.16.1.100 dst 172.16.1.200 proto esp reqid 1 \
625*4882a593Smuzhiyun		mode tunnel
626*4882a593Smuzhiyun	# root -> at_ns0
627*4882a593Smuzhiyun	ip xfrm state add src 172.16.1.200 dst 172.16.1.100 proto esp \
628*4882a593Smuzhiyun		spi $spi_out_to_in reqid 2 mode tunnel \
629*4882a593Smuzhiyun		auth-trunc 'hmac(sha1)' $auth 96  enc 'cbc(aes)' $enc
630*4882a593Smuzhiyun	ip xfrm policy add src 10.1.1.200/32 dst 10.1.1.100/32 dir out \
631*4882a593Smuzhiyun		tmpl src 172.16.1.200 dst 172.16.1.100 proto esp reqid 2 \
632*4882a593Smuzhiyun		mode tunnel
633*4882a593Smuzhiyun	# address & route
634*4882a593Smuzhiyun	ip addr add dev veth1 10.1.1.200/32
635*4882a593Smuzhiyun	ip route add 10.1.1.100 dev veth1 via 172.16.1.100 src 10.1.1.200
636*4882a593Smuzhiyun}
637*4882a593Smuzhiyun
638*4882a593Smuzhiyuntest_xfrm_tunnel()
639*4882a593Smuzhiyun{
640*4882a593Smuzhiyun	config_device
641*4882a593Smuzhiyun	> /sys/kernel/debug/tracing/trace
642*4882a593Smuzhiyun	setup_xfrm_tunnel
643*4882a593Smuzhiyun	tc qdisc add dev veth1 clsact
644*4882a593Smuzhiyun	tc filter add dev veth1 proto ip ingress bpf da obj test_tunnel_kern.o \
645*4882a593Smuzhiyun		sec xfrm_get_state
646*4882a593Smuzhiyun	ip netns exec at_ns0 ping $PING_ARG 10.1.1.200
647*4882a593Smuzhiyun	sleep 1
648*4882a593Smuzhiyun	grep "reqid 1" /sys/kernel/debug/tracing/trace
649*4882a593Smuzhiyun	check_err $?
650*4882a593Smuzhiyun	grep "spi 0x1" /sys/kernel/debug/tracing/trace
651*4882a593Smuzhiyun	check_err $?
652*4882a593Smuzhiyun	grep "remote ip 0xac100164" /sys/kernel/debug/tracing/trace
653*4882a593Smuzhiyun	check_err $?
654*4882a593Smuzhiyun	cleanup
655*4882a593Smuzhiyun
656*4882a593Smuzhiyun	if [ $ret -ne 0 ]; then
657*4882a593Smuzhiyun		echo -e ${RED}"FAIL: xfrm tunnel"${NC}
658*4882a593Smuzhiyun		return 1
659*4882a593Smuzhiyun	fi
660*4882a593Smuzhiyun	echo -e ${GREEN}"PASS: xfrm tunnel"${NC}
661*4882a593Smuzhiyun}
662*4882a593Smuzhiyun
663*4882a593Smuzhiyunattach_bpf()
664*4882a593Smuzhiyun{
665*4882a593Smuzhiyun	DEV=$1
666*4882a593Smuzhiyun	SET=$2
667*4882a593Smuzhiyun	GET=$3
668*4882a593Smuzhiyun	tc qdisc add dev $DEV clsact
669*4882a593Smuzhiyun	tc filter add dev $DEV egress bpf da obj test_tunnel_kern.o sec $SET
670*4882a593Smuzhiyun	tc filter add dev $DEV ingress bpf da obj test_tunnel_kern.o sec $GET
671*4882a593Smuzhiyun}
672*4882a593Smuzhiyun
673*4882a593Smuzhiyuncleanup()
674*4882a593Smuzhiyun{
675*4882a593Smuzhiyun	ip netns delete at_ns0 2> /dev/null
676*4882a593Smuzhiyun	ip link del veth1 2> /dev/null
677*4882a593Smuzhiyun	ip link del ipip11 2> /dev/null
678*4882a593Smuzhiyun	ip link del ipip6tnl11 2> /dev/null
679*4882a593Smuzhiyun	ip link del ip6ip6tnl11 2> /dev/null
680*4882a593Smuzhiyun	ip link del gretap11 2> /dev/null
681*4882a593Smuzhiyun	ip link del ip6gre11 2> /dev/null
682*4882a593Smuzhiyun	ip link del ip6gretap11 2> /dev/null
683*4882a593Smuzhiyun	ip link del vxlan11 2> /dev/null
684*4882a593Smuzhiyun	ip link del ip6vxlan11 2> /dev/null
685*4882a593Smuzhiyun	ip link del geneve11 2> /dev/null
686*4882a593Smuzhiyun	ip link del ip6geneve11 2> /dev/null
687*4882a593Smuzhiyun	ip link del erspan11 2> /dev/null
688*4882a593Smuzhiyun	ip link del ip6erspan11 2> /dev/null
689*4882a593Smuzhiyun	ip xfrm policy delete dir out src 10.1.1.200/32 dst 10.1.1.100/32 2> /dev/null
690*4882a593Smuzhiyun	ip xfrm policy delete dir in src 10.1.1.100/32 dst 10.1.1.200/32 2> /dev/null
691*4882a593Smuzhiyun	ip xfrm state delete src 172.16.1.100 dst 172.16.1.200 proto esp spi 0x1 2> /dev/null
692*4882a593Smuzhiyun	ip xfrm state delete src 172.16.1.200 dst 172.16.1.100 proto esp spi 0x2 2> /dev/null
693*4882a593Smuzhiyun}
694*4882a593Smuzhiyun
695*4882a593Smuzhiyuncleanup_exit()
696*4882a593Smuzhiyun{
697*4882a593Smuzhiyun	echo "CATCH SIGKILL or SIGINT, cleanup and exit"
698*4882a593Smuzhiyun	cleanup
699*4882a593Smuzhiyun	exit 0
700*4882a593Smuzhiyun}
701*4882a593Smuzhiyun
702*4882a593Smuzhiyuncheck()
703*4882a593Smuzhiyun{
704*4882a593Smuzhiyun	ip link help 2>&1 | grep -q "\s$1\s"
705*4882a593Smuzhiyun	if [ $? -ne 0 ];then
706*4882a593Smuzhiyun		echo "SKIP $1: iproute2 not support"
707*4882a593Smuzhiyun	cleanup
708*4882a593Smuzhiyun	return 1
709*4882a593Smuzhiyun	fi
710*4882a593Smuzhiyun}
711*4882a593Smuzhiyun
712*4882a593Smuzhiyunenable_debug()
713*4882a593Smuzhiyun{
714*4882a593Smuzhiyun	echo 'file ip_gre.c +p' > /sys/kernel/debug/dynamic_debug/control
715*4882a593Smuzhiyun	echo 'file ip6_gre.c +p' > /sys/kernel/debug/dynamic_debug/control
716*4882a593Smuzhiyun	echo 'file vxlan.c +p' > /sys/kernel/debug/dynamic_debug/control
717*4882a593Smuzhiyun	echo 'file geneve.c +p' > /sys/kernel/debug/dynamic_debug/control
718*4882a593Smuzhiyun	echo 'file ipip.c +p' > /sys/kernel/debug/dynamic_debug/control
719*4882a593Smuzhiyun}
720*4882a593Smuzhiyun
721*4882a593Smuzhiyuncheck_err()
722*4882a593Smuzhiyun{
723*4882a593Smuzhiyun	if [ $ret -eq 0 ]; then
724*4882a593Smuzhiyun		ret=$1
725*4882a593Smuzhiyun	fi
726*4882a593Smuzhiyun}
727*4882a593Smuzhiyun
728*4882a593Smuzhiyunbpf_tunnel_test()
729*4882a593Smuzhiyun{
730*4882a593Smuzhiyun	local errors=0
731*4882a593Smuzhiyun
732*4882a593Smuzhiyun	echo "Testing GRE tunnel..."
733*4882a593Smuzhiyun	test_gre
734*4882a593Smuzhiyun	errors=$(( $errors + $? ))
735*4882a593Smuzhiyun
736*4882a593Smuzhiyun	echo "Testing IP6GRE tunnel..."
737*4882a593Smuzhiyun	test_ip6gre
738*4882a593Smuzhiyun	errors=$(( $errors + $? ))
739*4882a593Smuzhiyun
740*4882a593Smuzhiyun	echo "Testing IP6GRETAP tunnel..."
741*4882a593Smuzhiyun	test_ip6gretap
742*4882a593Smuzhiyun	errors=$(( $errors + $? ))
743*4882a593Smuzhiyun
744*4882a593Smuzhiyun	echo "Testing ERSPAN tunnel..."
745*4882a593Smuzhiyun	test_erspan v2
746*4882a593Smuzhiyun	errors=$(( $errors + $? ))
747*4882a593Smuzhiyun
748*4882a593Smuzhiyun	echo "Testing IP6ERSPAN tunnel..."
749*4882a593Smuzhiyun	test_ip6erspan v2
750*4882a593Smuzhiyun	errors=$(( $errors + $? ))
751*4882a593Smuzhiyun
752*4882a593Smuzhiyun	echo "Testing VXLAN tunnel..."
753*4882a593Smuzhiyun	test_vxlan
754*4882a593Smuzhiyun	errors=$(( $errors + $? ))
755*4882a593Smuzhiyun
756*4882a593Smuzhiyun	echo "Testing IP6VXLAN tunnel..."
757*4882a593Smuzhiyun	test_ip6vxlan
758*4882a593Smuzhiyun	errors=$(( $errors + $? ))
759*4882a593Smuzhiyun
760*4882a593Smuzhiyun	echo "Testing GENEVE tunnel..."
761*4882a593Smuzhiyun	test_geneve
762*4882a593Smuzhiyun	errors=$(( $errors + $? ))
763*4882a593Smuzhiyun
764*4882a593Smuzhiyun	echo "Testing IP6GENEVE tunnel..."
765*4882a593Smuzhiyun	test_ip6geneve
766*4882a593Smuzhiyun	errors=$(( $errors + $? ))
767*4882a593Smuzhiyun
768*4882a593Smuzhiyun	echo "Testing IPIP tunnel..."
769*4882a593Smuzhiyun	test_ipip
770*4882a593Smuzhiyun	errors=$(( $errors + $? ))
771*4882a593Smuzhiyun
772*4882a593Smuzhiyun	echo "Testing IPIP6 tunnel..."
773*4882a593Smuzhiyun	test_ipip6
774*4882a593Smuzhiyun	errors=$(( $errors + $? ))
775*4882a593Smuzhiyun
776*4882a593Smuzhiyun	echo "Testing IP6IP6 tunnel..."
777*4882a593Smuzhiyun	test_ip6ip6
778*4882a593Smuzhiyun	errors=$(( $errors + $? ))
779*4882a593Smuzhiyun
780*4882a593Smuzhiyun	echo "Testing IPSec tunnel..."
781*4882a593Smuzhiyun	test_xfrm_tunnel
782*4882a593Smuzhiyun	errors=$(( $errors + $? ))
783*4882a593Smuzhiyun
784*4882a593Smuzhiyun	return $errors
785*4882a593Smuzhiyun}
786*4882a593Smuzhiyun
787*4882a593Smuzhiyuntrap cleanup 0 3 6
788*4882a593Smuzhiyuntrap cleanup_exit 2 9
789*4882a593Smuzhiyun
790*4882a593Smuzhiyuncleanup
791*4882a593Smuzhiyunbpf_tunnel_test
792*4882a593Smuzhiyun
793*4882a593Smuzhiyunif [ $? -ne 0 ]; then
794*4882a593Smuzhiyun	echo -e "$(basename $0): ${RED}FAIL${NC}"
795*4882a593Smuzhiyun	exit 1
796*4882a593Smuzhiyunfi
797*4882a593Smuzhiyunecho -e "$(basename $0): ${GREEN}PASS${NC}"
798*4882a593Smuzhiyunexit 0
799