t_pppoe.sh revision 1.18.4.1 1 # $NetBSD: t_pppoe.sh,v 1.18.4.1 2020/04/13 08:05:31 martin 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 SERVER=unix://pppoe_server
29 CLIENT=unix://pppoe_client
30
31 SERVER_IP=10.3.3.1
32 CLIENT_IP=10.3.3.3
33 SERVER_IP6=fc00::1
34 CLIENT_IP6=fc00::3
35 AUTHNAME=foobar@baz.com
36 SECRET=oink
37 BUS=bus0
38 TIMEOUT=3
39 WAITTIME=10
40 DEBUG=${DEBUG:-false}
41
42 atf_test_case pppoe_create_destroy cleanup
43 pppoe_create_destroy_head()
44 {
45
46 atf_set "descr" "Test creating/destroying pppoe interfaces"
47 atf_set "require.progs" "rump_server"
48 }
49
50 pppoe_create_destroy_body()
51 {
52
53 rump_server_start $CLIENT netinet6 pppoe
54
55 test_create_destroy_common $CLIENT pppoe0 true
56 }
57
58 pppoe_create_destroy_cleanup()
59 {
60
61 $DEBUG && dump
62 cleanup
63 }
64
65 setup()
66 {
67 inet=true
68
69 if [ $# -ne 0 ]; then
70 eval $@
71 fi
72
73 rump_server_start $SERVER netinet6 pppoe
74 rump_server_start $CLIENT netinet6 pppoe
75
76 rump_server_add_iface $SERVER shmif0 $BUS
77 rump_server_add_iface $CLIENT shmif0 $BUS
78
79 export RUMP_SERVER=$SERVER
80 atf_check -s exit:0 rump.ifconfig shmif0 up
81
82 rump_server_add_iface $SERVER pppoe0
83 $inet && atf_check -s exit:0 rump.ifconfig pppoe0 \
84 inet $SERVER_IP $CLIENT_IP down
85 atf_check -s exit:0 rump.ifconfig pppoe0 link0
86
87 $DEBUG && rump.ifconfig
88 $DEBUG && $HIJACKING pppoectl -d pppoe0
89
90 atf_check -s exit:0 -x "$HIJACKING pppoectl -e shmif0 pppoe0"
91 unset RUMP_SERVER
92
93 export RUMP_SERVER=$CLIENT
94 atf_check -s exit:0 rump.ifconfig shmif0 up
95
96 rump_server_add_iface $CLIENT pppoe0
97 $inet && atf_check -s exit:0 rump.ifconfig pppoe0 \
98 inet 0.0.0.0 0.0.0.1 down
99
100 atf_check -s exit:0 -x "$HIJACKING pppoectl -e shmif0 pppoe0"
101 unset RUMP_SERVER
102 }
103
104 wait_for_session_established()
105 {
106 local dontfail=$1
107 local n=$WAITTIME
108
109 for i in $(seq $n); do
110 $HIJACKING pppoectl -d pppoe0 |grep -q "state = session"
111 [ $? = 0 ] && return
112 sleep 1
113 done
114
115 if [ "$dontfail" != "dontfail" ]; then
116 atf_fail "Couldn't connect to the server for $n seconds."
117 fi
118 }
119
120 wait_for_disconnected()
121 {
122 local dontfail=$1
123 local n=$WAITTIME
124
125 for i in $(seq $n); do
126 $HIJACKING pppoectl -d pppoe0 | grep -q "state = initial"
127 [ $? = 0 ] && return
128 # If PPPoE client is disconnected by PPPoE server and then
129 # the client kicks callout of pppoe_timeout(), the client
130 # state is changed to PPPOE_STATE_PADI_SENT while padi retrying.
131 $HIJACKING pppoectl -d pppoe0 | grep -q "state = PADI sent"
132 [ $? = 0 ] && return
133
134 sleep 1
135 done
136
137 if [ "$dontfail" != "dontfail" ]; then
138 atf_fail "Couldn't disconnect for $n seconds."
139 fi
140 }
141
142 run_test()
143 {
144 local auth=$1
145 setup
146
147 # As pppoe client doesn't support rechallenge yet.
148 local server_optparam=""
149 if [ $auth = "chap" ]; then
150 server_optparam="norechallenge"
151 fi
152
153 export RUMP_SERVER=$SERVER
154 local setup_serverparam="pppoectl pppoe0 hisauthproto=$auth \
155 'hisauthname=$AUTHNAME' \
156 'hisauthsecret=$SECRET' \
157 'myauthproto=none' \
158 $server_optparam"
159 atf_check -s exit:0 -x "$HIJACKING $setup_serverparam"
160 atf_check -s exit:0 rump.ifconfig pppoe0 up
161 unset RUMP_SERVER
162
163 export RUMP_SERVER=$CLIENT
164 local setup_clientparam="pppoectl pppoe0 myauthproto=$auth \
165 'myauthname=$AUTHNAME' \
166 'myauthsecret=$SECRET' \
167 'hisauthproto=none'"
168 atf_check -s exit:0 -x "$HIJACKING $setup_clientparam"
169 atf_check -s exit:0 rump.ifconfig pppoe0 up
170 $DEBUG && rump.ifconfig
171 wait_for_session_established
172 atf_check -s exit:0 -o ignore rump.ping -c 1 -w $TIMEOUT $SERVER_IP
173 unset RUMP_SERVER
174
175 # test for disconnection from server
176 export RUMP_SERVER=$SERVER
177 atf_check -s exit:0 rump.ifconfig pppoe0 down
178 wait_for_disconnected
179 export RUMP_SERVER=$CLIENT
180 wait_for_disconnected
181 atf_check -s not-exit:0 -o ignore -e ignore \
182 rump.ping -c 1 -w $TIMEOUT $SERVER_IP
183 atf_check -s exit:0 -o match:'PADI sent' -x "$HIJACKING pppoectl -d pppoe0"
184 unset RUMP_SERVER
185
186 # test for recoonecting
187 atf_check -s exit:0 -x "env RUMP_SERVER=$SERVER rump.ifconfig pppoe0 up"
188 export RUMP_SERVER=$CLIENT
189 wait_for_session_established
190 atf_check -s exit:0 -o ignore rump.ping -c 1 -w $TIMEOUT $SERVER_IP
191 unset RUMP_SERVER
192
193 # test for disconnection from client
194 export RUMP_SERVER=$CLIENT
195 atf_check -s exit:0 -x rump.ifconfig pppoe0 down
196 wait_for_disconnected
197 export RUMP_SERVER=$SERVER
198 wait_for_disconnected
199 $DEBUG && $HIJACKING pppoectl -d pppoe0
200 atf_check -s not-exit:0 -o ignore -e ignore \
201 rump.ping -c 1 -w $TIMEOUT $CLIENT_IP
202 atf_check -s exit:0 -o match:'initial' -x "$HIJACKING pppoectl -d pppoe0"
203 unset RUMP_SERVER
204
205 # test for reconnecting
206 export RUMP_SERVER=$CLIENT
207 atf_check -s exit:0 -x rump.ifconfig pppoe0 up
208 wait_for_session_established
209 $DEBUG && rump.ifconfig pppoe0
210 $DEBUG && $HIJACKING pppoectl -d pppoe0
211 unset RUMP_SERVER
212
213 export RUMP_SERVER=$SERVER
214 atf_check -s exit:0 rump.ifconfig -w 10
215 atf_check -s exit:0 -o ignore rump.ping -c 1 -w $TIMEOUT $CLIENT_IP
216 atf_check -s exit:0 -o match:'session' -x "$HIJACKING pppoectl -d pppoe0"
217 $DEBUG && HIJACKING pppoectl -d pppoe0
218 unset RUMP_SERVER
219
220 # test for invalid password
221 export RUMP_SERVER=$CLIENT
222 atf_check -s exit:0 rump.ifconfig pppoe0 down
223 wait_for_disconnected
224 local setup_clientparam="pppoectl pppoe0 myauthproto=$auth \
225 'myauthname=$AUTHNAME' \
226 'myauthsecret=invalidsecret' \
227 'hisauthproto=none'"
228 atf_check -s exit:0 -x "$HIJACKING $setup_clientparam"
229 atf_check -s exit:0 rump.ifconfig pppoe0 up
230 wait_for_session_established dontfail
231 atf_check -s not-exit:0 -o ignore -e ignore \
232 rump.ping -c 1 -w $TIMEOUT $SERVER_IP
233 atf_check -s exit:0 -o match:'DETACHED' rump.ifconfig pppoe0
234 unset RUMP_SERVER
235 }
236
237 atf_test_case pppoe_pap cleanup
238
239 pppoe_pap_head()
240 {
241 atf_set "descr" "Does simple pap tests"
242 atf_set "require.progs" "rump_server pppoectl"
243 }
244
245 pppoe_pap_body()
246 {
247 run_test pap
248 }
249
250 pppoe_pap_cleanup()
251 {
252
253 $DEBUG && dump
254 cleanup
255 }
256
257 atf_test_case pppoe_chap cleanup
258
259 pppoe_chap_head()
260 {
261 atf_set "descr" "Does simple chap tests"
262 atf_set "require.progs" "rump_server pppoectl"
263 }
264
265 pppoe_chap_body()
266 {
267 run_test chap
268 }
269
270 pppoe_chap_cleanup()
271 {
272
273 $DEBUG && dump
274 cleanup
275 }
276
277 run_test6()
278 {
279 local auth=$1
280 setup "inet=false"
281
282 # As pppoe client doesn't support rechallenge yet.
283 local server_optparam=""
284 if [ $auth = "chap" ]; then
285 server_optparam="norechallenge"
286 fi
287
288 export RUMP_SERVER=$SERVER
289 local setup_serverparam="pppoectl pppoe0 hisauthproto=$auth \
290 'hisauthname=$AUTHNAME' \
291 'hisauthsecret=$SECRET' \
292 'myauthproto=none' \
293 $server_optparam"
294 atf_check -s exit:0 -x "$HIJACKING $setup_serverparam"
295 atf_check -s exit:0 rump.ifconfig pppoe0 inet6 $SERVER_IP6/64 down
296 atf_check -s exit:0 rump.ifconfig pppoe0 up
297 unset RUMP_SERVER
298
299 export RUMP_SERVER=$CLIENT
300 local setup_clientparam="pppoectl pppoe0 myauthproto=$auth \
301 'myauthname=$AUTHNAME' \
302 'myauthsecret=$SECRET' \
303 'hisauthproto=none'"
304 atf_check -s exit:0 -x "$HIJACKING $setup_clientparam"
305 atf_check -s exit:0 rump.ifconfig pppoe0 inet6 $CLIENT_IP6/64 down
306 atf_check -s exit:0 rump.ifconfig pppoe0 up
307 $DEBUG && rump.ifconfig
308 wait_for_session_established
309 atf_check -s exit:0 -o ignore rump.ifconfig -w 10
310 export RUMP_SERVER=$SERVER
311 atf_check -s exit:0 -o ignore rump.ifconfig -w 10
312 export RUMP_SERVER=$CLIENT
313 atf_check -s exit:0 -o ignore rump.ping6 -c 1 -X $TIMEOUT $SERVER_IP6
314 unset RUMP_SERVER
315
316 # test for disconnection from server
317 export RUMP_SERVER=$SERVER
318 session_id=`$HIJACKING pppoectl -d pppoe0 | grep state`
319 atf_check -s exit:0 rump.ifconfig pppoe0 down
320 wait_for_disconnected
321 export RUMP_SERVER=$CLIENT
322 wait_for_disconnected
323 atf_check -s not-exit:0 -o ignore -e ignore \
324 rump.ping6 -c 1 -X $TIMEOUT $SERVER_IP6
325 atf_check -s exit:0 -o not-match:"$session_id" -x "$HIJACKING pppoectl -d pppoe0"
326 unset RUMP_SERVER
327
328 # test for recoonecting
329 export RUMP_SERVER=$SERVER
330 atf_check -s exit:0 rump.ifconfig pppoe0 up
331 wait_for_session_established
332 atf_check -s exit:0 rump.ifconfig -w 10
333 $DEBUG && $HIJACKING pppoectl -d pppoe0
334 $DEBUG && rump.ifconfig pppoe0
335 export RUMP_SERVER=$CLIENT
336 atf_check -s exit:0 -o ignore rump.ifconfig -w 10
337 atf_check -s exit:0 -o ignore rump.ping6 -c 1 -X $TIMEOUT $SERVER_IP6
338 unset RUMP_SERVER
339
340 # test for disconnection from client
341 export RUMP_SERVER=$CLIENT
342 atf_check -s exit:0 rump.ifconfig pppoe0 down
343 wait_for_disconnected
344
345 export RUMP_SERVER=$SERVER
346 wait_for_disconnected
347 $DEBUG && $HIJACKING pppoectl -d pppoe0
348 atf_check -s not-exit:0 -o ignore -e ignore \
349 rump.ping6 -c 1 -X $TIMEOUT $CLIENT_IP6
350 atf_check -s exit:0 -o match:'initial' -x "$HIJACKING pppoectl -d pppoe0"
351 unset RUMP_SERVER
352
353 # test for reconnecting
354 export RUMP_SERVER=$CLIENT
355 atf_check -s exit:0 rump.ifconfig pppoe0 up
356 wait_for_session_established
357 atf_check -s exit:0 rump.ifconfig -w 10
358
359 $DEBUG && rump.ifconfig pppoe0
360 $DEBUG && $HIJACKING pppoectl -d pppoe0
361 unset RUMP_SERVER
362
363 export RUMP_SERVER=$SERVER
364 atf_check -s exit:0 rump.ifconfig -w 10
365 atf_check -s exit:0 -o ignore rump.ping6 -c 1 -X $TIMEOUT $CLIENT_IP6
366 atf_check -s exit:0 -o match:'session' -x "$HIJACKING pppoectl -d pppoe0"
367 $DEBUG && HIJACKING pppoectl -d pppoe0
368 unset RUMP_SERVER
369
370 # test for invalid password
371 export RUMP_SERVER=$CLIENT
372 atf_check -s exit:0 rump.ifconfig pppoe0 down
373 wait_for_disconnected
374 local setup_clientparam="pppoectl pppoe0 myauthproto=$auth \
375 'myauthname=$AUTHNAME' \
376 'myauthsecret=invalidsecret' \
377 'hisauthproto=none'"
378 atf_check -s exit:0 -x "$HIJACKING $setup_clientparam"
379 atf_check -s exit:0 rump.ifconfig pppoe0 up
380 wait_for_session_established dontfail
381 atf_check -s not-exit:0 -o ignore -e ignore \
382 rump.ping6 -c 1 -X $TIMEOUT $SERVER_IP6
383 atf_check -s exit:0 -o match:'DETACHED' rump.ifconfig pppoe0
384 unset RUMP_SERVER
385 }
386
387 atf_test_case pppoe6_pap cleanup
388
389 pppoe6_pap_head()
390 {
391 atf_set "descr" "Does simple pap using IPv6 tests"
392 atf_set "require.progs" "rump_server pppoectl"
393 }
394
395 pppoe6_pap_body()
396 {
397 run_test6 pap
398 }
399
400 pppoe6_pap_cleanup()
401 {
402
403 $DEBUG && dump
404 cleanup
405 }
406
407 atf_test_case pppoe6_chap cleanup
408
409 pppoe6_chap_head()
410 {
411 atf_set "descr" "Does simple chap using IPv6 tests"
412 atf_set "require.progs" "rump_server pppoectl"
413 }
414
415 pppoe6_chap_body()
416 {
417 run_test6 chap
418 }
419
420 pppoe6_chap_cleanup()
421 {
422
423 $DEBUG && dump
424 cleanup
425 }
426
427 atf_init_test_cases()
428 {
429
430 atf_add_test_case pppoe_create_destroy
431 atf_add_test_case pppoe_pap
432 atf_add_test_case pppoe_chap
433 atf_add_test_case pppoe6_pap
434 atf_add_test_case pppoe6_chap
435 }
436