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