xref: /freebsd/tests/sys/netinet/carp.sh (revision 5311e733)
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