xref: /freebsd/tests/sys/netinet/output.sh (revision 001c48b4139ff6f07de70a16518161dcea5598b9)
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 "output_tcp_setup_success" "cleanup"
33b4a4a3b8SAlexander V. Chernikovoutput_tcp_setup_success_head()
34b4a4a3b8SAlexander V. Chernikov{
35b4a4a3b8SAlexander V. Chernikov
36b4a4a3b8SAlexander V. Chernikov	atf_set descr 'Test valid IPv4 TCP output'
37b4a4a3b8SAlexander V. Chernikov	atf_set require.user root
38b4a4a3b8SAlexander V. Chernikov}
39b4a4a3b8SAlexander V. Chernikov
40b4a4a3b8SAlexander V. Chernikovoutput_tcp_setup_success_body()
41b4a4a3b8SAlexander V. Chernikov{
42b4a4a3b8SAlexander V. Chernikov
43b4a4a3b8SAlexander V. Chernikov	vnet_init
44b4a4a3b8SAlexander V. Chernikov
45b4a4a3b8SAlexander V. Chernikov	net_src="192.0.2."
46b4a4a3b8SAlexander V. Chernikov	net_dst="192.0.2."
47b4a4a3b8SAlexander V. Chernikov	ip_src="${net_src}1"
48b4a4a3b8SAlexander V. Chernikov	ip_dst="${net_dst}2"
49b4a4a3b8SAlexander V. Chernikov	plen=24
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="v4t-output_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 inet ${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 inet ${ip_dst}/${plen}
67b4a4a3b8SAlexander V. Chernikov
68b4a4a3b8SAlexander V. Chernikov	# run listener
69b4a4a3b8SAlexander V. Chernikov	args="--family inet --ports ${port} --match_str ${text}"
70b4a4a3b8SAlexander V. Chernikov	echo jexec ${jname}b ${script_name} ${args}
71b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ${script_name} --test_name "test_listen_tcp" ${args} &
72b4a4a3b8SAlexander V. Chernikov	cmd_pid=$!
73b4a4a3b8SAlexander V. Chernikov
74b4a4a3b8SAlexander V. Chernikov	# wait for the script init
75b4a4a3b8SAlexander V. Chernikov	counter=0
76b4a4a3b8SAlexander V. Chernikov	while [ `jexec ${jname}b sockstat -4qlp ${port} | wc -l` != "1" ]; do
77b4a4a3b8SAlexander V. Chernikov		sleep 0.01
78b4a4a3b8SAlexander V. Chernikov		counter=$((counter+1))
79b4a4a3b8SAlexander V. Chernikov		if [ ${counter} -ge 50 ]; then break; fi
80b4a4a3b8SAlexander V. Chernikov	done
81b4a4a3b8SAlexander V. Chernikov	if [ `jexec ${jname}b sockstat -4qlp ${port} | wc -l` != "1" ]; then
82b4a4a3b8SAlexander V. Chernikov		echo "App setup failed"
83b4a4a3b8SAlexander V. Chernikov		exit 1
84b4a4a3b8SAlexander V. Chernikov	fi
85b4a4a3b8SAlexander V. Chernikov
86b4a4a3b8SAlexander V. Chernikov	# run sender
87b4a4a3b8SAlexander V. Chernikov	echo -n "${text}" | jexec ${jname}a nc -N ${ip_dst} ${port}
88b4a4a3b8SAlexander V. Chernikov	exit_code=$?
89b4a4a3b8SAlexander V. Chernikov	if [ $exit_code -ne 0 ]; then atf_fail "sender exit code $exit_code" ; fi
90b4a4a3b8SAlexander V. Chernikov
91b4a4a3b8SAlexander V. Chernikov	wait ${cmd_pid}
92b4a4a3b8SAlexander V. Chernikov	exit_code=$?
93b4a4a3b8SAlexander V. Chernikov	if [ $exit_code -ne 0 ]; then atf_fail "receiver exit code $exit_code" ; fi
94b4a4a3b8SAlexander V. Chernikov}
95b4a4a3b8SAlexander V. Chernikov
96b4a4a3b8SAlexander V. Chernikovoutput_tcp_setup_success_cleanup()
97b4a4a3b8SAlexander V. Chernikov{
98b4a4a3b8SAlexander V. Chernikov	vnet_cleanup
99b4a4a3b8SAlexander V. Chernikov}
100b4a4a3b8SAlexander V. Chernikov
101b4a4a3b8SAlexander V. Chernikov
102b4a4a3b8SAlexander V. Chernikovatf_test_case "output_udp_setup_success" "cleanup"
103b4a4a3b8SAlexander V. Chernikovoutput_udp_setup_success_head()
104b4a4a3b8SAlexander V. Chernikov{
105b4a4a3b8SAlexander V. Chernikov
106b4a4a3b8SAlexander V. Chernikov	atf_set descr 'Test valid IPv4 UDP output'
107b4a4a3b8SAlexander V. Chernikov	atf_set require.user root
108b4a4a3b8SAlexander V. Chernikov}
109b4a4a3b8SAlexander V. Chernikov
110b4a4a3b8SAlexander V. Chernikovoutput_udp_setup_success_body()
111b4a4a3b8SAlexander V. Chernikov{
112b4a4a3b8SAlexander V. Chernikov
113b4a4a3b8SAlexander V. Chernikov	vnet_init
114b4a4a3b8SAlexander V. Chernikov
115b4a4a3b8SAlexander V. Chernikov	net_src="192.0.2."
116b4a4a3b8SAlexander V. Chernikov	net_dst="192.0.2."
117b4a4a3b8SAlexander V. Chernikov	ip_src="${net_src}1"
118b4a4a3b8SAlexander V. Chernikov	ip_dst="${net_dst}2"
119b4a4a3b8SAlexander V. Chernikov	plen=24
120b4a4a3b8SAlexander V. Chernikov	text="testtesttst"
121b4a4a3b8SAlexander V. Chernikov	port=4242
122b4a4a3b8SAlexander V. Chernikov
123b4a4a3b8SAlexander V. Chernikov	script_name=`dirname $0`/../common/net_receiver.py
124b4a4a3b8SAlexander V. Chernikov	script_name=`realpath ${script_name}`
125b4a4a3b8SAlexander V. Chernikov	jname="v4t-output_udp_setup_success"
126b4a4a3b8SAlexander V. Chernikov
127b4a4a3b8SAlexander V. Chernikov	epair=$(vnet_mkepair)
128b4a4a3b8SAlexander V. Chernikov
129b4a4a3b8SAlexander V. Chernikov	vnet_mkjail ${jname}a ${epair}a
130b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair}a up
131b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair}a inet ${ip_src}/${plen}
132b4a4a3b8SAlexander V. Chernikov
133b4a4a3b8SAlexander V. Chernikov	vnet_mkjail ${jname}b ${epair}b
134b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair}b up
135b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair}b inet ${ip_dst}/${plen}
136b4a4a3b8SAlexander V. Chernikov
137b4a4a3b8SAlexander V. Chernikov	# run listener
138b4a4a3b8SAlexander V. Chernikov	args="--family inet --ports ${port} --match_str ${text}"
139b4a4a3b8SAlexander V. Chernikov	echo jexec ${jname}b ${script_name} ${args}
140b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ${script_name} --test_name "test_listen_udp" ${args} &
141b4a4a3b8SAlexander V. Chernikov	cmd_pid=$!
142b4a4a3b8SAlexander V. Chernikov
143b4a4a3b8SAlexander V. Chernikov	# wait for the script init
144b4a4a3b8SAlexander V. Chernikov	counter=0
145b4a4a3b8SAlexander V. Chernikov	while [ `jexec ${jname}b sockstat -4qlp ${port} | wc -l` != "1" ]; do
146b4a4a3b8SAlexander V. Chernikov		sleep 0.1
147b4a4a3b8SAlexander V. Chernikov		counterc=$((counter+1))
148b4a4a3b8SAlexander V. Chernikov		if [ ${counter} -ge 50 ]; then break; fi
149b4a4a3b8SAlexander V. Chernikov	done
150b4a4a3b8SAlexander V. Chernikov	if [ `jexec ${jname}b sockstat -4qlp ${port} | wc -l` != "1" ]; then
151b4a4a3b8SAlexander V. Chernikov		echo "App setup failed"
152b4a4a3b8SAlexander V. Chernikov		exit 1
153b4a4a3b8SAlexander V. Chernikov	fi
154b4a4a3b8SAlexander V. Chernikov
155b4a4a3b8SAlexander V. Chernikov	# run sender
156b4a4a3b8SAlexander V. Chernikov	# TODO: switch from nc to some alternative to avoid 1-second delay
157b4a4a3b8SAlexander V. Chernikov	echo -n "${text}" | jexec ${jname}a nc -uNw1 ${ip_dst} ${port}
158b4a4a3b8SAlexander V. Chernikov	exit_code=$?
159b4a4a3b8SAlexander V. Chernikov	if [ $exit_code -ne 0 ]; then atf_fail "sender exit code $exit_code" ; fi
160b4a4a3b8SAlexander V. Chernikov
161b4a4a3b8SAlexander V. Chernikov	wait ${cmd_pid}
162b4a4a3b8SAlexander V. Chernikov	exit_code=$?
163b4a4a3b8SAlexander V. Chernikov	if [ $exit_code -ne 0 ]; then atf_fail "receiver exit code $exit_code" ; fi
164b4a4a3b8SAlexander V. Chernikov}
165b4a4a3b8SAlexander V. Chernikov
166b4a4a3b8SAlexander V. Chernikovoutput_udp_setup_success_cleanup()
167b4a4a3b8SAlexander V. Chernikov{
168b4a4a3b8SAlexander V. Chernikov	vnet_cleanup
169b4a4a3b8SAlexander V. Chernikov}
170b4a4a3b8SAlexander V. Chernikov
171b4a4a3b8SAlexander V. Chernikovatf_test_case "output_raw_success" "cleanup"
172b4a4a3b8SAlexander V. Chernikovoutput_raw_success_head()
173b4a4a3b8SAlexander V. Chernikov{
174b4a4a3b8SAlexander V. Chernikov
175b4a4a3b8SAlexander V. Chernikov	atf_set descr 'Test valid IPv4 raw output'
176b4a4a3b8SAlexander V. Chernikov	atf_set require.user root
177b4a4a3b8SAlexander V. Chernikov}
178b4a4a3b8SAlexander V. Chernikov
179b4a4a3b8SAlexander V. Chernikovoutput_raw_success_body()
180b4a4a3b8SAlexander V. Chernikov{
181b4a4a3b8SAlexander V. Chernikov
182b4a4a3b8SAlexander V. Chernikov	vnet_init
183b4a4a3b8SAlexander V. Chernikov
184b4a4a3b8SAlexander V. Chernikov	net_src="192.0.2."
185b4a4a3b8SAlexander V. Chernikov	net_dst="192.0.2."
186b4a4a3b8SAlexander V. Chernikov	ip_src="${net_src}1"
187b4a4a3b8SAlexander V. Chernikov	ip_dst="${net_dst}2"
188b4a4a3b8SAlexander V. Chernikov	plen=24
189b4a4a3b8SAlexander V. Chernikov
190b4a4a3b8SAlexander V. Chernikov	script_name=`dirname $0`/../common/net_receiver.py
191b4a4a3b8SAlexander V. Chernikov	script_name=`realpath ${script_name}`
192b4a4a3b8SAlexander V. Chernikov	jname="v4t-output_raw_success"
193b4a4a3b8SAlexander V. Chernikov
194b4a4a3b8SAlexander V. Chernikov	epair=$(vnet_mkepair)
195b4a4a3b8SAlexander V. Chernikov
196b4a4a3b8SAlexander V. Chernikov	vnet_mkjail ${jname}a ${epair}a
197b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair}a up
198b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair}a inet ${ip_src}/${plen}
199b4a4a3b8SAlexander V. Chernikov
200b4a4a3b8SAlexander V. Chernikov	vnet_mkjail ${jname}b ${epair}b
201b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair}b up
202b4a4a3b8SAlexander V. Chernikov
203b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair}b inet ${ip_dst}/${plen}
204b4a4a3b8SAlexander V. Chernikov
205b4a4a3b8SAlexander V. Chernikov	atf_check -o match:'1 packets transmitted, 1 packets received' jexec ${jname}a ping -nc1 ${ip_dst}
206b4a4a3b8SAlexander V. Chernikov}
207b4a4a3b8SAlexander V. Chernikov
208b4a4a3b8SAlexander V. Chernikovoutput_raw_success_cleanup()
209b4a4a3b8SAlexander V. Chernikov{
210b4a4a3b8SAlexander V. Chernikov	vnet_cleanup
211b4a4a3b8SAlexander V. Chernikov}
212b4a4a3b8SAlexander V. Chernikov
213b4a4a3b8SAlexander V. Chernikov# Multipath tests are done the following way:
214b4a4a3b8SAlexander V. Chernikov#            epair0
215b4a4a3b8SAlexander V. Chernikov# jailA lo <        > lo jailB
216b4a4a3b8SAlexander V. Chernikov#            epair1
217b4a4a3b8SAlexander V. Chernikov# jailA has 2 routes towards /24 prefix on jailB loopback, via 2 epairs
218b4a4a3b8SAlexander V. Chernikov# jailB has 1 route towards /24 prefix on jailA loopback, via epair0
219b4a4a3b8SAlexander V. Chernikov#
220b4a4a3b8SAlexander V. Chernikov# jailA initiates connections/sends packets towards IPs on jailB loopback.
221b4a4a3b8SAlexander V. Chernikov# Script then compares amount of packets sent via epair0 and epair1
222b4a4a3b8SAlexander V. Chernikov
223b4a4a3b8SAlexander V. Chernikovmpath_check()
224b4a4a3b8SAlexander V. Chernikov{
225a3525bd1SAlexander V. Chernikov	if [ `sysctl -iW net.route.multipath | wc -l` != "1" ]; then
226b4a4a3b8SAlexander V. Chernikov		atf_skip "This test requires ROUTE_MPATH enabled"
227b4a4a3b8SAlexander V. Chernikov	fi
228b4a4a3b8SAlexander V. Chernikov}
229b4a4a3b8SAlexander V. Chernikov
230a3525bd1SAlexander V. Chernikovmpath_enable()
231a3525bd1SAlexander V. Chernikov{
232a3525bd1SAlexander V. Chernikov	jexec $1 sysctl net.route.multipath=1
233a3525bd1SAlexander V. Chernikov	if [ $? != 0 ]; then
234a3525bd1SAlexander V. Chernikov		atf_fail "Setting multipath in jail $1 failed".
235a3525bd1SAlexander V. Chernikov	fi
236a3525bd1SAlexander V. Chernikov}
237a3525bd1SAlexander V. Chernikov
238b4a4a3b8SAlexander V. Chernikovatf_test_case "output_tcp_flowid_mpath_success" "cleanup"
239b4a4a3b8SAlexander V. Chernikovoutput_tcp_flowid_mpath_success_head()
240b4a4a3b8SAlexander V. Chernikov{
241b4a4a3b8SAlexander V. Chernikov
242b4a4a3b8SAlexander V. Chernikov	atf_set descr 'Test valid IPv4 TCP output flowid generation'
243b4a4a3b8SAlexander V. Chernikov	atf_set require.user root
244b4a4a3b8SAlexander V. Chernikov}
245b4a4a3b8SAlexander V. Chernikov
246b4a4a3b8SAlexander V. Chernikovoutput_tcp_flowid_mpath_success_body()
247b4a4a3b8SAlexander V. Chernikov{
248b4a4a3b8SAlexander V. Chernikov	vnet_init
249b4a4a3b8SAlexander V. Chernikov	mpath_check
250b4a4a3b8SAlexander V. Chernikov
251b4a4a3b8SAlexander V. Chernikov	net_src="192.0.2."
252b4a4a3b8SAlexander V. Chernikov	net_dst="198.51.100."
253b4a4a3b8SAlexander V. Chernikov	ip_src="${net_src}1"
254b4a4a3b8SAlexander V. Chernikov	ip_dst="${net_dst}1"
255b4a4a3b8SAlexander V. Chernikov	plen=24
256b4a4a3b8SAlexander V. Chernikov	text="testtesttst"
257b4a4a3b8SAlexander V. Chernikov
258b4a4a3b8SAlexander V. Chernikov	script_name=`dirname $0`/../common/net_receiver.py
259b4a4a3b8SAlexander V. Chernikov	script_name=`realpath ${script_name}`
260b4a4a3b8SAlexander V. Chernikov	jname="v4t-output_tcp_flowid_mpath_success"
261b4a4a3b8SAlexander V. Chernikov
262b4a4a3b8SAlexander V. Chernikov	epair0=$(vnet_mkepair)
263b4a4a3b8SAlexander V. Chernikov	epair1=$(vnet_mkepair)
264b4a4a3b8SAlexander V. Chernikov	lo_src=$(vnet_mkloopback)
265b4a4a3b8SAlexander V. Chernikov	lo_dst=$(vnet_mkloopback)
266b4a4a3b8SAlexander V. Chernikov
267b4a4a3b8SAlexander V. Chernikov	vnet_mkjail ${jname}a ${epair0}a ${epair1}a ${lo_src}
268a3525bd1SAlexander V. Chernikov	mpath_enable ${jname}a
269b4a4a3b8SAlexander V. Chernikov	# Setup transit IPv4 networks
270b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair0}a up
271b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair0}a inet 203.0.113.1/30
272b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair1}a up
273b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair1}a inet 203.0.113.5/30
274b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${lo_src} up
275b4a4a3b8SAlexander V. Chernikov
276b4a4a3b8SAlexander V. Chernikov	vnet_mkjail ${jname}b ${epair0}b ${epair1}b ${lo_dst}
277b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair0}b up
278b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair0}b inet 203.0.113.2/30
279b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair1}b up
280b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair1}b inet 203.0.113.6/30
281b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${lo_dst} up
282b4a4a3b8SAlexander V. Chernikov
283b4a4a3b8SAlexander V. Chernikov	# DST ips/ports to test
284b4a4a3b8SAlexander V. Chernikov	ips="4 29 48 53 55 61 71 80 84 87 90 91 119 131 137 153 154 158 162 169 169 171 176 187 197 228 233 235 236 237 245 251"
285b4a4a3b8SAlexander V. Chernikov	ports="53540 49743 43067 9131 16734 5150 14379 40292 20634 51302 3387 24387 9282 14275 42103 26881 42461 29520 45714 11096"
286b4a4a3b8SAlexander V. Chernikov
287b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${lo_src} inet ${ip_src}/32
288b4a4a3b8SAlexander V. Chernikov
289b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${lo_dst} inet ${ip_dst}/32
290b4a4a3b8SAlexander V. Chernikov	for i in ${ips}; do
291b4a4a3b8SAlexander V. Chernikov		jexec ${jname}b ifconfig ${lo_dst} alias ${net_dst}${i}/32
292b4a4a3b8SAlexander V. Chernikov	done
293b4a4a3b8SAlexander V. Chernikov
294b4a4a3b8SAlexander V. Chernikov	# Add routes
295b4a4a3b8SAlexander V. Chernikov	# A -> towards B via epair0a
296b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a route add -4 -net ${net_dst}0/${plen} 203.0.113.2
297b4a4a3b8SAlexander V. Chernikov	# A -> towards B via epair1a
298b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a route add -4 -net ${net_dst}0/${plen} 203.0.113.6
299b4a4a3b8SAlexander V. Chernikov
300b4a4a3b8SAlexander V. Chernikov	# B towards A via epair0b
301b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b route add -4 -net ${net_src}0/${plen} 203.0.113.1
302b4a4a3b8SAlexander V. Chernikov
303b4a4a3b8SAlexander V. Chernikov	# Base setup verification
304b4a4a3b8SAlexander V. Chernikov	atf_check -o match:'1 packets transmitted, 1 packets received' jexec ${jname}a ping -nc1 ${ip_dst}
305b4a4a3b8SAlexander V. Chernikov
306b4a4a3b8SAlexander V. Chernikov	# run listener
307b4a4a3b8SAlexander V. Chernikov	num_ports=`echo ${ports} | wc -w`
308b4a4a3b8SAlexander V. Chernikov	num_ips=`echo ${ips} | wc -w`
309b4a4a3b8SAlexander V. Chernikov	count_examples=$((num_ports*num_ips))
310b4a4a3b8SAlexander V. Chernikov	listener_ports=`echo ${ports} | tr ' ' '\n' | sort -n | tr '\n' ',' | sed -e 's?,$??'`
311b4a4a3b8SAlexander V. Chernikov	args="--family inet --ports ${listener_ports} --count ${count_examples} --match_str ${text}"
312b4a4a3b8SAlexander V. Chernikov	echo jexec ${jname}b ${script_name} ${args}
313b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ${script_name} --test_name "test_listen_tcp" ${args} &
314b4a4a3b8SAlexander V. Chernikov	cmd_pid=$!
315b4a4a3b8SAlexander V. Chernikov
316b4a4a3b8SAlexander V. Chernikov	# wait for the app init
317b4a4a3b8SAlexander V. Chernikov	counter=0
318b4a4a3b8SAlexander V. Chernikov	init=0
319b4a4a3b8SAlexander V. Chernikov	while [ ${counter} -le 50 ]; do
320b4a4a3b8SAlexander V. Chernikov		_ports=`jexec ${jname}b sockstat -4ql | awk "\\\$3 == ${cmd_pid} {print \\\$6}"|awk -F: "{print \\\$2}" | sort -n | tr '\n' ','`
321b4a4a3b8SAlexander V. Chernikov		if [ "${_ports}" = "${listener_ports}," ]; then
322b4a4a3b8SAlexander V. Chernikov			init=1
323b4a4a3b8SAlexander V. Chernikov			break;
324b4a4a3b8SAlexander V. Chernikov		fi
325b4a4a3b8SAlexander V. Chernikov	done
326b4a4a3b8SAlexander V. Chernikov	if [ ${init} -eq 0 ]; then
327b4a4a3b8SAlexander V. Chernikov		jexec ${jname}b sockstat -6ql | awk "\$3 == ${cmd_pid}"
328b4a4a3b8SAlexander V. Chernikov		echo "App setup failed"
329b4a4a3b8SAlexander V. Chernikov		exit 1
330b4a4a3b8SAlexander V. Chernikov	fi
331b4a4a3b8SAlexander V. Chernikov	echo "App setup done"
332b4a4a3b8SAlexander V. Chernikov
333b4a4a3b8SAlexander V. Chernikov	# run sender
334b4a4a3b8SAlexander V. Chernikov	for _ip in ${ips}; do
335b4a4a3b8SAlexander V. Chernikov		ip="${net_dst}${_ip}"
336b4a4a3b8SAlexander V. Chernikov		for port in ${ports}; do
337b4a4a3b8SAlexander V. Chernikov			echo -n "${text}" | jexec ${jname}a nc -nN ${ip} ${port}
338b4a4a3b8SAlexander V. Chernikov			exit_code=$?
339b4a4a3b8SAlexander V. Chernikov			if [ $exit_code -ne 0 ]; then atf_fail "sender exit code $exit_code" ; fi
340b4a4a3b8SAlexander V. Chernikov		done
341b4a4a3b8SAlexander V. Chernikov	done
342b4a4a3b8SAlexander V. Chernikov
343b4a4a3b8SAlexander V. Chernikov	wait ${cmd_pid}
344b4a4a3b8SAlexander V. Chernikov	exit_code=$?
345b4a4a3b8SAlexander V. Chernikov	if [ $exit_code -ne 0 ]; then atf_fail "receiver exit code $exit_code" ; fi
346b4a4a3b8SAlexander V. Chernikov
347b4a4a3b8SAlexander V. Chernikov	pkt_0=`jexec ${jname}a netstat -Wf link -I ${epair0}a | head | awk '$1!~/^Name/{print$8}'`
348b4a4a3b8SAlexander V. Chernikov	pkt_1=`jexec ${jname}a netstat -Wf link -I ${epair1}a | head | awk '$1!~/^Name/{print$8}'`
349b4a4a3b8SAlexander V. Chernikov	if [ ${pkt_0} -le 10 ]; then
3504a8c6300SAlexander V. Chernikov		atf_fail "Balancing failure: 1: ${pkt_0} 2: ${pkt_1}"
351b4a4a3b8SAlexander V. Chernikov	fi
352b4a4a3b8SAlexander V. Chernikov	if [ ${pkt_1} -le 10 ]; then
3534a8c6300SAlexander V. Chernikov		atf_fail "Balancing failure: 1: ${pkt_0} 2: ${pkt_1}"
354b4a4a3b8SAlexander V. Chernikov		exit 1
355b4a4a3b8SAlexander V. Chernikov	fi
356b4a4a3b8SAlexander V. Chernikov	echo "TCP Balancing: 1: ${pkt_0} 2: ${pkt_1}"
357b4a4a3b8SAlexander V. Chernikov}
358b4a4a3b8SAlexander V. Chernikov
359b4a4a3b8SAlexander V. Chernikovoutput_tcp_flowid_mpath_success_cleanup()
360b4a4a3b8SAlexander V. Chernikov{
361b4a4a3b8SAlexander V. Chernikov	vnet_cleanup
362b4a4a3b8SAlexander V. Chernikov}
363b4a4a3b8SAlexander V. Chernikov
364b4a4a3b8SAlexander V. Chernikovatf_test_case "output_udp_flowid_mpath_success" "cleanup"
365b4a4a3b8SAlexander V. Chernikovoutput_udp_flowid_mpath_success_head()
366b4a4a3b8SAlexander V. Chernikov{
367b4a4a3b8SAlexander V. Chernikov
368b4a4a3b8SAlexander V. Chernikov	atf_set descr 'Test valid IPv4 UDP output flowid generation'
369b4a4a3b8SAlexander V. Chernikov	atf_set require.user root
370b4a4a3b8SAlexander V. Chernikov}
371b4a4a3b8SAlexander V. Chernikov
372b4a4a3b8SAlexander V. Chernikovoutput_udp_flowid_mpath_success_body()
373b4a4a3b8SAlexander V. Chernikov{
374b4a4a3b8SAlexander V. Chernikov
375b4a4a3b8SAlexander V. Chernikov	vnet_init
376b4a4a3b8SAlexander V. Chernikov	mpath_check
377b4a4a3b8SAlexander V. Chernikov
378b4a4a3b8SAlexander V. Chernikov	# Note this test will spawn around ~100 nc processes
379b4a4a3b8SAlexander V. Chernikov
380b4a4a3b8SAlexander V. Chernikov	net_src="192.0.2."
381b4a4a3b8SAlexander V. Chernikov	net_dst="198.51.100."
382b4a4a3b8SAlexander V. Chernikov	ip_src="${net_src}1"
383b4a4a3b8SAlexander V. Chernikov	ip_dst="${net_dst}1"
384b4a4a3b8SAlexander V. Chernikov	plen=24
385b4a4a3b8SAlexander V. Chernikov	text="testtesttst"
386b4a4a3b8SAlexander V. Chernikov
387b4a4a3b8SAlexander V. Chernikov	script_name=`dirname $0`/../common/net_receiver.py
388b4a4a3b8SAlexander V. Chernikov	script_name=`realpath ${script_name}`
389*001c48b4SMark Johnston	jname="v4t-output_udp_flowid_mpath_success"
390b4a4a3b8SAlexander V. Chernikov
391b4a4a3b8SAlexander V. Chernikov	epair0=$(vnet_mkepair)
392b4a4a3b8SAlexander V. Chernikov	epair1=$(vnet_mkepair)
393b4a4a3b8SAlexander V. Chernikov	lo_src=$(vnet_mkloopback)
394b4a4a3b8SAlexander V. Chernikov	lo_dst=$(vnet_mkloopback)
395b4a4a3b8SAlexander V. Chernikov
396b4a4a3b8SAlexander V. Chernikov	vnet_mkjail ${jname}a ${epair0}a ${epair1}a ${lo_src}
397a3525bd1SAlexander V. Chernikov	mpath_enable ${jname}a
398b4a4a3b8SAlexander V. Chernikov	# Setup transit IPv4 networks
399b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair0}a up
400b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair0}a inet 203.0.113.1/30
401b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair1}a up
402b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair1}a inet 203.0.113.5/30
403b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${lo_src} up
404b4a4a3b8SAlexander V. Chernikov
405b4a4a3b8SAlexander V. Chernikov	vnet_mkjail ${jname}b ${epair0}b ${epair1}b ${lo_dst}
406b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair0}b up
407b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair0}b inet 203.0.113.2/30
408b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair1}b up
409b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair1}b inet 203.0.113.6/30
410b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${lo_dst} up
411b4a4a3b8SAlexander V. Chernikov
412b4a4a3b8SAlexander V. Chernikov	# DST ips/ports to test
413b4a4a3b8SAlexander V. Chernikov	ips="4 29 48 53 55 61 71 80 84 87 90 91 119 131 137 153 154 158 162 169 169 171 176 187 197 228 233 235 236 237 245 251"
414b4a4a3b8SAlexander V. Chernikov	ports="53540 49743 43067 9131 16734 5150 14379 40292 20634 51302 3387 24387 9282 14275 42103 26881 42461 29520 45714 11096"
415b4a4a3b8SAlexander V. Chernikov
416b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${lo_src} inet ${ip_src}/32
417b4a4a3b8SAlexander V. Chernikov
418b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${lo_dst} inet ${ip_dst}/32
419b4a4a3b8SAlexander V. Chernikov	for i in ${ips}; do
420b4a4a3b8SAlexander V. Chernikov		jexec ${jname}b ifconfig ${lo_dst} alias ${net_dst}${i}/32
421b4a4a3b8SAlexander V. Chernikov	done
422b4a4a3b8SAlexander V. Chernikov
423b4a4a3b8SAlexander V. Chernikov	# Add routes
424b4a4a3b8SAlexander V. Chernikov	# A -> towards B via epair0a
425b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a route add -4 -net ${net_dst}0/${plen} 203.0.113.2
426b4a4a3b8SAlexander V. Chernikov	# A -> towards B via epair1a
427b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a route add -4 -net ${net_dst}0/${plen} 203.0.113.6
428b4a4a3b8SAlexander V. Chernikov
429b4a4a3b8SAlexander V. Chernikov	# B towards A via epair0b
430b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b route add -4 -net ${net_src}0/${plen} 203.0.113.1
431b4a4a3b8SAlexander V. Chernikov
432b4a4a3b8SAlexander V. Chernikov	# Base setup verification
433b4a4a3b8SAlexander V. Chernikov	atf_check -o match:'1 packets transmitted, 1 packets received' jexec ${jname}a ping -nc1 ${ip_dst}
434b4a4a3b8SAlexander V. Chernikov
435b4a4a3b8SAlexander V. Chernikov	# run listener
436b4a4a3b8SAlexander V. Chernikov	num_ports=`echo ${ports} | wc -w`
437b4a4a3b8SAlexander V. Chernikov	num_ips=`echo ${ips} | wc -w`
438b4a4a3b8SAlexander V. Chernikov	count_examples=$((num_ports*num_ips))
439b4a4a3b8SAlexander V. Chernikov	listener_ports=`echo ${ports} | tr ' ' '\n' | sort -n | tr '\n' ',' | sed -e 's?,$??'`
440b4a4a3b8SAlexander V. Chernikov	args="--family inet --ports ${listener_ports} --count ${count_examples} --match_str ${text}"
441b4a4a3b8SAlexander V. Chernikov	echo jexec ${jname}b ${script_name} ${args}
442b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ${script_name} --test_name "test_listen_udp" ${args} &
443b4a4a3b8SAlexander V. Chernikov	cmd_pid=$!
444b4a4a3b8SAlexander V. Chernikov
445b4a4a3b8SAlexander V. Chernikov	# wait for the app init
446b4a4a3b8SAlexander V. Chernikov	counter=0
447b4a4a3b8SAlexander V. Chernikov	init=0
448b4a4a3b8SAlexander V. Chernikov	while [ ${counter} -le 50 ]; do
449b4a4a3b8SAlexander V. Chernikov		_ports=`jexec ${jname}b sockstat -4ql | awk "\\\$3 == ${cmd_pid} {print \\\$6}"|awk -F: "{print \\\$2}" | sort -n | tr '\n' ','`
450b4a4a3b8SAlexander V. Chernikov		if [ "${_ports}" = "${listener_ports}," ]; then
451b4a4a3b8SAlexander V. Chernikov			init=1
452b4a4a3b8SAlexander V. Chernikov			break;
453b4a4a3b8SAlexander V. Chernikov		fi
454b4a4a3b8SAlexander V. Chernikov	done
455b4a4a3b8SAlexander V. Chernikov	if [ ${init} -eq 0 ]; then
456b4a4a3b8SAlexander V. Chernikov		jexec ${jname}b sockstat -4ql | awk "\$3 == ${cmd_pid}"
457b4a4a3b8SAlexander V. Chernikov		echo "App setup failed"
458b4a4a3b8SAlexander V. Chernikov		exit 1
459b4a4a3b8SAlexander V. Chernikov	fi
460b4a4a3b8SAlexander V. Chernikov	echo "App setup done"
461b4a4a3b8SAlexander V. Chernikov
462b4a4a3b8SAlexander V. Chernikov	# run sender
463b4a4a3b8SAlexander V. Chernikov	for _ip in ${ips}; do
464b4a4a3b8SAlexander V. Chernikov		ip="${net_dst}${_ip}"
465b4a4a3b8SAlexander V. Chernikov		for port in ${ports}; do
466b4a4a3b8SAlexander V. Chernikov			# XXX: switch to something that allows immediate exit
467b4a4a3b8SAlexander V. Chernikov			echo -n "${text}" | jexec ${jname}a nc -nuNw1 ${ip} ${port} &
468b4a4a3b8SAlexander V. Chernikov			sleep 0.01
469b4a4a3b8SAlexander V. Chernikov		done
470b4a4a3b8SAlexander V. Chernikov	done
471b4a4a3b8SAlexander V. Chernikov
472b4a4a3b8SAlexander V. Chernikov	wait ${cmd_pid}
473b4a4a3b8SAlexander V. Chernikov	exit_code=$?
474b4a4a3b8SAlexander V. Chernikov	if [ $exit_code -ne 0 ]; then atf_fail "receiver exit code $exit_code" ; fi
475b4a4a3b8SAlexander V. Chernikov
476b4a4a3b8SAlexander V. Chernikov	pkt_0=`jexec ${jname}a netstat -Wf link -I ${epair0}a | head | awk '$1!~/^Name/{print$8}'`
477b4a4a3b8SAlexander V. Chernikov	pkt_1=`jexec ${jname}a netstat -Wf link -I ${epair1}a | head | awk '$1!~/^Name/{print$8}'`
478b4a4a3b8SAlexander V. Chernikov	if [ ${pkt_0} -le 10 ]; then
4794a8c6300SAlexander V. Chernikov		atf_fail "Balancing failure: 1: ${pkt_0} 2: ${pkt_1}"
480b4a4a3b8SAlexander V. Chernikov	fi
481b4a4a3b8SAlexander V. Chernikov	if [ ${pkt_1} -le 10 ]; then
4824a8c6300SAlexander V. Chernikov		atf_fail "Balancing failure: 1: ${pkt_0} 2: ${pkt_1}"
483b4a4a3b8SAlexander V. Chernikov	fi
484b4a4a3b8SAlexander V. Chernikov	echo "UDP BALANCING: 1: ${pkt_0} 2: ${pkt_1}"
485b4a4a3b8SAlexander V. Chernikov}
486b4a4a3b8SAlexander V. Chernikov
487b4a4a3b8SAlexander V. Chernikovoutput_udp_flowid_mpath_success_cleanup()
488b4a4a3b8SAlexander V. Chernikov{
489b4a4a3b8SAlexander V. Chernikov	vnet_cleanup
490b4a4a3b8SAlexander V. Chernikov}
491b4a4a3b8SAlexander V. Chernikov
492b4a4a3b8SAlexander V. Chernikovatf_test_case "output_raw_flowid_mpath_success" "cleanup"
493b4a4a3b8SAlexander V. Chernikovoutput_raw_flowid_mpath_success_head()
494b4a4a3b8SAlexander V. Chernikov{
495b4a4a3b8SAlexander V. Chernikov
496b4a4a3b8SAlexander V. Chernikov	atf_set descr 'Test valid IPv4 raw output flowid generation'
497b4a4a3b8SAlexander V. Chernikov	atf_set require.user root
498b4a4a3b8SAlexander V. Chernikov}
499b4a4a3b8SAlexander V. Chernikov
500b4a4a3b8SAlexander V. Chernikovoutput_raw_flowid_mpath_success_body()
501b4a4a3b8SAlexander V. Chernikov{
502b4a4a3b8SAlexander V. Chernikov
503b4a4a3b8SAlexander V. Chernikov	vnet_init
504b4a4a3b8SAlexander V. Chernikov	mpath_check
505b4a4a3b8SAlexander V. Chernikov
506b4a4a3b8SAlexander V. Chernikov	net_src="192.0.2."
507b4a4a3b8SAlexander V. Chernikov	net_dst="198.51.100."
508b4a4a3b8SAlexander V. Chernikov	ip_src="${net_src}1"
509b4a4a3b8SAlexander V. Chernikov	ip_dst="${net_dst}1"
510b4a4a3b8SAlexander V. Chernikov	plen=24
511b4a4a3b8SAlexander V. Chernikov	text="testtesttst"
512b4a4a3b8SAlexander V. Chernikov
513*001c48b4SMark Johnston	jname="v4t-output_raw_flowid_mpath_success"
514b4a4a3b8SAlexander V. Chernikov
515b4a4a3b8SAlexander V. Chernikov	epair0=$(vnet_mkepair)
516b4a4a3b8SAlexander V. Chernikov	epair1=$(vnet_mkepair)
517b4a4a3b8SAlexander V. Chernikov	lo_src=$(vnet_mkloopback)
518b4a4a3b8SAlexander V. Chernikov	lo_dst=$(vnet_mkloopback)
519b4a4a3b8SAlexander V. Chernikov
520b4a4a3b8SAlexander V. Chernikov	vnet_mkjail ${jname}a ${epair0}a ${epair1}a ${lo_src}
521a3525bd1SAlexander V. Chernikov	mpath_enable ${jname}a
522b4a4a3b8SAlexander V. Chernikov	# Setup transit IPv4 networks
523b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair0}a up
524b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair0}a inet 203.0.113.1/30
525b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair1}a up
526b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${epair1}a inet 203.0.113.5/30
527b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${lo_src} up
528b4a4a3b8SAlexander V. Chernikov
529b4a4a3b8SAlexander V. Chernikov	vnet_mkjail ${jname}b ${epair0}b ${epair1}b ${lo_dst}
530b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair0}b up
531b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair0}b inet 203.0.113.2/30
532b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair1}b up
533b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${epair1}b inet 203.0.113.6/30
534b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${lo_dst} up
535b4a4a3b8SAlexander V. Chernikov
536b4a4a3b8SAlexander V. Chernikov	# DST ips/ports to test
537b4a4a3b8SAlexander V. Chernikov	ips="4 29 48 53 55 61 71 80 84 87 90 91 119 131 137 153 154 158 162 169 169 171 176 187 197 228 233 235 236 237 245 251"
538b4a4a3b8SAlexander V. Chernikov
539b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a ifconfig ${lo_src} inet ${ip_src}/32
540b4a4a3b8SAlexander V. Chernikov
541b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b ifconfig ${lo_dst} inet ${ip_dst}/32
542b4a4a3b8SAlexander V. Chernikov	for i in ${ips}; do
543b4a4a3b8SAlexander V. Chernikov		jexec ${jname}b ifconfig ${lo_dst} alias ${net_dst}${i}/32
544b4a4a3b8SAlexander V. Chernikov	done
545b4a4a3b8SAlexander V. Chernikov
546b4a4a3b8SAlexander V. Chernikov	# Add routes
547b4a4a3b8SAlexander V. Chernikov	# A -> towards B via epair0a
548b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a route add -4 -net ${net_dst}0/${plen} 203.0.113.2
549b4a4a3b8SAlexander V. Chernikov	# A -> towards B via epair1a
550b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a route add -4 -net ${net_dst}0/${plen} 203.0.113.6
551b4a4a3b8SAlexander V. Chernikov
552b4a4a3b8SAlexander V. Chernikov	# B towards A via epair0b
553b4a4a3b8SAlexander V. Chernikov	jexec ${jname}b route add -4 -net ${net_src}0/${plen} 203.0.113.1
554b4a4a3b8SAlexander V. Chernikov
555b4a4a3b8SAlexander V. Chernikov	# Base setup verification
556b4a4a3b8SAlexander V. Chernikov	atf_check -o match:'1 packets transmitted, 1 packets received' jexec ${jname}a ping -nc1 ${ip_dst}
557b4a4a3b8SAlexander V. Chernikov
558b4a4a3b8SAlexander V. Chernikov	# run sender
559b4a4a3b8SAlexander V. Chernikov	valid_message='1 packets transmitted, 1 packets received'
560b4a4a3b8SAlexander V. Chernikov	for _ip in ${ips}; do
561b4a4a3b8SAlexander V. Chernikov		ip="${net_dst}${_ip}"
562b4a4a3b8SAlexander V. Chernikov		atf_check -o match:"${valid_message}" jexec ${jname}a ping -nc1 ${ip}
563b4a4a3b8SAlexander V. Chernikov	done
564b4a4a3b8SAlexander V. Chernikov
565b4a4a3b8SAlexander V. Chernikov	pkt_0=`jexec ${jname}a netstat -Wf link -I ${epair0}a | head | awk '$1!~/^Name/{print$8}'`
566b4a4a3b8SAlexander V. Chernikov	pkt_1=`jexec ${jname}a netstat -Wf link -I ${epair1}a | head | awk '$1!~/^Name/{print$8}'`
567b4a4a3b8SAlexander V. Chernikov
568b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a netstat -bWf link -I ${epair0}a
569b4a4a3b8SAlexander V. Chernikov	jexec ${jname}a netstat -bWf link -I ${epair1}a
570b4a4a3b8SAlexander V. Chernikov	if [ ${pkt_0} -le 10 ]; then
5714a8c6300SAlexander V. Chernikov		atf_fail "Balancing failure: 1: ${pkt_0} 2: ${pkt_1}"
572b4a4a3b8SAlexander V. Chernikov	fi
573b4a4a3b8SAlexander V. Chernikov	if [ ${pkt_1} -le 10 ]; then
5744a8c6300SAlexander V. Chernikov		atf_fail "Balancing failure: 1: ${pkt_0} 2: ${pkt_1}"
575b4a4a3b8SAlexander V. Chernikov	fi
576b4a4a3b8SAlexander V. Chernikov	echo "RAW BALANCING: 1: ${pkt_0} 2: ${pkt_1}"
577b4a4a3b8SAlexander V. Chernikov}
578b4a4a3b8SAlexander V. Chernikov
579b4a4a3b8SAlexander V. Chernikovoutput_raw_flowid_mpath_success_cleanup()
580b4a4a3b8SAlexander V. Chernikov{
581b4a4a3b8SAlexander V. Chernikov	vnet_cleanup
582b4a4a3b8SAlexander V. Chernikov}
583b4a4a3b8SAlexander V. Chernikov
584b4a4a3b8SAlexander V. Chernikovatf_init_test_cases()
585b4a4a3b8SAlexander V. Chernikov{
586b4a4a3b8SAlexander V. Chernikov	atf_add_test_case "output_tcp_setup_success"
587b4a4a3b8SAlexander V. Chernikov	atf_add_test_case "output_udp_setup_success"
588b4a4a3b8SAlexander V. Chernikov	atf_add_test_case "output_raw_success"
589b4a4a3b8SAlexander V. Chernikov	atf_add_test_case "output_tcp_flowid_mpath_success"
590b4a4a3b8SAlexander V. Chernikov	atf_add_test_case "output_udp_flowid_mpath_success"
591b4a4a3b8SAlexander V. Chernikov	atf_add_test_case "output_raw_flowid_mpath_success"
592b4a4a3b8SAlexander V. Chernikov}
593b4a4a3b8SAlexander V. Chernikov
594