1313535Sngie#	$NetBSD: t_pppoe.sh,v 1.16 2016/12/14 03:30:30 knakahara Exp $
2303980Sngie#
3303980Sngie# Copyright (c) 2016 Internet Initiative Japan Inc.
4303980Sngie# All rights reserved.
5303980Sngie#
6303980Sngie# Redistribution and use in source and binary forms, with or without
7303980Sngie# modification, are permitted provided that the following conditions
8303980Sngie# are met:
9303980Sngie# 1. Redistributions of source code must retain the above copyright
10303980Sngie#    notice, this list of conditions and the following disclaimer.
11303980Sngie# 2. Redistributions in binary form must reproduce the above copyright
12303980Sngie#    notice, this list of conditions and the following disclaimer in the
13303980Sngie#    documentation and/or other materials provided with the distribution.
14303980Sngie#
15303980Sngie# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16303980Sngie# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17303980Sngie# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18303980Sngie# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19303980Sngie# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20303980Sngie# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21303980Sngie# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22303980Sngie# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23303980Sngie# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24303980Sngie# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25303980Sngie# POSSIBILITY OF SUCH DAMAGE.
26303980Sngie#
27303980Sngie
28303980Sngieserver="rump_server -lrump -lrumpnet -lrumpnet_net -lrumpnet_netinet	\
29303980Sngie		    -lrumpnet_netinet6 -lrumpnet_shmif -lrumpdev	\
30303980Sngie		    -lrumpnet_pppoe"
31313535Sngie# pppoectl doesn't work with RUMPHIJACK=sysctl=yes
32303980SngieHIJACKING="env LD_PRELOAD=/usr/lib/librumphijack.so"
33303980Sngie
34303980SngieSERVER=unix://commsock1
35303980SngieCLIENT=unix://commsock2
36303980Sngie
37303980SngieSERVER_IP=10.3.3.1
38303980SngieCLIENT_IP=10.3.3.3
39313535SngieSERVER_IP6=fc00::1
40313535SngieCLIENT_IP6=fc00::3
41303980SngieAUTHNAME=foobar@baz.com
42303980SngieSECRET=oink
43303980SngieBUS=bus0
44303980SngieTIMEOUT=3
45313535SngieWAITTIME=10
46313535SngieDEBUG=${DEBUG:-false}
47303980Sngie
48303980Sngiesetup()
49303980Sngie{
50313535Sngie	inet=true
51313535Sngie
52313535Sngie	if [ $# -ne 0 ]; then
53313535Sngie		eval $@
54313535Sngie	fi
55313535Sngie
56303980Sngie	atf_check -s exit:0 ${server} $SERVER
57303980Sngie	atf_check -s exit:0 ${server} $CLIENT
58303980Sngie
59303980Sngie	export RUMP_SERVER=$SERVER
60303980Sngie	atf_check -s exit:0 rump.ifconfig shmif0 create
61303980Sngie	atf_check -s exit:0 rump.ifconfig shmif0 linkstr $BUS
62303980Sngie	atf_check -s exit:0 rump.ifconfig shmif0 up
63303980Sngie
64303980Sngie	atf_check -s exit:0 rump.ifconfig pppoe0 create
65313535Sngie	$inet && atf_check -s exit:0 rump.ifconfig pppoe0 \
66313535Sngie	    inet $SERVER_IP $CLIENT_IP down
67303980Sngie	atf_check -s exit:0 rump.ifconfig pppoe0 link0
68303980Sngie
69303980Sngie	$DEBUG && rump.ifconfig
70303980Sngie	$DEBUG && $HIJACKING pppoectl -d pppoe0
71303980Sngie
72303980Sngie	atf_check -s exit:0 -x "$HIJACKING pppoectl -e shmif0 pppoe0"
73303980Sngie	unset RUMP_SERVER
74303980Sngie
75303980Sngie	export RUMP_SERVER=$CLIENT
76303980Sngie	atf_check -s exit:0 rump.ifconfig shmif0 create
77303980Sngie	atf_check -s exit:0 rump.ifconfig shmif0 linkstr $BUS
78303980Sngie	atf_check -s exit:0 rump.ifconfig shmif0 up
79303980Sngie
80303980Sngie	atf_check -s exit:0 rump.ifconfig pppoe0 create
81313535Sngie	$inet && atf_check -s exit:0 rump.ifconfig pppoe0 \
82313535Sngie	    inet 0.0.0.0 0.0.0.1 down
83303980Sngie
84303980Sngie	atf_check -s exit:0 -x "$HIJACKING pppoectl -e shmif0 pppoe0"
85303980Sngie	unset RUMP_SERVER
86303980Sngie}
87313535Sngie
88303980Sngiecleanup()
89303980Sngie{
90303980Sngie	env RUMP_SERVER=$SERVER rump.halt
91303980Sngie	env RUMP_SERVER=$CLIENT rump.halt
92303980Sngie}
93303980Sngie
94303980Sngie
95303980Sngiewait_for_session_established()
96303980Sngie{
97303980Sngie	local dontfail=$1
98303980Sngie	local n=$WAITTIME
99303980Sngie
100303980Sngie	for i in $(seq $n); do
101303980Sngie		$HIJACKING pppoectl -d pppoe0 |grep -q "state = session"
102303980Sngie		[ $? = 0 ] && return
103303980Sngie		sleep 1
104303980Sngie	done
105303980Sngie
106313535Sngie	if [ "$dontfail" != "dontfail" ]; then
107303980Sngie		atf_fail "Couldn't connect to the server for $n seconds."
108303980Sngie	fi
109303980Sngie}
110303980Sngie
111313535Sngiewait_for_disconnected()
112303980Sngie{
113313535Sngie	local dontfail=$1
114313535Sngie	local n=$WAITTIME
115313535Sngie
116313535Sngie	for i in $(seq $n); do
117313535Sngie		$HIJACKING pppoectl -d pppoe0 | grep -q "state = initial"
118313535Sngie		[ $? = 0 ] && return
119313535Sngie		# If PPPoE client is disconnected by PPPoE server and then
120313535Sngie		# the client kicks callout of pppoe_timeout(), the client
121313535Sngie		# state is changed to PPPOE_STATE_PADI_SENT while padi retrying.
122313535Sngie		$HIJACKING pppoectl -d pppoe0 | grep -q "state = PADI sent"
123313535Sngie		[ $? = 0 ] && return
124313535Sngie
125313535Sngie		sleep 1
126313535Sngie	done
127313535Sngie
128313535Sngie	if [ "$dontfail" != "dontfail" ]; then
129313535Sngie		atf_fail "Couldn't disconnect for $n seconds."
130313535Sngie	fi
131313535Sngie}
132313535Sngie
133313535Sngierun_test()
134313535Sngie{
135313535Sngie	local auth=$1
136303980Sngie	setup
137303980Sngie
138313535Sngie	# As pppoe client doesn't support rechallenge yet.
139313535Sngie	local server_optparam=""
140313535Sngie	if [ $auth = "chap" ]; then
141313535Sngie		server_optparam="norechallenge"
142313535Sngie	fi
143313535Sngie
144303980Sngie	export RUMP_SERVER=$SERVER
145303980Sngie	local setup_serverparam="pppoectl pppoe0 hisauthproto=$auth \
146303980Sngie				    'hisauthname=$AUTHNAME' \
147303980Sngie				    'hisauthsecret=$SECRET' \
148313535Sngie				    'myauthproto=none' \
149313535Sngie				    $server_optparam"
150303980Sngie	atf_check -s exit:0 -x "$HIJACKING $setup_serverparam"
151303980Sngie	atf_check -s exit:0 rump.ifconfig pppoe0 up
152303980Sngie	unset RUMP_SERVER
153303980Sngie
154303980Sngie	export RUMP_SERVER=$CLIENT
155303980Sngie	local setup_clientparam="pppoectl pppoe0 myauthproto=$auth \
156303980Sngie				    'myauthname=$AUTHNAME' \
157303980Sngie				    'myauthsecret=$SECRET' \
158303980Sngie				    'hisauthproto=none'"
159303980Sngie	atf_check -s exit:0 -x "$HIJACKING $setup_clientparam"
160303980Sngie	atf_check -s exit:0 rump.ifconfig pppoe0 up
161303980Sngie	$DEBUG && rump.ifconfig
162303980Sngie	wait_for_session_established
163303980Sngie	atf_check -s exit:0 -o ignore rump.ping -c 1 -w $TIMEOUT $SERVER_IP
164303980Sngie	unset RUMP_SERVER
165303980Sngie
166303980Sngie	# test for disconnection from server
167313535Sngie	export RUMP_SERVER=$SERVER
168313535Sngie	atf_check -s exit:0 rump.ifconfig pppoe0 down
169313535Sngie	wait_for_disconnected
170303980Sngie	export RUMP_SERVER=$CLIENT
171313535Sngie	wait_for_disconnected
172303980Sngie	atf_check -s not-exit:0 -o ignore -e ignore \
173303980Sngie	    rump.ping -c 1 -w $TIMEOUT $SERVER_IP
174303980Sngie	atf_check -s exit:0 -o match:'PADI sent' -x "$HIJACKING pppoectl -d pppoe0"
175303980Sngie	unset RUMP_SERVER
176303980Sngie
177303980Sngie	# test for recoonecting
178303980Sngie	atf_check -s exit:0 -x "env RUMP_SERVER=$SERVER rump.ifconfig pppoe0 up"
179303980Sngie	export RUMP_SERVER=$CLIENT
180303980Sngie	wait_for_session_established
181303980Sngie	atf_check -s exit:0 -o ignore rump.ping -c 1 -w $TIMEOUT $SERVER_IP
182303980Sngie	unset RUMP_SERVER
183303980Sngie
184303980Sngie	# test for disconnection from client
185313535Sngie	export RUMP_SERVER=$CLIENT
186313535Sngie	atf_check -s exit:0 -x rump.ifconfig pppoe0 down
187313535Sngie	wait_for_disconnected
188303980Sngie	export RUMP_SERVER=$SERVER
189313535Sngie	wait_for_disconnected
190303980Sngie	$DEBUG && $HIJACKING pppoectl -d pppoe0
191303980Sngie	atf_check -s not-exit:0 -o ignore -e ignore \
192303980Sngie	    rump.ping -c 1 -w $TIMEOUT $CLIENT_IP
193303980Sngie	atf_check -s exit:0 -o match:'initial' -x "$HIJACKING pppoectl -d pppoe0"
194303980Sngie	unset RUMP_SERVER
195303980Sngie
196313535Sngie	# test for reconnecting
197303980Sngie	export RUMP_SERVER=$CLIENT
198303980Sngie	atf_check -s exit:0 -x rump.ifconfig pppoe0 up
199303980Sngie	wait_for_session_established
200303980Sngie	$DEBUG && rump.ifconfig pppoe0
201303980Sngie	$DEBUG && $HIJACKING pppoectl -d pppoe0
202303980Sngie	unset RUMP_SERVER
203303980Sngie
204303980Sngie	export RUMP_SERVER=$SERVER
205313535Sngie	atf_check -s exit:0 rump.ifconfig -w 10
206303980Sngie	atf_check -s exit:0 -o ignore rump.ping -c 1 -w $TIMEOUT $CLIENT_IP
207303980Sngie	atf_check -s exit:0 -o match:'session' -x "$HIJACKING pppoectl -d pppoe0"
208303980Sngie	$DEBUG && HIJACKING pppoectl -d pppoe0
209303980Sngie	unset RUMP_SERVER
210303980Sngie
211303980Sngie	# test for invalid password
212303980Sngie	export RUMP_SERVER=$CLIENT
213303980Sngie	atf_check -s exit:0 rump.ifconfig pppoe0 down
214313535Sngie	wait_for_disconnected
215303980Sngie	local setup_clientparam="pppoectl pppoe0 myauthproto=$auth \
216303980Sngie				    'myauthname=$AUTHNAME' \
217303980Sngie				    'myauthsecret=invalidsecret' \
218303980Sngie				    'hisauthproto=none'"
219303980Sngie	atf_check -s exit:0 -x "$HIJACKING $setup_clientparam"
220303980Sngie	atf_check -s exit:0 rump.ifconfig pppoe0 up
221303980Sngie	wait_for_session_established dontfail
222303980Sngie	atf_check -s not-exit:0 -o ignore -e ignore \
223303980Sngie	    rump.ping -c 1 -w $TIMEOUT $SERVER_IP
224313535Sngie	atf_check -s exit:0 -o match:'DETACHED' rump.ifconfig pppoe0
225313535Sngie	unset RUMP_SERVER
226313535Sngie}
227313535Sngie
228313535Sngieatf_test_case pppoe_pap cleanup
229313535Sngie
230313535Sngiepppoe_pap_head()
231313535Sngie{
232313535Sngie	atf_set "descr" "Does simple pap tests"
233313535Sngie	atf_set "require.progs" "rump_server pppoectl"
234313535Sngie}
235313535Sngie
236313535Sngiepppoe_pap_body()
237313535Sngie{
238313535Sngie	run_test pap
239313535Sngie}
240313535Sngie
241313535Sngiepppoe_pap_cleanup()
242313535Sngie{
243313535Sngie	cleanup
244313535Sngie}
245313535Sngie
246313535Sngieatf_test_case pppoe_chap cleanup
247313535Sngie
248313535Sngiepppoe_chap_head()
249313535Sngie{
250313535Sngie	atf_set "descr" "Does simple chap tests"
251313535Sngie	atf_set "require.progs" "rump_server pppoectl"
252313535Sngie}
253313535Sngie
254313535Sngiepppoe_chap_body()
255313535Sngie{
256313535Sngie	run_test chap
257313535Sngie}
258313535Sngie
259313535Sngiepppoe_chap_cleanup()
260313535Sngie{
261313535Sngie	cleanup
262313535Sngie}
263313535Sngie
264313535Sngierun_test6()
265313535Sngie{
266313535Sngie	local auth=$1
267313535Sngie	setup "inet=false"
268313535Sngie
269313535Sngie	# As pppoe client doesn't support rechallenge yet.
270313535Sngie	local server_optparam=""
271313535Sngie	if [ $auth = "chap" ]; then
272313535Sngie		server_optparam="norechallenge"
273313535Sngie	fi
274313535Sngie
275313535Sngie	export RUMP_SERVER=$SERVER
276313535Sngie	local setup_serverparam="pppoectl pppoe0 hisauthproto=$auth \
277313535Sngie				    'hisauthname=$AUTHNAME' \
278313535Sngie				    'hisauthsecret=$SECRET' \
279313535Sngie				    'myauthproto=none' \
280313535Sngie				    $server_optparam"
281313535Sngie	atf_check -s exit:0 -x "$HIJACKING $setup_serverparam"
282313535Sngie	atf_check -s exit:0 rump.ifconfig pppoe0 inet6 $SERVER_IP6/64 down
283313535Sngie	atf_check -s exit:0 rump.ifconfig pppoe0 up
284313535Sngie	unset RUMP_SERVER
285313535Sngie
286313535Sngie	export RUMP_SERVER=$CLIENT
287313535Sngie	local setup_clientparam="pppoectl pppoe0 myauthproto=$auth \
288313535Sngie				    'myauthname=$AUTHNAME' \
289313535Sngie				    'myauthsecret=$SECRET' \
290313535Sngie				    'hisauthproto=none'"
291313535Sngie	atf_check -s exit:0 -x "$HIJACKING $setup_clientparam"
292313535Sngie	atf_check -s exit:0 rump.ifconfig pppoe0 inet6 $CLIENT_IP6/64 down
293313535Sngie	atf_check -s exit:0 rump.ifconfig pppoe0 up
294313535Sngie	$DEBUG && rump.ifconfig
295313535Sngie	wait_for_session_established
296313535Sngie	atf_check -s exit:0 -o ignore rump.ifconfig -w 10
297313535Sngie	export RUMP_SERVER=$SERVER
298313535Sngie	atf_check -s exit:0 -o ignore rump.ifconfig -w 10
299313535Sngie	export RUMP_SERVER=$CLIENT
300313535Sngie	atf_check -s exit:0 -o ignore rump.ping6 -c 1 -X $TIMEOUT $SERVER_IP6
301313535Sngie	unset RUMP_SERVER
302313535Sngie
303313535Sngie	# test for disconnection from server
304313535Sngie	export RUMP_SERVER=$SERVER
305313535Sngie	session_id=`$HIJACKING pppoectl -d pppoe0 | grep state`
306313535Sngie	atf_check -s exit:0 rump.ifconfig pppoe0 down
307313535Sngie	wait_for_disconnected
308313535Sngie	export RUMP_SERVER=$CLIENT
309313535Sngie	wait_for_disconnected
310313535Sngie	atf_check -s not-exit:0 -o ignore -e ignore \
311313535Sngie	    rump.ping6 -c 1 -X $TIMEOUT $SERVER_IP6
312313535Sngie	atf_check -s exit:0 -o not-match:"$session_id" -x "$HIJACKING pppoectl -d pppoe0"
313313535Sngie	unset RUMP_SERVER
314313535Sngie
315313535Sngie	# test for recoonecting
316313535Sngie	export RUMP_SERVER=$SERVER
317313535Sngie	atf_check -s exit:0 rump.ifconfig pppoe0 up
318313535Sngie	wait_for_session_established
319313535Sngie	atf_check -s exit:0 rump.ifconfig -w 10
320313535Sngie	$DEBUG && $HIJACKING pppoectl -d pppoe0
321313535Sngie	$DEBUG && rump.ifconfig pppoe0
322313535Sngie	export RUMP_SERVER=$CLIENT
323313535Sngie	atf_check -s exit:0 -o ignore rump.ifconfig -w 10
324313535Sngie	atf_check -s exit:0 -o ignore rump.ping6 -c 1 -X $TIMEOUT $SERVER_IP6
325313535Sngie	unset RUMP_SERVER
326313535Sngie
327313535Sngie	# test for disconnection from client
328313535Sngie	export RUMP_SERVER=$CLIENT
329313535Sngie	atf_check -s exit:0 rump.ifconfig pppoe0 down
330313535Sngie	wait_for_disconnected
331313535Sngie
332313535Sngie	export RUMP_SERVER=$SERVER
333313535Sngie	wait_for_disconnected
334313535Sngie	$DEBUG && $HIJACKING pppoectl -d pppoe0
335313535Sngie	atf_check -s not-exit:0 -o ignore -e ignore \
336313535Sngie	    rump.ping6 -c 1 -X $TIMEOUT $CLIENT_IP6
337303980Sngie	atf_check -s exit:0 -o match:'initial' -x "$HIJACKING pppoectl -d pppoe0"
338303980Sngie	unset RUMP_SERVER
339313535Sngie
340313535Sngie	# test for reconnecting
341313535Sngie	export RUMP_SERVER=$CLIENT
342313535Sngie	atf_check -s exit:0 rump.ifconfig pppoe0 up
343313535Sngie	wait_for_session_established
344313535Sngie	atf_check -s exit:0 rump.ifconfig -w 10
345313535Sngie
346313535Sngie	$DEBUG && rump.ifconfig pppoe0
347313535Sngie	$DEBUG && $HIJACKING pppoectl -d pppoe0
348313535Sngie	unset RUMP_SERVER
349313535Sngie
350313535Sngie	export RUMP_SERVER=$SERVER
351313535Sngie	atf_check -s exit:0 rump.ifconfig -w 10
352313535Sngie	atf_check -s exit:0 -o ignore rump.ping6 -c 1 -X $TIMEOUT $CLIENT_IP6
353313535Sngie	atf_check -s exit:0 -o match:'session' -x "$HIJACKING pppoectl -d pppoe0"
354313535Sngie	$DEBUG && HIJACKING pppoectl -d pppoe0
355313535Sngie	unset RUMP_SERVER
356313535Sngie
357313535Sngie	# test for invalid password
358313535Sngie	export RUMP_SERVER=$CLIENT
359313535Sngie	atf_check -s exit:0 rump.ifconfig pppoe0 down
360313535Sngie	wait_for_disconnected
361313535Sngie	local setup_clientparam="pppoectl pppoe0 myauthproto=$auth \
362313535Sngie				    'myauthname=$AUTHNAME' \
363313535Sngie				    'myauthsecret=invalidsecret' \
364313535Sngie				    'hisauthproto=none'"
365313535Sngie	atf_check -s exit:0 -x "$HIJACKING $setup_clientparam"
366313535Sngie	atf_check -s exit:0 rump.ifconfig pppoe0 up
367313535Sngie	wait_for_session_established dontfail
368313535Sngie	atf_check -s not-exit:0 -o ignore -e ignore \
369313535Sngie	    rump.ping6 -c 1 -X $TIMEOUT $SERVER_IP6
370313535Sngie	atf_check -s exit:0 -o match:'DETACHED' rump.ifconfig pppoe0
371313535Sngie	unset RUMP_SERVER
372303980Sngie}
373303980Sngie
374313535Sngieatf_test_case pppoe6_pap cleanup
375313535Sngie
376313535Sngiepppoe6_pap_head()
377303980Sngie{
378313535Sngie	atf_set "descr" "Does simple pap using IPv6 tests"
379313535Sngie	atf_set "require.progs" "rump_server pppoectl"
380313535Sngie}
381313535Sngie
382313535Sngiepppoe6_pap_body()
383313535Sngie{
384313535Sngie	run_test6 pap
385313535Sngie}
386313535Sngie
387313535Sngiepppoe6_pap_cleanup()
388313535Sngie{
389303980Sngie	cleanup
390303980Sngie}
391313535Sngie
392313535Sngieatf_test_case pppoe6_chap cleanup
393313535Sngie
394313535Sngiepppoe6_chap_head()
395313535Sngie{
396313535Sngie	atf_set "descr" "Does simple chap using IPv6 tests"
397313535Sngie	atf_set "require.progs" "rump_server pppoectl"
398313535Sngie}
399313535Sngie
400313535Sngiepppoe6_chap_body()
401313535Sngie{
402313535Sngie	run_test6 chap
403313535Sngie}
404313535Sngie
405313535Sngiepppoe6_chap_cleanup()
406313535Sngie{
407313535Sngie	cleanup
408313535Sngie}
409313535Sngie
410303980Sngieatf_init_test_cases()
411303980Sngie{
412313535Sngie	atf_add_test_case pppoe_pap
413313535Sngie	atf_add_test_case pppoe_chap
414313535Sngie	atf_add_test_case pppoe6_pap
415313535Sngie	atf_add_test_case pppoe6_chap
416303980Sngie}
417