1768c98a7SAlexander V. Chernikov#!/usr/bin/env atf-sh 2768c98a7SAlexander V. Chernikov#- 3768c98a7SAlexander V. Chernikov# SPDX-License-Identifier: BSD-2-Clause 4768c98a7SAlexander V. Chernikov# 5768c98a7SAlexander V. Chernikov# Copyright (c) 2020 Alexander V. Chernikov 6768c98a7SAlexander V. Chernikov# 7768c98a7SAlexander V. Chernikov# Redistribution and use in source and binary forms, with or without 8768c98a7SAlexander V. Chernikov# modification, are permitted provided that the following conditions 9768c98a7SAlexander V. Chernikov# are met: 10768c98a7SAlexander V. Chernikov# 1. Redistributions of source code must retain the above copyright 11768c98a7SAlexander V. Chernikov# notice, this list of conditions and the following disclaimer. 12768c98a7SAlexander V. Chernikov# 2. Redistributions in binary form must reproduce the above copyright 13768c98a7SAlexander V. Chernikov# notice, this list of conditions and the following disclaimer in the 14768c98a7SAlexander V. Chernikov# documentation and/or other materials provided with the distribution. 15768c98a7SAlexander V. Chernikov# 16768c98a7SAlexander V. Chernikov# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17768c98a7SAlexander V. Chernikov# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18768c98a7SAlexander V. Chernikov# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19768c98a7SAlexander V. Chernikov# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20768c98a7SAlexander V. Chernikov# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21768c98a7SAlexander V. Chernikov# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22768c98a7SAlexander V. Chernikov# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23768c98a7SAlexander V. Chernikov# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24768c98a7SAlexander V. Chernikov# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25768c98a7SAlexander V. Chernikov# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26768c98a7SAlexander V. Chernikov# SUCH DAMAGE. 27768c98a7SAlexander V. Chernikov# 28768c98a7SAlexander V. Chernikov# 29768c98a7SAlexander V. Chernikov 30768c98a7SAlexander V. Chernikov. $(atf_get_srcdir)/../common/vnet.subr 31768c98a7SAlexander V. Chernikov 32768c98a7SAlexander V. Chernikovsetup_networking() 33768c98a7SAlexander V. Chernikov{ 34768c98a7SAlexander V. Chernikov jname="$1" 35768c98a7SAlexander V. Chernikov lo_dst="$2" 36768c98a7SAlexander V. Chernikov epair0="$3" 37768c98a7SAlexander V. Chernikov epair1="$4" 38768c98a7SAlexander V. Chernikov 39768c98a7SAlexander V. Chernikov vnet_mkjail ${jname}a ${epair0}a ${epair1}a 40768c98a7SAlexander V. Chernikov # Setup transit IPv4 networks 41768c98a7SAlexander V. Chernikov jexec ${jname}a ifconfig ${epair0}a up 42768c98a7SAlexander V. Chernikov jexec ${jname}a ifconfig ${epair0}a inet 203.0.113.1/30 43768c98a7SAlexander V. Chernikov jexec ${jname}a ifconfig ${epair1}a up 44768c98a7SAlexander V. Chernikov jexec ${jname}a ifconfig ${epair1}a inet 203.0.113.5/30 45768c98a7SAlexander V. Chernikov 46768c98a7SAlexander V. Chernikov vnet_mkjail ${jname}b ${epair0}b ${epair1}b ${lo_dst} 47768c98a7SAlexander V. Chernikov jexec ${jname}b ifconfig ${epair0}b up 48768c98a7SAlexander V. Chernikov jexec ${jname}b ifconfig ${epair0}b inet 203.0.113.2/30 49768c98a7SAlexander V. Chernikov jexec ${jname}b ifconfig ${epair1}b up 50768c98a7SAlexander V. Chernikov jexec ${jname}b ifconfig ${epair1}b inet 203.0.113.6/30 51768c98a7SAlexander V. Chernikov jexec ${jname}b ifconfig ${lo_dst} up 52768c98a7SAlexander V. Chernikov 53768c98a7SAlexander V. Chernikov} 54768c98a7SAlexander V. Chernikov 55768c98a7SAlexander V. Chernikovatf_test_case "lpm_test1_success" "cleanup" 56768c98a7SAlexander V. Chernikovlpm_test1_success_head() 57768c98a7SAlexander V. Chernikov{ 58768c98a7SAlexander V. Chernikov 59768c98a7SAlexander V. Chernikov atf_set descr 'Test IPv4 LPM for /30 and /31' 60768c98a7SAlexander V. Chernikov atf_set require.user root 61768c98a7SAlexander V. Chernikov} 62768c98a7SAlexander V. Chernikov 63768c98a7SAlexander V. Chernikovlpm_test1_success_body() 64768c98a7SAlexander V. Chernikov{ 65768c98a7SAlexander V. Chernikov 66768c98a7SAlexander V. Chernikov vnet_init 67768c98a7SAlexander V. Chernikov 68768c98a7SAlexander V. Chernikov jname="v4t-lpm_test1_success" 69768c98a7SAlexander V. Chernikov 70768c98a7SAlexander V. Chernikov lo_dst=$(vnet_mkloopback) 71768c98a7SAlexander V. Chernikov epair0=$(vnet_mkepair) 72768c98a7SAlexander V. Chernikov epair1=$(vnet_mkepair) 73768c98a7SAlexander V. Chernikov 74768c98a7SAlexander V. Chernikov setup_networking ${jname} ${lo_dst} ${epair0} ${epair1} 75768c98a7SAlexander V. Chernikov 76768c98a7SAlexander V. Chernikov jexec ${jname}b ifconfig ${lo_dst} inet 198.51.100.0/32 77768c98a7SAlexander V. Chernikov jexec ${jname}b ifconfig ${lo_dst} alias 198.51.100.2/32 78768c98a7SAlexander V. Chernikov 79768c98a7SAlexander V. Chernikov # Add routes 80768c98a7SAlexander V. Chernikov # A -> towards B via epair0a 81768c98a7SAlexander V. Chernikov jexec ${jname}a route add -4 -net 198.51.100.0/30 203.0.113.2 82768c98a7SAlexander V. Chernikov # A -> towards B via epair1a 83768c98a7SAlexander V. Chernikov jexec ${jname}a route add -4 -net 198.51.100.0/31 203.0.113.6 84768c98a7SAlexander V. Chernikov 85768c98a7SAlexander V. Chernikov count=20 86768c98a7SAlexander V. Chernikov valid_message="${count} packets transmitted, ${count} packets received" 87768c98a7SAlexander V. Chernikov 88768c98a7SAlexander V. Chernikov # Check that 198.51.100.0 goes via epair1 89768c98a7SAlexander V. Chernikov atf_check -o match:"${valid_message}" jexec ${jname}a ping -f -nc${count} 198.51.100.0 90768c98a7SAlexander V. Chernikov pkt_0=`jexec ${jname}a netstat -Wf link -I ${epair0}a | head | awk '$1!~/^Name/{print$8}'` 91768c98a7SAlexander V. Chernikov pkt_1=`jexec ${jname}a netstat -Wf link -I ${epair1}a | head | awk '$1!~/^Name/{print$8}'` 92768c98a7SAlexander V. Chernikov if [ ${pkt_1} -le ${count} ]; then 93768c98a7SAlexander V. Chernikov echo "LPM failure: 1: ${pkt_0} 2: ${pkt_1} (should be ${count})" 94768c98a7SAlexander V. Chernikov exit 1 95768c98a7SAlexander V. Chernikov fi 96768c98a7SAlexander V. Chernikov 97768c98a7SAlexander V. Chernikov # Check that 198.51.100.2 goes via epair0 98768c98a7SAlexander V. Chernikov atf_check -o match:"${valid_message}" jexec ${jname}a ping -f -nc${count} 198.51.100.2 99768c98a7SAlexander V. Chernikov pkt_0=`jexec ${jname}a netstat -Wf link -I ${epair0}a | head | awk '$1!~/^Name/{print$8}'` 100768c98a7SAlexander V. Chernikov pkt_1=`jexec ${jname}a netstat -Wf link -I ${epair1}a | head | awk '$1!~/^Name/{print$8}'` 101768c98a7SAlexander V. Chernikov if [ ${pkt_0} -le ${count} ]; then 102768c98a7SAlexander V. Chernikov echo "LPM failure: 1: ${pkt_0} (should be ${count}) 2: ${pkt_1}" 103768c98a7SAlexander V. Chernikov exit 1 104768c98a7SAlexander V. Chernikov fi 105768c98a7SAlexander V. Chernikov 106768c98a7SAlexander V. Chernikov echo "RAW BALANCING: 1: ${pkt_0} 2: ${pkt_1}" 107768c98a7SAlexander V. Chernikov} 108768c98a7SAlexander V. Chernikov 109768c98a7SAlexander V. Chernikovlpm_test1_success_cleanup() 110768c98a7SAlexander V. Chernikov{ 111768c98a7SAlexander V. Chernikov vnet_cleanup 112768c98a7SAlexander V. Chernikov} 113768c98a7SAlexander V. Chernikov 114768c98a7SAlexander V. Chernikovatf_test_case "lpm_test2_success" "cleanup" 115768c98a7SAlexander V. Chernikovlpm_test2_success_head() 116768c98a7SAlexander V. Chernikov{ 117768c98a7SAlexander V. Chernikov 118768c98a7SAlexander V. Chernikov atf_set descr 'Test IPv4 LPM for the host routes' 119768c98a7SAlexander V. Chernikov atf_set require.user root 120768c98a7SAlexander V. Chernikov} 121768c98a7SAlexander V. Chernikov 122768c98a7SAlexander V. Chernikovlpm_test2_success_body() 123768c98a7SAlexander V. Chernikov{ 124768c98a7SAlexander V. Chernikov 125768c98a7SAlexander V. Chernikov vnet_init 126768c98a7SAlexander V. Chernikov 127768c98a7SAlexander V. Chernikov jname="v4t-lpm_test2_success" 128768c98a7SAlexander V. Chernikov 129768c98a7SAlexander V. Chernikov lo_dst=$(vnet_mkloopback) 130768c98a7SAlexander V. Chernikov epair0=$(vnet_mkepair) 131768c98a7SAlexander V. Chernikov epair1=$(vnet_mkepair) 132768c98a7SAlexander V. Chernikov 133768c98a7SAlexander V. Chernikov setup_networking ${jname} ${lo_dst} ${epair0} ${epair1} 134768c98a7SAlexander V. Chernikov 135768c98a7SAlexander V. Chernikov jexec ${jname}b ifconfig ${lo_dst} inet 198.51.100.0/32 136768c98a7SAlexander V. Chernikov jexec ${jname}b ifconfig ${lo_dst} alias 198.51.100.1/32 137768c98a7SAlexander V. Chernikov 138768c98a7SAlexander V. Chernikov # Add routes 139768c98a7SAlexander V. Chernikov # A -> towards B via epair0a 140768c98a7SAlexander V. Chernikov jexec ${jname}a route add -4 -host 198.51.100.0 203.0.113.2 141768c98a7SAlexander V. Chernikov # A -> towards B via epair1a 142768c98a7SAlexander V. Chernikov jexec ${jname}a route add -4 -host 198.51.100.1 203.0.113.6 143768c98a7SAlexander V. Chernikov 144768c98a7SAlexander V. Chernikov count=20 145768c98a7SAlexander V. Chernikov valid_message="${count} packets transmitted, ${count} packets received" 146768c98a7SAlexander V. Chernikov 147768c98a7SAlexander V. Chernikov # Check that 198.51.100.0 goes via epair0 148768c98a7SAlexander V. Chernikov atf_check -o match:"${valid_message}" jexec ${jname}a ping -f -nc${count} 198.51.100.0 149768c98a7SAlexander V. Chernikov pkt_0=`jexec ${jname}a netstat -Wf link -I ${epair0}a | head | awk '$1!~/^Name/{print$8}'` 150768c98a7SAlexander V. Chernikov pkt_1=`jexec ${jname}a netstat -Wf link -I ${epair1}a | head | awk '$1!~/^Name/{print$8}'` 151768c98a7SAlexander V. Chernikov if [ ${pkt_0} -le ${count} ]; then 152768c98a7SAlexander V. Chernikov echo "LPM failure: 1: ${pkt_0} (should be ${count}) 2: ${pkt_1}" 153768c98a7SAlexander V. Chernikov exit 1 154768c98a7SAlexander V. Chernikov fi 155768c98a7SAlexander V. Chernikov 156768c98a7SAlexander V. Chernikov # Check that 198.51.100.1 goes via epair1 157768c98a7SAlexander V. Chernikov atf_check -o match:"${valid_message}" jexec ${jname}a ping -f -nc${count} 198.51.100.1 158768c98a7SAlexander V. Chernikov pkt_0=`jexec ${jname}a netstat -Wf link -I ${epair0}a | head | awk '$1!~/^Name/{print$8}'` 159768c98a7SAlexander V. Chernikov pkt_1=`jexec ${jname}a netstat -Wf link -I ${epair1}a | head | awk '$1!~/^Name/{print$8}'` 160768c98a7SAlexander V. Chernikov if [ ${pkt_1} -le ${count} ]; then 161768c98a7SAlexander V. Chernikov echo "LPM failure: 1: ${pkt_0} 2: ${pkt_1} (should be ${count})" 162768c98a7SAlexander V. Chernikov exit 1 163768c98a7SAlexander V. Chernikov fi 164768c98a7SAlexander V. Chernikov 165768c98a7SAlexander V. Chernikov echo "RAW BALANCING: 1: ${pkt_0} 2: ${pkt_1}" 166768c98a7SAlexander V. Chernikov} 167768c98a7SAlexander V. Chernikov 168768c98a7SAlexander V. Chernikovlpm_test2_success_cleanup() 169768c98a7SAlexander V. Chernikov{ 170768c98a7SAlexander V. Chernikov vnet_cleanup 171768c98a7SAlexander V. Chernikov} 172768c98a7SAlexander V. Chernikov 173768c98a7SAlexander V. Chernikovatf_init_test_cases() 174768c98a7SAlexander V. Chernikov{ 175768c98a7SAlexander V. Chernikov atf_add_test_case "lpm_test1_success" 176768c98a7SAlexander V. Chernikov atf_add_test_case "lpm_test2_success" 177768c98a7SAlexander V. Chernikov} 178768c98a7SAlexander V. Chernikov 179