xref: /aosp_15_r20/external/linux-kselftest/tools/testing/selftests/net/amt.sh (revision 053f45be4e351dfd5e965df293cd45b779f579ee)
1*053f45beSAndroid Build Coastguard Worker#!/bin/sh
2*053f45beSAndroid Build Coastguard Worker# SPDX-License-Identifier: GPL-2.0
3*053f45beSAndroid Build Coastguard Worker
4*053f45beSAndroid Build Coastguard Worker# Author: Taehee Yoo <[email protected]>
5*053f45beSAndroid Build Coastguard Worker#
6*053f45beSAndroid Build Coastguard Worker# This script evaluates the AMT driver.
7*053f45beSAndroid Build Coastguard Worker# There are four network-namespaces, LISTENER, SOURCE, GATEWAY, RELAY.
8*053f45beSAndroid Build Coastguard Worker# The role of LISTENER is to listen multicast traffic.
9*053f45beSAndroid Build Coastguard Worker# In order to do that, it send IGMP group join message.
10*053f45beSAndroid Build Coastguard Worker# The role of SOURCE is to send multicast traffic to listener.
11*053f45beSAndroid Build Coastguard Worker# The role of GATEWAY is to work Gateway role of AMT interface.
12*053f45beSAndroid Build Coastguard Worker# The role of RELAY is to work Relay role of AMT interface.
13*053f45beSAndroid Build Coastguard Worker#
14*053f45beSAndroid Build Coastguard Worker#
15*053f45beSAndroid Build Coastguard Worker#       +------------------------+
16*053f45beSAndroid Build Coastguard Worker#       |    LISTENER netns      |
17*053f45beSAndroid Build Coastguard Worker#       |                        |
18*053f45beSAndroid Build Coastguard Worker#       |  +------------------+  |
19*053f45beSAndroid Build Coastguard Worker#       |  |       l_gw       |  |
20*053f45beSAndroid Build Coastguard Worker#       |  |  192.168.0.2/24  |  |
21*053f45beSAndroid Build Coastguard Worker#       |  |  2001:db8::2/64  |  |
22*053f45beSAndroid Build Coastguard Worker#       |  +------------------+  |
23*053f45beSAndroid Build Coastguard Worker#       |            .           |
24*053f45beSAndroid Build Coastguard Worker#       +------------------------+
25*053f45beSAndroid Build Coastguard Worker#                    .
26*053f45beSAndroid Build Coastguard Worker#                    .
27*053f45beSAndroid Build Coastguard Worker#       +-----------------------------------------------------+
28*053f45beSAndroid Build Coastguard Worker#       |            .         GATEWAY netns                  |
29*053f45beSAndroid Build Coastguard Worker#       |            .                                        |
30*053f45beSAndroid Build Coastguard Worker#       |+---------------------------------------------------+|
31*053f45beSAndroid Build Coastguard Worker#       ||           .          br0                          ||
32*053f45beSAndroid Build Coastguard Worker#       || +------------------+       +------------------+   ||
33*053f45beSAndroid Build Coastguard Worker#       || |       gw_l       |       |       amtg       |   ||
34*053f45beSAndroid Build Coastguard Worker#       || |  192.168.0.1/24  |       +--------+---------+   ||
35*053f45beSAndroid Build Coastguard Worker#       || |  2001:db8::1/64  |                |             ||
36*053f45beSAndroid Build Coastguard Worker#       || +------------------+                |             ||
37*053f45beSAndroid Build Coastguard Worker#       |+-------------------------------------|-------------+|
38*053f45beSAndroid Build Coastguard Worker#       |                                      |              |
39*053f45beSAndroid Build Coastguard Worker#       |                             +--------+---------+    |
40*053f45beSAndroid Build Coastguard Worker#       |                             |     gw_relay     |    |
41*053f45beSAndroid Build Coastguard Worker#       |                             |    10.0.0.1/24   |    |
42*053f45beSAndroid Build Coastguard Worker#       |                             +------------------+    |
43*053f45beSAndroid Build Coastguard Worker#       |                                      .              |
44*053f45beSAndroid Build Coastguard Worker#       +-----------------------------------------------------+
45*053f45beSAndroid Build Coastguard Worker#                                              .
46*053f45beSAndroid Build Coastguard Worker#                                              .
47*053f45beSAndroid Build Coastguard Worker#       +-----------------------------------------------------+
48*053f45beSAndroid Build Coastguard Worker#       |                       RELAY netns    .              |
49*053f45beSAndroid Build Coastguard Worker#       |                             +------------------+    |
50*053f45beSAndroid Build Coastguard Worker#       |                             |     relay_gw     |    |
51*053f45beSAndroid Build Coastguard Worker#       |                             |    10.0.0.2/24   |    |
52*053f45beSAndroid Build Coastguard Worker#       |                             +--------+---------+    |
53*053f45beSAndroid Build Coastguard Worker#       |                                      |              |
54*053f45beSAndroid Build Coastguard Worker#       |                                      |              |
55*053f45beSAndroid Build Coastguard Worker#       |  +------------------+       +--------+---------+    |
56*053f45beSAndroid Build Coastguard Worker#       |  |     relay_src    |       |       amtr       |    |
57*053f45beSAndroid Build Coastguard Worker#       |  |   172.17.0.1/24  |       +------------------+    |
58*053f45beSAndroid Build Coastguard Worker#       |  | 2001:db8:3::1/64 |                               |
59*053f45beSAndroid Build Coastguard Worker#       |  +------------------+                               |
60*053f45beSAndroid Build Coastguard Worker#       |            .                                        |
61*053f45beSAndroid Build Coastguard Worker#       |            .                                        |
62*053f45beSAndroid Build Coastguard Worker#       +-----------------------------------------------------+
63*053f45beSAndroid Build Coastguard Worker#                    .
64*053f45beSAndroid Build Coastguard Worker#                    .
65*053f45beSAndroid Build Coastguard Worker#       +------------------------+
66*053f45beSAndroid Build Coastguard Worker#       |            .           |
67*053f45beSAndroid Build Coastguard Worker#       |  +------------------+  |
68*053f45beSAndroid Build Coastguard Worker#       |  |     src_relay    |  |
69*053f45beSAndroid Build Coastguard Worker#       |  |   172.17.0.2/24  |  |
70*053f45beSAndroid Build Coastguard Worker#       |  | 2001:db8:3::2/64 |  |
71*053f45beSAndroid Build Coastguard Worker#       |  +------------------+  |
72*053f45beSAndroid Build Coastguard Worker#       |      SOURCE netns      |
73*053f45beSAndroid Build Coastguard Worker#       +------------------------+
74*053f45beSAndroid Build Coastguard Worker#==============================================================================
75*053f45beSAndroid Build Coastguard Worker
76*053f45beSAndroid Build Coastguard Workerreadonly LISTENER=$(mktemp -u listener-XXXXXXXX)
77*053f45beSAndroid Build Coastguard Workerreadonly GATEWAY=$(mktemp -u gateway-XXXXXXXX)
78*053f45beSAndroid Build Coastguard Workerreadonly RELAY=$(mktemp -u relay-XXXXXXXX)
79*053f45beSAndroid Build Coastguard Workerreadonly SOURCE=$(mktemp -u source-XXXXXXXX)
80*053f45beSAndroid Build Coastguard WorkerERR=4
81*053f45beSAndroid Build Coastguard Workererr=0
82*053f45beSAndroid Build Coastguard Worker
83*053f45beSAndroid Build Coastguard Workerexit_cleanup()
84*053f45beSAndroid Build Coastguard Worker{
85*053f45beSAndroid Build Coastguard Worker	for ns in "$@"; do
86*053f45beSAndroid Build Coastguard Worker		ip netns delete "${ns}" 2>/dev/null || true
87*053f45beSAndroid Build Coastguard Worker	done
88*053f45beSAndroid Build Coastguard Worker
89*053f45beSAndroid Build Coastguard Worker	exit $ERR
90*053f45beSAndroid Build Coastguard Worker}
91*053f45beSAndroid Build Coastguard Worker
92*053f45beSAndroid Build Coastguard Workercreate_namespaces()
93*053f45beSAndroid Build Coastguard Worker{
94*053f45beSAndroid Build Coastguard Worker	ip netns add "${LISTENER}" || exit_cleanup
95*053f45beSAndroid Build Coastguard Worker	ip netns add "${GATEWAY}" || exit_cleanup "${LISTENER}"
96*053f45beSAndroid Build Coastguard Worker	ip netns add "${RELAY}" || exit_cleanup "${LISTENER}" "${GATEWAY}"
97*053f45beSAndroid Build Coastguard Worker	ip netns add "${SOURCE}" || exit_cleanup "${LISTENER}" "${GATEWAY}" \
98*053f45beSAndroid Build Coastguard Worker		"${RELAY}"
99*053f45beSAndroid Build Coastguard Worker}
100*053f45beSAndroid Build Coastguard Worker
101*053f45beSAndroid Build Coastguard Worker# The trap function handler
102*053f45beSAndroid Build Coastguard Worker#
103*053f45beSAndroid Build Coastguard Workerexit_cleanup_all()
104*053f45beSAndroid Build Coastguard Worker{
105*053f45beSAndroid Build Coastguard Worker	exit_cleanup "${LISTENER}" "${GATEWAY}" "${RELAY}" "${SOURCE}"
106*053f45beSAndroid Build Coastguard Worker}
107*053f45beSAndroid Build Coastguard Worker
108*053f45beSAndroid Build Coastguard Workersetup_interface()
109*053f45beSAndroid Build Coastguard Worker{
110*053f45beSAndroid Build Coastguard Worker	for ns in "${LISTENER}" "${GATEWAY}" "${RELAY}" "${SOURCE}"; do
111*053f45beSAndroid Build Coastguard Worker		ip -netns "${ns}" link set dev lo up
112*053f45beSAndroid Build Coastguard Worker	done;
113*053f45beSAndroid Build Coastguard Worker
114*053f45beSAndroid Build Coastguard Worker	ip link add l_gw type veth peer name gw_l
115*053f45beSAndroid Build Coastguard Worker	ip link add gw_relay type veth peer name relay_gw
116*053f45beSAndroid Build Coastguard Worker	ip link add relay_src type veth peer name src_relay
117*053f45beSAndroid Build Coastguard Worker
118*053f45beSAndroid Build Coastguard Worker	ip link set l_gw netns "${LISTENER}" up
119*053f45beSAndroid Build Coastguard Worker	ip link set gw_l netns "${GATEWAY}" up
120*053f45beSAndroid Build Coastguard Worker	ip link set gw_relay netns "${GATEWAY}" up
121*053f45beSAndroid Build Coastguard Worker	ip link set relay_gw netns "${RELAY}" up
122*053f45beSAndroid Build Coastguard Worker	ip link set relay_src netns "${RELAY}" up
123*053f45beSAndroid Build Coastguard Worker	ip link set src_relay netns "${SOURCE}" up mtu 1400
124*053f45beSAndroid Build Coastguard Worker
125*053f45beSAndroid Build Coastguard Worker	ip netns exec "${LISTENER}" ip a a 192.168.0.2/24 dev l_gw
126*053f45beSAndroid Build Coastguard Worker	ip netns exec "${LISTENER}" ip r a default via 192.168.0.1 dev l_gw
127*053f45beSAndroid Build Coastguard Worker	ip netns exec "${LISTENER}" ip a a 2001:db8::2/64 dev l_gw
128*053f45beSAndroid Build Coastguard Worker	ip netns exec "${LISTENER}" ip r a default via 2001:db8::1 dev l_gw
129*053f45beSAndroid Build Coastguard Worker	ip netns exec "${LISTENER}" ip a a 239.0.0.1/32 dev l_gw autojoin
130*053f45beSAndroid Build Coastguard Worker	ip netns exec "${LISTENER}" ip a a ff0e::5:6/128 dev l_gw autojoin
131*053f45beSAndroid Build Coastguard Worker
132*053f45beSAndroid Build Coastguard Worker	ip netns exec "${GATEWAY}" ip a a 192.168.0.1/24 dev gw_l
133*053f45beSAndroid Build Coastguard Worker	ip netns exec "${GATEWAY}" ip a a 2001:db8::1/64 dev gw_l
134*053f45beSAndroid Build Coastguard Worker	ip netns exec "${GATEWAY}" ip a a 10.0.0.1/24 dev gw_relay
135*053f45beSAndroid Build Coastguard Worker	ip netns exec "${GATEWAY}" ip link add br0 type bridge
136*053f45beSAndroid Build Coastguard Worker	ip netns exec "${GATEWAY}" ip link set br0 up
137*053f45beSAndroid Build Coastguard Worker	ip netns exec "${GATEWAY}" ip link set gw_l master br0
138*053f45beSAndroid Build Coastguard Worker	ip netns exec "${GATEWAY}" ip link set gw_l up
139*053f45beSAndroid Build Coastguard Worker	ip netns exec "${GATEWAY}" ip link add amtg master br0 type amt \
140*053f45beSAndroid Build Coastguard Worker		mode gateway local 10.0.0.1 discovery 10.0.0.2 dev gw_relay \
141*053f45beSAndroid Build Coastguard Worker		gateway_port 2268 relay_port 2268
142*053f45beSAndroid Build Coastguard Worker	ip netns exec "${RELAY}" ip a a 10.0.0.2/24 dev relay_gw
143*053f45beSAndroid Build Coastguard Worker	ip netns exec "${RELAY}" ip link add amtr type amt mode relay \
144*053f45beSAndroid Build Coastguard Worker		local 10.0.0.2 dev relay_gw relay_port 2268 max_tunnels 4
145*053f45beSAndroid Build Coastguard Worker	ip netns exec "${RELAY}" ip a a 172.17.0.1/24 dev relay_src
146*053f45beSAndroid Build Coastguard Worker	ip netns exec "${RELAY}" ip a a 2001:db8:3::1/64 dev relay_src
147*053f45beSAndroid Build Coastguard Worker	ip netns exec "${SOURCE}" ip a a 172.17.0.2/24 dev src_relay
148*053f45beSAndroid Build Coastguard Worker	ip netns exec "${SOURCE}" ip a a 2001:db8:3::2/64 dev src_relay
149*053f45beSAndroid Build Coastguard Worker	ip netns exec "${SOURCE}" ip r a default via 172.17.0.1 dev src_relay
150*053f45beSAndroid Build Coastguard Worker	ip netns exec "${SOURCE}" ip r a default via 2001:db8:3::1 dev src_relay
151*053f45beSAndroid Build Coastguard Worker	ip netns exec "${RELAY}" ip link set amtr up
152*053f45beSAndroid Build Coastguard Worker	ip netns exec "${GATEWAY}" ip link set amtg up
153*053f45beSAndroid Build Coastguard Worker}
154*053f45beSAndroid Build Coastguard Worker
155*053f45beSAndroid Build Coastguard Workersetup_sysctl()
156*053f45beSAndroid Build Coastguard Worker{
157*053f45beSAndroid Build Coastguard Worker	ip netns exec "${RELAY}" sysctl net.ipv4.ip_forward=1 -w -q
158*053f45beSAndroid Build Coastguard Worker}
159*053f45beSAndroid Build Coastguard Worker
160*053f45beSAndroid Build Coastguard Workersetup_iptables()
161*053f45beSAndroid Build Coastguard Worker{
162*053f45beSAndroid Build Coastguard Worker	ip netns exec "${RELAY}" iptables -t mangle -I PREROUTING \
163*053f45beSAndroid Build Coastguard Worker		-d 239.0.0.1 -j TTL --ttl-set 2
164*053f45beSAndroid Build Coastguard Worker	ip netns exec "${RELAY}" ip6tables -t mangle -I PREROUTING \
165*053f45beSAndroid Build Coastguard Worker		-j HL --hl-set 2
166*053f45beSAndroid Build Coastguard Worker}
167*053f45beSAndroid Build Coastguard Worker
168*053f45beSAndroid Build Coastguard Workersetup_mcast_routing()
169*053f45beSAndroid Build Coastguard Worker{
170*053f45beSAndroid Build Coastguard Worker	ip netns exec "${RELAY}" smcrouted
171*053f45beSAndroid Build Coastguard Worker	ip netns exec "${RELAY}" smcroutectl a relay_src \
172*053f45beSAndroid Build Coastguard Worker		172.17.0.2 239.0.0.1 amtr
173*053f45beSAndroid Build Coastguard Worker	ip netns exec "${RELAY}" smcroutectl a relay_src \
174*053f45beSAndroid Build Coastguard Worker		2001:db8:3::2 ff0e::5:6 amtr
175*053f45beSAndroid Build Coastguard Worker}
176*053f45beSAndroid Build Coastguard Worker
177*053f45beSAndroid Build Coastguard Workertest_remote_ip()
178*053f45beSAndroid Build Coastguard Worker{
179*053f45beSAndroid Build Coastguard Worker	REMOTE=$(ip netns exec "${GATEWAY}" \
180*053f45beSAndroid Build Coastguard Worker		ip -d -j link show amtg | jq .[0].linkinfo.info_data.remote)
181*053f45beSAndroid Build Coastguard Worker	if [ $REMOTE == "\"10.0.0.2\"" ]; then
182*053f45beSAndroid Build Coastguard Worker		printf "TEST: %-60s  [ OK ]\n" "amt discovery"
183*053f45beSAndroid Build Coastguard Worker	else
184*053f45beSAndroid Build Coastguard Worker		printf "TEST: %-60s  [FAIL]\n" "amt discovery"
185*053f45beSAndroid Build Coastguard Worker		ERR=1
186*053f45beSAndroid Build Coastguard Worker	fi
187*053f45beSAndroid Build Coastguard Worker}
188*053f45beSAndroid Build Coastguard Worker
189*053f45beSAndroid Build Coastguard Workersend_mcast_torture4()
190*053f45beSAndroid Build Coastguard Worker{
191*053f45beSAndroid Build Coastguard Worker	ip netns exec "${SOURCE}" bash -c \
192*053f45beSAndroid Build Coastguard Worker		'cat /dev/urandom | head -c 1G | nc -w 1 -u 239.0.0.1 4001'
193*053f45beSAndroid Build Coastguard Worker}
194*053f45beSAndroid Build Coastguard Worker
195*053f45beSAndroid Build Coastguard Worker
196*053f45beSAndroid Build Coastguard Workersend_mcast_torture6()
197*053f45beSAndroid Build Coastguard Worker{
198*053f45beSAndroid Build Coastguard Worker	ip netns exec "${SOURCE}" bash -c \
199*053f45beSAndroid Build Coastguard Worker		'cat /dev/urandom | head -c 1G | nc -w 1 -u ff0e::5:6 6001'
200*053f45beSAndroid Build Coastguard Worker}
201*053f45beSAndroid Build Coastguard Worker
202*053f45beSAndroid Build Coastguard Workercheck_features()
203*053f45beSAndroid Build Coastguard Worker{
204*053f45beSAndroid Build Coastguard Worker        ip link help 2>&1 | grep -q amt
205*053f45beSAndroid Build Coastguard Worker        if [ $? -ne 0 ]; then
206*053f45beSAndroid Build Coastguard Worker                echo "Missing amt support in iproute2" >&2
207*053f45beSAndroid Build Coastguard Worker                exit_cleanup
208*053f45beSAndroid Build Coastguard Worker        fi
209*053f45beSAndroid Build Coastguard Worker}
210*053f45beSAndroid Build Coastguard Worker
211*053f45beSAndroid Build Coastguard Workertest_ipv4_forward()
212*053f45beSAndroid Build Coastguard Worker{
213*053f45beSAndroid Build Coastguard Worker	RESULT4=$(ip netns exec "${LISTENER}" nc -w 1 -l -u 239.0.0.1 4000)
214*053f45beSAndroid Build Coastguard Worker	if [ "$RESULT4" == "172.17.0.2" ]; then
215*053f45beSAndroid Build Coastguard Worker		printf "TEST: %-60s  [ OK ]\n" "IPv4 amt multicast forwarding"
216*053f45beSAndroid Build Coastguard Worker		exit 0
217*053f45beSAndroid Build Coastguard Worker	else
218*053f45beSAndroid Build Coastguard Worker		printf "TEST: %-60s  [FAIL]\n" "IPv4 amt multicast forwarding"
219*053f45beSAndroid Build Coastguard Worker		exit 1
220*053f45beSAndroid Build Coastguard Worker	fi
221*053f45beSAndroid Build Coastguard Worker}
222*053f45beSAndroid Build Coastguard Worker
223*053f45beSAndroid Build Coastguard Workertest_ipv6_forward()
224*053f45beSAndroid Build Coastguard Worker{
225*053f45beSAndroid Build Coastguard Worker	RESULT6=$(ip netns exec "${LISTENER}" nc -w 1 -l -u ff0e::5:6 6000)
226*053f45beSAndroid Build Coastguard Worker	if [ "$RESULT6" == "2001:db8:3::2" ]; then
227*053f45beSAndroid Build Coastguard Worker		printf "TEST: %-60s  [ OK ]\n" "IPv6 amt multicast forwarding"
228*053f45beSAndroid Build Coastguard Worker		exit 0
229*053f45beSAndroid Build Coastguard Worker	else
230*053f45beSAndroid Build Coastguard Worker		printf "TEST: %-60s  [FAIL]\n" "IPv6 amt multicast forwarding"
231*053f45beSAndroid Build Coastguard Worker		exit 1
232*053f45beSAndroid Build Coastguard Worker	fi
233*053f45beSAndroid Build Coastguard Worker}
234*053f45beSAndroid Build Coastguard Worker
235*053f45beSAndroid Build Coastguard Workersend_mcast4()
236*053f45beSAndroid Build Coastguard Worker{
237*053f45beSAndroid Build Coastguard Worker	sleep 2
238*053f45beSAndroid Build Coastguard Worker	ip netns exec "${SOURCE}" bash -c \
239*053f45beSAndroid Build Coastguard Worker		'echo 172.17.0.2 | nc -w 1 -u 239.0.0.1 4000' &
240*053f45beSAndroid Build Coastguard Worker}
241*053f45beSAndroid Build Coastguard Worker
242*053f45beSAndroid Build Coastguard Workersend_mcast6()
243*053f45beSAndroid Build Coastguard Worker{
244*053f45beSAndroid Build Coastguard Worker	sleep 2
245*053f45beSAndroid Build Coastguard Worker	ip netns exec "${SOURCE}" bash -c \
246*053f45beSAndroid Build Coastguard Worker		'echo 2001:db8:3::2 | nc -w 1 -u ff0e::5:6 6000' &
247*053f45beSAndroid Build Coastguard Worker}
248*053f45beSAndroid Build Coastguard Worker
249*053f45beSAndroid Build Coastguard Workercheck_features
250*053f45beSAndroid Build Coastguard Worker
251*053f45beSAndroid Build Coastguard Workercreate_namespaces
252*053f45beSAndroid Build Coastguard Worker
253*053f45beSAndroid Build Coastguard Workerset -e
254*053f45beSAndroid Build Coastguard Workertrap exit_cleanup_all EXIT
255*053f45beSAndroid Build Coastguard Worker
256*053f45beSAndroid Build Coastguard Workersetup_interface
257*053f45beSAndroid Build Coastguard Workersetup_sysctl
258*053f45beSAndroid Build Coastguard Workersetup_iptables
259*053f45beSAndroid Build Coastguard Workersetup_mcast_routing
260*053f45beSAndroid Build Coastguard Workertest_remote_ip
261*053f45beSAndroid Build Coastguard Workertest_ipv4_forward &
262*053f45beSAndroid Build Coastguard Workerpid=$!
263*053f45beSAndroid Build Coastguard Workersend_mcast4
264*053f45beSAndroid Build Coastguard Workerwait $pid || err=$?
265*053f45beSAndroid Build Coastguard Workerif [ $err -eq 1 ]; then
266*053f45beSAndroid Build Coastguard Worker	ERR=1
267*053f45beSAndroid Build Coastguard Workerfi
268*053f45beSAndroid Build Coastguard Workertest_ipv6_forward &
269*053f45beSAndroid Build Coastguard Workerpid=$!
270*053f45beSAndroid Build Coastguard Workersend_mcast6
271*053f45beSAndroid Build Coastguard Workerwait $pid || err=$?
272*053f45beSAndroid Build Coastguard Workerif [ $err -eq 1 ]; then
273*053f45beSAndroid Build Coastguard Worker	ERR=1
274*053f45beSAndroid Build Coastguard Workerfi
275*053f45beSAndroid Build Coastguard Workersend_mcast_torture4
276*053f45beSAndroid Build Coastguard Workerprintf "TEST: %-60s  [ OK ]\n" "IPv4 amt traffic forwarding torture"
277*053f45beSAndroid Build Coastguard Workersend_mcast_torture6
278*053f45beSAndroid Build Coastguard Workerprintf "TEST: %-60s  [ OK ]\n" "IPv6 amt traffic forwarding torture"
279*053f45beSAndroid Build Coastguard Workersleep 5
280*053f45beSAndroid Build Coastguard Workerif [ "${ERR}" -eq 1 ]; then
281*053f45beSAndroid Build Coastguard Worker        echo "Some tests failed." >&2
282*053f45beSAndroid Build Coastguard Workerelse
283*053f45beSAndroid Build Coastguard Worker        ERR=0
284*053f45beSAndroid Build Coastguard Workerfi
285