# SPDX-License-Identifier: BSD-2-Clause1#2# Copyright (c) 2026 Gleb Smirnoff <[email protected]>3#4# Redistribution and use in source and binary forms, with or without5# modification, are permitted provided that the following conditions6# are met:7# 1. Redistributions of source code must retain the above copyright8# notice, this list of conditions and the following disclaimer.9# 2. Redistributions in binary form must reproduce the above copyright10# notice, this list of conditions and the following disclaimer in the11# documentation and/or other materials provided with the distribution.12#13# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND14# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE15# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE16# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE17# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL18# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS19# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)20# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT21# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY22# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF23# SUCH DAMAGE.2425. $(atf_get_srcdir)/../common/utils.subr2627atf_test_case "bpf" "cleanup"28bpf_head()29{30atf_set descr 'Creates several rules with log and probes bpf taps'31atf_set require.user root32}3334bpf_body()35{36firewall_init "ipfw"3738epair=$(vnet_mkepair)39vnet_mkjail alcatraz ${epair}b40ifconfig ${epair}a 192.0.2.0/31 up41jexec alcatraz ifconfig ${epair}b 192.0.2.1/31 up4243# Create a bunch of statically and auto numbered logging rules44rules="100 200 201"45for r in ${rules}; do46jexec alcatraz \47ipfw add ${r} count log udp from any to any 10${r}48done49auto=$(jexec alcatraz ipfw add count log udp from any to any 10666 \50| awk '{print $1}' | sed -Ee 's/^0+//')5152pids=""53for r in ${rules} ${auto}; do54jexec alcatraz tcpdump --immediate-mode -i ipfw${r} \55-w ${PWD}/${r}.pcap -c 1 &56pids="${pids} $!"57done5859# wait for tcpdumps to attach, include netstat(1) header in ${count}60count=$(( $(echo ${rules} ${auto} | wc -w) + 1))61while [ $(jexec alcatraz netstat -B | wc -l) -ne ${count} ]; do62sleep 0.01;63done6465for p in ${rules} 666; do66echo foo | nc -u 192.0.2.1 10${p} -w 067done6869for p in ${pids}; do70atf_check -s exit:0 sh -c "wait $pid; exit $?"71done7273# statically numbered taps74for p in ${rules}; do75atf_check -o match:"192.0.2.0.[0-9]+ > 192.0.2.1.10${p}: UDP" \76-e match:"reading from file [a-zA-Z0-9/.]+${p}.pcap" \77tcpdump -nr ${PWD}/${p}.pcap78done7980# autonumbered tap with 10666 port81atf_check -o match:"192.0.2.0.[0-9]+ > 192.0.2.1.10666: UDP" \82-e match:"reading from file [a-zA-Z0-9/.]+${auto}.pcap" \83tcpdump -nr ${PWD}/${auto}.pcap84}8586bpf_cleanup()87{88firewall_cleanup $189}9091atf_init_test_cases()92{93atf_add_test_case "bpf"94}959697