1f17f94cdSAlexander V. Chernikov#!/usr/bin/env atf-sh 2f17f94cdSAlexander V. Chernikov#- 3f17f94cdSAlexander V. Chernikov# SPDX-License-Identifier: BSD-2-Clause 4f17f94cdSAlexander V. Chernikov# 5f17f94cdSAlexander V. Chernikov# Copyright (c) 2021 Alexander V. Chernikov 6f17f94cdSAlexander V. Chernikov# 7f17f94cdSAlexander V. Chernikov# Redistribution and use in source and binary forms, with or without 8f17f94cdSAlexander V. Chernikov# modification, are permitted provided that the following conditions 9f17f94cdSAlexander V. Chernikov# are met: 10f17f94cdSAlexander V. Chernikov# 1. Redistributions of source code must retain the above copyright 11f17f94cdSAlexander V. Chernikov# notice, this list of conditions and the following disclaimer. 12f17f94cdSAlexander V. Chernikov# 2. Redistributions in binary form must reproduce the above copyright 13f17f94cdSAlexander V. Chernikov# notice, this list of conditions and the following disclaimer in the 14f17f94cdSAlexander V. Chernikov# documentation and/or other materials provided with the distribution. 15f17f94cdSAlexander V. Chernikov# 16f17f94cdSAlexander V. Chernikov# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17f17f94cdSAlexander V. Chernikov# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18f17f94cdSAlexander V. Chernikov# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19f17f94cdSAlexander V. Chernikov# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20f17f94cdSAlexander V. Chernikov# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21f17f94cdSAlexander V. Chernikov# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22f17f94cdSAlexander V. Chernikov# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23f17f94cdSAlexander V. Chernikov# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24f17f94cdSAlexander V. Chernikov# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25f17f94cdSAlexander V. Chernikov# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26f17f94cdSAlexander V. Chernikov# SUCH DAMAGE. 27f17f94cdSAlexander V. Chernikov# 28f17f94cdSAlexander V. Chernikov 29f17f94cdSAlexander V. Chernikov. $(atf_get_srcdir)/../common/vnet.subr 30f17f94cdSAlexander V. Chernikov 31f17f94cdSAlexander V. Chernikovatf_test_case "ndp_add_gu_success" "cleanup" 32f17f94cdSAlexander V. Chernikovndp_add_gu_success_head() { 33f17f94cdSAlexander V. Chernikov atf_set descr 'Test static ndp record addition' 34f17f94cdSAlexander V. Chernikov atf_set require.user root 35f17f94cdSAlexander V. Chernikov} 36f17f94cdSAlexander V. Chernikov 37f17f94cdSAlexander V. Chernikovndp_add_gu_success_body() { 38feda3296SMark Johnston local epair0 jname 39f17f94cdSAlexander V. Chernikov 40f17f94cdSAlexander V. Chernikov vnet_init 41f17f94cdSAlexander V. Chernikov 42f17f94cdSAlexander V. Chernikov jname="v6t-ndp_add_success" 43f17f94cdSAlexander V. Chernikov 44f17f94cdSAlexander V. Chernikov epair0=$(vnet_mkepair) 45f17f94cdSAlexander V. Chernikov 46f17f94cdSAlexander V. Chernikov vnet_mkjail ${jname} ${epair0}a 47f17f94cdSAlexander V. Chernikov jexec ${jname} ndp -i ${epair0}a -- -disabled 48f17f94cdSAlexander V. Chernikov jexec ${jname} ifconfig ${epair0}a up 49f17f94cdSAlexander V. Chernikov 50f17f94cdSAlexander V. Chernikov jexec ${jname} ifconfig ${epair0}a inet6 2001:db8::1/64 51f17f94cdSAlexander V. Chernikov 52f17f94cdSAlexander V. Chernikov # wait for DAD to complete 53f17f94cdSAlexander V. Chernikov while [ `jexec ${jname} ifconfig | grep inet6 | grep -c tentative` != "0" ]; do 54f17f94cdSAlexander V. Chernikov sleep 0.1 55f17f94cdSAlexander V. Chernikov done 56f17f94cdSAlexander V. Chernikov 57f17f94cdSAlexander V. Chernikov atf_check jexec ${jname} ndp -s 2001:db8::2 90:10:00:01:02:03 58f17f94cdSAlexander V. Chernikov 59f17f94cdSAlexander V. Chernikov t=`jexec ${jname} ndp -an | grep 2001:db8::2 | awk '{print $1, $2, $3, $4}'` 60f17f94cdSAlexander V. Chernikov if [ "${t}" != "2001:db8::2 90:10:00:01:02:03 ${epair0}a permanent" ]; then 61f17f94cdSAlexander V. Chernikov atf_fail "Wrong output: ${t}" 62f17f94cdSAlexander V. Chernikov fi 63f17f94cdSAlexander V. Chernikov echo "T='${t}'" 64f17f94cdSAlexander V. Chernikov} 65f17f94cdSAlexander V. Chernikov 66f17f94cdSAlexander V. Chernikovndp_add_gu_success_cleanup() { 67f17f94cdSAlexander V. Chernikov vnet_cleanup 68f17f94cdSAlexander V. Chernikov} 69f17f94cdSAlexander V. Chernikov 70f17f94cdSAlexander V. Chernikovatf_test_case "ndp_del_gu_success" "cleanup" 71f17f94cdSAlexander V. Chernikovndp_del_gu_success_head() { 72f17f94cdSAlexander V. Chernikov atf_set descr 'Test ndp record deletion' 73f17f94cdSAlexander V. Chernikov atf_set require.user root 74f17f94cdSAlexander V. Chernikov} 75f17f94cdSAlexander V. Chernikov 76f17f94cdSAlexander V. Chernikovndp_del_gu_success_body() { 77feda3296SMark Johnston local epair0 jname 78f17f94cdSAlexander V. Chernikov 79f17f94cdSAlexander V. Chernikov vnet_init 80f17f94cdSAlexander V. Chernikov 81f17f94cdSAlexander V. Chernikov jname="v6t-ndp_del_gu_success" 82f17f94cdSAlexander V. Chernikov 83f17f94cdSAlexander V. Chernikov epair0=$(vnet_mkepair) 84f17f94cdSAlexander V. Chernikov 85f17f94cdSAlexander V. Chernikov vnet_mkjail ${jname} ${epair0}a 86f17f94cdSAlexander V. Chernikov 87f17f94cdSAlexander V. Chernikov jexec ${jname} ndp -i ${epair0}a -- -disabled 88f17f94cdSAlexander V. Chernikov jexec ${jname} ifconfig ${epair0}a up 89f17f94cdSAlexander V. Chernikov 90f17f94cdSAlexander V. Chernikov jexec ${jname} ifconfig ${epair0}a inet6 2001:db8::1/64 91f17f94cdSAlexander V. Chernikov 92f17f94cdSAlexander V. Chernikov # wait for DAD to complete 93f17f94cdSAlexander V. Chernikov while [ `jexec ${jname} ifconfig | grep inet6 | grep -c tentative` != "0" ]; do 94f17f94cdSAlexander V. Chernikov sleep 0.1 95f17f94cdSAlexander V. Chernikov done 96f17f94cdSAlexander V. Chernikov 97f17f94cdSAlexander V. Chernikov jexec ${jname} ping -c1 -t1 2001:db8::2 98f17f94cdSAlexander V. Chernikov 99f17f94cdSAlexander V. Chernikov atf_check -o match:"2001:db8::2 \(2001:db8::2\) deleted" jexec ${jname} ndp -nd 2001:db8::2 100f17f94cdSAlexander V. Chernikov} 101f17f94cdSAlexander V. Chernikov 10208851be1SKristof Provostndp_del_gu_success_cleanup() { 103f17f94cdSAlexander V. Chernikov vnet_cleanup 104f17f94cdSAlexander V. Chernikov} 105f17f94cdSAlexander V. Chernikov 106feda3296SMark Johnstonndp_if_up() 107feda3296SMark Johnston{ 108feda3296SMark Johnston local ifname=$1 109feda3296SMark Johnston local jname=$2 110feda3296SMark Johnston 111feda3296SMark Johnston if [ -n "$jname" ]; then 112feda3296SMark Johnston jname="jexec ${jname}" 113feda3296SMark Johnston fi 114feda3296SMark Johnston atf_check ${jname} ifconfig ${ifname} up 115feda3296SMark Johnston atf_check ${jname} ifconfig ${ifname} inet6 -ifdisabled 116feda3296SMark Johnston while ${jname} ifconfig ${ifname} inet6 | grep tentative; do 117feda3296SMark Johnston sleep 0.1 118feda3296SMark Johnston done 119feda3296SMark Johnston} 120feda3296SMark Johnston 121feda3296SMark Johnstonndp_if_lladdr() 122feda3296SMark Johnston{ 123feda3296SMark Johnston local ifname=$1 124feda3296SMark Johnston local jname=$2 125feda3296SMark Johnston 126feda3296SMark Johnston if [ -n "$jname" ]; then 127feda3296SMark Johnston jname="jexec ${jname}" 128feda3296SMark Johnston fi 129feda3296SMark Johnston ${jname} ifconfig ${ifname} inet6 | \ 130feda3296SMark Johnston awk '/inet6 fe80:/{split($2, addr, "%"); print addr[1]}' 131feda3296SMark Johnston} 132feda3296SMark Johnston 133feda3296SMark Johnstonatf_test_case "ndp_slaac_default_route" "cleanup" 134feda3296SMark Johnstonndp_slaac_default_route_head() { 135feda3296SMark Johnston atf_set descr 'Test default route installation via SLAAC' 136feda3296SMark Johnston atf_set require.user root 137*c46af893SJose Luis Duran atf_set require.progs python3 scapy 138feda3296SMark Johnston} 139feda3296SMark Johnston 140feda3296SMark Johnstonndp_slaac_default_route_body() { 141feda3296SMark Johnston local epair0 jname lladdr 142feda3296SMark Johnston 143feda3296SMark Johnston vnet_init 144feda3296SMark Johnston 145feda3296SMark Johnston jname="v6t-ndp_slaac_default_route" 146feda3296SMark Johnston 147feda3296SMark Johnston epair0=$(vnet_mkepair) 148feda3296SMark Johnston 149feda3296SMark Johnston vnet_mkjail ${jname} ${epair0}a 150feda3296SMark Johnston 151feda3296SMark Johnston ndp_if_up ${epair0}a ${jname} 152feda3296SMark Johnston ndp_if_up ${epair0}b 153feda3296SMark Johnston atf_check jexec ${jname} ifconfig ${epair0}a inet6 accept_rtadv 154feda3296SMark Johnston 155feda3296SMark Johnston # Send an RA advertising a prefix. 156ec60176eSJose Luis Duran atf_check -e ignore python3 $(atf_get_srcdir)/ra.py \ 157feda3296SMark Johnston --sendif ${epair0}b \ 158feda3296SMark Johnston --dst $(ndp_if_lladdr ${epair0}a ${jname}) \ 159feda3296SMark Johnston --src $(ndp_if_lladdr ${epair0}b) \ 160feda3296SMark Johnston --prefix "2001:db8:ffff:1000::" --prefixlen 64 161feda3296SMark Johnston 162feda3296SMark Johnston # Wait for a default router to appear. 163feda3296SMark Johnston while [ -z "$(jexec ${jname} ndp -r)" ]; do 164feda3296SMark Johnston sleep 0.1 165feda3296SMark Johnston done 166c2aa9174SGleb Smirnoff atf_check -o match:"^default[[:space:]]+fe80:" \ 167feda3296SMark Johnston jexec ${jname} netstat -rn -6 168feda3296SMark Johnston 169feda3296SMark Johnston # Get rid of the default route. 170feda3296SMark Johnston jexec ${jname} route -6 flush 171c2aa9174SGleb Smirnoff atf_check -o not-match:"^default[[:space:]]+fe80:" \ 172feda3296SMark Johnston jexec ${jname} netstat -rn -6 173feda3296SMark Johnston 174feda3296SMark Johnston # Send another RA, make sure that the default route is installed again. 175ec60176eSJose Luis Duran atf_check -e ignore python3 $(atf_get_srcdir)/ra.py \ 176feda3296SMark Johnston --sendif ${epair0}b \ 177feda3296SMark Johnston --dst $(ndp_if_lladdr ${epair0}a ${jname}) \ 178feda3296SMark Johnston --src $(ndp_if_lladdr ${epair0}b) \ 179feda3296SMark Johnston --prefix "2001:db8:ffff:1000::" --prefixlen 64 180feda3296SMark Johnston while [ -z "$(jexec ${jname} ndp -r)" ]; do 181feda3296SMark Johnston sleep 0.1 182feda3296SMark Johnston done 183c2aa9174SGleb Smirnoff atf_check -o match:"^default[[:space:]]+fe80:" \ 184feda3296SMark Johnston jexec ${jname} netstat -rn -6 185feda3296SMark Johnston} 186feda3296SMark Johnston 187feda3296SMark Johnstonndp_slaac_default_route_cleanup() { 188feda3296SMark Johnston vnet_cleanup 189feda3296SMark Johnston} 190f17f94cdSAlexander V. Chernikov 191f17f94cdSAlexander V. Chernikovatf_init_test_cases() 192f17f94cdSAlexander V. Chernikov{ 193f17f94cdSAlexander V. Chernikov atf_add_test_case "ndp_add_gu_success" 194f17f94cdSAlexander V. Chernikov atf_add_test_case "ndp_del_gu_success" 195feda3296SMark Johnston atf_add_test_case "ndp_slaac_default_route" 196f17f94cdSAlexander V. Chernikov} 197