t_l2tp.sh revision 1.4 1 # $NetBSD: t_l2tp.sh,v 1.4 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 LAC1SOCK=unix://commsock1
29 LAC2SOCK=unix://commsock2
30 CLIENT1SOCK=unix://commsock3
31 CLIENT2SOCK=unix://commsock4
32
33 WAN_LINK=bus0
34 LAC1_LAN_LINK=bus1
35 LAC2_LAN_LINK=bus2
36
37 LAC1_WANIP=10.0.0.1
38 LAC1_SESSION=1234
39 CLIENT1_LANIP=192.168.1.1
40 LAC2_WANIP=10.0.0.2
41 LAC2_SESSION=4321
42 CLIENT2_LANIP=192.168.1.2
43
44 LAC1_WANIP6=fc00::1
45 CLIENT1_LANIP6=fc00:1::1
46 LAC2_WANIP6=fc00::2
47 CLIENT2_LANIP6=fc00:1::2
48
49 TIMEOUT=5
50 DEBUG=${DEBUG:-false}
51
52 atf_test_case l2tp_create_destroy cleanup
53 l2tp_create_destroy_head()
54 {
55
56 atf_set "descr" "Test creating/destroying l2tp interfaces"
57 atf_set "require.progs" "rump_server"
58 }
59
60 l2tp_create_destroy_body()
61 {
62
63 rump_server_start $LAC1SOCK l2tp
64
65 test_create_destroy_common $LAC1SOCK l2tp0
66 }
67
68 l2tp_create_destroy_cleanup()
69 {
70
71 $DEBUG && dump
72 cleanup
73 }
74
75 setup_lac()
76 {
77 sock=${1}
78 lanlink=${2}
79 wan=${3}
80 wan_mode=${4}
81
82
83 rump_server_add_iface ${sock} shmif0 ${lanlink}
84 rump_server_add_iface ${sock} shmif1 ${WAN_LINK}
85
86 export RUMP_SERVER=${sock}
87
88 if [ ${wan_mode} = "ipv6" ]; then
89 atf_check -s exit:0 rump.ifconfig shmif1 inet6 ${wan}
90 else
91 atf_check -s exit:0 rump.ifconfig shmif1 inet ${wan} netmask 0xff000000
92 fi
93 atf_check -s exit:0 rump.ifconfig shmif0 up
94 atf_check -s exit:0 rump.ifconfig shmif1 up
95
96 unset RUMP_SERVER
97 }
98
99 test_lac()
100 {
101 sock=${1}
102 wan=${2}
103 wan_mode=${3}
104
105 export RUMP_SERVER=${sock}
106
107 atf_check -s exit:0 -o match:shmif0 rump.ifconfig
108 atf_check -s exit:0 -o match:shmif1 rump.ifconfig
109 if [ ${wan_mode} = "ipv6" ]; then
110 atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${wan}
111 else
112 atf_check -s exit:0 -o ignore rump.ping -n -c 1 -w $TIMEOUT ${wan}
113 fi
114
115 unset RUMP_SERVER
116 }
117
118 setup_client()
119 {
120 sock=${1}
121 lanlink=${2}
122 lan=${3}
123 lan_mode=${4}
124
125 rump_server_add_iface ${sock} shmif0 ${lanlink}
126
127 export RUMP_SERVER=${sock}
128 if [ ${lan_mode} = "ipv6" ]; then
129 atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${lan}
130 else
131 atf_check -s exit:0 rump.ifconfig shmif0 inet ${lan} netmask 0xffffff00
132 fi
133 atf_check -s exit:0 rump.ifconfig shmif0 up
134
135 unset RUMP_SERVER
136 }
137
138 test_client()
139 {
140 sock=${1}
141 lan=${2}
142 lan_mode=${3}
143
144 export RUMP_SERVER=${sock}
145
146 atf_check -s exit:0 -o match:shmif0 rump.ifconfig
147 if [ ${lan_mode} = "ipv6" ]; then
148 atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${lan}
149 else
150 atf_check -s exit:0 -o ignore rump.ping -n -c 1 -w $TIMEOUT ${lan}
151 fi
152
153 unset RUMP_SERVER
154 }
155
156 setup()
157 {
158 lan_mode=${1}
159 wan_mode=${2}
160
161 rump_server_start $LAC1SOCK netinet6 bridge l2tp
162 rump_server_start $LAC2SOCK netinet6 bridge l2tp
163 rump_server_start $CLIENT1SOCK netinet6 bridge l2tp
164 rump_server_start $CLIENT2SOCK netinet6 bridge l2tp
165
166 client1_lan=""
167 client2_lan=""
168 if [ ${lan_mode} = "ipv6" ]; then
169 client1_lan=${CLIENT1_LANIP6}
170 client2_lan=${CLIENT2_LANIP6}
171 else
172 client1_lan=${CLIENT1_LANIP}
173 client2_lan=${CLIENT2_LANIP}
174 fi
175
176 if [ ${wan_mode} = "ipv6" ]; then
177 setup_lac $LAC1SOCK $LAC1_LAN_LINK $LAC1_WANIP6 ${wan_mode}
178 setup_lac $LAC2SOCK $LAC2_LAN_LINK $LAC2_WANIP6 ${wan_mode}
179 setup_client $CLIENT1SOCK $LAC1_LAN_LINK \
180 ${client1_lan} ${lan_mode}
181 setup_client $CLIENT2SOCK $LAC2_LAN_LINK \
182 ${client2_lan} ${lan_mode}
183 else
184 setup_lac $LAC1SOCK $LAC1_LAN_LINK $LAC1_WANIP ${wan_mode}
185 setup_lac $LAC2SOCK $LAC2_LAN_LINK $LAC2_WANIP ${wan_mode}
186 setup_client $CLIENT1SOCK $LAC1_LAN_LINK \
187 ${client1_lan} ${lan_mode}
188 setup_client $CLIENT2SOCK $LAC2_LAN_LINK \
189 ${client2_lan} ${lan_mode}
190 fi
191 }
192
193 test_setup()
194 {
195 lan_mode=${1}
196 wan_mode=${2}
197
198 client1_lan=""
199 client2_lan=""
200 if [ ${lan_mode} = "ipv6" ]; then
201 client1_lan=$CLIENT1_LANIP6
202 client2_lan=$CLIENT2_LANIP6
203 else
204 client1_lan=$CLIENT1_LANIP
205 client2_lan=$CLIENT2_LANIP
206 fi
207 if [ ${wan_mode} = "ipv6" ]; then
208 test_lac ${LAC1SOCK} $LAC1_WANIP6 ${wan_mode}
209 test_lac ${LAC2SOCK} $LAC2_WANIP6 ${wan_mode}
210 test_client ${CLIENT1SOCK} ${client1_lan} ${lan_mode}
211 test_client ${CLIENT2SOCK} ${client2_lan} ${lan_mode}
212 else
213 test_lac ${LAC1SOCK} $LAC1_WANIP ${wan_mode}
214 test_lac ${LAC2SOCK} $LAC2_WANIP ${wan_mode}
215 test_client ${CLIENT1SOCK} ${client1_lan} ${lan_mode}
216 test_client ${CLIENT2SOCK} ${client2_lan} ${lan_mode}
217 fi
218 }
219
220 setup_if_l2tp()
221 {
222 sock=${1}
223 src=${2}
224 dst=${3}
225 src_session=${4}
226 dst_session=${5}
227
228 export RUMP_SERVER=${sock}
229
230 atf_check -s exit:0 rump.ifconfig l2tp0 create
231 atf_check -s exit:0 rump.ifconfig l2tp0 tunnel ${src} ${dst}
232 atf_check -s exit:0 rump.ifconfig l2tp0 session ${src_session} ${dst_session}
233 atf_check -s exit:0 rump.ifconfig l2tp0 up
234
235 atf_check -s exit:0 rump.ifconfig bridge0 create
236 atf_check -s exit:0 rump.ifconfig bridge0 up
237 export LD_PRELOAD=/usr/lib/librumphijack.so
238 atf_check -s exit:0 brconfig bridge0 add shmif0
239 atf_check -s exit:0 brconfig bridge0 add l2tp0
240 unset LD_PRELOAD
241
242 $DEBUG && rump.ifconfig -v l2tp0
243 $DEBUG && rump.ifconfig -v bridge0
244
245 unset RUMP_SERVER
246 }
247
248 setup_tunnel()
249 {
250 wan_mode=${1}
251
252 src=""
253 dst=""
254 src_session=""
255 dst_session=""
256
257 if [ ${wan_mode} = "ipv6" ]; then
258 src=$LAC1_WANIP6
259 dst=$LAC2_WANIP6
260 else
261 src=$LAC1_WANIP
262 dst=$LAC2_WANIP
263 fi
264 src_session=${LAC1_SESSION}
265 dst_session=${LAC2_SESSION}
266 setup_if_l2tp $LAC1SOCK ${src} ${dst} ${src_session} ${dst_session}
267
268 if [ ${wan_mode} = "ipv6" ]; then
269 src=$LAC2_WANIP6
270 dst=$LAC1_WANIP6
271 else
272 src=$LAC2_WANIP
273 dst=$LAC1_WANIP
274 fi
275 src_session=${LAC2_SESSION}
276 dst_session=${LAC1_SESSION}
277 setup_if_l2tp $LAC2SOCK ${src} ${dst} ${src_session} ${dst_session}
278 }
279
280 test_setup_tunnel()
281 {
282 mode=${1}
283
284 if [ ${mode} = "ipv6" ]; then
285 lac1_wan=$LAC1_WANIP6
286 lac2_wan=$LAC2_WANIP6
287 else
288 lac1_wan=$LAC1_WANIP
289 lac2_wan=$LAC2_WANIP
290 fi
291 export RUMP_SERVER=$LAC1SOCK
292 atf_check -s exit:0 -o match:l2tp0 rump.ifconfig
293 if [ ${mode} = "ipv6" ]; then
294 atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${lac2_wan}
295 else
296 atf_check -s exit:0 -o ignore rump.ping -n -c 1 -w $TIMEOUT ${lac2_wan}
297 fi
298
299 export RUMP_SERVER=$LAC2SOCK
300 atf_check -s exit:0 -o match:l2tp0 rump.ifconfig
301 if [ ${mode} = "ipv6" ]; then
302 atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${lac1_wan}
303 else
304 atf_check -s exit:0 -o ignore rump.ping -n -c 1 -w $TIMEOUT ${lac1_wan}
305 fi
306
307 unset RUMP_SERVER
308 }
309
310 teardown_tunnel()
311 {
312 export RUMP_SERVER=$LAC1SOCK
313 atf_check -s exit:0 rump.ifconfig bridge0 destroy
314 atf_check -s exit:0 rump.ifconfig l2tp0 deletetunnel
315 atf_check -s exit:0 rump.ifconfig l2tp0 destroy
316
317 export RUMP_SERVER=$LAC2SOCK
318 atf_check -s exit:0 rump.ifconfig bridge0 destroy
319 atf_check -s exit:0 rump.ifconfig l2tp0 deletetunnel
320 atf_check -s exit:0 rump.ifconfig l2tp0 destroy
321
322 unset RUMP_SERVER
323 }
324
325 test_ping_failure()
326 {
327 mode=$1
328
329 export RUMP_SERVER=$CLIENT1SOCK
330 if [ ${mode} = "ipv6" ]; then
331 atf_check -s not-exit:0 -o ignore -e ignore \
332 rump.ping6 -n -X $TIMEOUT -c 1 $CLIENT2_LANIP6
333 else
334 atf_check -s not-exit:0 -o ignore -e ignore \
335 rump.ping -n -w $TIMEOUT -c 1 $CLIENT2_LANIP
336 fi
337
338 export RUMP_SERVER=$CLIENT2SOCK
339 if [ ${mode} = "ipv6" ]; then
340 atf_check -s not-exit:0 -o ignore -e ignore \
341 rump.ping6 -n -X $TIMEOUT -c 1 $CLIENT1_LANIP6
342 else
343 atf_check -s not-exit:0 -o ignore -e ignore \
344 rump.ping -n -w $TIMEOUT -c 1 $CLIENT1_LANIP
345 fi
346
347 unset RUMP_SERVER
348 }
349
350 test_ping_success()
351 {
352 mode=$1
353
354 export RUMP_SERVER=$CLIENT1SOCK
355 if [ ${mode} = "ipv6" ]; then
356 # XXX
357 # rump.ping6 rarely fails with the message that
358 # "failed to get receiving hop limit".
359 # This is a known issue being analyzed.
360 atf_check -s exit:0 -o ignore \
361 rump.ping6 -n -X $TIMEOUT -c 1 $CLIENT2_LANIP6
362 else
363 atf_check -s exit:0 -o ignore \
364 rump.ping -n -w $TIMEOUT -c 1 $CLIENT2_LANIP
365 fi
366 export RUMP_SERVER=$LAC1SOCK
367 $DEBUG && rump.ifconfig -v l2tp0
368 $DEBUG && rump.ifconfig -v bridge0
369 $DEBUG && rump.ifconfig -v shmif0
370
371 export RUMP_SERVER=$CLIENT2SOCK
372 if [ ${mode} = "ipv6" ]; then
373 atf_check -s exit:0 -o ignore \
374 rump.ping6 -n -X $TIMEOUT -c 1 $CLIENT1_LANIP6
375 else
376 atf_check -s exit:0 -o ignore \
377 rump.ping -n -w $TIMEOUT -c 1 $CLIENT1_LANIP
378 fi
379 export RUMP_SERVER=$LAC2SOCK
380 $DEBUG && rump.ifconfig -v l2tp0
381 $DEBUG && rump.ifconfig -v bridge0
382 $DEBUG && rump.ifconfig -v shmif0
383
384 unset RUMP_SERVER
385 }
386
387 basic_setup()
388 {
389 lan_mode=$1
390 wan_mode=$2
391
392 setup ${lan_mode} ${wan_mode}
393 test_setup ${lan_mode} ${wan_mode}
394
395 # Enable once PR kern/49219 is fixed
396 #test_ping_failure
397
398 setup_tunnel ${wan_mode}
399 sleep 1
400 test_setup_tunnel ${wan_mode}
401 }
402
403 basic_test()
404 {
405 lan_mode=$1
406 wan_mode=$2 # not use
407
408 test_ping_success ${lan_mode}
409 }
410
411 basic_teardown()
412 {
413 lan_mode=$1
414 wan_mode=$2 # not use
415
416 teardown_tunnel
417 test_ping_failure ${lan_mode}
418 }
419
420 add_test()
421 {
422 category=$1
423 desc=$2
424 lan_mode=$3
425 wan_mode=$4
426
427 name="l2tp_${category}_${lan_mode}over${wan_mode}"
428 fulldesc="Does ${lan_mode} over ${wan_mode} if_l2tp ${desc}"
429
430 atf_test_case ${name} cleanup
431 eval "${name}_head() {
432 atf_set descr \"${fulldesc}\"
433 atf_set require.progs rump_server
434 }
435 ${name}_body() {
436 ${category}_setup ${lan_mode} ${wan_mode}
437 ${category}_test ${lan_mode} ${wan_mode}
438 ${category}_teardown ${lan_mode} ${wan_mode}
439 rump_server_destroy_ifaces
440 }
441 ${name}_cleanup() {
442 \$DEBUG && dump
443 cleanup
444 }"
445 atf_add_test_case ${name}
446 }
447
448 add_test_allproto()
449 {
450 category=$1
451 desc=$2
452
453 add_test ${category} "${desc}" ipv4 ipv4
454 add_test ${category} "${desc}" ipv4 ipv6
455 add_test ${category} "${desc}" ipv6 ipv4
456 add_test ${category} "${desc}" ipv6 ipv6
457 }
458
459 atf_init_test_cases()
460 {
461
462 atf_add_test_case l2tp_create_destroy
463
464 add_test_allproto basic "basic tests"
465 # add_test_allproto recursive "recursive check tests"
466 }
467