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