t_ipsec.sh revision 1.3 1 # $NetBSD: t_ipsec.sh,v 1.3 2018/02/01 05:22:01 ozaki-r Exp $
2 #
3 # Copyright (c) 2017 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 SOCK1=unix://commsock1 # for ROUTER1
29 SOCK2=unix://commsock2 # for ROUTER2
30 ROUTER1_LANIP=192.168.1.1
31 ROUTER1_LANNET=192.168.1.0/24
32 ROUTER1_WANIP=10.0.0.1
33 ROUTER1_IPSECIP=172.16.1.1
34 ROUTER1_WANIP_DUMMY=10.0.0.11
35 ROUTER1_IPSECIP_DUMMY=172.16.11.1
36 ROUTER1_IPSECIP_RECURSIVE1=172.16.101.1
37 ROUTER1_IPSECIP_RECURSIVE2=172.16.201.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_IPSECIP=172.16.2.1
42 ROUTER2_WANIP_DUMMY=10.0.0.12
43 ROUTER2_IPSECIP_DUMMY=172.16.12.1
44 ROUTER2_IPSECIP_RECURSIVE1=172.16.102.1
45 ROUTER2_IPSECIP_RECURSIVE2=172.16.202.1
46
47 ROUTER1_LANIP6=fc00:1::1
48 ROUTER1_LANNET6=fc00:1::/64
49 ROUTER1_WANIP6=fc00::1
50 ROUTER1_IPSECIP6=fc00:3::1
51 ROUTER1_WANIP6_DUMMY=fc00::11
52 ROUTER1_IPSECIP6_DUMMY=fc00:13::1
53 ROUTER1_IPSECIP6_RECURSIVE1=fc00:103::1
54 ROUTER1_IPSECIP6_RECURSIVE2=fc00:203::1
55 ROUTER2_LANIP6=fc00:2::1
56 ROUTER2_LANNET6=fc00:2::/64
57 ROUTER2_WANIP6=fc00::2
58 ROUTER2_IPSECIP6=fc00:4::1
59 ROUTER2_WANIP6_DUMMY=fc00::12
60 ROUTER2_IPSECIP6_DUMMY=fc00:14::1
61 ROUTER2_IPSECIP6_RECURSIVE1=fc00:104::1
62 ROUTER2_IPSECIP6_RECURSIVE2=fc00:204::1
63
64 DEBUG=${DEBUG:-false}
65 TIMEOUT=7
66
67 atf_test_case ipsecif_create_destroy cleanup
68 ipsecif_create_destroy_head()
69 {
70
71 atf_set "descr" "Test creating/destroying gif interfaces"
72 atf_set "require.progs" "rump_server"
73 }
74
75 ipsecif_create_destroy_body()
76 {
77
78 rump_server_start $SOCK1 ipsec
79
80 test_create_destroy_common $SOCK1 ipsec0
81 }
82
83 ipsecif_create_destroy_cleanup()
84 {
85
86 $DEBUG && dump
87 cleanup
88 }
89
90 setup_router()
91 {
92 local sock=${1}
93 local lan=${2}
94 local lan_mode=${3}
95 local wan=${4}
96 local wan_mode=${5}
97
98 rump_server_add_iface $sock shmif0 bus0
99 rump_server_add_iface $sock shmif1 bus1
100
101 export RUMP_SERVER=${sock}
102 if [ ${lan_mode} = "ipv6" ]; then
103 atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${lan}
104 else
105 atf_check -s exit:0 rump.ifconfig shmif0 inet ${lan} netmask 0xffffff00
106 fi
107 atf_check -s exit:0 rump.ifconfig shmif0 up
108 rump.ifconfig shmif0
109
110 if [ ${wan_mode} = "ipv6" ]; then
111 atf_check -s exit:0 rump.ifconfig shmif1 inet6 ${wan}
112 else
113 atf_check -s exit:0 rump.ifconfig shmif1 inet ${wan} netmask 0xff000000
114 fi
115 atf_check -s exit:0 rump.ifconfig shmif1 up
116 rump.ifconfig shmif1
117 unset RUMP_SERVER
118 }
119
120 test_router()
121 {
122 local sock=${1}
123 local lan=${2}
124 local lan_mode=${3}
125 local wan=${4}
126 local wan_mode=${5}
127
128 export RUMP_SERVER=${sock}
129 atf_check -s exit:0 -o match:shmif0 rump.ifconfig
130 if [ ${lan_mode} = "ipv6" ]; then
131 atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${lan}
132 else
133 atf_check -s exit:0 -o ignore rump.ping -n -c 1 -w $TIMEOUT ${lan}
134 fi
135
136 atf_check -s exit:0 -o match:shmif1 rump.ifconfig
137 if [ ${wan_mode} = "ipv6" ]; then
138 atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${wan}
139 else
140 atf_check -s exit:0 -o ignore rump.ping -n -c 1 -w $TIMEOUT ${wan}
141 fi
142 unset RUMP_SERVER
143 }
144
145 setup()
146 {
147 local inner=${1}
148 local outer=${2}
149
150 rump_server_crypto_start $SOCK1 netipsec netinet6 ipsec
151 rump_server_crypto_start $SOCK2 netipsec netinet6 ipsec
152
153 router1_lan=""
154 router1_lan_mode=""
155 router2_lan=""
156 router2_lan_mode=""
157 if [ ${inner} = "ipv6" ]; then
158 router1_lan=$ROUTER1_LANIP6
159 router1_lan_mode="ipv6"
160 router2_lan=$ROUTER2_LANIP6
161 router2_lan_mode="ipv6"
162 else
163 router1_lan=$ROUTER1_LANIP
164 router1_lan_mode="ipv4"
165 router2_lan=$ROUTER2_LANIP
166 router2_lan_mode="ipv4"
167 fi
168
169 if [ ${outer} = "ipv6" ]; then
170 setup_router $SOCK1 ${router1_lan} ${router1_lan_mode} \
171 $ROUTER1_WANIP6 ipv6
172 setup_router $SOCK2 ${router2_lan} ${router2_lan_mode} \
173 $ROUTER2_WANIP6 ipv6
174 else
175 setup_router $SOCK1 ${router1_lan} ${router1_lan_mode} \
176 $ROUTER1_WANIP ipv4
177 setup_router $SOCK2 ${router2_lan} ${router2_lan_mode} \
178 $ROUTER2_WANIP ipv4
179 fi
180 }
181
182 test_setup()
183 {
184 local inner=${1}
185 local outer=${2}
186
187 local router1_lan=""
188 local router1_lan_mode=""
189 local router2_lan=""
190 local router2_lan_mode=""
191 if [ ${inner} = "ipv6" ]; then
192 router1_lan=$ROUTER1_LANIP6
193 router1_lan_mode="ipv6"
194 router2_lan=$ROUTER2_LANIP6
195 router2_lan_mode="ipv6"
196 else
197 router1_lan=$ROUTER1_LANIP
198 router1_lan_mode="ipv4"
199 router2_lan=$ROUTER2_LANIP
200 router2_lan_mode="ipv4"
201 fi
202 if [ ${outer} = "ipv6" ]; then
203 test_router $SOCK1 ${router1_lan} ${router1_lan_mode} \
204 $ROUTER1_WANIP6 ipv6
205 test_router $SOCK2 ${router2_lan} ${router2_lan_mode} \
206 $ROUTER2_WANIP6 ipv6
207 else
208 test_router $SOCK1 ${router1_lan} ${router1_lan_mode} \
209 $ROUTER1_WANIP ipv4
210 test_router $SOCK2 ${router2_lan} ${router2_lan_mode} \
211 $ROUTER2_WANIP ipv4
212 fi
213 }
214
215 get_if_ipsec_unique()
216 {
217 local sock=${1}
218 local src=${2}
219 local proto=${3}
220 local unique=""
221
222 export RUMP_SERVER=${sock}
223 unique=`$HIJACKING setkey -DP | grep -A2 "^${src}.*(${proto})$" | grep unique | sed 's/.*unique#//'`
224 unset RUMP_SERVER
225
226 echo $unique
227 }
228
229 setup_if_ipsec()
230 {
231 local sock=${1}
232 local addr=${2}
233 local remote=${3}
234 local inner=${4}
235 local src=${5}
236 local dst=${6}
237 local peernet=${7}
238
239 export RUMP_SERVER=${sock}
240 atf_check -s exit:0 rump.ifconfig ipsec0 create
241 atf_check -s exit:0 rump.ifconfig ipsec0 tunnel ${src} ${dst}
242 if [ ${inner} = "ipv6" ]; then
243 atf_check -s exit:0 rump.ifconfig ipsec0 inet6 ${addr}/128 ${remote}
244 atf_check -s exit:0 -o ignore rump.route add -inet6 ${peernet} ${addr}
245 else
246 atf_check -s exit:0 rump.ifconfig ipsec0 inet ${addr}/32 ${remote}
247 atf_check -s exit:0 -o ignore rump.route add -inet ${peernet} ${addr}
248 fi
249
250 rump.ifconfig ipsec0
251 rump.route -nL show
252 }
253
254 setup_if_ipsec_sa()
255 {
256 local sock=${1}
257 local src=${2}
258 local dst=${3}
259 local mode=${4}
260 local proto=${5}
261 local algo=${6}
262 local dir=${7}
263
264 local tmpfile=./tmp
265 local inunique=""
266 local outunique=""
267 local inid=""
268 local outid=""
269 local algo_args="$(generate_algo_args $proto $algo)"
270
271 inunique=`get_if_ipsec_unique ${sock} ${dst} ${mode}`
272 outunique=`get_if_ipsec_unique ${sock} ${src} ${mode}`
273
274 if [ ${dir} = "1to2" ] ; then
275 if [ ${mode} = "ipv6" ] ; then
276 inid="10010"
277 outid="10011"
278 else
279 inid="10000"
280 outid="10001"
281 fi
282 else
283 if [ ${mode} = "ipv6" ] ; then
284 inid="10011"
285 outid="10010"
286 else
287 inid="10001"
288 outid="10000"
289 fi
290 fi
291
292 cat > $tmpfile <<-EOF
293 add $dst $src $proto $inid -u $inunique $algo_args;
294 add $src $dst $proto $outid -u $outunique $algo_args;
295 EOF
296 $DEBUG && cat $tmpfile
297 export RUMP_SERVER=$sock
298 atf_check -s exit:0 -o empty $HIJACKING setkey -c < $tmpfile
299 $DEBUG && $HIJACKING setkey -D
300 $DEBUG && $HIJACKING setkey -DP
301 unset RUMP_SERVER
302 }
303
304 setup_tunnel()
305 {
306 local inner=${1}
307 local outer=${2}
308 local proto=${3}
309 local algo=${4}
310
311 local addr=""
312 local remote=""
313 local src=""
314 local dst=""
315 local peernet=""
316
317 if [ ${inner} = "ipv6" ]; then
318 addr=$ROUTER1_IPSECIP6
319 remote=$ROUTER2_IPSECIP6
320 peernet=$ROUTER2_LANNET6
321 else
322 addr=$ROUTER1_IPSECIP
323 remote=$ROUTER2_IPSECIP
324 peernet=$ROUTER2_LANNET
325 fi
326 if [ ${outer} = "ipv6" ]; then
327 src=$ROUTER1_WANIP6
328 dst=$ROUTER2_WANIP6
329 else
330 src=$ROUTER1_WANIP
331 dst=$ROUTER2_WANIP
332 fi
333 setup_if_ipsec $SOCK1 ${addr} ${remote} ${inner} \
334 ${src} ${dst} ${peernet}
335
336 if [ $inner = "ipv6" -a $outer = "ipv4" ]; then
337 setup_if_ipsec_sa $SOCK1 ${src} ${dst} ${outer} ${proto} ${algo} "1to2"
338 fi
339 setup_if_ipsec_sa $SOCK1 ${src} ${dst} ${inner} ${proto} ${algo} "1to2"
340
341 if [ $inner = "ipv6" ]; then
342 addr=$ROUTER2_IPSECIP6
343 remote=$ROUTER1_IPSECIP6
344 peernet=$ROUTER1_LANNET6
345 else
346 addr=$ROUTER2_IPSECIP
347 remote=$ROUTER1_IPSECIP
348 peernet=$ROUTER1_LANNET
349 fi
350 if [ $outer = "ipv6" ]; then
351 src=$ROUTER2_WANIP6
352 dst=$ROUTER1_WANIP6
353 else
354 src=$ROUTER2_WANIP
355 dst=$ROUTER1_WANIP
356 fi
357 setup_if_ipsec $SOCK2 ${addr} ${remote} ${inner} \
358 ${src} ${dst} ${peernet} ${proto} ${algo}
359 if [ $inner = "ipv6" -a $outer = "ipv4" ]; then
360 setup_if_ipsec_sa $SOCK2 ${src} ${dst} ${outer} ${proto} ${algo} "2to1"
361 fi
362 setup_if_ipsec_sa $SOCK2 ${src} ${dst} ${inner} ${proto} ${algo} "2to1"
363 }
364
365 test_setup_tunnel()
366 {
367 local mode=${1}
368
369 local peernet=""
370 local opt=""
371 if [ ${mode} = "ipv6" ]; then
372 peernet=$ROUTER2_LANNET6
373 opt="-inet6"
374 else
375 peernet=$ROUTER2_LANNET
376 opt="-inet"
377 fi
378 export RUMP_SERVER=$SOCK1
379 atf_check -s exit:0 -o match:ipsec0 rump.ifconfig
380 atf_check -s exit:0 -o match:ipsec0 rump.route -nL get ${opt} ${peernet}
381
382 if [ ${mode} = "ipv6" ]; then
383 peernet=$ROUTER1_LANNET6
384 opt="-inet6"
385 else
386 peernet=$ROUTER1_LANNET
387 opt="-inet"
388 fi
389 export RUMP_SERVER=$SOCK2
390 atf_check -s exit:0 -o match:ipsec0 rump.ifconfig
391 atf_check -s exit:0 -o match:ipsec0 rump.route -nL get ${opt} ${peernet}
392 }
393
394 teardown_tunnel()
395 {
396 export RUMP_SERVER=$SOCK1
397 atf_check -s exit:0 rump.ifconfig ipsec0 deletetunnel
398 atf_check -s exit:0 rump.ifconfig ipsec0 destroy
399 $HIJACKING setkey -F
400
401 export RUMP_SERVER=$SOCK2
402 atf_check -s exit:0 rump.ifconfig ipsec0 deletetunnel
403 atf_check -s exit:0 rump.ifconfig ipsec0 destroy
404 $HIJACKING setkey -F
405
406 unset RUMP_SERVER
407 }
408
409 setup_dummy_if_ipsec()
410 {
411 local sock=${1}
412 local addr=${2}
413 local remote=${3}
414 local inner=${4}
415 local src=${5}
416 local dst=${6}
417
418 export RUMP_SERVER=${sock}
419 atf_check -s exit:0 rump.ifconfig ipsec1 create
420 atf_check -s exit:0 rump.ifconfig ipsec1 tunnel ${src} ${dst}
421 if [ ${inner} = "ipv6" ]; then
422 atf_check -s exit:0 rump.ifconfig ipsec1 inet6 ${addr}/128 ${remote}
423 else
424 atf_check -s exit:0 rump.ifconfig ipsec1 inet ${addr}/32 ${remote}
425 fi
426
427 rump.ifconfig ipsec1
428 unset RUMP_SERVER
429 }
430
431 setup_dummy_if_ipsec_sa()
432 {
433 local sock=${1}
434 local src=${2}
435 local dst=${3}
436 local mode=${4}
437 local proto=${5}
438 local algo=${6}
439 local dir=${7}
440
441 local tmpfile=./tmp
442 local inunique=""
443 local outunique=""
444 local inid=""
445 local outid=""
446 local algo_args="$(generate_algo_args $proto $algo)"
447
448 inunique=`get_if_ipsec_unique ${sock} ${dst} ${mode}`
449 outunique=`get_if_ipsec_unique ${sock} ${src} ${mode}`
450
451 if [ ${dir} = "1to2" ] ; then
452 inid="20000"
453 outid="20001"
454 else
455 inid="20001"
456 outid="20000"
457 fi
458
459 cat > $tmpfile <<-EOF
460 add $dst $src $proto $inid -u $inunique $algo_args;
461 add $src $dst $proto $outid -u $outunique $algo_args;
462 EOF
463 $DEBUG && cat $tmpfile
464 export RUMP_SERVER=$sock
465 atf_check -s exit:0 -o empty $HIJACKING setkey -c < $tmpfile
466 $DEBUG && $HIJACKING setkey -D
467 $DEBUG && $HIJACKING setkey -DP
468 unset RUMP_SERVER
469 }
470
471 setup_dummy_tunnel()
472 {
473 local inner=${1}
474 local outer=${2}
475 local proto=${3}
476 local algo=${4}
477
478 local addr=""
479 local remote=""
480 local src=""
481 local dst=""
482
483 if [ ${inner} = "ipv6" ]; then
484 addr=$ROUTER1_IPSECIP6_DUMMY
485 remote=$ROUTER2_IPSECIP6_DUMMY
486 else
487 addr=$ROUTER1_IPSECIP_DUMMY
488 remote=$ROUTER2_IPSECIP_DUMMY
489 fi
490 if [ ${outer} = "ipv6" ]; then
491 src=$ROUTER1_WANIP6_DUMMY
492 dst=$ROUTER2_WANIP6_DUMMY
493 else
494 src=$ROUTER1_WANIP_DUMMY
495 dst=$ROUTER2_WANIP_DUMMY
496 fi
497 setup_dummy_if_ipsec $SOCK1 ${addr} ${remote} ${inner} \
498 ${src} ${dst} ${proto} ${algo} "1to2"
499 setup_dummy_if_ipsec_sa $SOCK1 ${src} ${dst} ${inner} ${proto} ${algo} "1to2"
500
501 if [ $inner = "ipv6" ]; then
502 addr=$ROUTER2_IPSECIP6_DUMMY
503 remote=$ROUTER1_IPSECIP6_DUMMY
504 else
505 addr=$ROUTER2_IPSECIP_DUMMY
506 remote=$ROUTER1_IPSECIP_DUMMY
507 fi
508 if [ $outer = "ipv6" ]; then
509 src=$ROUTER2_WANIP6_DUMMY
510 dst=$ROUTER1_WANIP6_DUMMY
511 else
512 src=$ROUTER2_WANIP_DUMMY
513 dst=$ROUTER1_WANIP_DUMMY
514 fi
515 setup_dummy_if_ipsec $SOCK2 ${addr} ${remote} ${inner} \
516 ${src} ${dst} ${proto} ${algo} "2to1"
517 setup_dummy_if_ipsec_sa $SOCK2 ${src} ${dst} ${inner} ${proto} ${algo} "2to1"
518 }
519
520 test_setup_dummy_tunnel()
521 {
522 export RUMP_SERVER=$SOCK1
523 atf_check -s exit:0 -o match:ipsec1 rump.ifconfig
524
525 export RUMP_SERVER=$SOCK2
526 atf_check -s exit:0 -o match:ipsec1 rump.ifconfig
527
528 unset RUMP_SERVER
529 }
530
531 teardown_dummy_tunnel()
532 {
533 export RUMP_SERVER=$SOCK1
534 atf_check -s exit:0 rump.ifconfig ipsec1 deletetunnel
535 atf_check -s exit:0 rump.ifconfig ipsec1 destroy
536
537 export RUMP_SERVER=$SOCK2
538 atf_check -s exit:0 rump.ifconfig ipsec1 deletetunnel
539 atf_check -s exit:0 rump.ifconfig ipsec1 destroy
540
541 unset RUMP_SERVER
542 }
543
544 setup_recursive_if_ipsec()
545 {
546 local sock=${1}
547 local ipsec=${2}
548 local addr=${3}
549 local remote=${4}
550 local inner=${5}
551 local src=${6}
552 local dst=${7}
553 local proto=${8}
554 local algo=${9}
555 local dir=${10}
556
557 export RUMP_SERVER=${sock}
558 atf_check -s exit:0 rump.ifconfig ${ipsec} create
559 atf_check -s exit:0 rump.ifconfig ${ipsec} tunnel ${src} ${dst}
560 if [ ${inner} = "ipv6" ]; then
561 atf_check -s exit:0 rump.ifconfig ${ipsec} inet6 ${addr}/128 ${remote}
562 else
563 atf_check -s exit:0 rump.ifconfig ${ipsec} inet ${addr}/32 ${remote}
564 fi
565 setup_if_ipsec_sa $sock ${src} ${dst} ${inner} ${proto} ${algo} ${dir}
566
567 export RUMP_SERVER=${sock}
568 rump.ifconfig ${ipsec}
569 unset RUMP_SERVER
570 }
571
572 # test in ROUTER1 only
573 setup_recursive_tunnels()
574 {
575 local mode=${1}
576 local proto=${2}
577 local algo=${3}
578
579 local addr=""
580 local remote=""
581 local src=""
582 local dst=""
583
584 if [ ${mode} = "ipv6" ]; then
585 addr=$ROUTER1_IPSECIP6_RECURSIVE1
586 remote=$ROUTER2_IPSECIP6_RECURSIVE1
587 src=$ROUTER1_IPSECIP6
588 dst=$ROUTER2_IPSECIP6
589 else
590 addr=$ROUTER1_IPSECIP_RECURSIVE1
591 remote=$ROUTER2_IPSECIP_RECURSIVE1
592 src=$ROUTER1_IPSECIP
593 dst=$ROUTER2_IPSECIP
594 fi
595 setup_recursive_if_ipsec $SOCK1 ipsec1 ${addr} ${remote} ${mode} \
596 ${src} ${dst} ${proto} ${algo} "1to2"
597
598 if [ ${mode} = "ipv6" ]; then
599 addr=$ROUTER1_IPSECIP6_RECURSIVE2
600 remote=$ROUTER2_IPSECIP6_RECURSIVE2
601 src=$ROUTER1_IPSECIP6_RECURSIVE1
602 dst=$ROUTER2_IPSECIP6_RECURSIVE1
603 else
604 addr=$ROUTER1_IPSECIP_RECURSIVE2
605 remote=$ROUTER2_IPSECIP_RECURSIVE2
606 src=$ROUTER1_IPSECIP_RECURSIVE1
607 dst=$ROUTER2_IPSECIP_RECURSIVE1
608 fi
609 setup_recursive_if_ipsec $SOCK1 ipsec2 ${addr} ${remote} ${mode} \
610 ${src} ${dst} ${proto} ${algo} "1to2"
611 }
612
613 # test in router1 only
614 test_recursive_check()
615 {
616 local mode=$1
617
618 export RUMP_SERVER=$SOCK1
619 if [ ${mode} = "ipv6" ]; then
620 atf_check -s not-exit:0 -o ignore -e ignore \
621 rump.ping6 -n -X $TIMEOUT -c 1 $ROUTER2_IPSECIP6_RECURSIVE2
622 else
623 atf_check -s not-exit:0 -o ignore -e ignore \
624 rump.ping -n -w $TIMEOUT -c 1 $ROUTER2_IPSECIP_RECURSIVE2
625 fi
626
627 atf_check -o match:'ipsec0: recursively called too many times' \
628 -x "$HIJACKING dmesg"
629
630 $HIJACKING dmesg
631
632 unset RUMP_SERVER
633 }
634
635 teardown_recursive_tunnels()
636 {
637 export RUMP_SERVER=$SOCK1
638 atf_check -s exit:0 rump.ifconfig ipsec1 deletetunnel
639 atf_check -s exit:0 rump.ifconfig ipsec1 destroy
640 atf_check -s exit:0 rump.ifconfig ipsec2 deletetunnel
641 atf_check -s exit:0 rump.ifconfig ipsec2 destroy
642 unset RUMP_SERVER
643 }
644
645 test_ping_failure()
646 {
647 local mode=$1
648
649 export RUMP_SERVER=$SOCK1
650 if [ ${mode} = "ipv6" ]; then
651 atf_check -s not-exit:0 -o ignore -e ignore \
652 rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER1_LANIP6 \
653 $ROUTER2_LANIP6
654 else
655 atf_check -s not-exit:0 -o ignore -e ignore \
656 rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER1_LANIP \
657 $ROUTER2_LANIP
658 fi
659
660 export RUMP_SERVER=$SOCK2
661 if [ ${mode} = "ipv6" ]; then
662 atf_check -s not-exit:0 -o ignore -e ignore \
663 rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER2_LANIP6 \
664 $ROUTER1_LANIP6
665 else
666 atf_check -s not-exit:0 -o ignore -e ignore \
667 rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER1_LANIP \
668 $ROUTER2_LANIP
669 fi
670
671 unset RUMP_SERVER
672 }
673
674 test_ping_success()
675 {
676 mode=$1
677
678 export RUMP_SERVER=$SOCK1
679 rump.ifconfig -v ipsec0
680 if [ ${mode} = "ipv6" ]; then
681 # XXX
682 # rump.ping6 rarely fails with the message that
683 # "failed to get receiving hop limit".
684 # This is a known issue being analyzed.
685 atf_check -s exit:0 -o ignore \
686 rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER1_LANIP6 \
687 $ROUTER2_LANIP6
688 else
689 atf_check -s exit:0 -o ignore \
690 rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER1_LANIP \
691 $ROUTER2_LANIP
692 fi
693 rump.ifconfig -v ipsec0
694
695 export RUMP_SERVER=$SOCK2
696 rump.ifconfig -v ipsec0
697 if [ ${mode} = "ipv6" ]; then
698 atf_check -s exit:0 -o ignore \
699 rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER2_LANIP6 \
700 $ROUTER1_LANIP6
701 else
702 atf_check -s exit:0 -o ignore \
703 rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER2_LANIP \
704 $ROUTER1_LANIP
705 fi
706 rump.ifconfig -v ipsec0
707
708 unset RUMP_SERVER
709 }
710
711 test_change_tunnel_duplicate()
712 {
713 local mode=$1
714
715 local newsrc=""
716 local newdst=""
717 if [ ${mode} = "ipv6" ]; then
718 newsrc=$ROUTER1_WANIP6_DUMMY
719 newdst=$ROUTER2_WANIP6_DUMMY
720 else
721 newsrc=$ROUTER1_WANIP_DUMMY
722 newdst=$ROUTER2_WANIP_DUMMY
723 fi
724 export RUMP_SERVER=$SOCK1
725 rump.ifconfig -v ipsec0
726 rump.ifconfig -v ipsec1
727 atf_check -s exit:0 -e match:SIOCSLIFPHYADDR \
728 rump.ifconfig ipsec0 tunnel ${newsrc} ${newdst}
729 rump.ifconfig -v ipsec0
730 rump.ifconfig -v ipsec1
731
732 if [ ${mode} = "ipv6" ]; then
733 newsrc=$ROUTER2_WANIP6_DUMMY
734 newdst=$ROUTER1_WANIP6_DUMMY
735 else
736 newsrc=$ROUTER2_WANIP_DUMMY
737 newdst=$ROUTER1_WANIP_DUMMY
738 fi
739 export RUMP_SERVER=$SOCK2
740 rump.ifconfig -v ipsec0
741 rump.ifconfig -v ipsec1
742 atf_check -s exit:0 -e match:SIOCSLIFPHYADDR \
743 rump.ifconfig ipsec0 tunnel ${newsrc} ${newdst}
744 rump.ifconfig -v ipsec0
745 rump.ifconfig -v ipsec1
746
747 unset RUMP_SERVER
748 }
749
750 test_change_tunnel_success()
751 {
752 local mode=$1
753
754 local newsrc=""
755 local newdst=""
756 if [ ${mode} = "ipv6" ]; then
757 newsrc=$ROUTER1_WANIP6_DUMMY
758 newdst=$ROUTER2_WANIP6_DUMMY
759 else
760 newsrc=$ROUTER1_WANIP_DUMMY
761 newdst=$ROUTER2_WANIP_DUMMY
762 fi
763 export RUMP_SERVER=$SOCK1
764 rump.ifconfig -v ipsec0
765 atf_check -s exit:0 \
766 rump.ifconfig ipsec0 tunnel ${newsrc} ${newdst}
767 rump.ifconfig -v ipsec0
768
769 if [ ${mode} = "ipv6" ]; then
770 newsrc=$ROUTER2_WANIP6_DUMMY
771 newdst=$ROUTER1_WANIP6_DUMMY
772 else
773 newsrc=$ROUTER2_WANIP_DUMMY
774 newdst=$ROUTER1_WANIP_DUMMY
775 fi
776 export RUMP_SERVER=$SOCK2
777 rump.ifconfig -v ipsec0
778 atf_check -s exit:0 \
779 rump.ifconfig ipsec0 tunnel ${newsrc} ${newdst}
780 rump.ifconfig -v ipsec0
781
782 unset RUMP_SERVER
783 }
784
785 basic_setup()
786 {
787 local inner=$1
788 local outer=$2
789 local proto=$3
790 local algo=$4
791
792 setup ${inner} ${outer}
793 test_setup ${inner} ${outer}
794
795 # Enable once PR kern/49219 is fixed
796 #test_ping_failure
797
798 setup_tunnel ${inner} ${outer} ${proto} ${algo}
799 sleep 1
800 test_setup_tunnel ${inner}
801 }
802
803 basic_test()
804 {
805 local inner=$1
806 local outer=$2 # not use
807
808 test_ping_success ${inner}
809 }
810
811 basic_teardown()
812 {
813 local inner=$1
814 local outer=$2 # not use
815
816 teardown_tunnel
817 test_ping_failure ${inner}
818 }
819
820 ioctl_setup()
821 {
822 local inner=$1
823 local outer=$2
824 local proto=$3
825 local algo=$4
826
827 setup ${inner} ${outer}
828 test_setup ${inner} ${outer}
829
830 # Enable once PR kern/49219 is fixed
831 #test_ping_failure
832
833 setup_tunnel ${inner} ${outer} ${proto} ${algo}
834 setup_dummy_tunnel ${inner} ${outer} ${proto} ${algo}
835 sleep 1
836 test_setup_tunnel ${inner}
837 }
838
839 ioctl_test()
840 {
841 local inner=$1
842 local outer=$2
843
844 test_ping_success ${inner}
845
846 test_change_tunnel_duplicate ${outer}
847
848 teardown_dummy_tunnel
849 test_change_tunnel_success ${outer}
850 }
851
852 ioctl_teardown()
853 {
854 local inner=$1
855 local outer=$2 # not use
856
857 teardown_tunnel
858 test_ping_failure ${inner}
859 }
860
861 recursive_setup()
862 {
863 local inner=$1
864 local outer=$2
865 local proto=$3
866 local algo=$4
867
868 setup ${inner} ${outer}
869 test_setup ${inner} ${outer}
870
871 # Enable once PR kern/49219 is fixed
872 #test_ping_failure
873
874 setup_tunnel ${inner} ${outer} ${proto} ${algo}
875 setup_recursive_tunnels ${inner} ${proto} ${algo}
876 sleep 1
877 test_setup_tunnel ${inner}
878 }
879
880 recursive_test()
881 {
882 local inner=$1
883 local outer=$2 # not use
884
885 test_recursive_check ${inner}
886 }
887
888 recursive_teardown()
889 {
890 local inner=$1 # not use
891 local outer=$2 # not use
892
893 teardown_recursive_tunnels
894 teardown_tunnel
895 }
896
897 add_test()
898 {
899 local category=$1
900 local desc=$2
901 local inner=$3
902 local outer=$4
903 local proto=$5
904 local algo=$6
905 local _algo=$(echo $algo | sed 's/-//g')
906
907 name="ipsecif_${category}_${inner}over${outer}_${proto}_${_algo}"
908 fulldesc="Does ${inner} over ${outer} if_ipsec ${desc}"
909
910 atf_test_case ${name} cleanup
911 eval "${name}_head() {
912 atf_set descr \"${fulldesc}\"
913 atf_set require.progs rump_server setkey
914 }
915 ${name}_body() {
916 ${category}_setup ${inner} ${outer} ${proto} ${algo}
917 ${category}_test ${inner} ${outer}
918 ${category}_teardown ${inner} ${outer}
919 rump_server_destroy_ifaces
920 }
921 ${name}_cleanup() {
922 \$DEBUG && dump
923 cleanup
924 }"
925 atf_add_test_case ${name}
926 }
927
928 add_test_allproto()
929 {
930 local category=$1
931 local desc=$2
932
933 for algo in $ESP_ENCRYPTION_ALGORITHMS_MINIMUM; do
934 add_test ${category} "${desc}" ipv4 ipv4 esp $algo
935 add_test ${category} "${desc}" ipv4 ipv6 esp $algo
936 add_test ${category} "${desc}" ipv6 ipv4 esp $algo
937 add_test ${category} "${desc}" ipv6 ipv6 esp $algo
938 done
939
940 # ah does not support yet
941 }
942
943 atf_init_test_cases()
944 {
945
946 atf_add_test_case ipsecif_create_destroy
947
948 add_test_allproto basic "basic tests"
949 add_test_allproto ioctl "ioctl tests"
950 add_test_allproto recursive "recursive check tests"
951 }
952