Home | History | Annotate | Line # | Download | only in altq
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