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