147308803SKristof Provost# 24d846d26SWarner Losh# SPDX-License-Identifier: BSD-2-Clause 347308803SKristof Provost# 447308803SKristof Provost# Copyright (c) 2020 Kristof Provost <kp@FreeBSD.org> 547308803SKristof Provost# 647308803SKristof Provost# Redistribution and use in source and binary forms, with or without 747308803SKristof Provost# modification, are permitted provided that the following conditions 847308803SKristof Provost# are met: 947308803SKristof Provost# 1. Redistributions of source code must retain the above copyright 1047308803SKristof Provost# notice, this list of conditions and the following disclaimer. 1147308803SKristof Provost# 2. Redistributions in binary form must reproduce the above copyright 1247308803SKristof Provost# notice, this list of conditions and the following disclaimer in the 1347308803SKristof Provost# documentation and/or other materials provided with the distribution. 1447308803SKristof Provost# 1547308803SKristof Provost# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1647308803SKristof Provost# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1747308803SKristof Provost# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1847308803SKristof Provost# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1947308803SKristof Provost# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2047308803SKristof Provost# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2147308803SKristof Provost# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2247308803SKristof Provost# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2347308803SKristof Provost# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2447308803SKristof Provost# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2547308803SKristof Provost# SUCH DAMAGE. 2647308803SKristof Provost 2747308803SKristof Provost. $(atf_get_srcdir)/../common/vnet.subr 2847308803SKristof Provost 2947308803SKristof Provostis_master() 3047308803SKristof Provost{ 3147308803SKristof Provost jail=$1 3247308803SKristof Provost itf=$2 3347308803SKristof Provost 34*5311e733SKristof Provost jexec ${jail} ifconfig ${itf} | grep -E '(carp|vrrp)' | grep MASTER 3547308803SKristof Provost} 3647308803SKristof Provost 3747308803SKristof Provostwait_for_carp() 3847308803SKristof Provost{ 3947308803SKristof Provost jail1=$1 4047308803SKristof Provost itf1=$2 4147308803SKristof Provost jail2=$3 4247308803SKristof Provost itf2=$4 4347308803SKristof Provost 4447308803SKristof Provost while [ -z "$(is_master ${jail1} ${itf1})" ] && 4547308803SKristof Provost [ -z "$(is_master ${jail2} ${itf2})" ]; do 4647308803SKristof Provost sleep 1 4747308803SKristof Provost done 48f427703fSKristof Provost 49f427703fSKristof Provost if [ -n "$(is_master ${jail1} ${itf1})" ] && 50f427703fSKristof Provost [ -n "$(is_master ${jail2} ${itf2})" ]; then 51f427703fSKristof Provost atf_fail "Both jails are master" 52f427703fSKristof Provost fi 5347308803SKristof Provost} 5447308803SKristof Provost 55847b0d07SMarius Haldencarp_init() 56847b0d07SMarius Halden{ 57847b0d07SMarius Halden if ! kldstat -q -m carp; then 58847b0d07SMarius Halden atf_skip "This test requires carp" 59847b0d07SMarius Halden fi 60847b0d07SMarius Halden 61847b0d07SMarius Halden vnet_init 62847b0d07SMarius Halden} 63847b0d07SMarius Halden 6447308803SKristof Provostatf_test_case "basic_v4" "cleanup" 6547308803SKristof Provostbasic_v4_head() 6647308803SKristof Provost{ 6747308803SKristof Provost atf_set descr 'Basic CARP test (IPv4)' 6847308803SKristof Provost atf_set require.user root 6947308803SKristof Provost} 7047308803SKristof Provost 7147308803SKristof Provostbasic_v4_body() 7247308803SKristof Provost{ 73847b0d07SMarius Halden carp_init 7447308803SKristof Provost 7547308803SKristof Provost bridge=$(vnet_mkbridge) 7647308803SKristof Provost epair_one=$(vnet_mkepair) 7747308803SKristof Provost epair_two=$(vnet_mkepair) 7847308803SKristof Provost 7947308803SKristof Provost vnet_mkjail carp_basic_v4_one ${bridge} ${epair_one}a ${epair_two}a 8047308803SKristof Provost vnet_mkjail carp_basic_v4_two ${epair_one}b 8147308803SKristof Provost vnet_mkjail carp_basic_v4_three ${epair_two}b 8247308803SKristof Provost 8347308803SKristof Provost jexec carp_basic_v4_one ifconfig ${bridge} 192.0.2.4/29 up 8447308803SKristof Provost jexec carp_basic_v4_one ifconfig ${bridge} addm ${epair_one}a \ 8547308803SKristof Provost addm ${epair_two}a 8647308803SKristof Provost jexec carp_basic_v4_one ifconfig ${epair_one}a up 8747308803SKristof Provost jexec carp_basic_v4_one ifconfig ${epair_two}a up 8847308803SKristof Provost 8947308803SKristof Provost jexec carp_basic_v4_two ifconfig ${epair_one}b 192.0.2.202/29 up 9047308803SKristof Provost jexec carp_basic_v4_two ifconfig ${epair_one}b add vhid 1 192.0.2.1/29 9147308803SKristof Provost 9247308803SKristof Provost jexec carp_basic_v4_three ifconfig ${epair_two}b 192.0.2.203/29 up 9347308803SKristof Provost jexec carp_basic_v4_three ifconfig ${epair_two}b add vhid 1 \ 9447308803SKristof Provost 192.0.2.1/29 9547308803SKristof Provost 9647308803SKristof Provost wait_for_carp carp_basic_v4_two ${epair_one}b \ 9747308803SKristof Provost carp_basic_v4_three ${epair_two}b 9847308803SKristof Provost 9947308803SKristof Provost atf_check -s exit:0 -o ignore jexec carp_basic_v4_one \ 10047308803SKristof Provost ping -c 3 192.0.2.1 10147308803SKristof Provost} 10247308803SKristof Provost 10347308803SKristof Provostbasic_v4_cleanup() 10447308803SKristof Provost{ 10547308803SKristof Provost vnet_cleanup 10647308803SKristof Provost} 10747308803SKristof Provost 108*5311e733SKristof Provostatf_test_case "vrrp_v4" "cleanup" 109*5311e733SKristof Provostvrrp_v4_head() 110*5311e733SKristof Provost{ 111*5311e733SKristof Provost atf_set descr 'Basic VRRP test (IPv4)' 112*5311e733SKristof Provost atf_set require.user root 113*5311e733SKristof Provost} 114*5311e733SKristof Provost 115*5311e733SKristof Provostvrrp_v4_body() 116*5311e733SKristof Provost{ 117*5311e733SKristof Provost carp_init 118*5311e733SKristof Provost 119*5311e733SKristof Provost j=vrrp_basic_v4 120*5311e733SKristof Provost 121*5311e733SKristof Provost bridge=$(vnet_mkbridge) 122*5311e733SKristof Provost epair_one=$(vnet_mkepair) 123*5311e733SKristof Provost epair_two=$(vnet_mkepair) 124*5311e733SKristof Provost 125*5311e733SKristof Provost vnet_mkjail ${j}_one ${bridge} ${epair_one}a ${epair_two}a 126*5311e733SKristof Provost vnet_mkjail ${j}_two ${epair_one}b 127*5311e733SKristof Provost vnet_mkjail ${j}_three ${epair_two}b 128*5311e733SKristof Provost 129*5311e733SKristof Provost jexec ${j}_one ifconfig ${bridge} 192.0.2.4/29 up 130*5311e733SKristof Provost jexec ${j}_one ifconfig ${bridge} addm ${epair_one}a \ 131*5311e733SKristof Provost addm ${epair_two}a 132*5311e733SKristof Provost jexec ${j}_one ifconfig ${epair_one}a up 133*5311e733SKristof Provost jexec ${j}_one ifconfig ${epair_two}a up 134*5311e733SKristof Provost 135*5311e733SKristof Provost jexec ${j}_two ifconfig ${epair_one}b 192.0.2.202/29 up 136*5311e733SKristof Provost jexec ${j}_two ifconfig ${epair_one}b add vhid 1 carpver 3 192.0.2.1/29 137*5311e733SKristof Provost 138*5311e733SKristof Provost jexec ${j}_three ifconfig ${epair_two}b 192.0.2.203/29 up 139*5311e733SKristof Provost jexec ${j}_three ifconfig ${epair_two}b add vhid 1 carpver 3 \ 140*5311e733SKristof Provost 192.0.2.1/29 141*5311e733SKristof Provost 142*5311e733SKristof Provost wait_for_carp ${j}_two ${epair_one}b \ 143*5311e733SKristof Provost ${j}_three ${epair_two}b 144*5311e733SKristof Provost 145*5311e733SKristof Provost atf_check -s exit:0 -o ignore jexec ${j}_one \ 146*5311e733SKristof Provost ping -c 3 192.0.2.1 147*5311e733SKristof Provost} 148*5311e733SKristof Provost 149*5311e733SKristof Provostvrrp_v4_cleanup() 150*5311e733SKristof Provost{ 151*5311e733SKristof Provost vnet_cleanup 152*5311e733SKristof Provost} 15392c5dbbbSKristof Provost 15492c5dbbbSKristof Provostatf_test_case "unicast_v4" "cleanup" 15592c5dbbbSKristof Provostunicast_v4_head() 15692c5dbbbSKristof Provost{ 15792c5dbbbSKristof Provost atf_set descr 'Unicast CARP test (IPv4)' 15892c5dbbbSKristof Provost atf_set require.user root 15992c5dbbbSKristof Provost} 16092c5dbbbSKristof Provost 16192c5dbbbSKristof Provostunicast_v4_body() 16292c5dbbbSKristof Provost{ 16392c5dbbbSKristof Provost carp_init 16492c5dbbbSKristof Provost 16592c5dbbbSKristof Provost bridge=$(vnet_mkbridge) 16692c5dbbbSKristof Provost epair_one=$(vnet_mkepair) 16792c5dbbbSKristof Provost epair_two=$(vnet_mkepair) 16892c5dbbbSKristof Provost 16992c5dbbbSKristof Provost vnet_mkjail carp_uni_v4_one ${bridge} ${epair_one}a ${epair_two}a 17092c5dbbbSKristof Provost vnet_mkjail carp_uni_v4_two ${epair_one}b 17192c5dbbbSKristof Provost vnet_mkjail carp_uni_v4_three ${epair_two}b 17292c5dbbbSKristof Provost 17392c5dbbbSKristof Provost jexec carp_uni_v4_one ifconfig ${bridge} 192.0.2.4/29 up 17492c5dbbbSKristof Provost jexec carp_uni_v4_one sysctl net.inet.ip.forwarding=1 17592c5dbbbSKristof Provost jexec carp_uni_v4_one ifconfig ${bridge} addm ${epair_one}a \ 17692c5dbbbSKristof Provost addm ${epair_two}a 17792c5dbbbSKristof Provost jexec carp_uni_v4_one ifconfig ${epair_one}a up 17892c5dbbbSKristof Provost jexec carp_uni_v4_one ifconfig ${epair_two}a up 17992c5dbbbSKristof Provost jexec carp_uni_v4_one ifconfig ${bridge} inet alias 198.51.100.1/25 18092c5dbbbSKristof Provost jexec carp_uni_v4_one ifconfig ${bridge} inet alias 198.51.100.129/25 18192c5dbbbSKristof Provost 18292c5dbbbSKristof Provost jexec carp_uni_v4_two ifconfig ${epair_one}b 198.51.100.2/25 up 18392c5dbbbSKristof Provost jexec carp_uni_v4_two route add default 198.51.100.1 18492c5dbbbSKristof Provost jexec carp_uni_v4_two ifconfig ${epair_one}b add vhid 1 \ 18592c5dbbbSKristof Provost peer 198.51.100.130 192.0.2.1/29 18692c5dbbbSKristof Provost 18792c5dbbbSKristof Provost jexec carp_uni_v4_three ifconfig ${epair_two}b 198.51.100.130/25 up 18892c5dbbbSKristof Provost jexec carp_uni_v4_three route add default 198.51.100.129 18992c5dbbbSKristof Provost jexec carp_uni_v4_three ifconfig ${epair_two}b add vhid 1 \ 19092c5dbbbSKristof Provost peer 198.51.100.2 192.0.2.1/29 19192c5dbbbSKristof Provost 19292c5dbbbSKristof Provost # Sanity check 19392c5dbbbSKristof Provost atf_check -s exit:0 -o ignore jexec carp_uni_v4_two \ 19492c5dbbbSKristof Provost ping -c 1 198.51.100.130 19592c5dbbbSKristof Provost 19692c5dbbbSKristof Provost wait_for_carp carp_uni_v4_two ${epair_one}b \ 19792c5dbbbSKristof Provost carp_uni_v4_three ${epair_two}b 19892c5dbbbSKristof Provost 19992c5dbbbSKristof Provost atf_check -s exit:0 -o ignore jexec carp_uni_v4_one \ 20092c5dbbbSKristof Provost ping -c 3 192.0.2.1 20192c5dbbbSKristof Provost 20292c5dbbbSKristof Provost jexec carp_uni_v4_two ifconfig 20392c5dbbbSKristof Provost jexec carp_uni_v4_three ifconfig 20492c5dbbbSKristof Provost} 20592c5dbbbSKristof Provost 20692c5dbbbSKristof Provostunicast_v4_cleanup() 20792c5dbbbSKristof Provost{ 20892c5dbbbSKristof Provost vnet_cleanup 20992c5dbbbSKristof Provost} 21092c5dbbbSKristof Provost 21147308803SKristof Provostatf_test_case "basic_v6" "cleanup" 21247308803SKristof Provostbasic_v6_head() 21347308803SKristof Provost{ 21447308803SKristof Provost atf_set descr 'Basic CARP test (IPv6)' 21547308803SKristof Provost atf_set require.user root 21647308803SKristof Provost} 21747308803SKristof Provost 21847308803SKristof Provostbasic_v6_body() 21947308803SKristof Provost{ 220847b0d07SMarius Halden carp_init 22147308803SKristof Provost 22247308803SKristof Provost bridge=$(vnet_mkbridge) 22347308803SKristof Provost epair_one=$(vnet_mkepair) 22447308803SKristof Provost epair_two=$(vnet_mkepair) 22547308803SKristof Provost 22647308803SKristof Provost vnet_mkjail carp_basic_v6_one ${bridge} ${epair_one}a ${epair_two}a 22747308803SKristof Provost vnet_mkjail carp_basic_v6_two ${epair_one}b 22847308803SKristof Provost vnet_mkjail carp_basic_v6_three ${epair_two}b 22947308803SKristof Provost 23047308803SKristof Provost jexec carp_basic_v6_one ifconfig ${bridge} inet6 2001:db8::0:4/64 up \ 23147308803SKristof Provost no_dad 23247308803SKristof Provost jexec carp_basic_v6_one ifconfig ${bridge} addm ${epair_one}a \ 23347308803SKristof Provost addm ${epair_two}a 23447308803SKristof Provost jexec carp_basic_v6_one ifconfig ${epair_one}a up 23547308803SKristof Provost jexec carp_basic_v6_one ifconfig ${epair_two}a up 23647308803SKristof Provost 23747308803SKristof Provost jexec carp_basic_v6_two ifconfig ${epair_one}b inet6 \ 23847308803SKristof Provost 2001:db8::1:2/64 up no_dad 23947308803SKristof Provost jexec carp_basic_v6_two ifconfig ${epair_one}b inet6 add vhid 1 \ 24047308803SKristof Provost 2001:db8::0:1/64 24147308803SKristof Provost 24247308803SKristof Provost jexec carp_basic_v6_three ifconfig ${epair_two}b inet6 2001:db8::1:3/64 up no_dad 24347308803SKristof Provost jexec carp_basic_v6_three ifconfig ${epair_two}b inet6 add vhid 1 \ 24447308803SKristof Provost 2001:db8::0:1/64 24547308803SKristof Provost 24647308803SKristof Provost wait_for_carp carp_basic_v6_two ${epair_one}b \ 24747308803SKristof Provost carp_basic_v6_three ${epair_two}b 24847308803SKristof Provost 24947308803SKristof Provost atf_check -s exit:0 -o ignore jexec carp_basic_v6_one \ 25001f3f354SAlan Somers ping -6 -c 3 2001:db8::0:1 25147308803SKristof Provost} 25247308803SKristof Provost 25347308803SKristof Provostbasic_v6_cleanup() 25447308803SKristof Provost{ 25547308803SKristof Provost vnet_cleanup 25647308803SKristof Provost} 25747308803SKristof Provost 258*5311e733SKristof Provostatf_test_case "vrrp_v6" "cleanup" 259*5311e733SKristof Provostvrrp_v6_head() 260*5311e733SKristof Provost{ 261*5311e733SKristof Provost atf_set descr 'Basic VRRP test (IPv6)' 262*5311e733SKristof Provost atf_set require.user root 263*5311e733SKristof Provost} 264*5311e733SKristof Provost 265*5311e733SKristof Provostvrrp_v6_body() 266*5311e733SKristof Provost{ 267*5311e733SKristof Provost carp_init 268*5311e733SKristof Provost 269*5311e733SKristof Provost j=carp_basic_v6 270*5311e733SKristof Provost 271*5311e733SKristof Provost bridge=$(vnet_mkbridge) 272*5311e733SKristof Provost epair_one=$(vnet_mkepair) 273*5311e733SKristof Provost epair_two=$(vnet_mkepair) 274*5311e733SKristof Provost 275*5311e733SKristof Provost vnet_mkjail ${j}_one ${bridge} ${epair_one}a ${epair_two}a 276*5311e733SKristof Provost vnet_mkjail ${j}_two ${epair_one}b 277*5311e733SKristof Provost vnet_mkjail ${j}_three ${epair_two}b 278*5311e733SKristof Provost 279*5311e733SKristof Provost jexec ${j}_one ifconfig ${bridge} inet6 2001:db8::0:4/64 up \ 280*5311e733SKristof Provost no_dad 281*5311e733SKristof Provost jexec ${j}_one ifconfig ${bridge} addm ${epair_one}a \ 282*5311e733SKristof Provost addm ${epair_two}a 283*5311e733SKristof Provost jexec ${j}_one ifconfig ${epair_one}a up 284*5311e733SKristof Provost jexec ${j}_one ifconfig ${epair_two}a up 285*5311e733SKristof Provost 286*5311e733SKristof Provost jexec ${j}_two ifconfig ${epair_one}b inet6 \ 287*5311e733SKristof Provost 2001:db8::1:2/64 up no_dad 288*5311e733SKristof Provost jexec ${j}_two ifconfig ${epair_one}b inet6 add vhid 1 carpver 3 \ 289*5311e733SKristof Provost 2001:db8::0:1/64 290*5311e733SKristof Provost 291*5311e733SKristof Provost jexec ${j}_three ifconfig ${epair_two}b inet6 2001:db8::1:3/64 up no_dad 292*5311e733SKristof Provost jexec ${j}_three ifconfig ${epair_two}b inet6 add vhid 1 carpver 3 \ 293*5311e733SKristof Provost 2001:db8::0:1/64 294*5311e733SKristof Provost 295*5311e733SKristof Provost wait_for_carp ${j}_two ${epair_one}b \ 296*5311e733SKristof Provost ${j}_three ${epair_two}b 297*5311e733SKristof Provost 298*5311e733SKristof Provost atf_check -s exit:0 -o ignore jexec ${j}_one \ 299*5311e733SKristof Provost ping -6 -c 3 2001:db8::0:1 300*5311e733SKristof Provost} 301*5311e733SKristof Provost 302*5311e733SKristof Provostvrrp_v6_cleanup() 303*5311e733SKristof Provost{ 304*5311e733SKristof Provost vnet_cleanup 305*5311e733SKristof Provost} 306*5311e733SKristof Provost 307ddbd3a2bSKristof Provostatf_test_case "unicast_v6" "cleanup" 308ddbd3a2bSKristof Provostunicast_v6_head() 309ddbd3a2bSKristof Provost{ 310ddbd3a2bSKristof Provost atf_set descr 'Unicast CARP test (IPv6)' 311ddbd3a2bSKristof Provost atf_set require.user root 312ddbd3a2bSKristof Provost} 313ddbd3a2bSKristof Provost 314ddbd3a2bSKristof Provostunicast_v6_body() 315ddbd3a2bSKristof Provost{ 316ddbd3a2bSKristof Provost carp_init 317ddbd3a2bSKristof Provost 318ddbd3a2bSKristof Provost bridge=$(vnet_mkbridge) 319ddbd3a2bSKristof Provost epair_one=$(vnet_mkepair) 320ddbd3a2bSKristof Provost epair_two=$(vnet_mkepair) 321ddbd3a2bSKristof Provost 322ddbd3a2bSKristof Provost vnet_mkjail carp_uni_v6_one ${bridge} ${epair_one}a ${epair_two}a 323ddbd3a2bSKristof Provost vnet_mkjail carp_uni_v6_two ${epair_one}b 324ddbd3a2bSKristof Provost vnet_mkjail carp_uni_v6_three ${epair_two}b 325ddbd3a2bSKristof Provost 326ddbd3a2bSKristof Provost jexec carp_uni_v6_one sysctl net.inet6.ip6.forwarding=1 327ddbd3a2bSKristof Provost jexec carp_uni_v6_one ifconfig ${bridge} addm ${epair_one}a \ 328ddbd3a2bSKristof Provost addm ${epair_two}a 329ddbd3a2bSKristof Provost jexec carp_uni_v6_one ifconfig ${epair_one}a up 330ddbd3a2bSKristof Provost jexec carp_uni_v6_one ifconfig ${epair_two}a up 331ddbd3a2bSKristof Provost jexec carp_uni_v6_one ifconfig ${bridge} inet6 2001:db8::0:4/64 up \ 332ddbd3a2bSKristof Provost no_dad 333ddbd3a2bSKristof Provost jexec carp_uni_v6_one ifconfig ${bridge} inet6 alias 2001:db8:1::1/64 \ 334ddbd3a2bSKristof Provost no_dad up 335ddbd3a2bSKristof Provost jexec carp_uni_v6_one ifconfig ${bridge} inet6 alias 2001:db8:2::1/64 \ 336ddbd3a2bSKristof Provost no_dad up 337ddbd3a2bSKristof Provost 338ddbd3a2bSKristof Provost jexec carp_uni_v6_two ifconfig ${epair_one}b inet6 2001:db8:1::2/64 \ 339ddbd3a2bSKristof Provost no_dad up 340ddbd3a2bSKristof Provost jexec carp_uni_v6_two route -6 add default 2001:db8:1::1 341ddbd3a2bSKristof Provost jexec carp_uni_v6_two ifconfig ${epair_one}b inet6 add vhid 1 \ 342ddbd3a2bSKristof Provost peer6 2001:db8:2::2 \ 343ddbd3a2bSKristof Provost 2001:db8::0:1/64 344ddbd3a2bSKristof Provost 345ddbd3a2bSKristof Provost jexec carp_uni_v6_three ifconfig ${epair_two}b inet6 2001:db8:2::2/64 \ 346ddbd3a2bSKristof Provost no_dad up 347ddbd3a2bSKristof Provost jexec carp_uni_v6_three route -6 add default 2001:db8:2::1 348ddbd3a2bSKristof Provost jexec carp_uni_v6_three ifconfig ${epair_two}b inet6 add vhid 1 \ 349ddbd3a2bSKristof Provost peer6 2001:db8:1::2 \ 350ddbd3a2bSKristof Provost 2001:db8::0:1/64 351ddbd3a2bSKristof Provost 352ddbd3a2bSKristof Provost # Sanity check 353ddbd3a2bSKristof Provost atf_check -s exit:0 -o ignore jexec carp_uni_v6_two \ 354ddbd3a2bSKristof Provost ping -6 -c 1 2001:db8:2::2 355ddbd3a2bSKristof Provost 356ddbd3a2bSKristof Provost wait_for_carp carp_uni_v6_two ${epair_one}b \ 357ddbd3a2bSKristof Provost carp_uni_v6_three ${epair_two}b 358ddbd3a2bSKristof Provost 359ddbd3a2bSKristof Provost atf_check -s exit:0 -o ignore jexec carp_uni_v6_one \ 360ddbd3a2bSKristof Provost ping -6 -c 3 2001:db8::0:1 361ddbd3a2bSKristof Provost} 362ddbd3a2bSKristof Provost 363ddbd3a2bSKristof Provostunicast_v6_cleanup() 364ddbd3a2bSKristof Provost{ 365ddbd3a2bSKristof Provost vnet_cleanup 366ddbd3a2bSKristof Provost} 367ddbd3a2bSKristof Provost 36833ff01ceSKristof Provostatf_test_case "unicast_ll_v6" "cleanup" 36933ff01ceSKristof Provostunicast_ll_v6_head() 37033ff01ceSKristof Provost{ 37133ff01ceSKristof Provost atf_set descr 'Unicast CARP test (IPv6, link-local)' 37233ff01ceSKristof Provost atf_set require.user root 37333ff01ceSKristof Provost} 37433ff01ceSKristof Provost 37533ff01ceSKristof Provostunicast_ll_v6_body() 37633ff01ceSKristof Provost{ 37733ff01ceSKristof Provost carp_init 37833ff01ceSKristof Provost 3796408d025SKristof Provost j=carp_uni_ll_v6 3806408d025SKristof Provost 38133ff01ceSKristof Provost bridge=$(vnet_mkbridge) 38233ff01ceSKristof Provost epair_one=$(vnet_mkepair) 38333ff01ceSKristof Provost epair_two=$(vnet_mkepair) 38433ff01ceSKristof Provost 3856408d025SKristof Provost vnet_mkjail ${j}_one ${bridge} ${epair_one}a ${epair_two}a 3866408d025SKristof Provost vnet_mkjail ${j}_two ${epair_one}b 3876408d025SKristof Provost vnet_mkjail ${j}_three ${epair_two}b 38833ff01ceSKristof Provost 3896408d025SKristof Provost jexec ${j}_one ifconfig ${bridge} addm ${epair_one}a \ 39033ff01ceSKristof Provost addm ${epair_two}a 3916408d025SKristof Provost jexec ${j}_one ifconfig ${epair_one}a up 3926408d025SKristof Provost jexec ${j}_one ifconfig ${epair_two}a up 3936408d025SKristof Provost jexec ${j}_one ifconfig ${bridge} inet6 2001:db8::0:4/64 up \ 39433ff01ceSKristof Provost no_dad 3956408d025SKristof Provost jexec ${j}_one ifconfig ${bridge} inet6 alias 2001:db8:1::1/64 \ 39633ff01ceSKristof Provost no_dad up 39733ff01ceSKristof Provost 3986408d025SKristof Provost jexec ${j}_two ifconfig ${epair_one}b inet6 2001:db8:1::2/64 \ 39933ff01ceSKristof Provost no_dad up 4006408d025SKristof Provost jexec ${j}_three ifconfig ${epair_two}b inet6 2001:db8:1::3/64 \ 40133ff01ceSKristof Provost no_dad up 40233ff01ceSKristof Provost 4036408d025SKristof Provost ll_one=$(jexec ${j}_two ifconfig ${epair_one}b | awk "/ .*%${epair_one}b.* / { print \$2 }" | cut -d % -f 1) 4046408d025SKristof Provost ll_two=$(jexec ${j}_three ifconfig ${epair_two}b | awk "/ .*%${epair_two}b.* / { print \$2 }" | cut -d % -f 1) 40533ff01ceSKristof Provost 4066408d025SKristof Provost jexec ${j}_two ifconfig ${epair_one}b inet6 add vhid 1 \ 40733ff01ceSKristof Provost peer6 ${ll_two} \ 40833ff01ceSKristof Provost 2001:db8::0:1/64 4096408d025SKristof Provost jexec ${j}_three ifconfig ${epair_two}b inet6 add vhid 1 \ 41033ff01ceSKristof Provost peer6 ${ll_one} \ 41133ff01ceSKristof Provost 2001:db8::0:1/64 41233ff01ceSKristof Provost 41333ff01ceSKristof Provost # Sanity check 4146408d025SKristof Provost atf_check -s exit:0 -o ignore jexec ${j}_two \ 41533ff01ceSKristof Provost ping -6 -c 1 2001:db8:1::3 41633ff01ceSKristof Provost 4176408d025SKristof Provost wait_for_carp ${j}_two ${epair_one}b \ 4186408d025SKristof Provost ${j}_three ${epair_two}b 41933ff01ceSKristof Provost 4206408d025SKristof Provost atf_check -s exit:0 -o ignore jexec ${j}_one \ 42133ff01ceSKristof Provost ping -6 -c 3 2001:db8::0:1 42233ff01ceSKristof Provost} 42333ff01ceSKristof Provost 42433ff01ceSKristof Provostunicast_ll_v6_cleanup() 42533ff01ceSKristof Provost{ 42633ff01ceSKristof Provost vnet_cleanup 42733ff01ceSKristof Provost} 42833ff01ceSKristof Provost 429847b0d07SMarius Haldenatf_test_case "negative_demotion" "cleanup" 430847b0d07SMarius Haldennegative_demotion_head() 431847b0d07SMarius Halden{ 432847b0d07SMarius Halden atf_set descr 'Test PR #259528' 433847b0d07SMarius Halden atf_set require.user root 434847b0d07SMarius Halden} 435847b0d07SMarius Halden 436847b0d07SMarius Haldennegative_demotion_body() 437847b0d07SMarius Halden{ 438847b0d07SMarius Halden carp_init 439847b0d07SMarius Halden 440847b0d07SMarius Halden epair=$(vnet_mkepair) 441847b0d07SMarius Halden 442847b0d07SMarius Halden vnet_mkjail one ${epair}a 443847b0d07SMarius Halden jexec one sysctl net.inet.carp.preempt=1 444847b0d07SMarius Halden jexec one ifconfig ${epair}a 192.0.2.1/24 up 445847b0d07SMarius Halden jexec one ifconfig ${epair}a add vhid 1 192.0.2.254/24 \ 446847b0d07SMarius Halden advskew 0 pass foobar 447847b0d07SMarius Halden 448847b0d07SMarius Halden vnet_mkjail two ${epair}b 449847b0d07SMarius Halden jexec two sysctl net.inet.carp.preempt=1 450847b0d07SMarius Halden jexec two ifconfig ${epair}b 192.0.2.2/24 up 451847b0d07SMarius Halden jexec two ifconfig ${epair}b add vhid 1 192.0.2.254/24 \ 452847b0d07SMarius Halden advskew 100 pass foobar 453847b0d07SMarius Halden 454847b0d07SMarius Halden # Allow things to settle 455847b0d07SMarius Halden wait_for_carp one ${epair}a two ${epair}b 456847b0d07SMarius Halden 457847b0d07SMarius Halden if is_master one ${epair}a && is_master two ${epair}b 458847b0d07SMarius Halden then 459847b0d07SMarius Halden atf_fail "Two masters!" 460847b0d07SMarius Halden fi 461847b0d07SMarius Halden 462847b0d07SMarius Halden jexec one sysctl net.inet.carp.demotion=-1 463847b0d07SMarius Halden sleep 3 464847b0d07SMarius Halden 465847b0d07SMarius Halden if is_master one ${epair}a && is_master two ${epair}b 466847b0d07SMarius Halden then 467847b0d07SMarius Halden atf_fail "Two masters!" 468847b0d07SMarius Halden fi 469847b0d07SMarius Halden} 470847b0d07SMarius Halden 471847b0d07SMarius Haldennegative_demotion_cleanup() 472847b0d07SMarius Halden{ 473847b0d07SMarius Halden vnet_cleanup 474847b0d07SMarius Halden} 475847b0d07SMarius Halden 4764a178afbSThomas Steen Rasmussen 4774a178afbSThomas Steen Rasmussen 4784a178afbSThomas Steen Rasmussenatf_test_case "nd6_ns_source_mac" "cleanup" 4794a178afbSThomas Steen Rasmussennd6_ns_source_mac_head() 4804a178afbSThomas Steen Rasmussen{ 4814a178afbSThomas Steen Rasmussen atf_set descr 'CARP ndp neighbor solicitation MAC source test (IPv6)' 4824a178afbSThomas Steen Rasmussen atf_set require.user root 4834a178afbSThomas Steen Rasmussen} 4844a178afbSThomas Steen Rasmussen 4854a178afbSThomas Steen Rasmussennd6_ns_source_mac_body() 4864a178afbSThomas Steen Rasmussen{ 4874a178afbSThomas Steen Rasmussen carp_init 4884a178afbSThomas Steen Rasmussen 4894a178afbSThomas Steen Rasmussen bridge=$(vnet_mkbridge) 4904a178afbSThomas Steen Rasmussen epair_one=$(vnet_mkepair) 4914a178afbSThomas Steen Rasmussen epair_two=$(vnet_mkepair) 4924a178afbSThomas Steen Rasmussen 4934a178afbSThomas Steen Rasmussen vnet_mkjail carp_ndp_v6_bridge ${bridge} ${epair_one}a ${epair_two}a 4944a178afbSThomas Steen Rasmussen vnet_mkjail carp_ndp_v6_master ${epair_one}b 4954a178afbSThomas Steen Rasmussen vnet_mkjail carp_ndp_v6_slave ${epair_two}b 4964a178afbSThomas Steen Rasmussen 4974a178afbSThomas Steen Rasmussen jexec carp_ndp_v6_bridge ifconfig ${bridge} inet6 2001:db8::0:4/64 up \ 4984a178afbSThomas Steen Rasmussen no_dad 4994a178afbSThomas Steen Rasmussen jexec carp_ndp_v6_bridge ifconfig ${bridge} addm ${epair_one}a \ 5004a178afbSThomas Steen Rasmussen addm ${epair_two}a 5014a178afbSThomas Steen Rasmussen jexec carp_ndp_v6_bridge ifconfig ${epair_one}a up 5024a178afbSThomas Steen Rasmussen jexec carp_ndp_v6_bridge ifconfig ${epair_two}a up 5034a178afbSThomas Steen Rasmussen 5044a178afbSThomas Steen Rasmussen jexec carp_ndp_v6_master ifconfig ${epair_one}b inet6 \ 5054a178afbSThomas Steen Rasmussen 2001:db8::1:2/64 up no_dad 5064a178afbSThomas Steen Rasmussen jexec carp_ndp_v6_master ifconfig ${epair_one}b inet6 add vhid 1 \ 5074a178afbSThomas Steen Rasmussen advskew 0 2001:db8::0:1/64 5084a178afbSThomas Steen Rasmussen 5094a178afbSThomas Steen Rasmussen jexec carp_ndp_v6_slave ifconfig ${epair_two}b inet6 \ 5104a178afbSThomas Steen Rasmussen 2001:db8::1:3/64 up no_dad 5114a178afbSThomas Steen Rasmussen jexec carp_ndp_v6_slave ifconfig ${epair_two}b inet6 add vhid 1 \ 5124a178afbSThomas Steen Rasmussen advskew 100 2001:db8::0:1/64 5134a178afbSThomas Steen Rasmussen 5144a178afbSThomas Steen Rasmussen wait_for_carp carp_ndp_v6_master ${epair_one}b \ 5154a178afbSThomas Steen Rasmussen carp_ndp_v6_slave ${epair_two}b 5164a178afbSThomas Steen Rasmussen 5174a178afbSThomas Steen Rasmussen # carp_ndp_v6_master is MASTER 5184a178afbSThomas Steen Rasmussen 5194a178afbSThomas Steen Rasmussen # trigger a NS from the virtual IP from the BACKUP 5204a178afbSThomas Steen Rasmussen atf_check -s exit:2 -o ignore jexec carp_ndp_v6_slave \ 5214a178afbSThomas Steen Rasmussen ping -6 -c 3 -S 2001:db8::0:1 2001:db8::0:4 5224a178afbSThomas Steen Rasmussen 5234a178afbSThomas Steen Rasmussen # trigger a NS from the virtual IP from the MASTER, 5244a178afbSThomas Steen Rasmussen # this ping should work 5254a178afbSThomas Steen Rasmussen atf_check -s exit:0 -o ignore jexec carp_ndp_v6_master \ 5264a178afbSThomas Steen Rasmussen ping -6 -c 3 -S 2001:db8::0:1 2001:db8::0:4 5274a178afbSThomas Steen Rasmussen 5284a178afbSThomas Steen Rasmussen # ndp entry should be for the virtual mac 5294a178afbSThomas Steen Rasmussen atf_check -o match:'2001:db8::1 +00:00:5e:00:01:01' \ 5304a178afbSThomas Steen Rasmussen jexec carp_ndp_v6_bridge ndp -an 5314a178afbSThomas Steen Rasmussen} 5324a178afbSThomas Steen Rasmussen 5334a178afbSThomas Steen Rasmussennd6_ns_source_mac_cleanup() 5344a178afbSThomas Steen Rasmussen{ 5354a178afbSThomas Steen Rasmussen vnet_cleanup 5364a178afbSThomas Steen Rasmussen} 5374a178afbSThomas Steen Rasmussen 5384a178afbSThomas Steen Rasmussen 5399d48283dSKristof Provostatf_test_case "switch" "cleanup" 5409d48283dSKristof Provostswitch_head() 5419d48283dSKristof Provost{ 5429d48283dSKristof Provost atf_set descr 'Switch between master and backup' 5439d48283dSKristof Provost atf_set require.user root 5449d48283dSKristof Provost} 5459d48283dSKristof Provost 5469d48283dSKristof Provostswitch_body() 5479d48283dSKristof Provost{ 5489d48283dSKristof Provost carp_init 5499d48283dSKristof Provost 5509d48283dSKristof Provost epair=$(vnet_mkepair) 5519d48283dSKristof Provost 5529d48283dSKristof Provost ifconfig ${epair}a up 5539d48283dSKristof Provost ifconfig ${epair}a vhid 1 advskew 100 192.0.2.1/24 5549d48283dSKristof Provost ifconfig ${epair}a vhid 1 state backup 5559d48283dSKristof Provost ifconfig ${epair}a vhid 1 state master 5569d48283dSKristof Provost} 5579d48283dSKristof Provost 5589d48283dSKristof Provostswitch_cleanup() 5599d48283dSKristof Provost{ 5609d48283dSKristof Provost vnet_cleanup 5619d48283dSKristof Provost} 5629d48283dSKristof Provost 56347308803SKristof Provostatf_init_test_cases() 56447308803SKristof Provost{ 56547308803SKristof Provost atf_add_test_case "basic_v4" 566*5311e733SKristof Provost atf_add_test_case "vrrp_v4" 56792c5dbbbSKristof Provost atf_add_test_case "unicast_v4" 56847308803SKristof Provost atf_add_test_case "basic_v6" 569*5311e733SKristof Provost atf_add_test_case "vrrp_v6" 570ddbd3a2bSKristof Provost atf_add_test_case "unicast_v6" 57133ff01ceSKristof Provost atf_add_test_case "unicast_ll_v6" 572847b0d07SMarius Halden atf_add_test_case "negative_demotion" 5734a178afbSThomas Steen Rasmussen atf_add_test_case "nd6_ns_source_mac" 5749d48283dSKristof Provost atf_add_test_case "switch" 57547308803SKristof Provost} 576