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