t_cbq.sh revision 1.2 1 # $NetBSD: t_cbq.sh,v 1.2 2021/07/14 08:33:47 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_REMOTE13=10.0.0.23
44 IP_REMOTE21=10.0.1.2
45 IP_REMOTE22=10.0.1.22
46 ALTQD_PIDFILE=./pid
47
48
49 start_altqd_basic()
50 {
51
52 export RUMP_SERVER=$SOCK_LOCAL
53
54 $HIJACKING_ALTQ mkdir -p /rump/etc
55 $HIJACKING_ALTQ mkdir -p /rump/var/run
56
57 cat > ./altq.conf <<-EOF
58 interface shmif0 cbq
59 class cbq shmif0 root_class NULL pbandwidth 100
60 class cbq shmif0 normal_class root_class pbandwidth 50 default
61 filter shmif0 normal_class $IP_REMOTE11 0 0 0 0
62 class cbq shmif0 drop_class root_class pbandwidth 0
63 filter shmif0 drop_class $IP_REMOTE12 0 0 0 0
64 EOF
65 $DEBUG && cat ./altq.conf
66 atf_check -s exit:0 $HIJACKING_ALTQ cp ./altq.conf /rump/etc/altq.conf
67 $HIJACKING_ALTQ test -f /rump/etc/altq.conf
68
69 #atf_check -s exit:0 $HIJACKING_ALTQ altqd
70 $HIJACKING_ALTQ altqd
71
72 $HIJACKING_ALTQ test -f /var/run/altqd.pid
73 if [ $? != 0 ]; then
74 atf_check -s exit:0 $HIJACKING_ALTQ altqd -d
75 # Should abort
76 fi
77
78 $HIJACKING_ALTQ cat /var/run/altqd.pid > $ALTQD_PIDFILE
79
80 $DEBUG && $HIJACKING_ALTQ altqstat -s
81 $HIJACKING_ALTQ altqstat -c 1 >./out
82 $DEBUG && cat ./out
83 atf_check -s exit:0 \
84 -o match:"altqstat: cbq on interface shmif0" \
85 -o match:'Class 1 on Interface shmif0: root_class' \
86 -o match:'Class 2 on Interface shmif0: normal_class' \
87 -o match:'Class 3 on Interface shmif0: ctl_class' \
88 -o match:'Class 4 on Interface shmif0: drop_class' \
89 cat ./out
90 rm -f ./out
91 }
92
93 shutdown_altqd()
94 {
95 local pid="$(cat $ALTQD_PIDFILE)"
96
97 if [ -n "$pid" ]; then
98 pgrep -x altqd | grep -q $pid
99 if [ $? = 0 ]; then
100 kill $(cat $ALTQD_PIDFILE)
101 sleep 1
102 fi
103 $DEBUG && pgrep -x altqd
104 fi
105 }
106
107 check_counter()
108 {
109 local file=$1
110 local name=$2
111 local match="$3"
112
113 grep -A 8 ${name}_class $file > $file.$name
114 atf_check -s exit:0 -o match:"$match" cat $file.$name
115 rm -f $file.$name
116 }
117
118 test_altq_cbq_basic_ipv4()
119 {
120 local ifconfig="atf_check -s exit:0 rump.ifconfig"
121 local ping="atf_check -s exit:0 -o ignore rump.ping"
122 local opts="-q -c 1 -w 1"
123
124 rump_server_fs_start $SOCK_LOCAL local altq
125 rump_server_start $SOCK_REMOTE
126
127 rump_server_add_iface $SOCK_LOCAL shmif0 $BUS
128 rump_server_add_iface $SOCK_REMOTE shmif0 $BUS
129
130 export RUMP_SERVER=$SOCK_LOCAL
131 $ifconfig shmif0 inet $IP_LOCAL1/24
132 export RUMP_SERVER=$SOCK_REMOTE
133 $ifconfig shmif0 inet $IP_REMOTE11/24
134 $ifconfig shmif0 inet $IP_REMOTE12/24 alias
135 $ifconfig -w 10
136
137 export RUMP_SERVER=$SOCK_LOCAL
138 # Invoke ARP
139 $ping $opts $IP_REMOTE11
140 $ping $opts $IP_REMOTE12
141
142 start_altqd_basic
143
144 export RUMP_SERVER=$SOCK_LOCAL
145 $ping $opts $IP_REMOTE11
146
147 $HIJACKING_ALTQ altqstat -c 1 >./out
148 $DEBUG && cat ./out
149
150 check_counter ./out normal 'pkts: 1'
151 check_counter ./out root 'pkts: 1'
152 check_counter ./out drop 'pkts: 0'
153
154 export RUMP_SERVER=$SOCK_LOCAL
155 atf_check -s not-exit:0 -o ignore -e match:"No buffer space available" \
156 rump.ping $opts $IP_REMOTE12
157
158 $HIJACKING_ALTQ altqstat -c 1 >./out
159 $DEBUG && cat ./out
160
161 check_counter ./out drop 'drops: 1'
162 check_counter ./out drop 'pkts: 0'
163 check_counter ./out normal 'pkts: 1'
164 check_counter ./out root 'pkts: 1'
165
166 rm -f ./out
167
168 shutdown_altqd
169
170 rump_server_destroy_ifaces
171 }
172
173 start_altqd_multi_ifaces()
174 {
175
176 export RUMP_SERVER=$SOCK_LOCAL
177
178 $HIJACKING_ALTQ mkdir -p /rump/etc
179 $HIJACKING_ALTQ mkdir -p /rump/var/run
180
181 cat > ./altq.conf <<-EOF
182 interface shmif0 cbq
183 class cbq shmif0 root_class NULL pbandwidth 100
184 class cbq shmif0 normal_class root_class pbandwidth 50 default
185 filter shmif0 normal_class $IP_REMOTE11 0 0 0 0
186 class cbq shmif0 drop_class root_class pbandwidth 0
187 filter shmif0 drop_class $IP_REMOTE12 0 0 0 0
188 interface shmif1 cbq
189 class cbq shmif1 root_class NULL pbandwidth 100
190 class cbq shmif1 normal_class root_class pbandwidth 50 default
191 filter shmif1 normal_class $IP_REMOTE21 0 0 0 0
192 class cbq shmif1 drop_class root_class pbandwidth 0
193 filter shmif1 drop_class $IP_REMOTE22 0 0 0 0
194 EOF
195 $DEBUG && cat ./altq.conf
196 atf_check -s exit:0 $HIJACKING_ALTQ cp ./altq.conf /rump/etc/altq.conf
197 $HIJACKING_ALTQ test -f /rump/etc/altq.conf
198
199 #atf_check -s exit:0 $HIJACKING_ALTQ altqd
200 $HIJACKING_ALTQ altqd
201
202 $HIJACKING_ALTQ test -f /var/run/altqd.pid
203 if [ $? != 0 ]; then
204 atf_check -s exit:0 $HIJACKING_ALTQ altqd -d
205 # Should abort
206 fi
207
208 $HIJACKING_ALTQ cat /var/run/altqd.pid > $ALTQD_PIDFILE
209
210 $DEBUG && $HIJACKING_ALTQ altqstat -s
211
212 $HIJACKING_ALTQ altqstat -c 1 -i shmif0 >./out
213 $DEBUG && cat ./out
214 atf_check -s exit:0 \
215 -o match:"altqstat: cbq on interface shmif0" \
216 -o match:'Class 1 on Interface shmif0: root_class' \
217 -o match:'Class 2 on Interface shmif0: normal_class' \
218 -o match:'Class 3 on Interface shmif0: ctl_class' \
219 -o match:'Class 4 on Interface shmif0: drop_class' \
220 cat ./out
221
222 $HIJACKING_ALTQ altqstat -c 1 -i shmif1 >./out
223 $DEBUG && cat ./out
224 atf_check -s exit:0 \
225 -o match:"altqstat: cbq on interface shmif1" \
226 -o match:'Class 1 on Interface shmif1: root_class' \
227 -o match:'Class 2 on Interface shmif1: normal_class' \
228 -o match:'Class 3 on Interface shmif1: ctl_class' \
229 -o match:'Class 4 on Interface shmif1: drop_class' \
230 cat ./out
231
232 rm -f ./out
233 }
234
235 test_altq_cbq_multi_ifaces_ipv4()
236 {
237 local ifconfig="atf_check -s exit:0 rump.ifconfig"
238 local ping="atf_check -s exit:0 -o ignore rump.ping"
239 local opts="-q -c 1 -w 1"
240
241 rump_server_fs_start $SOCK_LOCAL local altq
242 rump_server_start $SOCK_REMOTE
243
244 rump_server_add_iface $SOCK_LOCAL shmif0 $BUS
245 rump_server_add_iface $SOCK_LOCAL shmif1 $BUS
246 rump_server_add_iface $SOCK_REMOTE shmif0 $BUS
247
248 export RUMP_SERVER=$SOCK_LOCAL
249 $ifconfig shmif0 inet $IP_LOCAL1/24
250 $ifconfig shmif1 inet $IP_LOCAL2/24
251 export RUMP_SERVER=$SOCK_REMOTE
252 $ifconfig shmif0 inet $IP_REMOTE11/24
253 $ifconfig shmif0 inet $IP_REMOTE12/24 alias
254 $ifconfig shmif0 inet $IP_REMOTE21/24 alias
255 $ifconfig shmif0 inet $IP_REMOTE22/24 alias
256 $ifconfig -w 10
257
258 export RUMP_SERVER=$SOCK_LOCAL
259 # Invoke ARP
260 $ping $opts $IP_REMOTE11
261 $ping $opts $IP_REMOTE12
262 $ping $opts $IP_REMOTE21
263 $ping $opts $IP_REMOTE22
264
265 start_altqd_multi_ifaces
266
267 export RUMP_SERVER=$SOCK_LOCAL
268 $ping $opts $IP_REMOTE11
269
270 $HIJACKING_ALTQ altqstat -c 1 -i shmif0 >./out
271 $DEBUG && cat ./out
272
273 check_counter ./out normal 'pkts: 1'
274 check_counter ./out root 'pkts: 1'
275 check_counter ./out drop 'pkts: 0'
276
277 $ping $opts $IP_REMOTE21
278
279 $HIJACKING_ALTQ altqstat -c 1 -i shmif1 >./out
280 $DEBUG && cat ./out
281
282 check_counter ./out normal 'pkts: 1'
283 check_counter ./out root 'pkts: 1'
284 check_counter ./out drop 'pkts: 0'
285
286 export RUMP_SERVER=$SOCK_LOCAL
287 atf_check -s not-exit:0 -o ignore -e match:"No buffer space available" \
288 rump.ping $opts $IP_REMOTE12
289
290 $HIJACKING_ALTQ altqstat -c 1 -i shmif0 >./out
291 $DEBUG && cat ./out
292
293 check_counter ./out drop 'drops: 1'
294 check_counter ./out drop 'pkts: 0'
295 check_counter ./out normal 'pkts: 1'
296 check_counter ./out root 'pkts: 1'
297
298 atf_check -s not-exit:0 -o ignore -e match:"No buffer space available" \
299 rump.ping $opts $IP_REMOTE22
300
301 $HIJACKING_ALTQ altqstat -c 1 -i shmif1 >./out
302 $DEBUG && cat ./out
303
304 check_counter ./out drop 'drops: 1'
305 check_counter ./out drop 'pkts: 0'
306 check_counter ./out normal 'pkts: 1'
307 check_counter ./out root 'pkts: 1'
308
309 rm -f ./out
310
311 shutdown_altqd
312
313 rump_server_destroy_ifaces
314 }
315
316 start_altqd_options()
317 {
318
319 export RUMP_SERVER=$SOCK_LOCAL
320
321 $HIJACKING_ALTQ mkdir -p /rump/etc
322 $HIJACKING_ALTQ mkdir -p /rump/var/run
323
324 # - no-tbr and no-control are specified
325 # - root_class is the default class
326 cat > ./altq.conf <<-EOF
327 interface shmif0 cbq no-tbr no-control
328 class cbq shmif0 root_class NULL pbandwidth 100 default
329 class cbq shmif0 normal_class root_class pbandwidth 50
330 filter shmif0 normal_class $IP_REMOTE11 0 0 0 0
331 class cbq shmif0 drop_class root_class pbandwidth 0
332 filter shmif0 drop_class $IP_REMOTE12 0 0 0 0
333 EOF
334 $DEBUG && cat ./altq.conf
335 atf_check -s exit:0 $HIJACKING_ALTQ cp ./altq.conf /rump/etc/altq.conf
336 $HIJACKING_ALTQ test -f /rump/etc/altq.conf
337
338 $HIJACKING_ALTQ altqd
339
340 $HIJACKING_ALTQ test -f /var/run/altqd.pid
341 if [ $? != 0 ]; then
342 atf_check -s exit:0 $HIJACKING_ALTQ altqd -d
343 # Should abort
344 fi
345
346 $HIJACKING_ALTQ cat /var/run/altqd.pid > $ALTQD_PIDFILE
347
348 $DEBUG && $HIJACKING_ALTQ altqstat -s
349 $HIJACKING_ALTQ altqstat -c 1 >./out
350 $DEBUG && cat ./out
351 atf_check -s exit:0 \
352 -o match:"altqstat: cbq on interface shmif0" \
353 -o match:'Class 1 on Interface shmif0: root_class' \
354 -o match:'Class 2 on Interface shmif0: normal_class' \
355 -o match:'Class 3 on Interface shmif0: drop_class' \
356 cat ./out
357 atf_check -s exit:0 -o not-match:'shmif0: ctl_class' cat ./out
358
359 rm -f ./out
360 }
361
362 test_altq_cbq_options_ipv4()
363 {
364 local ifconfig="atf_check -s exit:0 rump.ifconfig"
365 local ping="atf_check -s exit:0 -o ignore rump.ping"
366 local opts="-q -c 1 -w 1"
367
368 rump_server_fs_start $SOCK_LOCAL local altq
369 rump_server_start $SOCK_REMOTE
370
371 rump_server_add_iface $SOCK_LOCAL shmif0 $BUS
372 rump_server_add_iface $SOCK_REMOTE shmif0 $BUS
373
374 export RUMP_SERVER=$SOCK_LOCAL
375 $ifconfig shmif0 inet $IP_LOCAL1/24
376 export RUMP_SERVER=$SOCK_REMOTE
377 $ifconfig shmif0 inet $IP_REMOTE11/24
378 $ifconfig shmif0 inet $IP_REMOTE12/24 alias
379 $ifconfig shmif0 inet $IP_REMOTE13/24 alias
380 $ifconfig -w 10
381
382 export RUMP_SERVER=$SOCK_LOCAL
383 # Invoke ARP
384 $ping $opts $IP_REMOTE11
385 $ping $opts $IP_REMOTE12
386 $ping $opts $IP_REMOTE13
387
388 start_altqd_options
389
390 export RUMP_SERVER=$SOCK_LOCAL
391 $ping $opts $IP_REMOTE11
392
393 $HIJACKING_ALTQ altqstat -c 1 >./out
394 $DEBUG && cat ./out
395
396 check_counter ./out normal 'pkts: 1'
397 check_counter ./out root 'pkts: 1'
398 check_counter ./out drop 'pkts: 0'
399
400 atf_check -s not-exit:0 -o ignore -e match:"No buffer space available" \
401 rump.ping $opts $IP_REMOTE12
402
403 $HIJACKING_ALTQ altqstat -c 1 >./out
404 $DEBUG && cat ./out
405
406 check_counter ./out drop 'drops: 1'
407 check_counter ./out drop 'pkts: 0'
408 check_counter ./out normal 'pkts: 1'
409 check_counter ./out root 'pkts: 1'
410
411 # The packet goes to the default class
412 $ping $opts $IP_REMOTE13
413
414 $HIJACKING_ALTQ altqstat -c 1 >./out
415 $DEBUG && cat ./out
416
417 check_counter ./out drop 'pkts: 0'
418 check_counter ./out normal 'pkts: 1'
419 check_counter ./out root 'pkts: 2'
420
421 rm -f ./out
422
423 shutdown_altqd
424
425 rump_server_destroy_ifaces
426 }
427
428 add_test_case()
429 {
430 local algo=$1
431 local type=$2
432 local ipproto=$3
433
434 name="altq_${algo}_${type}_${ipproto}"
435 desc="Tests for ALTQ $algo (${type}) on ${ipproto}"
436
437 atf_test_case ${name} cleanup
438 eval "
439 ${name}_head() {
440 atf_set descr \"$desc\"
441 atf_set require.progs rump_server altqd altqstat
442 }
443 ${name}_body() {
444 test_altq_${algo}_${type}_${ipproto}
445 }
446 ${name}_cleanup() {
447 shutdown_altqd
448 \$DEBUG && dump
449 cleanup
450 }
451 "
452 atf_add_test_case ${name}
453 }
454
455 atf_init_test_cases()
456 {
457
458 add_test_case cbq basic ipv4
459 add_test_case cbq multi_ifaces ipv4
460 add_test_case cbq options ipv4
461 }
462