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