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