1 # $NetBSD: net_common.sh,v 1.11 2017/01/10 05:55:34 ozaki-r Exp $
3 # Copyright (c) 2016 Internet Initiative Japan Inc.
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
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.
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.
29 # Common utility functions for tests/net
32 HIJACKING="env LD_PRELOAD=/usr/lib/librumphijack.so RUMPHIJACK=sysctl=yes"
39 if [ ! -f $old ]; then
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
54 local flags=${3:-\.\+}
55 local ifname=${4:-\.\+}
57 target=$(echo $target |sed 's/\./\\./g')
58 if [ "$gw" = "" ]; then
61 gw=$(echo $gw |sed 's/\./\\./g')
64 atf_check -s exit:0 -e ignore \
65 -o match:"^$target +$gw +$flags +- +- +.+ +$ifname" \
72 check_route "$1" "" "$2" ""
78 check_route "$1" "$2" "" ""
81 check_route_no_entry()
83 local target=$(echo $1 |sed 's/\./\\./g')
85 atf_check -s exit:0 -e ignore -o not-match:"^$target" \
92 export RUMP_SERVER=${1}
93 rump.ifconfig ${2} inet6 |
94 awk "/fe80/ {sub(/%$2/, \"\"); sub(/\\/[0-9]*/, \"\"); print \$2;}"
103 env RUMP_SERVER=${1} \
104 rump.ifconfig ${2} |awk '/address/ {print $2;}'
107 HTTPD_PID=./.__httpd.pid
112 local backup=$RUMP_SERVER
114 export RUMP_SERVER=$sock
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)
120 export RUMP_SERVER=$backup
128 if [ -f $HTTPD_PID ]; then
129 kill -9 $(cat $HTTPD_PID)
135 BASIC_LIBS="-lrumpnet -lrumpnet_net -lrumpnet_netinet \
136 -lrumpnet_shmif -lrumpdev"
137 FS_LIBS="$BASIC_LIBS -lrumpvfs -lrumpfs_ffs"
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
144 _rump_server_start_common()
152 atf_check -s exit:0 rump_server $libs $sock
154 echo $sock >> $_rump_server_socks
155 $DEBUG && cat $_rump_server_socks
162 local libs="$BASIC_LIBS"
167 for lib in $_libs; do
168 libs="$libs -lrumpnet_$lib"
171 _rump_server_start_common $sock $libs
176 rump_server_fs_start()
180 local libs="$FS_LIBS"
185 for lib in $_libs; do
186 libs="$libs -lrumpnet_$lib"
189 _rump_server_start_common $sock $libs
194 rump_server_add_iface()
199 local backup=$RUMP_SERVER
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
206 echo $sock $ifname >> $_rump_server_ifaces
207 $DEBUG && cat $_rump_server_ifaces
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
217 rump_server_destroy_ifaces()
219 local backup=$RUMP_SERVER
221 $DEBUG && cat $_rump_server_ifaces
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
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
242 atf_check -s exit:0 -o ignore rump.ifconfig
243 done < $_rump_server_ifaces
244 export RUMP_SERVER=$backup
249 rump_server_halt_servers()
251 local backup=$RUMP_SERVER
253 $DEBUG && cat $_rump_server_socks
254 for sock in $(cat $_rump_server_socks); do
255 env RUMP_SERVER=$sock rump.halt
257 export RUMP_SERVER=$backup
262 rump_server_dump_servers()
264 local backup=$RUMP_SERVER
266 $DEBUG && cat $_rump_server_socks
267 for sock in $(cat $_rump_server_socks); do
268 echo "### Dumping $sock"
269 export RUMP_SERVER=$sock
272 # XXX still need hijacking
273 $HIJACKING rump.netstat -i -a
279 export RUMP_SERVER=$backup
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
288 rump_server_dump_buses()
291 if [ ! -f $_rump_server_buses ]; then
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 -
306 rump_server_halt_servers
312 rump_server_dump_servers
313 rump_server_dump_buses