Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F145509846
D46136.id141402.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D46136.id141402.diff
View Options
diff --git a/tests/sys/netinet6/Makefile b/tests/sys/netinet6/Makefile
--- a/tests/sys/netinet6/Makefile
+++ b/tests/sys/netinet6/Makefile
@@ -4,28 +4,30 @@
FILESDIR= ${TESTSDIR}
ATF_TESTS_PYTEST= test_ip6_output.py
-ATF_TESTS_SH= \
- exthdr \
- mld \
- scapyi386 \
- redirect \
- divert \
- forward6 \
- output6 \
- lpm6 \
- fibs6 \
- ndp \
- proxy_ndp
+ATF_TESTS_SH= exthdr \
+ mld \
+ scapyi386 \
+ redirect \
+ divert \
+ forward6 \
+ output6 \
+ lpm6 \
+ fibs6 \
+ ndp \
+ proxy_ndp
+
TEST_METADATA.output6+= required_programs="python"
-${PACKAGE}FILES+= exthdr.py
-${PACKAGE}FILES+= mld.py
-${PACKAGE}FILES+= scapyi386.py
-${PACKAGE}FILES+= redirect.py
+${PACKAGE}FILES+= exthdr.py \
+ mld.py \
+ scapyi386.py \
+ ra.py \
+ redirect.py
${PACKAGE}FILESMODE_exthdr.py= 0555
${PACKAGE}FILESMODE_mld.py= 0555
${PACKAGE}FILESMODE_scapyi386.py=0555
+${PACKAGE}FILESMODE_ra.py=0555
${PACKAGE}FILESMODE_redirect.py=0555
TESTS_SUBDIRS+= frag6
diff --git a/tests/sys/netinet6/ndp.sh b/tests/sys/netinet6/ndp.sh
--- a/tests/sys/netinet6/ndp.sh
+++ b/tests/sys/netinet6/ndp.sh
@@ -25,7 +25,6 @@
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
-#
. $(atf_get_srcdir)/../common/vnet.subr
@@ -36,6 +35,7 @@
}
ndp_add_gu_success_body() {
+ local epair0 jname
vnet_init
@@ -74,6 +74,7 @@
}
ndp_del_gu_success_body() {
+ local epair0 jname
vnet_init
@@ -102,13 +103,94 @@
vnet_cleanup
}
+ndp_if_up()
+{
+ local ifname=$1
+ local jname=$2
-atf_init_test_cases()
+ if [ -n "$jname" ]; then
+ jname="jexec ${jname}"
+ fi
+ atf_check ${jname} ifconfig ${ifname} up
+ atf_check ${jname} ifconfig ${ifname} inet6 -ifdisabled
+ while ${jname} ifconfig ${ifname} inet6 | grep tentative; do
+ sleep 0.1
+ done
+}
+
+ndp_if_lladdr()
{
+ local ifname=$1
+ local jname=$2
- atf_add_test_case "ndp_add_gu_success"
- atf_add_test_case "ndp_del_gu_success"
+ if [ -n "$jname" ]; then
+ jname="jexec ${jname}"
+ fi
+ ${jname} ifconfig ${ifname} inet6 | \
+ awk '/inet6 fe80:/{split($2, addr, "%"); print addr[1]}'
}
-# end
+atf_test_case "ndp_slaac_default_route" "cleanup"
+ndp_slaac_default_route_head() {
+ atf_set descr 'Test default route installation via SLAAC'
+ atf_set require.user root
+ atf_set require.progs "python"
+}
+
+ndp_slaac_default_route_body() {
+ local epair0 jname lladdr
+
+ vnet_init
+
+ jname="v6t-ndp_slaac_default_route"
+
+ epair0=$(vnet_mkepair)
+ vnet_mkjail ${jname} ${epair0}a
+
+ ndp_if_up ${epair0}a ${jname}
+ ndp_if_up ${epair0}b
+ atf_check jexec ${jname} ifconfig ${epair0}a inet6 accept_rtadv
+
+ # Send an RA advertising a prefix.
+ atf_check -e ignore python $(atf_get_srcdir)/ra.py \
+ --sendif ${epair0}b \
+ --dst $(ndp_if_lladdr ${epair0}a ${jname}) \
+ --src $(ndp_if_lladdr ${epair0}b) \
+ --prefix "2001:db8:ffff:1000::" --prefixlen 64
+
+ # Wait for a default router to appear.
+ while [ -z "$(jexec ${jname} ndp -r)" ]; do
+ sleep 0.1
+ done
+ atf_check -o match:"^default[[:space:]]+fe80:" \
+ jexec ${jname} netstat -rn -6
+
+ # Get rid of the default route.
+ jexec ${jname} route -6 flush
+ atf_check -o not-match:"^default[[:space:]]+fe80:" \
+ jexec ${jname} netstat -rn -6
+
+ # Send another RA, make sure that the default route is installed again.
+ atf_check -e ignore python $(atf_get_srcdir)/ra.py \
+ --sendif ${epair0}b \
+ --dst $(ndp_if_lladdr ${epair0}a ${jname}) \
+ --src $(ndp_if_lladdr ${epair0}b) \
+ --prefix "2001:db8:ffff:1000::" --prefixlen 64
+ while [ -z "$(jexec ${jname} ndp -r)" ]; do
+ sleep 0.1
+ done
+ atf_check -o match:"^default[[:space:]]+fe80:" \
+ jexec ${jname} netstat -rn -6
+}
+
+ndp_slaac_default_route_cleanup() {
+ vnet_cleanup
+}
+
+atf_init_test_cases()
+{
+ atf_add_test_case "ndp_add_gu_success"
+ atf_add_test_case "ndp_del_gu_success"
+ atf_add_test_case "ndp_slaac_default_route"
+}
diff --git a/tests/sys/netinet6/ra.py b/tests/sys/netinet6/ra.py
new file mode 100644
--- /dev/null
+++ b/tests/sys/netinet6/ra.py
@@ -0,0 +1,38 @@
+#-
+# SPDX-License-Identifier: BSD-2-Clause
+#
+# Copyright (c) 2024 Klara, Inc.
+#
+
+import argparse
+import scapy.all as sp
+import sys
+
+#
+# Emit a router advertisement with the specified prefix.
+#
+def main():
+ parser = argparse.ArgumentParser("ra.py",
+ description="Emits Router Advertisement packets")
+ parser.add_argument('--sendif', nargs=1, required=True,
+ help='The interface through which the packet will be sent')
+ parser.add_argument('--src', nargs=1, required=True,
+ help='The source IP address')
+ parser.add_argument('--dst', nargs=1, required=True,
+ help='The destination IP address')
+ parser.add_argument('--prefix', nargs=1, required=True,
+ help='The prefix to be advertised')
+ parser.add_argument('--prefixlen', nargs=1, required=True, type=int,
+ help='The prefix length to be advertised')
+
+ args = parser.parse_args()
+ pkt = sp.Ether() / \
+ sp.IPv6(src=args.src, dst=args.dst) / \
+ sp.ICMPv6ND_RA(chlim=64) / \
+ sp.ICMPv6NDOptPrefixInfo(prefix=args.prefix, prefixlen=args.prefixlen)
+
+ sp.sendp(pkt, iface=args.sendif[0], verbose=False)
+ sys.exit(0)
+
+if __name__ == '__main__':
+ main()
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Feb 21, 6:46 PM (8 h, 39 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28926306
Default Alt Text
D46136.id141402.diff (5 KB)
Attached To
Mode
D46136: netinet6 tests: Add a regression test for default router handling
Attached
Detach File
Event Timeline
Log In to Comment