t_cbq.sh revision 1.1 1 # $NetBSD: t_cbq.sh,v 1.1 2021/07/14 03:22:33 ozaki-r Exp $
2 #
3 # Copyright (c) 2021 Internet Initiative Japan Inc.
4 # All rights reserved.
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
8 # are met:
9 # 1. Redistributions of source code must retain the above copyright
10 # notice, this list of conditions and the following disclaimer.
11 # 2. Redistributions in binary form must reproduce the above copyright
12 # notice, this list of conditions and the following disclaimer in the
13 # documentation and/or other materials provided with the distribution.
14 #
15 # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16 # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17 # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 # POSSIBILITY OF SUCH DAMAGE.
26 #
27
28 SOCK_LOCAL=unix://altq_local
29 SOCK_REMOTE=unix://altq_remote
30 BUS=bus_altq
31 TIMEOUT=3
32
33 # rumphijack can't handle AF_LOCAL socket (/var/run/altq_quip) correctly,
34 # so use the socket via the host.
35 HIJACKING_ALTQ="$HIJACKING,blanket=/dev/altq/altq:/dev/altq/cbq:/etc/altq.conf:/var/run/altqd.pid"
36
37 DEBUG=${DEBUG:-false}
38
39 IP_LOCAL1=10.0.0.1
40 IP_LOCAL2=10.0.1.1
41 IP_REMOTE11=10.0.0.2
42 IP_REMOTE12=10.0.0.22
43 IP_REMOTE21=10.0.1.2
44 IP_REMOTE22=10.0.1.22
45 ALTQD_PIDFILE=./pid
46
47
48 start_altqd_basic()
49 {
50
51 export RUMP_SERVER=$SOCK_LOCAL
52
53 $HIJACKING_ALTQ mkdir -p /rump/etc
54 $HIJACKING_ALTQ mkdir -p /rump/var/run
55
56 cat > ./altq.conf <<-EOF
57 interface shmif0 cbq
58 class cbq shmif0 root_class NULL pbandwidth 100
59 class cbq shmif0 normal_class root_class pbandwidth 50 default
60 filter shmif0 normal_class $IP_REMOTE11 0 0 0 0
61 class cbq shmif0 drop_class root_class pbandwidth 0
62 filter shmif0 drop_class $IP_REMOTE12 0 0 0 0
63 EOF
64 $DEBUG && cat ./altq.conf
65 atf_check -s exit:0 $HIJACKING_ALTQ cp ./altq.conf /rump/etc/altq.conf
66 $HIJACKING_ALTQ test -f /rump/etc/altq.conf
67
68 #atf_check -s exit:0 $HIJACKING_ALTQ altqd
69 $HIJACKING_ALTQ altqd
70
71 $HIJACKING_ALTQ test -f /var/run/altqd.pid
72 if [ $? != 0 ]; then
73 atf_check -s exit:0 $HIJACKING_ALTQ altqd -d
74 # Should abort
75 fi
76
77 $HIJACKING_ALTQ cat /var/run/altqd.pid > $ALTQD_PIDFILE
78
79 $DEBUG && $HIJACKING_ALTQ altqstat -s
80 $HIJACKING_ALTQ altqstat -c 1 >./out
81 $DEBUG && cat ./out
82 atf_check -s exit:0 \
83 -o match:"altqstat: cbq on interface shmif0" \
84 -o match:'Class 1 on Interface shmif0: root_class' \
85 -o match:'Class 2 on Interface shmif0: normal_class' \
86 -o match:'Class 3 on Interface shmif0: ctl_class' \
87 -o match:'Class 4 on Interface shmif0: drop_class' \
88 cat ./out
89 rm -f ./out
90 }
91
92 shutdown_altqd()
93 {
94 local pid="$(cat $ALTQD_PIDFILE)"
95
96 if [ -n "$pid" ]; then
97 pgrep -x altqd | grep -q $pid
98 if [ $? = 0 ]; then
99 kill $(cat $ALTQD_PIDFILE)
100 sleep 1
101 fi
102 $DEBUG && pgrep -x altqd
103 fi
104 }
105
106 check_counter()
107 {
108 local file=$1
109 local name=$2
110 local match="$3"
111
112 grep -A 8 ${name}_class $file > $file.$name
113 atf_check -s exit:0 -o match:"$match" cat $file.$name
114 rm -f $file.$name
115 }
116
117 test_altq_cbq_basic_ipv4()
118 {
119 local ifconfig="atf_check -s exit:0 rump.ifconfig"
120 local ping="atf_check -s exit:0 -o ignore rump.ping"
121 local opts="-q -c 1 -w 1"
122
123 rump_server_fs_start $SOCK_LOCAL local altq
124 rump_server_start $SOCK_REMOTE
125
126 rump_server_add_iface $SOCK_LOCAL shmif0 $BUS
127 rump_server_add_iface $SOCK_REMOTE shmif0 $BUS
128
129 export RUMP_SERVER=$SOCK_LOCAL
130 $ifconfig shmif0 inet $IP_LOCAL1/24
131 export RUMP_SERVER=$SOCK_REMOTE
132 $ifconfig shmif0 inet $IP_REMOTE11/24
133 $ifconfig shmif0 inet $IP_REMOTE12/24 alias
134 $ifconfig -w 10
135
136 export RUMP_SERVER=$SOCK_LOCAL
137 # Invoke ARP
138 $ping $opts $IP_REMOTE11
139 $ping $opts $IP_REMOTE12
140
141 start_altqd_basic
142
143 export RUMP_SERVER=$SOCK_LOCAL
144 $ping $opts $IP_REMOTE11
145
146 $HIJACKING_ALTQ altqstat -c 1 >./out
147 $DEBUG && cat ./out
148
149 check_counter ./out normal 'pkts: 1'
150 check_counter ./out root 'pkts: 1'
151 check_counter ./out drop 'pkts: 0'
152
153 export RUMP_SERVER=$SOCK_LOCAL
154 atf_check -s not-exit:0 -o ignore -e match:"No buffer space available" \
155 rump.ping $opts $IP_REMOTE12
156
157 $HIJACKING_ALTQ altqstat -c 1 >./out
158 $DEBUG && cat ./out
159
160 check_counter ./out drop 'drops: 1'
161 check_counter ./out drop 'pkts: 0'
162 check_counter ./out normal 'pkts: 1'
163 check_counter ./out root 'pkts: 1'
164
165 rm -f ./out
166
167 shutdown_altqd
168
169 rump_server_destroy_ifaces
170 }
171
172 start_altqd_multi_ifaces()
173 {
174
175 export RUMP_SERVER=$SOCK_LOCAL
176
177 $HIJACKING_ALTQ mkdir -p /rump/etc
178 $HIJACKING_ALTQ mkdir -p /rump/var/run
179
180 cat > ./altq.conf <<-EOF
181 interface shmif0 cbq
182 class cbq shmif0 root_class NULL pbandwidth 100
183 class cbq shmif0 normal_class root_class pbandwidth 50 default
184 filter shmif0 normal_class $IP_REMOTE11 0 0 0 0
185 class cbq shmif0 drop_class root_class pbandwidth 0
186 filter shmif0 drop_class $IP_REMOTE12 0 0 0 0
187 interface shmif1 cbq
188 class cbq shmif1 root_class NULL pbandwidth 100
189 class cbq shmif1 normal_class root_class pbandwidth 50 default
190 filter shmif1 normal_class $IP_REMOTE21 0 0 0 0
191 class cbq shmif1 drop_class root_class pbandwidth 0
192 filter shmif1 drop_class $IP_REMOTE22 0 0 0 0
193 EOF
194 $DEBUG && cat ./altq.conf
195 atf_check -s exit:0 $HIJACKING_ALTQ cp ./altq.conf /rump/etc/altq.conf
196 $HIJACKING_ALTQ test -f /rump/etc/altq.conf
197
198 #atf_check -s exit:0 $HIJACKING_ALTQ altqd
199 $HIJACKING_ALTQ altqd
200
201 $HIJACKING_ALTQ test -f /var/run/altqd.pid
202 if [ $? != 0 ]; then
203 atf_check -s exit:0 $HIJACKING_ALTQ altqd -d
204 # Should abort
205 fi
206
207 $HIJACKING_ALTQ cat /var/run/altqd.pid > $ALTQD_PIDFILE
208
209 $DEBUG && $HIJACKING_ALTQ altqstat -s
210
211 $HIJACKING_ALTQ altqstat -c 1 -i shmif0 >./out
212 $DEBUG && cat ./out
213 atf_check -s exit:0 \
214 -o match:"altqstat: cbq on interface shmif0" \
215 -o match:'Class 1 on Interface shmif0: root_class' \
216 -o match:'Class 2 on Interface shmif0: normal_class' \
217 -o match:'Class 3 on Interface shmif0: ctl_class' \
218 -o match:'Class 4 on Interface shmif0: drop_class' \
219 cat ./out
220
221 $HIJACKING_ALTQ altqstat -c 1 -i shmif1 >./out
222 $DEBUG && cat ./out
223 atf_check -s exit:0 \
224 -o match:"altqstat: cbq on interface shmif1" \
225 -o match:'Class 1 on Interface shmif1: root_class' \
226 -o match:'Class 2 on Interface shmif1: normal_class' \
227 -o match:'Class 3 on Interface shmif1: ctl_class' \
228 -o match:'Class 4 on Interface shmif1: drop_class' \
229 cat ./out
230
231 rm -f ./out
232 }
233
234 test_altq_cbq_multi_ifaces_ipv4()
235 {
236 local ifconfig="atf_check -s exit:0 rump.ifconfig"
237 local ping="atf_check -s exit:0 -o ignore rump.ping"
238 local opts="-q -c 1 -w 1"
239
240 rump_server_fs_start $SOCK_LOCAL local altq
241 rump_server_start $SOCK_REMOTE
242
243 rump_server_add_iface $SOCK_LOCAL shmif0 $BUS
244 rump_server_add_iface $SOCK_LOCAL shmif1 $BUS
245 rump_server_add_iface $SOCK_REMOTE shmif0 $BUS
246
247 export RUMP_SERVER=$SOCK_LOCAL
248 $ifconfig shmif0 inet $IP_LOCAL1/24
249 $ifconfig shmif1 inet $IP_LOCAL2/24
250 export RUMP_SERVER=$SOCK_REMOTE
251 $ifconfig shmif0 inet $IP_REMOTE11/24
252 $ifconfig shmif0 inet $IP_REMOTE12/24 alias
253 $ifconfig shmif0 inet $IP_REMOTE21/24 alias
254 $ifconfig shmif0 inet $IP_REMOTE22/24 alias
255 $ifconfig -w 10
256
257 export RUMP_SERVER=$SOCK_LOCAL
258 # Invoke ARP
259 $ping $opts $IP_REMOTE11
260 $ping $opts $IP_REMOTE12
261 $ping $opts $IP_REMOTE21
262 $ping $opts $IP_REMOTE22
263
264 start_altqd_multi_ifaces
265
266 export RUMP_SERVER=$SOCK_LOCAL
267 $ping $opts $IP_REMOTE11
268
269 $HIJACKING_ALTQ altqstat -c 1 -i shmif0 >./out
270 $DEBUG && cat ./out
271
272 check_counter ./out normal 'pkts: 1'
273 check_counter ./out root 'pkts: 1'
274 check_counter ./out drop 'pkts: 0'
275
276 $ping $opts $IP_REMOTE21
277
278 $HIJACKING_ALTQ altqstat -c 1 -i shmif1 >./out
279 $DEBUG && cat ./out
280
281 check_counter ./out normal 'pkts: 1'
282 check_counter ./out root 'pkts: 1'
283 check_counter ./out drop 'pkts: 0'
284
285 export RUMP_SERVER=$SOCK_LOCAL
286 atf_check -s not-exit:0 -o ignore -e match:"No buffer space available" \
287 rump.ping $opts $IP_REMOTE12
288
289 $HIJACKING_ALTQ altqstat -c 1 -i shmif0 >./out
290 $DEBUG && cat ./out
291
292 check_counter ./out drop 'drops: 1'
293 check_counter ./out drop 'pkts: 0'
294 check_counter ./out normal 'pkts: 1'
295 check_counter ./out root 'pkts: 1'
296
297 atf_check -s not-exit:0 -o ignore -e match:"No buffer space available" \
298 rump.ping $opts $IP_REMOTE22
299
300 $HIJACKING_ALTQ altqstat -c 1 -i shmif1 >./out
301 $DEBUG && cat ./out
302
303 check_counter ./out drop 'drops: 1'
304 check_counter ./out drop 'pkts: 0'
305 check_counter ./out normal 'pkts: 1'
306 check_counter ./out root 'pkts: 1'
307
308 rm -f ./out
309
310 shutdown_altqd
311
312 rump_server_destroy_ifaces
313 }
314
315 add_test_case()
316 {
317 local algo=$1
318 local type=$2
319 local ipproto=$3
320
321 name="altq_${algo}_${type}_${ipproto}"
322 desc="Tests for ALTQ $algo (${type}) on ${ipproto}"
323
324 atf_test_case ${name} cleanup
325 eval "
326 ${name}_head() {
327 atf_set descr \"$desc\"
328 atf_set require.progs rump_server altqd altqstat
329 }
330 ${name}_body() {
331 test_altq_${algo}_${type}_${ipproto}
332 }
333 ${name}_cleanup() {
334 shutdown_altqd
335 \$DEBUG && dump
336 cleanup
337 }
338 "
339 atf_add_test_case ${name}
340 }
341
342 atf_init_test_cases()
343 {
344
345 add_test_case cbq basic ipv4
346 add_test_case cbq multi_ifaces ipv4
347 }
348