xref: /freebsd/tests/sys/netinet6/output6.sh (revision d0b2dbfa0ecf2bbc9709efc5e20baf8e4b44bbbf)
1b4a4a3b8SAlexander V. Chernikov#!/usr/bin/env atf-sh
2b4a4a3b8SAlexander V. Chernikov#-
3b4a4a3b8SAlexander V. Chernikov# SPDX-License-Identifier: BSD-2-Clause
4b4a4a3b8SAlexander V. Chernikov#
5b4a4a3b8SAlexander V. Chernikov# Copyright (c) 2020 Alexander V. Chernikov
6b4a4a3b8SAlexander V. Chernikov#
7b4a4a3b8SAlexander V. Chernikov# Redistribution and use in source and binary forms, with or without
8b4a4a3b8SAlexander V. Chernikov# modification, are permitted provided that the following conditions
9b4a4a3b8SAlexander V. Chernikov# are met:
10b4a4a3b8SAlexander V. Chernikov# 1. Redistributions of source code must retain the above copyright
11b4a4a3b8SAlexander V. Chernikov#    notice, this list of conditions and the following disclaimer.
12b4a4a3b8SAlexander V. Chernikov# 2. Redistributions in binary form must reproduce the above copyright
13b4a4a3b8SAlexander V. Chernikov#    notice, this list of conditions and the following disclaimer in the
14b4a4a3b8SAlexander V. Chernikov#    documentation and/or other materials provided with the distribution.
15b4a4a3b8SAlexander V. Chernikov#
16b4a4a3b8SAlexander V. Chernikov# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17b4a4a3b8SAlexander V. Chernikov# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18b4a4a3b8SAlexander V. Chernikov# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19b4a4a3b8SAlexander V. Chernikov# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20b4a4a3b8SAlexander V. Chernikov# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21b4a4a3b8SAlexander V. Chernikov# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22b4a4a3b8SAlexander V. Chernikov# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23b4a4a3b8SAlexander V. Chernikov# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24b4a4a3b8SAlexander V. Chernikov# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25b4a4a3b8SAlexander V. Chernikov# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26b4a4a3b8SAlexander V. Chernikov# SUCH DAMAGE.
27b4a4a3b8SAlexander V. Chernikov#
28b4a4a3b8SAlexander V. Chernikov#
29b4a4a3b8SAlexander V. Chernikov
30b4a4a3b8SAlexander V. Chernikov. $(atf_get_srcdir)/../common/vnet.subr
31b4a4a3b8SAlexander V. Chernikov
32b4a4a3b8SAlexander V. Chernikovatf_test_case "output6_tcp_setup_success" "cleanup"
33b4a4a3b8SAlexander V. Chernikovoutput6_tcp_setup_success_head()
34b4a4a3b8SAlexander V. Chernikov{
35b4a4a3b8SAlexander V. Chernikov
36b4a4a3b8SAlexander V. Chernikov	atf_set descr 'Test valid IPv6 TCP output'
37b4a4a3b8SAlexander V. Chernikov	atf_set require.user root
38b4a4a3b8SAlexander V. Chernikov}
39b4a4a3b8SAlexander V. Chernikov
40b4a4a3b8SAlexander V. Chernikovoutput6_tcp_setup_success_body()
41b4a4a3b8SAlexander V. Chernikov{
42b4a4a3b8SAlexander V. Chernikov
43b4a4a3b8SAlexander V. Chernikov	vnet_init
44b4a4a3b8SAlexander V. Chernikov
45b4a4a3b8SAlexander V. Chernikov	net_src="2001:db8:0:0:1::"
46b4a4a3b8SAlexander V. Chernikov	net_dst="2001:db8:0:0:1::"
47b4a4a3b8SAlexander V. Chernikov	ip_src="${net_src}1"
48b4a4a3b8SAlexander V. Chernikov	ip_dst=${net_dst}4242
49b4a4a3b8SAlexander V. Chernikov	plen=64
50b4a4a3b8SAlexander V. Chernikov	text="testtesttst"
51b4a4a3b8SAlexander V. Chernikov	port=4242
52b4a4a3b8SAlexander V. Chernikov
53b4a4a3b8SAlexander V. Chernikov	script_name=`dirname $0`/../common/net_receiver.py
54b4a4a3b8SAlexander V. Chernikov	script_name=`realpath ${script_name}`
55b4a4a3b8SAlexander V. Chernikov	jname="v6t-output6_tcp_setup_success"
56b4a4a3b8SAlexander V. Chernikov
57b4a4a3b8SAlexander V. Chernikov	epair=$(vnet_mkepair)
58b4a4a3b8SAlexander V. Chernikov
59b4a4a3b8SAlexander V. Chernikov	vnet_mkjail ${jname}a ${epair}a
60b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair}a up
61b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair}a inet6 ${ip_src}/${plen}
62b4a4a3b8SAlexander V. Chernikov
63b4a4a3b8SAlexander V. Chernikov	vnet_mkjail ${jname}b ${epair}b
64b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair}b up
65b4a4a3b8SAlexander V. Chernikov
66b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair}b inet6 ${ip_dst}/${plen}
67b4a4a3b8SAlexander V. Chernikov
68b4a4a3b8SAlexander V. Chernikov	# wait for DAD to complete
69b4a4a3b8SAlexander V. Chernikov	while [ `jexec ${jname}b ifconfig ${epair}b inet6 | grep -c tentative` != "0" ]; do
70b4a4a3b8SAlexander V. Chernikov		sleep 0.1
71b4a4a3b8SAlexander V. Chernikov	done
72b4a4a3b8SAlexander V. Chernikov	while [ `jexec ${jname}a ifconfig ${epair}a inet6 | grep -c tentative` != "0" ]; do
73b4a4a3b8SAlexander V. Chernikov		sleep 0.1
74b4a4a3b8SAlexander V. Chernikov	done
75b4a4a3b8SAlexander V. Chernikov
76b4a4a3b8SAlexander V. Chernikov	# run listener
77b4a4a3b8SAlexander V. Chernikov	args="--family inet6 --ports ${port} --match_str ${text}"
78b4a4a3b8SAlexander V. Chernikov	echo jexec ${jname}b ${script_name} ${args}
79b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ${script_name} --test_name "test_listen_tcp" ${args} &
80b4a4a3b8SAlexander V. Chernikov	cmd_pid=$!
81b4a4a3b8SAlexander V. Chernikov
82b4a4a3b8SAlexander V. Chernikov	# wait for the script init
83b4a4a3b8SAlexander V. Chernikov	counter=0
84b4a4a3b8SAlexander V. Chernikov	while [ `jexec ${jname}b sockstat -6qlp ${port} | wc -l` != "1" ]; do
85b4a4a3b8SAlexander V. Chernikov		sleep 0.01
86b4a4a3b8SAlexander V. Chernikov		counter=$((counter+1))
87b4a4a3b8SAlexander V. Chernikov		if [ ${counter} -ge 50 ]; then break; fi
88b4a4a3b8SAlexander V. Chernikov	done
89b4a4a3b8SAlexander V. Chernikov	if [ `jexec ${jname}b sockstat -6qlp ${port} | wc -l` != "1" ]; then
90b4a4a3b8SAlexander V. Chernikov		echo "App setup failed"
91b4a4a3b8SAlexander V. Chernikov		exit 1
92b4a4a3b8SAlexander V. Chernikov	fi
93b4a4a3b8SAlexander V. Chernikov
94b4a4a3b8SAlexander V. Chernikov	# run sender
95b4a4a3b8SAlexander V. Chernikov	echo -n "${text}" | jexec ${jname}a nc -N ${ip_dst} ${port}
96b4a4a3b8SAlexander V. Chernikov	exit_code=$?
97b4a4a3b8SAlexander V. Chernikov	if [ $exit_code -ne 0 ]; then atf_fail "sender exit code $exit_code" ; fi
98b4a4a3b8SAlexander V. Chernikov
99b4a4a3b8SAlexander V. Chernikov	wait ${cmd_pid}
100b4a4a3b8SAlexander V. Chernikov	exit_code=$?
101b4a4a3b8SAlexander V. Chernikov	if [ $exit_code -ne 0 ]; then atf_fail "receiver exit code $exit_code" ; fi
102b4a4a3b8SAlexander V. Chernikov}
103b4a4a3b8SAlexander V. Chernikov
104b4a4a3b8SAlexander V. Chernikovoutput6_tcp_setup_success_cleanup()
105b4a4a3b8SAlexander V. Chernikov{
106b4a4a3b8SAlexander V. Chernikov	vnet_cleanup
107b4a4a3b8SAlexander V. Chernikov}
108b4a4a3b8SAlexander V. Chernikov
109b4a4a3b8SAlexander V. Chernikov
110b4a4a3b8SAlexander V. Chernikovatf_test_case "output6_udp_setup_success" "cleanup"
111b4a4a3b8SAlexander V. Chernikovoutput6_udp_setup_success_head()
112b4a4a3b8SAlexander V. Chernikov{
113b4a4a3b8SAlexander V. Chernikov
114b4a4a3b8SAlexander V. Chernikov	atf_set descr 'Test valid IPv6 UDP output'
115b4a4a3b8SAlexander V. Chernikov	atf_set require.user root
116b4a4a3b8SAlexander V. Chernikov}
117b4a4a3b8SAlexander V. Chernikov
118b4a4a3b8SAlexander V. Chernikovoutput6_udp_setup_success_body()
119b4a4a3b8SAlexander V. Chernikov{
120b4a4a3b8SAlexander V. Chernikov
121b4a4a3b8SAlexander V. Chernikov	vnet_init
122b4a4a3b8SAlexander V. Chernikov
123b4a4a3b8SAlexander V. Chernikov	net_src="2001:db8:0:0:1::"
124b4a4a3b8SAlexander V. Chernikov	net_dst="2001:db8:0:0:1::"
125b4a4a3b8SAlexander V. Chernikov	ip_src="${net_src}1"
126b4a4a3b8SAlexander V. Chernikov	ip_dst=${net_dst}4242
127b4a4a3b8SAlexander V. Chernikov	plen=64
128b4a4a3b8SAlexander V. Chernikov	text="testtesttst"
129b4a4a3b8SAlexander V. Chernikov	port=4242
130b4a4a3b8SAlexander V. Chernikov
131b4a4a3b8SAlexander V. Chernikov	script_name=`dirname $0`/../common/net_receiver.py
132b4a4a3b8SAlexander V. Chernikov	script_name=`realpath ${script_name}`
133b4a4a3b8SAlexander V. Chernikov	jname="v6t-output6_udp_setup_success"
134b4a4a3b8SAlexander V. Chernikov
135b4a4a3b8SAlexander V. Chernikov	epair=$(vnet_mkepair)
136b4a4a3b8SAlexander V. Chernikov
137b4a4a3b8SAlexander V. Chernikov	vnet_mkjail ${jname}a ${epair}a
138b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair}a up
139b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair}a inet6 ${ip_src}/${plen}
140b4a4a3b8SAlexander V. Chernikov
141b4a4a3b8SAlexander V. Chernikov	vnet_mkjail ${jname}b ${epair}b
142b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair}b up
143b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair}b inet6 ${ip_dst}/${plen}
144b4a4a3b8SAlexander V. Chernikov
145b4a4a3b8SAlexander V. Chernikov	# wait for DAD to complete
146b4a4a3b8SAlexander V. Chernikov	while [ `jexec ${jname}b ifconfig ${epair}b inet6 | grep -c tentative` != "0" ]; do
147b4a4a3b8SAlexander V. Chernikov		sleep 0.1
148b4a4a3b8SAlexander V. Chernikov	done
149b4a4a3b8SAlexander V. Chernikov	while [ `jexec ${jname}a ifconfig ${epair}a inet6 | grep -c tentative` != "0" ]; do
150b4a4a3b8SAlexander V. Chernikov		sleep 0.1
151b4a4a3b8SAlexander V. Chernikov	done
152b4a4a3b8SAlexander V. Chernikov
153b4a4a3b8SAlexander V. Chernikov	# run listener
154b4a4a3b8SAlexander V. Chernikov	args="--family inet6 --ports ${port} --match_str ${text}"
155b4a4a3b8SAlexander V. Chernikov	echo jexec ${jname}b ${script_name} ${args}
156b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ${script_name} --test_name "test_listen_udp" ${args} &
157b4a4a3b8SAlexander V. Chernikov	cmd_pid=$!
158b4a4a3b8SAlexander V. Chernikov
159b4a4a3b8SAlexander V. Chernikov	# wait for the script init
160b4a4a3b8SAlexander V. Chernikov	counter=0
161b4a4a3b8SAlexander V. Chernikov	while [ `jexec ${jname}b sockstat -6qlp ${port} | wc -l` != "1" ]; do
162b4a4a3b8SAlexander V. Chernikov		sleep 0.1
163b4a4a3b8SAlexander V. Chernikov		counterc=$((counter+1))
164b4a4a3b8SAlexander V. Chernikov		if [ ${counter} -ge 50 ]; then break; fi
165b4a4a3b8SAlexander V. Chernikov	done
166b4a4a3b8SAlexander V. Chernikov	if [ `jexec ${jname}b sockstat -6qlp ${port} | wc -l` != "1" ]; then
167b4a4a3b8SAlexander V. Chernikov		echo "App setup failed"
168b4a4a3b8SAlexander V. Chernikov		exit 1
169b4a4a3b8SAlexander V. Chernikov	fi
170b4a4a3b8SAlexander V. Chernikov
171b4a4a3b8SAlexander V. Chernikov	# run sender
172b4a4a3b8SAlexander V. Chernikov	# TODO: switch from nc to some alternative to avoid 1-second delay
173b4a4a3b8SAlexander V. Chernikov	echo -n "${text}" | jexec ${jname}a nc -uNw1 ${ip_dst} ${port}
174b4a4a3b8SAlexander V. Chernikov	exit_code=$?
175b4a4a3b8SAlexander V. Chernikov	if [ $exit_code -ne 0 ]; then atf_fail "sender exit code $exit_code" ; fi
176b4a4a3b8SAlexander V. Chernikov
177b4a4a3b8SAlexander V. Chernikov	wait ${cmd_pid}
178b4a4a3b8SAlexander V. Chernikov	exit_code=$?
179b4a4a3b8SAlexander V. Chernikov	if [ $exit_code -ne 0 ]; then atf_fail "receiver exit code $exit_code" ; fi
180b4a4a3b8SAlexander V. Chernikov}
181b4a4a3b8SAlexander V. Chernikov
182b4a4a3b8SAlexander V. Chernikovoutput6_udp_setup_success_cleanup()
183b4a4a3b8SAlexander V. Chernikov{
184b4a4a3b8SAlexander V. Chernikov	vnet_cleanup
185b4a4a3b8SAlexander V. Chernikov}
186b4a4a3b8SAlexander V. Chernikov
187b4a4a3b8SAlexander V. Chernikovatf_test_case "output6_raw_success" "cleanup"
188b4a4a3b8SAlexander V. Chernikovoutput6_raw_success_head()
189b4a4a3b8SAlexander V. Chernikov{
190b4a4a3b8SAlexander V. Chernikov
191b4a4a3b8SAlexander V. Chernikov	atf_set descr 'Test valid IPv6 raw output'
192b4a4a3b8SAlexander V. Chernikov	atf_set require.user root
193b4a4a3b8SAlexander V. Chernikov}
194b4a4a3b8SAlexander V. Chernikov
195b4a4a3b8SAlexander V. Chernikovoutput6_raw_success_body()
196b4a4a3b8SAlexander V. Chernikov{
197b4a4a3b8SAlexander V. Chernikov
198b4a4a3b8SAlexander V. Chernikov	vnet_init
199b4a4a3b8SAlexander V. Chernikov
200b4a4a3b8SAlexander V. Chernikov	net_src="2001:db8:0:0:1::"
201b4a4a3b8SAlexander V. Chernikov	net_dst="2001:db8:0:0:1::"
202b4a4a3b8SAlexander V. Chernikov	ip_src="${net_src}1"
203b4a4a3b8SAlexander V. Chernikov	ip_dst=${net_dst}4242
204b4a4a3b8SAlexander V. Chernikov	plen=64
205b4a4a3b8SAlexander V. Chernikov
206b4a4a3b8SAlexander V. Chernikov	script_name=`dirname $0`/../common/net_receiver.py
207b4a4a3b8SAlexander V. Chernikov	script_name=`realpath ${script_name}`
208b4a4a3b8SAlexander V. Chernikov	jname="v6t-output6_raw_success"
209b4a4a3b8SAlexander V. Chernikov
210b4a4a3b8SAlexander V. Chernikov	epair=$(vnet_mkepair)
211b4a4a3b8SAlexander V. Chernikov
212b4a4a3b8SAlexander V. Chernikov	vnet_mkjail ${jname}a ${epair}a
213b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair}a up
214b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair}a inet6 ${ip_src}/${plen}
215b4a4a3b8SAlexander V. Chernikov
216b4a4a3b8SAlexander V. Chernikov	vnet_mkjail ${jname}b ${epair}b
217b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair}b up
218b4a4a3b8SAlexander V. Chernikov
219b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair}b inet6 ${ip_dst}/${plen}
220b4a4a3b8SAlexander V. Chernikov
221b4a4a3b8SAlexander V. Chernikov	# wait for DAD to complete
222b4a4a3b8SAlexander V. Chernikov	while [ `jexec ${jname}b ifconfig ${epair}b inet6 | grep -c tentative` != "0" ]; do
223b4a4a3b8SAlexander V. Chernikov		sleep 0.1
224b4a4a3b8SAlexander V. Chernikov	done
225b4a4a3b8SAlexander V. Chernikov	while [ `jexec ${jname}a ifconfig ${epair}a inet6 | grep -c tentative` != "0" ]; do
226b4a4a3b8SAlexander V. Chernikov		sleep 0.1
227b4a4a3b8SAlexander V. Chernikov	done
228b4a4a3b8SAlexander V. Chernikov
229*01f3f354SAlan Somers	atf_check -o match:'1 packets transmitted, 1 packets received' jexec ${jname}a ping -6 -nc1 ${ip_dst}
230b4a4a3b8SAlexander V. Chernikov}
231b4a4a3b8SAlexander V. Chernikov
232b4a4a3b8SAlexander V. Chernikovoutput6_raw_success_cleanup()
233b4a4a3b8SAlexander V. Chernikov{
234b4a4a3b8SAlexander V. Chernikov	vnet_cleanup
235b4a4a3b8SAlexander V. Chernikov}
236b4a4a3b8SAlexander V. Chernikov
237b4a4a3b8SAlexander V. Chernikov# Multipath tests are done the following way:
238b4a4a3b8SAlexander V. Chernikov#               epair0/LL
239b4a4a3b8SAlexander V. Chernikov# jailA lo/GU <           > lo/GU jailB
240b4a4a3b8SAlexander V. Chernikov#               epair1/LL
241b4a4a3b8SAlexander V. Chernikov# jailA has 2 routes towards /64 prefix on jailB loopback, via 2 epairs
242b4a4a3b8SAlexander V. Chernikov# jailB has 1 route towards /64 prefix on jailA loopback, via epair0
243b4a4a3b8SAlexander V. Chernikov#
244b4a4a3b8SAlexander V. Chernikov# jailA initiates connections/sends packets towards IPs on jailB loopback.
245b4a4a3b8SAlexander V. Chernikov# Script then compares amount of packets sent via epair0 and epair1
246b4a4a3b8SAlexander V. Chernikov
247b4a4a3b8SAlexander V. Chernikovmpath_check()
248b4a4a3b8SAlexander V. Chernikov{
249a3525bd1SAlexander V. Chernikov	if [ `sysctl -iW net.route.multipath | wc -l` != "1" ]; then
250b4a4a3b8SAlexander V. Chernikov		atf_skip "This test requires ROUTE_MPATH enabled"
251b4a4a3b8SAlexander V. Chernikov	fi
252b4a4a3b8SAlexander V. Chernikov}
253b4a4a3b8SAlexander V. Chernikov
254a3525bd1SAlexander V. Chernikovmpath_enable()
255a3525bd1SAlexander V. Chernikov{
256a3525bd1SAlexander V. Chernikov	jexec $1 sysctl net.route.multipath=1
257a3525bd1SAlexander V. Chernikov	if [ $? != 0 ]; then
258a3525bd1SAlexander V. Chernikov		atf_fail "Setting multipath in jail $1 failed".
259a3525bd1SAlexander V. Chernikov	fi
260a3525bd1SAlexander V. Chernikov}
261a3525bd1SAlexander V. Chernikov
262a3525bd1SAlexander V. Chernikov
263b4a4a3b8SAlexander V. Chernikovatf_test_case "output6_tcp_flowid_mpath_success" "cleanup"
264b4a4a3b8SAlexander V. Chernikovoutput6_tcp_flowid_mpath_success_head()
265b4a4a3b8SAlexander V. Chernikov{
266b4a4a3b8SAlexander V. Chernikov
267b4a4a3b8SAlexander V. Chernikov	atf_set descr 'Test valid IPv6 TCP output flowid generation'
268b4a4a3b8SAlexander V. Chernikov	atf_set require.user root
269b4a4a3b8SAlexander V. Chernikov}
270b4a4a3b8SAlexander V. Chernikov
271b4a4a3b8SAlexander V. Chernikovoutput6_tcp_flowid_mpath_success_body()
272b4a4a3b8SAlexander V. Chernikov{
273b4a4a3b8SAlexander V. Chernikov	vnet_init
274b4a4a3b8SAlexander V. Chernikov	mpath_check
275b4a4a3b8SAlexander V. Chernikov
276b4a4a3b8SAlexander V. Chernikov	net_src="2001:db8:0:1"
277b4a4a3b8SAlexander V. Chernikov	net_dst="2001:db8:0:2"
278b4a4a3b8SAlexander V. Chernikov	ip_src="${net_src}::1"
279b4a4a3b8SAlexander V. Chernikov	ip_dst="${net_dst}::1"
280b4a4a3b8SAlexander V. Chernikov	plen=64
281b4a4a3b8SAlexander V. Chernikov	text="testtesttst"
282b4a4a3b8SAlexander V. Chernikov
283b4a4a3b8SAlexander V. Chernikov	script_name=`dirname $0`/../common/net_receiver.py
284b4a4a3b8SAlexander V. Chernikov	script_name=`realpath ${script_name}`
285b4a4a3b8SAlexander V. Chernikov	jname="v6t-output6_tcp_flowid_mpath_success"
286b4a4a3b8SAlexander V. Chernikov
287b4a4a3b8SAlexander V. Chernikov	epair0=$(vnet_mkepair)
288b4a4a3b8SAlexander V. Chernikov	epair1=$(vnet_mkepair)
289b4a4a3b8SAlexander V. Chernikov	lo_src=$(vnet_mkloopback)
290b4a4a3b8SAlexander V. Chernikov	lo_dst=$(vnet_mkloopback)
291b4a4a3b8SAlexander V. Chernikov
292b4a4a3b8SAlexander V. Chernikov	vnet_mkjail ${jname}a ${epair0}a ${epair1}a ${lo_src}
293a3525bd1SAlexander V. Chernikov	mpath_enable ${jname}a
294b4a4a3b8SAlexander V. Chernikov	jls -N
295b4a4a3b8SAlexander V. Chernikov	# enable link-local IPv6
296b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ndp -i ${epair0}a -- -disabled
297b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair0}a up
298b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ndp -i ${epair1}a -- -disabled
299b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair1}a up
300b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${lo_src} up
301b4a4a3b8SAlexander V. Chernikov
302b4a4a3b8SAlexander V. Chernikov	vnet_mkjail ${jname}b ${epair0}b ${epair1}b ${lo_dst}
303b4a4a3b8SAlexander V. Chernikov	jls -N
304b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ndp -i ${epair0}b -- -disabled
305b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair0}b up
306b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ndp -i ${epair1}b -- -disabled
307b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair1}b up
308b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${lo_dst} up
309b4a4a3b8SAlexander V. Chernikov
310b4a4a3b8SAlexander V. Chernikov	# DST ips/ports to test
311b4a4a3b8SAlexander V. Chernikov	ips="d3:c4:eb:40 2b:ff:dd:52 b1:d4:44:0e 41:2c:4d:43 66:4a:b4:be 8b:da:ac:f7 ca:d1:c4:f0 b1:31:da:d7 0c:ac:45:7a 44:9c:ce:71"
312b4a4a3b8SAlexander V. Chernikov	ports="53540 49743 43067 9131 16734 5150 14379 40292 20634 51302 3387 24387 9282 14275 42103 26881 42461 29520 45714 11096"
313b4a4a3b8SAlexander V. Chernikov
314b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${lo_src} inet6 ${ip_src}/128
315b4a4a3b8SAlexander V. Chernikov
316b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${lo_dst} inet6 ${ip_dst}/128
317b4a4a3b8SAlexander V. Chernikov	for i in ${ips}; do
318b4a4a3b8SAlexander V. Chernikov		jexec ${jname}b ifconfig ${lo_dst} inet6 ${net_dst}:${i}/128
319b4a4a3b8SAlexander V. Chernikov	done
320b4a4a3b8SAlexander V. Chernikov
321b4a4a3b8SAlexander V. Chernikov	# wait for DAD to complete
322b4a4a3b8SAlexander V. Chernikov	while [ `jexec ${jname}b ifconfig | grep inet6 | grep -c tentative` != "0" ]; do
323b4a4a3b8SAlexander V. Chernikov		sleep 0.1
324b4a4a3b8SAlexander V. Chernikov	done
325b4a4a3b8SAlexander V. Chernikov	while [ `jexec ${jname}a ifconfig | grep inet6 | grep -c tentative` != "0" ]; do
326b4a4a3b8SAlexander V. Chernikov		sleep 0.1
327b4a4a3b8SAlexander V. Chernikov	done
328b4a4a3b8SAlexander V. Chernikov
329b4a4a3b8SAlexander V. Chernikov	# Add routes
330b4a4a3b8SAlexander V. Chernikov	# A -> towards B via epair0a LL
331b4a4a3b8SAlexander V. Chernikov	ll=`jexec ${jname}b ifconfig ${epair0}b inet6 | awk '$2~/^fe80:/{print$2}' | awk -F% '{print$1}'`
332b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a route add -6 -net ${net_dst}::/${plen} ${ll}%${epair0}a
333b4a4a3b8SAlexander V. Chernikov	# A -> towards B via epair1a LL
334b4a4a3b8SAlexander V. Chernikov	ll=`jexec ${jname}b ifconfig ${epair1}b inet6 | awk '$2~/^fe80:/{print$2}' | awk -F% '{print$1}'`
335b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a route add -6 -net ${net_dst}::/${plen} ${ll}%${epair1}a
336b4a4a3b8SAlexander V. Chernikov
337b4a4a3b8SAlexander V. Chernikov	# B towards A via epair0b LL
338b4a4a3b8SAlexander V. Chernikov	ll=`jexec ${jname}a ifconfig ${epair1}a inet6 | awk '$2~/^fe80:/{print$2}' | awk -F% '{print$1}'`
339b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b route add -6 -net ${net_src}::/${plen} ${ll}%${epair1}b
340b4a4a3b8SAlexander V. Chernikov
341b4a4a3b8SAlexander V. Chernikov	# Base setup verification
342*01f3f354SAlan Somers	atf_check -o match:'1 packets transmitted, 1 packets received' jexec ${jname}a ping -6 -c1 ${ip_dst}
343b4a4a3b8SAlexander V. Chernikov
344b4a4a3b8SAlexander V. Chernikov	# run listener
345b4a4a3b8SAlexander V. Chernikov	num_ports=`echo ${ports} | wc -w`
346b4a4a3b8SAlexander V. Chernikov	num_ips=`echo ${ips} | wc -w`
347b4a4a3b8SAlexander V. Chernikov	count_examples=$((num_ports*num_ips))
348b4a4a3b8SAlexander V. Chernikov	listener_ports=`echo ${ports} | tr ' ' '\n' | sort -n | tr '\n' ',' | sed -e 's?,$??'`
349b4a4a3b8SAlexander V. Chernikov	args="--family inet6 --ports ${listener_ports} --count ${count_examples} --match_str ${text}"
350b4a4a3b8SAlexander V. Chernikov	echo jexec ${jname}b ${script_name} ${args}
351b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ${script_name} --test_name "test_listen_tcp" ${args} &
352b4a4a3b8SAlexander V. Chernikov	cmd_pid=$!
353b4a4a3b8SAlexander V. Chernikov
354b4a4a3b8SAlexander V. Chernikov	# wait for the app init
355b4a4a3b8SAlexander V. Chernikov	counter=0
356b4a4a3b8SAlexander V. Chernikov	init=0
357b4a4a3b8SAlexander V. Chernikov	while [ ${counter} -le 50 ]; do
358b4a4a3b8SAlexander V. Chernikov		_ports=`jexec ${jname}b sockstat -6ql | awk "\\\$3 == ${cmd_pid} {print \\\$6}"|awk -F: "{print \\\$2}" | sort -n | tr '\n' ','`
359b4a4a3b8SAlexander V. Chernikov		if [ "${_ports}" = "${listener_ports}," ]; then
360b4a4a3b8SAlexander V. Chernikov			init=1
361b4a4a3b8SAlexander V. Chernikov			break;
362b4a4a3b8SAlexander V. Chernikov		fi
363b4a4a3b8SAlexander V. Chernikov	done
364b4a4a3b8SAlexander V. Chernikov	if [ ${init} -eq 0 ]; then
365b4a4a3b8SAlexander V. Chernikov		jexec ${jname}b sockstat -6ql | awk "\$3 == ${cmd_pid}"
366b4a4a3b8SAlexander V. Chernikov		echo "App setup failed"
367b4a4a3b8SAlexander V. Chernikov		exit 1
368b4a4a3b8SAlexander V. Chernikov	fi
369b4a4a3b8SAlexander V. Chernikov	echo "App setup done"
370b4a4a3b8SAlexander V. Chernikov
371b4a4a3b8SAlexander V. Chernikov	# run sender
372b4a4a3b8SAlexander V. Chernikov	for _ip in ${ips}; do
373b4a4a3b8SAlexander V. Chernikov		ip="${net_dst}:${_ip}"
374b4a4a3b8SAlexander V. Chernikov		for port in ${ports}; do
375b4a4a3b8SAlexander V. Chernikov			echo -n "${text}" | jexec ${jname}a nc -nN ${ip} ${port}
376b4a4a3b8SAlexander V. Chernikov			exit_code=$?
377b4a4a3b8SAlexander V. Chernikov			if [ $exit_code -ne 0 ]; then atf_fail "sender exit code $exit_code" ; fi
378b4a4a3b8SAlexander V. Chernikov		done
379b4a4a3b8SAlexander V. Chernikov	done
380b4a4a3b8SAlexander V. Chernikov
381b4a4a3b8SAlexander V. Chernikov	wait ${cmd_pid}
382b4a4a3b8SAlexander V. Chernikov	exit_code=$?
383b4a4a3b8SAlexander V. Chernikov	if [ $exit_code -ne 0 ]; then atf_fail "receiver exit code $exit_code" ; fi
384b4a4a3b8SAlexander V. Chernikov
385b4a4a3b8SAlexander V. Chernikov	pkt_0=`jexec ${jname}a netstat -Wf link -I ${epair0}a | head | awk '$1!~/^Name/{print$8}'`
386b4a4a3b8SAlexander V. Chernikov	pkt_1=`jexec ${jname}a netstat -Wf link -I ${epair1}a | head | awk '$1!~/^Name/{print$8}'`
387b4a4a3b8SAlexander V. Chernikov	if [ ${pkt_0} -le 10 ]; then
3884a8c6300SAlexander V. Chernikov		atf_fail "Balancing failure: 1: ${pkt_0} 2: ${pkt_1}"
389b4a4a3b8SAlexander V. Chernikov	fi
390b4a4a3b8SAlexander V. Chernikov	if [ ${pkt_1} -le 10 ]; then
3914a8c6300SAlexander V. Chernikov		atf_fail "Balancing failure: 1: ${pkt_0} 2: ${pkt_1}"
392b4a4a3b8SAlexander V. Chernikov	fi
393b4a4a3b8SAlexander V. Chernikov	echo "TCP Balancing: 1: ${pkt_0} 2: ${pkt_1}"
394b4a4a3b8SAlexander V. Chernikov}
395b4a4a3b8SAlexander V. Chernikov
396b4a4a3b8SAlexander V. Chernikovoutput6_tcp_flowid_mpath_success_cleanup()
397b4a4a3b8SAlexander V. Chernikov{
398b4a4a3b8SAlexander V. Chernikov	vnet_cleanup
399b4a4a3b8SAlexander V. Chernikov}
400b4a4a3b8SAlexander V. Chernikov
401b4a4a3b8SAlexander V. Chernikovatf_test_case "output6_udp_flowid_mpath_success" "cleanup"
402b4a4a3b8SAlexander V. Chernikovoutput6_udp_flowid_mpath_success_head()
403b4a4a3b8SAlexander V. Chernikov{
404b4a4a3b8SAlexander V. Chernikov
405b4a4a3b8SAlexander V. Chernikov	atf_set descr 'Test valid IPv6 UDP output flowid generation'
406b4a4a3b8SAlexander V. Chernikov	atf_set require.user root
407b4a4a3b8SAlexander V. Chernikov}
408b4a4a3b8SAlexander V. Chernikov
409b4a4a3b8SAlexander V. Chernikovoutput6_udp_flowid_mpath_success_body()
410b4a4a3b8SAlexander V. Chernikov{
411b4a4a3b8SAlexander V. Chernikov
412b4a4a3b8SAlexander V. Chernikov	vnet_init
413b4a4a3b8SAlexander V. Chernikov	mpath_check
414b4a4a3b8SAlexander V. Chernikov
415b4a4a3b8SAlexander V. Chernikov	# Note this test will spawn around ~100 nc processes
416b4a4a3b8SAlexander V. Chernikov
417b4a4a3b8SAlexander V. Chernikov	net_src="2001:db8:0:1"
418b4a4a3b8SAlexander V. Chernikov	net_dst="2001:db8:0:2"
419b4a4a3b8SAlexander V. Chernikov	ip_src="${net_src}::1"
420b4a4a3b8SAlexander V. Chernikov	ip_dst="${net_dst}::1"
421b4a4a3b8SAlexander V. Chernikov	plen=64
422b4a4a3b8SAlexander V. Chernikov	text="testtesttst"
423b4a4a3b8SAlexander V. Chernikov
424b4a4a3b8SAlexander V. Chernikov	script_name=`dirname $0`/../common/net_receiver.py
425b4a4a3b8SAlexander V. Chernikov	script_name=`realpath ${script_name}`
426b4a4a3b8SAlexander V. Chernikov	jname="v6t-output6_udp_flowid_mpath_success"
427b4a4a3b8SAlexander V. Chernikov
428b4a4a3b8SAlexander V. Chernikov	epair0=$(vnet_mkepair)
429b4a4a3b8SAlexander V. Chernikov	epair1=$(vnet_mkepair)
430b4a4a3b8SAlexander V. Chernikov	lo_src=$(vnet_mkloopback)
431b4a4a3b8SAlexander V. Chernikov	lo_dst=$(vnet_mkloopback)
432b4a4a3b8SAlexander V. Chernikov
433b4a4a3b8SAlexander V. Chernikov	vnet_mkjail ${jname}a ${epair0}a ${epair1}a ${lo_src}
434a3525bd1SAlexander V. Chernikov	mpath_enable ${jname}a
435b4a4a3b8SAlexander V. Chernikov	jls -N
436b4a4a3b8SAlexander V. Chernikov	# enable link-local IPv6
437b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ndp -i ${epair0}a -- -disabled
438b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair0}a up
439b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ndp -i ${epair1}a -- -disabled
440b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair1}a up
441b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${lo_src} up
442b4a4a3b8SAlexander V. Chernikov
443b4a4a3b8SAlexander V. Chernikov	vnet_mkjail ${jname}b ${epair0}b ${epair1}b ${lo_dst}
444b4a4a3b8SAlexander V. Chernikov	jls -N
445b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ndp -i ${epair0}b -- -disabled
446b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair0}b up
447b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ndp -i ${epair1}b -- -disabled
448b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair1}b up
449b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${lo_dst} up
450b4a4a3b8SAlexander V. Chernikov
451b4a4a3b8SAlexander V. Chernikov	# DST ips/ports to test
452b4a4a3b8SAlexander V. Chernikov	ips="d3:c4:eb:40 2b:ff:dd:52 b1:d4:44:0e 41:2c:4d:43 66:4a:b4:be 8b:da:ac:f7 ca:d1:c4:f0 b1:31:da:d7 0c:ac:45:7a 44:9c:ce:71"
453b4a4a3b8SAlexander V. Chernikov	ports="53540 49743 43067 9131 16734 5150 14379 40292 20634 51302 3387 24387 9282 14275 42103 26881 42461 29520 45714 11096"
454b4a4a3b8SAlexander V. Chernikov
455b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${lo_src} inet6 ${ip_src}/128
456b4a4a3b8SAlexander V. Chernikov
457b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${lo_dst} inet6 ${ip_dst}/128
458b4a4a3b8SAlexander V. Chernikov	for i in ${ips}; do
459b4a4a3b8SAlexander V. Chernikov		jexec ${jname}b ifconfig ${lo_dst} inet6 ${net_dst}:${i}/128
460b4a4a3b8SAlexander V. Chernikov	done
461b4a4a3b8SAlexander V. Chernikov
462b4a4a3b8SAlexander V. Chernikov
463b4a4a3b8SAlexander V. Chernikov	# wait for DAD to complete
464b4a4a3b8SAlexander V. Chernikov	while [ `jexec ${jname}b ifconfig | grep inet6 | grep -c tentative` != "0" ]; do
465b4a4a3b8SAlexander V. Chernikov		sleep 0.1
466b4a4a3b8SAlexander V. Chernikov	done
467b4a4a3b8SAlexander V. Chernikov	while [ `jexec ${jname}a ifconfig | grep inet6 | grep -c tentative` != "0" ]; do
468b4a4a3b8SAlexander V. Chernikov		sleep 0.1
469b4a4a3b8SAlexander V. Chernikov	done
470b4a4a3b8SAlexander V. Chernikov
471b4a4a3b8SAlexander V. Chernikov	# Add routes
472b4a4a3b8SAlexander V. Chernikov	# A -> towards B via epair0a LL
473b4a4a3b8SAlexander V. Chernikov	ll=`jexec ${jname}b ifconfig ${epair0}b inet6 | awk '$2~/^fe80:/{print$2}' | awk -F% '{print$1}'`
474b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a route add -6 -net ${net_dst}::/${plen} ${ll}%${epair0}a
475b4a4a3b8SAlexander V. Chernikov	# A -> towards B via epair1a LL
476b4a4a3b8SAlexander V. Chernikov	ll=`jexec ${jname}b ifconfig ${epair1}b inet6 | awk '$2~/^fe80:/{print$2}' | awk -F% '{print$1}'`
477b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a route add -6 -net ${net_dst}::/${plen} ${ll}%${epair1}a
478b4a4a3b8SAlexander V. Chernikov
479b4a4a3b8SAlexander V. Chernikov	# B towards A via epair0b LL
480b4a4a3b8SAlexander V. Chernikov	ll=`jexec ${jname}a ifconfig ${epair1}a inet6 | awk '$2~/^fe80:/{print$2}' | awk -F% '{print$1}'`
481b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b route add -6 -net ${net_src}::/${plen} ${ll}%${epair1}b
482b4a4a3b8SAlexander V. Chernikov
483b4a4a3b8SAlexander V. Chernikov	# Base setup verification
484*01f3f354SAlan Somers	atf_check -o match:'1 packets transmitted, 1 packets received' jexec ${jname}a ping -6 -c1 ${ip_dst}
485b4a4a3b8SAlexander V. Chernikov
486b4a4a3b8SAlexander V. Chernikov	# run listener
487b4a4a3b8SAlexander V. Chernikov	num_ports=`echo ${ports} | wc -w`
488b4a4a3b8SAlexander V. Chernikov	num_ips=`echo ${ips} | wc -w`
489b4a4a3b8SAlexander V. Chernikov	count_examples=$((num_ports*num_ips))
490b4a4a3b8SAlexander V. Chernikov	listener_ports=`echo ${ports} | tr ' ' '\n' | sort -n | tr '\n' ',' | sed -e 's?,$??'`
491b4a4a3b8SAlexander V. Chernikov	args="--family inet6 --ports ${listener_ports} --count ${count_examples} --match_str ${text}"
492b4a4a3b8SAlexander V. Chernikov	echo jexec ${jname}b ${script_name} ${args}
493b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ${script_name} --test_name "test_listen_udp" ${args} &
494b4a4a3b8SAlexander V. Chernikov	cmd_pid=$!
495b4a4a3b8SAlexander V. Chernikov
496b4a4a3b8SAlexander V. Chernikov	# wait for the app init
497b4a4a3b8SAlexander V. Chernikov	counter=0
498b4a4a3b8SAlexander V. Chernikov	init=0
499b4a4a3b8SAlexander V. Chernikov	while [ ${counter} -le 50 ]; do
500b4a4a3b8SAlexander V. Chernikov		_ports=`jexec ${jname}b sockstat -6ql | awk "\\\$3 == ${cmd_pid} {print \\\$6}"|awk -F: "{print \\\$2}" | sort -n | tr '\n' ','`
501b4a4a3b8SAlexander V. Chernikov		if [ "${_ports}" = "${listener_ports}," ]; then
502b4a4a3b8SAlexander V. Chernikov			init=1
503b4a4a3b8SAlexander V. Chernikov			break;
504b4a4a3b8SAlexander V. Chernikov		fi
505b4a4a3b8SAlexander V. Chernikov	done
506b4a4a3b8SAlexander V. Chernikov	if [ ${init} -eq 0 ]; then
507b4a4a3b8SAlexander V. Chernikov		jexec ${jname}b sockstat -6ql | awk "\$3 == ${cmd_pid}"
508b4a4a3b8SAlexander V. Chernikov		echo "App setup failed"
509b4a4a3b8SAlexander V. Chernikov		exit 1
510b4a4a3b8SAlexander V. Chernikov	fi
511b4a4a3b8SAlexander V. Chernikov	echo "App setup done"
512b4a4a3b8SAlexander V. Chernikov
513b4a4a3b8SAlexander V. Chernikov	# run sender
514b4a4a3b8SAlexander V. Chernikov	for _ip in ${ips}; do
515b4a4a3b8SAlexander V. Chernikov		ip="${net_dst}:${_ip}"
516b4a4a3b8SAlexander V. Chernikov		for port in ${ports}; do
517b4a4a3b8SAlexander V. Chernikov			# XXX: switch to something that allows immediate exit
518b4a4a3b8SAlexander V. Chernikov			echo -n "${text}" | jexec ${jname}a nc -nuNw1 ${ip} ${port} &
519b4a4a3b8SAlexander V. Chernikov			sleep 0.01
520b4a4a3b8SAlexander V. Chernikov		done
521b4a4a3b8SAlexander V. Chernikov	done
522b4a4a3b8SAlexander V. Chernikov
523b4a4a3b8SAlexander V. Chernikov	wait ${cmd_pid}
524b4a4a3b8SAlexander V. Chernikov	exit_code=$?
525b4a4a3b8SAlexander V. Chernikov	if [ $exit_code -ne 0 ]; then atf_fail "receiver exit code $exit_code" ; fi
526b4a4a3b8SAlexander V. Chernikov
527b4a4a3b8SAlexander V. Chernikov	pkt_0=`jexec ${jname}a netstat -Wf link -I ${epair0}a | head | awk '$1!~/^Name/{print$8}'`
528b4a4a3b8SAlexander V. Chernikov	pkt_1=`jexec ${jname}a netstat -Wf link -I ${epair1}a | head | awk '$1!~/^Name/{print$8}'`
529b4a4a3b8SAlexander V. Chernikov	if [ ${pkt_0} -le 10 ]; then
5304a8c6300SAlexander V. Chernikov		atf_fail "Balancing failure: 1: ${pkt_0} 2: ${pkt_1}"
531b4a4a3b8SAlexander V. Chernikov	fi
532b4a4a3b8SAlexander V. Chernikov	if [ ${pkt_1} -le 10 ]; then
5334a8c6300SAlexander V. Chernikov		atf_fail "Balancing failure: 1: ${pkt_0} 2: ${pkt_1}"
534b4a4a3b8SAlexander V. Chernikov	fi
535b4a4a3b8SAlexander V. Chernikov	echo "UDP BALANCING: 1: ${pkt_0} 2: ${pkt_1}"
536b4a4a3b8SAlexander V. Chernikov}
537b4a4a3b8SAlexander V. Chernikov
538b4a4a3b8SAlexander V. Chernikovoutput6_udp_flowid_mpath_success_cleanup()
539b4a4a3b8SAlexander V. Chernikov{
540b4a4a3b8SAlexander V. Chernikov	vnet_cleanup
541b4a4a3b8SAlexander V. Chernikov}
542b4a4a3b8SAlexander V. Chernikov
543b4a4a3b8SAlexander V. Chernikovatf_test_case "output6_raw_flowid_mpath_success" "cleanup"
544b4a4a3b8SAlexander V. Chernikovoutput6_raw_flowid_mpath_success_head()
545b4a4a3b8SAlexander V. Chernikov{
546b4a4a3b8SAlexander V. Chernikov
547b4a4a3b8SAlexander V. Chernikov	atf_set descr 'Test valid IPv6 raw output flowid generation'
548b4a4a3b8SAlexander V. Chernikov	atf_set require.user root
549b4a4a3b8SAlexander V. Chernikov}
550b4a4a3b8SAlexander V. Chernikov
551b4a4a3b8SAlexander V. Chernikovoutput6_raw_flowid_mpath_success_body()
552b4a4a3b8SAlexander V. Chernikov{
553b4a4a3b8SAlexander V. Chernikov
554b4a4a3b8SAlexander V. Chernikov	vnet_init
555b4a4a3b8SAlexander V. Chernikov	mpath_check
556b4a4a3b8SAlexander V. Chernikov
557b4a4a3b8SAlexander V. Chernikov	net_src="2001:db8:0:1"
558b4a4a3b8SAlexander V. Chernikov	net_dst="2001:db8:0:2"
559b4a4a3b8SAlexander V. Chernikov	ip_src="${net_src}::1"
560b4a4a3b8SAlexander V. Chernikov	ip_dst="${net_dst}::1"
561b4a4a3b8SAlexander V. Chernikov	plen=64
562b4a4a3b8SAlexander V. Chernikov	text="testtesttst"
563b4a4a3b8SAlexander V. Chernikov
564b4a4a3b8SAlexander V. Chernikov	jname="v6t-output6_raw_flowid_mpath_success"
565b4a4a3b8SAlexander V. Chernikov
566b4a4a3b8SAlexander V. Chernikov	epair0=$(vnet_mkepair)
567b4a4a3b8SAlexander V. Chernikov	epair1=$(vnet_mkepair)
568b4a4a3b8SAlexander V. Chernikov	lo_src=$(vnet_mkloopback)
569b4a4a3b8SAlexander V. Chernikov	lo_dst=$(vnet_mkloopback)
570b4a4a3b8SAlexander V. Chernikov
571b4a4a3b8SAlexander V. Chernikov	vnet_mkjail ${jname}a ${epair0}a ${epair1}a ${lo_src}
572a3525bd1SAlexander V. Chernikov	mpath_enable ${jname}a
573b4a4a3b8SAlexander V. Chernikov	jls -N
574b4a4a3b8SAlexander V. Chernikov	# enable link-local IPv6
575b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ndp -i ${epair0}a -- -disabled
576b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair0}a up
577b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ndp -i ${epair1}a -- -disabled
578b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair1}a up
579b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${lo_src} up
580b4a4a3b8SAlexander V. Chernikov
581b4a4a3b8SAlexander V. Chernikov	vnet_mkjail ${jname}b ${epair0}b ${epair1}b ${lo_dst}
582b4a4a3b8SAlexander V. Chernikov	jls -N
583b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ndp -i ${epair0}b -- -disabled
584b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair0}b up
585b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ndp -i ${epair1}b -- -disabled
586b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair1}b up
587b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${lo_dst} up
588b4a4a3b8SAlexander V. Chernikov
589b4a4a3b8SAlexander V. Chernikov	# DST ips to test
590b4a4a3b8SAlexander V. Chernikov	ips="9d:33:f2:7f 48:06:9a:0b cf:96:d5:78 76:da:8e:28 d4:66:38:1e ec:43:da:7c bb:f8:93:2f d3:c4:eb:40"
591b4a4a3b8SAlexander V. Chernikov	ips="${ips} c7:31:0e:ae 8d:ed:35:2e c0:e0:22:31 82:1c:4e:28 c1:00:60:3e 6a:4f:3b:6c 8e:a7:e9:57 2b:ff:dd:52"
592b4a4a3b8SAlexander V. Chernikov	ips="${ips} 88:44:79:5d 80:62:83:11 c8:e4:17:a6 e7:2a:45:d7 5a:92:0e:04 70:fc:6a:ee ce:24:4c:68 41:2c:4d:43"
593b4a4a3b8SAlexander V. Chernikov	ips="${ips} 57:2b:5e:a7 f9:e0:69:c6 cb:b9:e6:ed 28:88:5d:fa d6:19:ac:1d dc:de:37:d8 fe:39:55:c7 b1:31:da:d7"
594b4a4a3b8SAlexander V. Chernikov
595b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${lo_src} inet6 ${ip_src}/128
596b4a4a3b8SAlexander V. Chernikov
597b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${lo_dst} inet6 ${ip_dst}/128
598b4a4a3b8SAlexander V. Chernikov	for i in ${ips}; do
599b4a4a3b8SAlexander V. Chernikov		jexec ${jname}b ifconfig ${lo_dst} inet6 ${net_dst}:${i}/128
600b4a4a3b8SAlexander V. Chernikov	done
601b4a4a3b8SAlexander V. Chernikov
602b4a4a3b8SAlexander V. Chernikov	# wait for DAD to complete
603b4a4a3b8SAlexander V. Chernikov	while [ `jexec ${jname}b ifconfig | grep inet6 | grep -c tentative` != "0" ]; do
604b4a4a3b8SAlexander V. Chernikov		sleep 0.1
605b4a4a3b8SAlexander V. Chernikov	done
606b4a4a3b8SAlexander V. Chernikov	while [ `jexec ${jname}a ifconfig | grep inet6 | grep -c tentative` != "0" ]; do
607b4a4a3b8SAlexander V. Chernikov		sleep 0.1
608b4a4a3b8SAlexander V. Chernikov	done
609b4a4a3b8SAlexander V. Chernikov
610b4a4a3b8SAlexander V. Chernikov	# Add routes
611b4a4a3b8SAlexander V. Chernikov	# A -> towards B via epair0a LL
612b4a4a3b8SAlexander V. Chernikov	ll=`jexec ${jname}b ifconfig ${epair0}b inet6 | awk '$2~/^fe80:/{print$2}' | awk -F% '{print$1}'`
613b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a route add -6 -net ${net_dst}::/${plen} ${ll}%${epair0}a
614b4a4a3b8SAlexander V. Chernikov	# A -> towards B via epair1a LL
615b4a4a3b8SAlexander V. Chernikov	ll=`jexec ${jname}b ifconfig ${epair1}b inet6 | awk '$2~/^fe80:/{print$2}' | awk -F% '{print$1}'`
616b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a route add -6 -net ${net_dst}::/${plen} ${ll}%${epair1}a
617b4a4a3b8SAlexander V. Chernikov
618b4a4a3b8SAlexander V. Chernikov	# B towards A via epair0b LL
619b4a4a3b8SAlexander V. Chernikov	ll=`jexec ${jname}a ifconfig ${epair1}a inet6 | awk '$2~/^fe80:/{print$2}' | awk -F% '{print$1}'`
620b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b route add -6 -net ${net_src}::/${plen} ${ll}%${epair1}b
621b4a4a3b8SAlexander V. Chernikov
622b4a4a3b8SAlexander V. Chernikov	# Base setup verification
623*01f3f354SAlan Somers	atf_check -o match:'1 packets transmitted, 1 packets received' jexec ${jname}a ping -6 -nc1 ${ip_dst}
624b4a4a3b8SAlexander V. Chernikov
625b4a4a3b8SAlexander V. Chernikov	# run sender
626b4a4a3b8SAlexander V. Chernikov	valid_message='1 packets transmitted, 1 packets received'
627b4a4a3b8SAlexander V. Chernikov	for _ip in ${ips}; do
628b4a4a3b8SAlexander V. Chernikov		ip="${net_dst}:${_ip}"
629*01f3f354SAlan Somers		atf_check -o match:"${valid_message}" jexec ${jname}a ping -6 -nc1 ${ip}
630b4a4a3b8SAlexander V. Chernikov	done
631b4a4a3b8SAlexander V. Chernikov
632b4a4a3b8SAlexander V. Chernikov	pkt_0=`jexec ${jname}a netstat -Wf link -I ${epair0}a | head | awk '$1!~/^Name/{print$8}'`
633b4a4a3b8SAlexander V. Chernikov	pkt_1=`jexec ${jname}a netstat -Wf link -I ${epair1}a | head | awk '$1!~/^Name/{print$8}'`
634b4a4a3b8SAlexander V. Chernikov
635b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a netstat -bWf link -I ${epair0}a
636b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a netstat -bWf link -I ${epair1}a
637b4a4a3b8SAlexander V. Chernikov	if [ ${pkt_0} -le 10 ]; then
6384a8c6300SAlexander V. Chernikov		atf_fail "Balancing failure: 1: ${pkt_0} 2: ${pkt_1}"
639b4a4a3b8SAlexander V. Chernikov	fi
640b4a4a3b8SAlexander V. Chernikov	if [ ${pkt_1} -le 10 ]; then
6414a8c6300SAlexander V. Chernikov		atf_fail "Balancing failure: 1: ${pkt_0} 2: ${pkt_1}"
642b4a4a3b8SAlexander V. Chernikov	fi
643b4a4a3b8SAlexander V. Chernikov	echo "RAW BALANCING: 1: ${pkt_0} 2: ${pkt_1}"
644b4a4a3b8SAlexander V. Chernikov}
645b4a4a3b8SAlexander V. Chernikov
646b4a4a3b8SAlexander V. Chernikovoutput6_raw_flowid_mpath_success_cleanup()
647b4a4a3b8SAlexander V. Chernikov{
648b4a4a3b8SAlexander V. Chernikov	vnet_cleanup
649b4a4a3b8SAlexander V. Chernikov}
650b4a4a3b8SAlexander V. Chernikov
651b4a4a3b8SAlexander V. Chernikovatf_init_test_cases()
652b4a4a3b8SAlexander V. Chernikov{
653b4a4a3b8SAlexander V. Chernikov	atf_add_test_case "output6_tcp_setup_success"
654b4a4a3b8SAlexander V. Chernikov	atf_add_test_case "output6_udp_setup_success"
655b4a4a3b8SAlexander V. Chernikov	atf_add_test_case "output6_raw_success"
656b4a4a3b8SAlexander V. Chernikov	atf_add_test_case "output6_tcp_flowid_mpath_success"
657b4a4a3b8SAlexander V. Chernikov	atf_add_test_case "output6_udp_flowid_mpath_success"
658b4a4a3b8SAlexander V. Chernikov	atf_add_test_case "output6_raw_flowid_mpath_success"
659b4a4a3b8SAlexander V. Chernikov}
660b4a4a3b8SAlexander V. Chernikov
661b4a4a3b8SAlexander V. Chernikov# end
662b4a4a3b8SAlexander V. Chernikov
663b4a4a3b8SAlexander V. Chernikov
664