1*cdebaff8SEnji Cooper# $NetBSD: t_dad.sh,v 1.12 2016/11/25 08:51:17 ozaki-r Exp $ 2640235e2SEnji Cooper# 3640235e2SEnji Cooper# Copyright (c) 2015 The NetBSD Foundation, Inc. 4640235e2SEnji Cooper# All rights reserved. 5640235e2SEnji Cooper# 6640235e2SEnji Cooper# Redistribution and use in source and binary forms, with or without 7640235e2SEnji Cooper# modification, are permitted provided that the following conditions 8640235e2SEnji Cooper# are met: 9640235e2SEnji Cooper# 1. Redistributions of source code must retain the above copyright 10640235e2SEnji Cooper# notice, this list of conditions and the following disclaimer. 11640235e2SEnji Cooper# 2. Redistributions in binary form must reproduce the above copyright 12640235e2SEnji Cooper# notice, this list of conditions and the following disclaimer in the 13640235e2SEnji Cooper# documentation and/or other materials provided with the distribution. 14640235e2SEnji Cooper# 15640235e2SEnji Cooper# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 16640235e2SEnji Cooper# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 17640235e2SEnji Cooper# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 18640235e2SEnji Cooper# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 19640235e2SEnji Cooper# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20640235e2SEnji Cooper# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21640235e2SEnji Cooper# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22640235e2SEnji Cooper# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23640235e2SEnji Cooper# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24640235e2SEnji Cooper# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25640235e2SEnji Cooper# POSSIBILITY OF SUCH DAMAGE. 26640235e2SEnji Cooper# 27640235e2SEnji Cooper 28640235e2SEnji CooperSOCKLOCAL=unix://commsock1 29640235e2SEnji CooperSOCKPEER=unix://commsock2 30640235e2SEnji Cooper 31*cdebaff8SEnji CooperDEBUG=${DEBUG:-false} 32*cdebaff8SEnji Cooper 33*cdebaff8SEnji Cooperduplicated="[Dd][Uu][Pp][Ll][Ii][Cc][Aa][Tt][Ee][Dd]" 34640235e2SEnji Cooper 35640235e2SEnji Cooperatf_test_case dad_basic cleanup 36640235e2SEnji Cooperatf_test_case dad_duplicated cleanup 37*cdebaff8SEnji Cooperatf_test_case dad_count cleanup 38640235e2SEnji Cooper 39640235e2SEnji Cooperdad_basic_head() 40640235e2SEnji Cooper{ 41640235e2SEnji Cooper atf_set "descr" "Tests for IPv6 DAD basic behavior" 42640235e2SEnji Cooper atf_set "require.progs" "rump_server" 43640235e2SEnji Cooper} 44640235e2SEnji Cooper 45640235e2SEnji Cooperdad_duplicated_head() 46640235e2SEnji Cooper{ 47640235e2SEnji Cooper atf_set "descr" "Tests for IPv6 DAD duplicated state" 48640235e2SEnji Cooper atf_set "require.progs" "rump_server" 49640235e2SEnji Cooper} 50640235e2SEnji Cooper 51*cdebaff8SEnji Cooperdad_count_head() 52*cdebaff8SEnji Cooper{ 53*cdebaff8SEnji Cooper atf_set "descr" "Tests for IPv6 DAD count behavior" 54*cdebaff8SEnji Cooper atf_set "require.progs" "rump_server" 55*cdebaff8SEnji Cooper} 56*cdebaff8SEnji Cooper 57640235e2SEnji Coopersetup_server() 58640235e2SEnji Cooper{ 59640235e2SEnji Cooper local sock=$1 60640235e2SEnji Cooper local ip=$2 61640235e2SEnji Cooper 62*cdebaff8SEnji Cooper rump_server_add_iface $sock shmif0 bus1 63640235e2SEnji Cooper 64*cdebaff8SEnji Cooper export RUMP_SERVER=$sock 65640235e2SEnji Cooper atf_check -s exit:0 rump.ifconfig shmif0 inet6 $ip 66640235e2SEnji Cooper atf_check -s exit:0 rump.ifconfig shmif0 up 67640235e2SEnji Cooper atf_check -s exit:0 rump.ifconfig -w 10 68640235e2SEnji Cooper 69640235e2SEnji Cooper $DEBUG && rump.ifconfig shmif0 70640235e2SEnji Cooper} 71640235e2SEnji Cooper 72640235e2SEnji Coopermake_ns_pkt_str() 73640235e2SEnji Cooper{ 74640235e2SEnji Cooper local id=$1 75640235e2SEnji Cooper local target=$2 76640235e2SEnji Cooper pkt="33:33:ff:00:00:0${id}, ethertype IPv6 (0x86dd), length 78: ::" 77640235e2SEnji Cooper pkt="$pkt > ff02::1:ff00:${id}: ICMP6, neighbor solicitation," 78640235e2SEnji Cooper pkt="$pkt who has $target, length 24" 79640235e2SEnji Cooper echo $pkt 80640235e2SEnji Cooper} 81640235e2SEnji Cooper 82640235e2SEnji Cooperdad_basic_body() 83640235e2SEnji Cooper{ 84640235e2SEnji Cooper local pkt= 85640235e2SEnji Cooper local localip1=fc00::1 86640235e2SEnji Cooper local localip2=fc00::2 87640235e2SEnji Cooper local localip3=fc00::3 88640235e2SEnji Cooper 89*cdebaff8SEnji Cooper rump_server_start $SOCKLOCAL netinet6 90*cdebaff8SEnji Cooper rump_server_add_iface $SOCKLOCAL shmif0 bus1 91640235e2SEnji Cooper 92*cdebaff8SEnji Cooper export RUMP_SERVER=$SOCKLOCAL 93640235e2SEnji Cooper atf_check -s exit:0 rump.ifconfig shmif0 inet6 $localip1 94640235e2SEnji Cooper atf_check -s exit:0 rump.ifconfig shmif0 inet6 $localip2 95640235e2SEnji Cooper $DEBUG && rump.ifconfig shmif0 96640235e2SEnji Cooper 97640235e2SEnji Cooper atf_check -s exit:0 rump.ifconfig shmif0 up 98640235e2SEnji Cooper rump.ifconfig shmif0 > ./out 99640235e2SEnji Cooper $DEBUG && cat ./out 100640235e2SEnji Cooper 101640235e2SEnji Cooper # The primary address doesn't start with tentative state 102640235e2SEnji Cooper atf_check -s not-exit:0 -x "cat ./out |grep $localip1 |grep -q tentative" 103640235e2SEnji Cooper # The alias address starts with tentative state 104640235e2SEnji Cooper # XXX we have no stable way to check this, so skip for now 105640235e2SEnji Cooper #atf_check -s exit:0 -x "cat ./out |grep $localip2 |grep -q tentative" 106640235e2SEnji Cooper 107640235e2SEnji Cooper atf_check -s exit:0 sleep 2 108*cdebaff8SEnji Cooper extract_new_packets bus1 > ./out 109640235e2SEnji Cooper $DEBUG && cat ./out 110640235e2SEnji Cooper 111640235e2SEnji Cooper # Check DAD probe packets (Neighbor Solicitation Message) 112640235e2SEnji Cooper pkt=$(make_ns_pkt_str 2 $localip2) 113640235e2SEnji Cooper atf_check -s exit:0 -x "cat ./out |grep -q '$pkt'" 114640235e2SEnji Cooper # No DAD for the primary address 115640235e2SEnji Cooper pkt=$(make_ns_pkt_str 1 $localip1) 116640235e2SEnji Cooper atf_check -s not-exit:0 -x "cat ./out |grep -q '$pkt'" 117640235e2SEnji Cooper 118640235e2SEnji Cooper # Waiting for DAD complete 119640235e2SEnji Cooper atf_check -s exit:0 rump.ifconfig -w 10 120*cdebaff8SEnji Cooper extract_new_packets bus1 > ./out 121640235e2SEnji Cooper $DEBUG && cat ./out 122640235e2SEnji Cooper 123640235e2SEnji Cooper # IPv6 DAD doesn't announce (Neighbor Advertisement Message) 124640235e2SEnji Cooper 125640235e2SEnji Cooper # The alias address left tentative 126640235e2SEnji Cooper atf_check -s not-exit:0 -x "rump.ifconfig shmif0 |grep $localip2 |grep -q tentative" 127640235e2SEnji Cooper 128640235e2SEnji Cooper # 129640235e2SEnji Cooper # Add a new address on the fly 130640235e2SEnji Cooper # 131640235e2SEnji Cooper atf_check -s exit:0 rump.ifconfig shmif0 inet6 $localip3 132640235e2SEnji Cooper 133640235e2SEnji Cooper # The new address starts with tentative state 134640235e2SEnji Cooper # XXX we have no stable way to check this, so skip for now 135640235e2SEnji Cooper #atf_check -s exit:0 -x "rump.ifconfig shmif0 |grep $localip3 |grep -q tentative" 136640235e2SEnji Cooper 137640235e2SEnji Cooper # Check DAD probe packets (Neighbor Solicitation Message) 138640235e2SEnji Cooper atf_check -s exit:0 sleep 2 139*cdebaff8SEnji Cooper extract_new_packets bus1 > ./out 140640235e2SEnji Cooper $DEBUG && cat ./out 141640235e2SEnji Cooper pkt=$(make_ns_pkt_str 3 $localip3) 142640235e2SEnji Cooper atf_check -s exit:0 -x "cat ./out |grep -q '$pkt'" 143640235e2SEnji Cooper 144640235e2SEnji Cooper # Waiting for DAD complete 145640235e2SEnji Cooper atf_check -s exit:0 rump.ifconfig -w 10 146*cdebaff8SEnji Cooper extract_new_packets bus1 > ./out 147640235e2SEnji Cooper $DEBUG && cat ./out 148640235e2SEnji Cooper 149640235e2SEnji Cooper # IPv6 DAD doesn't announce (Neighbor Advertisement Message) 150640235e2SEnji Cooper 151640235e2SEnji Cooper # The new address left tentative 152640235e2SEnji Cooper atf_check -s not-exit:0 -x "rump.ifconfig shmif0 |grep $localip3 |grep -q tentative" 153*cdebaff8SEnji Cooper 154*cdebaff8SEnji Cooper rump_server_destroy_ifaces 155640235e2SEnji Cooper} 156640235e2SEnji Cooper 157640235e2SEnji Cooperdad_duplicated_body() 158640235e2SEnji Cooper{ 159640235e2SEnji Cooper local localip1=fc00::1 160640235e2SEnji Cooper local localip2=fc00::11 161640235e2SEnji Cooper local peerip=fc00::2 162640235e2SEnji Cooper 163*cdebaff8SEnji Cooper rump_server_start $SOCKLOCAL netinet6 164*cdebaff8SEnji Cooper rump_server_start $SOCKPEER netinet6 165640235e2SEnji Cooper 166640235e2SEnji Cooper setup_server $SOCKLOCAL $localip1 167640235e2SEnji Cooper setup_server $SOCKPEER $peerip 168640235e2SEnji Cooper 169640235e2SEnji Cooper export RUMP_SERVER=$SOCKLOCAL 170640235e2SEnji Cooper 171640235e2SEnji Cooper # The primary address isn't marked as duplicated 172*cdebaff8SEnji Cooper atf_check -s exit:0 -o not-match:"$localip1.+$duplicated" \ 173*cdebaff8SEnji Cooper rump.ifconfig shmif0 174640235e2SEnji Cooper 175640235e2SEnji Cooper # 176640235e2SEnji Cooper # Add a new address duplicated with the peer server 177640235e2SEnji Cooper # 178640235e2SEnji Cooper atf_check -s exit:0 rump.ifconfig shmif0 inet6 $peerip 179640235e2SEnji Cooper atf_check -s exit:0 sleep 1 180640235e2SEnji Cooper 181640235e2SEnji Cooper # The new address is marked as duplicated 182*cdebaff8SEnji Cooper atf_check -s exit:0 -o match:"$peerip.+$duplicated" \ 183*cdebaff8SEnji Cooper rump.ifconfig shmif0 184640235e2SEnji Cooper 185640235e2SEnji Cooper # A unique address isn't marked as duplicated 186640235e2SEnji Cooper atf_check -s exit:0 rump.ifconfig shmif0 inet6 $localip2 187640235e2SEnji Cooper atf_check -s exit:0 sleep 1 188*cdebaff8SEnji Cooper atf_check -s exit:0 -o not-match:"$localip2.+$duplicated" \ 189*cdebaff8SEnji Cooper rump.ifconfig shmif0 190*cdebaff8SEnji Cooper 191*cdebaff8SEnji Cooper rump_server_destroy_ifaces 192640235e2SEnji Cooper} 193640235e2SEnji Cooper 194*cdebaff8SEnji Cooperdad_count_test() 195640235e2SEnji Cooper{ 196*cdebaff8SEnji Cooper local pkt= 197*cdebaff8SEnji Cooper local count=$1 198*cdebaff8SEnji Cooper local id=$2 199*cdebaff8SEnji Cooper local target=$3 200*cdebaff8SEnji Cooper 201*cdebaff8SEnji Cooper # 202*cdebaff8SEnji Cooper # Set DAD count to $count 203*cdebaff8SEnji Cooper # 204*cdebaff8SEnji Cooper atf_check -s exit:0 rump.sysctl -w -q net.inet6.ip6.dad_count=$count 205*cdebaff8SEnji Cooper 206*cdebaff8SEnji Cooper # Add a new address 207*cdebaff8SEnji Cooper atf_check -s exit:0 rump.ifconfig shmif0 inet6 $target 208*cdebaff8SEnji Cooper 209*cdebaff8SEnji Cooper # Waiting for DAD complete 210*cdebaff8SEnji Cooper atf_check -s exit:0 rump.ifconfig -w 20 211*cdebaff8SEnji Cooper 212*cdebaff8SEnji Cooper # Check the number of DAD probe packets (Neighbor Solicitation Message) 213*cdebaff8SEnji Cooper atf_check -s exit:0 sleep 2 214*cdebaff8SEnji Cooper extract_new_packets bus1 > ./out 215*cdebaff8SEnji Cooper $DEBUG && cat ./out 216*cdebaff8SEnji Cooper pkt=$(make_ns_pkt_str $id $target) 217*cdebaff8SEnji Cooper atf_check -s exit:0 -o match:"$count" \ 218*cdebaff8SEnji Cooper -x "cat ./out |grep '$pkt' | wc -l | tr -d ' '" 219640235e2SEnji Cooper} 220640235e2SEnji Cooper 221*cdebaff8SEnji Cooperdad_count_body() 222640235e2SEnji Cooper{ 223*cdebaff8SEnji Cooper local localip1=fc00::1 224*cdebaff8SEnji Cooper local localip2=fc00::2 225*cdebaff8SEnji Cooper 226*cdebaff8SEnji Cooper rump_server_start $SOCKLOCAL netinet6 227*cdebaff8SEnji Cooper rump_server_add_iface $SOCKLOCAL shmif0 bus1 228*cdebaff8SEnji Cooper 229640235e2SEnji Cooper export RUMP_SERVER=$SOCKLOCAL 230640235e2SEnji Cooper 231*cdebaff8SEnji Cooper # Check default value 232*cdebaff8SEnji Cooper atf_check -s exit:0 -o match:"1" rump.sysctl -n net.inet6.ip6.dad_count 233640235e2SEnji Cooper 234*cdebaff8SEnji Cooper # Setup interface 235*cdebaff8SEnji Cooper atf_check -s exit:0 rump.ifconfig shmif0 up 236*cdebaff8SEnji Cooper atf_check -s exit:0 sleep 2 237*cdebaff8SEnji Cooper rump.ifconfig shmif0 > ./out 238*cdebaff8SEnji Cooper $DEBUG && cat ./out 239*cdebaff8SEnji Cooper 240*cdebaff8SEnji Cooper # 241*cdebaff8SEnji Cooper # Set and test DAD count (count=1) 242*cdebaff8SEnji Cooper # 243*cdebaff8SEnji Cooper dad_count_test 1 1 $localip1 244*cdebaff8SEnji Cooper 245*cdebaff8SEnji Cooper # 246*cdebaff8SEnji Cooper # Set and test DAD count (count=8) 247*cdebaff8SEnji Cooper # 248*cdebaff8SEnji Cooper dad_count_test 8 2 $localip2 249*cdebaff8SEnji Cooper 250*cdebaff8SEnji Cooper rump_server_destroy_ifaces 251640235e2SEnji Cooper} 252640235e2SEnji Cooper 253640235e2SEnji Cooperdad_basic_cleanup() 254640235e2SEnji Cooper{ 255*cdebaff8SEnji Cooper $DEBUG && dump 256*cdebaff8SEnji Cooper cleanup 257640235e2SEnji Cooper} 258640235e2SEnji Cooper 259640235e2SEnji Cooperdad_duplicated_cleanup() 260640235e2SEnji Cooper{ 261640235e2SEnji Cooper $DEBUG && dump 262640235e2SEnji Cooper cleanup 263640235e2SEnji Cooper} 264640235e2SEnji Cooper 265*cdebaff8SEnji Cooperdad_count_cleanup() 266*cdebaff8SEnji Cooper{ 267*cdebaff8SEnji Cooper $DEBUG && dump 268*cdebaff8SEnji Cooper cleanup 269*cdebaff8SEnji Cooper} 270*cdebaff8SEnji Cooper 271640235e2SEnji Cooperatf_init_test_cases() 272640235e2SEnji Cooper{ 273640235e2SEnji Cooper atf_add_test_case dad_basic 274640235e2SEnji Cooper atf_add_test_case dad_duplicated 275*cdebaff8SEnji Cooper atf_add_test_case dad_count 276640235e2SEnji Cooper} 277