Home | History | Annotate | Line # | Download | only in if_ipsec
t_ipsec.sh revision 1.3.4.1
      1 #	$NetBSD: t_ipsec.sh,v 1.3.4.1 2018/03/15 09:12:08 pgoyette Exp $
      2 #
      3 # Copyright (c) 2017 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 SOCK1=unix://commsock1 # for ROUTER1
     29 SOCK2=unix://commsock2 # for ROUTER2
     30 ROUTER1_LANIP=192.168.1.1
     31 ROUTER1_LANNET=192.168.1.0/24
     32 ROUTER1_WANIP=10.0.0.1
     33 ROUTER1_IPSECIP=172.16.1.1
     34 ROUTER1_WANIP_DUMMY=10.0.0.11
     35 ROUTER1_IPSECIP_DUMMY=172.16.11.1
     36 ROUTER1_IPSECIP_RECURSIVE1=172.16.101.1
     37 ROUTER1_IPSECIP_RECURSIVE2=172.16.201.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_IPSECIP=172.16.2.1
     42 ROUTER2_WANIP_DUMMY=10.0.0.12
     43 ROUTER2_IPSECIP_DUMMY=172.16.12.1
     44 ROUTER2_IPSECIP_RECURSIVE1=172.16.102.1
     45 ROUTER2_IPSECIP_RECURSIVE2=172.16.202.1
     46 
     47 ROUTER1_LANIP6=fc00:1::1
     48 ROUTER1_LANNET6=fc00:1::/64
     49 ROUTER1_WANIP6=fc00::1
     50 ROUTER1_IPSECIP6=fc00:3::1
     51 ROUTER1_WANIP6_DUMMY=fc00::11
     52 ROUTER1_IPSECIP6_DUMMY=fc00:13::1
     53 ROUTER1_IPSECIP6_RECURSIVE1=fc00:103::1
     54 ROUTER1_IPSECIP6_RECURSIVE2=fc00:203::1
     55 ROUTER2_LANIP6=fc00:2::1
     56 ROUTER2_LANNET6=fc00:2::/64
     57 ROUTER2_WANIP6=fc00::2
     58 ROUTER2_IPSECIP6=fc00:4::1
     59 ROUTER2_WANIP6_DUMMY=fc00::12
     60 ROUTER2_IPSECIP6_DUMMY=fc00:14::1
     61 ROUTER2_IPSECIP6_RECURSIVE1=fc00:104::1
     62 ROUTER2_IPSECIP6_RECURSIVE2=fc00:204::1
     63 
     64 DEBUG=${DEBUG:-false}
     65 TIMEOUT=7
     66 
     67 atf_test_case ipsecif_create_destroy cleanup
     68 ipsecif_create_destroy_head()
     69 {
     70 
     71 	atf_set "descr" "Test creating/destroying gif interfaces"
     72 	atf_set "require.progs" "rump_server"
     73 }
     74 
     75 ipsecif_create_destroy_body()
     76 {
     77 
     78 	rump_server_start $SOCK1 ipsec
     79 
     80 	test_create_destroy_common $SOCK1 ipsec0
     81 }
     82 
     83 ipsecif_create_destroy_cleanup()
     84 {
     85 
     86 	$DEBUG && dump
     87 	cleanup
     88 }
     89 
     90 setup_router()
     91 {
     92 	local sock=${1}
     93 	local lan=${2}
     94 	local lan_mode=${3}
     95 	local wan=${4}
     96 	local wan_mode=${5}
     97 
     98 	rump_server_add_iface $sock shmif0 bus0
     99 	rump_server_add_iface $sock shmif1 bus1
    100 
    101 	export RUMP_SERVER=${sock}
    102 	if [ ${lan_mode} = "ipv6" ]; then
    103 		atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${lan}
    104 	else
    105 		atf_check -s exit:0 rump.ifconfig shmif0 inet ${lan} netmask 0xffffff00
    106 	fi
    107 	atf_check -s exit:0 rump.ifconfig shmif0 up
    108 	rump.ifconfig shmif0
    109 
    110 	if [ ${wan_mode} = "ipv6" ]; then
    111 		atf_check -s exit:0 rump.ifconfig shmif1 inet6 ${wan}
    112 	else
    113 		atf_check -s exit:0 rump.ifconfig shmif1 inet ${wan} netmask 0xff000000
    114 	fi
    115 	atf_check -s exit:0 rump.ifconfig shmif1 up
    116 	rump.ifconfig shmif1
    117 	unset RUMP_SERVER
    118 }
    119 
    120 test_router()
    121 {
    122 	local sock=${1}
    123 	local lan=${2}
    124 	local lan_mode=${3}
    125 	local wan=${4}
    126 	local wan_mode=${5}
    127 
    128 	export RUMP_SERVER=${sock}
    129 	atf_check -s exit:0 -o match:shmif0 rump.ifconfig
    130 	if [ ${lan_mode} = "ipv6" ]; then
    131 		atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${lan}
    132 	else
    133 		atf_check -s exit:0 -o ignore rump.ping -n -c 1 -w $TIMEOUT ${lan}
    134 	fi
    135 
    136 	atf_check -s exit:0 -o match:shmif1 rump.ifconfig
    137 	if [ ${wan_mode} = "ipv6" ]; then
    138 		atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${wan}
    139 	else
    140 		atf_check -s exit:0 -o ignore rump.ping -n -c 1 -w $TIMEOUT ${wan}
    141 	fi
    142 	unset RUMP_SERVER
    143 }
    144 
    145 setup()
    146 {
    147 	local inner=${1}
    148 	local outer=${2}
    149 
    150 	rump_server_crypto_start $SOCK1 netipsec netinet6 ipsec
    151 	rump_server_crypto_start $SOCK2 netipsec netinet6 ipsec
    152 
    153 	router1_lan=""
    154 	router1_lan_mode=""
    155 	router2_lan=""
    156 	router2_lan_mode=""
    157 	if [ ${inner} = "ipv6" ]; then
    158 		router1_lan=$ROUTER1_LANIP6
    159 		router1_lan_mode="ipv6"
    160 		router2_lan=$ROUTER2_LANIP6
    161 		router2_lan_mode="ipv6"
    162 	else
    163 		router1_lan=$ROUTER1_LANIP
    164 		router1_lan_mode="ipv4"
    165 		router2_lan=$ROUTER2_LANIP
    166 		router2_lan_mode="ipv4"
    167 	fi
    168 
    169 	if [ ${outer} = "ipv6" ]; then
    170 		setup_router $SOCK1 ${router1_lan} ${router1_lan_mode} \
    171 			$ROUTER1_WANIP6 ipv6
    172 		setup_router $SOCK2 ${router2_lan} ${router2_lan_mode} \
    173 			$ROUTER2_WANIP6 ipv6
    174 	else
    175 		setup_router $SOCK1 ${router1_lan} ${router1_lan_mode} \
    176 			$ROUTER1_WANIP ipv4
    177 		setup_router $SOCK2 ${router2_lan} ${router2_lan_mode} \
    178 			$ROUTER2_WANIP ipv4
    179 	fi
    180 }
    181 
    182 test_setup()
    183 {
    184 	local inner=${1}
    185 	local outer=${2}
    186 
    187 	local router1_lan=""
    188 	local router1_lan_mode=""
    189 	local router2_lan=""
    190 	local router2_lan_mode=""
    191 	if [ ${inner} = "ipv6" ]; then
    192 		router1_lan=$ROUTER1_LANIP6
    193 		router1_lan_mode="ipv6"
    194 		router2_lan=$ROUTER2_LANIP6
    195 		router2_lan_mode="ipv6"
    196 	else
    197 		router1_lan=$ROUTER1_LANIP
    198 		router1_lan_mode="ipv4"
    199 		router2_lan=$ROUTER2_LANIP
    200 		router2_lan_mode="ipv4"
    201 	fi
    202 	if [ ${outer} = "ipv6" ]; then
    203 		test_router $SOCK1 ${router1_lan} ${router1_lan_mode} \
    204 			$ROUTER1_WANIP6 ipv6
    205 		test_router $SOCK2 ${router2_lan} ${router2_lan_mode} \
    206 			$ROUTER2_WANIP6 ipv6
    207 	else
    208 		test_router $SOCK1 ${router1_lan} ${router1_lan_mode} \
    209 			$ROUTER1_WANIP ipv4
    210 		test_router $SOCK2 ${router2_lan} ${router2_lan_mode} \
    211 			$ROUTER2_WANIP ipv4
    212 	fi
    213 }
    214 
    215 get_if_ipsec_unique()
    216 {
    217 	local sock=${1}
    218 	local src=${2}
    219 	local proto=${3}
    220 	local unique=""
    221 
    222 	export RUMP_SERVER=${sock}
    223 	unique=`$HIJACKING setkey -DP | grep -A2 "^${src}.*(${proto})$" | grep unique | sed 's/.*unique#//'`
    224 	unset RUMP_SERVER
    225 
    226 	echo $unique
    227 }
    228 
    229 setup_if_ipsec()
    230 {
    231 	local sock=${1}
    232 	local addr=${2}
    233 	local remote=${3}
    234 	local inner=${4}
    235 	local src=${5}
    236 	local dst=${6}
    237 	local peernet=${7}
    238 
    239 	export RUMP_SERVER=${sock}
    240 	atf_check -s exit:0 rump.ifconfig ipsec0 create
    241 	atf_check -s exit:0 rump.ifconfig ipsec0 tunnel ${src} ${dst}
    242 	if [ ${inner} = "ipv6" ]; then
    243 		atf_check -s exit:0 rump.ifconfig ipsec0 inet6 ${addr}/128 ${remote}
    244 		atf_check -s exit:0 -o ignore rump.route add -inet6 ${peernet} ${addr}
    245 	else
    246 		atf_check -s exit:0 rump.ifconfig ipsec0 inet ${addr}/32 ${remote}
    247 		atf_check -s exit:0 -o ignore rump.route add -inet ${peernet} ${addr}
    248 	fi
    249 
    250 	rump.ifconfig ipsec0
    251 	rump.route -nL show
    252 }
    253 
    254 setup_if_ipsec_sa()
    255 {
    256 	local sock=${1}
    257 	local src=${2}
    258 	local dst=${3}
    259 	local mode=${4}
    260 	local proto=${5}
    261 	local algo=${6}
    262 	local dir=${7}
    263 
    264 	local tmpfile=./tmp
    265 	local inunique=""
    266 	local outunique=""
    267 	local inid=""
    268 	local outid=""
    269 	local algo_args="$(generate_algo_args $proto $algo)"
    270 
    271 	inunique=`get_if_ipsec_unique ${sock} ${dst} ${mode}`
    272 	atf_check -s exit:0 test "X$inunique" != "X"
    273 	outunique=`get_if_ipsec_unique ${sock} ${src} ${mode}`
    274 	atf_check -s exit:0 test "X$outunique" != "X"
    275 
    276 	if [ ${dir} = "1to2" ] ; then
    277 	    if [ ${mode} = "ipv6" ] ; then
    278 		inid="10010"
    279 		outid="10011"
    280 	    else
    281 		inid="10000"
    282 		outid="10001"
    283 	    fi
    284 	else
    285 	    if [ ${mode} = "ipv6" ] ; then
    286 		inid="10011"
    287 		outid="10010"
    288 	    else
    289 		inid="10001"
    290 		outid="10000"
    291 	    fi
    292 	fi
    293 
    294 	cat > $tmpfile <<-EOF
    295     	add $dst $src $proto $inid -u $inunique $algo_args;
    296     	add $src $dst $proto $outid -u $outunique $algo_args;
    297 	EOF
    298 	$DEBUG && cat $tmpfile
    299 	export RUMP_SERVER=$sock
    300 	atf_check -s exit:0 -o empty $HIJACKING setkey -c < $tmpfile
    301 	$DEBUG && $HIJACKING setkey -D
    302 	$DEBUG && $HIJACKING setkey -DP
    303 	unset RUMP_SERVER
    304 }
    305 
    306 setup_tunnel()
    307 {
    308 	local inner=${1}
    309 	local outer=${2}
    310 	local proto=${3}
    311 	local algo=${4}
    312 
    313 	local addr=""
    314 	local remote=""
    315 	local src=""
    316 	local dst=""
    317 	local peernet=""
    318 
    319 	if [ ${inner} = "ipv6" ]; then
    320 		addr=$ROUTER1_IPSECIP6
    321 		remote=$ROUTER2_IPSECIP6
    322 		peernet=$ROUTER2_LANNET6
    323 	else
    324 		addr=$ROUTER1_IPSECIP
    325 		remote=$ROUTER2_IPSECIP
    326 		peernet=$ROUTER2_LANNET
    327 	fi
    328 	if [ ${outer} = "ipv6" ]; then
    329 		src=$ROUTER1_WANIP6
    330 		dst=$ROUTER2_WANIP6
    331 	else
    332 		src=$ROUTER1_WANIP
    333 		dst=$ROUTER2_WANIP
    334 	fi
    335 	setup_if_ipsec $SOCK1 ${addr} ${remote} ${inner} \
    336 		     ${src} ${dst} ${peernet}
    337 
    338 	if [ $inner = "ipv6" -a $outer = "ipv4" ]; then
    339 	    setup_if_ipsec_sa $SOCK1 ${src} ${dst} ${outer} ${proto} ${algo} "1to2"
    340 	fi
    341 	setup_if_ipsec_sa $SOCK1 ${src} ${dst} ${inner} ${proto} ${algo} "1to2"
    342 
    343 	if [ $inner = "ipv6" ]; then
    344 		addr=$ROUTER2_IPSECIP6
    345 		remote=$ROUTER1_IPSECIP6
    346 		peernet=$ROUTER1_LANNET6
    347 	else
    348 		addr=$ROUTER2_IPSECIP
    349 		remote=$ROUTER1_IPSECIP
    350 		peernet=$ROUTER1_LANNET
    351 	fi
    352 	if [ $outer = "ipv6" ]; then
    353 		src=$ROUTER2_WANIP6
    354 		dst=$ROUTER1_WANIP6
    355 	else
    356 		src=$ROUTER2_WANIP
    357 		dst=$ROUTER1_WANIP
    358 	fi
    359 	setup_if_ipsec $SOCK2 ${addr} ${remote} ${inner} \
    360 		     ${src} ${dst} ${peernet} ${proto} ${algo}
    361 	if [ $inner = "ipv6" -a $outer = "ipv4" ]; then
    362 	    setup_if_ipsec_sa $SOCK2 ${src} ${dst} ${outer} ${proto} ${algo} "2to1"
    363 	fi
    364 	setup_if_ipsec_sa $SOCK2 ${src} ${dst} ${inner} ${proto} ${algo} "2to1"
    365 }
    366 
    367 test_setup_tunnel()
    368 {
    369 	local mode=${1}
    370 
    371 	local peernet=""
    372 	local opt=""
    373 	if [ ${mode} = "ipv6" ]; then
    374 		peernet=$ROUTER2_LANNET6
    375 		opt="-inet6"
    376 	else
    377 		peernet=$ROUTER2_LANNET
    378 		opt="-inet"
    379 	fi
    380 	export RUMP_SERVER=$SOCK1
    381 	atf_check -s exit:0 -o match:ipsec0 rump.ifconfig
    382 	atf_check -s exit:0 -o match:ipsec0 rump.route -nL get ${opt} ${peernet}
    383 
    384 	if [ ${mode} = "ipv6" ]; then
    385 		peernet=$ROUTER1_LANNET6
    386 		opt="-inet6"
    387 	else
    388 		peernet=$ROUTER1_LANNET
    389 		opt="-inet"
    390 	fi
    391 	export RUMP_SERVER=$SOCK2
    392 	atf_check -s exit:0 -o match:ipsec0 rump.ifconfig
    393 	atf_check -s exit:0 -o match:ipsec0 rump.route -nL get ${opt} ${peernet}
    394 }
    395 
    396 teardown_tunnel()
    397 {
    398 	export RUMP_SERVER=$SOCK1
    399 	atf_check -s exit:0 rump.ifconfig ipsec0 deletetunnel
    400 	atf_check -s exit:0 rump.ifconfig ipsec0 destroy
    401 	$HIJACKING setkey -F
    402 
    403 	export RUMP_SERVER=$SOCK2
    404 	atf_check -s exit:0 rump.ifconfig ipsec0 deletetunnel
    405 	atf_check -s exit:0 rump.ifconfig ipsec0 destroy
    406 	$HIJACKING setkey -F
    407 
    408 	unset RUMP_SERVER
    409 }
    410 
    411 setup_dummy_if_ipsec()
    412 {
    413 	local sock=${1}
    414 	local addr=${2}
    415 	local remote=${3}
    416 	local inner=${4}
    417 	local src=${5}
    418 	local dst=${6}
    419 
    420 	export RUMP_SERVER=${sock}
    421 	atf_check -s exit:0 rump.ifconfig ipsec1 create
    422 	atf_check -s exit:0 rump.ifconfig ipsec1 tunnel ${src} ${dst}
    423 	if [ ${inner} = "ipv6" ]; then
    424 		atf_check -s exit:0 rump.ifconfig ipsec1 inet6 ${addr}/128 ${remote}
    425 	else
    426 		atf_check -s exit:0 rump.ifconfig ipsec1 inet ${addr}/32 ${remote}
    427 	fi
    428 
    429 	rump.ifconfig ipsec1
    430 	unset RUMP_SERVER
    431 }
    432 
    433 setup_dummy_if_ipsec_sa()
    434 {
    435 	local sock=${1}
    436 	local src=${2}
    437 	local dst=${3}
    438 	local mode=${4}
    439 	local proto=${5}
    440 	local algo=${6}
    441 	local dir=${7}
    442 
    443 	local tmpfile=./tmp
    444 	local inunique=""
    445 	local outunique=""
    446 	local inid=""
    447 	local outid=""
    448 	local algo_args="$(generate_algo_args $proto $algo)"
    449 
    450 	inunique=`get_if_ipsec_unique ${sock} ${dst} ${mode}`
    451 	atf_check -s exit:0 test "X$inunique" != "X"
    452 	outunique=`get_if_ipsec_unique ${sock} ${src} ${mode}`
    453 	atf_check -s exit:0 test "X$outunique" != "X"
    454 
    455 	if [ ${dir} = "1to2" ] ; then
    456 	    inid="20000"
    457 	    outid="20001"
    458 	else
    459 	    inid="20001"
    460 	    outid="20000"
    461 	fi
    462 
    463 	cat > $tmpfile <<-EOF
    464     	add $dst $src $proto $inid -u $inunique $algo_args;
    465     	add $src $dst $proto $outid -u $outunique $algo_args;
    466 	EOF
    467 	$DEBUG && cat $tmpfile
    468 	export RUMP_SERVER=$sock
    469 	atf_check -s exit:0 -o empty $HIJACKING setkey -c < $tmpfile
    470 	$DEBUG && $HIJACKING setkey -D
    471 	$DEBUG && $HIJACKING setkey -DP
    472 	unset RUMP_SERVER
    473 }
    474 
    475 setup_dummy_tunnel()
    476 {
    477 	local inner=${1}
    478 	local outer=${2}
    479 	local proto=${3}
    480 	local algo=${4}
    481 
    482 	local addr=""
    483 	local remote=""
    484 	local src=""
    485 	local dst=""
    486 
    487 	if [ ${inner} = "ipv6" ]; then
    488 		addr=$ROUTER1_IPSECIP6_DUMMY
    489 		remote=$ROUTER2_IPSECIP6_DUMMY
    490 	else
    491 		addr=$ROUTER1_IPSECIP_DUMMY
    492 		remote=$ROUTER2_IPSECIP_DUMMY
    493 	fi
    494 	if [ ${outer} = "ipv6" ]; then
    495 		src=$ROUTER1_WANIP6_DUMMY
    496 		dst=$ROUTER2_WANIP6_DUMMY
    497 	else
    498 		src=$ROUTER1_WANIP_DUMMY
    499 		dst=$ROUTER2_WANIP_DUMMY
    500 	fi
    501 	setup_dummy_if_ipsec $SOCK1 ${addr} ${remote} ${inner} \
    502 			   ${src} ${dst} ${proto} ${algo} "1to2"
    503 	setup_dummy_if_ipsec_sa $SOCK1 ${src} ${dst} ${inner} ${proto} ${algo} "1to2"
    504 
    505 	if [ $inner = "ipv6" ]; then
    506 		addr=$ROUTER2_IPSECIP6_DUMMY
    507 		remote=$ROUTER1_IPSECIP6_DUMMY
    508 	else
    509 		addr=$ROUTER2_IPSECIP_DUMMY
    510 		remote=$ROUTER1_IPSECIP_DUMMY
    511 	fi
    512 	if [ $outer = "ipv6" ]; then
    513 		src=$ROUTER2_WANIP6_DUMMY
    514 		dst=$ROUTER1_WANIP6_DUMMY
    515 	else
    516 		src=$ROUTER2_WANIP_DUMMY
    517 		dst=$ROUTER1_WANIP_DUMMY
    518 	fi
    519 	setup_dummy_if_ipsec $SOCK2 ${addr} ${remote} ${inner} \
    520 			   ${src} ${dst} ${proto} ${algo} "2to1"
    521 	setup_dummy_if_ipsec_sa $SOCK2 ${src} ${dst} ${inner} ${proto} ${algo} "2to1"
    522 }
    523 
    524 test_setup_dummy_tunnel()
    525 {
    526 	export RUMP_SERVER=$SOCK1
    527 	atf_check -s exit:0 -o match:ipsec1 rump.ifconfig
    528 
    529 	export RUMP_SERVER=$SOCK2
    530 	atf_check -s exit:0 -o match:ipsec1 rump.ifconfig
    531 
    532 	unset RUMP_SERVER
    533 }
    534 
    535 teardown_dummy_tunnel()
    536 {
    537 	export RUMP_SERVER=$SOCK1
    538 	atf_check -s exit:0 rump.ifconfig ipsec1 deletetunnel
    539 	atf_check -s exit:0 rump.ifconfig ipsec1 destroy
    540 
    541 	export RUMP_SERVER=$SOCK2
    542 	atf_check -s exit:0 rump.ifconfig ipsec1 deletetunnel
    543 	atf_check -s exit:0 rump.ifconfig ipsec1 destroy
    544 
    545 	unset RUMP_SERVER
    546 }
    547 
    548 setup_recursive_if_ipsec()
    549 {
    550 	local sock=${1}
    551 	local ipsec=${2}
    552 	local addr=${3}
    553 	local remote=${4}
    554 	local inner=${5}
    555 	local src=${6}
    556 	local dst=${7}
    557 	local proto=${8}
    558 	local algo=${9}
    559 	local dir=${10}
    560 
    561 	export RUMP_SERVER=${sock}
    562 	atf_check -s exit:0 rump.ifconfig ${ipsec} create
    563 	atf_check -s exit:0 rump.ifconfig ${ipsec} tunnel ${src} ${dst}
    564 	if [ ${inner} = "ipv6" ]; then
    565 		atf_check -s exit:0 rump.ifconfig ${ipsec} inet6 ${addr}/128 ${remote}
    566 	else
    567 		atf_check -s exit:0 rump.ifconfig ${ipsec} inet ${addr}/32 ${remote}
    568 	fi
    569 	setup_if_ipsec_sa $sock ${src} ${dst} ${inner} ${proto} ${algo} ${dir}
    570 
    571 	export RUMP_SERVER=${sock}
    572 	rump.ifconfig ${ipsec}
    573 	unset RUMP_SERVER
    574 }
    575 
    576 # test in ROUTER1 only
    577 setup_recursive_tunnels()
    578 {
    579 	local mode=${1}
    580 	local proto=${2}
    581 	local algo=${3}
    582 
    583 	local addr=""
    584 	local remote=""
    585 	local src=""
    586 	local dst=""
    587 
    588 	if [ ${mode} = "ipv6" ]; then
    589 		addr=$ROUTER1_IPSECIP6_RECURSIVE1
    590 		remote=$ROUTER2_IPSECIP6_RECURSIVE1
    591 		src=$ROUTER1_IPSECIP6
    592 		dst=$ROUTER2_IPSECIP6
    593 	else
    594 		addr=$ROUTER1_IPSECIP_RECURSIVE1
    595 		remote=$ROUTER2_IPSECIP_RECURSIVE1
    596 		src=$ROUTER1_IPSECIP
    597 		dst=$ROUTER2_IPSECIP
    598 	fi
    599 	setup_recursive_if_ipsec $SOCK1 ipsec1 ${addr} ${remote} ${mode} \
    600 		      ${src} ${dst} ${proto} ${algo} "1to2"
    601 
    602 	if [ ${mode} = "ipv6" ]; then
    603 		addr=$ROUTER1_IPSECIP6_RECURSIVE2
    604 		remote=$ROUTER2_IPSECIP6_RECURSIVE2
    605 		src=$ROUTER1_IPSECIP6_RECURSIVE1
    606 		dst=$ROUTER2_IPSECIP6_RECURSIVE1
    607 	else
    608 		addr=$ROUTER1_IPSECIP_RECURSIVE2
    609 		remote=$ROUTER2_IPSECIP_RECURSIVE2
    610 		src=$ROUTER1_IPSECIP_RECURSIVE1
    611 		dst=$ROUTER2_IPSECIP_RECURSIVE1
    612 	fi
    613 	setup_recursive_if_ipsec $SOCK1 ipsec2 ${addr} ${remote} ${mode} \
    614 		      ${src} ${dst} ${proto} ${algo} "1to2"
    615 }
    616 
    617 # test in router1 only
    618 test_recursive_check()
    619 {
    620 	local mode=$1
    621 
    622 	export RUMP_SERVER=$SOCK1
    623 	if [ ${mode} = "ipv6" ]; then
    624 		atf_check -s not-exit:0 -o ignore -e ignore \
    625 			rump.ping6 -n -X $TIMEOUT -c 1 $ROUTER2_IPSECIP6_RECURSIVE2
    626 	else
    627 		atf_check -s not-exit:0 -o ignore -e ignore \
    628 			rump.ping -n -w $TIMEOUT -c 1 $ROUTER2_IPSECIP_RECURSIVE2
    629 	fi
    630 
    631 	atf_check -o match:'ipsec0: recursively called too many times' \
    632 		-x "$HIJACKING dmesg"
    633 
    634 	$HIJACKING dmesg
    635 
    636 	unset RUMP_SERVER
    637 }
    638 
    639 teardown_recursive_tunnels()
    640 {
    641 	export RUMP_SERVER=$SOCK1
    642 	atf_check -s exit:0 rump.ifconfig ipsec1 deletetunnel
    643 	atf_check -s exit:0 rump.ifconfig ipsec1 destroy
    644 	atf_check -s exit:0 rump.ifconfig ipsec2 deletetunnel
    645 	atf_check -s exit:0 rump.ifconfig ipsec2 destroy
    646 	unset RUMP_SERVER
    647 }
    648 
    649 test_ping_failure()
    650 {
    651 	local mode=$1
    652 
    653 	export RUMP_SERVER=$SOCK1
    654 	if [ ${mode} = "ipv6" ]; then
    655 		atf_check -s not-exit:0 -o ignore -e ignore \
    656 			rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER1_LANIP6 \
    657 			$ROUTER2_LANIP6
    658 	else
    659 		atf_check -s not-exit:0 -o ignore -e ignore \
    660 			rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER1_LANIP \
    661 			$ROUTER2_LANIP
    662 	fi
    663 
    664 	export RUMP_SERVER=$SOCK2
    665 	if [ ${mode} = "ipv6" ]; then
    666 		atf_check -s not-exit:0 -o ignore -e ignore \
    667 			rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER2_LANIP6 \
    668 			$ROUTER1_LANIP6
    669 	else
    670 		atf_check -s not-exit:0 -o ignore -e ignore \
    671 			rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER1_LANIP \
    672 			$ROUTER2_LANIP
    673 	fi
    674 
    675 	unset RUMP_SERVER
    676 }
    677 
    678 test_ping_success()
    679 {
    680 	mode=$1
    681 
    682 	export RUMP_SERVER=$SOCK1
    683 	rump.ifconfig -v ipsec0
    684 	if [ ${mode} = "ipv6" ]; then
    685 		# XXX
    686 		# rump.ping6 rarely fails with the message that
    687 		# "failed to get receiving hop limit".
    688 		# This is a known issue being analyzed.
    689 		atf_check -s exit:0 -o ignore \
    690 			rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER1_LANIP6 \
    691 			$ROUTER2_LANIP6
    692 	else
    693 		atf_check -s exit:0 -o ignore \
    694 			rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER1_LANIP \
    695 			$ROUTER2_LANIP
    696 	fi
    697 	rump.ifconfig -v ipsec0
    698 
    699 	export RUMP_SERVER=$SOCK2
    700 	rump.ifconfig -v ipsec0
    701 	if [ ${mode} = "ipv6" ]; then
    702 		atf_check -s exit:0 -o ignore \
    703 			rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER2_LANIP6 \
    704 			$ROUTER1_LANIP6
    705 	else
    706 		atf_check -s exit:0 -o ignore \
    707 			rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER2_LANIP \
    708 			$ROUTER1_LANIP
    709 	fi
    710 	rump.ifconfig -v ipsec0
    711 
    712 	unset RUMP_SERVER
    713 }
    714 
    715 test_change_tunnel_duplicate()
    716 {
    717 	local mode=$1
    718 
    719 	local newsrc=""
    720 	local newdst=""
    721 	if [ ${mode} = "ipv6" ]; then
    722 		newsrc=$ROUTER1_WANIP6_DUMMY
    723 		newdst=$ROUTER2_WANIP6_DUMMY
    724 	else
    725 		newsrc=$ROUTER1_WANIP_DUMMY
    726 		newdst=$ROUTER2_WANIP_DUMMY
    727 	fi
    728 	export RUMP_SERVER=$SOCK1
    729 	rump.ifconfig -v ipsec0
    730 	rump.ifconfig -v ipsec1
    731 	atf_check -s exit:0 -e match:SIOCSLIFPHYADDR \
    732 		rump.ifconfig ipsec0 tunnel ${newsrc} ${newdst}
    733 	rump.ifconfig -v ipsec0
    734 	rump.ifconfig -v ipsec1
    735 
    736 	if [ ${mode} = "ipv6" ]; then
    737 		newsrc=$ROUTER2_WANIP6_DUMMY
    738 		newdst=$ROUTER1_WANIP6_DUMMY
    739 	else
    740 		newsrc=$ROUTER2_WANIP_DUMMY
    741 		newdst=$ROUTER1_WANIP_DUMMY
    742 	fi
    743 	export RUMP_SERVER=$SOCK2
    744 	rump.ifconfig -v ipsec0
    745 	rump.ifconfig -v ipsec1
    746 	atf_check -s exit:0 -e match:SIOCSLIFPHYADDR \
    747 		rump.ifconfig ipsec0 tunnel ${newsrc} ${newdst}
    748 	rump.ifconfig -v ipsec0
    749 	rump.ifconfig -v ipsec1
    750 
    751 	unset RUMP_SERVER
    752 }
    753 
    754 test_change_tunnel_success()
    755 {
    756 	local mode=$1
    757 
    758 	local newsrc=""
    759 	local newdst=""
    760 	if [ ${mode} = "ipv6" ]; then
    761 		newsrc=$ROUTER1_WANIP6_DUMMY
    762 		newdst=$ROUTER2_WANIP6_DUMMY
    763 	else
    764 		newsrc=$ROUTER1_WANIP_DUMMY
    765 		newdst=$ROUTER2_WANIP_DUMMY
    766 	fi
    767 	export RUMP_SERVER=$SOCK1
    768 	rump.ifconfig -v ipsec0
    769 	atf_check -s exit:0 \
    770 		rump.ifconfig ipsec0 tunnel ${newsrc} ${newdst}
    771 	rump.ifconfig -v ipsec0
    772 
    773 	if [ ${mode} = "ipv6" ]; then
    774 		newsrc=$ROUTER2_WANIP6_DUMMY
    775 		newdst=$ROUTER1_WANIP6_DUMMY
    776 	else
    777 		newsrc=$ROUTER2_WANIP_DUMMY
    778 		newdst=$ROUTER1_WANIP_DUMMY
    779 	fi
    780 	export RUMP_SERVER=$SOCK2
    781 	rump.ifconfig -v ipsec0
    782 	atf_check -s exit:0 \
    783 		rump.ifconfig ipsec0 tunnel ${newsrc} ${newdst}
    784 	rump.ifconfig -v ipsec0
    785 
    786 	unset RUMP_SERVER
    787 }
    788 
    789 basic_setup()
    790 {
    791 	local inner=$1
    792 	local outer=$2
    793 	local proto=$3
    794 	local algo=$4
    795 
    796 	setup ${inner} ${outer}
    797 	test_setup ${inner} ${outer}
    798 
    799 	# Enable once PR kern/49219 is fixed
    800 	#test_ping_failure
    801 
    802 	setup_tunnel ${inner} ${outer} ${proto} ${algo}
    803 	sleep 1
    804 	test_setup_tunnel ${inner}
    805 }
    806 
    807 basic_test()
    808 {
    809 	local inner=$1
    810 	local outer=$2 # not use
    811 
    812 	test_ping_success ${inner}
    813 }
    814 
    815 basic_teardown()
    816 {
    817 	local inner=$1
    818 	local outer=$2 # not use
    819 
    820 	teardown_tunnel
    821 	test_ping_failure ${inner}
    822 }
    823 
    824 ioctl_setup()
    825 {
    826 	local inner=$1
    827 	local outer=$2
    828 	local proto=$3
    829 	local algo=$4
    830 
    831 	setup ${inner} ${outer}
    832 	test_setup ${inner} ${outer}
    833 
    834 	# Enable once PR kern/49219 is fixed
    835 	#test_ping_failure
    836 
    837 	setup_tunnel ${inner} ${outer} ${proto} ${algo}
    838 	setup_dummy_tunnel ${inner} ${outer} ${proto} ${algo}
    839 	sleep 1
    840 	test_setup_tunnel ${inner}
    841 }
    842 
    843 ioctl_test()
    844 {
    845 	local inner=$1
    846 	local outer=$2
    847 
    848 	test_ping_success ${inner}
    849 
    850 	test_change_tunnel_duplicate ${outer}
    851 
    852 	teardown_dummy_tunnel
    853 	test_change_tunnel_success ${outer}
    854 }
    855 
    856 ioctl_teardown()
    857 {
    858 	local inner=$1
    859 	local outer=$2 # not use
    860 
    861 	teardown_tunnel
    862 	test_ping_failure ${inner}
    863 }
    864 
    865 recursive_setup()
    866 {
    867 	local inner=$1
    868 	local outer=$2
    869 	local proto=$3
    870 	local algo=$4
    871 
    872 	setup ${inner} ${outer}
    873 	test_setup ${inner} ${outer}
    874 
    875 	# Enable once PR kern/49219 is fixed
    876 	#test_ping_failure
    877 
    878 	setup_tunnel ${inner} ${outer} ${proto} ${algo}
    879 	setup_recursive_tunnels ${inner} ${proto} ${algo}
    880 	sleep 1
    881 	test_setup_tunnel ${inner}
    882 }
    883 
    884 recursive_test()
    885 {
    886 	local inner=$1
    887 	local outer=$2 # not use
    888 
    889 	test_recursive_check ${inner}
    890 }
    891 
    892 recursive_teardown()
    893 {
    894 	local inner=$1 # not use
    895 	local outer=$2 # not use
    896 
    897 	teardown_recursive_tunnels
    898 	teardown_tunnel
    899 }
    900 
    901 add_test()
    902 {
    903 	local category=$1
    904 	local desc=$2
    905 	local inner=$3
    906 	local outer=$4
    907 	local proto=$5
    908 	local algo=$6
    909 	local _algo=$(echo $algo | sed 's/-//g')
    910 
    911 	name="ipsecif_${category}_${inner}over${outer}_${proto}_${_algo}"
    912 	fulldesc="Does ${inner} over ${outer} if_ipsec ${desc}"
    913 
    914 	atf_test_case ${name} cleanup
    915 	eval "${name}_head() {
    916 			atf_set descr \"${fulldesc}\"
    917 			atf_set require.progs rump_server setkey
    918 		}
    919 	    ${name}_body() {
    920 			${category}_setup ${inner} ${outer} ${proto} ${algo}
    921 			${category}_test ${inner} ${outer}
    922 			${category}_teardown ${inner} ${outer}
    923 			rump_server_destroy_ifaces
    924 	    }
    925 	    ${name}_cleanup() {
    926 			\$DEBUG && dump
    927 			cleanup
    928 		}"
    929 	atf_add_test_case ${name}
    930 }
    931 
    932 add_test_allproto()
    933 {
    934 	local category=$1
    935 	local desc=$2
    936 
    937 	for algo in $ESP_ENCRYPTION_ALGORITHMS_MINIMUM; do
    938 		add_test ${category} "${desc}" ipv4 ipv4 esp $algo
    939 		add_test ${category} "${desc}" ipv4 ipv6 esp $algo
    940 		add_test ${category} "${desc}" ipv6 ipv4 esp $algo
    941 		add_test ${category} "${desc}" ipv6 ipv6 esp $algo
    942 	done
    943 
    944 	# ah does not support yet
    945 }
    946 
    947 atf_init_test_cases()
    948 {
    949 
    950 	atf_add_test_case ipsecif_create_destroy
    951 
    952 	add_test_allproto basic "basic tests"
    953 	add_test_allproto ioctl "ioctl tests"
    954 	add_test_allproto recursive "recursive check tests"
    955 }
    956