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