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