Fix the UDP tests for dtrace.

The code imported from opensolaris was depending on ping supporting
UDP for sending probes. Since this is not supported by ping on FreeBSD
use a perl script instead.
The remote test requires the usage of ksh93, so state that in the
sheband.
Enable the local test, but keep the remote test disabled, since it
requires a remote machine on the LAN.

Reviewed by:		markj@, gnn@
Sponsored by:		Netflix, Inc.
Differential Revision:	https://reviews.freebsd.org/D16268
This commit is contained in:
Michael Tuexen 2018-07-15 20:34:22 +00:00
parent d7aeb429a0
commit dc9f20b3f3
3 changed files with 59 additions and 12 deletions

View File

@ -1,4 +1,4 @@
#!/usr/bin/ksh
#!/usr/bin/env ksh
#
# CDDL HEADER START
#
@ -36,14 +36,14 @@
# 4. An unlikely race causes the unlocked global send/receive
# variables to be corrupted.
#
# This test sends a UDP message using ping and checks that at least the
# This test sends a UDP message using perl and checks that at least the
# following counts were traced:
#
# 1 x ip:::send (UDP sent to ping's base UDP port)
# 1 x udp:::send (UDP sent to ping's base UDP port)
# 1 x ip:::send (UDP sent to UDP port 33434)
# 1 x udp:::send (UDP sent to UDP port 33434)
# 1 x ip:::receive (UDP received)
#
# No udp:::receive event is expected as the response ping -U elicits is
# No udp:::receive event is expected since the UDP packet elicts
# an ICMP PORT_UNREACHABLE response rather than a UDP packet, and locally
# the echo request UDP packet only reaches IP, so the udp:::receive probe
# is not triggered by it.
@ -56,8 +56,25 @@ fi
dtrace=$1
local=127.0.0.1
port=33434
DIR=/var/tmp/dtest.$$
$dtrace -c "/sbin/ping -U $local" -qs /dev/stdin <<EOF | grep -v 'is alive'
mkdir $DIR
cd $DIR
cat > test.pl <<-EOPERL
use IO::Socket;
my \$s = IO::Socket::INET->new(
Proto => "udp",
PeerAddr => "$local",
PeerPort => $port);
die "Could not create UDP socket $local port $port" unless \$s;
send \$s, "Hello", 0;
close \$s;
sleep(2);
EOPERL
$dtrace -c 'perl test.pl' -qs /dev/stdin <<EODTRACE
BEGIN
{
ipsend = udpsend = ipreceive = 0;
@ -90,4 +107,11 @@ END
printf("ip:::receive - %s\n", ipreceive >= 1 ? "yes" : "no");
printf("udp:::send - %s\n", udpsend >= 1 ? "yes" : "no");
}
EOF
EODTRACE
status=$?
cd /
/bin/rm -rf $DIR
exit $status

View File

@ -1,4 +1,4 @@
#!/usr/bin/ksh
#!/usr/bin/env ksh93
#
# CDDL HEADER START
#
@ -36,7 +36,7 @@
# 4. An unlikely race causes the unlocked global send/receive
# variables to be corrupted.
#
# This test sends a UDP message using ping and checks that at least the
# This test sends a UDP message using perl and checks that at least the
# following counts were traced:
#
# 1 x ip:::send (UDP sent to ping's base UDP port)
@ -50,6 +50,8 @@ fi
dtrace=$1
getaddr=./get.ipv4remote.pl
port=33434
DIR=/var/tmp/dtest.$$
if [[ ! -x $getaddr ]]; then
print -u2 "could not find or execute sub program: $getaddr"
@ -60,7 +62,22 @@ if (( $? != 0 )); then
exit 4
fi
$dtrace -c "/sbin/ping -U $dest" -qs /dev/stdin <<EOF | grep -v 'is alive'
mkdir $DIR
cd $DIR
cat > test.pl <<-EOPERL
use IO::Socket;
my \$s = IO::Socket::INET->new(
Proto => "udp",
PeerAddr => "$dest",
PeerPort => $port);
die "Could not create UDP socket $dest port $port" unless \$s;
send \$s, "Hello", 0;
close \$s;
sleep(2);
EOPERL
$dtrace -c 'perl test.pl' -qs /dev/stdin <<EODTRACE
BEGIN
{
ipsend = udpsend = 0;
@ -85,4 +102,11 @@ END
printf("ip:::send - %s\n", ipsend >= 1 ? "yes" : "no");
printf("udp:::send - %s\n", udpsend >= 1 ? "yes" : "no");
}
EOF
EODTRACE
status=$?
cd /
/bin/rm -rf $DIR
exit $status

View File

@ -33,7 +33,6 @@ exclude EXFAIL common/funcs/tst.copyin.d
exclude EXFAIL common/funcs/tst.copyinto.d
exclude EXFAIL common/funcs/tst.ddi_pathname.d
exclude EXFAIL common/io/tst.fds.d
exclude EXFAIL common/ip/tst.ipv4localudp.ksh
exclude EXFAIL common/mdb/tst.dtracedcmd.ksh
exclude EXFAIL common/misc/tst.dofmax.ksh
exclude EXFAIL common/misc/tst.include.ksh