1329874Sasomers# 2329874Sasomers# Copyright (c) 2014 Spectra Logic Corporation 3329874Sasomers# All rights reserved. 4329874Sasomers# 5329874Sasomers# Redistribution and use in source and binary forms, with or without 6329874Sasomers# modification, are permitted provided that the following conditions 7329874Sasomers# are met: 8329874Sasomers# 1. Redistributions of source code must retain the above copyright 9329874Sasomers# notice, this list of conditions, and the following disclaimer, 10329874Sasomers# without modification. 11329874Sasomers# 2. Redistributions in binary form must reproduce at minimum a disclaimer 12329874Sasomers# substantially similar to the "NO WARRANTY" disclaimer below 13329874Sasomers# ("Disclaimer") and any redistribution must be conditioned upon 14329874Sasomers# including a substantially similar Disclaimer requirement for further 15329874Sasomers# binary redistribution. 16329874Sasomers# 17329874Sasomers# NO WARRANTY 18329874Sasomers# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19329874Sasomers# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20329874Sasomers# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 21329874Sasomers# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22329874Sasomers# HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23329874Sasomers# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24329874Sasomers# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25329874Sasomers# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 26329874Sasomers# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 27329874Sasomers# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28329874Sasomers# POSSIBILITY OF SUCH DAMAGES. 29329874Sasomers# 30329874Sasomers# Authors: Alan Somers (Spectra Logic Corporation) 31329874Sasomers# 32329874Sasomers# $FreeBSD: stable/11/tests/sys/net/if_clone_test.sh 350124 2019-07-19 14:22:24Z asomers $ 33329874Sasomers 34329874Sasomers# Outline: 35329874Sasomers# For each cloned interface type, do three tests 36329874Sasomers# 1) Create and destroy it 37329874Sasomers# 2) Create, up, and destroy it 38329874Sasomers# 3) Create, disable IPv6 auto address assignment, up, and destroy it 39329874Sasomers 40329874SasomersTESTLEN=10 # seconds 41329874Sasomers 42350124Sasomersatf_test_case epair_stress cleanup 43350124Sasomersepair_stress_head() 44350124Sasomers{ 45350124Sasomers atf_set "descr" "Simultaneously create and destroy an epair(4)" 46350124Sasomers atf_set "require.user" "root" 47350124Sasomers} 48350124Sasomersepair_stress_body() 49350124Sasomers{ 50350124Sasomers do_stress "epair" 51350124Sasomers} 52350124Sasomersepair_stress_cleanup() 53350124Sasomers{ 54350124Sasomers cleanup_ifaces 55350124Sasomers} 56350124Sasomers 57350124Sasomersatf_test_case epair_up_stress cleanup 58350124Sasomersepair_up_stress_head() 59350124Sasomers{ 60350124Sasomers atf_set "descr" "Simultaneously up and detroy an epair(4)" 61350124Sasomers atf_set "require.user" "root" 62350124Sasomers} 63350124Sasomersepair_up_stress_body() 64350124Sasomers{ 65350124Sasomers do_up_stress "epair" "" "" 66350124Sasomers} 67350124Sasomersepair_up_stress_cleanup() 68350124Sasomers{ 69350124Sasomers cleanup_ifaces 70350124Sasomers} 71350124Sasomers 72350124Sasomersatf_test_case epair_ipv6_up_stress cleanup 73350124Sasomersepair_ipv6_up_stress_head() 74350124Sasomers{ 75350124Sasomers atf_set "descr" "Simultaneously up and destroy an epair(4) with IPv6" 76350124Sasomers atf_set "require.user" "root" 77350124Sasomers} 78350124Sasomersepair_ipv6_up_stress_body() 79350124Sasomers{ 80350124Sasomers atf_skip "Quickly panics: page fault in in6_unlink_ifa (PR 225438)" 81350124Sasomers do_up_stress "epair" "6" "" 82350124Sasomers} 83350124Sasomersepair_ipv6_up_stress_cleanup() 84350124Sasomers{ 85350124Sasomers cleanup_ifaces 86350124Sasomers} 87350124Sasomers 88329874Sasomersatf_test_case faith_stress cleanup 89329874Sasomersfaith_stress_head() 90329874Sasomers{ 91329874Sasomers atf_set "descr" "Simultaneously create and destroy a faith(4)" 92329874Sasomers atf_set "require.user" "root" 93329874Sasomers} 94329874Sasomersfaith_stress_body() 95329874Sasomers{ 96329874Sasomers do_stress "faith" 97329874Sasomers} 98329874Sasomersfaith_stress_cleanup() 99329874Sasomers{ 100329874Sasomers cleanup_ifaces 101329874Sasomers} 102329874Sasomers 103329874Sasomersatf_test_case faith_up_stress cleanup 104329874Sasomersfaith_up_stress_head() 105329874Sasomers{ 106329874Sasomers atf_set "descr" "Simultaneously up and destroy a faith(4)" 107329874Sasomers atf_set "require.user" "root" 108329874Sasomers} 109329874Sasomersfaith_up_stress_body() 110329874Sasomers{ 111329874Sasomers atf_skip "Quickly panics: if_freemulti: protospec not NULL" 112329874Sasomers do_up_stress "faith" "" "" 113329874Sasomers} 114329874Sasomersfaith_up_stress_cleanup() 115329874Sasomers{ 116329874Sasomers cleanup_ifaces 117329874Sasomers} 118329874Sasomers 119329874Sasomersatf_test_case faith_ipv6_up_stress cleanup 120329874Sasomersfaith_ipv6_up_stress_head() 121329874Sasomers{ 122329874Sasomers atf_set "descr" "Simultaneously up and destroy a faith(4) with IPv6" 123329874Sasomers atf_set "require.user" "root" 124329874Sasomers} 125329874Sasomersfaith_ipv6_up_stress_body() 126329874Sasomers{ 127329874Sasomers atf_skip "Quickly panics: if_freemulti: protospec not NULL" 128329874Sasomers do_up_stress "faith" "6" "" 129329874Sasomers} 130329874Sasomersfaith_ipv6_up_stress_cleanup() 131329874Sasomers{ 132329874Sasomers cleanup_ifaces 133329874Sasomers} 134329874Sasomers 135329874Sasomersatf_test_case gif_stress cleanup 136329874Sasomersgif_stress_head() 137329874Sasomers{ 138329874Sasomers atf_set "descr" "Simultaneously create and destroy a gif(4)" 139329874Sasomers atf_set "require.user" "root" 140329874Sasomers} 141329874Sasomersgif_stress_body() 142329874Sasomers{ 143329874Sasomers do_stress "gif" 144329874Sasomers} 145329874Sasomersgif_stress_cleanup() 146329874Sasomers{ 147329874Sasomers cleanup_ifaces 148329874Sasomers} 149329874Sasomers 150329874Sasomersatf_test_case gif_up_stress cleanup 151329874Sasomersgif_up_stress_head() 152329874Sasomers{ 153329874Sasomers atf_set "descr" "Simultaneously up and destroy a gif(4)" 154329874Sasomers atf_set "require.user" "root" 155329874Sasomers} 156329874Sasomersgif_up_stress_body() 157329874Sasomers{ 158329874Sasomers atf_skip "Quickly panics: if_freemulti: protospec not NULL" 159329874Sasomers do_up_stress "gif" "" "p2p" 160329874Sasomers} 161329874Sasomersgif_up_stress_cleanup() 162329874Sasomers{ 163329874Sasomers cleanup_ifaces 164329874Sasomers} 165329874Sasomers 166329874Sasomersatf_test_case gif_ipv6_up_stress cleanup 167329874Sasomersgif_ipv6_up_stress_head() 168329874Sasomers{ 169329874Sasomers atf_set "descr" "Simultaneously up and destroy a gif(4) with IPv6" 170329874Sasomers atf_set "require.user" "root" 171329874Sasomers} 172329874Sasomersgif_ipv6_up_stress_body() 173329874Sasomers{ 174329874Sasomers atf_skip "Quickly panics: rt_tables_get_rnh_ptr: fam out of bounds." 175329874Sasomers do_up_stress "gif" "6" "p2p" 176329874Sasomers} 177329874Sasomersgif_ipv6_up_stress_cleanup() 178329874Sasomers{ 179329874Sasomers cleanup_ifaces 180329874Sasomers} 181329874Sasomers 182329874Sasomersatf_test_case lo_stress cleanup 183329874Sasomerslo_stress_head() 184329874Sasomers{ 185329874Sasomers atf_set "descr" "Simultaneously create and destroy an lo(4)" 186329874Sasomers atf_set "require.user" "root" 187329874Sasomers} 188329874Sasomerslo_stress_body() 189329874Sasomers{ 190329874Sasomers do_stress "lo" 191329874Sasomers} 192329874Sasomerslo_stress_cleanup() 193329874Sasomers{ 194329874Sasomers cleanup_ifaces 195329874Sasomers} 196329874Sasomers 197329874Sasomersatf_test_case lo_up_stress cleanup 198329874Sasomerslo_up_stress_head() 199329874Sasomers{ 200329874Sasomers atf_set "descr" "Simultaneously up and destroy an lo(4)" 201329874Sasomers atf_set "require.user" "root" 202329874Sasomers} 203329874Sasomerslo_up_stress_body() 204329874Sasomers{ 205329874Sasomers atf_skip "Quickly panics: GPF in rtsock_routemsg" 206329874Sasomers do_up_stress "lo" "" "" 207329874Sasomers} 208329874Sasomerslo_up_stress_cleanup() 209329874Sasomers{ 210329874Sasomers cleanup_ifaces 211329874Sasomers} 212329874Sasomers 213329874Sasomersatf_test_case lo_ipv6_up_stress cleanup 214329874Sasomerslo_ipv6_up_stress_head() 215329874Sasomers{ 216329874Sasomers atf_set "descr" "Simultaneously up and destroy an lo(4) with IPv6" 217329874Sasomers atf_set "require.user" "root" 218329874Sasomers} 219329874Sasomerslo_ipv6_up_stress_body() 220329874Sasomers{ 221329874Sasomers atf_skip "Quickly panics: page fault in rtsock_addrmsg" 222329874Sasomers do_up_stress "lo" "6" "" 223329874Sasomers} 224329874Sasomerslo_ipv6_up_stress_cleanup() 225329874Sasomers{ 226329874Sasomers cleanup_ifaces 227329874Sasomers} 228329874Sasomers 229329874Sasomersatf_test_case tap_stress cleanup 230329874Sasomerstap_stress_head() 231329874Sasomers{ 232329874Sasomers atf_set "descr" "Simultaneously create and destroy a tap(4)" 233329874Sasomers atf_set "require.user" "root" 234329874Sasomers} 235329874Sasomerstap_stress_body() 236329874Sasomers{ 237329874Sasomers do_stress "tap" 238329874Sasomers} 239329874Sasomerstap_stress_cleanup() 240329874Sasomers{ 241329874Sasomers cleanup_ifaces 242329874Sasomers} 243329874Sasomers 244329874Sasomersatf_test_case tap_up_stress cleanup 245329874Sasomerstap_up_stress_head() 246329874Sasomers{ 247329874Sasomers atf_set "descr" "Simultaneously up and destroy a tap(4)" 248329874Sasomers atf_set "require.user" "root" 249329874Sasomers} 250329874Sasomerstap_up_stress_body() 251329874Sasomers{ 252329874Sasomers atf_skip "Quickly panics: if_freemulti: protospec not NULL" 253329874Sasomers do_up_stress "tap" "" "" 254329874Sasomers} 255329874Sasomerstap_up_stress_cleanup() 256329874Sasomers{ 257329874Sasomers cleanup_ifaces 258329874Sasomers} 259329874Sasomers 260329874Sasomersatf_test_case tap_ipv6_up_stress cleanup 261329874Sasomerstap_ipv6_up_stress_head() 262329874Sasomers{ 263329874Sasomers atf_set "descr" "Simultaneously up and destroy a tap(4) with IPv6" 264329874Sasomers atf_set "require.user" "root" 265329874Sasomers} 266329874Sasomerstap_ipv6_up_stress_body() 267329874Sasomers{ 268329874Sasomers atf_skip "Quickly panics: if_delmulti_locked: inconsistent ifp 0xfffff80150e44000" 269329874Sasomers do_up_stress "tap" "6" "" 270329874Sasomers} 271329874Sasomerstap_ipv6_up_stress_cleanup() 272329874Sasomers{ 273329874Sasomers cleanup_ifaces 274329874Sasomers} 275329874Sasomers 276329874Sasomersatf_test_case tun_stress cleanup 277329874Sasomerstun_stress_head() 278329874Sasomers{ 279329874Sasomers atf_set "descr" "Simultaneously create and destroy a tun(4)" 280329874Sasomers atf_set "require.user" "root" 281329874Sasomers} 282329874Sasomerstun_stress_body() 283329874Sasomers{ 284329874Sasomers do_stress "tun" 285329874Sasomers} 286329874Sasomerstun_stress_cleanup() 287329874Sasomers{ 288329874Sasomers cleanup_ifaces 289329874Sasomers} 290329874Sasomers 291329874Sasomersatf_test_case tun_up_stress cleanup 292329874Sasomerstun_up_stress_head() 293329874Sasomers{ 294329874Sasomers atf_set "descr" "Simultaneously up and destroy a tun(4)" 295329874Sasomers atf_set "require.user" "root" 296329874Sasomers} 297329874Sasomerstun_up_stress_body() 298329874Sasomers{ 299329874Sasomers atf_skip "Quickly panics: if_freemulti: protospec not NULL" 300329874Sasomers do_up_stress "tun" "" "p2p" 301329874Sasomers} 302329874Sasomerstun_up_stress_cleanup() 303329874Sasomers{ 304329874Sasomers cleanup_ifaces 305329874Sasomers} 306329874Sasomers 307329874Sasomersatf_test_case tun_ipv6_up_stress cleanup 308329874Sasomerstun_ipv6_up_stress_head() 309329874Sasomers{ 310329874Sasomers atf_set "descr" "Simultaneously up and destroy a tun(4) with IPv6" 311329874Sasomers atf_set "require.user" "root" 312329874Sasomers} 313329874Sasomerstun_ipv6_up_stress_body() 314329874Sasomers{ 315329874Sasomers atf_skip "Quickly panics: if_freemulti: protospec not NULL" 316329874Sasomers do_up_stress "tun" "6" "p2p" 317329874Sasomers} 318329874Sasomerstun_ipv6_up_stress_cleanup() 319329874Sasomers{ 320329874Sasomers cleanup_ifaces 321329874Sasomers} 322329874Sasomers 323329874Sasomersatf_test_case vlan_stress cleanup 324329874Sasomersvlan_stress_head() 325329874Sasomers{ 326329874Sasomers atf_set "descr" "Simultaneously create and destroy a vlan(4)" 327329874Sasomers atf_set "require.user" "root" 328329874Sasomers} 329329874Sasomersvlan_stress_body() 330329874Sasomers{ 331329874Sasomers do_stress "vlan" 332329874Sasomers} 333329874Sasomersvlan_stress_cleanup() 334329874Sasomers{ 335329874Sasomers cleanup_ifaces 336329874Sasomers} 337329874Sasomers 338329874Sasomersatf_test_case vlan_up_stress cleanup 339329874Sasomersvlan_up_stress_head() 340329874Sasomers{ 341329874Sasomers atf_set "descr" "Simultaneously up and destroy a vlan(4)" 342329874Sasomers atf_set "require.user" "root" 343329874Sasomers} 344329874Sasomersvlan_up_stress_body() 345329874Sasomers{ 346329874Sasomers atf_skip "Quickly panics: if_freemulti: protospec not NULL" 347329874Sasomers do_up_stress "vlan" "" "" 348329874Sasomers} 349329874Sasomersvlan_up_stress_cleanup() 350329874Sasomers{ 351329874Sasomers cleanup_ifaces 352329874Sasomers} 353329874Sasomers 354329874Sasomersatf_test_case vlan_ipv6_up_stress cleanup 355329874Sasomersvlan_ipv6_up_stress_head() 356329874Sasomers{ 357329874Sasomers atf_set "descr" "Simultaneously up and destroy a vlan(4) with IPv6" 358329874Sasomers atf_set "require.user" "root" 359329874Sasomers} 360329874Sasomersvlan_ipv6_up_stress_body() 361329874Sasomers{ 362329874Sasomers atf_skip "Quickly panics: if_freemulti: protospec not NULL" 363329874Sasomers do_up_stress "vlan" "6" "" 364329874Sasomers} 365329874Sasomersvlan_ipv6_up_stress_cleanup() 366329874Sasomers{ 367329874Sasomers cleanup_ifaces 368329874Sasomers} 369329874Sasomers 370329874Sasomersatf_test_case vmnet_stress cleanup 371329874Sasomersvmnet_stress_head() 372329874Sasomers{ 373329874Sasomers atf_set "descr" "Simultaneously create and destroy a vmnet(4)" 374329874Sasomers atf_set "require.user" "root" 375329874Sasomers} 376329874Sasomersvmnet_stress_body() 377329874Sasomers{ 378329874Sasomers do_stress "vmnet" 379329874Sasomers} 380329874Sasomersvmnet_stress_cleanup() 381329874Sasomers{ 382329874Sasomers cleanup_ifaces 383329874Sasomers} 384329874Sasomers 385329874Sasomersatf_test_case vmnet_up_stress cleanup 386329874Sasomersvmnet_up_stress_head() 387329874Sasomers{ 388329874Sasomers atf_set "descr" "Simultaneously up and destroy a vmnet(4)" 389329874Sasomers atf_set "require.user" "root" 390329874Sasomers} 391329874Sasomersvmnet_up_stress_body() 392329874Sasomers{ 393329874Sasomers do_up_stress "vmnet" "" "" 394329874Sasomers} 395329874Sasomersvmnet_up_stress_cleanup() 396329874Sasomers{ 397329874Sasomers cleanup_ifaces 398329874Sasomers} 399329874Sasomers 400329874Sasomersatf_test_case vmnet_ipv6_up_stress cleanup 401329874Sasomersvmnet_ipv6_up_stress_head() 402329874Sasomers{ 403329874Sasomers atf_set "descr" "Simultaneously up and destroy a vmnet(4) with IPv6" 404329874Sasomers atf_set "require.user" "root" 405329874Sasomers} 406329874Sasomersvmnet_ipv6_up_stress_body() 407329874Sasomers{ 408329874Sasomers atf_skip "Quickly panics: if_freemulti: protospec not NULL" 409329874Sasomers do_up_stress "vmnet" "6" "" 410329874Sasomers} 411329874Sasomersvmnet_ipv6_up_stress_cleanup() 412329874Sasomers{ 413329874Sasomers cleanup_ifaces 414329874Sasomers} 415329874Sasomers 416329874Sasomersatf_init_test_cases() 417329874Sasomers{ 418350124Sasomers atf_add_test_case epair_ipv6_up_stress 419350124Sasomers atf_add_test_case epair_stress 420350124Sasomers atf_add_test_case epair_up_stress 421329874Sasomers atf_add_test_case faith_ipv6_up_stress 422329874Sasomers atf_add_test_case faith_stress 423329874Sasomers atf_add_test_case faith_up_stress 424329874Sasomers atf_add_test_case gif_ipv6_up_stress 425329874Sasomers atf_add_test_case gif_stress 426329874Sasomers atf_add_test_case gif_up_stress 427329874Sasomers # Don't test lagg; it has its own test program 428329874Sasomers atf_add_test_case lo_ipv6_up_stress 429329874Sasomers atf_add_test_case lo_stress 430329874Sasomers atf_add_test_case lo_up_stress 431329874Sasomers atf_add_test_case tap_ipv6_up_stress 432329874Sasomers atf_add_test_case tap_stress 433329874Sasomers atf_add_test_case tap_up_stress 434329874Sasomers atf_add_test_case tun_ipv6_up_stress 435329874Sasomers atf_add_test_case tun_stress 436329874Sasomers atf_add_test_case tun_up_stress 437329874Sasomers atf_add_test_case vlan_ipv6_up_stress 438329874Sasomers atf_add_test_case vlan_stress 439329874Sasomers atf_add_test_case vlan_up_stress 440329874Sasomers atf_add_test_case vmnet_ipv6_up_stress 441329874Sasomers atf_add_test_case vmnet_stress 442329874Sasomers atf_add_test_case vmnet_up_stress 443329874Sasomers} 444329874Sasomers 445329874Sasomersdo_stress() 446329874Sasomers{ 447350124Sasomers local IFACE CREATOR_PID DESTROYER_PID 448329874Sasomers 449329874Sasomers IFACE=`get_iface $1` 450329874Sasomers 451329874Sasomers # First thread: create the interface 452329874Sasomers while true; do 453350124Sasomers ifconfig ${IFACE%a} create 2>/dev/null && \ 454329874Sasomers echo -n . >> creator_count.txt 455329874Sasomers done & 456329874Sasomers CREATOR_PID=$! 457329874Sasomers 458329874Sasomers # Second thread: destroy the lagg 459329874Sasomers while true; do 460329874Sasomers ifconfig $IFACE destroy 2>/dev/null && \ 461329874Sasomers echo -n . >> destroyer_count.txt 462329874Sasomers done & 463329874Sasomers DESTROYER_PID=$! 464329874Sasomers 465329874Sasomers sleep ${TESTLEN} 466329874Sasomers kill $CREATOR_PID 467329874Sasomers kill $DESTROYER_PID 468350124Sasomers echo "Created ${IFACE%a} `stat -f %z creator_count.txt` times." 469329874Sasomers echo "Destroyed it `stat -f %z destroyer_count.txt` times." 470329874Sasomers} 471329874Sasomers 472329874Sasomers# Implement the up stress tests 473329874Sasomers# Parameters 474329874Sasomers# $1 Interface class, etc "lo" or "tap" 475329874Sasomers# $2 "6" to enable IPv6 auto address assignment, anything else otherwise 476329874Sasomers# $3 p2p for point to point interfaces, anything else for normal interfaces 477329874Sasomersdo_up_stress() 478329874Sasomers{ 479350124Sasomers local ADDR DSTADDR MASK MEAN_SLEEP_SECONDS MAX_SLEEP_USECS \ 480350124Sasomers IFACE IPV6 P2P SRCDIR LOOP_PID ipv6_cmd up_cmd 481329874Sasomers 482329874Sasomers # Configure the interface to use an RFC5737 nonrouteable addresses 483329874Sasomers ADDR="192.0.2.2" 484329874Sasomers DSTADDR="192.0.2.3" 485329874Sasomers MASK="24" 486329874Sasomers # ifconfig takes about 10ms to run. To increase race coverage, 487329874Sasomers # randomly delay the two commands relative to each other by 5ms either 488329874Sasomers # way. 489329874Sasomers MEAN_SLEEP_SECONDS=.005 490329874Sasomers MAX_SLEEP_USECS=10000 491329874Sasomers 492329874Sasomers IFACE=`get_iface $1` 493329874Sasomers IPV6=$2 494329874Sasomers P2P=$3 495329874Sasomers 496329874Sasomers SRCDIR=$( atf_get_srcdir ) 497329874Sasomers if [ "$IPV6" = 6 ]; then 498329874Sasomers ipv6_cmd="true" 499329874Sasomers else 500329874Sasomers ipv6_cmd="ifconfig $IFACE inet6 ifdisabled" 501329874Sasomers fi 502329874Sasomers if [ "$P2P" = "p2p" ]; then 503329874Sasomers up_cmd="ifconfig $IFACE up ${ADDR}/${MASK} ${DSTADDR}" 504329874Sasomers else 505329874Sasomers up_cmd="ifconfig $IFACE up ${ADDR}/${MASK}" 506329874Sasomers fi 507329874Sasomers while true; do 508329874Sasomers eval "$ipv6_cmd" 509329874Sasomers { sleep ${MEAN_SLEEP_SECONDS} && \ 510329874Sasomers eval "$up_cmd" 2> /dev/null && 511329874Sasomers echo -n . >> up_count.txt ; } & 512329874Sasomers { ${SRCDIR}/randsleep ${MAX_SLEEP_USECS} && \ 513329874Sasomers ifconfig $IFACE destroy && 514329874Sasomers echo -n . >> destroy_count.txt ; } & 515329874Sasomers wait 516350124Sasomers ifconfig ${IFACE%a} create 517329874Sasomers done & 518329874Sasomers LOOP_PID=$! 519329874Sasomers 520329874Sasomers sleep ${TESTLEN} 521329874Sasomers kill $LOOP_PID 522329874Sasomers echo "Upped ${IFACE} `stat -f %z up_count.txt` times." 523329874Sasomers echo "Destroyed it `stat -f %z destroy_count.txt` times." 524329874Sasomers} 525329874Sasomers 526329874Sasomers# Creates a new cloned interface, registers it for cleanup, and echoes it 527329874Sasomers# params: $1 Interface class name (tap, gif, etc) 528329874Sasomersget_iface() 529329874Sasomers{ 530329874Sasomers local CLASS DEV N 531329874Sasomers 532329874Sasomers CLASS=$1 533329874Sasomers N=0 534329874Sasomers while ! ifconfig ${CLASS}${N} create > /dev/null 2>&1; do 535329874Sasomers if [ "$N" -ge 8 ]; then 536329874Sasomers atf_skip "Could not create a ${CLASS} interface" 537329874Sasomers else 538329874Sasomers N=$(($N + 1)) 539329874Sasomers fi 540329874Sasomers done 541350124Sasomers if [ ${CLASS} = "epair" ]; then 542350124Sasomers DEV=${CLASS}${N}a 543350124Sasomers else 544350124Sasomers DEV=${CLASS}${N} 545350124Sasomers fi 546329874Sasomers # Record the device so we can clean it up later 547329874Sasomers echo ${DEV} >> "devices_to_cleanup" 548329874Sasomers echo ${DEV} 549329874Sasomers} 550329874Sasomers 551329874Sasomers 552329874Sasomerscleanup_ifaces() 553329874Sasomers{ 554329874Sasomers local DEV 555329874Sasomers 556329874Sasomers for DEV in `cat "devices_to_cleanup"`; do 557350124Sasomers ifconfig ${DEV} destroy 558329874Sasomers done 559329874Sasomers true 560329874Sasomers} 561