Some test scripts use ncat --sctp --listen port to run an SCTP discard

server in the background. However, when running in the background,
stdin is closed and ncat initiates a graceful shutdown of the SCTP
association. This is not expected by the client. Therefore, the
ncat-based discard server is replaced by a perl-based one.

In addition, to remove the dependency from ncat, which needs to be
installed via the nmap port, also the code testing for a free SCTP port
is changed to use the perl-based client.

Finally, remove some debug output from the report generated.

Reviewed by:		lwhsu@
Differential Revision:	https://reviews.freebsd.org/D20086
This commit is contained in:
tuexen 2019-04-28 19:07:31 +00:00
parent 6474dd73f1
commit 8769fe3439
2 changed files with 68 additions and 36 deletions

View File

@ -58,8 +58,26 @@ DIR=/var/tmp/dtest.$$
sctpport=1024
bound=5000
mkdir $DIR
cd $DIR
cat > client.pl <<-EOPERL
use IO::Socket;
my \$s = IO::Socket::INET->new(
Type => SOCK_STREAM,
Proto => "sctp",
LocalAddr => "$local",
PeerAddr => "$local",
PeerPort => \$ARGV[0],
Timeout => 3);
die "Could not connect to host $local port \$ARGV[0] \$@" unless \$s;
close \$s;
sleep(\$ARGV[1]);
EOPERL
while [ $sctpport -lt $bound ]; do
ncat --sctp -z $local $sctpport > /dev/null || break
perl client.pl $sctpport 0 2>&- || break
sctpport=$(($sctpport + 1))
done
if [ $sctpport -eq $bound ]; then
@ -67,27 +85,25 @@ if [ $sctpport -eq $bound ]; then
exit 1
fi
mkdir $DIR
cd $DIR
# ncat will exit when the association is closed.
ncat --sctp --listen $local $sctpport &
cat > test.pl <<-EOPERL
cat > server.pl <<-EOPERL
use IO::Socket;
my \$s = IO::Socket::INET->new(
my \$l = IO::Socket::INET->new(
Type => SOCK_STREAM,
Proto => "sctp",
LocalAddr => "$local",
PeerAddr => "$local",
PeerPort => $sctpport,
Timeout => 3);
die "Could not connect to host $local port $sctpport \$@" unless \$s;
close \$s;
sleep(2);
LocalPort => $sctpport,
Listen => 1,
Reuse => 1);
die "Could not listen on $local port $sctpport \$@" unless \$l;
my \$c = \$l->accept();
close \$l;
while (<\$c>) {};
close \$c;
EOPERL
$dtrace -c 'perl test.pl' -qs /dev/stdin <<EODTRACE
perl server.pl &
$dtrace -c "perl client.pl $sctpport 2" -qs /dev/stdin <<EODTRACE
BEGIN
{
ipsend = sctpsend = ipreceive = sctpreceive = 0;
@ -122,10 +138,10 @@ sctp:::receive
END
{
printf("Minimum SCTP events seen\n\n");
printf("ip:::send (%d) - %s\n", ipsend, ipsend >= 7 ? "yes" : "no");
printf("ip:::receive (%d) - %s\n", ipreceive, ipreceive >= 7 ? "yes" : "no");
printf("sctp:::send (%d) - %s\n", sctpsend, sctpsend >= 7 ? "yes" : "no");
printf("sctp:::receive (%d) - %s\n", sctpreceive, sctpreceive >= 7 ? "yes" : "no");
printf("ip:::send - %s\n", ipsend >= 7 ? "yes" : "no");
printf("ip:::receive - %s\n", ipreceive >= 7 ? "yes" : "no");
printf("sctp:::send - %s\n", sctpsend >= 7 ? "yes" : "no");
printf("sctp:::receive - %s\n", sctpreceive >= 7 ? "yes" : "no");
}
EODTRACE

View File

@ -61,8 +61,26 @@ DIR=/var/tmp/dtest.$$
sctpport=1024
bound=5000
mkdir $DIR
cd $DIR
cat > client.pl <<-EOPERL
use IO::Socket;
my \$s = IO::Socket::INET->new(
Type => SOCK_STREAM,
Proto => "sctp",
LocalAddr => "$local",
PeerAddr => "$local",
PeerPort => \$ARGV[0],
Timeout => 3);
die "Could not connect to host $local port \$ARGV[0] \$@" unless \$s;
close \$s;
sleep(\$ARGV[1]);
EOPERL
while [ $sctpport -lt $bound ]; do
ncat --sctp -z $local $sctpport > /dev/null || break
perl client.pl $sctpport 0 2>&- || break
sctpport=$(($sctpport + 1))
done
if [ $sctpport -eq $bound ]; then
@ -70,27 +88,25 @@ if [ $sctpport -eq $bound ]; then
exit 1
fi
mkdir $DIR
cd $DIR
# ncat will exit when the association is closed.
ncat --sctp --listen $local $sctpport &
cat > test.pl <<-EOPERL
cat > server.pl <<-EOPERL
use IO::Socket;
my \$s = IO::Socket::INET->new(
my \$l = IO::Socket::INET->new(
Type => SOCK_STREAM,
Proto => "sctp",
LocalAddr => "$local",
PeerAddr => "$local",
PeerPort => $sctpport,
Timeout => 3);
die "Could not connect to host $local port $sctpport \$@" unless \$s;
close \$s;
sleep(2);
LocalPort => $sctpport,
Listen => 1,
Reuse => 1);
die "Could not listen on $local port $sctpport \$@" unless \$l;
my \$c = \$l->accept();
close \$l;
while (<\$c>) {};
close \$c;
EOPERL
$dtrace -c 'perl test.pl' -qs /dev/stdin <<EODTRACE
perl server.pl &
$dtrace -c "perl client.pl $sctpport 2" -qs /dev/stdin <<EODTRACE
BEGIN
{
ipsend = sctpsend = ipreceive = sctpreceive = 0;