12207447bSAlexander V. Chernikov#!/usr/bin/env atf-sh 22207447bSAlexander V. Chernikov#- 32207447bSAlexander V. Chernikov# SPDX-License-Identifier: BSD-2-Clause 42207447bSAlexander V. Chernikov# 52207447bSAlexander V. Chernikov# Copyright (c) 2020 Alexander V. Chernikov 62207447bSAlexander V. Chernikov# 72207447bSAlexander V. Chernikov# Redistribution and use in source and binary forms, with or without 82207447bSAlexander V. Chernikov# modification, are permitted provided that the following conditions 92207447bSAlexander V. Chernikov# are met: 102207447bSAlexander V. Chernikov# 1. Redistributions of source code must retain the above copyright 112207447bSAlexander V. Chernikov# notice, this list of conditions and the following disclaimer. 122207447bSAlexander V. Chernikov# 2. Redistributions in binary form must reproduce the above copyright 132207447bSAlexander V. Chernikov# notice, this list of conditions and the following disclaimer in the 142207447bSAlexander V. Chernikov# documentation and/or other materials provided with the distribution. 152207447bSAlexander V. Chernikov# 162207447bSAlexander V. Chernikov# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 172207447bSAlexander V. Chernikov# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 182207447bSAlexander V. Chernikov# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 192207447bSAlexander V. Chernikov# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 202207447bSAlexander V. Chernikov# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 212207447bSAlexander V. Chernikov# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 222207447bSAlexander V. Chernikov# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 232207447bSAlexander V. Chernikov# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 242207447bSAlexander V. Chernikov# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 252207447bSAlexander V. Chernikov# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 262207447bSAlexander V. Chernikov# SUCH DAMAGE. 272207447bSAlexander V. Chernikov# 282207447bSAlexander V. Chernikov# 292207447bSAlexander V. Chernikov 302207447bSAlexander V. Chernikov. $(atf_get_srcdir)/../common/vnet.subr 312207447bSAlexander V. Chernikov 322207447bSAlexander V. Chernikovload_divert_module() { 33a7a64b72SShteryana Shopova kldstat -q -m ipdivert 342207447bSAlexander V. Chernikov if [ $? -ne 0 ]; then 352207447bSAlexander V. Chernikov atf_skip "ipdivert module is not loaded" 362207447bSAlexander V. Chernikov fi 372207447bSAlexander V. Chernikov} 382207447bSAlexander V. Chernikov 392207447bSAlexander V. Chernikovatf_test_case "ipdivert_ip_output_remote_success" "cleanup" 402207447bSAlexander V. Chernikovipdivert_ip_output_remote_success_head() { 412207447bSAlexander V. Chernikov 422207447bSAlexander V. Chernikov atf_set descr 'Test diverting IPv4 packet to remote destination' 432207447bSAlexander V. Chernikov atf_set require.user root 442207447bSAlexander V. Chernikov atf_set require.progs scapy 452207447bSAlexander V. Chernikov} 462207447bSAlexander V. Chernikov 472207447bSAlexander V. Chernikovipdivert_ip_output_remote_success_body() { 482207447bSAlexander V. Chernikov 49a1841da4SLi-Wen Hsu if [ "$(atf_config_get ci false)" = "true" ] && \ 50a1841da4SLi-Wen Hsu [ "$(uname -p)" = "i386" ]; then 51a1841da4SLi-Wen Hsu atf_skip "https://bugs.freebsd.org/245764" 52a1841da4SLi-Wen Hsu fi 53a1841da4SLi-Wen Hsu 542207447bSAlexander V. Chernikov ids=65530 552207447bSAlexander V. Chernikov id=`printf "%x" ${ids}` 562207447bSAlexander V. Chernikov if [ $$ -gt 65535 ]; then 572207447bSAlexander V. Chernikov xl=`printf "%x" $(($$ - 65535))` 582207447bSAlexander V. Chernikov yl="1" 592207447bSAlexander V. Chernikov else 602207447bSAlexander V. Chernikov xl=`printf "%x" $$` 612207447bSAlexander V. Chernikov yl="" 622207447bSAlexander V. Chernikov fi 632207447bSAlexander V. Chernikov 642207447bSAlexander V. Chernikov vnet_init 652207447bSAlexander V. Chernikov load_divert_module 662207447bSAlexander V. Chernikov 672207447bSAlexander V. Chernikov ip4a="192.0.2.5" 682207447bSAlexander V. Chernikov ip4b="192.0.2.6" 692207447bSAlexander V. Chernikov 702207447bSAlexander V. Chernikov script_name="../common/divert.py" 712207447bSAlexander V. Chernikov 722207447bSAlexander V. Chernikov epair=$(vnet_mkepair) 732207447bSAlexander V. Chernikov ifconfig ${epair}a up 742207447bSAlexander V. Chernikov ifconfig ${epair}a inet ${ip4a}/30 752207447bSAlexander V. Chernikov 762207447bSAlexander V. Chernikov jname="v4t-${id}-${yl}-${xl}" 772207447bSAlexander V. Chernikov vnet_mkjail ${jname} ${epair}b 782207447bSAlexander V. Chernikov jexec ${jname} ifconfig ${epair}b up 792207447bSAlexander V. Chernikov jexec ${jname} ifconfig ${epair}b inet ${ip4b}/30 802207447bSAlexander V. Chernikov 812207447bSAlexander V. Chernikov atf_check -s exit:0 $(atf_get_srcdir)/${script_name} \ 822207447bSAlexander V. Chernikov --dip ${ip4b} --test_name ipdivert_ip_output_remote_success 832207447bSAlexander V. Chernikov 842207447bSAlexander V. Chernikov count=`jexec ${jname} netstat -s -p icmp | grep 'Input histogram:' -A8 | grep -c 'echo: '` 852207447bSAlexander V. Chernikov # Verify redirect got installed 862207447bSAlexander V. Chernikov atf_check_equal "1" "${count}" 872207447bSAlexander V. Chernikov} 882207447bSAlexander V. Chernikov 892207447bSAlexander V. Chernikovipdivert_ip_output_remote_success_cleanup() { 902207447bSAlexander V. Chernikov 912207447bSAlexander V. Chernikov vnet_cleanup 922207447bSAlexander V. Chernikov} 932207447bSAlexander V. Chernikov 942207447bSAlexander V. Chernikovatf_test_case "ipdivert_ip_input_local_success" "cleanup" 952207447bSAlexander V. Chernikovipdivert_ip_input_local_success_head() { 962207447bSAlexander V. Chernikov 972207447bSAlexander V. Chernikov atf_set descr 'Test diverting IPv4 packet to remote destination' 982207447bSAlexander V. Chernikov atf_set require.user root 992207447bSAlexander V. Chernikov atf_set require.progs scapy 1002207447bSAlexander V. Chernikov} 1012207447bSAlexander V. Chernikov 1022207447bSAlexander V. Chernikovipdivert_ip_input_local_success_body() { 1032207447bSAlexander V. Chernikov 104a1841da4SLi-Wen Hsu if [ "$(atf_config_get ci false)" = "true" ] && \ 105a1841da4SLi-Wen Hsu [ "$(uname -p)" = "i386" ]; then 106a1841da4SLi-Wen Hsu atf_skip "https://bugs.freebsd.org/245764" 107a1841da4SLi-Wen Hsu fi 108a1841da4SLi-Wen Hsu 1092207447bSAlexander V. Chernikov ids=65529 1102207447bSAlexander V. Chernikov id=`printf "%x" ${ids}` 1112207447bSAlexander V. Chernikov if [ $$ -gt 65535 ]; then 1122207447bSAlexander V. Chernikov xl=`printf "%x" $(($$ - 65535))` 1132207447bSAlexander V. Chernikov yl="1" 1142207447bSAlexander V. Chernikov else 1152207447bSAlexander V. Chernikov xl=`printf "%x" $$` 1162207447bSAlexander V. Chernikov yl="" 1172207447bSAlexander V. Chernikov fi 1182207447bSAlexander V. Chernikov 1192207447bSAlexander V. Chernikov vnet_init 1202207447bSAlexander V. Chernikov load_divert_module 1212207447bSAlexander V. Chernikov 1222207447bSAlexander V. Chernikov ip4a="192.0.2.5" 1232207447bSAlexander V. Chernikov ip4b="192.0.2.6" 1242207447bSAlexander V. Chernikov 1252207447bSAlexander V. Chernikov script_name="../common/divert.py" 1262207447bSAlexander V. Chernikov 1272207447bSAlexander V. Chernikov epair=$(vnet_mkepair) 1282207447bSAlexander V. Chernikov ifconfig ${epair}a up 1292207447bSAlexander V. Chernikov ifconfig ${epair}a inet ${ip4a}/30 1302207447bSAlexander V. Chernikov 1312207447bSAlexander V. Chernikov jname="v4t-${id}-${yl}-${xl}" 1322207447bSAlexander V. Chernikov vnet_mkjail ${jname} ${epair}b 1332207447bSAlexander V. Chernikov jexec ${jname} ifconfig ${epair}b up 1342207447bSAlexander V. Chernikov jexec ${jname} ifconfig ${epair}b inet ${ip4b}/30 1352207447bSAlexander V. Chernikov 1362207447bSAlexander V. Chernikov atf_check -s exit:0 jexec ${jname} $(atf_get_srcdir)/${script_name} \ 137*6913bf4cSGleb Smirnoff --sip ${ip4a} --dip ${ip4b} \ 138*6913bf4cSGleb Smirnoff --test_name ipdivert_ip_input_local_success 1392207447bSAlexander V. Chernikov 1402207447bSAlexander V. Chernikov count=`jexec ${jname} netstat -s -p icmp | grep 'Input histogram:' -A8 | grep -c 'echo: '` 1412207447bSAlexander V. Chernikov # Verify redirect got installed 1422207447bSAlexander V. Chernikov atf_check_equal "1" "${count}" 1432207447bSAlexander V. Chernikov} 1442207447bSAlexander V. Chernikov 1452207447bSAlexander V. Chernikovipdivert_ip_input_local_success_cleanup() { 1462207447bSAlexander V. Chernikov 1472207447bSAlexander V. Chernikov vnet_cleanup 1482207447bSAlexander V. Chernikov} 1492207447bSAlexander V. Chernikov 1502207447bSAlexander V. Chernikovatf_init_test_cases() 1512207447bSAlexander V. Chernikov{ 1522207447bSAlexander V. Chernikov 1532207447bSAlexander V. Chernikov atf_add_test_case "ipdivert_ip_output_remote_success" 1542207447bSAlexander V. Chernikov atf_add_test_case "ipdivert_ip_input_local_success" 1552207447bSAlexander V. Chernikov} 1562207447bSAlexander V. Chernikov 1572207447bSAlexander V. Chernikov# end 1582207447bSAlexander V. Chernikov 159