1*d9ed1423Sgson# $NetBSD: t_basic.sh,v 1.9 2023/09/19 11:55:14 gson Exp $ 2cc5766bfSozaki-r# 3cc5766bfSozaki-r# Copyright (c) 2017 Internet Initiative Japan Inc. 4cc5766bfSozaki-r# All rights reserved. 5cc5766bfSozaki-r# 6cc5766bfSozaki-r# Redistribution and use in source and binary forms, with or without 7cc5766bfSozaki-r# modification, are permitted provided that the following conditions 8cc5766bfSozaki-r# are met: 9cc5766bfSozaki-r# 1. Redistributions of source code must retain the above copyright 10cc5766bfSozaki-r# notice, this list of conditions and the following disclaimer. 11cc5766bfSozaki-r# 2. Redistributions in binary form must reproduce the above copyright 12cc5766bfSozaki-r# notice, this list of conditions and the following disclaimer in the 13cc5766bfSozaki-r# documentation and/or other materials provided with the distribution. 14cc5766bfSozaki-r# 15cc5766bfSozaki-r# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 16cc5766bfSozaki-r# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 17cc5766bfSozaki-r# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 18cc5766bfSozaki-r# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 19cc5766bfSozaki-r# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20cc5766bfSozaki-r# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21cc5766bfSozaki-r# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22cc5766bfSozaki-r# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23cc5766bfSozaki-r# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24cc5766bfSozaki-r# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25cc5766bfSozaki-r# POSSIBILITY OF SUCH DAMAGE. 26cc5766bfSozaki-r# 27cc5766bfSozaki-r 28cc5766bfSozaki-rSOCK_CLIENT=unix://carp_client 29cc5766bfSozaki-rSOCK_MASTER=unix://carp_master 30cc5766bfSozaki-rSOCK_BACKUP=unix://carp_backup 31cc5766bfSozaki-rBUS=bus_carp 32cc5766bfSozaki-rTIMEOUT=3 33cc5766bfSozaki-r 349c1d2498Sozaki-rDEBUG=${DEBUG:-false} 35cc5766bfSozaki-r 36d547401bSozaki-rIP_CLIENT=10.1.1.240 37d547401bSozaki-rIP_MASTER=10.1.1.1 38d547401bSozaki-rIP_BACKUP=10.1.1.2 39d547401bSozaki-rIP_CARP=10.1.1.100 40d547401bSozaki-r 41cc5766bfSozaki-rsetup_carp() 42cc5766bfSozaki-r{ 43cc5766bfSozaki-r local sock=$1 44cc5766bfSozaki-r local master=$2 4528c6f0e7Sozaki-r local carpdevip=$3 46cc5766bfSozaki-r local carpif= ip= advskew= 47cc5766bfSozaki-r 48cc5766bfSozaki-r if $master; then 49cc5766bfSozaki-r carpif=carp0 50cc5766bfSozaki-r ip=$IP_MASTER 51cc5766bfSozaki-r advskew=0 52cc5766bfSozaki-r else 53cc5766bfSozaki-r carpif=carp1 54cc5766bfSozaki-r ip=$IP_BACKUP 55cc5766bfSozaki-r advskew=200 56cc5766bfSozaki-r fi 57cc5766bfSozaki-r 58cc5766bfSozaki-r export RUMP_SERVER=$sock 59d547401bSozaki-r if $DEBUG; then 60d547401bSozaki-r atf_check -s exit:0 -o match:'0.->.1' \ 61d547401bSozaki-r rump.sysctl -w net.inet.carp.log=1 62d547401bSozaki-r fi 63ce0ae1dfSozaki-r rump_server_add_iface $sock $carpif 6428c6f0e7Sozaki-r if [ $carpdevip = yes ]; then 65cc5766bfSozaki-r atf_check -s exit:0 rump.ifconfig shmif0 $ip/24 up 66cc5766bfSozaki-r atf_check -s exit:0 rump.ifconfig $carpif \ 67cc5766bfSozaki-r vhid 175 advskew $advskew advbase 1 pass s3cret \ 68cc5766bfSozaki-r $IP_CARP netmask 255.255.255.0 6928c6f0e7Sozaki-r else 7028c6f0e7Sozaki-r atf_check -s exit:0 rump.ifconfig shmif0 up 7128c6f0e7Sozaki-r atf_check -s exit:0 rump.ifconfig $carpif \ 7228c6f0e7Sozaki-r vhid 175 advskew $advskew advbase 1 pass s3cret \ 7328c6f0e7Sozaki-r carpdev shmif0 $IP_CARP netmask 255.255.255.0 7428c6f0e7Sozaki-r fi 75cc5766bfSozaki-r atf_check -s exit:0 rump.ifconfig -w 10 76cc5766bfSozaki-r} 77cc5766bfSozaki-r 78cc5766bfSozaki-rwait_handover() 79cc5766bfSozaki-r{ 80cc5766bfSozaki-r local i=0 81cc5766bfSozaki-r 82cc5766bfSozaki-r export RUMP_SERVER=$SOCK_CLIENT 83cc5766bfSozaki-r 84cc5766bfSozaki-r while [ $i -ne 5 ]; do 85cc5766bfSozaki-r $DEBUG && echo "Trying ping $IP_CARP" 86cc5766bfSozaki-r rump.ping -n -w 1 -c 1 $IP_CARP >/dev/null 87cc5766bfSozaki-r if [ $? = 0 ]; then 88cc5766bfSozaki-r $DEBUG && echo "Passed ping $IP_CARP" 89cc5766bfSozaki-r break; 90cc5766bfSozaki-r fi 91cc5766bfSozaki-r $DEBUG && echo "Failed ping $IP_CARP" 92cc5766bfSozaki-r i=$((i + 1)) 93cc5766bfSozaki-r done 94cc5766bfSozaki-r 95cc5766bfSozaki-r if [ $i -eq 5 ]; then 96cc5766bfSozaki-r atf_fail "Failed to failover (5 sec)" 97cc5766bfSozaki-r fi 98cc5766bfSozaki-r} 99cc5766bfSozaki-r 1009c1d2498Sozaki-rtest_carp_handover_ipv4() 101cc5766bfSozaki-r{ 1020dff263bSozaki-r local op=$1 10328c6f0e7Sozaki-r local carpdevip=$2 104cc5766bfSozaki-r 105cc5766bfSozaki-r rump_server_start $SOCK_CLIENT 106cc5766bfSozaki-r rump_server_start $SOCK_MASTER 107cc5766bfSozaki-r rump_server_start $SOCK_BACKUP 108cc5766bfSozaki-r 109cc5766bfSozaki-r rump_server_add_iface $SOCK_CLIENT shmif0 $BUS 110cc5766bfSozaki-r rump_server_add_iface $SOCK_MASTER shmif0 $BUS 111cc5766bfSozaki-r rump_server_add_iface $SOCK_BACKUP shmif0 $BUS 112cc5766bfSozaki-r 11328c6f0e7Sozaki-r setup_carp $SOCK_MASTER true $carpdevip 11428c6f0e7Sozaki-r setup_carp $SOCK_BACKUP false $carpdevip 115cc5766bfSozaki-r 116cc5766bfSozaki-r export RUMP_SERVER=$SOCK_CLIENT 117cc5766bfSozaki-r atf_check -s exit:0 rump.ifconfig shmif0 $IP_CLIENT/24 up 118cc5766bfSozaki-r atf_check -s exit:0 rump.ifconfig -w 10 119cc5766bfSozaki-r 12028c6f0e7Sozaki-r if [ $carpdevip = yes ]; then 121cc5766bfSozaki-r # Check that the primary addresses are up 122cc5766bfSozaki-r atf_check -s exit:0 -o ignore \ 123cc5766bfSozaki-r rump.ping -n -w $TIMEOUT -c 1 $IP_MASTER 124cc5766bfSozaki-r atf_check -s exit:0 -o ignore \ 125cc5766bfSozaki-r rump.ping -n -w $TIMEOUT -c 1 $IP_BACKUP 12628c6f0e7Sozaki-r fi 127cc5766bfSozaki-r 128cc5766bfSozaki-r # Give carp a while to croak 129cc5766bfSozaki-r sleep 4 130cc5766bfSozaki-r 131cc5766bfSozaki-r # Check state 132cc5766bfSozaki-r export RUMP_SERVER=$SOCK_MASTER 133cc5766bfSozaki-r $DEBUG && rump.ifconfig 134cc5766bfSozaki-r atf_check -s exit:0 -o match:'carp: MASTER carpdev shmif0' \ 135cc5766bfSozaki-r rump.ifconfig carp0 136cc5766bfSozaki-r export RUMP_SERVER=$SOCK_BACKUP 137cc5766bfSozaki-r $DEBUG && rump.ifconfig 138cc5766bfSozaki-r atf_check -s exit:0 -o match:'carp: BACKUP carpdev shmif0' \ 139cc5766bfSozaki-r rump.ifconfig carp1 140cc5766bfSozaki-r export RUMP_SERVER=$SOCK_CLIENT 141cc5766bfSozaki-r 142cc5766bfSozaki-r # Check that the shared IP works 143cc5766bfSozaki-r atf_check -s exit:0 -o ignore \ 144cc5766bfSozaki-r rump.ping -n -w $TIMEOUT -c 1 $IP_CARP 145cc5766bfSozaki-r 146cc5766bfSozaki-r # KILLING SPREE 1470dff263bSozaki-r if [ $op = halt ]; then 148cc5766bfSozaki-r env RUMP_SERVER=$SOCK_MASTER rump.halt 1490dff263bSozaki-r elif [ $op = ifdown ]; then 1500dff263bSozaki-r env RUMP_SERVER=$SOCK_MASTER rump.ifconfig shmif0 down 1510dff263bSozaki-r fi 152cc5766bfSozaki-r sleep 1 153cc5766bfSozaki-r 154cc5766bfSozaki-r # Check that primary is now dead 15528c6f0e7Sozaki-r if [ $carpdevip = yes ]; then 156cc5766bfSozaki-r atf_check -s not-exit:0 -o ignore \ 157cc5766bfSozaki-r rump.ping -n -w $TIMEOUT -c 1 $IP_MASTER 15828c6f0e7Sozaki-r else 15928c6f0e7Sozaki-r # XXX how to check? 16028c6f0e7Sozaki-r fi 161cc5766bfSozaki-r 162cc5766bfSozaki-r # Do it in installments. carp will cluck meanwhile 163cc5766bfSozaki-r wait_handover 164cc5766bfSozaki-r 165cc5766bfSozaki-r # Check state 166cc5766bfSozaki-r export RUMP_SERVER=$SOCK_BACKUP 167cc5766bfSozaki-r $DEBUG && rump.ifconfig 168cc5766bfSozaki-r atf_check -s exit:0 -o match:'carp: MASTER carpdev shmif0' \ 169cc5766bfSozaki-r rump.ifconfig carp1 1700dff263bSozaki-r 1710dff263bSozaki-r if [ $op = ifdown ]; then 1720dff263bSozaki-r rump_server_destroy_ifaces 1730dff263bSozaki-r fi 174cc5766bfSozaki-r} 175cc5766bfSozaki-r 176d547401bSozaki-rIP6_CLIENT=fd00:1::240 177d547401bSozaki-rIP6_MASTER=fd00:1::1 178d547401bSozaki-rIP6_BACKUP=fd00:1::2 179d547401bSozaki-rIP6_CARP=fd00:1::100 180d547401bSozaki-r 181d547401bSozaki-rsetup_carp6() 182d547401bSozaki-r{ 183d547401bSozaki-r local sock=$1 184d547401bSozaki-r local master=$2 18528c6f0e7Sozaki-r local carpdevip=$3 186d547401bSozaki-r local carpif= ip= advskew= 187d547401bSozaki-r 188d547401bSozaki-r if $master; then 189d547401bSozaki-r carpif=carp0 190d547401bSozaki-r ip=$IP6_MASTER 191d547401bSozaki-r advskew=0 192d547401bSozaki-r else 193d547401bSozaki-r carpif=carp1 194d547401bSozaki-r ip=$IP6_BACKUP 195d547401bSozaki-r advskew=200 196d547401bSozaki-r fi 197d547401bSozaki-r 198d547401bSozaki-r export RUMP_SERVER=$sock 199d547401bSozaki-r if $DEBUG; then 200d547401bSozaki-r atf_check -s exit:0 -o match:'0.->.1' \ 201d547401bSozaki-r rump.sysctl -w net.inet.carp.log=1 202d547401bSozaki-r fi 203ce0ae1dfSozaki-r rump_server_add_iface $sock $carpif 20428c6f0e7Sozaki-r if [ $carpdevip = yes ]; then 205d547401bSozaki-r atf_check -s exit:0 rump.ifconfig shmif0 inet6 $ip up 206d547401bSozaki-r atf_check -s exit:0 rump.ifconfig $carpif inet6 \ 207d547401bSozaki-r vhid 175 advskew $advskew advbase 1 pass s3cret $IP6_CARP 20828c6f0e7Sozaki-r else 20928c6f0e7Sozaki-r atf_check -s exit:0 rump.ifconfig shmif0 up 21028c6f0e7Sozaki-r atf_check -s exit:0 rump.ifconfig $carpif inet6 \ 21128c6f0e7Sozaki-r vhid 175 advskew $advskew advbase 1 pass s3cret \ 21228c6f0e7Sozaki-r carpdev shmif0 $IP6_CARP 21328c6f0e7Sozaki-r fi 214d547401bSozaki-r atf_check -s exit:0 rump.ifconfig -w 10 215d547401bSozaki-r} 216d547401bSozaki-r 217d547401bSozaki-rwait_carp6_handover() 218d547401bSozaki-r{ 219d547401bSozaki-r local i=0 220d547401bSozaki-r 221d547401bSozaki-r export RUMP_SERVER=$SOCK_CLIENT 222d547401bSozaki-r 223d547401bSozaki-r while [ $i -ne 5 ]; do 224d547401bSozaki-r $DEBUG && echo "Trying ping6 $IP6_CARP" 225d547401bSozaki-r rump.ping6 -n -X 1 -c 1 $IP6_CARP >/dev/null 226d547401bSozaki-r if [ $? = 0 ]; then 227d547401bSozaki-r $DEBUG && echo "Passed ping $IP6_CARP" 228d547401bSozaki-r break; 229d547401bSozaki-r fi 230d547401bSozaki-r $DEBUG && echo "Failed ping6 $IP6_CARP" 231d547401bSozaki-r i=$((i + 1)) 232d547401bSozaki-r done 233d547401bSozaki-r 234d547401bSozaki-r if [ $i -eq 5 ]; then 235d547401bSozaki-r atf_fail "Failed to failover (5 sec)" 236d547401bSozaki-r fi 237d547401bSozaki-r} 238d547401bSozaki-r 2399c1d2498Sozaki-rtest_carp_handover_ipv6() 240d547401bSozaki-r{ 2410dff263bSozaki-r local op=$1 24228c6f0e7Sozaki-r local carpdevip=$2 243d547401bSozaki-r 244d547401bSozaki-r rump_server_start $SOCK_CLIENT netinet6 245d547401bSozaki-r rump_server_start $SOCK_MASTER netinet6 246d547401bSozaki-r rump_server_start $SOCK_BACKUP netinet6 247d547401bSozaki-r 248d547401bSozaki-r rump_server_add_iface $SOCK_CLIENT shmif0 $BUS 249d547401bSozaki-r rump_server_add_iface $SOCK_MASTER shmif0 $BUS 250d547401bSozaki-r rump_server_add_iface $SOCK_BACKUP shmif0 $BUS 251d547401bSozaki-r 25228c6f0e7Sozaki-r setup_carp6 $SOCK_MASTER true $carpdevip 25328c6f0e7Sozaki-r setup_carp6 $SOCK_BACKUP false $carpdevip 254d547401bSozaki-r 255d547401bSozaki-r export RUMP_SERVER=$SOCK_CLIENT 256d547401bSozaki-r atf_check -s exit:0 rump.ifconfig shmif0 inet6 $IP6_CLIENT up 257d547401bSozaki-r atf_check -s exit:0 rump.ifconfig -w 10 258d547401bSozaki-r 25928c6f0e7Sozaki-r if [ $carpdevip = yes ]; then 260d547401bSozaki-r # Check that the primary addresses are up 261d547401bSozaki-r atf_check -s exit:0 -o ignore \ 262d547401bSozaki-r rump.ping6 -n -X $TIMEOUT -c 1 $IP6_MASTER 263d547401bSozaki-r atf_check -s exit:0 -o ignore \ 264d547401bSozaki-r rump.ping6 -n -X $TIMEOUT -c 1 $IP6_BACKUP 26528c6f0e7Sozaki-r fi 266d547401bSozaki-r 267d547401bSozaki-r # Give carp a while to croak 268d547401bSozaki-r sleep 4 269d547401bSozaki-r 270d547401bSozaki-r # Check state 271d547401bSozaki-r export RUMP_SERVER=$SOCK_MASTER 272d547401bSozaki-r $DEBUG && rump.ifconfig 273d547401bSozaki-r atf_check -s exit:0 -o match:'carp: MASTER carpdev shmif0' \ 274d547401bSozaki-r rump.ifconfig carp0 275d547401bSozaki-r export RUMP_SERVER=$SOCK_BACKUP 276d547401bSozaki-r $DEBUG && rump.ifconfig 277d547401bSozaki-r atf_check -s exit:0 -o match:'carp: BACKUP carpdev shmif0' \ 278d547401bSozaki-r rump.ifconfig carp1 279d547401bSozaki-r export RUMP_SERVER=$SOCK_CLIENT 280d547401bSozaki-r 281d547401bSozaki-r # Check that the shared IP works 282d547401bSozaki-r atf_check -s exit:0 -o ignore \ 283d547401bSozaki-r rump.ping6 -n -X $TIMEOUT -c 1 $IP6_CARP 284d547401bSozaki-r 285d547401bSozaki-r # KILLING SPREE 2860dff263bSozaki-r if [ $op = halt ]; then 287d547401bSozaki-r env RUMP_SERVER=$SOCK_MASTER rump.halt 2880dff263bSozaki-r elif [ $op = ifdown ]; then 2890dff263bSozaki-r env RUMP_SERVER=$SOCK_MASTER rump.ifconfig shmif0 down 2900dff263bSozaki-r fi 291d547401bSozaki-r sleep 1 292d547401bSozaki-r 293d547401bSozaki-r # Check that primary is now dead 29428c6f0e7Sozaki-r if [ $carpdevip = yes ]; then 295d547401bSozaki-r atf_check -s not-exit:0 -o ignore \ 296d547401bSozaki-r rump.ping6 -n -X $TIMEOUT -c 1 $IP6_MASTER 29728c6f0e7Sozaki-r else 29828c6f0e7Sozaki-r # XXX how to check? 29928c6f0e7Sozaki-r fi 300d547401bSozaki-r 301d547401bSozaki-r # Do it in installments. carp will cluck meanwhile 302d547401bSozaki-r wait_carp6_handover 303d547401bSozaki-r 304d547401bSozaki-r # Check state 305d547401bSozaki-r export RUMP_SERVER=$SOCK_BACKUP 306d547401bSozaki-r $DEBUG && rump.ifconfig 307d547401bSozaki-r atf_check -s exit:0 -o match:'carp: MASTER carpdev shmif0' \ 308d547401bSozaki-r rump.ifconfig carp1 3090dff263bSozaki-r 3100dff263bSozaki-r if [ $op = ifdown ]; then 3110dff263bSozaki-r rump_server_destroy_ifaces 3120dff263bSozaki-r fi 313d547401bSozaki-r} 314d547401bSozaki-r 3159c1d2498Sozaki-radd_test_case() 3160dff263bSozaki-r{ 3179c1d2498Sozaki-r local ipproto=$1 3189c1d2498Sozaki-r local halt=$2 31928c6f0e7Sozaki-r local carpdevip=$3 32028c6f0e7Sozaki-r local expected_failure_code= 3210dff263bSozaki-r 3229c1d2498Sozaki-r name="carp_handover_${ipproto}_${halt}" 3239c1d2498Sozaki-r desc="Tests for CARP (${ipproto}) handover on ${halt}" 32428c6f0e7Sozaki-r if [ $carpdevip = yes ]; then 32528c6f0e7Sozaki-r name="${name}_carpdevip" 32628c6f0e7Sozaki-r desc="$desc with carpdev IP" 32728c6f0e7Sozaki-r else 32828c6f0e7Sozaki-r name="${name}_nocarpdevip" 32928c6f0e7Sozaki-r desc="$desc without carpdev IP" 33028c6f0e7Sozaki-r fi 3310dff263bSozaki-r 3329c1d2498Sozaki-r atf_test_case ${name} cleanup 3333f30ca4eSozaki-r eval " 3343f30ca4eSozaki-r ${name}_head() { 3353f30ca4eSozaki-r atf_set descr \"$desc\" 3363f30ca4eSozaki-r atf_set require.progs rump_server 3373f30ca4eSozaki-r } 3383f30ca4eSozaki-r ${name}_body() { 3393f30ca4eSozaki-r $expected_failure_code 3403f30ca4eSozaki-r test_carp_handover_${ipproto} $halt $carpdevip 3413f30ca4eSozaki-r if [ $halt != halt ]; then 3423f30ca4eSozaki-r rump_server_destroy_ifaces 3433f30ca4eSozaki-r fi 3443f30ca4eSozaki-r } 3453f30ca4eSozaki-r ${name}_cleanup() { 3463f30ca4eSozaki-r \$DEBUG && dump 3473f30ca4eSozaki-r cleanup 3483f30ca4eSozaki-r } 3499c1d2498Sozaki-r " 3509c1d2498Sozaki-r atf_add_test_case ${name} 351d547401bSozaki-r} 352d547401bSozaki-r 353cc5766bfSozaki-ratf_init_test_cases() 354cc5766bfSozaki-r{ 35528c6f0e7Sozaki-r local proto= halt= carpdevip= 356cc5766bfSozaki-r 3579c1d2498Sozaki-r for proto in ipv4 ipv6; do 3589c1d2498Sozaki-r for halt in halt ifdown; do 35928c6f0e7Sozaki-r for carpdevip in yes no; do 36028c6f0e7Sozaki-r add_test_case $proto $halt $carpdevip 36128c6f0e7Sozaki-r done 3629c1d2498Sozaki-r done 3639c1d2498Sozaki-r done 364cc5766bfSozaki-r} 365