Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/tests/sys/netinet/lpm.sh
39483 views
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
32
setup_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
40
# Setup transit IPv4 networks
41
jexec ${jname}a ifconfig ${epair0}a up
42
jexec ${jname}a ifconfig ${epair0}a inet 203.0.113.1/30
43
jexec ${jname}a ifconfig ${epair1}a up
44
jexec ${jname}a ifconfig ${epair1}a inet 203.0.113.5/30
45
46
vnet_mkjail ${jname}b ${epair0}b ${epair1}b ${lo_dst}
47
jexec ${jname}b ifconfig ${epair0}b up
48
jexec ${jname}b ifconfig ${epair0}b inet 203.0.113.2/30
49
jexec ${jname}b ifconfig ${epair1}b up
50
jexec ${jname}b ifconfig ${epair1}b inet 203.0.113.6/30
51
jexec ${jname}b ifconfig ${lo_dst} up
52
53
}
54
55
atf_test_case "lpm_test1_success" "cleanup"
56
lpm_test1_success_head()
57
{
58
59
atf_set descr 'Test IPv4 LPM for /30 and /31'
60
atf_set require.user root
61
}
62
63
lpm_test1_success_body()
64
{
65
66
vnet_init
67
68
jname="v4t-lpm_test1_success"
69
70
lo_dst=$(vnet_mkloopback)
71
epair0=$(vnet_mkepair)
72
epair1=$(vnet_mkepair)
73
74
setup_networking ${jname} ${lo_dst} ${epair0} ${epair1}
75
76
jexec ${jname}b ifconfig ${lo_dst} inet 198.51.100.0/32
77
jexec ${jname}b ifconfig ${lo_dst} alias 198.51.100.2/32
78
79
# Add routes
80
# A -> towards B via epair0a
81
jexec ${jname}a route add -4 -net 198.51.100.0/30 203.0.113.2
82
# A -> towards B via epair1a
83
jexec ${jname}a route add -4 -net 198.51.100.0/31 203.0.113.6
84
85
count=20
86
valid_message="${count} packets transmitted, ${count} packets received"
87
88
# Check that 198.51.100.0 goes via epair1
89
atf_check -o match:"${valid_message}" jexec ${jname}a ping -f -nc${count} 198.51.100.0
90
pkt_0=`jexec ${jname}a netstat -Wf link -I ${epair0}a | head | awk '$1!~/^Name/{print$8}'`
91
pkt_1=`jexec ${jname}a netstat -Wf link -I ${epair1}a | head | awk '$1!~/^Name/{print$8}'`
92
if [ ${pkt_1} -le ${count} ]; then
93
echo "LPM failure: 1: ${pkt_0} 2: ${pkt_1} (should be ${count})"
94
exit 1
95
fi
96
97
# Check that 198.51.100.2 goes via epair0
98
atf_check -o match:"${valid_message}" jexec ${jname}a ping -f -nc${count} 198.51.100.2
99
pkt_0=`jexec ${jname}a netstat -Wf link -I ${epair0}a | head | awk '$1!~/^Name/{print$8}'`
100
pkt_1=`jexec ${jname}a netstat -Wf link -I ${epair1}a | head | awk '$1!~/^Name/{print$8}'`
101
if [ ${pkt_0} -le ${count} ]; then
102
echo "LPM failure: 1: ${pkt_0} (should be ${count}) 2: ${pkt_1}"
103
exit 1
104
fi
105
106
echo "RAW BALANCING: 1: ${pkt_0} 2: ${pkt_1}"
107
}
108
109
lpm_test1_success_cleanup()
110
{
111
vnet_cleanup
112
}
113
114
atf_test_case "lpm_test2_success" "cleanup"
115
lpm_test2_success_head()
116
{
117
118
atf_set descr 'Test IPv4 LPM for the host routes'
119
atf_set require.user root
120
}
121
122
lpm_test2_success_body()
123
{
124
125
vnet_init
126
127
jname="v4t-lpm_test2_success"
128
129
lo_dst=$(vnet_mkloopback)
130
epair0=$(vnet_mkepair)
131
epair1=$(vnet_mkepair)
132
133
setup_networking ${jname} ${lo_dst} ${epair0} ${epair1}
134
135
jexec ${jname}b ifconfig ${lo_dst} inet 198.51.100.0/32
136
jexec ${jname}b ifconfig ${lo_dst} alias 198.51.100.1/32
137
138
# Add routes
139
# A -> towards B via epair0a
140
jexec ${jname}a route add -4 -host 198.51.100.0 203.0.113.2
141
# A -> towards B via epair1a
142
jexec ${jname}a route add -4 -host 198.51.100.1 203.0.113.6
143
144
count=20
145
valid_message="${count} packets transmitted, ${count} packets received"
146
147
# Check that 198.51.100.0 goes via epair0
148
atf_check -o match:"${valid_message}" jexec ${jname}a ping -f -nc${count} 198.51.100.0
149
pkt_0=`jexec ${jname}a netstat -Wf link -I ${epair0}a | head | awk '$1!~/^Name/{print$8}'`
150
pkt_1=`jexec ${jname}a netstat -Wf link -I ${epair1}a | head | awk '$1!~/^Name/{print$8}'`
151
if [ ${pkt_0} -le ${count} ]; then
152
echo "LPM failure: 1: ${pkt_0} (should be ${count}) 2: ${pkt_1}"
153
exit 1
154
fi
155
156
# Check that 198.51.100.1 goes via epair1
157
atf_check -o match:"${valid_message}" jexec ${jname}a ping -f -nc${count} 198.51.100.1
158
pkt_0=`jexec ${jname}a netstat -Wf link -I ${epair0}a | head | awk '$1!~/^Name/{print$8}'`
159
pkt_1=`jexec ${jname}a netstat -Wf link -I ${epair1}a | head | awk '$1!~/^Name/{print$8}'`
160
if [ ${pkt_1} -le ${count} ]; then
161
echo "LPM failure: 1: ${pkt_0} 2: ${pkt_1} (should be ${count})"
162
exit 1
163
fi
164
165
echo "RAW BALANCING: 1: ${pkt_0} 2: ${pkt_1}"
166
}
167
168
lpm_test2_success_cleanup()
169
{
170
vnet_cleanup
171
}
172
173
atf_init_test_cases()
174
{
175
atf_add_test_case "lpm_test1_success"
176
atf_add_test_case "lpm_test2_success"
177
}
178
179
180