1# $NetBSD: net_common.sh,v 1.11 2017/01/10 05:55:34 ozaki-r Exp $ 2# 3# Copyright (c) 2016 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# 29# Common utility functions for tests/net 30# 31 32HIJACKING="env LD_PRELOAD=/usr/lib/librumphijack.so RUMPHIJACK=sysctl=yes" 33 34extract_new_packets() 35{ 36 local bus=$1 37 local old=./.__old 38 39 if [ ! -f $old ]; then 40 old=/dev/null 41 fi 42 43 shmif_dumpbus -p - $bus 2>/dev/null| \ 44 tcpdump -n -e -r - 2>/dev/null > ./.__new 45 diff -u $old ./.__new |grep '^+' |cut -d '+' -f 2 > ./.__diff 46 mv -f ./.__new ./.__old 47 cat ./.__diff 48} 49 50check_route() 51{ 52 local target=$1 53 local gw=$2 54 local flags=${3:-\.\+} 55 local ifname=${4:-\.\+} 56 57 target=$(echo $target |sed 's/\./\\./g') 58 if [ "$gw" = "" ]; then 59 gw=".+" 60 else 61 gw=$(echo $gw |sed 's/\./\\./g') 62 fi 63 64 atf_check -s exit:0 -e ignore \ 65 -o match:"^$target +$gw +$flags +- +- +.+ +$ifname" \ 66 rump.netstat -rn 67} 68 69check_route_flags() 70{ 71 72 check_route "$1" "" "$2" "" 73} 74 75check_route_gw() 76{ 77 78 check_route "$1" "$2" "" "" 79} 80 81check_route_no_entry() 82{ 83 local target=$(echo $1 |sed 's/\./\\./g') 84 85 atf_check -s exit:0 -e ignore -o not-match:"^$target" \ 86 rump.netstat -rn 87} 88 89get_linklocal_addr() 90{ 91 92 export RUMP_SERVER=${1} 93 rump.ifconfig ${2} inet6 | 94 awk "/fe80/ {sub(/%$2/, \"\"); sub(/\\/[0-9]*/, \"\"); print \$2;}" 95 unset RUMP_SERVER 96 97 return 0 98} 99 100get_macaddr() 101{ 102 103 env RUMP_SERVER=${1} \ 104 rump.ifconfig ${2} |awk '/address/ {print $2;}' 105} 106 107HTTPD_PID=./.__httpd.pid 108start_httpd() 109{ 110 local sock=$1 111 local ip=$2 112 local backup=$RUMP_SERVER 113 114 export RUMP_SERVER=$sock 115 116 # start httpd in daemon mode 117 atf_check -s exit:0 env LD_PRELOAD=/usr/lib/librumphijack.so \ 118 /usr/libexec/httpd -P $HTTPD_PID -i $ip -b -s $(pwd) 119 120 export RUMP_SERVER=$backup 121 122 sleep 3 123} 124 125stop_httpd() 126{ 127 128 if [ -f $HTTPD_PID ]; then 129 kill -9 $(cat $HTTPD_PID) 130 rm -f $HTTPD_PID 131 sleep 1 132 fi 133} 134 135BASIC_LIBS="-lrumpnet -lrumpnet_net -lrumpnet_netinet \ 136 -lrumpnet_shmif -lrumpdev" 137FS_LIBS="$BASIC_LIBS -lrumpvfs -lrumpfs_ffs" 138 139# We cannot keep variables between test phases, so need to store in files 140_rump_server_socks=./.__socks 141_rump_server_ifaces=./.__ifaces 142_rump_server_buses=./.__buses 143 144_rump_server_start_common() 145{ 146 local sock=$1 147 local libs= 148 149 shift 1 150 libs="$*" 151 152 atf_check -s exit:0 rump_server $libs $sock 153 154 echo $sock >> $_rump_server_socks 155 $DEBUG && cat $_rump_server_socks 156} 157 158rump_server_start() 159{ 160 local sock=$1 161 local _libs= 162 local libs="$BASIC_LIBS" 163 164 shift 1 165 _libs="$*" 166 167 for lib in $_libs; do 168 libs="$libs -lrumpnet_$lib" 169 done 170 171 _rump_server_start_common $sock $libs 172 173 return 0 174} 175 176rump_server_fs_start() 177{ 178 local sock=$1 179 local _libs= 180 local libs="$FS_LIBS" 181 182 shift 1 183 _libs="$*" 184 185 for lib in $_libs; do 186 libs="$libs -lrumpnet_$lib" 187 done 188 189 _rump_server_start_common $sock $libs 190 191 return 0 192} 193 194rump_server_add_iface() 195{ 196 local sock=$1 197 local ifname=$2 198 local bus=$3 199 local backup=$RUMP_SERVER 200 201 export RUMP_SERVER=$sock 202 atf_check -s exit:0 rump.ifconfig $ifname create 203 atf_check -s exit:0 rump.ifconfig $ifname linkstr $bus 204 export RUMP_SERVER=$backup 205 206 echo $sock $ifname >> $_rump_server_ifaces 207 $DEBUG && cat $_rump_server_ifaces 208 209 echo $bus >> $_rump_server_buses 210 cat $_rump_server_buses |sort -u >./.__tmp 211 mv -f ./.__tmp $_rump_server_buses 212 $DEBUG && cat $_rump_server_buses 213 214 return 0 215} 216 217rump_server_destroy_ifaces() 218{ 219 local backup=$RUMP_SERVER 220 221 $DEBUG && cat $_rump_server_ifaces 222 223 # Try to dump states before destroying interfaces 224 for sock in $(cat $_rump_server_socks); do 225 export RUMP_SERVER=$sock 226 atf_check -s exit:0 -o ignore rump.ifconfig 227 atf_check -s exit:0 -o ignore rump.netstat -nr 228 # XXX still need hijacking 229 atf_check -s exit:0 -o ignore $HIJACKING rump.netstat -i -a 230 atf_check -s exit:0 -o ignore rump.arp -na 231 atf_check -s exit:0 -o ignore rump.ndp -na 232 atf_check -s exit:0 -o ignore $HIJACKING ifmcstat 233 done 234 235 # XXX using pipe doesn't work. See PR bin/51667 236 #cat $_rump_server_ifaces | while read sock ifname; do 237 while read sock ifname; do 238 export RUMP_SERVER=$sock 239 if rump.ifconfig -l |grep -q $ifname; then 240 atf_check -s exit:0 rump.ifconfig $ifname destroy 241 fi 242 atf_check -s exit:0 -o ignore rump.ifconfig 243 done < $_rump_server_ifaces 244 export RUMP_SERVER=$backup 245 246 return 0 247} 248 249rump_server_halt_servers() 250{ 251 local backup=$RUMP_SERVER 252 253 $DEBUG && cat $_rump_server_socks 254 for sock in $(cat $_rump_server_socks); do 255 env RUMP_SERVER=$sock rump.halt 256 done 257 export RUMP_SERVER=$backup 258 259 return 0 260} 261 262rump_server_dump_servers() 263{ 264 local backup=$RUMP_SERVER 265 266 $DEBUG && cat $_rump_server_socks 267 for sock in $(cat $_rump_server_socks); do 268 echo "### Dumping $sock" 269 export RUMP_SERVER=$sock 270 rump.ifconfig 271 rump.netstat -nr 272 # XXX still need hijacking 273 $HIJACKING rump.netstat -i -a 274 rump.arp -na 275 rump.ndp -na 276 $HIJACKING ifmcstat 277 $HIJACKING dmesg 278 done 279 export RUMP_SERVER=$backup 280 281 if [ -f rump_server.core ]; then 282 gdb -ex bt /usr/bin/rump_server rump_server.core 283 strings rump_server.core |grep panic 284 fi 285 return 0 286} 287 288rump_server_dump_buses() 289{ 290 291 if [ ! -f $_rump_server_buses ]; then 292 return 0 293 fi 294 295 $DEBUG && cat $_rump_server_buses 296 for bus in $(cat $_rump_server_buses); do 297 echo "### Dumping $bus" 298 shmif_dumpbus -p - $bus 2>/dev/null| tcpdump -n -e -r - 299 done 300 return 0 301} 302 303cleanup() 304{ 305 306 rump_server_halt_servers 307} 308 309dump() 310{ 311 312 rump_server_dump_servers 313 rump_server_dump_buses 314} 315