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