1313680Sngie# $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" 31313680Sngie# 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 39313680SngieSERVER_IP6=fc00::1 40313680SngieCLIENT_IP6=fc00::3 41303980SngieAUTHNAME=foobar@baz.com 42303980SngieSECRET=oink 43303980SngieBUS=bus0 44303980SngieTIMEOUT=3 45313680SngieWAITTIME=10 46313680SngieDEBUG=${DEBUG:-false} 47303980Sngie 48303980Sngiesetup() 49303980Sngie{ 50313680Sngie inet=true 51313680Sngie 52313680Sngie if [ $# -ne 0 ]; then 53313680Sngie eval $@ 54313680Sngie fi 55313680Sngie 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 65313680Sngie $inet && atf_check -s exit:0 rump.ifconfig pppoe0 \ 66313680Sngie 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 81313680Sngie $inet && atf_check -s exit:0 rump.ifconfig pppoe0 \ 82313680Sngie 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} 87313680Sngie 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 106313680Sngie if [ "$dontfail" != "dontfail" ]; then 107303980Sngie atf_fail "Couldn't connect to the server for $n seconds." 108303980Sngie fi 109303980Sngie} 110303980Sngie 111313680Sngiewait_for_disconnected() 112303980Sngie{ 113313680Sngie local dontfail=$1 114313680Sngie local n=$WAITTIME 115313680Sngie 116313680Sngie for i in $(seq $n); do 117313680Sngie $HIJACKING pppoectl -d pppoe0 | grep -q "state = initial" 118313680Sngie [ $? = 0 ] && return 119313680Sngie # If PPPoE client is disconnected by PPPoE server and then 120313680Sngie # the client kicks callout of pppoe_timeout(), the client 121313680Sngie # state is changed to PPPOE_STATE_PADI_SENT while padi retrying. 122313680Sngie $HIJACKING pppoectl -d pppoe0 | grep -q "state = PADI sent" 123313680Sngie [ $? = 0 ] && return 124313680Sngie 125313680Sngie sleep 1 126313680Sngie done 127313680Sngie 128313680Sngie if [ "$dontfail" != "dontfail" ]; then 129313680Sngie atf_fail "Couldn't disconnect for $n seconds." 130313680Sngie fi 131313680Sngie} 132313680Sngie 133313680Sngierun_test() 134313680Sngie{ 135313680Sngie local auth=$1 136303980Sngie setup 137303980Sngie 138313680Sngie # As pppoe client doesn't support rechallenge yet. 139313680Sngie local server_optparam="" 140313680Sngie if [ $auth = "chap" ]; then 141313680Sngie server_optparam="norechallenge" 142313680Sngie fi 143313680Sngie 144303980Sngie export RUMP_SERVER=$SERVER 145303980Sngie local setup_serverparam="pppoectl pppoe0 hisauthproto=$auth \ 146303980Sngie 'hisauthname=$AUTHNAME' \ 147303980Sngie 'hisauthsecret=$SECRET' \ 148313680Sngie 'myauthproto=none' \ 149313680Sngie $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 167313680Sngie export RUMP_SERVER=$SERVER 168313680Sngie atf_check -s exit:0 rump.ifconfig pppoe0 down 169313680Sngie wait_for_disconnected 170303980Sngie export RUMP_SERVER=$CLIENT 171313680Sngie 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 185313680Sngie export RUMP_SERVER=$CLIENT 186313680Sngie atf_check -s exit:0 -x rump.ifconfig pppoe0 down 187313680Sngie wait_for_disconnected 188303980Sngie export RUMP_SERVER=$SERVER 189313680Sngie 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 196313680Sngie # 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 205313680Sngie 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 214313680Sngie 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 224313680Sngie atf_check -s exit:0 -o match:'DETACHED' rump.ifconfig pppoe0 225313680Sngie unset RUMP_SERVER 226313680Sngie} 227313680Sngie 228313680Sngieatf_test_case pppoe_pap cleanup 229313680Sngie 230313680Sngiepppoe_pap_head() 231313680Sngie{ 232313680Sngie atf_set "descr" "Does simple pap tests" 233313680Sngie atf_set "require.progs" "rump_server pppoectl" 234313680Sngie} 235313680Sngie 236313680Sngiepppoe_pap_body() 237313680Sngie{ 238313680Sngie run_test pap 239313680Sngie} 240313680Sngie 241313680Sngiepppoe_pap_cleanup() 242313680Sngie{ 243313680Sngie cleanup 244313680Sngie} 245313680Sngie 246313680Sngieatf_test_case pppoe_chap cleanup 247313680Sngie 248313680Sngiepppoe_chap_head() 249313680Sngie{ 250313680Sngie atf_set "descr" "Does simple chap tests" 251313680Sngie atf_set "require.progs" "rump_server pppoectl" 252313680Sngie} 253313680Sngie 254313680Sngiepppoe_chap_body() 255313680Sngie{ 256313680Sngie run_test chap 257313680Sngie} 258313680Sngie 259313680Sngiepppoe_chap_cleanup() 260313680Sngie{ 261313680Sngie cleanup 262313680Sngie} 263313680Sngie 264313680Sngierun_test6() 265313680Sngie{ 266313680Sngie local auth=$1 267313680Sngie setup "inet=false" 268313680Sngie 269313680Sngie # As pppoe client doesn't support rechallenge yet. 270313680Sngie local server_optparam="" 271313680Sngie if [ $auth = "chap" ]; then 272313680Sngie server_optparam="norechallenge" 273313680Sngie fi 274313680Sngie 275313680Sngie export RUMP_SERVER=$SERVER 276313680Sngie local setup_serverparam="pppoectl pppoe0 hisauthproto=$auth \ 277313680Sngie 'hisauthname=$AUTHNAME' \ 278313680Sngie 'hisauthsecret=$SECRET' \ 279313680Sngie 'myauthproto=none' \ 280313680Sngie $server_optparam" 281313680Sngie atf_check -s exit:0 -x "$HIJACKING $setup_serverparam" 282313680Sngie atf_check -s exit:0 rump.ifconfig pppoe0 inet6 $SERVER_IP6/64 down 283313680Sngie atf_check -s exit:0 rump.ifconfig pppoe0 up 284313680Sngie unset RUMP_SERVER 285313680Sngie 286313680Sngie export RUMP_SERVER=$CLIENT 287313680Sngie local setup_clientparam="pppoectl pppoe0 myauthproto=$auth \ 288313680Sngie 'myauthname=$AUTHNAME' \ 289313680Sngie 'myauthsecret=$SECRET' \ 290313680Sngie 'hisauthproto=none'" 291313680Sngie atf_check -s exit:0 -x "$HIJACKING $setup_clientparam" 292313680Sngie atf_check -s exit:0 rump.ifconfig pppoe0 inet6 $CLIENT_IP6/64 down 293313680Sngie atf_check -s exit:0 rump.ifconfig pppoe0 up 294313680Sngie $DEBUG && rump.ifconfig 295313680Sngie wait_for_session_established 296313680Sngie atf_check -s exit:0 -o ignore rump.ifconfig -w 10 297313680Sngie export RUMP_SERVER=$SERVER 298313680Sngie atf_check -s exit:0 -o ignore rump.ifconfig -w 10 299313680Sngie export RUMP_SERVER=$CLIENT 300313680Sngie atf_check -s exit:0 -o ignore rump.ping6 -c 1 -X $TIMEOUT $SERVER_IP6 301313680Sngie unset RUMP_SERVER 302313680Sngie 303313680Sngie # test for disconnection from server 304313680Sngie export RUMP_SERVER=$SERVER 305313680Sngie session_id=`$HIJACKING pppoectl -d pppoe0 | grep state` 306313680Sngie atf_check -s exit:0 rump.ifconfig pppoe0 down 307313680Sngie wait_for_disconnected 308313680Sngie export RUMP_SERVER=$CLIENT 309313680Sngie wait_for_disconnected 310313680Sngie atf_check -s not-exit:0 -o ignore -e ignore \ 311313680Sngie rump.ping6 -c 1 -X $TIMEOUT $SERVER_IP6 312313680Sngie atf_check -s exit:0 -o not-match:"$session_id" -x "$HIJACKING pppoectl -d pppoe0" 313313680Sngie unset RUMP_SERVER 314313680Sngie 315313680Sngie # test for recoonecting 316313680Sngie export RUMP_SERVER=$SERVER 317313680Sngie atf_check -s exit:0 rump.ifconfig pppoe0 up 318313680Sngie wait_for_session_established 319313680Sngie atf_check -s exit:0 rump.ifconfig -w 10 320313680Sngie $DEBUG && $HIJACKING pppoectl -d pppoe0 321313680Sngie $DEBUG && rump.ifconfig pppoe0 322313680Sngie export RUMP_SERVER=$CLIENT 323313680Sngie atf_check -s exit:0 -o ignore rump.ifconfig -w 10 324313680Sngie atf_check -s exit:0 -o ignore rump.ping6 -c 1 -X $TIMEOUT $SERVER_IP6 325313680Sngie unset RUMP_SERVER 326313680Sngie 327313680Sngie # test for disconnection from client 328313680Sngie export RUMP_SERVER=$CLIENT 329313680Sngie atf_check -s exit:0 rump.ifconfig pppoe0 down 330313680Sngie wait_for_disconnected 331313680Sngie 332313680Sngie export RUMP_SERVER=$SERVER 333313680Sngie wait_for_disconnected 334313680Sngie $DEBUG && $HIJACKING pppoectl -d pppoe0 335313680Sngie atf_check -s not-exit:0 -o ignore -e ignore \ 336313680Sngie 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 339313680Sngie 340313680Sngie # test for reconnecting 341313680Sngie export RUMP_SERVER=$CLIENT 342313680Sngie atf_check -s exit:0 rump.ifconfig pppoe0 up 343313680Sngie wait_for_session_established 344313680Sngie atf_check -s exit:0 rump.ifconfig -w 10 345313680Sngie 346313680Sngie $DEBUG && rump.ifconfig pppoe0 347313680Sngie $DEBUG && $HIJACKING pppoectl -d pppoe0 348313680Sngie unset RUMP_SERVER 349313680Sngie 350313680Sngie export RUMP_SERVER=$SERVER 351313680Sngie atf_check -s exit:0 rump.ifconfig -w 10 352313680Sngie atf_check -s exit:0 -o ignore rump.ping6 -c 1 -X $TIMEOUT $CLIENT_IP6 353313680Sngie atf_check -s exit:0 -o match:'session' -x "$HIJACKING pppoectl -d pppoe0" 354313680Sngie $DEBUG && HIJACKING pppoectl -d pppoe0 355313680Sngie unset RUMP_SERVER 356313680Sngie 357313680Sngie # test for invalid password 358313680Sngie export RUMP_SERVER=$CLIENT 359313680Sngie atf_check -s exit:0 rump.ifconfig pppoe0 down 360313680Sngie wait_for_disconnected 361313680Sngie local setup_clientparam="pppoectl pppoe0 myauthproto=$auth \ 362313680Sngie 'myauthname=$AUTHNAME' \ 363313680Sngie 'myauthsecret=invalidsecret' \ 364313680Sngie 'hisauthproto=none'" 365313680Sngie atf_check -s exit:0 -x "$HIJACKING $setup_clientparam" 366313680Sngie atf_check -s exit:0 rump.ifconfig pppoe0 up 367313680Sngie wait_for_session_established dontfail 368313680Sngie atf_check -s not-exit:0 -o ignore -e ignore \ 369313680Sngie rump.ping6 -c 1 -X $TIMEOUT $SERVER_IP6 370313680Sngie atf_check -s exit:0 -o match:'DETACHED' rump.ifconfig pppoe0 371313680Sngie unset RUMP_SERVER 372303980Sngie} 373303980Sngie 374313680Sngieatf_test_case pppoe6_pap cleanup 375313680Sngie 376313680Sngiepppoe6_pap_head() 377303980Sngie{ 378313680Sngie atf_set "descr" "Does simple pap using IPv6 tests" 379313680Sngie atf_set "require.progs" "rump_server pppoectl" 380313680Sngie} 381313680Sngie 382313680Sngiepppoe6_pap_body() 383313680Sngie{ 384313680Sngie run_test6 pap 385313680Sngie} 386313680Sngie 387313680Sngiepppoe6_pap_cleanup() 388313680Sngie{ 389303980Sngie cleanup 390303980Sngie} 391313680Sngie 392313680Sngieatf_test_case pppoe6_chap cleanup 393313680Sngie 394313680Sngiepppoe6_chap_head() 395313680Sngie{ 396313680Sngie atf_set "descr" "Does simple chap using IPv6 tests" 397313680Sngie atf_set "require.progs" "rump_server pppoectl" 398313680Sngie} 399313680Sngie 400313680Sngiepppoe6_chap_body() 401313680Sngie{ 402313680Sngie run_test6 chap 403313680Sngie} 404313680Sngie 405313680Sngiepppoe6_chap_cleanup() 406313680Sngie{ 407313680Sngie cleanup 408313680Sngie} 409313680Sngie 410303980Sngieatf_init_test_cases() 411303980Sngie{ 412313680Sngie atf_add_test_case pppoe_pap 413313680Sngie atf_add_test_case pppoe_chap 414313680Sngie atf_add_test_case pppoe6_pap 415313680Sngie atf_add_test_case pppoe6_chap 416303980Sngie} 417