xref: /aosp_15_r20/external/linux-kselftest/tools/testing/selftests/net/traceroute.sh (revision 053f45be4e351dfd5e965df293cd45b779f579ee)
1*053f45beSAndroid Build Coastguard Worker#!/bin/bash
2*053f45beSAndroid Build Coastguard Worker# SPDX-License-Identifier: GPL-2.0
3*053f45beSAndroid Build Coastguard Worker#
4*053f45beSAndroid Build Coastguard Worker# Run traceroute/traceroute6 tests
5*053f45beSAndroid Build Coastguard Worker#
6*053f45beSAndroid Build Coastguard Worker
7*053f45beSAndroid Build Coastguard WorkerVERBOSE=0
8*053f45beSAndroid Build Coastguard WorkerPAUSE_ON_FAIL=no
9*053f45beSAndroid Build Coastguard Worker
10*053f45beSAndroid Build Coastguard Worker################################################################################
11*053f45beSAndroid Build Coastguard Worker#
12*053f45beSAndroid Build Coastguard Workerlog_test()
13*053f45beSAndroid Build Coastguard Worker{
14*053f45beSAndroid Build Coastguard Worker	local rc=$1
15*053f45beSAndroid Build Coastguard Worker	local expected=$2
16*053f45beSAndroid Build Coastguard Worker	local msg="$3"
17*053f45beSAndroid Build Coastguard Worker
18*053f45beSAndroid Build Coastguard Worker	if [ ${rc} -eq ${expected} ]; then
19*053f45beSAndroid Build Coastguard Worker		printf "TEST: %-60s  [ OK ]\n" "${msg}"
20*053f45beSAndroid Build Coastguard Worker		nsuccess=$((nsuccess+1))
21*053f45beSAndroid Build Coastguard Worker	else
22*053f45beSAndroid Build Coastguard Worker		ret=1
23*053f45beSAndroid Build Coastguard Worker		nfail=$((nfail+1))
24*053f45beSAndroid Build Coastguard Worker		printf "TEST: %-60s  [FAIL]\n" "${msg}"
25*053f45beSAndroid Build Coastguard Worker		if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
26*053f45beSAndroid Build Coastguard Worker			echo
27*053f45beSAndroid Build Coastguard Worker			echo "hit enter to continue, 'q' to quit"
28*053f45beSAndroid Build Coastguard Worker			read a
29*053f45beSAndroid Build Coastguard Worker			[ "$a" = "q" ] && exit 1
30*053f45beSAndroid Build Coastguard Worker		fi
31*053f45beSAndroid Build Coastguard Worker	fi
32*053f45beSAndroid Build Coastguard Worker}
33*053f45beSAndroid Build Coastguard Worker
34*053f45beSAndroid Build Coastguard Workerrun_cmd()
35*053f45beSAndroid Build Coastguard Worker{
36*053f45beSAndroid Build Coastguard Worker	local ns
37*053f45beSAndroid Build Coastguard Worker	local cmd
38*053f45beSAndroid Build Coastguard Worker	local out
39*053f45beSAndroid Build Coastguard Worker	local rc
40*053f45beSAndroid Build Coastguard Worker
41*053f45beSAndroid Build Coastguard Worker	ns="$1"
42*053f45beSAndroid Build Coastguard Worker	shift
43*053f45beSAndroid Build Coastguard Worker	cmd="$*"
44*053f45beSAndroid Build Coastguard Worker
45*053f45beSAndroid Build Coastguard Worker	if [ "$VERBOSE" = "1" ]; then
46*053f45beSAndroid Build Coastguard Worker		printf "    COMMAND: $cmd\n"
47*053f45beSAndroid Build Coastguard Worker	fi
48*053f45beSAndroid Build Coastguard Worker
49*053f45beSAndroid Build Coastguard Worker	out=$(eval ip netns exec ${ns} ${cmd} 2>&1)
50*053f45beSAndroid Build Coastguard Worker	rc=$?
51*053f45beSAndroid Build Coastguard Worker	if [ "$VERBOSE" = "1" -a -n "$out" ]; then
52*053f45beSAndroid Build Coastguard Worker		echo "    $out"
53*053f45beSAndroid Build Coastguard Worker	fi
54*053f45beSAndroid Build Coastguard Worker
55*053f45beSAndroid Build Coastguard Worker	[ "$VERBOSE" = "1" ] && echo
56*053f45beSAndroid Build Coastguard Worker
57*053f45beSAndroid Build Coastguard Worker	return $rc
58*053f45beSAndroid Build Coastguard Worker}
59*053f45beSAndroid Build Coastguard Worker
60*053f45beSAndroid Build Coastguard Worker################################################################################
61*053f45beSAndroid Build Coastguard Worker# create namespaces and interconnects
62*053f45beSAndroid Build Coastguard Worker
63*053f45beSAndroid Build Coastguard Workercreate_ns()
64*053f45beSAndroid Build Coastguard Worker{
65*053f45beSAndroid Build Coastguard Worker	local ns=$1
66*053f45beSAndroid Build Coastguard Worker	local addr=$2
67*053f45beSAndroid Build Coastguard Worker	local addr6=$3
68*053f45beSAndroid Build Coastguard Worker
69*053f45beSAndroid Build Coastguard Worker	[ -z "${addr}" ] && addr="-"
70*053f45beSAndroid Build Coastguard Worker	[ -z "${addr6}" ] && addr6="-"
71*053f45beSAndroid Build Coastguard Worker
72*053f45beSAndroid Build Coastguard Worker	ip netns add ${ns}
73*053f45beSAndroid Build Coastguard Worker
74*053f45beSAndroid Build Coastguard Worker	ip netns exec ${ns} ip link set lo up
75*053f45beSAndroid Build Coastguard Worker	if [ "${addr}" != "-" ]; then
76*053f45beSAndroid Build Coastguard Worker		ip netns exec ${ns} ip addr add dev lo ${addr}
77*053f45beSAndroid Build Coastguard Worker	fi
78*053f45beSAndroid Build Coastguard Worker	if [ "${addr6}" != "-" ]; then
79*053f45beSAndroid Build Coastguard Worker		ip netns exec ${ns} ip -6 addr add dev lo ${addr6}
80*053f45beSAndroid Build Coastguard Worker	fi
81*053f45beSAndroid Build Coastguard Worker
82*053f45beSAndroid Build Coastguard Worker	ip netns exec ${ns} ip ro add unreachable default metric 8192
83*053f45beSAndroid Build Coastguard Worker	ip netns exec ${ns} ip -6 ro add unreachable default metric 8192
84*053f45beSAndroid Build Coastguard Worker
85*053f45beSAndroid Build Coastguard Worker	ip netns exec ${ns} sysctl -qw net.ipv4.ip_forward=1
86*053f45beSAndroid Build Coastguard Worker	ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1
87*053f45beSAndroid Build Coastguard Worker	ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.forwarding=1
88*053f45beSAndroid Build Coastguard Worker	ip netns exec ${ns} sysctl -qw net.ipv6.conf.default.forwarding=1
89*053f45beSAndroid Build Coastguard Worker	ip netns exec ${ns} sysctl -qw net.ipv6.conf.default.accept_dad=0
90*053f45beSAndroid Build Coastguard Worker}
91*053f45beSAndroid Build Coastguard Worker
92*053f45beSAndroid Build Coastguard Worker# create veth pair to connect namespaces and apply addresses.
93*053f45beSAndroid Build Coastguard Workerconnect_ns()
94*053f45beSAndroid Build Coastguard Worker{
95*053f45beSAndroid Build Coastguard Worker	local ns1=$1
96*053f45beSAndroid Build Coastguard Worker	local ns1_dev=$2
97*053f45beSAndroid Build Coastguard Worker	local ns1_addr=$3
98*053f45beSAndroid Build Coastguard Worker	local ns1_addr6=$4
99*053f45beSAndroid Build Coastguard Worker	local ns2=$5
100*053f45beSAndroid Build Coastguard Worker	local ns2_dev=$6
101*053f45beSAndroid Build Coastguard Worker	local ns2_addr=$7
102*053f45beSAndroid Build Coastguard Worker	local ns2_addr6=$8
103*053f45beSAndroid Build Coastguard Worker
104*053f45beSAndroid Build Coastguard Worker	ip netns exec ${ns1} ip li add ${ns1_dev} type veth peer name tmp
105*053f45beSAndroid Build Coastguard Worker	ip netns exec ${ns1} ip li set ${ns1_dev} up
106*053f45beSAndroid Build Coastguard Worker	ip netns exec ${ns1} ip li set tmp netns ${ns2} name ${ns2_dev}
107*053f45beSAndroid Build Coastguard Worker	ip netns exec ${ns2} ip li set ${ns2_dev} up
108*053f45beSAndroid Build Coastguard Worker
109*053f45beSAndroid Build Coastguard Worker	if [ "${ns1_addr}" != "-" ]; then
110*053f45beSAndroid Build Coastguard Worker		ip netns exec ${ns1} ip addr add dev ${ns1_dev} ${ns1_addr}
111*053f45beSAndroid Build Coastguard Worker	fi
112*053f45beSAndroid Build Coastguard Worker
113*053f45beSAndroid Build Coastguard Worker	if [ "${ns2_addr}" != "-" ]; then
114*053f45beSAndroid Build Coastguard Worker		ip netns exec ${ns2} ip addr add dev ${ns2_dev} ${ns2_addr}
115*053f45beSAndroid Build Coastguard Worker	fi
116*053f45beSAndroid Build Coastguard Worker
117*053f45beSAndroid Build Coastguard Worker	if [ "${ns1_addr6}" != "-" ]; then
118*053f45beSAndroid Build Coastguard Worker		ip netns exec ${ns1} ip addr add dev ${ns1_dev} ${ns1_addr6}
119*053f45beSAndroid Build Coastguard Worker	fi
120*053f45beSAndroid Build Coastguard Worker
121*053f45beSAndroid Build Coastguard Worker	if [ "${ns2_addr6}" != "-" ]; then
122*053f45beSAndroid Build Coastguard Worker		ip netns exec ${ns2} ip addr add dev ${ns2_dev} ${ns2_addr6}
123*053f45beSAndroid Build Coastguard Worker	fi
124*053f45beSAndroid Build Coastguard Worker}
125*053f45beSAndroid Build Coastguard Worker
126*053f45beSAndroid Build Coastguard Worker################################################################################
127*053f45beSAndroid Build Coastguard Worker# traceroute6 test
128*053f45beSAndroid Build Coastguard Worker#
129*053f45beSAndroid Build Coastguard Worker# Verify that in this scenario
130*053f45beSAndroid Build Coastguard Worker#
131*053f45beSAndroid Build Coastguard Worker#        ------------------------ N2
132*053f45beSAndroid Build Coastguard Worker#         |                    |
133*053f45beSAndroid Build Coastguard Worker#       ------              ------  N3  ----
134*053f45beSAndroid Build Coastguard Worker#       | R1 |              | R2 |------|H2|
135*053f45beSAndroid Build Coastguard Worker#       ------              ------      ----
136*053f45beSAndroid Build Coastguard Worker#         |                    |
137*053f45beSAndroid Build Coastguard Worker#        ------------------------ N1
138*053f45beSAndroid Build Coastguard Worker#                  |
139*053f45beSAndroid Build Coastguard Worker#                 ----
140*053f45beSAndroid Build Coastguard Worker#                 |H1|
141*053f45beSAndroid Build Coastguard Worker#                 ----
142*053f45beSAndroid Build Coastguard Worker#
143*053f45beSAndroid Build Coastguard Worker# where H1's default route goes through R1 and R1's default route goes
144*053f45beSAndroid Build Coastguard Worker# through R2 over N2, traceroute6 from H1 to H2 reports R2's address
145*053f45beSAndroid Build Coastguard Worker# on N2 and not N1.
146*053f45beSAndroid Build Coastguard Worker#
147*053f45beSAndroid Build Coastguard Worker# Addresses are assigned as follows:
148*053f45beSAndroid Build Coastguard Worker#
149*053f45beSAndroid Build Coastguard Worker# N1: 2000:101::/64
150*053f45beSAndroid Build Coastguard Worker# N2: 2000:102::/64
151*053f45beSAndroid Build Coastguard Worker# N3: 2000:103::/64
152*053f45beSAndroid Build Coastguard Worker#
153*053f45beSAndroid Build Coastguard Worker# R1's host part of address: 1
154*053f45beSAndroid Build Coastguard Worker# R2's host part of address: 2
155*053f45beSAndroid Build Coastguard Worker# H1's host part of address: 3
156*053f45beSAndroid Build Coastguard Worker# H2's host part of address: 4
157*053f45beSAndroid Build Coastguard Worker#
158*053f45beSAndroid Build Coastguard Worker# For example:
159*053f45beSAndroid Build Coastguard Worker# the IPv6 address of R1's interface on N2 is 2000:102::1/64
160*053f45beSAndroid Build Coastguard Worker
161*053f45beSAndroid Build Coastguard Workercleanup_traceroute6()
162*053f45beSAndroid Build Coastguard Worker{
163*053f45beSAndroid Build Coastguard Worker	local ns
164*053f45beSAndroid Build Coastguard Worker
165*053f45beSAndroid Build Coastguard Worker	for ns in host-1 host-2 router-1 router-2
166*053f45beSAndroid Build Coastguard Worker	do
167*053f45beSAndroid Build Coastguard Worker		ip netns del ${ns} 2>/dev/null
168*053f45beSAndroid Build Coastguard Worker	done
169*053f45beSAndroid Build Coastguard Worker}
170*053f45beSAndroid Build Coastguard Worker
171*053f45beSAndroid Build Coastguard Workersetup_traceroute6()
172*053f45beSAndroid Build Coastguard Worker{
173*053f45beSAndroid Build Coastguard Worker	brdev=br0
174*053f45beSAndroid Build Coastguard Worker
175*053f45beSAndroid Build Coastguard Worker	# start clean
176*053f45beSAndroid Build Coastguard Worker	cleanup_traceroute6
177*053f45beSAndroid Build Coastguard Worker
178*053f45beSAndroid Build Coastguard Worker	set -e
179*053f45beSAndroid Build Coastguard Worker	create_ns host-1
180*053f45beSAndroid Build Coastguard Worker	create_ns host-2
181*053f45beSAndroid Build Coastguard Worker	create_ns router-1
182*053f45beSAndroid Build Coastguard Worker	create_ns router-2
183*053f45beSAndroid Build Coastguard Worker
184*053f45beSAndroid Build Coastguard Worker	# Setup N3
185*053f45beSAndroid Build Coastguard Worker	connect_ns router-2 eth3 - 2000:103::2/64 host-2 eth3 - 2000:103::4/64
186*053f45beSAndroid Build Coastguard Worker	ip netns exec host-2 ip route add default via 2000:103::2
187*053f45beSAndroid Build Coastguard Worker
188*053f45beSAndroid Build Coastguard Worker	# Setup N2
189*053f45beSAndroid Build Coastguard Worker	connect_ns router-1 eth2 - 2000:102::1/64 router-2 eth2 - 2000:102::2/64
190*053f45beSAndroid Build Coastguard Worker	ip netns exec router-1 ip route add default via 2000:102::2
191*053f45beSAndroid Build Coastguard Worker
192*053f45beSAndroid Build Coastguard Worker	# Setup N1. host-1 and router-2 connect to a bridge in router-1.
193*053f45beSAndroid Build Coastguard Worker	ip netns exec router-1 ip link add name ${brdev} type bridge
194*053f45beSAndroid Build Coastguard Worker	ip netns exec router-1 ip link set ${brdev} up
195*053f45beSAndroid Build Coastguard Worker	ip netns exec router-1 ip addr add 2000:101::1/64 dev ${brdev}
196*053f45beSAndroid Build Coastguard Worker
197*053f45beSAndroid Build Coastguard Worker	connect_ns host-1 eth0 - 2000:101::3/64 router-1 eth0 - -
198*053f45beSAndroid Build Coastguard Worker	ip netns exec router-1 ip link set dev eth0 master ${brdev}
199*053f45beSAndroid Build Coastguard Worker	ip netns exec host-1 ip route add default via 2000:101::1
200*053f45beSAndroid Build Coastguard Worker
201*053f45beSAndroid Build Coastguard Worker	connect_ns router-2 eth1 - 2000:101::2/64 router-1 eth1 - -
202*053f45beSAndroid Build Coastguard Worker	ip netns exec router-1 ip link set dev eth1 master ${brdev}
203*053f45beSAndroid Build Coastguard Worker
204*053f45beSAndroid Build Coastguard Worker	# Prime the network
205*053f45beSAndroid Build Coastguard Worker	ip netns exec host-1 ping6 -c5 2000:103::4 >/dev/null 2>&1
206*053f45beSAndroid Build Coastguard Worker
207*053f45beSAndroid Build Coastguard Worker	set +e
208*053f45beSAndroid Build Coastguard Worker}
209*053f45beSAndroid Build Coastguard Worker
210*053f45beSAndroid Build Coastguard Workerrun_traceroute6()
211*053f45beSAndroid Build Coastguard Worker{
212*053f45beSAndroid Build Coastguard Worker	if [ ! -x "$(command -v traceroute6)" ]; then
213*053f45beSAndroid Build Coastguard Worker		echo "SKIP: Could not run IPV6 test without traceroute6"
214*053f45beSAndroid Build Coastguard Worker		return
215*053f45beSAndroid Build Coastguard Worker	fi
216*053f45beSAndroid Build Coastguard Worker
217*053f45beSAndroid Build Coastguard Worker	setup_traceroute6
218*053f45beSAndroid Build Coastguard Worker
219*053f45beSAndroid Build Coastguard Worker	# traceroute6 host-2 from host-1 (expects 2000:102::2)
220*053f45beSAndroid Build Coastguard Worker	run_cmd host-1 "traceroute6 2000:103::4 | grep -q 2000:102::2"
221*053f45beSAndroid Build Coastguard Worker	log_test $? 0 "IPV6 traceroute"
222*053f45beSAndroid Build Coastguard Worker
223*053f45beSAndroid Build Coastguard Worker	cleanup_traceroute6
224*053f45beSAndroid Build Coastguard Worker}
225*053f45beSAndroid Build Coastguard Worker
226*053f45beSAndroid Build Coastguard Worker################################################################################
227*053f45beSAndroid Build Coastguard Worker# traceroute test
228*053f45beSAndroid Build Coastguard Worker#
229*053f45beSAndroid Build Coastguard Worker# Verify that traceroute from H1 to H2 shows 1.0.1.1 in this scenario
230*053f45beSAndroid Build Coastguard Worker#
231*053f45beSAndroid Build Coastguard Worker#                    1.0.3.1/24
232*053f45beSAndroid Build Coastguard Worker# ---- 1.0.1.3/24    1.0.1.1/24 ---- 1.0.2.1/24    1.0.2.4/24 ----
233*053f45beSAndroid Build Coastguard Worker# |H1|--------------------------|R1|--------------------------|H2|
234*053f45beSAndroid Build Coastguard Worker# ----            N1            ----            N2            ----
235*053f45beSAndroid Build Coastguard Worker#
236*053f45beSAndroid Build Coastguard Worker# where net.ipv4.icmp_errors_use_inbound_ifaddr is set on R1 and
237*053f45beSAndroid Build Coastguard Worker# 1.0.3.1/24 and 1.0.1.1/24 are respectively R1's primary and secondary
238*053f45beSAndroid Build Coastguard Worker# address on N1.
239*053f45beSAndroid Build Coastguard Worker#
240*053f45beSAndroid Build Coastguard Worker
241*053f45beSAndroid Build Coastguard Workercleanup_traceroute()
242*053f45beSAndroid Build Coastguard Worker{
243*053f45beSAndroid Build Coastguard Worker	local ns
244*053f45beSAndroid Build Coastguard Worker
245*053f45beSAndroid Build Coastguard Worker	for ns in host-1 host-2 router
246*053f45beSAndroid Build Coastguard Worker	do
247*053f45beSAndroid Build Coastguard Worker		ip netns del ${ns} 2>/dev/null
248*053f45beSAndroid Build Coastguard Worker	done
249*053f45beSAndroid Build Coastguard Worker}
250*053f45beSAndroid Build Coastguard Worker
251*053f45beSAndroid Build Coastguard Workersetup_traceroute()
252*053f45beSAndroid Build Coastguard Worker{
253*053f45beSAndroid Build Coastguard Worker	# start clean
254*053f45beSAndroid Build Coastguard Worker	cleanup_traceroute
255*053f45beSAndroid Build Coastguard Worker
256*053f45beSAndroid Build Coastguard Worker	set -e
257*053f45beSAndroid Build Coastguard Worker	create_ns host-1
258*053f45beSAndroid Build Coastguard Worker	create_ns host-2
259*053f45beSAndroid Build Coastguard Worker	create_ns router
260*053f45beSAndroid Build Coastguard Worker
261*053f45beSAndroid Build Coastguard Worker	connect_ns host-1 eth0 1.0.1.3/24 - \
262*053f45beSAndroid Build Coastguard Worker	           router eth1 1.0.3.1/24 -
263*053f45beSAndroid Build Coastguard Worker	ip netns exec host-1 ip route add default via 1.0.1.1
264*053f45beSAndroid Build Coastguard Worker
265*053f45beSAndroid Build Coastguard Worker	ip netns exec router ip addr add 1.0.1.1/24 dev eth1
266*053f45beSAndroid Build Coastguard Worker	ip netns exec router sysctl -qw \
267*053f45beSAndroid Build Coastguard Worker				net.ipv4.icmp_errors_use_inbound_ifaddr=1
268*053f45beSAndroid Build Coastguard Worker
269*053f45beSAndroid Build Coastguard Worker	connect_ns host-2 eth0 1.0.2.4/24 - \
270*053f45beSAndroid Build Coastguard Worker	           router eth2 1.0.2.1/24 -
271*053f45beSAndroid Build Coastguard Worker	ip netns exec host-2 ip route add default via 1.0.2.1
272*053f45beSAndroid Build Coastguard Worker
273*053f45beSAndroid Build Coastguard Worker	# Prime the network
274*053f45beSAndroid Build Coastguard Worker	ip netns exec host-1 ping -c5 1.0.2.4 >/dev/null 2>&1
275*053f45beSAndroid Build Coastguard Worker
276*053f45beSAndroid Build Coastguard Worker	set +e
277*053f45beSAndroid Build Coastguard Worker}
278*053f45beSAndroid Build Coastguard Worker
279*053f45beSAndroid Build Coastguard Workerrun_traceroute()
280*053f45beSAndroid Build Coastguard Worker{
281*053f45beSAndroid Build Coastguard Worker	if [ ! -x "$(command -v traceroute)" ]; then
282*053f45beSAndroid Build Coastguard Worker		echo "SKIP: Could not run IPV4 test without traceroute"
283*053f45beSAndroid Build Coastguard Worker		return
284*053f45beSAndroid Build Coastguard Worker	fi
285*053f45beSAndroid Build Coastguard Worker
286*053f45beSAndroid Build Coastguard Worker	setup_traceroute
287*053f45beSAndroid Build Coastguard Worker
288*053f45beSAndroid Build Coastguard Worker	# traceroute host-2 from host-1 (expects 1.0.1.1). Takes a while.
289*053f45beSAndroid Build Coastguard Worker	run_cmd host-1 "traceroute 1.0.2.4 | grep -q 1.0.1.1"
290*053f45beSAndroid Build Coastguard Worker	log_test $? 0 "IPV4 traceroute"
291*053f45beSAndroid Build Coastguard Worker
292*053f45beSAndroid Build Coastguard Worker	cleanup_traceroute
293*053f45beSAndroid Build Coastguard Worker}
294*053f45beSAndroid Build Coastguard Worker
295*053f45beSAndroid Build Coastguard Worker################################################################################
296*053f45beSAndroid Build Coastguard Worker# Run tests
297*053f45beSAndroid Build Coastguard Worker
298*053f45beSAndroid Build Coastguard Workerrun_tests()
299*053f45beSAndroid Build Coastguard Worker{
300*053f45beSAndroid Build Coastguard Worker	run_traceroute6
301*053f45beSAndroid Build Coastguard Worker	run_traceroute
302*053f45beSAndroid Build Coastguard Worker}
303*053f45beSAndroid Build Coastguard Worker
304*053f45beSAndroid Build Coastguard Worker################################################################################
305*053f45beSAndroid Build Coastguard Worker# main
306*053f45beSAndroid Build Coastguard Worker
307*053f45beSAndroid Build Coastguard Workerdeclare -i nfail=0
308*053f45beSAndroid Build Coastguard Workerdeclare -i nsuccess=0
309*053f45beSAndroid Build Coastguard Worker
310*053f45beSAndroid Build Coastguard Workerwhile getopts :pv o
311*053f45beSAndroid Build Coastguard Workerdo
312*053f45beSAndroid Build Coastguard Worker	case $o in
313*053f45beSAndroid Build Coastguard Worker		p) PAUSE_ON_FAIL=yes;;
314*053f45beSAndroid Build Coastguard Worker		v) VERBOSE=$(($VERBOSE + 1));;
315*053f45beSAndroid Build Coastguard Worker		*) exit 1;;
316*053f45beSAndroid Build Coastguard Worker	esac
317*053f45beSAndroid Build Coastguard Workerdone
318*053f45beSAndroid Build Coastguard Worker
319*053f45beSAndroid Build Coastguard Workerrun_tests
320*053f45beSAndroid Build Coastguard Worker
321*053f45beSAndroid Build Coastguard Workerprintf "\nTests passed: %3d\n" ${nsuccess}
322*053f45beSAndroid Build Coastguard Workerprintf "Tests failed: %3d\n"   ${nfail}
323