The branch main has been updated by igoro: URL: https://cgit.FreeBSD.org/src/commit/?id=36afb137b699845be8ccf4df1da883c117f1b1aa
commit 36afb137b699845be8ccf4df1da883c117f1b1aa Author: Igor Ostapenko <[email protected]> AuthorDate: 2026-08-27 11:42:59 +0000 Commit: Igor Ostapenko <[email protected]> CommitDate: 2026-08-27 11:47:24 +0000 netpfil tests: Make divapp packet loop handling opt-in This generalizes the divapp logic and makes it usable for other test scenarios such as diverted TCP connections. Reviewed by: markj Differential Revision: https://reviews.freebsd.org/D59067 --- tests/sys/netpfil/common/divapp.c | 26 ++++++++++++++++++------ tests/sys/netpfil/ipfw/divert.sh | 12 +++++------ tests/sys/netpfil/pf/divert-to.sh | 42 +++++++++++++++++++-------------------- 3 files changed, 47 insertions(+), 33 deletions(-) diff --git a/tests/sys/netpfil/common/divapp.c b/tests/sys/netpfil/common/divapp.c index b1c38fdc87b4..59630c8da45f 100644 --- a/tests/sys/netpfil/common/divapp.c +++ b/tests/sys/netpfil/common/divapp.c @@ -43,6 +43,7 @@ struct context { unsigned short divert_port; bool divert_back; + bool expect_single_pkt; int fd; struct sockaddr_in sin; @@ -116,7 +117,8 @@ main(int argc, char *argv[]) if (argc < 2) errx(EX_USAGE, - "Usage: %s <divert-port> [divert-back]", argv[0]); + "Usage: %s <divert-port> [expect-single-pkt] [divert-back]", + argv[0]); memset(&c, 0, sizeof(struct context)); @@ -124,8 +126,12 @@ main(int argc, char *argv[]) if (c.divert_port == 0) errx(EX_USAGE, "divert port is not defined."); - if (argc >= 3 && strcmp(argv[2], "divert-back") == 0) - c.divert_back = true; + for (int i = 2; i < argc; i++) { + if (strcmp(argv[i], "expect-single-pkt") == 0) + c.expect_single_pkt = true; + if (strcmp(argv[i], "divert-back") == 0) + c.divert_back = true; + } init(&c); @@ -135,12 +141,20 @@ main(int argc, char *argv[]) if (c.divert_back) send_pkt(&c); npkt++; - if (npkt >= 20) + if (c.expect_single_pkt && npkt >= 20) { + /* + * Single-packet expectation detects potential packet + * loops, so break the loop eventually. + */ break; + } } - if (npkt != 1) - errx(EXIT_FAILURE, "%d: npkt=%d.", c.divert_port, npkt); + if (npkt == 0) + errx(EXIT_FAILURE, "%d: no packets received.", c.divert_port); + if (c.expect_single_pkt && npkt != 1) + errx(EXIT_FAILURE, "%d: more than one received, npkt=%d.", + c.divert_port, npkt); return (EXIT_SUCCESS); } diff --git a/tests/sys/netpfil/ipfw/divert.sh b/tests/sys/netpfil/ipfw/divert.sh index 62db3f8fce98..42bef65596a4 100644 --- a/tests/sys/netpfil/ipfw/divert.sh +++ b/tests/sys/netpfil/ipfw/divert.sh @@ -88,7 +88,7 @@ in_div_body() jexec div ipfw add 100 divert 2000 icmp from any to any in icmptypes 8 - jexec div $(atf_get_srcdir)/../common/divapp 2000 & + jexec div $(atf_get_srcdir)/../common/divapp 2000 expect-single-pkt & divapp_pid=$! # Wait for the divapp to be ready sleep 1 @@ -125,7 +125,7 @@ in_div_in_body() jexec div ipfw add 100 divert 2000 icmp from any to any in icmptypes 8 - jexec div $(atf_get_srcdir)/../common/divapp 2000 divert-back & + jexec div $(atf_get_srcdir)/../common/divapp 2000 expect-single-pkt divert-back & divapp_pid=$! # Wait for the divapp to be ready sleep 1 @@ -162,7 +162,7 @@ out_div_body() jexec div ipfw add 100 divert 2000 icmp from any to any out icmptypes 0 - jexec div $(atf_get_srcdir)/../common/divapp 2000 & + jexec div $(atf_get_srcdir)/../common/divapp 2000 expect-single-pkt & divapp_pid=$! # Wait for the divapp to be ready sleep 1 @@ -199,7 +199,7 @@ out_div_out_body() jexec div ipfw add 100 divert 2000 icmp from any to any out icmptypes 0 - jexec div $(atf_get_srcdir)/../common/divapp 2000 divert-back & + jexec div $(atf_get_srcdir)/../common/divapp 2000 expect-single-pkt divert-back & divapp_pid=$! # Wait for the divapp to be ready sleep 1 @@ -252,9 +252,9 @@ in_div_in_fwd_out_div_out_body() jexec router ipfw add 100 divert 2001 icmp from any to any in icmptypes 8 jexec router ipfw add 200 divert 2002 icmp from any to any out icmptypes 8 - jexec router $(atf_get_srcdir)/../common/divapp 2001 divert-back & + jexec router $(atf_get_srcdir)/../common/divapp 2001 expect-single-pkt divert-back & indivapp_pid=$! - jexec router $(atf_get_srcdir)/../common/divapp 2002 divert-back & + jexec router $(atf_get_srcdir)/../common/divapp 2002 expect-single-pkt divert-back & outdivapp_pid=$! # Wait for the divappS to be ready sleep 1 diff --git a/tests/sys/netpfil/pf/divert-to.sh b/tests/sys/netpfil/pf/divert-to.sh index bc4222c2bd03..30825aae5e4c 100644 --- a/tests/sys/netpfil/pf/divert-to.sh +++ b/tests/sys/netpfil/pf/divert-to.sh @@ -88,7 +88,7 @@ in_div_body() "pass in inet proto icmp icmp-type echoreq divert-to 127.0.0.1 port 2000" \ "pass in inet6 proto icmp6 icmp6-type echoreq divert-to ::1 port 2000" - jexec div $(atf_get_srcdir)/../common/divapp 2000 & + jexec div $(atf_get_srcdir)/../common/divapp 2000 expect-single-pkt & divapp_pid=$! # Wait for the divapp to be ready sleep 1 @@ -98,7 +98,7 @@ in_div_body() wait $divapp_pid - jexec div $(atf_get_srcdir)/../common/divapp 2000 & + jexec div $(atf_get_srcdir)/../common/divapp 2000 expect-single-pkt & divapp_pid=$! # Wait for the divapp to be ready sleep 1 @@ -141,7 +141,7 @@ in_div_in_body() "pass in inet proto icmp icmp-type echoreq divert-to 127.0.0.1 port 2000 no state" \ "pass in inet6 proto icmp6 icmp6-type echoreq divert-to ::1 port 2000 no state" - jexec div $(atf_get_srcdir)/../common/divapp 2000 divert-back & + jexec div $(atf_get_srcdir)/../common/divapp 2000 expect-single-pkt divert-back & divapp_pid=$! # Wait for the divapp to be ready sleep 1 @@ -151,7 +151,7 @@ in_div_in_body() wait $divapp_pid - jexec div $(atf_get_srcdir)/../common/divapp 2000 divert-back & + jexec div $(atf_get_srcdir)/../common/divapp 2000 expect-single-pkt divert-back & divapp_pid=$! # Wait for the divapp to be ready sleep 1 @@ -196,7 +196,7 @@ out_div_body() "pass in inet6 proto icmp6 icmp6-type echoreq no state" \ "pass out inet6 proto icmp6 icmp6-type echorep divert-to ::1 port 2000 no state" - jexec div $(atf_get_srcdir)/../common/divapp 2000 & + jexec div $(atf_get_srcdir)/../common/divapp 2000 expect-single-pkt & divapp_pid=$! # Wait for the divapp to be ready sleep 1 @@ -206,7 +206,7 @@ out_div_body() wait $divapp_pid - jexec div $(atf_get_srcdir)/../common/divapp 2000 & + jexec div $(atf_get_srcdir)/../common/divapp 2000 expect-single-pkt & divapp_pid=$! # Wait for the divapp to be ready sleep 1 @@ -251,7 +251,7 @@ out_div_out_body() "pass in inet6 proto icmp6 icmp6-type echoreq no state" \ "pass out inet6 proto icmp6 icmp6-type echorep divert-to ::1 port 2000 no state" - jexec div $(atf_get_srcdir)/../common/divapp 2000 divert-back & + jexec div $(atf_get_srcdir)/../common/divapp 2000 expect-single-pkt divert-back & divapp_pid=$! # Wait for the divapp to be ready sleep 1 @@ -261,7 +261,7 @@ out_div_out_body() wait $divapp_pid - jexec div $(atf_get_srcdir)/../common/divapp 2000 divert-back & + jexec div $(atf_get_srcdir)/../common/divapp 2000 expect-single-pkt divert-back & divapp_pid=$! # Wait for the divapp to be ready sleep 1 @@ -326,9 +326,9 @@ in_div_in_fwd_out_div_out_body() "pass in inet6 proto icmp6 icmp6-type echoreq divert-to ::1 port 2001 no state" \ "pass out inet6 proto icmp6 icmp6-type echoreq divert-to ::1 port 2002 no state" - jexec router $(atf_get_srcdir)/../common/divapp 2001 divert-back & + jexec router $(atf_get_srcdir)/../common/divapp 2001 expect-single-pkt divert-back & indivapp_pid=$! - jexec router $(atf_get_srcdir)/../common/divapp 2002 divert-back & + jexec router $(atf_get_srcdir)/../common/divapp 2002 expect-single-pkt divert-back & outdivapp_pid=$! # Wait for the divapps to be ready sleep 1 @@ -338,9 +338,9 @@ in_div_in_fwd_out_div_out_body() wait $indivapp_pid && wait $outdivapp_pid - jexec router $(atf_get_srcdir)/../common/divapp 2001 divert-back & + jexec router $(atf_get_srcdir)/../common/divapp 2001 expect-single-pkt divert-back & indivapp_pid=$! - jexec router $(atf_get_srcdir)/../common/divapp 2002 divert-back & + jexec router $(atf_get_srcdir)/../common/divapp 2002 expect-single-pkt divert-back & outdivapp_pid=$! # Wait for the divapps to be ready sleep 1 @@ -393,9 +393,9 @@ in_dn_in_div_in_out_div_out_dn_out_body() "pass in inet6 proto icmp6 icmp6-type echoreq divert-to ::1 port 1001 no state" \ "pass out inet6 proto icmp6 icmp6-type echorep divert-to ::1 port 1002 no state" - jexec alcatraz $(atf_get_srcdir)/../common/divapp 1001 divert-back & + jexec alcatraz $(atf_get_srcdir)/../common/divapp 1001 expect-single-pkt divert-back & indivapp_pid=$! - jexec alcatraz $(atf_get_srcdir)/../common/divapp 1002 divert-back & + jexec alcatraz $(atf_get_srcdir)/../common/divapp 1002 expect-single-pkt divert-back & outdivapp_pid=$! # Wait for the divapps to be ready sleep 1 @@ -407,9 +407,9 @@ in_dn_in_div_in_out_div_out_dn_out_body() wait $outdivapp_pid atf_check_not_equal 0 $? - jexec alcatraz $(atf_get_srcdir)/../common/divapp 1001 divert-back & + jexec alcatraz $(atf_get_srcdir)/../common/divapp 1001 expect-single-pkt divert-back & indivapp_pid=$! - jexec alcatraz $(atf_get_srcdir)/../common/divapp 1002 divert-back & + jexec alcatraz $(atf_get_srcdir)/../common/divapp 1002 expect-single-pkt divert-back & outdivapp_pid=$! # Wait for the divapps to be ready sleep 1 @@ -438,9 +438,9 @@ in_dn_in_div_in_out_div_out_dn_out_body() "pass in inet6 proto icmp6 icmp6-type echoreq divert-to ::1 port 2001 no state" \ "pass out inet6 proto icmp6 icmp6-type echorep divert-to ::1 port 2002 no state" - jexec alcatraz $(atf_get_srcdir)/../common/divapp 2001 divert-back & + jexec alcatraz $(atf_get_srcdir)/../common/divapp 2001 expect-single-pkt divert-back & indivapp_pid=$! - jexec alcatraz $(atf_get_srcdir)/../common/divapp 2002 divert-back & + jexec alcatraz $(atf_get_srcdir)/../common/divapp 2002 expect-single-pkt divert-back & outdivapp_pid=$! # Wait for the divapps to be ready sleep 1 @@ -452,9 +452,9 @@ in_dn_in_div_in_out_div_out_dn_out_body() wait $outdivapp_pid atf_check_equal 0 $? - jexec alcatraz $(atf_get_srcdir)/../common/divapp 2001 divert-back & + jexec alcatraz $(atf_get_srcdir)/../common/divapp 2001 expect-single-pkt divert-back & indivapp_pid=$! - jexec alcatraz $(atf_get_srcdir)/../common/divapp 2002 divert-back & + jexec alcatraz $(atf_get_srcdir)/../common/divapp 2002 expect-single-pkt divert-back & outdivapp_pid=$! # Wait for the divapps to be ready sleep 1 @@ -498,7 +498,7 @@ pr260867_body() atf_check -o ignore ping -c3 2001:db8::2 jexec alcatraz /usr/sbin/inetd -p ${PWD}/inetd-echo.pid $(atf_get_srcdir)/echo_inetd.conf - jexec alcatraz $(atf_get_srcdir)/../common/divapp 1001 divert-back & + jexec alcatraz $(atf_get_srcdir)/../common/divapp 1001 expect-single-pkt divert-back & jexec alcatraz pfctl -e pft_set_rules alcatraz \
