2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-31 06:25:31 +00:00

Add -r <repeats> option to packet.pl

For some tests, we need to send big data streams (for TCP) or repeated
packets (for UDP), this commits adds `-r` option to packet.pl that sends
the same input <repeats> times using the specified protocol.
This commit is contained in:
Ondřej Surý
2020-09-01 09:37:05 +02:00
parent 22e0272063
commit dd46559a19
2 changed files with 17 additions and 43 deletions

View File

@@ -14,7 +14,7 @@
# the standard input, in the form of a series of bytes in hexadecimal. # the standard input, in the form of a series of bytes in hexadecimal.
# Whitespace is ignored, as is anything following a '#' symbol. # Whitespace is ignored, as is anything following a '#' symbol.
# #
# For example, the following input would generate normal query for # For example, the following input would generate normal query for
# isc.org/NS/IN": # isc.org/NS/IN":
# #
# # QID: # # QID:
@@ -31,7 +31,7 @@
# Note that we do not wait for a response for the server. This is simply # Note that we do not wait for a response for the server. This is simply
# a way of injecting arbitrary packets to test server resposnes. # a way of injecting arbitrary packets to test server resposnes.
# #
# Usage: packet.pl [-a <address>] [-p <port>] [-t (udp|tcp)] [filename] # Usage: packet.pl [-a <address>] [-p <port>] [-t (udp|tcp)] [-r <repeats>] [filename]
# #
# If not specified, address defaults to 127.0.0.1, port to 53, protocol # If not specified, address defaults to 127.0.0.1, port to 53, protocol
# to udp, and file to stdin. # to udp, and file to stdin.
@@ -46,12 +46,12 @@ use IO::File;
use IO::Socket; use IO::Socket;
sub usage { sub usage {
print ("Usage: packet.pl [-a address] [-p port] [-t (tcp|udp)] -d [file]\n"); print ("Usage: packet.pl [-a address] [-p port] [-t (tcp|udp)] [-r <repeats>] [file]\n");
exit 1; exit 1;
} }
my %options={}; my %options={};
getopts("a:dp:t:", \%options); getopts("a:p:t:r:", \%options);
my $addr = "127.0.0.1"; my $addr = "127.0.0.1";
$addr = $options{a} if defined $options{a}; $addr = $options{a} if defined $options{a};
@@ -63,6 +63,9 @@ my $proto = "udp";
$proto = lc $options{t} if defined $options{t}; $proto = lc $options{t} if defined $options{t};
usage if ($proto !~ /^(udp|tcp)$/); usage if ($proto !~ /^(udp|tcp)$/);
my $repeats = 1;
$repeats = $options{r} if defined $options{r};
my $file = "STDIN"; my $file = "STDIN";
if (@ARGV >= 1) { if (@ARGV >= 1) {
my $filename = shift @ARGV; my $filename = shift @ARGV;
@@ -82,52 +85,23 @@ my $data = pack("H*", $input);
my $len = length $data; my $len = length $data;
my $output = unpack("H*", $data); my $output = unpack("H*", $data);
print ("sending: $output\n"); print ("sending $repeats time(s): $output\n");
my $sock = IO::Socket::INET->new(PeerAddr => $addr, PeerPort => $port, my $sock = IO::Socket::INET->new(PeerAddr => $addr, PeerPort => $port,
Proto => $proto,) or die "$!"; Proto => $proto,) or die "$!";
my $bytes; my $bytes;
if ($proto eq "udp") { while ($repeats > 0) {
$bytes = $sock->send($data); if ($proto eq "udp") {
} else { $bytes = $sock->send($data);
$bytes = $sock->syswrite(pack("n", $len), 2); } else {
$bytes += $sock->syswrite($data, $len); $bytes = $sock->syswrite(pack("n", $len), 2);
$bytes += $sock->syswrite($data, $len);
}
$repeats = $repeats - 1;
} }
print ("sent $bytes bytes to $addr:$port\n"); print ("sent $bytes bytes to $addr:$port\n");
if (defined $options{d}) {
use Net::DNS;
use Net::DNS::Packet;
my $rin;
my $rout;
$rin = '';
vec($rin, fileno($sock), 1) = 1;
select($rout = $rin, undef, undef, 1);
if (vec($rout, fileno($sock), 1)) {{
my $buf;
if ($proto eq "udp") {
$sock->recv($buf, 512);
} else {
my $n = $sock->sysread($buf, 2);
last unless $n == 2;
my $len = unpack("n", $buf);
$n = $sock->sysread($buf, $len);
last unless $n == $len;
}
my $response;
if ($Net::DNS::VERSION > 0.68) {
$response = new Net::DNS::Packet(\$buf, 0);
$@ and die $@;
} else {
my $err;
($response, $err) = new Net::DNS::Packet(\$buf, 0);
$err and die $err;
}
$response->print;
}}
}
$sock->close; $sock->close;
close $file; close $file;