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