3 # SPDX-License-Identifier: BSD-2-Clause
5 # Copyright (c) 2020 Alexander V. Chernikov
7 # Redistribution and use in source and binary forms, with or without
8 # modification, are permitted provided that the following conditions
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.
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
31 . $(atf_get_srcdir)/../common/vnet.subr
40 vnet_mkjail ${jname}a ${epair0}a ${epair1}a
41 # Setup transit IPv4 networks
42 jexec ${jname}a ifconfig ${epair0}a up
43 jexec ${jname}a ifconfig ${epair0}a inet 203.0.113.1/30
44 jexec ${jname}a ifconfig ${epair1}a up
45 jexec ${jname}a ifconfig ${epair1}a inet 203.0.113.5/30
47 vnet_mkjail ${jname}b ${epair0}b ${epair1}b ${lo_dst}
48 jexec ${jname}b ifconfig ${epair0}b up
49 jexec ${jname}b ifconfig ${epair0}b inet 203.0.113.2/30
50 jexec ${jname}b ifconfig ${epair1}b up
51 jexec ${jname}b ifconfig ${epair1}b inet 203.0.113.6/30
52 jexec ${jname}b ifconfig ${lo_dst} up
56 atf_test_case "lpm_test1_success" "cleanup"
57 lpm_test1_success_head()
60 atf_set descr 'Test IPv4 LPM for /30 and /31'
61 atf_set require.user root
64 lpm_test1_success_body()
69 jname="v4t-lpm_test1_success"
71 lo_dst=$(vnet_mkloopback)
72 epair0=$(vnet_mkepair)
73 epair1=$(vnet_mkepair)
75 setup_networking ${jname} ${lo_dst} ${epair0} ${epair1}
77 jexec ${jname}b ifconfig ${lo_dst} inet 198.51.100.0/32
78 jexec ${jname}b ifconfig ${lo_dst} alias 198.51.100.2/32
81 # A -> towards B via epair0a
82 jexec ${jname}a route add -4 -net 198.51.100.0/30 203.0.113.2
83 # A -> towards B via epair1a
84 jexec ${jname}a route add -4 -net 198.51.100.0/31 203.0.113.6
87 valid_message="${count} packets transmitted, ${count} packets received"
89 # Check that 198.51.100.0 goes via epair1
90 atf_check -o match:"${valid_message}" jexec ${jname}a ping -f -nc${count} 198.51.100.0
91 pkt_0=`jexec ${jname}a netstat -Wf link -I ${epair0}a | head | awk '$1!~/^Name/{print$8}'`
92 pkt_1=`jexec ${jname}a netstat -Wf link -I ${epair1}a | head | awk '$1!~/^Name/{print$8}'`
93 if [ ${pkt_1} -le ${count} ]; then
94 echo "LPM failure: 1: ${pkt_0} 2: ${pkt_1} (should be ${count})"
98 # Check that 198.51.100.2 goes via epair0
99 atf_check -o match:"${valid_message}" jexec ${jname}a ping -f -nc${count} 198.51.100.2
100 pkt_0=`jexec ${jname}a netstat -Wf link -I ${epair0}a | head | awk '$1!~/^Name/{print$8}'`
101 pkt_1=`jexec ${jname}a netstat -Wf link -I ${epair1}a | head | awk '$1!~/^Name/{print$8}'`
102 if [ ${pkt_0} -le ${count} ]; then
103 echo "LPM failure: 1: ${pkt_0} (should be ${count}) 2: ${pkt_1}"
107 echo "RAW BALANCING: 1: ${pkt_0} 2: ${pkt_1}"
110 lpm_test1_success_cleanup()
115 atf_test_case "lpm_test2_success" "cleanup"
116 lpm_test2_success_head()
119 atf_set descr 'Test IPv4 LPM for the host routes'
120 atf_set require.user root
123 lpm_test2_success_body()
128 jname="v4t-lpm_test2_success"
130 lo_dst=$(vnet_mkloopback)
131 epair0=$(vnet_mkepair)
132 epair1=$(vnet_mkepair)
134 setup_networking ${jname} ${lo_dst} ${epair0} ${epair1}
136 jexec ${jname}b ifconfig ${lo_dst} inet 198.51.100.0/32
137 jexec ${jname}b ifconfig ${lo_dst} alias 198.51.100.1/32
140 # A -> towards B via epair0a
141 jexec ${jname}a route add -4 -host 198.51.100.0 203.0.113.2
142 # A -> towards B via epair1a
143 jexec ${jname}a route add -4 -host 198.51.100.1 203.0.113.6
146 valid_message="${count} packets transmitted, ${count} packets received"
148 # Check that 198.51.100.0 goes via epair0
149 atf_check -o match:"${valid_message}" jexec ${jname}a ping -f -nc${count} 198.51.100.0
150 pkt_0=`jexec ${jname}a netstat -Wf link -I ${epair0}a | head | awk '$1!~/^Name/{print$8}'`
151 pkt_1=`jexec ${jname}a netstat -Wf link -I ${epair1}a | head | awk '$1!~/^Name/{print$8}'`
152 if [ ${pkt_0} -le ${count} ]; then
153 echo "LPM failure: 1: ${pkt_0} (should be ${count}) 2: ${pkt_1}"
157 # Check that 198.51.100.1 goes via epair1
158 atf_check -o match:"${valid_message}" jexec ${jname}a ping -f -nc${count} 198.51.100.1
159 pkt_0=`jexec ${jname}a netstat -Wf link -I ${epair0}a | head | awk '$1!~/^Name/{print$8}'`
160 pkt_1=`jexec ${jname}a netstat -Wf link -I ${epair1}a | head | awk '$1!~/^Name/{print$8}'`
161 if [ ${pkt_1} -le ${count} ]; then
162 echo "LPM failure: 1: ${pkt_0} 2: ${pkt_1} (should be ${count})"
166 echo "RAW BALANCING: 1: ${pkt_0} 2: ${pkt_1}"
169 lpm_test2_success_cleanup()
174 atf_init_test_cases()
176 atf_add_test_case "lpm_test1_success"
177 atf_add_test_case "lpm_test2_success"