xref: /freebsd/tests/sys/netinet6/lpm6.sh (revision 768c98a737ef957ee26afd30d5e2a7e83b97e34f)
1*768c98a7SAlexander V. Chernikov#!/usr/bin/env atf-sh
2*768c98a7SAlexander V. Chernikov#-
3*768c98a7SAlexander V. Chernikov# SPDX-License-Identifier: BSD-2-Clause
4*768c98a7SAlexander V. Chernikov#
5*768c98a7SAlexander V. Chernikov# Copyright (c) 2020 Alexander V. Chernikov
6*768c98a7SAlexander V. Chernikov#
7*768c98a7SAlexander V. Chernikov# Redistribution and use in source and binary forms, with or without
8*768c98a7SAlexander V. Chernikov# modification, are permitted provided that the following conditions
9*768c98a7SAlexander V. Chernikov# are met:
10*768c98a7SAlexander V. Chernikov# 1. Redistributions of source code must retain the above copyright
11*768c98a7SAlexander V. Chernikov#    notice, this list of conditions and the following disclaimer.
12*768c98a7SAlexander V. Chernikov# 2. Redistributions in binary form must reproduce the above copyright
13*768c98a7SAlexander V. Chernikov#    notice, this list of conditions and the following disclaimer in the
14*768c98a7SAlexander V. Chernikov#    documentation and/or other materials provided with the distribution.
15*768c98a7SAlexander V. Chernikov#
16*768c98a7SAlexander V. Chernikov# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17*768c98a7SAlexander V. Chernikov# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*768c98a7SAlexander V. Chernikov# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*768c98a7SAlexander V. Chernikov# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20*768c98a7SAlexander V. Chernikov# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21*768c98a7SAlexander V. Chernikov# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22*768c98a7SAlexander V. Chernikov# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23*768c98a7SAlexander V. Chernikov# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24*768c98a7SAlexander V. Chernikov# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25*768c98a7SAlexander V. Chernikov# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26*768c98a7SAlexander V. Chernikov# SUCH DAMAGE.
27*768c98a7SAlexander V. Chernikov#
28*768c98a7SAlexander V. Chernikov# $FreeBSD$
29*768c98a7SAlexander V. Chernikov#
30*768c98a7SAlexander V. Chernikov
31*768c98a7SAlexander V. Chernikov. $(atf_get_srcdir)/../common/vnet.subr
32*768c98a7SAlexander V. Chernikov
33*768c98a7SAlexander V. Chernikovsetup_networking()
34*768c98a7SAlexander V. Chernikov{
35*768c98a7SAlexander V. Chernikov	jname="$1"
36*768c98a7SAlexander V. Chernikov	lo_dst="$2"
37*768c98a7SAlexander V. Chernikov	epair0="$3"
38*768c98a7SAlexander V. Chernikov	epair1="$4"
39*768c98a7SAlexander V. Chernikov
40*768c98a7SAlexander V. Chernikov	vnet_mkjail ${jname}a ${epair0}a ${epair1}a ${lo_src}
41*768c98a7SAlexander V. Chernikov	# enable link-local IPv6
42*768c98a7SAlexander V. Chernikov	jexec ${jname}a ndp -i ${epair0}a -- -disabled
43*768c98a7SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair0}a up
44*768c98a7SAlexander V. Chernikov	jexec ${jname}a ndp -i ${epair1}a -- -disabled
45*768c98a7SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair1}a up
46*768c98a7SAlexander V. Chernikov	jexec ${jname}a ifconfig ${lo_src} up
47*768c98a7SAlexander V. Chernikov
48*768c98a7SAlexander V. Chernikov	vnet_mkjail ${jname}b ${epair0}b ${epair1}b ${lo_dst}
49*768c98a7SAlexander V. Chernikov	jexec ${jname}b ndp -i ${epair0}b -- -disabled
50*768c98a7SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair0}b up
51*768c98a7SAlexander V. Chernikov	jexec ${jname}b ndp -i ${epair1}b -- -disabled
52*768c98a7SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair1}b up
53*768c98a7SAlexander V. Chernikov	jexec ${jname}b ifconfig ${lo_dst} up
54*768c98a7SAlexander V. Chernikov
55*768c98a7SAlexander V. Chernikov	# wait for DAD to complete
56*768c98a7SAlexander V. Chernikov	while [ `jexec ${jname}b ifconfig | grep inet6 | grep -c tentative` != "0" ]; do
57*768c98a7SAlexander V. Chernikov		sleep 0.1
58*768c98a7SAlexander V. Chernikov	done
59*768c98a7SAlexander V. Chernikov	while [ `jexec ${jname}a ifconfig | grep inet6 | grep -c tentative` != "0" ]; do
60*768c98a7SAlexander V. Chernikov		sleep 0.1
61*768c98a7SAlexander V. Chernikov	done
62*768c98a7SAlexander V. Chernikov}
63*768c98a7SAlexander V. Chernikov
64*768c98a7SAlexander V. Chernikov
65*768c98a7SAlexander V. Chernikovatf_test_case "lpm6_test1_success" "cleanup"
66*768c98a7SAlexander V. Chernikovlpm6_test1_success_head()
67*768c98a7SAlexander V. Chernikov{
68*768c98a7SAlexander V. Chernikov
69*768c98a7SAlexander V. Chernikov	atf_set descr 'Test IPv6 LPM for the host routes'
70*768c98a7SAlexander V. Chernikov	atf_set require.user root
71*768c98a7SAlexander V. Chernikov}
72*768c98a7SAlexander V. Chernikov
73*768c98a7SAlexander V. Chernikovlpm6_test1_success_body()
74*768c98a7SAlexander V. Chernikov{
75*768c98a7SAlexander V. Chernikov
76*768c98a7SAlexander V. Chernikov	vnet_init
77*768c98a7SAlexander V. Chernikov
78*768c98a7SAlexander V. Chernikov	net_dst="2001:db8:"
79*768c98a7SAlexander V. Chernikov
80*768c98a7SAlexander V. Chernikov	jname="v6t-lpm6_test1_success"
81*768c98a7SAlexander V. Chernikov
82*768c98a7SAlexander V. Chernikov	epair0=$(vnet_mkepair)
83*768c98a7SAlexander V. Chernikov	epair1=$(vnet_mkepair)
84*768c98a7SAlexander V. Chernikov	lo_dst=$(vnet_mkloopback)
85*768c98a7SAlexander V. Chernikov
86*768c98a7SAlexander V. Chernikov	setup_networking ${jname} ${lo_dst} ${epair0} ${epair1}
87*768c98a7SAlexander V. Chernikov
88*768c98a7SAlexander V. Chernikov	jexec ${jname}b ifconfig ${lo_dst} inet6 ${net_dst}:2:0/128
89*768c98a7SAlexander V. Chernikov	jexec ${jname}b ifconfig ${lo_dst} inet6 ${net_dst}:2:1/128
90*768c98a7SAlexander V. Chernikov
91*768c98a7SAlexander V. Chernikov	# Add routes
92*768c98a7SAlexander V. Chernikov	# A -> towards B via epair0a LL
93*768c98a7SAlexander V. Chernikov	ll=`jexec ${jname}b ifconfig ${epair0}b inet6 | awk '$2~/^fe80:/{print$2}' | awk -F% '{print$1}'`
94*768c98a7SAlexander V. Chernikov	jexec ${jname}a route add -6 -host ${net_dst}:2:0  ${ll}%${epair0}a
95*768c98a7SAlexander V. Chernikov	# A -> towards B via epair1a LL
96*768c98a7SAlexander V. Chernikov	ll=`jexec ${jname}b ifconfig ${epair1}b inet6 | awk '$2~/^fe80:/{print$2}' | awk -F% '{print$1}'`
97*768c98a7SAlexander V. Chernikov	jexec ${jname}a route add -6 -host ${net_dst}:2:1 ${ll}%${epair1}a
98*768c98a7SAlexander V. Chernikov
99*768c98a7SAlexander V. Chernikov	count=20
100*768c98a7SAlexander V. Chernikov	valid_message="${count} packets transmitted, ${count} packets received"
101*768c98a7SAlexander V. Chernikov
102*768c98a7SAlexander V. Chernikov	# Check that ${net_dst}:2:0 goes via epair0
103*768c98a7SAlexander V. Chernikov	atf_check -o match:"${valid_message}" jexec ${jname}a ping6 -f -nc${count} ${net_dst}:2:0
104*768c98a7SAlexander V. Chernikov	pkt_0=`jexec ${jname}a netstat -Wf link -I ${epair0}a | head | awk '$1!~/^Name/{print$8}'`
105*768c98a7SAlexander V. Chernikov	pkt_1=`jexec ${jname}a netstat -Wf link -I ${epair1}a | head | awk '$1!~/^Name/{print$8}'`
106*768c98a7SAlexander V. Chernikov	if [ ${pkt_0} -le ${count} ]; then
107*768c98a7SAlexander V. Chernikov		echo "LPM failure: 1: ${pkt_0} (should be ${count})  2: ${pkt_1}"
108*768c98a7SAlexander V. Chernikov		exit 1
109*768c98a7SAlexander V. Chernikov	fi
110*768c98a7SAlexander V. Chernikov
111*768c98a7SAlexander V. Chernikov	# Check that ${net_dst}:2:1 goes via epair1
112*768c98a7SAlexander V. Chernikov	atf_check -o match:"${valid_message}" jexec ${jname}a ping6 -f -nc${count} ${net_dst}:2:1
113*768c98a7SAlexander V. Chernikov	pkt_0=`jexec ${jname}a netstat -Wf link -I ${epair0}a | head | awk '$1!~/^Name/{print$8}'`
114*768c98a7SAlexander V. Chernikov	pkt_1=`jexec ${jname}a netstat -Wf link -I ${epair1}a | head | awk '$1!~/^Name/{print$8}'`
115*768c98a7SAlexander V. Chernikov	if [ ${pkt_1} -le ${count} ]; then
116*768c98a7SAlexander V. Chernikov		echo "LPM failure: 1: ${pkt_0} 2: ${pkt_1} (should be ${count})"
117*768c98a7SAlexander V. Chernikov		exit 1
118*768c98a7SAlexander V. Chernikov	fi
119*768c98a7SAlexander V. Chernikov
120*768c98a7SAlexander V. Chernikov	echo "RAW BALANCING: 1: ${pkt_0} 2: ${pkt_1}"
121*768c98a7SAlexander V. Chernikov}
122*768c98a7SAlexander V. Chernikov
123*768c98a7SAlexander V. Chernikovlpm6_test1_success_cleanup()
124*768c98a7SAlexander V. Chernikov{
125*768c98a7SAlexander V. Chernikov	vnet_cleanup
126*768c98a7SAlexander V. Chernikov}
127*768c98a7SAlexander V. Chernikov
128*768c98a7SAlexander V. Chernikovatf_test_case "lpm6_test2_success" "cleanup"
129*768c98a7SAlexander V. Chernikovlpm6_test2_success_head()
130*768c98a7SAlexander V. Chernikov{
131*768c98a7SAlexander V. Chernikov
132*768c98a7SAlexander V. Chernikov	atf_set descr 'Test IPv6 LPM for /126 and /127'
133*768c98a7SAlexander V. Chernikov	atf_set require.user root
134*768c98a7SAlexander V. Chernikov}
135*768c98a7SAlexander V. Chernikov
136*768c98a7SAlexander V. Chernikovlpm6_test2_success_body()
137*768c98a7SAlexander V. Chernikov{
138*768c98a7SAlexander V. Chernikov
139*768c98a7SAlexander V. Chernikov	vnet_init
140*768c98a7SAlexander V. Chernikov
141*768c98a7SAlexander V. Chernikov	net_dst="2001:db8:"
142*768c98a7SAlexander V. Chernikov
143*768c98a7SAlexander V. Chernikov	jname="v6t-lpm6_test2_success"
144*768c98a7SAlexander V. Chernikov
145*768c98a7SAlexander V. Chernikov	epair0=$(vnet_mkepair)
146*768c98a7SAlexander V. Chernikov	epair1=$(vnet_mkepair)
147*768c98a7SAlexander V. Chernikov	lo_dst=$(vnet_mkloopback)
148*768c98a7SAlexander V. Chernikov
149*768c98a7SAlexander V. Chernikov	setup_networking ${jname} ${lo_dst} ${epair0} ${epair1}
150*768c98a7SAlexander V. Chernikov
151*768c98a7SAlexander V. Chernikov	jexec ${jname}b ifconfig ${lo_dst} inet6 ${net_dst}:2:0/128
152*768c98a7SAlexander V. Chernikov	jexec ${jname}b ifconfig ${lo_dst} inet6 ${net_dst}:2:2/128
153*768c98a7SAlexander V. Chernikov
154*768c98a7SAlexander V. Chernikov	# Add routes
155*768c98a7SAlexander V. Chernikov	# A -> towards B via epair0a LL
156*768c98a7SAlexander V. Chernikov	ll=`jexec ${jname}b ifconfig ${epair0}b inet6 | awk '$2~/^fe80:/{print$2}' | awk -F% '{print$1}'`
157*768c98a7SAlexander V. Chernikov	jexec ${jname}a route add -6 -net ${net_dst}:2:0/126  ${ll}%${epair0}a
158*768c98a7SAlexander V. Chernikov	# A -> towards B via epair1a LL
159*768c98a7SAlexander V. Chernikov	ll=`jexec ${jname}b ifconfig ${epair1}b inet6 | awk '$2~/^fe80:/{print$2}' | awk -F% '{print$1}'`
160*768c98a7SAlexander V. Chernikov	jexec ${jname}a route add -6 -net ${net_dst}:2:0/127 ${ll}%${epair1}a
161*768c98a7SAlexander V. Chernikov
162*768c98a7SAlexander V. Chernikov	count=20
163*768c98a7SAlexander V. Chernikov	valid_message="${count} packets transmitted, ${count} packets received"
164*768c98a7SAlexander V. Chernikov
165*768c98a7SAlexander V. Chernikov	# Check that ${net_dst}:2:0 goes via epair1
166*768c98a7SAlexander V. Chernikov	atf_check -o match:"${valid_message}" jexec ${jname}a ping6 -f -nc${count} ${net_dst}:2:0
167*768c98a7SAlexander V. Chernikov	pkt_0=`jexec ${jname}a netstat -Wf link -I ${epair0}a | head | awk '$1!~/^Name/{print$8}'`
168*768c98a7SAlexander V. Chernikov	pkt_1=`jexec ${jname}a netstat -Wf link -I ${epair1}a | head | awk '$1!~/^Name/{print$8}'`
169*768c98a7SAlexander V. Chernikov	if [ ${pkt_1} -le ${count} ]; then
170*768c98a7SAlexander V. Chernikov		echo "LPM failure: 1: ${pkt_0} 2: ${pkt_1} (should be ${count})"
171*768c98a7SAlexander V. Chernikov		exit 1
172*768c98a7SAlexander V. Chernikov	fi
173*768c98a7SAlexander V. Chernikov
174*768c98a7SAlexander V. Chernikov	# Check that ${net_dst}:2:2 goes via epair0
175*768c98a7SAlexander V. Chernikov	atf_check -o match:"${valid_message}" jexec ${jname}a ping6 -f -nc${count} ${net_dst}:2:2
176*768c98a7SAlexander V. Chernikov	pkt_0=`jexec ${jname}a netstat -Wf link -I ${epair0}a | head | awk '$1!~/^Name/{print$8}'`
177*768c98a7SAlexander V. Chernikov	pkt_1=`jexec ${jname}a netstat -Wf link -I ${epair1}a | head | awk '$1!~/^Name/{print$8}'`
178*768c98a7SAlexander V. Chernikov	if [ ${pkt_0} -le ${count} ]; then
179*768c98a7SAlexander V. Chernikov		echo "LPM failure: 1: ${pkt_0} (should be ${count})  2: ${pkt_1}"
180*768c98a7SAlexander V. Chernikov		exit 1
181*768c98a7SAlexander V. Chernikov	fi
182*768c98a7SAlexander V. Chernikov
183*768c98a7SAlexander V. Chernikov	echo "RAW BALANCING: 1: ${pkt_0} 2: ${pkt_1}"
184*768c98a7SAlexander V. Chernikov}
185*768c98a7SAlexander V. Chernikov
186*768c98a7SAlexander V. Chernikovlpm6_test2_success_cleanup()
187*768c98a7SAlexander V. Chernikov{
188*768c98a7SAlexander V. Chernikov	vnet_cleanup
189*768c98a7SAlexander V. Chernikov}
190*768c98a7SAlexander V. Chernikov
191*768c98a7SAlexander V. Chernikovatf_init_test_cases()
192*768c98a7SAlexander V. Chernikov{
193*768c98a7SAlexander V. Chernikov	atf_add_test_case "lpm6_test1_success"
194*768c98a7SAlexander V. Chernikov	atf_add_test_case "lpm6_test2_success"
195*768c98a7SAlexander V. Chernikov}
196*768c98a7SAlexander V. Chernikov
197*768c98a7SAlexander V. Chernikov# end
198*768c98a7SAlexander V. Chernikov
199*768c98a7SAlexander V. Chernikov
200