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