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