Home | History | Annotate | Line # | Download | only in if_gif
t_gif.sh revision 1.1
      1 #! /usr/bin/atf-sh
      2 #	$NetBSD: t_gif.sh,v 1.1 2015/11/05 00:02:59 knakahara Exp $
      3 #
      4 # Copyright (c) 2015 Internet Initiative Japan Inc.
      5 # All rights reserved.
      6 #
      7 # Redistribution and use in source and binary forms, with or without
      8 # modification, are permitted provided that the following conditions
      9 # are met:
     10 # 1. Redistributions of source code must retain the above copyright
     11 #    notice, this list of conditions and the following disclaimer.
     12 # 2. Redistributions in binary form must reproduce the above copyright
     13 #    notice, this list of conditions and the following disclaimer in the
     14 #    documentation and/or other materials provided with the distribution.
     15 #
     16 # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     17 # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     18 # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     19 # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     20 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     21 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     22 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     23 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     24 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     25 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     26 # POSSIBILITY OF SUCH DAMAGE.
     27 #
     28 
     29 server="rump_server -v -lrumpnet -lrumpnet_net -lrumpnet_netinet \
     30 		    -lrumpnet_netinet6 -lrumpnet_shmif -lrumpnet_gif"
     31 
     32 SOCK1=unix://commsock1 # for ROUTER1
     33 SOCK2=unix://commsock2 # for ROUTER2
     34 ROUTER1_LANIP=192.168.1.1
     35 ROUTER1_LANNET=192.168.1.0/24
     36 ROUTER1_WANIP=10.0.0.1
     37 ROUTER1_GIFIP=172.16.1.1
     38 ROUTER2_LANIP=192.168.2.1
     39 ROUTER2_LANNET=192.168.2.0/24
     40 ROUTER2_WANIP=10.0.0.2
     41 ROUTER2_GIFIP=172.16.2.1
     42 
     43 ROUTER1_LANIP6=fc00:1::1
     44 ROUTER1_LANNET6=fc00:1::/64
     45 ROUTER1_WANIP6=fc00::1
     46 ROUTER1_GIFIP6=fc00:3::1
     47 ROUTER2_LANIP6=fc00:2::1
     48 ROUTER2_LANNET6=fc00:2::/64
     49 ROUTER2_WANIP6=fc00::2
     50 ROUTER2_GIFIP6=fc00:4::1
     51 
     52 TIMEOUT=5
     53 
     54 atf_test_case basicv4overv4 cleanup
     55 atf_test_case basicv4overv6 cleanup
     56 atf_test_case basicv6overv4 cleanup
     57 atf_test_case basicv6overv6 cleanup
     58 
     59 basicv4overv4_head()
     60 {
     61 	atf_set "descr" "Does IPv4 over IPv4 if_gif tests"
     62 	atf_set "require.progs" "rump_server"
     63 }
     64 
     65 basicv4overv6_head()
     66 {
     67 	atf_set "descr" "Does IPv4 over IPv6 if_gif tests"
     68 	atf_set "require.progs" "rump_server"
     69 }
     70 
     71 basicv6overv4_head()
     72 {
     73 	atf_set "descr" "Does IPv6 over IPv4 if_gif tests"
     74 	atf_set "require.progs" "rump_server"
     75 }
     76 
     77 basicv6overv6_head()
     78 {
     79 	atf_set "descr" "Does IPv6 over IPv6 if_gif tests"
     80 	atf_set "require.progs" "rump_server"
     81 }
     82 
     83 setup_router()
     84 {
     85 	sock=${1}
     86 	lan=${2}
     87 	lan_mode=${3}
     88 	wan=${4}
     89 	wan_mode=${5}
     90 
     91 	export RUMP_SERVER=${sock}
     92 	atf_check -s exit:0 rump.ifconfig shmif0 create
     93 	atf_check -s exit:0 rump.ifconfig shmif0 linkstr bus0
     94 	if [ ${lan_mode} = "ipv6" ]; then
     95 		atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${lan}
     96 	else
     97 		atf_check -s exit:0 rump.ifconfig shmif0 inet ${lan} netmask 0xffffff00
     98 	fi
     99 	atf_check -s exit:0 rump.ifconfig shmif0 up
    100 	rump.ifconfig shmif0
    101 
    102 	atf_check -s exit:0 rump.ifconfig shmif1 create
    103 	atf_check -s exit:0 rump.ifconfig shmif1 linkstr bus1
    104 	if [ ${wan_mode} = "ipv6" ]; then
    105 		atf_check -s exit:0 rump.ifconfig shmif1 inet6 ${wan}
    106 	else
    107 		atf_check -s exit:0 rump.ifconfig shmif1 inet ${wan} netmask 0xff000000
    108 	fi
    109 	atf_check -s exit:0 rump.ifconfig shmif1 up
    110 	rump.ifconfig shmif1
    111 }
    112 
    113 test_router()
    114 {
    115 	sock=${1}
    116 	lan=${2}
    117 	lan_mode=${3}
    118 	wan=${4}
    119 	wan_mode=${5}
    120 
    121 	export RUMP_SERVER=${sock}
    122 	atf_check -s exit:0 -o match:shmif0 rump.ifconfig
    123 	if [ ${lan_mode} = "ipv6" ]; then
    124 		atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${lan}
    125 	else
    126 		atf_check -s exit:0 -o ignore rump.ping -n -c 1 -w $TIMEOUT ${lan}
    127 	fi
    128 
    129 	atf_check -s exit:0 -o match:shmif1 rump.ifconfig
    130 	if [ ${wan_mode} = "ipv6" ]; then
    131 		atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${wan}
    132 	else
    133 		atf_check -s exit:0 -o ignore rump.ping -n -c 1 -w $TIMEOUT ${wan}
    134 	fi
    135 }
    136 
    137 setup()
    138 {
    139 	inner=${1}
    140 	outer=${2}
    141 
    142 	atf_check -s exit:0 ${server} $SOCK1
    143 	atf_check -s exit:0 ${server} $SOCK2
    144 
    145 	router1_lan=""
    146 	router1_lan_mode=""
    147 	router2_lan=""
    148 	router2_lan_mode=""
    149 	if [ ${inner} = "ipv6" ]; then
    150 		router1_lan=$ROUTER1_LANIP6
    151 		router1_lan_mode="ipv6"
    152 		router2_lan=$ROUTER2_LANIP6
    153 		router2_lan_mode="ipv6"
    154 	else
    155 		router1_lan=$ROUTER1_LANIP
    156 		router1_lan_mode="ipv4"
    157 		router2_lan=$ROUTER2_LANIP
    158 		router2_lan_mode="ipv4"
    159 	fi
    160 
    161 	if [ ${outer} = "ipv6" ]; then
    162 		setup_router $SOCK1 ${router1_lan} ${router1_lan_mode} \
    163 			$ROUTER1_WANIP6 ipv6
    164 		setup_router $SOCK2 ${router2_lan} ${router2_lan_mode} \
    165 			$ROUTER2_WANIP6 ipv6
    166 	else
    167 		setup_router $SOCK1 ${router1_lan} ${router1_lan_mode} \
    168 			$ROUTER1_WANIP ipv4
    169 		setup_router $SOCK2 ${router2_lan} ${router2_lan_mode} \
    170 			$ROUTER2_WANIP ipv4
    171 	fi
    172 }
    173 
    174 test_setup()
    175 {
    176 	inner=${1}
    177 	outer=${2}
    178 
    179 	router1_lan=""
    180 	router1_lan_mode=""
    181 	router2_lan=""
    182 	router2_lan_mode=""
    183 	if [ ${inner} = "ipv6" ]; then
    184 		router1_lan=$ROUTER1_LANIP6
    185 		router1_lan_mode="ipv6"
    186 		router2_lan=$ROUTER2_LANIP6
    187 		router2_lan_mode="ipv6"
    188 	else
    189 		router1_lan=$ROUTER1_LANIP
    190 		router1_lan_mode="ipv4"
    191 		router2_lan=$ROUTER2_LANIP
    192 		router2_lan_mode="ipv4"
    193 	fi
    194 	if [ ${outer} = "ipv6" ]; then
    195 		test_router $SOCK1 ${router1_lan} ${router1_lan_mode} \
    196 			$ROUTER1_WANIP6 ipv6
    197 		test_router $SOCK2 ${router2_lan} ${router2_lan_mode} \
    198 			$ROUTER2_WANIP6 ipv6
    199 	else
    200 		test_router $SOCK1 ${router1_lan} ${router1_lan_mode} \
    201 			$ROUTER1_WANIP ipv4
    202 		test_router $SOCK2 ${router2_lan} ${router2_lan_mode} \
    203 			$ROUTER2_WANIP ipv4
    204 	fi
    205 }
    206 
    207 setup_if_gif()
    208 {
    209 	sock=${1}
    210 	addr=${2}
    211 	remote=${3}
    212 	inner=${4}
    213 	src=${5}
    214 	dst=${6}
    215 	peernet=${7}
    216 
    217 	export RUMP_SERVER=${sock}
    218 	atf_check -s exit:0 rump.ifconfig gif0 create
    219 	atf_check -s exit:0 rump.ifconfig gif0 tunnel ${src} ${dst}
    220 	if [ ${inner} = "ipv6" ]; then
    221 		atf_check -s exit:0 rump.ifconfig gif0 inet6 ${addr}/128 ${remote}
    222 		atf_check -s exit:0 -o ignore rump.route add -inet6 ${peernet} ${addr}
    223 	else
    224 		atf_check -s exit:0 rump.ifconfig gif0 inet ${addr}/32 ${remote}
    225 		atf_check -s exit:0 -o ignore rump.route add -inet ${peernet} ${addr}
    226 	fi
    227 
    228 	rump.ifconfig gif0
    229 	rump.route -nL show
    230 }
    231 
    232 setup_tunnel()
    233 {
    234 	inner=${1}
    235 	outer=${2}
    236 
    237 	addr=""
    238 	remote=""
    239 	src=""
    240 	dst=""
    241 	peernet=""
    242 
    243 	if [ ${inner} = "ipv6" ]; then
    244 		addr=$ROUTER1_GIFIP6
    245 		remote=$ROUTER2_GIFIP6
    246 		peernet=$ROUTER2_LANNET6
    247 	else
    248 		addr=$ROUTER1_GIFIP
    249 		remote=$ROUTER2_GIFIP
    250 		peernet=$ROUTER2_LANNET
    251 	fi
    252 	if [ ${outer} = "ipv6" ]; then
    253 		src=$ROUTER1_WANIP6
    254 		dst=$ROUTER2_WANIP6
    255 	else
    256 		src=$ROUTER1_WANIP
    257 		dst=$ROUTER2_WANIP
    258 	fi
    259 	setup_if_gif $SOCK1 ${addr} ${remote} ${inner} \
    260 		     ${src} ${dst} ${peernet}
    261 
    262 	if [ $inner = "ipv6" ]; then
    263 		addr=$ROUTER2_GIFIP6
    264 		remote=$ROUTER1_GIFIP6
    265 		peernet=$ROUTER1_LANNET6
    266 	else
    267 		addr=$ROUTER2_GIFIP
    268 		remote=$ROUTER1_GIFIP
    269 		peernet=$ROUTER1_LANNET
    270 	fi
    271 	if [ $outer = "ipv6" ]; then
    272 		src=$ROUTER2_WANIP6
    273 		dst=$ROUTER1_WANIP6
    274 	else
    275 		src=$ROUTER2_WANIP
    276 		dst=$ROUTER1_WANIP
    277 	fi
    278 	setup_if_gif $SOCK2 ${addr} ${remote} ${inner} \
    279 		     ${src} ${dst} ${peernet}
    280 }
    281 
    282 test_setup_tunnel()
    283 {
    284 	mode=${1}
    285 
    286 	peernet=""
    287 	opt=""
    288 	if [ ${inner} = "ipv6" ]; then
    289 		peernet=$ROUTER2_LANNET6
    290 		opt="-inet6"
    291 	else
    292 		peernet=$ROUTER2_LANNET
    293 		opt="-inet"
    294 	fi
    295 	export RUMP_SERVER=$SOCK1
    296 	atf_check -s exit:0 -o match:gif0 rump.ifconfig
    297 	atf_check -s exit:0 -o match:gif0 rump.route -nL get ${opt} ${peernet}
    298 
    299 	if [ ${inner} = "ipv6" ]; then
    300 		peernet=$ROUTER1_LANNET6
    301 		opt="-inet6"
    302 	else
    303 		peernet=$ROUTER1_LANNET
    304 		opt="-inet"
    305 	fi
    306 	export RUMP_SERVER=$SOCK2
    307 	atf_check -s exit:0 -o match:gif0 rump.ifconfig
    308 	atf_check -s exit:0 -o match:gif0 rump.route -nL get ${opt} ${peernet}
    309 }
    310 
    311 teardown_tunnel()
    312 {
    313 	export RUMP_SERVER=$SOCK1
    314 	atf_check -s exit:0 rump.ifconfig gif0 deletetunnel
    315 	atf_check -s exit:0 rump.ifconfig gif0 destroy
    316 
    317 	export RUMP_SERVER=$SOCK2
    318 	atf_check -s exit:0 rump.ifconfig gif0 deletetunnel
    319 	atf_check -s exit:0 rump.ifconfig gif0 destroy
    320 }
    321 
    322 cleanup()
    323 {
    324 	env RUMP_SERVER=$SOCK1 rump.halt
    325 	env RUMP_SERVER=$SOCK2 rump.halt
    326 }
    327 
    328 dump_bus()
    329 {
    330 	/usr/bin/shmif_dumpbus -p - bus0 2>/dev/null| /usr/sbin/tcpdump -n -e -r -
    331 	/usr/bin/shmif_dumpbus -p - bus1 2>/dev/null| /usr/sbin/tcpdump -n -e -r -
    332 }
    333 
    334 test_ping_failure()
    335 {
    336 	mode=$1
    337 
    338 	export RUMP_SERVER=$SOCK1
    339 	if [ ${mode} = "ipv6" ]; then
    340 		atf_check -s not-exit:0 -o ignore -e ignore \
    341 			rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER1_LANIP6 \
    342 			$ROUTER2_LANIP6
    343 	else
    344 		atf_check -s not-exit:0 -o ignore -e ignore \
    345 			rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER1_LANIP \
    346 			$ROUTER2_LANIP
    347 	fi
    348 
    349 	export RUMP_SERVER=$SOCK2
    350 	if [ ${mode} = "ipv6" ]; then
    351 		atf_check -s not-exit:0 -o ignore -e ignore \
    352 			rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER2_LANIP6 \
    353 			$ROUTER1_LANIP6
    354 	else
    355 		atf_check -s not-exit:0 -o ignore -e ignore \
    356 			rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER1_LANIP \
    357 			$ROUTER2_LANIP
    358 	fi
    359 }
    360 
    361 test_ping_success()
    362 {
    363 	mode=$1
    364 
    365 	export RUMP_SERVER=$SOCK1
    366 	rump.ifconfig -v gif0
    367 	if [ ${mode} = "ipv6" ]; then
    368 		# XXX
    369 		# rump.ping6 rarely fails with the message that
    370 		# "failed to get receiving hop limit".
    371 		# This is a known issue being analyzed.
    372 		atf_check -s exit:0 -o ignore \
    373 			rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER1_LANIP6 \
    374 			$ROUTER2_LANIP6
    375 	else
    376 		atf_check -s exit:0 -o ignore \
    377 			rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER1_LANIP \
    378 			$ROUTER2_LANIP
    379 	fi
    380 	rump.ifconfig -v gif0
    381 
    382 	export RUMP_SERVER=$SOCK2
    383 	rump.ifconfig -v gif0
    384 	if [ ${mode} = "ipv6" ]; then
    385 		atf_check -s exit:0 -o ignore \
    386 			rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER2_LANIP6 \
    387 			$ROUTER1_LANIP6
    388 	else
    389 		atf_check -s exit:0 -o ignore \
    390 			rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER2_LANIP \
    391 			$ROUTER1_LANIP
    392 	fi
    393 	rump.ifconfig -v gif0
    394 }
    395 
    396 basicv4overv4_body()
    397 {
    398 	setup ipv4 ipv4
    399 	test_setup ipv4 ipv4
    400 
    401 	# Enable once PR kern/49219 is fixed
    402 	#test_ping_failure
    403 
    404 	setup_tunnel ipv4 ipv4
    405 	sleep 1
    406 	test_setup_tunnel ipv4
    407 	test_ping_success ipv4
    408 
    409 	teardown_tunnel
    410 	test_ping_failure ipv4
    411 }
    412 
    413 basicv4overv6_body()
    414 {
    415 	setup ipv4 ipv6
    416 	test_setup ipv4 ipv6
    417 
    418 	# Enable once PR kern/49219 is fixed
    419 	#test_ping_failure
    420 
    421 	setup_tunnel ipv4 ipv6
    422 	sleep 1
    423 	test_setup_tunnel ipv4
    424 	test_ping_success ipv4
    425 
    426 	teardown_tunnel
    427 	test_ping_failure ipv4
    428 }
    429 
    430 basicv6overv4_body()
    431 {
    432 	setup ipv6 ipv4
    433 	test_setup ipv6 ipv4
    434 
    435 	# Enable once PR kern/49219 is fixed
    436 	#test_ping_failure
    437 
    438 	setup_tunnel ipv6 ipv4
    439 	sleep 1
    440 	test_setup_tunnel ipv6
    441 	test_ping_success ipv6
    442 
    443 	teardown_tunnel
    444 	test_ping_failure ipv6
    445 }
    446 
    447 basicv6overv6_body()
    448 {
    449 	setup ipv6 ipv6
    450 	test_setup ipv6 ipv6
    451 
    452 	# Enable once PR kern/49219 is fixed
    453 	#test_ping_failure
    454 
    455 	setup_tunnel ipv6 ipv6
    456 	sleep 1
    457 	test_setup_tunnel ipv6
    458 	test_ping_success ipv6
    459 
    460 	teardown_tunnel
    461 	test_ping_failure ipv6
    462 }
    463 
    464 basicv4overv4_cleanup()
    465 {
    466 	dump_bus
    467 	cleanup
    468 }
    469 
    470 basicv4overv6_cleanup()
    471 {
    472 	dump_bus
    473 	cleanup
    474 }
    475 
    476 basicv6overv4_cleanup()
    477 {
    478 	dump_bus
    479 	cleanup
    480 }
    481 
    482 basicv6overv6_cleanup()
    483 {
    484 	dump_bus
    485 	cleanup
    486 }
    487 
    488 atf_init_test_cases()
    489 {
    490 	atf_add_test_case basicv4overv4
    491 	atf_add_test_case basicv4overv6
    492 	atf_add_test_case basicv6overv4
    493 	atf_add_test_case basicv6overv6
    494 }
    495