t_ping6_opts.sh revision 313535
1#	$NetBSD: t_ping6_opts.sh,v 1.8 2016/11/25 08:51:17 ozaki-r Exp $
2#
3# Copyright (c) 2016 Internet Initiative Japan Inc.
4# All rights reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
9# 1. Redistributions of source code must retain the above copyright
10#    notice, this list of conditions and the following disclaimer.
11# 2. Redistributions in binary form must reproduce the above copyright
12#    notice, this list of conditions and the following disclaimer in the
13#    documentation and/or other materials provided with the distribution.
14#
15# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25# POSSIBILITY OF SUCH DAMAGE.
26#
27
28SOCKSRC=unix://commsock1
29SOCKFWD=unix://commsock2
30SOCKDST=unix://commsock3
31IP6SRC=fc00:0:0:1::2
32IP6SRCGW=fc00:0:0:1::1
33IP6DSTGW=fc00:0:0:2::1
34IP6DST=fc00:0:0:2::2
35BUS_SRCGW=bus1
36BUS_DSTGW=bus2
37
38IP6SRC2=fc00:0:0:1::3
39IP6SRCGW2=fc00:0:0:1::254
40
41DEBUG=${DEBUG:-false}
42TIMEOUT=1
43
44#
45# Utility functions
46#
47setup_endpoint()
48{
49	local sock=${1}
50	local addr=${2}
51	local bus=${3}
52	local gw=${4}
53
54	rump_server_add_iface $sock shmif0 $bus
55
56	export RUMP_SERVER=${sock}
57	atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${addr}
58	atf_check -s exit:0 -o ignore rump.route add -inet6 default ${gw}
59	atf_check -s exit:0 rump.ifconfig shmif0 up
60	atf_check -s exit:0 rump.ifconfig -w 10
61
62	if $DEBUG; then
63		rump.ifconfig shmif0
64		rump.netstat -nr
65	fi
66}
67
68setup_forwarder()
69{
70
71	rump_server_add_iface $SOCKFWD shmif0 $BUS_SRCGW
72	rump_server_add_iface $SOCKFWD shmif1 $BUS_DSTGW
73
74	export RUMP_SERVER=$SOCKFWD
75
76	atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${IP6SRCGW}
77	atf_check -s exit:0 rump.ifconfig shmif1 inet6 ${IP6DSTGW}
78
79	atf_check -s exit:0 rump.ifconfig shmif0 up
80	atf_check -s exit:0 rump.ifconfig shmif1 up
81	atf_check -s exit:0 rump.ifconfig -w 10
82
83	if $DEBUG; then
84		rump.netstat -nr
85		rump.sysctl net.inet6.ip6.forwarding
86	fi
87}
88
89setup_forwarding6()
90{
91	export RUMP_SERVER=$SOCKFWD
92	atf_check -s exit:0 -o ignore rump.sysctl -w net.inet6.ip6.forwarding=1
93}
94
95setup6()
96{
97
98	rump_server_start $SOCKSRC netinet6
99	rump_server_start $SOCKFWD netinet6
100	rump_server_start $SOCKDST netinet6
101
102	setup_endpoint $SOCKSRC $IP6SRC $BUS_SRCGW $IP6SRCGW
103	setup_endpoint $SOCKDST $IP6DST $BUS_DSTGW $IP6DSTGW
104	setup_forwarder
105}
106
107check_echo_request_pkt()
108{
109	local pkt="$1 > $2: .+ echo request"
110
111	extract_new_packets $BUS_SRCGW > ./out
112	$DEBUG && echo $pkt
113	$DEBUG && cat ./out
114	atf_check -s exit:0 -o match:"$pkt" cat ./out
115}
116
117check_echo_request_pkt_with_macaddr()
118{
119	local pkt="$1 > $2, .+ $3 > $4: .+ echo request"
120
121	extract_new_packets $BUS_SRCGW > ./out
122	$DEBUG && echo $pkt
123	$DEBUG && cat ./out
124	atf_check -s exit:0 -o match:"$pkt" cat ./out
125}
126
127check_echo_request_pkt_with_macaddr_and_rthdr0()
128{
129	local pkt=
130
131	pkt="$1 > $2, .+ $3 > $4:"
132	pkt="$pkt srcrt \\(len=2, type=0, segleft=1, \\[0\\]$5\\)"
133	pkt="$pkt .+ echo request"
134
135	extract_new_packets $BUS_SRCGW > ./out
136	$DEBUG && echo $pkt
137	$DEBUG && cat ./out
138	atf_check -s exit:0 -o match:"$pkt" cat ./out
139}
140
141#
142# Tests
143#
144atf_test_case ping6_opts_sourceaddr cleanup
145ping6_opts_sourceaddr_head()
146{
147
148	atf_set "descr" "tests of ping6 -S option"
149	atf_set "require.progs" "rump_server"
150}
151
152ping6_opts_sourceaddr_body()
153{
154
155	setup6
156	setup_forwarding6
157
158	export RUMP_SERVER=$SOCKSRC
159	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT $IP6DST
160	check_echo_request_pkt $IP6SRC $IP6DST
161
162	atf_check -s exit:0 rump.ifconfig shmif0 inet6 $IP6SRC2
163	atf_check -s exit:0 rump.ifconfig -w 10
164
165	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT $IP6DST
166	check_echo_request_pkt $IP6SRC $IP6DST
167
168	# ping6 -S <sourceaddr>
169	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
170	    -S $IP6SRC $IP6DST
171	check_echo_request_pkt $IP6SRC $IP6DST
172
173	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
174	    -S $IP6SRC2 $IP6DST
175	check_echo_request_pkt $IP6SRC2 $IP6DST
176
177	rump_server_destroy_ifaces
178}
179
180ping6_opts_sourceaddr_cleanup()
181{
182
183	$DEBUG && dump
184	cleanup
185}
186
187atf_test_case ping6_opts_interface cleanup
188ping6_opts_interface_head()
189{
190
191	atf_set "descr" "tests of ping6 -I option"
192	atf_set "require.progs" "rump_server"
193}
194
195ping6_opts_interface_body()
196{
197	local shmif0_lladdr=
198	local shmif1_lladdr=
199	local gw_lladdr=
200
201	setup6
202	setup_forwarding6
203
204	shmif0_lladdr=$(get_linklocal_addr ${SOCKSRC} shmif0)
205	gw_lladdr=$(get_linklocal_addr ${SOCKFWD} shmif0)
206
207	export RUMP_SERVER=$SOCKSRC
208	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT $gw_lladdr
209	check_echo_request_pkt $shmif0_lladdr $gw_lladdr
210
211	rump_server_add_iface $SOCKSRC shmif1 $BUS_SRCGW
212	atf_check -s exit:0 rump.ifconfig shmif1 up
213	atf_check -s exit:0 rump.ifconfig -w 10
214	shmif1_lladdr=$(get_linklocal_addr ${SOCKSRC} shmif1)
215
216	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT $gw_lladdr
217	check_echo_request_pkt $shmif0_lladdr $gw_lladdr
218
219	# ping6 -I <interface>
220	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
221	    -I shmif0 $gw_lladdr
222	check_echo_request_pkt $shmif0_lladdr $gw_lladdr
223
224	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
225	    -I shmif1 $gw_lladdr
226	check_echo_request_pkt $shmif1_lladdr $gw_lladdr
227
228	rump_server_destroy_ifaces
229}
230
231ping6_opts_interface_cleanup()
232{
233
234	$DEBUG && dump
235	cleanup
236}
237
238atf_test_case ping6_opts_gateway cleanup
239ping6_opts_gateway_head()
240{
241
242	atf_set "descr" "tests of ping6 -g option"
243	atf_set "require.progs" "rump_server"
244}
245
246ping6_opts_gateway_body()
247{
248	local my_macaddr=
249	local gw_shmif0_macaddr=
250	local gw_shmif2_macaddr=
251
252	setup6
253	setup_forwarding6
254
255	my_macaddr=$(get_macaddr ${SOCKSRC} shmif0)
256	gw_shmif0_macaddr=$(get_macaddr ${SOCKFWD} shmif0)
257
258	export RUMP_SERVER=$SOCKSRC
259	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT $IP6DST
260	check_echo_request_pkt_with_macaddr \
261	    $my_macaddr $gw_shmif0_macaddr $IP6SRC $IP6DST
262
263	rump_server_add_iface $SOCKFWD shmif2 $BUS_SRCGW
264	export RUMP_SERVER=$SOCKFWD
265	atf_check -s exit:0 rump.ifconfig shmif2 inet6 $IP6SRCGW2
266	atf_check -s exit:0 rump.ifconfig -w 10
267	gw_shmif2_macaddr=$(get_macaddr ${SOCKFWD} shmif2)
268
269	export RUMP_SERVER=$SOCKSRC
270	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT $IP6DST
271	check_echo_request_pkt_with_macaddr \
272	    $my_macaddr $gw_shmif0_macaddr $IP6SRC $IP6DST
273
274	# ping6 -g <gateway>
275	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
276	    -g $IP6SRCGW $IP6DST
277	check_echo_request_pkt_with_macaddr \
278	    $my_macaddr $gw_shmif0_macaddr $IP6SRC $IP6DST
279
280	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
281	    -g $IP6SRCGW2 $IP6DST
282	check_echo_request_pkt_with_macaddr \
283	    $my_macaddr $gw_shmif2_macaddr $IP6SRC $IP6DST
284
285	rump_server_destroy_ifaces
286}
287
288ping6_opts_gateway_cleanup()
289{
290
291	$DEBUG && dump
292	cleanup
293}
294
295atf_test_case ping6_opts_hops cleanup
296ping6_opts_hops_head()
297{
298
299	atf_set "descr" "tests of ping6 hops (Type 0 Routing Header)"
300	atf_set "require.progs" "rump_server"
301}
302
303ping6_opts_hops_body()
304{
305	local my_macaddr=
306	local gw_shmif0_macaddr=
307	local gw_shmif2_macaddr=
308
309	setup6
310	setup_forwarding6
311
312	my_macaddr=$(get_macaddr ${SOCKSRC} shmif0)
313	gw_shmif0_macaddr=$(get_macaddr ${SOCKFWD} shmif0)
314
315	export RUMP_SERVER=$SOCKSRC
316	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT $IP6DST
317	check_echo_request_pkt_with_macaddr \
318	    $my_macaddr $gw_shmif0_macaddr $IP6SRC $IP6DST
319
320	rump_server_add_iface $SOCKFWD shmif2 $BUS_SRCGW
321	export RUMP_SERVER=$SOCKFWD
322	atf_check -s exit:0 rump.ifconfig shmif2 inet6 $IP6SRCGW2
323	atf_check -s exit:0 rump.ifconfig -w 10
324	gw_shmif2_macaddr=$(get_macaddr ${SOCKFWD} shmif2)
325
326	export RUMP_SERVER=$SOCKSRC
327	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT $IP6DST
328	check_echo_request_pkt_with_macaddr \
329	    $my_macaddr $gw_shmif0_macaddr $IP6SRC $IP6DST
330
331	# ping6 hops
332
333	# ping6 fails expectedly because the kernel doesn't support
334	# to receive packets with type 0 routing headers, but we can
335	# check whether a sent packet is correct.
336	atf_check -s not-exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
337	    $IP6SRCGW $IP6DST
338	check_echo_request_pkt_with_macaddr_and_rthdr0 \
339	    $my_macaddr $gw_shmif0_macaddr $IP6SRC $IP6SRCGW $IP6DST
340
341	atf_check -s not-exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
342	    $IP6SRCGW2 $IP6DST
343	check_echo_request_pkt_with_macaddr_and_rthdr0 \
344	    $my_macaddr $gw_shmif2_macaddr $IP6SRC $IP6SRCGW2 $IP6DST
345
346	# ping6 -g <gateway> hops
347	atf_check -s not-exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
348	    -g $IP6SRCGW $IP6SRCGW $IP6DST
349	check_echo_request_pkt_with_macaddr_and_rthdr0 \
350	    $my_macaddr $gw_shmif0_macaddr $IP6SRC $IP6SRCGW $IP6DST
351
352	atf_check -s not-exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
353	    -g $IP6SRCGW2 $IP6SRCGW2 $IP6DST
354	check_echo_request_pkt_with_macaddr_and_rthdr0 \
355	    $my_macaddr $gw_shmif2_macaddr $IP6SRC $IP6SRCGW2 $IP6DST
356
357	# ping6 -g <gateway> hops, but different nexthops (is it valid?)
358	atf_check -s not-exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
359	    -g $IP6SRCGW $IP6SRCGW2 $IP6DST
360	check_echo_request_pkt_with_macaddr_and_rthdr0 \
361	    $my_macaddr $gw_shmif0_macaddr $IP6SRC $IP6SRCGW2 $IP6DST
362
363	rump_server_destroy_ifaces
364}
365
366ping6_opts_hops_cleanup()
367{
368
369	$DEBUG && dump
370	cleanup
371}
372
373atf_init_test_cases()
374{
375
376	atf_add_test_case ping6_opts_sourceaddr
377	atf_add_test_case ping6_opts_interface
378	atf_add_test_case ping6_opts_gateway
379	atf_add_test_case ping6_opts_hops
380}
381