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