Home | History | Annotate | Line # | Download | only in altq
      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 
     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 start_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 
     66 start_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 
    101 shutdown_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 
    115 check_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 
    126 test_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 
    181 start_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 
    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 start_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 
    353 test_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 
    419 add_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 
    446 atf_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