xref: /freebsd/tests/sys/netinet6/ndp.sh (revision c46af893cd7aaff322b6f867539bc8fe5bcde6f9)
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