]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - contrib/netbsd-tests/net/net_common.sh
MFC r319637:
[FreeBSD/stable/10.git] / contrib / netbsd-tests / net / net_common.sh
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 }