xref: /netbsd-src/tests/net/altq/t_cbq.sh (revision 6cecaa578a7c9c53a7320b5b1cc30d70ea4ed5ba)
1#	$NetBSD: t_cbq.sh,v 1.3 2021/07/16 02:33:32 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
28SOCK_LOCAL=unix://altq_local
29SOCK_REMOTE=unix://altq_remote
30BUS=bus_altq
31TIMEOUT=3
32
33# rumphijack can't handle AF_LOCAL socket (/var/run/altq_quip) correctly,
34# so use the socket via the host.
35HIJACKING_ALTQ="$HIJACKING,blanket=/dev/altq/altq:/dev/altq/cbq:/etc/altq.conf:/var/run/altqd.pid"
36
37DEBUG=${DEBUG:-false}
38
39IP_LOCAL1=10.0.0.1
40IP_LOCAL2=10.0.1.1
41IP_REMOTE11=10.0.0.2
42IP_REMOTE12=10.0.0.22
43IP_REMOTE13=10.0.0.23
44IP_REMOTE21=10.0.1.2
45IP_REMOTE22=10.0.1.22
46ALTQD_PIDFILE=./pid
47
48start_altqd()
49{
50
51	$HIJACKING_ALTQ altqd
52
53	sleep 0.1
54	if $HIJACKING_ALTQ test ! -f /var/run/altqd.pid; then
55		sleep 1
56	fi
57
58	$HIJACKING_ALTQ test -f /var/run/altqd.pid
59	if [ $? != 0 ]; then
60		atf_fail "starting altqd failed"
61	fi
62
63	$HIJACKING_ALTQ cat /var/run/altqd.pid > $ALTQD_PIDFILE
64}
65
66start_altqd_basic()
67{
68
69	export RUMP_SERVER=$SOCK_LOCAL
70
71	$HIJACKING_ALTQ mkdir -p /rump/etc
72	$HIJACKING_ALTQ mkdir -p /rump/var/run
73
74	cat > ./altq.conf <<-EOF
75	interface shmif0 cbq
76	class cbq shmif0 root_class NULL pbandwidth 100
77	class cbq shmif0 normal_class root_class pbandwidth 50 default
78	    filter shmif0 normal_class $IP_REMOTE11 0 0 0 0
79	class cbq shmif0 drop_class root_class pbandwidth 0
80	    filter shmif0 drop_class $IP_REMOTE12 0 0 0 0
81	EOF
82	$DEBUG && cat ./altq.conf
83	atf_check -s exit:0 $HIJACKING_ALTQ cp ./altq.conf /rump/etc/altq.conf
84	atf_check -s exit:0 $HIJACKING_ALTQ test -f /rump/etc/altq.conf
85
86	start_altqd
87
88	$DEBUG && $HIJACKING_ALTQ altqstat -s
89	$HIJACKING_ALTQ altqstat -c 1 >./out
90	$DEBUG && cat ./out
91	atf_check -s exit:0 \
92	    -o match:"altqstat: cbq on interface shmif0" \
93	    -o match:'Class 1 on Interface shmif0: root_class' \
94	    -o match:'Class 2 on Interface shmif0: normal_class' \
95	    -o match:'Class 3 on Interface shmif0: ctl_class' \
96	    -o match:'Class 4 on Interface shmif0: drop_class' \
97	    cat ./out
98	rm -f ./out
99}
100
101shutdown_altqd()
102{
103	local pid="$(cat $ALTQD_PIDFILE)"
104
105	if [ -n "$pid" ]; then
106		pgrep -x altqd | grep -q $pid
107		if [ $? = 0 ]; then
108			kill $(cat $ALTQD_PIDFILE)
109			sleep 1
110		fi
111		$DEBUG && pgrep -x altqd
112	fi
113}
114
115check_counter()
116{
117	local file=$1
118	local name=$2
119	local match="$3"
120
121	grep -A 8 ${name}_class $file > $file.$name
122	atf_check -s exit:0 -o match:"$match" cat $file.$name
123	rm -f $file.$name
124}
125
126test_altq_cbq_basic_ipv4()
127{
128	local ifconfig="atf_check -s exit:0 rump.ifconfig"
129	local ping="atf_check -s exit:0 -o ignore rump.ping"
130	local opts="-q -c 1 -w 1"
131
132	rump_server_fs_start $SOCK_LOCAL local altq
133	rump_server_start $SOCK_REMOTE
134
135	rump_server_add_iface $SOCK_LOCAL shmif0 $BUS
136	rump_server_add_iface $SOCK_REMOTE shmif0 $BUS
137
138	export RUMP_SERVER=$SOCK_LOCAL
139	$ifconfig shmif0 inet $IP_LOCAL1/24
140	export RUMP_SERVER=$SOCK_REMOTE
141	$ifconfig shmif0 inet $IP_REMOTE11/24
142	$ifconfig shmif0 inet $IP_REMOTE12/24 alias
143	$ifconfig -w 10
144
145	export RUMP_SERVER=$SOCK_LOCAL
146	# Invoke ARP
147	$ping $opts $IP_REMOTE11
148	$ping $opts $IP_REMOTE12
149
150	start_altqd_basic
151
152	export RUMP_SERVER=$SOCK_LOCAL
153	$ping $opts $IP_REMOTE11
154
155	$HIJACKING_ALTQ altqstat -c 1 >./out
156	$DEBUG && cat ./out
157
158	check_counter ./out normal 'pkts: 1'
159	check_counter ./out root   'pkts: 1'
160	check_counter ./out drop   'pkts: 0'
161
162	export RUMP_SERVER=$SOCK_LOCAL
163	atf_check -s not-exit:0 -o ignore -e match:"No buffer space available" \
164	    rump.ping $opts $IP_REMOTE12
165
166	$HIJACKING_ALTQ altqstat -c 1 >./out
167	$DEBUG && cat ./out
168
169	check_counter ./out drop   'drops: 1'
170	check_counter ./out drop   'pkts: 0'
171	check_counter ./out normal 'pkts: 1'
172	check_counter ./out root   'pkts: 1'
173
174	rm -f ./out
175
176	shutdown_altqd
177
178	rump_server_destroy_ifaces
179}
180
181start_altqd_multi_ifaces()
182{
183
184	export RUMP_SERVER=$SOCK_LOCAL
185
186	$HIJACKING_ALTQ mkdir -p /rump/etc
187	$HIJACKING_ALTQ mkdir -p /rump/var/run
188
189	cat > ./altq.conf <<-EOF
190	interface shmif0 cbq
191	class cbq shmif0 root_class NULL pbandwidth 100
192	class cbq shmif0 normal_class root_class pbandwidth 50 default
193	    filter shmif0 normal_class $IP_REMOTE11 0 0 0 0
194	class cbq shmif0 drop_class root_class pbandwidth 0
195	    filter shmif0 drop_class $IP_REMOTE12 0 0 0 0
196	interface shmif1 cbq
197	class cbq shmif1 root_class NULL pbandwidth 100
198	class cbq shmif1 normal_class root_class pbandwidth 50 default
199	    filter shmif1 normal_class $IP_REMOTE21 0 0 0 0
200	class cbq shmif1 drop_class root_class pbandwidth 0
201	    filter shmif1 drop_class $IP_REMOTE22 0 0 0 0
202	EOF
203	$DEBUG && cat ./altq.conf
204	atf_check -s exit:0 $HIJACKING_ALTQ cp ./altq.conf /rump/etc/altq.conf
205	$HIJACKING_ALTQ test -f /rump/etc/altq.conf
206
207	start_altqd
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
234test_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
315start_altqd_options()
316{
317
318	export RUMP_SERVER=$SOCK_LOCAL
319
320	$HIJACKING_ALTQ mkdir -p /rump/etc
321	$HIJACKING_ALTQ mkdir -p /rump/var/run
322
323	# - no-tbr and no-control are specified
324	# - root_class is the default class
325	cat > ./altq.conf <<-EOF
326	interface shmif0 cbq no-tbr no-control
327	class cbq shmif0 root_class NULL pbandwidth 100 default
328	class cbq shmif0 normal_class root_class pbandwidth 50
329	    filter shmif0 normal_class $IP_REMOTE11 0 0 0 0
330	class cbq shmif0 drop_class root_class pbandwidth 0
331	    filter shmif0 drop_class $IP_REMOTE12 0 0 0 0
332	EOF
333	$DEBUG && cat ./altq.conf
334	atf_check -s exit:0 $HIJACKING_ALTQ cp ./altq.conf /rump/etc/altq.conf
335	$HIJACKING_ALTQ test -f /rump/etc/altq.conf
336
337	start_altqd
338
339	$DEBUG && $HIJACKING_ALTQ altqstat -s
340	$HIJACKING_ALTQ altqstat -c 1 >./out
341	$DEBUG && cat ./out
342	atf_check -s exit:0 \
343	    -o match:"altqstat: cbq on interface shmif0" \
344	    -o match:'Class 1 on Interface shmif0: root_class' \
345	    -o match:'Class 2 on Interface shmif0: normal_class' \
346	    -o match:'Class 3 on Interface shmif0: drop_class' \
347	    cat ./out
348	atf_check -s exit:0 -o not-match:'shmif0: ctl_class' cat ./out
349
350	rm -f ./out
351}
352
353test_altq_cbq_options_ipv4()
354{
355	local ifconfig="atf_check -s exit:0 rump.ifconfig"
356	local ping="atf_check -s exit:0 -o ignore rump.ping"
357	local opts="-q -c 1 -w 1"
358
359	rump_server_fs_start $SOCK_LOCAL local altq
360	rump_server_start $SOCK_REMOTE
361
362	rump_server_add_iface $SOCK_LOCAL shmif0 $BUS
363	rump_server_add_iface $SOCK_REMOTE shmif0 $BUS
364
365	export RUMP_SERVER=$SOCK_LOCAL
366	$ifconfig shmif0 inet $IP_LOCAL1/24
367	export RUMP_SERVER=$SOCK_REMOTE
368	$ifconfig shmif0 inet $IP_REMOTE11/24
369	$ifconfig shmif0 inet $IP_REMOTE12/24 alias
370	$ifconfig shmif0 inet $IP_REMOTE13/24 alias
371	$ifconfig -w 10
372
373	export RUMP_SERVER=$SOCK_LOCAL
374	# Invoke ARP
375	$ping $opts $IP_REMOTE11
376	$ping $opts $IP_REMOTE12
377	$ping $opts $IP_REMOTE13
378
379	start_altqd_options
380
381	export RUMP_SERVER=$SOCK_LOCAL
382	$ping $opts $IP_REMOTE11
383
384	$HIJACKING_ALTQ altqstat -c 1 >./out
385	$DEBUG && cat ./out
386
387	check_counter ./out normal 'pkts: 1'
388	check_counter ./out root   'pkts: 1'
389	check_counter ./out drop   'pkts: 0'
390
391	atf_check -s not-exit:0 -o ignore -e match:"No buffer space available" \
392	    rump.ping $opts $IP_REMOTE12
393
394	$HIJACKING_ALTQ altqstat -c 1 >./out
395	$DEBUG && cat ./out
396
397	check_counter ./out drop   'drops: 1'
398	check_counter ./out drop   'pkts: 0'
399	check_counter ./out normal 'pkts: 1'
400	check_counter ./out root   'pkts: 1'
401
402	# The packet goes to the default class
403	$ping $opts $IP_REMOTE13
404
405	$HIJACKING_ALTQ altqstat -c 1 >./out
406	$DEBUG && cat ./out
407
408	check_counter ./out drop   'pkts: 0'
409	check_counter ./out normal 'pkts: 1'
410	check_counter ./out root   'pkts: 2'
411
412	rm -f ./out
413
414	shutdown_altqd
415
416	rump_server_destroy_ifaces
417}
418
419add_test_case()
420{
421	local algo=$1
422	local type=$2
423	local ipproto=$3
424
425	name="altq_${algo}_${type}_${ipproto}"
426	desc="Tests for ALTQ $algo (${type}) on ${ipproto}"
427
428	atf_test_case ${name} cleanup
429	eval "
430	    ${name}_head() {
431	        atf_set descr \"$desc\"
432	        atf_set require.progs rump_server altqd altqstat
433	    }
434	    ${name}_body() {
435	        test_altq_${algo}_${type}_${ipproto}
436	    }
437	    ${name}_cleanup() {
438	        shutdown_altqd
439	        \$DEBUG && dump
440	        cleanup
441	    }
442	"
443	atf_add_test_case ${name}
444}
445
446atf_init_test_cases()
447{
448
449	add_test_case cbq basic        ipv4
450	add_test_case cbq multi_ifaces ipv4
451	add_test_case cbq options      ipv4
452}
453