Home | History | Annotate | Line # | Download | only in net
net_common.sh revision 1.11
      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 
     32 HIJACKING="env LD_PRELOAD=/usr/lib/librumphijack.so RUMPHIJACK=sysctl=yes"
     33 
     34 extract_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 
     50 check_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 
     69 check_route_flags()
     70 {
     71 
     72 	check_route "$1" "" "$2" ""
     73 }
     74 
     75 check_route_gw()
     76 {
     77 
     78 	check_route "$1" "$2" "" ""
     79 }
     80 
     81 check_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 
     89 get_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 
    100 get_macaddr()
    101 {
    102 
    103 	env RUMP_SERVER=${1} \
    104 	    rump.ifconfig ${2} |awk '/address/ {print $2;}'
    105 }
    106 
    107 HTTPD_PID=./.__httpd.pid
    108 start_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 
    125 stop_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 
    135 BASIC_LIBS="-lrumpnet -lrumpnet_net -lrumpnet_netinet \
    136     -lrumpnet_shmif -lrumpdev"
    137 FS_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 
    158 rump_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 
    176 rump_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 
    194 rump_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 
    217 rump_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 
    249 rump_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 
    262 rump_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 
    288 rump_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 
    303 cleanup()
    304 {
    305 
    306 	rump_server_halt_servers
    307 }
    308 
    309 dump()
    310 {
    311 
    312 	rump_server_dump_servers
    313 	rump_server_dump_buses
    314 }
    315