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