1#!/usr/bin/env atf-sh 2#- 3# SPDX-License-Identifier: BSD-2-Clause 4# 5# Copyright (c) 2020 Alexander V. Chernikov 6# 7# Redistribution and use in source and binary forms, with or without 8# modification, are permitted provided that the following conditions 9# are met: 10# 1. Redistributions of source code must retain the above copyright 11# notice, this list of conditions and the following disclaimer. 12# 2. Redistributions in binary form must reproduce the above copyright 13# notice, this list of conditions and the following disclaimer in the 14# documentation and/or other materials provided with the distribution. 15# 16# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26# SUCH DAMAGE. 27# 28# 29 30. $(atf_get_srcdir)/../common/vnet.subr 31 32load_divert_module() { 33 kldstat -q -m ipdivert 34 if [ $? -ne 0 ]; then 35 atf_skip "ipdivert module is not loaded" 36 fi 37} 38 39atf_test_case "ipdivert_ip_output_remote_success" "cleanup" 40ipdivert_ip_output_remote_success_head() { 41 42 atf_set descr 'Test diverting IPv4 packet to remote destination' 43 atf_set require.user root 44 atf_set require.progs scapy 45} 46 47ipdivert_ip_output_remote_success_body() { 48 49 if [ "$(atf_config_get ci false)" = "true" ] && \ 50 [ "$(uname -p)" = "i386" ]; then 51 atf_skip "https://bugs.freebsd.org/245764" 52 fi 53 54 ids=65530 55 id=`printf "%x" ${ids}` 56 if [ $$ -gt 65535 ]; then 57 xl=`printf "%x" $(($$ - 65535))` 58 yl="1" 59 else 60 xl=`printf "%x" $$` 61 yl="" 62 fi 63 64 vnet_init 65 load_divert_module 66 67 ip4a="192.0.2.5" 68 ip4b="192.0.2.6" 69 70 script_name="../common/divert.py" 71 72 epair=$(vnet_mkepair) 73 ifconfig ${epair}a up 74 ifconfig ${epair}a inet ${ip4a}/30 75 76 jname="v4t-${id}-${yl}-${xl}" 77 vnet_mkjail ${jname} ${epair}b 78 jexec ${jname} ifconfig ${epair}b up 79 jexec ${jname} ifconfig ${epair}b inet ${ip4b}/30 80 81 atf_check -s exit:0 $(atf_get_srcdir)/${script_name} \ 82 --dip ${ip4b} --test_name ipdivert_ip_output_remote_success 83 84 count=`jexec ${jname} netstat -s -p icmp | grep 'Input histogram:' -A8 | grep -c 'echo: '` 85 # Verify redirect got installed 86 atf_check_equal "1" "${count}" 87} 88 89ipdivert_ip_output_remote_success_cleanup() { 90 91 vnet_cleanup 92} 93 94atf_test_case "ipdivert_ip_input_local_success" "cleanup" 95ipdivert_ip_input_local_success_head() { 96 97 atf_set descr 'Test diverting IPv4 packet to remote destination' 98 atf_set require.user root 99 atf_set require.progs scapy 100} 101 102ipdivert_ip_input_local_success_body() { 103 104 if [ "$(atf_config_get ci false)" = "true" ] && \ 105 [ "$(uname -p)" = "i386" ]; then 106 atf_skip "https://bugs.freebsd.org/245764" 107 fi 108 109 ids=65529 110 id=`printf "%x" ${ids}` 111 if [ $$ -gt 65535 ]; then 112 xl=`printf "%x" $(($$ - 65535))` 113 yl="1" 114 else 115 xl=`printf "%x" $$` 116 yl="" 117 fi 118 119 vnet_init 120 load_divert_module 121 122 ip4a="192.0.2.5" 123 ip4b="192.0.2.6" 124 125 script_name="../common/divert.py" 126 127 epair=$(vnet_mkepair) 128 ifconfig ${epair}a up 129 ifconfig ${epair}a inet ${ip4a}/30 130 131 jname="v4t-${id}-${yl}-${xl}" 132 vnet_mkjail ${jname} ${epair}b 133 jexec ${jname} ifconfig ${epair}b up 134 jexec ${jname} ifconfig ${epair}b inet ${ip4b}/30 135 136 atf_check -s exit:0 jexec ${jname} $(atf_get_srcdir)/${script_name} \ 137 --sip ${ip4a} --dip ${ip4b} \ 138 --test_name ipdivert_ip_input_local_success 139 140 count=`jexec ${jname} netstat -s -p icmp | grep 'Input histogram:' -A8 | grep -c 'echo: '` 141 # Verify redirect got installed 142 atf_check_equal "1" "${count}" 143} 144 145ipdivert_ip_input_local_success_cleanup() { 146 147 vnet_cleanup 148} 149 150atf_init_test_cases() 151{ 152 153 atf_add_test_case "ipdivert_ip_output_remote_success" 154 atf_add_test_case "ipdivert_ip_input_local_success" 155} 156 157# end 158 159