1*cdebaff8SEnji Cooper# $NetBSD: net_common.sh,v 1.11 2017/01/10 05:55:34 ozaki-r Exp $ 2*cdebaff8SEnji Cooper# 3*cdebaff8SEnji Cooper# Copyright (c) 2016 Internet Initiative Japan Inc. 4*cdebaff8SEnji Cooper# All rights reserved. 5*cdebaff8SEnji Cooper# 6*cdebaff8SEnji Cooper# Redistribution and use in source and binary forms, with or without 7*cdebaff8SEnji Cooper# modification, are permitted provided that the following conditions 8*cdebaff8SEnji Cooper# are met: 9*cdebaff8SEnji Cooper# 1. Redistributions of source code must retain the above copyright 10*cdebaff8SEnji Cooper# notice, this list of conditions and the following disclaimer. 11*cdebaff8SEnji Cooper# 2. Redistributions in binary form must reproduce the above copyright 12*cdebaff8SEnji Cooper# notice, this list of conditions and the following disclaimer in the 13*cdebaff8SEnji Cooper# documentation and/or other materials provided with the distribution. 14*cdebaff8SEnji Cooper# 15*cdebaff8SEnji Cooper# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 16*cdebaff8SEnji Cooper# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 17*cdebaff8SEnji Cooper# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 18*cdebaff8SEnji Cooper# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 19*cdebaff8SEnji Cooper# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20*cdebaff8SEnji Cooper# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21*cdebaff8SEnji Cooper# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22*cdebaff8SEnji Cooper# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23*cdebaff8SEnji Cooper# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24*cdebaff8SEnji Cooper# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25*cdebaff8SEnji Cooper# POSSIBILITY OF SUCH DAMAGE. 26*cdebaff8SEnji Cooper# 27*cdebaff8SEnji Cooper 28*cdebaff8SEnji Cooper# 29*cdebaff8SEnji Cooper# Common utility functions for tests/net 30*cdebaff8SEnji Cooper# 31*cdebaff8SEnji Cooper 32*cdebaff8SEnji CooperHIJACKING="env LD_PRELOAD=/usr/lib/librumphijack.so RUMPHIJACK=sysctl=yes" 33*cdebaff8SEnji Cooper 34*cdebaff8SEnji Cooperextract_new_packets() 35*cdebaff8SEnji Cooper{ 36*cdebaff8SEnji Cooper local bus=$1 37*cdebaff8SEnji Cooper local old=./.__old 38*cdebaff8SEnji Cooper 39*cdebaff8SEnji Cooper if [ ! -f $old ]; then 40*cdebaff8SEnji Cooper old=/dev/null 41*cdebaff8SEnji Cooper fi 42*cdebaff8SEnji Cooper 43*cdebaff8SEnji Cooper shmif_dumpbus -p - $bus 2>/dev/null| \ 44*cdebaff8SEnji Cooper tcpdump -n -e -r - 2>/dev/null > ./.__new 45*cdebaff8SEnji Cooper diff -u $old ./.__new |grep '^+' |cut -d '+' -f 2 > ./.__diff 46*cdebaff8SEnji Cooper mv -f ./.__new ./.__old 47*cdebaff8SEnji Cooper cat ./.__diff 48*cdebaff8SEnji Cooper} 49*cdebaff8SEnji Cooper 50*cdebaff8SEnji Coopercheck_route() 51*cdebaff8SEnji Cooper{ 52*cdebaff8SEnji Cooper local target=$1 53*cdebaff8SEnji Cooper local gw=$2 54*cdebaff8SEnji Cooper local flags=${3:-\.\+} 55*cdebaff8SEnji Cooper local ifname=${4:-\.\+} 56*cdebaff8SEnji Cooper 57*cdebaff8SEnji Cooper target=$(echo $target |sed 's/\./\\./g') 58*cdebaff8SEnji Cooper if [ "$gw" = "" ]; then 59*cdebaff8SEnji Cooper gw=".+" 60*cdebaff8SEnji Cooper else 61*cdebaff8SEnji Cooper gw=$(echo $gw |sed 's/\./\\./g') 62*cdebaff8SEnji Cooper fi 63*cdebaff8SEnji Cooper 64*cdebaff8SEnji Cooper atf_check -s exit:0 -e ignore \ 65*cdebaff8SEnji Cooper -o match:"^$target +$gw +$flags +- +- +.+ +$ifname" \ 66*cdebaff8SEnji Cooper rump.netstat -rn 67*cdebaff8SEnji Cooper} 68*cdebaff8SEnji Cooper 69*cdebaff8SEnji Coopercheck_route_flags() 70*cdebaff8SEnji Cooper{ 71*cdebaff8SEnji Cooper 72*cdebaff8SEnji Cooper check_route "$1" "" "$2" "" 73*cdebaff8SEnji Cooper} 74*cdebaff8SEnji Cooper 75*cdebaff8SEnji Coopercheck_route_gw() 76*cdebaff8SEnji Cooper{ 77*cdebaff8SEnji Cooper 78*cdebaff8SEnji Cooper check_route "$1" "$2" "" "" 79*cdebaff8SEnji Cooper} 80*cdebaff8SEnji Cooper 81*cdebaff8SEnji Coopercheck_route_no_entry() 82*cdebaff8SEnji Cooper{ 83*cdebaff8SEnji Cooper local target=$(echo $1 |sed 's/\./\\./g') 84*cdebaff8SEnji Cooper 85*cdebaff8SEnji Cooper atf_check -s exit:0 -e ignore -o not-match:"^$target" \ 86*cdebaff8SEnji Cooper rump.netstat -rn 87*cdebaff8SEnji Cooper} 88*cdebaff8SEnji Cooper 89*cdebaff8SEnji Cooperget_linklocal_addr() 90*cdebaff8SEnji Cooper{ 91*cdebaff8SEnji Cooper 92*cdebaff8SEnji Cooper export RUMP_SERVER=${1} 93*cdebaff8SEnji Cooper rump.ifconfig ${2} inet6 | 94*cdebaff8SEnji Cooper awk "/fe80/ {sub(/%$2/, \"\"); sub(/\\/[0-9]*/, \"\"); print \$2;}" 95*cdebaff8SEnji Cooper unset RUMP_SERVER 96*cdebaff8SEnji Cooper 97*cdebaff8SEnji Cooper return 0 98*cdebaff8SEnji Cooper} 99*cdebaff8SEnji Cooper 100*cdebaff8SEnji Cooperget_macaddr() 101*cdebaff8SEnji Cooper{ 102*cdebaff8SEnji Cooper 103*cdebaff8SEnji Cooper env RUMP_SERVER=${1} \ 104*cdebaff8SEnji Cooper rump.ifconfig ${2} |awk '/address/ {print $2;}' 105*cdebaff8SEnji Cooper} 106*cdebaff8SEnji Cooper 107*cdebaff8SEnji CooperHTTPD_PID=./.__httpd.pid 108*cdebaff8SEnji Cooperstart_httpd() 109*cdebaff8SEnji Cooper{ 110*cdebaff8SEnji Cooper local sock=$1 111*cdebaff8SEnji Cooper local ip=$2 112*cdebaff8SEnji Cooper local backup=$RUMP_SERVER 113*cdebaff8SEnji Cooper 114*cdebaff8SEnji Cooper export RUMP_SERVER=$sock 115*cdebaff8SEnji Cooper 116*cdebaff8SEnji Cooper # start httpd in daemon mode 117*cdebaff8SEnji Cooper atf_check -s exit:0 env LD_PRELOAD=/usr/lib/librumphijack.so \ 118*cdebaff8SEnji Cooper /usr/libexec/httpd -P $HTTPD_PID -i $ip -b -s $(pwd) 119*cdebaff8SEnji Cooper 120*cdebaff8SEnji Cooper export RUMP_SERVER=$backup 121*cdebaff8SEnji Cooper 122*cdebaff8SEnji Cooper sleep 3 123*cdebaff8SEnji Cooper} 124*cdebaff8SEnji Cooper 125*cdebaff8SEnji Cooperstop_httpd() 126*cdebaff8SEnji Cooper{ 127*cdebaff8SEnji Cooper 128*cdebaff8SEnji Cooper if [ -f $HTTPD_PID ]; then 129*cdebaff8SEnji Cooper kill -9 $(cat $HTTPD_PID) 130*cdebaff8SEnji Cooper rm -f $HTTPD_PID 131*cdebaff8SEnji Cooper sleep 1 132*cdebaff8SEnji Cooper fi 133*cdebaff8SEnji Cooper} 134*cdebaff8SEnji Cooper 135*cdebaff8SEnji CooperBASIC_LIBS="-lrumpnet -lrumpnet_net -lrumpnet_netinet \ 136*cdebaff8SEnji Cooper -lrumpnet_shmif -lrumpdev" 137*cdebaff8SEnji CooperFS_LIBS="$BASIC_LIBS -lrumpvfs -lrumpfs_ffs" 138*cdebaff8SEnji Cooper 139*cdebaff8SEnji Cooper# We cannot keep variables between test phases, so need to store in files 140*cdebaff8SEnji Cooper_rump_server_socks=./.__socks 141*cdebaff8SEnji Cooper_rump_server_ifaces=./.__ifaces 142*cdebaff8SEnji Cooper_rump_server_buses=./.__buses 143*cdebaff8SEnji Cooper 144*cdebaff8SEnji Cooper_rump_server_start_common() 145*cdebaff8SEnji Cooper{ 146*cdebaff8SEnji Cooper local sock=$1 147*cdebaff8SEnji Cooper local libs= 148*cdebaff8SEnji Cooper 149*cdebaff8SEnji Cooper shift 1 150*cdebaff8SEnji Cooper libs="$*" 151*cdebaff8SEnji Cooper 152*cdebaff8SEnji Cooper atf_check -s exit:0 rump_server $libs $sock 153*cdebaff8SEnji Cooper 154*cdebaff8SEnji Cooper echo $sock >> $_rump_server_socks 155*cdebaff8SEnji Cooper $DEBUG && cat $_rump_server_socks 156*cdebaff8SEnji Cooper} 157*cdebaff8SEnji Cooper 158*cdebaff8SEnji Cooperrump_server_start() 159*cdebaff8SEnji Cooper{ 160*cdebaff8SEnji Cooper local sock=$1 161*cdebaff8SEnji Cooper local _libs= 162*cdebaff8SEnji Cooper local libs="$BASIC_LIBS" 163*cdebaff8SEnji Cooper 164*cdebaff8SEnji Cooper shift 1 165*cdebaff8SEnji Cooper _libs="$*" 166*cdebaff8SEnji Cooper 167*cdebaff8SEnji Cooper for lib in $_libs; do 168*cdebaff8SEnji Cooper libs="$libs -lrumpnet_$lib" 169*cdebaff8SEnji Cooper done 170*cdebaff8SEnji Cooper 171*cdebaff8SEnji Cooper _rump_server_start_common $sock $libs 172*cdebaff8SEnji Cooper 173*cdebaff8SEnji Cooper return 0 174*cdebaff8SEnji Cooper} 175*cdebaff8SEnji Cooper 176*cdebaff8SEnji Cooperrump_server_fs_start() 177*cdebaff8SEnji Cooper{ 178*cdebaff8SEnji Cooper local sock=$1 179*cdebaff8SEnji Cooper local _libs= 180*cdebaff8SEnji Cooper local libs="$FS_LIBS" 181*cdebaff8SEnji Cooper 182*cdebaff8SEnji Cooper shift 1 183*cdebaff8SEnji Cooper _libs="$*" 184*cdebaff8SEnji Cooper 185*cdebaff8SEnji Cooper for lib in $_libs; do 186*cdebaff8SEnji Cooper libs="$libs -lrumpnet_$lib" 187*cdebaff8SEnji Cooper done 188*cdebaff8SEnji Cooper 189*cdebaff8SEnji Cooper _rump_server_start_common $sock $libs 190*cdebaff8SEnji Cooper 191*cdebaff8SEnji Cooper return 0 192*cdebaff8SEnji Cooper} 193*cdebaff8SEnji Cooper 194*cdebaff8SEnji Cooperrump_server_add_iface() 195*cdebaff8SEnji Cooper{ 196*cdebaff8SEnji Cooper local sock=$1 197*cdebaff8SEnji Cooper local ifname=$2 198*cdebaff8SEnji Cooper local bus=$3 199*cdebaff8SEnji Cooper local backup=$RUMP_SERVER 200*cdebaff8SEnji Cooper 201*cdebaff8SEnji Cooper export RUMP_SERVER=$sock 202*cdebaff8SEnji Cooper atf_check -s exit:0 rump.ifconfig $ifname create 203*cdebaff8SEnji Cooper atf_check -s exit:0 rump.ifconfig $ifname linkstr $bus 204*cdebaff8SEnji Cooper export RUMP_SERVER=$backup 205*cdebaff8SEnji Cooper 206*cdebaff8SEnji Cooper echo $sock $ifname >> $_rump_server_ifaces 207*cdebaff8SEnji Cooper $DEBUG && cat $_rump_server_ifaces 208*cdebaff8SEnji Cooper 209*cdebaff8SEnji Cooper echo $bus >> $_rump_server_buses 210*cdebaff8SEnji Cooper cat $_rump_server_buses |sort -u >./.__tmp 211*cdebaff8SEnji Cooper mv -f ./.__tmp $_rump_server_buses 212*cdebaff8SEnji Cooper $DEBUG && cat $_rump_server_buses 213*cdebaff8SEnji Cooper 214*cdebaff8SEnji Cooper return 0 215*cdebaff8SEnji Cooper} 216*cdebaff8SEnji Cooper 217*cdebaff8SEnji Cooperrump_server_destroy_ifaces() 218*cdebaff8SEnji Cooper{ 219*cdebaff8SEnji Cooper local backup=$RUMP_SERVER 220*cdebaff8SEnji Cooper 221*cdebaff8SEnji Cooper $DEBUG && cat $_rump_server_ifaces 222*cdebaff8SEnji Cooper 223*cdebaff8SEnji Cooper # Try to dump states before destroying interfaces 224*cdebaff8SEnji Cooper for sock in $(cat $_rump_server_socks); do 225*cdebaff8SEnji Cooper export RUMP_SERVER=$sock 226*cdebaff8SEnji Cooper atf_check -s exit:0 -o ignore rump.ifconfig 227*cdebaff8SEnji Cooper atf_check -s exit:0 -o ignore rump.netstat -nr 228*cdebaff8SEnji Cooper # XXX still need hijacking 229*cdebaff8SEnji Cooper atf_check -s exit:0 -o ignore $HIJACKING rump.netstat -i -a 230*cdebaff8SEnji Cooper atf_check -s exit:0 -o ignore rump.arp -na 231*cdebaff8SEnji Cooper atf_check -s exit:0 -o ignore rump.ndp -na 232*cdebaff8SEnji Cooper atf_check -s exit:0 -o ignore $HIJACKING ifmcstat 233*cdebaff8SEnji Cooper done 234*cdebaff8SEnji Cooper 235*cdebaff8SEnji Cooper # XXX using pipe doesn't work. See PR bin/51667 236*cdebaff8SEnji Cooper #cat $_rump_server_ifaces | while read sock ifname; do 237*cdebaff8SEnji Cooper while read sock ifname; do 238*cdebaff8SEnji Cooper export RUMP_SERVER=$sock 239*cdebaff8SEnji Cooper if rump.ifconfig -l |grep -q $ifname; then 240*cdebaff8SEnji Cooper atf_check -s exit:0 rump.ifconfig $ifname destroy 241*cdebaff8SEnji Cooper fi 242*cdebaff8SEnji Cooper atf_check -s exit:0 -o ignore rump.ifconfig 243*cdebaff8SEnji Cooper done < $_rump_server_ifaces 244*cdebaff8SEnji Cooper export RUMP_SERVER=$backup 245*cdebaff8SEnji Cooper 246*cdebaff8SEnji Cooper return 0 247*cdebaff8SEnji Cooper} 248*cdebaff8SEnji Cooper 249*cdebaff8SEnji Cooperrump_server_halt_servers() 250*cdebaff8SEnji Cooper{ 251*cdebaff8SEnji Cooper local backup=$RUMP_SERVER 252*cdebaff8SEnji Cooper 253*cdebaff8SEnji Cooper $DEBUG && cat $_rump_server_socks 254*cdebaff8SEnji Cooper for sock in $(cat $_rump_server_socks); do 255*cdebaff8SEnji Cooper env RUMP_SERVER=$sock rump.halt 256*cdebaff8SEnji Cooper done 257*cdebaff8SEnji Cooper export RUMP_SERVER=$backup 258*cdebaff8SEnji Cooper 259*cdebaff8SEnji Cooper return 0 260*cdebaff8SEnji Cooper} 261*cdebaff8SEnji Cooper 262*cdebaff8SEnji Cooperrump_server_dump_servers() 263*cdebaff8SEnji Cooper{ 264*cdebaff8SEnji Cooper local backup=$RUMP_SERVER 265*cdebaff8SEnji Cooper 266*cdebaff8SEnji Cooper $DEBUG && cat $_rump_server_socks 267*cdebaff8SEnji Cooper for sock in $(cat $_rump_server_socks); do 268*cdebaff8SEnji Cooper echo "### Dumping $sock" 269*cdebaff8SEnji Cooper export RUMP_SERVER=$sock 270*cdebaff8SEnji Cooper rump.ifconfig 271*cdebaff8SEnji Cooper rump.netstat -nr 272*cdebaff8SEnji Cooper # XXX still need hijacking 273*cdebaff8SEnji Cooper $HIJACKING rump.netstat -i -a 274*cdebaff8SEnji Cooper rump.arp -na 275*cdebaff8SEnji Cooper rump.ndp -na 276*cdebaff8SEnji Cooper $HIJACKING ifmcstat 277*cdebaff8SEnji Cooper $HIJACKING dmesg 278*cdebaff8SEnji Cooper done 279*cdebaff8SEnji Cooper export RUMP_SERVER=$backup 280*cdebaff8SEnji Cooper 281*cdebaff8SEnji Cooper if [ -f rump_server.core ]; then 282*cdebaff8SEnji Cooper gdb -ex bt /usr/bin/rump_server rump_server.core 283*cdebaff8SEnji Cooper strings rump_server.core |grep panic 284*cdebaff8SEnji Cooper fi 285*cdebaff8SEnji Cooper return 0 286*cdebaff8SEnji Cooper} 287*cdebaff8SEnji Cooper 288*cdebaff8SEnji Cooperrump_server_dump_buses() 289*cdebaff8SEnji Cooper{ 290*cdebaff8SEnji Cooper 291*cdebaff8SEnji Cooper if [ ! -f $_rump_server_buses ]; then 292*cdebaff8SEnji Cooper return 0 293*cdebaff8SEnji Cooper fi 294*cdebaff8SEnji Cooper 295*cdebaff8SEnji Cooper $DEBUG && cat $_rump_server_buses 296*cdebaff8SEnji Cooper for bus in $(cat $_rump_server_buses); do 297*cdebaff8SEnji Cooper echo "### Dumping $bus" 298*cdebaff8SEnji Cooper shmif_dumpbus -p - $bus 2>/dev/null| tcpdump -n -e -r - 299*cdebaff8SEnji Cooper done 300*cdebaff8SEnji Cooper return 0 301*cdebaff8SEnji Cooper} 302*cdebaff8SEnji Cooper 303*cdebaff8SEnji Coopercleanup() 304*cdebaff8SEnji Cooper{ 305*cdebaff8SEnji Cooper 306*cdebaff8SEnji Cooper rump_server_halt_servers 307*cdebaff8SEnji Cooper} 308*cdebaff8SEnji Cooper 309*cdebaff8SEnji Cooperdump() 310*cdebaff8SEnji Cooper{ 311*cdebaff8SEnji Cooper 312*cdebaff8SEnji Cooper rump_server_dump_servers 313*cdebaff8SEnji Cooper rump_server_dump_buses 314*cdebaff8SEnji Cooper} 315