1311966Sngie#	$NetBSD: t_ping6_opts.sh,v 1.8 2016/11/25 08:51:17 ozaki-r Exp $
2311966Sngie#
3311966Sngie# Copyright (c) 2016 Internet Initiative Japan Inc.
4311966Sngie# All rights reserved.
5311966Sngie#
6311966Sngie# Redistribution and use in source and binary forms, with or without
7311966Sngie# modification, are permitted provided that the following conditions
8311966Sngie# are met:
9311966Sngie# 1. Redistributions of source code must retain the above copyright
10311966Sngie#    notice, this list of conditions and the following disclaimer.
11311966Sngie# 2. Redistributions in binary form must reproduce the above copyright
12311966Sngie#    notice, this list of conditions and the following disclaimer in the
13311966Sngie#    documentation and/or other materials provided with the distribution.
14311966Sngie#
15311966Sngie# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16311966Sngie# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17311966Sngie# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18311966Sngie# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19311966Sngie# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20311966Sngie# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21311966Sngie# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22311966Sngie# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23311966Sngie# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24311966Sngie# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25311966Sngie# POSSIBILITY OF SUCH DAMAGE.
26311966Sngie#
27311966Sngie
28311966SngieSOCKSRC=unix://commsock1
29311966SngieSOCKFWD=unix://commsock2
30311966SngieSOCKDST=unix://commsock3
31311966SngieIP6SRC=fc00:0:0:1::2
32311966SngieIP6SRCGW=fc00:0:0:1::1
33311966SngieIP6DSTGW=fc00:0:0:2::1
34311966SngieIP6DST=fc00:0:0:2::2
35311966SngieBUS_SRCGW=bus1
36311966SngieBUS_DSTGW=bus2
37311966Sngie
38311966SngieIP6SRC2=fc00:0:0:1::3
39311966SngieIP6SRCGW2=fc00:0:0:1::254
40311966Sngie
41311966SngieDEBUG=${DEBUG:-false}
42311966SngieTIMEOUT=1
43311966Sngie
44311966Sngie#
45311966Sngie# Utility functions
46311966Sngie#
47311966Sngiesetup_endpoint()
48311966Sngie{
49311966Sngie	local sock=${1}
50311966Sngie	local addr=${2}
51311966Sngie	local bus=${3}
52311966Sngie	local gw=${4}
53311966Sngie
54311966Sngie	rump_server_add_iface $sock shmif0 $bus
55311966Sngie
56311966Sngie	export RUMP_SERVER=${sock}
57311966Sngie	atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${addr}
58311966Sngie	atf_check -s exit:0 -o ignore rump.route add -inet6 default ${gw}
59311966Sngie	atf_check -s exit:0 rump.ifconfig shmif0 up
60311966Sngie	atf_check -s exit:0 rump.ifconfig -w 10
61311966Sngie
62311966Sngie	if $DEBUG; then
63311966Sngie		rump.ifconfig shmif0
64311966Sngie		rump.netstat -nr
65311966Sngie	fi
66311966Sngie}
67311966Sngie
68311966Sngiesetup_forwarder()
69311966Sngie{
70311966Sngie
71311966Sngie	rump_server_add_iface $SOCKFWD shmif0 $BUS_SRCGW
72311966Sngie	rump_server_add_iface $SOCKFWD shmif1 $BUS_DSTGW
73311966Sngie
74311966Sngie	export RUMP_SERVER=$SOCKFWD
75311966Sngie
76311966Sngie	atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${IP6SRCGW}
77311966Sngie	atf_check -s exit:0 rump.ifconfig shmif1 inet6 ${IP6DSTGW}
78311966Sngie
79311966Sngie	atf_check -s exit:0 rump.ifconfig shmif0 up
80311966Sngie	atf_check -s exit:0 rump.ifconfig shmif1 up
81311966Sngie	atf_check -s exit:0 rump.ifconfig -w 10
82311966Sngie
83311966Sngie	if $DEBUG; then
84311966Sngie		rump.netstat -nr
85311966Sngie		rump.sysctl net.inet6.ip6.forwarding
86311966Sngie	fi
87311966Sngie}
88311966Sngie
89311966Sngiesetup_forwarding6()
90311966Sngie{
91311966Sngie	export RUMP_SERVER=$SOCKFWD
92311966Sngie	atf_check -s exit:0 -o ignore rump.sysctl -w net.inet6.ip6.forwarding=1
93311966Sngie}
94311966Sngie
95311966Sngiesetup6()
96311966Sngie{
97311966Sngie
98311966Sngie	rump_server_start $SOCKSRC netinet6
99311966Sngie	rump_server_start $SOCKFWD netinet6
100311966Sngie	rump_server_start $SOCKDST netinet6
101311966Sngie
102311966Sngie	setup_endpoint $SOCKSRC $IP6SRC $BUS_SRCGW $IP6SRCGW
103311966Sngie	setup_endpoint $SOCKDST $IP6DST $BUS_DSTGW $IP6DSTGW
104311966Sngie	setup_forwarder
105311966Sngie}
106311966Sngie
107311966Sngiecheck_echo_request_pkt()
108311966Sngie{
109311966Sngie	local pkt="$1 > $2: .+ echo request"
110311966Sngie
111311966Sngie	extract_new_packets $BUS_SRCGW > ./out
112311966Sngie	$DEBUG && echo $pkt
113311966Sngie	$DEBUG && cat ./out
114311966Sngie	atf_check -s exit:0 -o match:"$pkt" cat ./out
115311966Sngie}
116311966Sngie
117311966Sngiecheck_echo_request_pkt_with_macaddr()
118311966Sngie{
119311966Sngie	local pkt="$1 > $2, .+ $3 > $4: .+ echo request"
120311966Sngie
121311966Sngie	extract_new_packets $BUS_SRCGW > ./out
122311966Sngie	$DEBUG && echo $pkt
123311966Sngie	$DEBUG && cat ./out
124311966Sngie	atf_check -s exit:0 -o match:"$pkt" cat ./out
125311966Sngie}
126311966Sngie
127311966Sngiecheck_echo_request_pkt_with_macaddr_and_rthdr0()
128311966Sngie{
129311966Sngie	local pkt=
130311966Sngie
131311966Sngie	pkt="$1 > $2, .+ $3 > $4:"
132311966Sngie	pkt="$pkt srcrt \\(len=2, type=0, segleft=1, \\[0\\]$5\\)"
133311966Sngie	pkt="$pkt .+ echo request"
134311966Sngie
135311966Sngie	extract_new_packets $BUS_SRCGW > ./out
136311966Sngie	$DEBUG && echo $pkt
137311966Sngie	$DEBUG && cat ./out
138311966Sngie	atf_check -s exit:0 -o match:"$pkt" cat ./out
139311966Sngie}
140311966Sngie
141311966Sngie#
142311966Sngie# Tests
143311966Sngie#
144311966Sngieatf_test_case ping6_opts_sourceaddr cleanup
145311966Sngieping6_opts_sourceaddr_head()
146311966Sngie{
147311966Sngie
148311966Sngie	atf_set "descr" "tests of ping6 -S option"
149311966Sngie	atf_set "require.progs" "rump_server"
150311966Sngie}
151311966Sngie
152311966Sngieping6_opts_sourceaddr_body()
153311966Sngie{
154311966Sngie
155311966Sngie	setup6
156311966Sngie	setup_forwarding6
157311966Sngie
158311966Sngie	export RUMP_SERVER=$SOCKSRC
159311966Sngie	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT $IP6DST
160311966Sngie	check_echo_request_pkt $IP6SRC $IP6DST
161311966Sngie
162311966Sngie	atf_check -s exit:0 rump.ifconfig shmif0 inet6 $IP6SRC2
163311966Sngie	atf_check -s exit:0 rump.ifconfig -w 10
164311966Sngie
165311966Sngie	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT $IP6DST
166311966Sngie	check_echo_request_pkt $IP6SRC $IP6DST
167311966Sngie
168311966Sngie	# ping6 -S <sourceaddr>
169311966Sngie	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
170311966Sngie	    -S $IP6SRC $IP6DST
171311966Sngie	check_echo_request_pkt $IP6SRC $IP6DST
172311966Sngie
173311966Sngie	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
174311966Sngie	    -S $IP6SRC2 $IP6DST
175311966Sngie	check_echo_request_pkt $IP6SRC2 $IP6DST
176311966Sngie
177311966Sngie	rump_server_destroy_ifaces
178311966Sngie}
179311966Sngie
180311966Sngieping6_opts_sourceaddr_cleanup()
181311966Sngie{
182311966Sngie
183311966Sngie	$DEBUG && dump
184311966Sngie	cleanup
185311966Sngie}
186311966Sngie
187311966Sngieatf_test_case ping6_opts_interface cleanup
188311966Sngieping6_opts_interface_head()
189311966Sngie{
190311966Sngie
191311966Sngie	atf_set "descr" "tests of ping6 -I option"
192311966Sngie	atf_set "require.progs" "rump_server"
193311966Sngie}
194311966Sngie
195311966Sngieping6_opts_interface_body()
196311966Sngie{
197311966Sngie	local shmif0_lladdr=
198311966Sngie	local shmif1_lladdr=
199311966Sngie	local gw_lladdr=
200311966Sngie
201311966Sngie	setup6
202311966Sngie	setup_forwarding6
203311966Sngie
204311966Sngie	shmif0_lladdr=$(get_linklocal_addr ${SOCKSRC} shmif0)
205311966Sngie	gw_lladdr=$(get_linklocal_addr ${SOCKFWD} shmif0)
206311966Sngie
207311966Sngie	export RUMP_SERVER=$SOCKSRC
208311966Sngie	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT $gw_lladdr
209311966Sngie	check_echo_request_pkt $shmif0_lladdr $gw_lladdr
210311966Sngie
211311966Sngie	rump_server_add_iface $SOCKSRC shmif1 $BUS_SRCGW
212311966Sngie	atf_check -s exit:0 rump.ifconfig shmif1 up
213311966Sngie	atf_check -s exit:0 rump.ifconfig -w 10
214311966Sngie	shmif1_lladdr=$(get_linklocal_addr ${SOCKSRC} shmif1)
215311966Sngie
216311966Sngie	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT $gw_lladdr
217311966Sngie	check_echo_request_pkt $shmif0_lladdr $gw_lladdr
218311966Sngie
219311966Sngie	# ping6 -I <interface>
220311966Sngie	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
221311966Sngie	    -I shmif0 $gw_lladdr
222311966Sngie	check_echo_request_pkt $shmif0_lladdr $gw_lladdr
223311966Sngie
224311966Sngie	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
225311966Sngie	    -I shmif1 $gw_lladdr
226311966Sngie	check_echo_request_pkt $shmif1_lladdr $gw_lladdr
227311966Sngie
228311966Sngie	rump_server_destroy_ifaces
229311966Sngie}
230311966Sngie
231311966Sngieping6_opts_interface_cleanup()
232311966Sngie{
233311966Sngie
234311966Sngie	$DEBUG && dump
235311966Sngie	cleanup
236311966Sngie}
237311966Sngie
238311966Sngieatf_test_case ping6_opts_gateway cleanup
239311966Sngieping6_opts_gateway_head()
240311966Sngie{
241311966Sngie
242311966Sngie	atf_set "descr" "tests of ping6 -g option"
243311966Sngie	atf_set "require.progs" "rump_server"
244311966Sngie}
245311966Sngie
246311966Sngieping6_opts_gateway_body()
247311966Sngie{
248311966Sngie	local my_macaddr=
249311966Sngie	local gw_shmif0_macaddr=
250311966Sngie	local gw_shmif2_macaddr=
251311966Sngie
252311966Sngie	setup6
253311966Sngie	setup_forwarding6
254311966Sngie
255311966Sngie	my_macaddr=$(get_macaddr ${SOCKSRC} shmif0)
256311966Sngie	gw_shmif0_macaddr=$(get_macaddr ${SOCKFWD} shmif0)
257311966Sngie
258311966Sngie	export RUMP_SERVER=$SOCKSRC
259311966Sngie	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT $IP6DST
260311966Sngie	check_echo_request_pkt_with_macaddr \
261311966Sngie	    $my_macaddr $gw_shmif0_macaddr $IP6SRC $IP6DST
262311966Sngie
263311966Sngie	rump_server_add_iface $SOCKFWD shmif2 $BUS_SRCGW
264311966Sngie	export RUMP_SERVER=$SOCKFWD
265311966Sngie	atf_check -s exit:0 rump.ifconfig shmif2 inet6 $IP6SRCGW2
266311966Sngie	atf_check -s exit:0 rump.ifconfig -w 10
267311966Sngie	gw_shmif2_macaddr=$(get_macaddr ${SOCKFWD} shmif2)
268311966Sngie
269311966Sngie	export RUMP_SERVER=$SOCKSRC
270311966Sngie	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT $IP6DST
271311966Sngie	check_echo_request_pkt_with_macaddr \
272311966Sngie	    $my_macaddr $gw_shmif0_macaddr $IP6SRC $IP6DST
273311966Sngie
274311966Sngie	# ping6 -g <gateway>
275311966Sngie	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
276311966Sngie	    -g $IP6SRCGW $IP6DST
277311966Sngie	check_echo_request_pkt_with_macaddr \
278311966Sngie	    $my_macaddr $gw_shmif0_macaddr $IP6SRC $IP6DST
279311966Sngie
280311966Sngie	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
281311966Sngie	    -g $IP6SRCGW2 $IP6DST
282311966Sngie	check_echo_request_pkt_with_macaddr \
283311966Sngie	    $my_macaddr $gw_shmif2_macaddr $IP6SRC $IP6DST
284311966Sngie
285311966Sngie	rump_server_destroy_ifaces
286311966Sngie}
287311966Sngie
288311966Sngieping6_opts_gateway_cleanup()
289311966Sngie{
290311966Sngie
291311966Sngie	$DEBUG && dump
292311966Sngie	cleanup
293311966Sngie}
294311966Sngie
295311966Sngieatf_test_case ping6_opts_hops cleanup
296311966Sngieping6_opts_hops_head()
297311966Sngie{
298311966Sngie
299311966Sngie	atf_set "descr" "tests of ping6 hops (Type 0 Routing Header)"
300311966Sngie	atf_set "require.progs" "rump_server"
301311966Sngie}
302311966Sngie
303311966Sngieping6_opts_hops_body()
304311966Sngie{
305311966Sngie	local my_macaddr=
306311966Sngie	local gw_shmif0_macaddr=
307311966Sngie	local gw_shmif2_macaddr=
308311966Sngie
309311966Sngie	setup6
310311966Sngie	setup_forwarding6
311311966Sngie
312311966Sngie	my_macaddr=$(get_macaddr ${SOCKSRC} shmif0)
313311966Sngie	gw_shmif0_macaddr=$(get_macaddr ${SOCKFWD} shmif0)
314311966Sngie
315311966Sngie	export RUMP_SERVER=$SOCKSRC
316311966Sngie	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT $IP6DST
317311966Sngie	check_echo_request_pkt_with_macaddr \
318311966Sngie	    $my_macaddr $gw_shmif0_macaddr $IP6SRC $IP6DST
319311966Sngie
320311966Sngie	rump_server_add_iface $SOCKFWD shmif2 $BUS_SRCGW
321311966Sngie	export RUMP_SERVER=$SOCKFWD
322311966Sngie	atf_check -s exit:0 rump.ifconfig shmif2 inet6 $IP6SRCGW2
323311966Sngie	atf_check -s exit:0 rump.ifconfig -w 10
324311966Sngie	gw_shmif2_macaddr=$(get_macaddr ${SOCKFWD} shmif2)
325311966Sngie
326311966Sngie	export RUMP_SERVER=$SOCKSRC
327311966Sngie	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT $IP6DST
328311966Sngie	check_echo_request_pkt_with_macaddr \
329311966Sngie	    $my_macaddr $gw_shmif0_macaddr $IP6SRC $IP6DST
330311966Sngie
331311966Sngie	# ping6 hops
332311966Sngie
333311966Sngie	# ping6 fails expectedly because the kernel doesn't support
334311966Sngie	# to receive packets with type 0 routing headers, but we can
335311966Sngie	# check whether a sent packet is correct.
336311966Sngie	atf_check -s not-exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
337311966Sngie	    $IP6SRCGW $IP6DST
338311966Sngie	check_echo_request_pkt_with_macaddr_and_rthdr0 \
339311966Sngie	    $my_macaddr $gw_shmif0_macaddr $IP6SRC $IP6SRCGW $IP6DST
340311966Sngie
341311966Sngie	atf_check -s not-exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
342311966Sngie	    $IP6SRCGW2 $IP6DST
343311966Sngie	check_echo_request_pkt_with_macaddr_and_rthdr0 \
344311966Sngie	    $my_macaddr $gw_shmif2_macaddr $IP6SRC $IP6SRCGW2 $IP6DST
345311966Sngie
346311966Sngie	# ping6 -g <gateway> hops
347311966Sngie	atf_check -s not-exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
348311966Sngie	    -g $IP6SRCGW $IP6SRCGW $IP6DST
349311966Sngie	check_echo_request_pkt_with_macaddr_and_rthdr0 \
350311966Sngie	    $my_macaddr $gw_shmif0_macaddr $IP6SRC $IP6SRCGW $IP6DST
351311966Sngie
352311966Sngie	atf_check -s not-exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
353311966Sngie	    -g $IP6SRCGW2 $IP6SRCGW2 $IP6DST
354311966Sngie	check_echo_request_pkt_with_macaddr_and_rthdr0 \
355311966Sngie	    $my_macaddr $gw_shmif2_macaddr $IP6SRC $IP6SRCGW2 $IP6DST
356311966Sngie
357311966Sngie	# ping6 -g <gateway> hops, but different nexthops (is it valid?)
358311966Sngie	atf_check -s not-exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
359311966Sngie	    -g $IP6SRCGW $IP6SRCGW2 $IP6DST
360311966Sngie	check_echo_request_pkt_with_macaddr_and_rthdr0 \
361311966Sngie	    $my_macaddr $gw_shmif0_macaddr $IP6SRC $IP6SRCGW2 $IP6DST
362311966Sngie
363311966Sngie	rump_server_destroy_ifaces
364311966Sngie}
365311966Sngie
366311966Sngieping6_opts_hops_cleanup()
367311966Sngie{
368311966Sngie
369311966Sngie	$DEBUG && dump
370311966Sngie	cleanup
371311966Sngie}
372311966Sngie
373311966Sngieatf_init_test_cases()
374311966Sngie{
375311966Sngie
376311966Sngie	atf_add_test_case ping6_opts_sourceaddr
377311966Sngie	atf_add_test_case ping6_opts_interface
378311966Sngie	atf_add_test_case ping6_opts_gateway
379311966Sngie	atf_add_test_case ping6_opts_hops
380311966Sngie}
381