# $NetBSD: t_gif.sh,v 1.9 2016/12/21 09:46:39 ozaki-r Exp $ # # Copyright (c) 2015 Internet Initiative Japan Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # setglobal SOCK1 = 'unix://commsock1' # for ROUTER1 setglobal SOCK2 = 'unix://commsock2' # for ROUTER2 setglobal ROUTER1_LANIP = '192.168.1.1' setglobal ROUTER1_LANNET = '192.168.1.0/24' setglobal ROUTER1_WANIP = '10.0.0.1' setglobal ROUTER1_GIFIP = '172.16.1.1' setglobal ROUTER1_WANIP_DUMMY = '10.0.0.11' setglobal ROUTER1_GIFIP_DUMMY = '172.16.11.1' setglobal ROUTER1_GIFIP_RECURSIVE1 = '172.16.101.1' setglobal ROUTER1_GIFIP_RECURSIVE2 = '172.16.201.1' setglobal ROUTER2_LANIP = '192.168.2.1' setglobal ROUTER2_LANNET = '192.168.2.0/24' setglobal ROUTER2_WANIP = '10.0.0.2' setglobal ROUTER2_GIFIP = '172.16.2.1' setglobal ROUTER2_WANIP_DUMMY = '10.0.0.12' setglobal ROUTER2_GIFIP_DUMMY = '172.16.12.1' setglobal ROUTER2_GIFIP_RECURSIVE1 = '172.16.102.1' setglobal ROUTER2_GIFIP_RECURSIVE2 = '172.16.202.1' setglobal ROUTER1_LANIP6 = 'fc00:1::1' setglobal ROUTER1_LANNET6 = 'fc00:1::/64' setglobal ROUTER1_WANIP6 = 'fc00::1' setglobal ROUTER1_GIFIP6 = 'fc00:3::1' setglobal ROUTER1_WANIP6_DUMMY = 'fc00::11' setglobal ROUTER1_GIFIP6_DUMMY = 'fc00:13::1' setglobal ROUTER1_GIFIP6_RECURSIVE1 = 'fc00:103::1' setglobal ROUTER1_GIFIP6_RECURSIVE2 = 'fc00:203::1' setglobal ROUTER2_LANIP6 = 'fc00:2::1' setglobal ROUTER2_LANNET6 = 'fc00:2::/64' setglobal ROUTER2_WANIP6 = 'fc00::2' setglobal ROUTER2_GIFIP6 = 'fc00:4::1' setglobal ROUTER2_WANIP6_DUMMY = 'fc00::12' setglobal ROUTER2_GIFIP6_DUMMY = 'fc00:14::1' setglobal ROUTER2_GIFIP6_RECURSIVE1 = 'fc00:104::1' setglobal ROUTER2_GIFIP6_RECURSIVE2 = 'fc00:204::1' setglobal DEBUG = $(DEBUG:-true) setglobal TIMEOUT = '5' proc setup_router { setglobal sock = $(1) setglobal lan = $(2) setglobal lan_mode = $(3) setglobal wan = $(4) setglobal wan_mode = $(5) rump_server_add_iface $sock shmif0 bus0 rump_server_add_iface $sock shmif1 bus1 export RUMP_SERVER=$(sock) if test $(lan_mode) = "ipv6" { atf_check -s exit:0 rump.ifconfig shmif0 inet6 $(lan) } else { atf_check -s exit:0 rump.ifconfig shmif0 inet $(lan) netmask 0xffffff00 } atf_check -s exit:0 rump.ifconfig shmif0 up rump.ifconfig shmif0 if test $(wan_mode) = "ipv6" { atf_check -s exit:0 rump.ifconfig shmif1 inet6 $(wan) } else { atf_check -s exit:0 rump.ifconfig shmif1 inet $(wan) netmask 0xff000000 } atf_check -s exit:0 rump.ifconfig shmif1 up rump.ifconfig shmif1 } proc test_router { setglobal sock = $(1) setglobal lan = $(2) setglobal lan_mode = $(3) setglobal wan = $(4) setglobal wan_mode = $(5) export RUMP_SERVER=$(sock) atf_check -s exit:0 -o match:shmif0 rump.ifconfig if test $(lan_mode) = "ipv6" { atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT $(lan) } else { atf_check -s exit:0 -o ignore rump.ping -n -c 1 -w $TIMEOUT $(lan) } atf_check -s exit:0 -o match:shmif1 rump.ifconfig if test $(wan_mode) = "ipv6" { atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT $(wan) } else { atf_check -s exit:0 -o ignore rump.ping -n -c 1 -w $TIMEOUT $(wan) } } proc setup { setglobal inner = $(1) setglobal outer = $(2) rump_server_start $SOCK1 netinet6 gif rump_server_start $SOCK2 netinet6 gif setglobal router1_lan = ''"" setglobal router1_lan_mode = ''"" setglobal router2_lan = ''"" setglobal router2_lan_mode = ''"" if test $(inner) = "ipv6" { setglobal router1_lan = $ROUTER1_LANIP6 setglobal router1_lan_mode = '"ipv6'" setglobal router2_lan = $ROUTER2_LANIP6 setglobal router2_lan_mode = '"ipv6'" } else { setglobal router1_lan = $ROUTER1_LANIP setglobal router1_lan_mode = '"ipv4'" setglobal router2_lan = $ROUTER2_LANIP setglobal router2_lan_mode = '"ipv4'" } if test $(outer) = "ipv6" { setup_router $SOCK1 $(router1_lan) $(router1_lan_mode) \ $ROUTER1_WANIP6 ipv6 setup_router $SOCK2 $(router2_lan) $(router2_lan_mode) \ $ROUTER2_WANIP6 ipv6 } else { setup_router $SOCK1 $(router1_lan) $(router1_lan_mode) \ $ROUTER1_WANIP ipv4 setup_router $SOCK2 $(router2_lan) $(router2_lan_mode) \ $ROUTER2_WANIP ipv4 } } proc test_setup { setglobal inner = $(1) setglobal outer = $(2) setglobal router1_lan = ''"" setglobal router1_lan_mode = ''"" setglobal router2_lan = ''"" setglobal router2_lan_mode = ''"" if test $(inner) = "ipv6" { setglobal router1_lan = $ROUTER1_LANIP6 setglobal router1_lan_mode = '"ipv6'" setglobal router2_lan = $ROUTER2_LANIP6 setglobal router2_lan_mode = '"ipv6'" } else { setglobal router1_lan = $ROUTER1_LANIP setglobal router1_lan_mode = '"ipv4'" setglobal router2_lan = $ROUTER2_LANIP setglobal router2_lan_mode = '"ipv4'" } if test $(outer) = "ipv6" { test_router $SOCK1 $(router1_lan) $(router1_lan_mode) \ $ROUTER1_WANIP6 ipv6 test_router $SOCK2 $(router2_lan) $(router2_lan_mode) \ $ROUTER2_WANIP6 ipv6 } else { test_router $SOCK1 $(router1_lan) $(router1_lan_mode) \ $ROUTER1_WANIP ipv4 test_router $SOCK2 $(router2_lan) $(router2_lan_mode) \ $ROUTER2_WANIP ipv4 } } proc setup_if_gif { setglobal sock = $(1) setglobal addr = $(2) setglobal remote = $(3) setglobal inner = $(4) setglobal src = $(5) setglobal dst = $(6) setglobal peernet = $(7) export RUMP_SERVER=$(sock) atf_check -s exit:0 rump.ifconfig gif0 create atf_check -s exit:0 rump.ifconfig gif0 tunnel $(src) $(dst) if test $(inner) = "ipv6" { atf_check -s exit:0 rump.ifconfig gif0 inet6 $(addr)/128 $(remote) atf_check -s exit:0 -o ignore rump.route add -inet6 $(peernet) $(addr) } else { atf_check -s exit:0 rump.ifconfig gif0 inet $(addr)/32 $(remote) atf_check -s exit:0 -o ignore rump.route add -inet $(peernet) $(addr) } rump.ifconfig gif0 rump.route -nL show } proc setup_tunnel { setglobal inner = $(1) setglobal outer = $(2) setglobal addr = ''"" setglobal remote = ''"" setglobal src = ''"" setglobal dst = ''"" setglobal peernet = ''"" if test $(inner) = "ipv6" { setglobal addr = $ROUTER1_GIFIP6 setglobal remote = $ROUTER2_GIFIP6 setglobal peernet = $ROUTER2_LANNET6 } else { setglobal addr = $ROUTER1_GIFIP setglobal remote = $ROUTER2_GIFIP setglobal peernet = $ROUTER2_LANNET } if test $(outer) = "ipv6" { setglobal src = $ROUTER1_WANIP6 setglobal dst = $ROUTER2_WANIP6 } else { setglobal src = $ROUTER1_WANIP setglobal dst = $ROUTER2_WANIP } setup_if_gif $SOCK1 $(addr) $(remote) $(inner) \ $(src) $(dst) $(peernet) if test $inner = "ipv6" { setglobal addr = $ROUTER2_GIFIP6 setglobal remote = $ROUTER1_GIFIP6 setglobal peernet = $ROUTER1_LANNET6 } else { setglobal addr = $ROUTER2_GIFIP setglobal remote = $ROUTER1_GIFIP setglobal peernet = $ROUTER1_LANNET } if test $outer = "ipv6" { setglobal src = $ROUTER2_WANIP6 setglobal dst = $ROUTER1_WANIP6 } else { setglobal src = $ROUTER2_WANIP setglobal dst = $ROUTER1_WANIP } setup_if_gif $SOCK2 $(addr) $(remote) $(inner) \ $(src) $(dst) $(peernet) } proc test_setup_tunnel { setglobal mode = $(1) setglobal peernet = ''"" setglobal opt = ''"" if test $(mode) = "ipv6" { setglobal peernet = $ROUTER2_LANNET6 setglobal opt = '"-inet6'" } else { setglobal peernet = $ROUTER2_LANNET setglobal opt = '"-inet'" } export RUMP_SERVER=$SOCK1 atf_check -s exit:0 -o match:gif0 rump.ifconfig atf_check -s exit:0 -o match:gif0 rump.route -nL get $(opt) $(peernet) if test $(mode) = "ipv6" { setglobal peernet = $ROUTER1_LANNET6 setglobal opt = '"-inet6'" } else { setglobal peernet = $ROUTER1_LANNET setglobal opt = '"-inet'" } export RUMP_SERVER=$SOCK2 atf_check -s exit:0 -o match:gif0 rump.ifconfig atf_check -s exit:0 -o match:gif0 rump.route -nL get $(opt) $(peernet) } proc teardown_tunnel { export RUMP_SERVER=$SOCK1 atf_check -s exit:0 rump.ifconfig gif0 deletetunnel atf_check -s exit:0 rump.ifconfig gif0 destroy export RUMP_SERVER=$SOCK2 atf_check -s exit:0 rump.ifconfig gif0 deletetunnel atf_check -s exit:0 rump.ifconfig gif0 destroy } proc setup_dummy_if_gif { setglobal sock = $(1) setglobal addr = $(2) setglobal remote = $(3) setglobal inner = $(4) setglobal src = $(5) setglobal dst = $(6) export RUMP_SERVER=$(sock) atf_check -s exit:0 rump.ifconfig gif1 create atf_check -s exit:0 rump.ifconfig gif1 tunnel $(src) $(dst) if test $(inner) = "ipv6" { atf_check -s exit:0 rump.ifconfig gif1 inet6 $(addr)/128 $(remote) } else { atf_check -s exit:0 rump.ifconfig gif1 inet $(addr)/32 $(remote) } rump.ifconfig gif1 } proc setup_dummy_tunnel { setglobal inner = $(1) setglobal outer = $(2) setglobal addr = ''"" setglobal remote = ''"" setglobal src = ''"" setglobal dst = ''"" if test $(inner) = "ipv6" { setglobal addr = $ROUTER1_GIFIP6_DUMMY setglobal remote = $ROUTER2_GIFIP6_DUMMY } else { setglobal addr = $ROUTER1_GIFIP_DUMMY setglobal remote = $ROUTER2_GIFIP_DUMMY } if test $(outer) = "ipv6" { setglobal src = $ROUTER1_WANIP6_DUMMY setglobal dst = $ROUTER2_WANIP6_DUMMY } else { setglobal src = $ROUTER1_WANIP_DUMMY setglobal dst = $ROUTER2_WANIP_DUMMY } setup_dummy_if_gif $SOCK1 $(addr) $(remote) $(inner) \ $(src) $(dst) if test $inner = "ipv6" { setglobal addr = $ROUTER2_GIFIP6_DUMMY setglobal remote = $ROUTER1_GIFIP6_DUMMY } else { setglobal addr = $ROUTER2_GIFIP_DUMMY setglobal remote = $ROUTER1_GIFIP_DUMMY } if test $outer = "ipv6" { setglobal src = $ROUTER2_WANIP6_DUMMY setglobal dst = $ROUTER1_WANIP6_DUMMY } else { setglobal src = $ROUTER2_WANIP_DUMMY setglobal dst = $ROUTER1_WANIP_DUMMY } setup_dummy_if_gif $SOCK2 $(addr) $(remote) $(inner) \ $(src) $(dst) } proc test_setup_dummy_tunnel { export RUMP_SERVER=$SOCK1 atf_check -s exit:0 -o match:gif1 rump.ifconfig export RUMP_SERVER=$SOCK2 atf_check -s exit:0 -o match:gif1 rump.ifconfig } proc teardown_dummy_tunnel { export RUMP_SERVER=$SOCK1 atf_check -s exit:0 rump.ifconfig gif1 deletetunnel atf_check -s exit:0 rump.ifconfig gif1 destroy export RUMP_SERVER=$SOCK2 atf_check -s exit:0 rump.ifconfig gif1 deletetunnel atf_check -s exit:0 rump.ifconfig gif1 destroy } proc setup_recursive_if_gif { setglobal sock = $(1) setglobal gif = $(2) setglobal addr = $(3) setglobal remote = $(4) setglobal inner = $(5) setglobal src = $(6) setglobal dst = $(7) export RUMP_SERVER=$(sock) atf_check -s exit:0 rump.ifconfig $(gif) create atf_check -s exit:0 rump.ifconfig $(gif) tunnel $(src) $(dst) if test $(inner) = "ipv6" { atf_check -s exit:0 rump.ifconfig $(gif) inet6 $(addr)/128 $(remote) } else { atf_check -s exit:0 rump.ifconfig $(gif) inet $(addr)/32 $(remote) } rump.ifconfig $(gif) } # test in ROUTER1 only proc setup_recursive_tunnels { setglobal mode = $(1) setglobal addr = ''"" setglobal remote = ''"" setglobal src = ''"" setglobal dst = ''"" if test $(mode) = "ipv6" { setglobal addr = $ROUTER1_GIFIP6_RECURSIVE1 setglobal remote = $ROUTER2_GIFIP6_RECURSIVE1 setglobal src = $ROUTER1_GIFIP6 setglobal dst = $ROUTER2_GIFIP6 } else { setglobal addr = $ROUTER1_GIFIP_RECURSIVE1 setglobal remote = $ROUTER2_GIFIP_RECURSIVE1 setglobal src = $ROUTER1_GIFIP setglobal dst = $ROUTER2_GIFIP } setup_recursive_if_gif $SOCK1 gif1 $(addr) $(remote) $(mode) \ $(src) $(dst) if test $(mode) = "ipv6" { setglobal addr = $ROUTER1_GIFIP6_RECURSIVE2 setglobal remote = $ROUTER2_GIFIP6_RECURSIVE2 setglobal src = $ROUTER1_GIFIP6_RECURSIVE1 setglobal dst = $ROUTER2_GIFIP6_RECURSIVE1 } else { setglobal addr = $ROUTER1_GIFIP_RECURSIVE2 setglobal remote = $ROUTER2_GIFIP_RECURSIVE2 setglobal src = $ROUTER1_GIFIP_RECURSIVE1 setglobal dst = $ROUTER2_GIFIP_RECURSIVE1 } setup_recursive_if_gif $SOCK1 gif2 $(addr) $(remote) $(mode) \ $(src) $(dst) } # test in router1 only proc test_recursive_check { setglobal mode = $1 export RUMP_SERVER=$SOCK1 if test $(mode) = "ipv6" { atf_check -s not-exit:0 -o ignore -e ignore \ rump.ping6 -n -X $TIMEOUT -c 1 $ROUTER2_GIFIP6_RECURSIVE2 } else { atf_check -s not-exit:0 -o ignore -e ignore \ rump.ping -n -w $TIMEOUT -c 1 $ROUTER2_GIFIP_RECURSIVE2 } atf_check -o match:'gif0: recursively called too many times' \ -x "$HIJACKING dmesg" $HIJACKING dmesg } proc teardown_recursive_tunnels { export RUMP_SERVER=$SOCK1 atf_check -s exit:0 rump.ifconfig gif1 deletetunnel atf_check -s exit:0 rump.ifconfig gif1 destroy atf_check -s exit:0 rump.ifconfig gif2 deletetunnel atf_check -s exit:0 rump.ifconfig gif2 destroy } proc test_ping_failure { setglobal mode = $1 export RUMP_SERVER=$SOCK1 if test $(mode) = "ipv6" { atf_check -s not-exit:0 -o ignore -e ignore \ rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER1_LANIP6 \ $ROUTER2_LANIP6 } else { atf_check -s not-exit:0 -o ignore -e ignore \ rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER1_LANIP \ $ROUTER2_LANIP } export RUMP_SERVER=$SOCK2 if test $(mode) = "ipv6" { atf_check -s not-exit:0 -o ignore -e ignore \ rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER2_LANIP6 \ $ROUTER1_LANIP6 } else { atf_check -s not-exit:0 -o ignore -e ignore \ rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER1_LANIP \ $ROUTER2_LANIP } } proc test_ping_success { setglobal mode = $1 export RUMP_SERVER=$SOCK1 rump.ifconfig -v gif0 if test $(mode) = "ipv6" { # XXX # rump.ping6 rarely fails with the message that # "failed to get receiving hop limit". # This is a known issue being analyzed. atf_check -s exit:0 -o ignore \ rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER1_LANIP6 \ $ROUTER2_LANIP6 } else { atf_check -s exit:0 -o ignore \ rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER1_LANIP \ $ROUTER2_LANIP } rump.ifconfig -v gif0 export RUMP_SERVER=$SOCK2 rump.ifconfig -v gif0 if test $(mode) = "ipv6" { atf_check -s exit:0 -o ignore \ rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER2_LANIP6 \ $ROUTER1_LANIP6 } else { atf_check -s exit:0 -o ignore \ rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER2_LANIP \ $ROUTER1_LANIP } rump.ifconfig -v gif0 } proc test_change_tunnel_duplicate { setglobal mode = $1 setglobal newsrc = ''"" setglobal newdst = ''"" if test $(mode) = "ipv6" { setglobal newsrc = $ROUTER1_WANIP6_DUMMY setglobal newdst = $ROUTER2_WANIP6_DUMMY } else { setglobal newsrc = $ROUTER1_WANIP_DUMMY setglobal newdst = $ROUTER2_WANIP_DUMMY } export RUMP_SERVER=$SOCK1 rump.ifconfig -v gif0 rump.ifconfig -v gif1 atf_check -s exit:0 -e match:SIOCSLIFPHYADDR \ rump.ifconfig gif0 tunnel $(newsrc) $(newdst) rump.ifconfig -v gif0 rump.ifconfig -v gif1 if test $(mode) = "ipv6" { setglobal newsrc = $ROUTER2_WANIP6_DUMMY setglobal newdst = $ROUTER1_WANIP6_DUMMY } else { setglobal newsrc = $ROUTER2_WANIP_DUMMY setglobal newdst = $ROUTER1_WANIP_DUMMY } export RUMP_SERVER=$SOCK2 rump.ifconfig -v gif0 rump.ifconfig -v gif1 atf_check -s exit:0 -e match:SIOCSLIFPHYADDR \ rump.ifconfig gif0 tunnel $(newsrc) $(newdst) rump.ifconfig -v gif0 rump.ifconfig -v gif1 } proc test_change_tunnel_success { setglobal mode = $1 setglobal newsrc = ''"" setglobal newdst = ''"" if test $(mode) = "ipv6" { setglobal newsrc = $ROUTER1_WANIP6_DUMMY setglobal newdst = $ROUTER2_WANIP6_DUMMY } else { setglobal newsrc = $ROUTER1_WANIP_DUMMY setglobal newdst = $ROUTER2_WANIP_DUMMY } export RUMP_SERVER=$SOCK1 rump.ifconfig -v gif0 atf_check -s exit:0 \ rump.ifconfig gif0 tunnel $(newsrc) $(newdst) rump.ifconfig -v gif0 if test $(mode) = "ipv6" { setglobal newsrc = $ROUTER2_WANIP6_DUMMY setglobal newdst = $ROUTER1_WANIP6_DUMMY } else { setglobal newsrc = $ROUTER2_WANIP_DUMMY setglobal newdst = $ROUTER1_WANIP_DUMMY } export RUMP_SERVER=$SOCK2 rump.ifconfig -v gif0 atf_check -s exit:0 \ rump.ifconfig gif0 tunnel $(newsrc) $(newdst) rump.ifconfig -v gif0 } proc basic_setup { setglobal inner = $1 setglobal outer = $2 setup $(inner) $(outer) test_setup $(inner) $(outer) # Enable once PR kern/49219 is fixed #test_ping_failure setup_tunnel $(inner) $(outer) sleep 1 test_setup_tunnel $(inner) } proc basic_test { setglobal inner = $1 setglobal outer = $2 # not use test_ping_success $(inner) } proc basic_teardown { setglobal inner = $1 setglobal outer = $2 # not use teardown_tunnel test_ping_failure $(inner) } proc ioctl_setup { setglobal inner = $1 setglobal outer = $2 setup $(inner) $(outer) test_setup $(inner) $(outer) # Enable once PR kern/49219 is fixed #test_ping_failure setup_tunnel $(inner) $(outer) setup_dummy_tunnel $(inner) $(outer) sleep 1 test_setup_tunnel $(inner) } proc ioctl_test { setglobal inner = $1 setglobal outer = $2 test_ping_success $(inner) test_change_tunnel_duplicate $(outer) teardown_dummy_tunnel test_change_tunnel_success $(outer) } proc ioctl_teardown { setglobal inner = $1 setglobal outer = $2 # not use teardown_tunnel test_ping_failure $(inner) } proc recursive_setup { setglobal inner = $1 setglobal outer = $2 setup $(inner) $(outer) test_setup $(inner) $(outer) # Enable once PR kern/49219 is fixed #test_ping_failure setup_tunnel $(inner) $(outer) setup_recursive_tunnels $(inner) sleep 1 test_setup_tunnel $(inner) } proc recursive_test { setglobal inner = $1 setglobal outer = $2 # not use test_recursive_check $(inner) } proc recursive_teardown { setglobal inner = $1 # not use setglobal outer = $2 # not use teardown_recursive_tunnels teardown_tunnel } proc add_test { setglobal category = $1 setglobal desc = $2 setglobal inner = $3 setglobal outer = $4 setglobal name = ""gif_$(category)_$(inner)over$(outer)"" setglobal fulldesc = ""Does $(inner) over $(outer) if_gif $(desc)"" atf_test_case $(name) cleanup eval "$(name)_head() { \ atf_set \"descr\" \"$(fulldesc)\"; \ atf_set \"require.progs\" \"rump_server\"; \ }; \ $(name)_body() { \ $(category)_setup $(inner) $(outer); \ $(category)_test $(inner) $(outer); \ $(category)_teardown $(inner) $(outer); \ rump_server_destroy_ifaces; \ }; \ $(name)_cleanup() { \ $DEBUG && dump; \ cleanup; \ }" atf_add_test_case $(name) } proc add_test_allproto { setglobal category = $1 setglobal desc = $2 add_test $(category) $(desc) ipv4 ipv4 add_test $(category) $(desc) ipv4 ipv6 add_test $(category) $(desc) ipv6 ipv4 add_test $(category) $(desc) ipv6 ipv6 } proc atf_init_test_cases { add_test_allproto basic "basic tests" add_test_allproto ioctl "ioctl tests" add_test_allproto recursive "recursive check tests" }