Home | History | Annotate | Line # | Download | only in if_gif
t_gif.sh revision 1.7
      1 #	$NetBSD: t_gif.sh,v 1.7 2016/11/24 09:03:53 ozaki-r 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 -lrumpdev -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 ROUTER1_WANIP_DUMMY=10.0.0.11
     38 ROUTER1_GIFIP_DUMMY=172.16.11.1
     39 ROUTER1_GIFIP_RECURSIVE1=172.16.101.1
     40 ROUTER1_GIFIP_RECURSIVE2=172.16.201.1
     41 ROUTER2_LANIP=192.168.2.1
     42 ROUTER2_LANNET=192.168.2.0/24
     43 ROUTER2_WANIP=10.0.0.2
     44 ROUTER2_GIFIP=172.16.2.1
     45 ROUTER2_WANIP_DUMMY=10.0.0.12
     46 ROUTER2_GIFIP_DUMMY=172.16.12.1
     47 ROUTER2_GIFIP_RECURSIVE1=172.16.102.1
     48 ROUTER2_GIFIP_RECURSIVE2=172.16.202.1
     49 
     50 ROUTER1_LANIP6=fc00:1::1
     51 ROUTER1_LANNET6=fc00:1::/64
     52 ROUTER1_WANIP6=fc00::1
     53 ROUTER1_GIFIP6=fc00:3::1
     54 ROUTER1_WANIP6_DUMMY=fc00::11
     55 ROUTER1_GIFIP6_DUMMY=fc00:13::1
     56 ROUTER1_GIFIP6_RECURSIVE1=fc00:103::1
     57 ROUTER1_GIFIP6_RECURSIVE2=fc00:203::1
     58 ROUTER2_LANIP6=fc00:2::1
     59 ROUTER2_LANNET6=fc00:2::/64
     60 ROUTER2_WANIP6=fc00::2
     61 ROUTER2_GIFIP6=fc00:4::1
     62 ROUTER2_WANIP6_DUMMY=fc00::12
     63 ROUTER2_GIFIP6_DUMMY=fc00:14::1
     64 ROUTER2_GIFIP6_RECURSIVE1=fc00:104::1
     65 ROUTER2_GIFIP6_RECURSIVE2=fc00:204::1
     66 
     67 TIMEOUT=5
     68 
     69 setup_router()
     70 {
     71 	sock=${1}
     72 	lan=${2}
     73 	lan_mode=${3}
     74 	wan=${4}
     75 	wan_mode=${5}
     76 
     77 	export RUMP_SERVER=${sock}
     78 	atf_check -s exit:0 rump.ifconfig shmif0 create
     79 	atf_check -s exit:0 rump.ifconfig shmif0 linkstr bus0
     80 	if [ ${lan_mode} = "ipv6" ]; then
     81 		atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${lan}
     82 	else
     83 		atf_check -s exit:0 rump.ifconfig shmif0 inet ${lan} netmask 0xffffff00
     84 	fi
     85 	atf_check -s exit:0 rump.ifconfig shmif0 up
     86 	rump.ifconfig shmif0
     87 
     88 	atf_check -s exit:0 rump.ifconfig shmif1 create
     89 	atf_check -s exit:0 rump.ifconfig shmif1 linkstr bus1
     90 	if [ ${wan_mode} = "ipv6" ]; then
     91 		atf_check -s exit:0 rump.ifconfig shmif1 inet6 ${wan}
     92 	else
     93 		atf_check -s exit:0 rump.ifconfig shmif1 inet ${wan} netmask 0xff000000
     94 	fi
     95 	atf_check -s exit:0 rump.ifconfig shmif1 up
     96 	rump.ifconfig shmif1
     97 }
     98 
     99 test_router()
    100 {
    101 	sock=${1}
    102 	lan=${2}
    103 	lan_mode=${3}
    104 	wan=${4}
    105 	wan_mode=${5}
    106 
    107 	export RUMP_SERVER=${sock}
    108 	atf_check -s exit:0 -o match:shmif0 rump.ifconfig
    109 	if [ ${lan_mode} = "ipv6" ]; then
    110 		atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${lan}
    111 	else
    112 		atf_check -s exit:0 -o ignore rump.ping -n -c 1 -w $TIMEOUT ${lan}
    113 	fi
    114 
    115 	atf_check -s exit:0 -o match:shmif1 rump.ifconfig
    116 	if [ ${wan_mode} = "ipv6" ]; then
    117 		atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${wan}
    118 	else
    119 		atf_check -s exit:0 -o ignore rump.ping -n -c 1 -w $TIMEOUT ${wan}
    120 	fi
    121 }
    122 
    123 setup()
    124 {
    125 	inner=${1}
    126 	outer=${2}
    127 
    128 	atf_check -s exit:0 ${server} $SOCK1
    129 	atf_check -s exit:0 ${server} $SOCK2
    130 
    131 	router1_lan=""
    132 	router1_lan_mode=""
    133 	router2_lan=""
    134 	router2_lan_mode=""
    135 	if [ ${inner} = "ipv6" ]; then
    136 		router1_lan=$ROUTER1_LANIP6
    137 		router1_lan_mode="ipv6"
    138 		router2_lan=$ROUTER2_LANIP6
    139 		router2_lan_mode="ipv6"
    140 	else
    141 		router1_lan=$ROUTER1_LANIP
    142 		router1_lan_mode="ipv4"
    143 		router2_lan=$ROUTER2_LANIP
    144 		router2_lan_mode="ipv4"
    145 	fi
    146 
    147 	if [ ${outer} = "ipv6" ]; then
    148 		setup_router $SOCK1 ${router1_lan} ${router1_lan_mode} \
    149 			$ROUTER1_WANIP6 ipv6
    150 		setup_router $SOCK2 ${router2_lan} ${router2_lan_mode} \
    151 			$ROUTER2_WANIP6 ipv6
    152 	else
    153 		setup_router $SOCK1 ${router1_lan} ${router1_lan_mode} \
    154 			$ROUTER1_WANIP ipv4
    155 		setup_router $SOCK2 ${router2_lan} ${router2_lan_mode} \
    156 			$ROUTER2_WANIP ipv4
    157 	fi
    158 }
    159 
    160 test_setup()
    161 {
    162 	inner=${1}
    163 	outer=${2}
    164 
    165 	router1_lan=""
    166 	router1_lan_mode=""
    167 	router2_lan=""
    168 	router2_lan_mode=""
    169 	if [ ${inner} = "ipv6" ]; then
    170 		router1_lan=$ROUTER1_LANIP6
    171 		router1_lan_mode="ipv6"
    172 		router2_lan=$ROUTER2_LANIP6
    173 		router2_lan_mode="ipv6"
    174 	else
    175 		router1_lan=$ROUTER1_LANIP
    176 		router1_lan_mode="ipv4"
    177 		router2_lan=$ROUTER2_LANIP
    178 		router2_lan_mode="ipv4"
    179 	fi
    180 	if [ ${outer} = "ipv6" ]; then
    181 		test_router $SOCK1 ${router1_lan} ${router1_lan_mode} \
    182 			$ROUTER1_WANIP6 ipv6
    183 		test_router $SOCK2 ${router2_lan} ${router2_lan_mode} \
    184 			$ROUTER2_WANIP6 ipv6
    185 	else
    186 		test_router $SOCK1 ${router1_lan} ${router1_lan_mode} \
    187 			$ROUTER1_WANIP ipv4
    188 		test_router $SOCK2 ${router2_lan} ${router2_lan_mode} \
    189 			$ROUTER2_WANIP ipv4
    190 	fi
    191 }
    192 
    193 setup_if_gif()
    194 {
    195 	sock=${1}
    196 	addr=${2}
    197 	remote=${3}
    198 	inner=${4}
    199 	src=${5}
    200 	dst=${6}
    201 	peernet=${7}
    202 
    203 	export RUMP_SERVER=${sock}
    204 	atf_check -s exit:0 rump.ifconfig gif0 create
    205 	atf_check -s exit:0 rump.ifconfig gif0 tunnel ${src} ${dst}
    206 	if [ ${inner} = "ipv6" ]; then
    207 		atf_check -s exit:0 rump.ifconfig gif0 inet6 ${addr}/128 ${remote}
    208 		atf_check -s exit:0 -o ignore rump.route add -inet6 ${peernet} ${addr}
    209 	else
    210 		atf_check -s exit:0 rump.ifconfig gif0 inet ${addr}/32 ${remote}
    211 		atf_check -s exit:0 -o ignore rump.route add -inet ${peernet} ${addr}
    212 	fi
    213 
    214 	rump.ifconfig gif0
    215 	rump.route -nL show
    216 }
    217 
    218 setup_tunnel()
    219 {
    220 	inner=${1}
    221 	outer=${2}
    222 
    223 	addr=""
    224 	remote=""
    225 	src=""
    226 	dst=""
    227 	peernet=""
    228 
    229 	if [ ${inner} = "ipv6" ]; then
    230 		addr=$ROUTER1_GIFIP6
    231 		remote=$ROUTER2_GIFIP6
    232 		peernet=$ROUTER2_LANNET6
    233 	else
    234 		addr=$ROUTER1_GIFIP
    235 		remote=$ROUTER2_GIFIP
    236 		peernet=$ROUTER2_LANNET
    237 	fi
    238 	if [ ${outer} = "ipv6" ]; then
    239 		src=$ROUTER1_WANIP6
    240 		dst=$ROUTER2_WANIP6
    241 	else
    242 		src=$ROUTER1_WANIP
    243 		dst=$ROUTER2_WANIP
    244 	fi
    245 	setup_if_gif $SOCK1 ${addr} ${remote} ${inner} \
    246 		     ${src} ${dst} ${peernet}
    247 
    248 	if [ $inner = "ipv6" ]; then
    249 		addr=$ROUTER2_GIFIP6
    250 		remote=$ROUTER1_GIFIP6
    251 		peernet=$ROUTER1_LANNET6
    252 	else
    253 		addr=$ROUTER2_GIFIP
    254 		remote=$ROUTER1_GIFIP
    255 		peernet=$ROUTER1_LANNET
    256 	fi
    257 	if [ $outer = "ipv6" ]; then
    258 		src=$ROUTER2_WANIP6
    259 		dst=$ROUTER1_WANIP6
    260 	else
    261 		src=$ROUTER2_WANIP
    262 		dst=$ROUTER1_WANIP
    263 	fi
    264 	setup_if_gif $SOCK2 ${addr} ${remote} ${inner} \
    265 		     ${src} ${dst} ${peernet}
    266 }
    267 
    268 test_setup_tunnel()
    269 {
    270 	mode=${1}
    271 
    272 	peernet=""
    273 	opt=""
    274 	if [ ${mode} = "ipv6" ]; then
    275 		peernet=$ROUTER2_LANNET6
    276 		opt="-inet6"
    277 	else
    278 		peernet=$ROUTER2_LANNET
    279 		opt="-inet"
    280 	fi
    281 	export RUMP_SERVER=$SOCK1
    282 	atf_check -s exit:0 -o match:gif0 rump.ifconfig
    283 	atf_check -s exit:0 -o match:gif0 rump.route -nL get ${opt} ${peernet}
    284 
    285 	if [ ${mode} = "ipv6" ]; then
    286 		peernet=$ROUTER1_LANNET6
    287 		opt="-inet6"
    288 	else
    289 		peernet=$ROUTER1_LANNET
    290 		opt="-inet"
    291 	fi
    292 	export RUMP_SERVER=$SOCK2
    293 	atf_check -s exit:0 -o match:gif0 rump.ifconfig
    294 	atf_check -s exit:0 -o match:gif0 rump.route -nL get ${opt} ${peernet}
    295 }
    296 
    297 teardown_tunnel()
    298 {
    299 	export RUMP_SERVER=$SOCK1
    300 	atf_check -s exit:0 rump.ifconfig gif0 deletetunnel
    301 	atf_check -s exit:0 rump.ifconfig gif0 destroy
    302 
    303 	export RUMP_SERVER=$SOCK2
    304 	atf_check -s exit:0 rump.ifconfig gif0 deletetunnel
    305 	atf_check -s exit:0 rump.ifconfig gif0 destroy
    306 }
    307 
    308 setup_dummy_if_gif()
    309 {
    310 	sock=${1}
    311 	addr=${2}
    312 	remote=${3}
    313 	inner=${4}
    314 	src=${5}
    315 	dst=${6}
    316 
    317 	export RUMP_SERVER=${sock}
    318 	atf_check -s exit:0 rump.ifconfig gif1 create
    319 	atf_check -s exit:0 rump.ifconfig gif1 tunnel ${src} ${dst}
    320 	if [ ${inner} = "ipv6" ]; then
    321 		atf_check -s exit:0 rump.ifconfig gif1 inet6 ${addr}/128 ${remote}
    322 	else
    323 		atf_check -s exit:0 rump.ifconfig gif1 inet ${addr}/32 ${remote}
    324 	fi
    325 
    326 	rump.ifconfig gif1
    327 }
    328 
    329 setup_dummy_tunnel()
    330 {
    331 	inner=${1}
    332 	outer=${2}
    333 
    334 	addr=""
    335 	remote=""
    336 	src=""
    337 	dst=""
    338 
    339 	if [ ${inner} = "ipv6" ]; then
    340 		addr=$ROUTER1_GIFIP6_DUMMY
    341 		remote=$ROUTER2_GIFIP6_DUMMY
    342 	else
    343 		addr=$ROUTER1_GIFIP_DUMMY
    344 		remote=$ROUTER2_GIFIP_DUMMY
    345 	fi
    346 	if [ ${outer} = "ipv6" ]; then
    347 		src=$ROUTER1_WANIP6_DUMMY
    348 		dst=$ROUTER2_WANIP6_DUMMY
    349 	else
    350 		src=$ROUTER1_WANIP_DUMMY
    351 		dst=$ROUTER2_WANIP_DUMMY
    352 	fi
    353 	setup_dummy_if_gif $SOCK1 ${addr} ${remote} ${inner} \
    354 			   ${src} ${dst}
    355 
    356 	if [ $inner = "ipv6" ]; then
    357 		addr=$ROUTER2_GIFIP6_DUMMY
    358 		remote=$ROUTER1_GIFIP6_DUMMY
    359 	else
    360 		addr=$ROUTER2_GIFIP_DUMMY
    361 		remote=$ROUTER1_GIFIP_DUMMY
    362 	fi
    363 	if [ $outer = "ipv6" ]; then
    364 		src=$ROUTER2_WANIP6_DUMMY
    365 		dst=$ROUTER1_WANIP6_DUMMY
    366 	else
    367 		src=$ROUTER2_WANIP_DUMMY
    368 		dst=$ROUTER1_WANIP_DUMMY
    369 	fi
    370 	setup_dummy_if_gif $SOCK2 ${addr} ${remote} ${inner} \
    371 			   ${src} ${dst}
    372 }
    373 
    374 test_setup_dummy_tunnel()
    375 {
    376 	export RUMP_SERVER=$SOCK1
    377 	atf_check -s exit:0 -o match:gif1 rump.ifconfig
    378 
    379 	export RUMP_SERVER=$SOCK2
    380 	atf_check -s exit:0 -o match:gif1 rump.ifconfig
    381 }
    382 
    383 teardown_dummy_tunnel()
    384 {
    385 	export RUMP_SERVER=$SOCK1
    386 	atf_check -s exit:0 rump.ifconfig gif1 deletetunnel
    387 	atf_check -s exit:0 rump.ifconfig gif1 destroy
    388 
    389 	export RUMP_SERVER=$SOCK2
    390 	atf_check -s exit:0 rump.ifconfig gif1 deletetunnel
    391 	atf_check -s exit:0 rump.ifconfig gif1 destroy
    392 }
    393 
    394 setup_recursive_if_gif()
    395 {
    396 	sock=${1}
    397 	gif=${2}
    398 	addr=${3}
    399 	remote=${4}
    400 	inner=${5}
    401 	src=${6}
    402 	dst=${7}
    403 
    404 	export RUMP_SERVER=${sock}
    405 	atf_check -s exit:0 rump.ifconfig ${gif} create
    406 	atf_check -s exit:0 rump.ifconfig ${gif} tunnel ${src} ${dst}
    407 	if [ ${inner} = "ipv6" ]; then
    408 		atf_check -s exit:0 rump.ifconfig ${gif} inet6 ${addr}/128 ${remote}
    409 	else
    410 		atf_check -s exit:0 rump.ifconfig ${gif} inet ${addr}/32 ${remote}
    411 	fi
    412 
    413 	rump.ifconfig ${gif}
    414 }
    415 
    416 # test in ROUTER1 only
    417 setup_recursive_tunnels()
    418 {
    419 	mode=${1}
    420 
    421 	addr=""
    422 	remote=""
    423 	src=""
    424 	dst=""
    425 
    426 	if [ ${mode} = "ipv6" ]; then
    427 		addr=$ROUTER1_GIFIP6_RECURSIVE1
    428 		remote=$ROUTER2_GIFIP6_RECURSIVE1
    429 		src=$ROUTER1_GIFIP6
    430 		dst=$ROUTER2_GIFIP6
    431 	else
    432 		addr=$ROUTER1_GIFIP_RECURSIVE1
    433 		remote=$ROUTER2_GIFIP_RECURSIVE1
    434 		src=$ROUTER1_GIFIP
    435 		dst=$ROUTER2_GIFIP
    436 	fi
    437 	setup_recursive_if_gif $SOCK1 gif1 ${addr} ${remote} ${mode} \
    438 		      ${src} ${dst}
    439 
    440 	if [ ${mode} = "ipv6" ]; then
    441 		addr=$ROUTER1_GIFIP6_RECURSIVE2
    442 		remote=$ROUTER2_GIFIP6_RECURSIVE2
    443 		src=$ROUTER1_GIFIP6_RECURSIVE1
    444 		dst=$ROUTER2_GIFIP6_RECURSIVE1
    445 	else
    446 		addr=$ROUTER1_GIFIP_RECURSIVE2
    447 		remote=$ROUTER2_GIFIP_RECURSIVE2
    448 		src=$ROUTER1_GIFIP_RECURSIVE1
    449 		dst=$ROUTER2_GIFIP_RECURSIVE1
    450 	fi
    451 	setup_recursive_if_gif $SOCK1 gif2 ${addr} ${remote} ${mode} \
    452 		      ${src} ${dst}
    453 }
    454 
    455 # test in router1 only
    456 test_recursive_check()
    457 {
    458 	mode=$1
    459 
    460 	export RUMP_SERVER=$SOCK1
    461 	if [ ${mode} = "ipv6" ]; then
    462 		atf_check -s not-exit:0 -o ignore -e ignore \
    463 			rump.ping6 -n -X $TIMEOUT -c 1 $ROUTER2_GIFIP6_RECURSIVE2
    464 	else
    465 		atf_check -s not-exit:0 -o ignore -e ignore \
    466 			rump.ping -n -w $TIMEOUT -c 1 $ROUTER2_GIFIP_RECURSIVE2
    467 	fi
    468 
    469 	atf_check -o match:'gif0: recursively called too many times' \
    470 		-x "$HIJACKING dmesg"
    471 
    472 	$HIJACKING dmesg
    473 }
    474 
    475 teardown_recursive_tunnels()
    476 {
    477 	export RUMP_SERVER=$SOCK1
    478 	atf_check -s exit:0 rump.ifconfig gif1 deletetunnel
    479 	atf_check -s exit:0 rump.ifconfig gif1 destroy
    480 	atf_check -s exit:0 rump.ifconfig gif2 deletetunnel
    481 	atf_check -s exit:0 rump.ifconfig gif2 destroy
    482 }
    483 
    484 cleanup()
    485 {
    486 	env RUMP_SERVER=$SOCK1 rump.halt
    487 	env RUMP_SERVER=$SOCK2 rump.halt
    488 }
    489 
    490 dump_bus()
    491 {
    492 	/usr/bin/shmif_dumpbus -p - bus0 2>/dev/null| /usr/sbin/tcpdump -n -e -r -
    493 	/usr/bin/shmif_dumpbus -p - bus1 2>/dev/null| /usr/sbin/tcpdump -n -e -r -
    494 }
    495 
    496 test_ping_failure()
    497 {
    498 	mode=$1
    499 
    500 	export RUMP_SERVER=$SOCK1
    501 	if [ ${mode} = "ipv6" ]; then
    502 		atf_check -s not-exit:0 -o ignore -e ignore \
    503 			rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER1_LANIP6 \
    504 			$ROUTER2_LANIP6
    505 	else
    506 		atf_check -s not-exit:0 -o ignore -e ignore \
    507 			rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER1_LANIP \
    508 			$ROUTER2_LANIP
    509 	fi
    510 
    511 	export RUMP_SERVER=$SOCK2
    512 	if [ ${mode} = "ipv6" ]; then
    513 		atf_check -s not-exit:0 -o ignore -e ignore \
    514 			rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER2_LANIP6 \
    515 			$ROUTER1_LANIP6
    516 	else
    517 		atf_check -s not-exit:0 -o ignore -e ignore \
    518 			rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER1_LANIP \
    519 			$ROUTER2_LANIP
    520 	fi
    521 }
    522 
    523 test_ping_success()
    524 {
    525 	mode=$1
    526 
    527 	export RUMP_SERVER=$SOCK1
    528 	rump.ifconfig -v gif0
    529 	if [ ${mode} = "ipv6" ]; then
    530 		# XXX
    531 		# rump.ping6 rarely fails with the message that
    532 		# "failed to get receiving hop limit".
    533 		# This is a known issue being analyzed.
    534 		atf_check -s exit:0 -o ignore \
    535 			rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER1_LANIP6 \
    536 			$ROUTER2_LANIP6
    537 	else
    538 		atf_check -s exit:0 -o ignore \
    539 			rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER1_LANIP \
    540 			$ROUTER2_LANIP
    541 	fi
    542 	rump.ifconfig -v gif0
    543 
    544 	export RUMP_SERVER=$SOCK2
    545 	rump.ifconfig -v gif0
    546 	if [ ${mode} = "ipv6" ]; then
    547 		atf_check -s exit:0 -o ignore \
    548 			rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER2_LANIP6 \
    549 			$ROUTER1_LANIP6
    550 	else
    551 		atf_check -s exit:0 -o ignore \
    552 			rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER2_LANIP \
    553 			$ROUTER1_LANIP
    554 	fi
    555 	rump.ifconfig -v gif0
    556 }
    557 
    558 test_change_tunnel_duplicate()
    559 {
    560 	mode=$1
    561 
    562 	newsrc=""
    563 	newdst=""
    564 	if [ ${mode} = "ipv6" ]; then
    565 		newsrc=$ROUTER1_WANIP6_DUMMY
    566 		newdst=$ROUTER2_WANIP6_DUMMY
    567 	else
    568 		newsrc=$ROUTER1_WANIP_DUMMY
    569 		newdst=$ROUTER2_WANIP_DUMMY
    570 	fi
    571 	export RUMP_SERVER=$SOCK1
    572 	rump.ifconfig -v gif0
    573 	rump.ifconfig -v gif1
    574 	atf_check -s exit:0 -e match:SIOCSLIFPHYADDR \
    575 		rump.ifconfig gif0 tunnel ${newsrc} ${newdst}
    576 	rump.ifconfig -v gif0
    577 	rump.ifconfig -v gif1
    578 
    579 	if [ ${mode} = "ipv6" ]; then
    580 		newsrc=$ROUTER2_WANIP6_DUMMY
    581 		newdst=$ROUTER1_WANIP6_DUMMY
    582 	else
    583 		newsrc=$ROUTER2_WANIP_DUMMY
    584 		newdst=$ROUTER1_WANIP_DUMMY
    585 	fi
    586 	export RUMP_SERVER=$SOCK2
    587 	rump.ifconfig -v gif0
    588 	rump.ifconfig -v gif1
    589 	atf_check -s exit:0 -e match:SIOCSLIFPHYADDR \
    590 		rump.ifconfig gif0 tunnel ${newsrc} ${newdst}
    591 	rump.ifconfig -v gif0
    592 	rump.ifconfig -v gif1
    593 }
    594 
    595 test_change_tunnel_success()
    596 {
    597 	mode=$1
    598 
    599 	newsrc=""
    600 	newdst=""
    601 	if [ ${mode} = "ipv6" ]; then
    602 		newsrc=$ROUTER1_WANIP6_DUMMY
    603 		newdst=$ROUTER2_WANIP6_DUMMY
    604 	else
    605 		newsrc=$ROUTER1_WANIP_DUMMY
    606 		newdst=$ROUTER2_WANIP_DUMMY
    607 	fi
    608 	export RUMP_SERVER=$SOCK1
    609 	rump.ifconfig -v gif0
    610 	atf_check -s exit:0 \
    611 		rump.ifconfig gif0 tunnel ${newsrc} ${newdst}
    612 	rump.ifconfig -v gif0
    613 
    614 	if [ ${mode} = "ipv6" ]; then
    615 		newsrc=$ROUTER2_WANIP6_DUMMY
    616 		newdst=$ROUTER1_WANIP6_DUMMY
    617 	else
    618 		newsrc=$ROUTER2_WANIP_DUMMY
    619 		newdst=$ROUTER1_WANIP_DUMMY
    620 	fi
    621 	export RUMP_SERVER=$SOCK2
    622 	rump.ifconfig -v gif0
    623 	atf_check -s exit:0 \
    624 		rump.ifconfig gif0 tunnel ${newsrc} ${newdst}
    625 	rump.ifconfig -v gif0
    626 }
    627 
    628 basic_setup()
    629 {
    630 	inner=$1
    631 	outer=$2
    632 
    633 	setup ${inner} ${outer}
    634 	test_setup ${inner} ${outer}
    635 
    636 	# Enable once PR kern/49219 is fixed
    637 	#test_ping_failure
    638 
    639 	setup_tunnel ${inner} ${outer}
    640 	sleep 1
    641 	test_setup_tunnel ${inner}
    642 }
    643 
    644 basic_test()
    645 {
    646 	inner=$1
    647 	outer=$2 # not use
    648 
    649 	test_ping_success ${inner}
    650 }
    651 
    652 basic_teardown()
    653 {
    654 	inner=$1
    655 	outer=$2 # not use
    656 
    657 	teardown_tunnel
    658 	test_ping_failure ${inner}
    659 }
    660 
    661 ioctl_setup()
    662 {
    663 	inner=$1
    664 	outer=$2
    665 
    666 	setup ${inner} ${outer}
    667 	test_setup ${inner} ${outer}
    668 
    669 	# Enable once PR kern/49219 is fixed
    670 	#test_ping_failure
    671 
    672 	setup_tunnel ${inner} ${outer}
    673 	setup_dummy_tunnel ${inner} ${outer}
    674 	sleep 1
    675 	test_setup_tunnel ${inner}
    676 }
    677 
    678 ioctl_test()
    679 {
    680 	inner=$1
    681 	outer=$2
    682 
    683 	test_ping_success ${inner}
    684 
    685 	test_change_tunnel_duplicate ${outer}
    686 
    687 	teardown_dummy_tunnel
    688 	test_change_tunnel_success ${outer}
    689 }
    690 
    691 ioctl_teardown()
    692 {
    693 	inner=$1
    694 	outer=$2 # not use
    695 
    696 	teardown_tunnel
    697 	test_ping_failure ${inner}
    698 }
    699 
    700 recursive_setup()
    701 {
    702 	inner=$1
    703 	outer=$2
    704 
    705 	setup ${inner} ${outer}
    706 	test_setup ${inner} ${outer}
    707 
    708 	# Enable once PR kern/49219 is fixed
    709 	#test_ping_failure
    710 
    711 	setup_tunnel ${inner} ${outer}
    712 	setup_recursive_tunnels ${inner}
    713 	sleep 1
    714 	test_setup_tunnel ${inner}
    715 }
    716 
    717 recursive_test()
    718 {
    719 	inner=$1
    720 	outer=$2 # not use
    721 
    722 	test_recursive_check ${inner}
    723 }
    724 
    725 recursive_teardown()
    726 {
    727 	inner=$1 # not use
    728 	outer=$2 # not use
    729 
    730 	teardown_recursive_tunnels
    731 	teardown_tunnel
    732 }
    733 
    734 add_test()
    735 {
    736 	category=$1
    737 	desc=$2
    738 	inner=$3
    739 	outer=$4
    740 
    741 	name="gif_${category}_${inner}over${outer}"
    742 	fulldesc="Does ${inner} over ${outer} if_gif ${desc}"
    743 
    744 	atf_test_case ${name} cleanup
    745 	eval "${name}_head() { \
    746 			atf_set \"descr\" \"${fulldesc}\"; \
    747 			atf_set \"require.progs\" \"rump_server\"; \
    748 		}; \
    749 	    ${name}_body() { \
    750 			${category}_setup ${inner} ${outer}; \
    751 			${category}_test ${inner} ${outer}; \
    752 			${category}_teardown ${inner} ${outer}; \
    753 	    }; \
    754 	    ${name}_cleanup() { \
    755 			dump_bus; \
    756 			cleanup; \
    757 		}"
    758 	atf_add_test_case ${name}
    759 }
    760 
    761 add_test_allproto()
    762 {
    763 	category=$1
    764 	desc=$2
    765 
    766 	add_test ${category} "${desc}" ipv4 ipv4
    767 	add_test ${category} "${desc}" ipv4 ipv6
    768 	add_test ${category} "${desc}" ipv6 ipv4
    769 	add_test ${category} "${desc}" ipv6 ipv6
    770 }
    771 
    772 atf_init_test_cases()
    773 {
    774 	add_test_allproto basic "basic tests"
    775 	add_test_allproto ioctl "ioctl tests"
    776 	add_test_allproto recursive "recursive check tests"
    777 }
    778