t_gif.sh revision 1.1 1 #! /usr/bin/atf-sh
2 # $NetBSD: t_gif.sh,v 1.1 2015/11/05 00:02:59 knakahara Exp $
3 #
4 # Copyright (c) 2015 Internet Initiative Japan Inc.
5 # All rights reserved.
6 #
7 # Redistribution and use in source and binary forms, with or without
8 # modification, are permitted provided that the following conditions
9 # are met:
10 # 1. Redistributions of source code must retain the above copyright
11 # notice, this list of conditions and the following disclaimer.
12 # 2. Redistributions in binary form must reproduce the above copyright
13 # notice, this list of conditions and the following disclaimer in the
14 # documentation and/or other materials provided with the distribution.
15 #
16 # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17 # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18 # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 # POSSIBILITY OF SUCH DAMAGE.
27 #
28
29 server="rump_server -v -lrumpnet -lrumpnet_net -lrumpnet_netinet \
30 -lrumpnet_netinet6 -lrumpnet_shmif -lrumpnet_gif"
31
32 SOCK1=unix://commsock1 # for ROUTER1
33 SOCK2=unix://commsock2 # for ROUTER2
34 ROUTER1_LANIP=192.168.1.1
35 ROUTER1_LANNET=192.168.1.0/24
36 ROUTER1_WANIP=10.0.0.1
37 ROUTER1_GIFIP=172.16.1.1
38 ROUTER2_LANIP=192.168.2.1
39 ROUTER2_LANNET=192.168.2.0/24
40 ROUTER2_WANIP=10.0.0.2
41 ROUTER2_GIFIP=172.16.2.1
42
43 ROUTER1_LANIP6=fc00:1::1
44 ROUTER1_LANNET6=fc00:1::/64
45 ROUTER1_WANIP6=fc00::1
46 ROUTER1_GIFIP6=fc00:3::1
47 ROUTER2_LANIP6=fc00:2::1
48 ROUTER2_LANNET6=fc00:2::/64
49 ROUTER2_WANIP6=fc00::2
50 ROUTER2_GIFIP6=fc00:4::1
51
52 TIMEOUT=5
53
54 atf_test_case basicv4overv4 cleanup
55 atf_test_case basicv4overv6 cleanup
56 atf_test_case basicv6overv4 cleanup
57 atf_test_case basicv6overv6 cleanup
58
59 basicv4overv4_head()
60 {
61 atf_set "descr" "Does IPv4 over IPv4 if_gif tests"
62 atf_set "require.progs" "rump_server"
63 }
64
65 basicv4overv6_head()
66 {
67 atf_set "descr" "Does IPv4 over IPv6 if_gif tests"
68 atf_set "require.progs" "rump_server"
69 }
70
71 basicv6overv4_head()
72 {
73 atf_set "descr" "Does IPv6 over IPv4 if_gif tests"
74 atf_set "require.progs" "rump_server"
75 }
76
77 basicv6overv6_head()
78 {
79 atf_set "descr" "Does IPv6 over IPv6 if_gif tests"
80 atf_set "require.progs" "rump_server"
81 }
82
83 setup_router()
84 {
85 sock=${1}
86 lan=${2}
87 lan_mode=${3}
88 wan=${4}
89 wan_mode=${5}
90
91 export RUMP_SERVER=${sock}
92 atf_check -s exit:0 rump.ifconfig shmif0 create
93 atf_check -s exit:0 rump.ifconfig shmif0 linkstr bus0
94 if [ ${lan_mode} = "ipv6" ]; then
95 atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${lan}
96 else
97 atf_check -s exit:0 rump.ifconfig shmif0 inet ${lan} netmask 0xffffff00
98 fi
99 atf_check -s exit:0 rump.ifconfig shmif0 up
100 rump.ifconfig shmif0
101
102 atf_check -s exit:0 rump.ifconfig shmif1 create
103 atf_check -s exit:0 rump.ifconfig shmif1 linkstr bus1
104 if [ ${wan_mode} = "ipv6" ]; then
105 atf_check -s exit:0 rump.ifconfig shmif1 inet6 ${wan}
106 else
107 atf_check -s exit:0 rump.ifconfig shmif1 inet ${wan} netmask 0xff000000
108 fi
109 atf_check -s exit:0 rump.ifconfig shmif1 up
110 rump.ifconfig shmif1
111 }
112
113 test_router()
114 {
115 sock=${1}
116 lan=${2}
117 lan_mode=${3}
118 wan=${4}
119 wan_mode=${5}
120
121 export RUMP_SERVER=${sock}
122 atf_check -s exit:0 -o match:shmif0 rump.ifconfig
123 if [ ${lan_mode} = "ipv6" ]; then
124 atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${lan}
125 else
126 atf_check -s exit:0 -o ignore rump.ping -n -c 1 -w $TIMEOUT ${lan}
127 fi
128
129 atf_check -s exit:0 -o match:shmif1 rump.ifconfig
130 if [ ${wan_mode} = "ipv6" ]; then
131 atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${wan}
132 else
133 atf_check -s exit:0 -o ignore rump.ping -n -c 1 -w $TIMEOUT ${wan}
134 fi
135 }
136
137 setup()
138 {
139 inner=${1}
140 outer=${2}
141
142 atf_check -s exit:0 ${server} $SOCK1
143 atf_check -s exit:0 ${server} $SOCK2
144
145 router1_lan=""
146 router1_lan_mode=""
147 router2_lan=""
148 router2_lan_mode=""
149 if [ ${inner} = "ipv6" ]; then
150 router1_lan=$ROUTER1_LANIP6
151 router1_lan_mode="ipv6"
152 router2_lan=$ROUTER2_LANIP6
153 router2_lan_mode="ipv6"
154 else
155 router1_lan=$ROUTER1_LANIP
156 router1_lan_mode="ipv4"
157 router2_lan=$ROUTER2_LANIP
158 router2_lan_mode="ipv4"
159 fi
160
161 if [ ${outer} = "ipv6" ]; then
162 setup_router $SOCK1 ${router1_lan} ${router1_lan_mode} \
163 $ROUTER1_WANIP6 ipv6
164 setup_router $SOCK2 ${router2_lan} ${router2_lan_mode} \
165 $ROUTER2_WANIP6 ipv6
166 else
167 setup_router $SOCK1 ${router1_lan} ${router1_lan_mode} \
168 $ROUTER1_WANIP ipv4
169 setup_router $SOCK2 ${router2_lan} ${router2_lan_mode} \
170 $ROUTER2_WANIP ipv4
171 fi
172 }
173
174 test_setup()
175 {
176 inner=${1}
177 outer=${2}
178
179 router1_lan=""
180 router1_lan_mode=""
181 router2_lan=""
182 router2_lan_mode=""
183 if [ ${inner} = "ipv6" ]; then
184 router1_lan=$ROUTER1_LANIP6
185 router1_lan_mode="ipv6"
186 router2_lan=$ROUTER2_LANIP6
187 router2_lan_mode="ipv6"
188 else
189 router1_lan=$ROUTER1_LANIP
190 router1_lan_mode="ipv4"
191 router2_lan=$ROUTER2_LANIP
192 router2_lan_mode="ipv4"
193 fi
194 if [ ${outer} = "ipv6" ]; then
195 test_router $SOCK1 ${router1_lan} ${router1_lan_mode} \
196 $ROUTER1_WANIP6 ipv6
197 test_router $SOCK2 ${router2_lan} ${router2_lan_mode} \
198 $ROUTER2_WANIP6 ipv6
199 else
200 test_router $SOCK1 ${router1_lan} ${router1_lan_mode} \
201 $ROUTER1_WANIP ipv4
202 test_router $SOCK2 ${router2_lan} ${router2_lan_mode} \
203 $ROUTER2_WANIP ipv4
204 fi
205 }
206
207 setup_if_gif()
208 {
209 sock=${1}
210 addr=${2}
211 remote=${3}
212 inner=${4}
213 src=${5}
214 dst=${6}
215 peernet=${7}
216
217 export RUMP_SERVER=${sock}
218 atf_check -s exit:0 rump.ifconfig gif0 create
219 atf_check -s exit:0 rump.ifconfig gif0 tunnel ${src} ${dst}
220 if [ ${inner} = "ipv6" ]; then
221 atf_check -s exit:0 rump.ifconfig gif0 inet6 ${addr}/128 ${remote}
222 atf_check -s exit:0 -o ignore rump.route add -inet6 ${peernet} ${addr}
223 else
224 atf_check -s exit:0 rump.ifconfig gif0 inet ${addr}/32 ${remote}
225 atf_check -s exit:0 -o ignore rump.route add -inet ${peernet} ${addr}
226 fi
227
228 rump.ifconfig gif0
229 rump.route -nL show
230 }
231
232 setup_tunnel()
233 {
234 inner=${1}
235 outer=${2}
236
237 addr=""
238 remote=""
239 src=""
240 dst=""
241 peernet=""
242
243 if [ ${inner} = "ipv6" ]; then
244 addr=$ROUTER1_GIFIP6
245 remote=$ROUTER2_GIFIP6
246 peernet=$ROUTER2_LANNET6
247 else
248 addr=$ROUTER1_GIFIP
249 remote=$ROUTER2_GIFIP
250 peernet=$ROUTER2_LANNET
251 fi
252 if [ ${outer} = "ipv6" ]; then
253 src=$ROUTER1_WANIP6
254 dst=$ROUTER2_WANIP6
255 else
256 src=$ROUTER1_WANIP
257 dst=$ROUTER2_WANIP
258 fi
259 setup_if_gif $SOCK1 ${addr} ${remote} ${inner} \
260 ${src} ${dst} ${peernet}
261
262 if [ $inner = "ipv6" ]; then
263 addr=$ROUTER2_GIFIP6
264 remote=$ROUTER1_GIFIP6
265 peernet=$ROUTER1_LANNET6
266 else
267 addr=$ROUTER2_GIFIP
268 remote=$ROUTER1_GIFIP
269 peernet=$ROUTER1_LANNET
270 fi
271 if [ $outer = "ipv6" ]; then
272 src=$ROUTER2_WANIP6
273 dst=$ROUTER1_WANIP6
274 else
275 src=$ROUTER2_WANIP
276 dst=$ROUTER1_WANIP
277 fi
278 setup_if_gif $SOCK2 ${addr} ${remote} ${inner} \
279 ${src} ${dst} ${peernet}
280 }
281
282 test_setup_tunnel()
283 {
284 mode=${1}
285
286 peernet=""
287 opt=""
288 if [ ${inner} = "ipv6" ]; then
289 peernet=$ROUTER2_LANNET6
290 opt="-inet6"
291 else
292 peernet=$ROUTER2_LANNET
293 opt="-inet"
294 fi
295 export RUMP_SERVER=$SOCK1
296 atf_check -s exit:0 -o match:gif0 rump.ifconfig
297 atf_check -s exit:0 -o match:gif0 rump.route -nL get ${opt} ${peernet}
298
299 if [ ${inner} = "ipv6" ]; then
300 peernet=$ROUTER1_LANNET6
301 opt="-inet6"
302 else
303 peernet=$ROUTER1_LANNET
304 opt="-inet"
305 fi
306 export RUMP_SERVER=$SOCK2
307 atf_check -s exit:0 -o match:gif0 rump.ifconfig
308 atf_check -s exit:0 -o match:gif0 rump.route -nL get ${opt} ${peernet}
309 }
310
311 teardown_tunnel()
312 {
313 export RUMP_SERVER=$SOCK1
314 atf_check -s exit:0 rump.ifconfig gif0 deletetunnel
315 atf_check -s exit:0 rump.ifconfig gif0 destroy
316
317 export RUMP_SERVER=$SOCK2
318 atf_check -s exit:0 rump.ifconfig gif0 deletetunnel
319 atf_check -s exit:0 rump.ifconfig gif0 destroy
320 }
321
322 cleanup()
323 {
324 env RUMP_SERVER=$SOCK1 rump.halt
325 env RUMP_SERVER=$SOCK2 rump.halt
326 }
327
328 dump_bus()
329 {
330 /usr/bin/shmif_dumpbus -p - bus0 2>/dev/null| /usr/sbin/tcpdump -n -e -r -
331 /usr/bin/shmif_dumpbus -p - bus1 2>/dev/null| /usr/sbin/tcpdump -n -e -r -
332 }
333
334 test_ping_failure()
335 {
336 mode=$1
337
338 export RUMP_SERVER=$SOCK1
339 if [ ${mode} = "ipv6" ]; then
340 atf_check -s not-exit:0 -o ignore -e ignore \
341 rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER1_LANIP6 \
342 $ROUTER2_LANIP6
343 else
344 atf_check -s not-exit:0 -o ignore -e ignore \
345 rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER1_LANIP \
346 $ROUTER2_LANIP
347 fi
348
349 export RUMP_SERVER=$SOCK2
350 if [ ${mode} = "ipv6" ]; then
351 atf_check -s not-exit:0 -o ignore -e ignore \
352 rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER2_LANIP6 \
353 $ROUTER1_LANIP6
354 else
355 atf_check -s not-exit:0 -o ignore -e ignore \
356 rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER1_LANIP \
357 $ROUTER2_LANIP
358 fi
359 }
360
361 test_ping_success()
362 {
363 mode=$1
364
365 export RUMP_SERVER=$SOCK1
366 rump.ifconfig -v gif0
367 if [ ${mode} = "ipv6" ]; then
368 # XXX
369 # rump.ping6 rarely fails with the message that
370 # "failed to get receiving hop limit".
371 # This is a known issue being analyzed.
372 atf_check -s exit:0 -o ignore \
373 rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER1_LANIP6 \
374 $ROUTER2_LANIP6
375 else
376 atf_check -s exit:0 -o ignore \
377 rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER1_LANIP \
378 $ROUTER2_LANIP
379 fi
380 rump.ifconfig -v gif0
381
382 export RUMP_SERVER=$SOCK2
383 rump.ifconfig -v gif0
384 if [ ${mode} = "ipv6" ]; then
385 atf_check -s exit:0 -o ignore \
386 rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER2_LANIP6 \
387 $ROUTER1_LANIP6
388 else
389 atf_check -s exit:0 -o ignore \
390 rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER2_LANIP \
391 $ROUTER1_LANIP
392 fi
393 rump.ifconfig -v gif0
394 }
395
396 basicv4overv4_body()
397 {
398 setup ipv4 ipv4
399 test_setup ipv4 ipv4
400
401 # Enable once PR kern/49219 is fixed
402 #test_ping_failure
403
404 setup_tunnel ipv4 ipv4
405 sleep 1
406 test_setup_tunnel ipv4
407 test_ping_success ipv4
408
409 teardown_tunnel
410 test_ping_failure ipv4
411 }
412
413 basicv4overv6_body()
414 {
415 setup ipv4 ipv6
416 test_setup ipv4 ipv6
417
418 # Enable once PR kern/49219 is fixed
419 #test_ping_failure
420
421 setup_tunnel ipv4 ipv6
422 sleep 1
423 test_setup_tunnel ipv4
424 test_ping_success ipv4
425
426 teardown_tunnel
427 test_ping_failure ipv4
428 }
429
430 basicv6overv4_body()
431 {
432 setup ipv6 ipv4
433 test_setup ipv6 ipv4
434
435 # Enable once PR kern/49219 is fixed
436 #test_ping_failure
437
438 setup_tunnel ipv6 ipv4
439 sleep 1
440 test_setup_tunnel ipv6
441 test_ping_success ipv6
442
443 teardown_tunnel
444 test_ping_failure ipv6
445 }
446
447 basicv6overv6_body()
448 {
449 setup ipv6 ipv6
450 test_setup ipv6 ipv6
451
452 # Enable once PR kern/49219 is fixed
453 #test_ping_failure
454
455 setup_tunnel ipv6 ipv6
456 sleep 1
457 test_setup_tunnel ipv6
458 test_ping_success ipv6
459
460 teardown_tunnel
461 test_ping_failure ipv6
462 }
463
464 basicv4overv4_cleanup()
465 {
466 dump_bus
467 cleanup
468 }
469
470 basicv4overv6_cleanup()
471 {
472 dump_bus
473 cleanup
474 }
475
476 basicv6overv4_cleanup()
477 {
478 dump_bus
479 cleanup
480 }
481
482 basicv6overv6_cleanup()
483 {
484 dump_bus
485 cleanup
486 }
487
488 atf_init_test_cases()
489 {
490 atf_add_test_case basicv4overv4
491 atf_add_test_case basicv4overv6
492 atf_add_test_case basicv6overv4
493 atf_add_test_case basicv6overv6
494 }
495