xref: /freebsd/tests/sys/netinet6/frag6/frag6.subr (revision c46af893cd7aaff322b6f867539bc8fe5bcde6f9)
1f74e6e49SBjoern A. Zeeb#-
2f74e6e49SBjoern A. Zeeb# SPDX-License-Identifier: BSD-2-Clause
3f74e6e49SBjoern A. Zeeb#
4f74e6e49SBjoern A. Zeeb# Copyright (c) 2019 Netflix, Inc.
5f74e6e49SBjoern A. Zeeb#
6f74e6e49SBjoern A. Zeeb# Redistribution and use in source and binary forms, with or without
7f74e6e49SBjoern A. Zeeb# modification, are permitted provided that the following conditions
8f74e6e49SBjoern A. Zeeb# are met:
9f74e6e49SBjoern A. Zeeb# 1. Redistributions of source code must retain the above copyright
10f74e6e49SBjoern A. Zeeb#    notice, this list of conditions and the following disclaimer.
11f74e6e49SBjoern A. Zeeb# 2. Redistributions in binary form must reproduce the above copyright
12f74e6e49SBjoern A. Zeeb#    notice, this list of conditions and the following disclaimer in the
13f74e6e49SBjoern A. Zeeb#    documentation and/or other materials provided with the distribution.
14f74e6e49SBjoern A. Zeeb#
15f74e6e49SBjoern A. Zeeb# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16f74e6e49SBjoern A. Zeeb# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17f74e6e49SBjoern A. Zeeb# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18f74e6e49SBjoern A. Zeeb# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19f74e6e49SBjoern A. Zeeb# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20f74e6e49SBjoern A. Zeeb# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21f74e6e49SBjoern A. Zeeb# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22f74e6e49SBjoern A. Zeeb# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23f74e6e49SBjoern A. Zeeb# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24f74e6e49SBjoern A. Zeeb# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25f74e6e49SBjoern A. Zeeb# SUCH DAMAGE.
26f74e6e49SBjoern A. Zeeb#
27f74e6e49SBjoern A. Zeeb
28f74e6e49SBjoern A. Zeeb. $(atf_get_srcdir)/../../common/vnet.subr
29f74e6e49SBjoern A. Zeeb
30f74e6e49SBjoern A. Zeebfrag6_head()
31f74e6e49SBjoern A. Zeeb{
32f74e6e49SBjoern A. Zeeb	atf_set descr 'Test IPv6 fragmentation code'
33f74e6e49SBjoern A. Zeeb	atf_set require.user root
34*c46af893SJose Luis Duran	atf_set require.progs python3 scapy
35f74e6e49SBjoern A. Zeeb}
36f74e6e49SBjoern A. Zeeb
37f74e6e49SBjoern A. Zeebfrag6_body()
38f74e6e49SBjoern A. Zeeb{
39f74e6e49SBjoern A. Zeeb	ids=${1:="65533"}
40f74e6e49SBjoern A. Zeeb	shift
41f74e6e49SBjoern A. Zeeb	id=`printf "%x" ${ids}`
42f74e6e49SBjoern A. Zeeb	if [ $$ -gt 65535 ]; then
43f74e6e49SBjoern A. Zeeb		xl=`printf "%x" $(($$ - 65535))`
44f74e6e49SBjoern A. Zeeb		yl="1"
45f74e6e49SBjoern A. Zeeb	else
46f74e6e49SBjoern A. Zeeb		xl=`printf "%x" $$`
47f74e6e49SBjoern A. Zeeb		yl=""
48f74e6e49SBjoern A. Zeeb	fi
49f74e6e49SBjoern A. Zeeb
50f74e6e49SBjoern A. Zeeb	vnet_init
51f74e6e49SBjoern A. Zeeb
52f74e6e49SBjoern A. Zeeb	ip6a="2001:db8:6666:6666:${yl}:${id}:1:${xl}"
53f74e6e49SBjoern A. Zeeb	ip6b="2001:db8:6666:6666:${yl}:${id}:2:${xl}"
54f74e6e49SBjoern A. Zeeb
55f74e6e49SBjoern A. Zeeb	epair=$(vnet_mkepair)
56f21d3207SBjoern A. Zeeb	ifconfig ${epair}a up
57f74e6e49SBjoern A. Zeeb	ifconfig ${epair}a inet6 ${ip6a}/64
58f74e6e49SBjoern A. Zeeb
59f74e6e49SBjoern A. Zeeb	jname="v6t-${id}-${yl}-${xl}"
60f74e6e49SBjoern A. Zeeb	vnet_mkjail ${jname} ${epair}b
61e32221a1SAlexander V. Chernikov	jexec ${jname} sysctl net.inet6.ip6.dad_count=0
62f21d3207SBjoern A. Zeeb	jexec ${jname} ifconfig ${epair}b up
63f74e6e49SBjoern A. Zeeb	jexec ${jname} ifconfig ${epair}b inet6 ${ip6b}/64
64f74e6e49SBjoern A. Zeeb
65e32221a1SAlexander V. Chernikov	# Set max fragment reassembly time to 2 seconds
66e32221a1SAlexander V. Chernikov	jexec ${jname} sysctl net.inet6.ip6.fraglifetime_ms=2000
67e32221a1SAlexander V. Chernikov
68f74e6e49SBjoern A. Zeeb	# Let IPv6 ND do its thing.
69e32221a1SAlexander V. Chernikov	while [ `ifconfig ${epair}a inet6 | grep -c tentative` != "0" ]; do
70e32221a1SAlexander V. Chernikov		sleep 0.1
71e32221a1SAlexander V. Chernikov	done
72f74e6e49SBjoern A. Zeeb
73f74e6e49SBjoern A. Zeeb	# We need to try to make sure all expiry happened, otherwise there might
74f74e6e49SBjoern A. Zeeb	# be global fragments queued.  (This still does not rule out that there
75f74e6e49SBjoern A. Zeeb	# are no other fragments queued anywhere else in the system).
76f74e6e49SBjoern A. Zeeb	i=0
77f74e6e49SBjoern A. Zeeb	while test $i -lt 60; do
78f74e6e49SBjoern A. Zeeb		nf=`sysctl -n net.inet6.ip6.frag6_nfrags`
79f74e6e49SBjoern A. Zeeb		case ${nf} in
80f74e6e49SBjoern A. Zeeb		0)	break ;;
81f74e6e49SBjoern A. Zeeb		esac
82f74e6e49SBjoern A. Zeeb		sleep 1
83f74e6e49SBjoern A. Zeeb		i=$((i + 1))
84f74e6e49SBjoern A. Zeeb	done
85f74e6e49SBjoern A. Zeeb	case ${nf} in
86f74e6e49SBjoern A. Zeeb	0)	;;
87f74e6e49SBjoern A. Zeeb	*)	atf_fail "Global frag6_nfrags count is not zero but ${nf}" ;;
88f74e6e49SBjoern A. Zeeb	esac
89f74e6e49SBjoern A. Zeeb
90f74e6e49SBjoern A. Zeeb	pretestf=$2
91f74e6e49SBjoern A. Zeeb	case "${pretestf}" in
92f74e6e49SBjoern A. Zeeb	"")	;;
93f74e6e49SBjoern A. Zeeb	[A-Za-z0-9_]*)
94f74e6e49SBjoern A. Zeeb		eval ${pretestf} "${jname}" "${epair}b"
95f74e6e49SBjoern A. Zeeb		;;
96f74e6e49SBjoern A. Zeeb	esac
97f74e6e49SBjoern A. Zeeb
98f74e6e49SBjoern A. Zeeb	# Clear statistics.
99f74e6e49SBjoern A. Zeeb	jexec ${jname} netstat -z -s > /dev/null
100f74e6e49SBjoern A. Zeeb
101f74e6e49SBjoern A. Zeeb	# Run fragment tests.
102f74e6e49SBjoern A. Zeeb	pyname=$(atf_get ident)
103f74e6e49SBjoern A. Zeeb	pyname=${pyname%*_[0-9]}
104f74e6e49SBjoern A. Zeeb	atf_check -s exit:0 $(atf_get_srcdir)/${pyname}.py \
105f74e6e49SBjoern A. Zeeb		--sendif ${epair}a \
106f74e6e49SBjoern A. Zeeb		--recvif ${epair}a \
107f74e6e49SBjoern A. Zeeb		--src ${ip6a} \
108f74e6e49SBjoern A. Zeeb		--to  ${ip6b}
109f74e6e49SBjoern A. Zeeb
110f74e6e49SBjoern A. Zeeb	checkf=$1
111f74e6e49SBjoern A. Zeeb	case "${checkf}" in
112f74e6e49SBjoern A. Zeeb	"")	;;
113f74e6e49SBjoern A. Zeeb	[A-Za-z0-9_]*)
114f74e6e49SBjoern A. Zeeb		eval ${checkf} "${jname}" "${epair}b"
115f74e6e49SBjoern A. Zeeb		;;
116f74e6e49SBjoern A. Zeeb	esac
117f74e6e49SBjoern A. Zeeb}
118f74e6e49SBjoern A. Zeeb
119f74e6e49SBjoern A. Zeebfrag6_cleanup()
120f74e6e49SBjoern A. Zeeb{
121f74e6e49SBjoern A. Zeeb
122f74e6e49SBjoern A. Zeeb	vnet_cleanup
123f74e6e49SBjoern A. Zeeb}
124f74e6e49SBjoern A. Zeeb
125f74e6e49SBjoern A. Zeeb# end
126