summaryrefslogtreecommitdiffstats
path: root/util
diff options
context:
space:
mode:
authorRichard Levitte <levitte@openssl.org>2016-02-03 00:57:30 +0100
committerRichard Levitte <levitte@openssl.org>2016-02-03 20:36:59 +0100
commit72b65aa4cb7fd9a41935a2e057e44cb40fb4faa2 (patch)
tree91fbf6ba9636938e09c907954096395f560509ed /util
parentab69ac00f3c7a04151662813794ac82bc591a89b (diff)
Refactoring BIO: add a simple networking test of s_client and s_server
This makes use of TLSProxy, which was expanded to use IO::Socket::IP (which is a core perl module) or IO::Socket::INET6 (which is said to be more popular) instead IO::Socket::INET if one of them is installed. Reviewed-by: Viktor Dukhovni <viktor@openssl.org>
Diffstat (limited to 'util')
-rw-r--r--util/TLSProxy/Proxy.pm72
1 files changed, 61 insertions, 11 deletions
diff --git a/util/TLSProxy/Proxy.pm b/util/TLSProxy/Proxy.pm
index 8d18dcc7c1..7082486561 100644
--- a/util/TLSProxy/Proxy.pm
+++ b/util/TLSProxy/Proxy.pm
@@ -65,6 +65,9 @@ use TLSProxy::ServerHello;
use TLSProxy::ServerKeyExchange;
use TLSProxy::NewSessionTicket;
+my $have_IPv6 = 0;
+my $IP_factory;
+
sub new
{
my $class = shift;
@@ -95,6 +98,44 @@ sub new
message_list => [],
};
+ eval {
+ require IO::Socket::IP;
+ my $s = IO::Socket::IP->new(
+ LocalAddr => "::1",
+ LocalPort => 0,
+ Listen=>1,
+ );
+ $s or die "\n";
+ $s->close();
+ };
+ if ($@ eq "") {
+ # IO::Socket::IP supports IPv6 and is in the core modules list
+ $IP_factory = sub { IO::Socket::IP->new(@_); };
+ $have_IPv6 = 1;
+ } else {
+ eval {
+ require IO::Socket::INET6;
+ my $s = IO::Socket::INET6->new(
+ LocalAddr => "::1",
+ LocalPort => 0,
+ Listen=>1,
+ );
+ $s or die "\n";
+ $s->close();
+ };
+ if ($@ eq "") {
+ # IO::Socket::INET6 supports IPv6 but isn't on the core modules list
+ # However, it's a bit older and said to be more widely deployed
+ # at the time of writing this comment.
+ $IP_factory = sub { IO::Socket::INET6->new(@_); };
+ $have_IPv6 = 1;
+ } else {
+ # IO::Socket::INET doesn't support IPv6 but is a fallback in case
+ # we have no other.
+ $IP_factory = sub { IO::Socket::INET->new(@_); };
+ }
+ }
+
return bless $self, $class;
}
@@ -139,7 +180,7 @@ sub start
$pid = fork();
if ($pid == 0) {
open(STDOUT, ">", File::Spec->devnull())
- or die "Failed to redirect stdout";
+ or die "Failed to redirect stdout: $!";
open(STDERR, ">&STDOUT");
my $execcmd = $self->execute
." s_server -rev -engine ossltest -accept "
@@ -168,8 +209,10 @@ sub clientstart
}
# Create the Proxy socket
- my $proxy_sock = new IO::Socket::INET(
- LocalHost => $self->proxy_addr,
+ my $proxaddr = $self->server_addr;
+ $proxaddr =~ s/[\[\]]//g; # Remove [ and ]
+ my $proxy_sock = $IP_factory->(
+ LocalHost => $proxaddr,
LocalPort => $self->proxy_port,
Proto => "tcp",
Listen => SOMAXCONN,
@@ -179,14 +222,14 @@ sub clientstart
if ($proxy_sock) {
print "Proxy started on port ".$self->proxy_port."\n";
} else {
- die "Failed creating proxy socket\n";
+ die "Failed creating proxy socket (".$proxaddr.",".$self->proxy_port."): $!\n";
}
if ($self->execute) {
my $pid = fork();
if ($pid == 0) {
open(STDOUT, ">", File::Spec->devnull())
- or die "Failed to redirect stdout";
+ or die "Failed to redirect stdout: $!";
open(STDERR, ">&STDOUT");
my $execcmd = "echo test | ".$self->execute
." s_client -engine ossltest -connect "
@@ -202,8 +245,8 @@ sub clientstart
}
# Wait for incoming connection from client
- my $client_sock = $proxy_sock->accept()
- or die "Failed accepting incoming connection\n";
+ my $client_sock = $proxy_sock->accept()
+ or die "Failed accepting incoming connection: $!\n";
print "Connection opened\n";
@@ -213,11 +256,13 @@ sub clientstart
#We loop over this a few times because sometimes s_server can take a while
#to start up
do {
- $server_sock = new IO::Socket::INET(
- PeerAddr => $self->server_addr,
+ my $servaddr = $self->server_addr;
+ $servaddr =~ s/[\[\]]//g; # Remove [ and ]
+ $server_sock = $IP_factory->(
+ PeerAddr => $servaddr,
PeerPort => $self->server_port,
Proto => 'tcp'
- );
+ );
$retry--;
if (!$server_sock) {
@@ -225,7 +270,7 @@ sub clientstart
#Sleep for a short while
select(undef, undef, undef, 0.1);
} else {
- die "Failed to start up server\n";
+ die "Failed to start up server (".$servaddr.",".$self->server_port."): $!\n";
}
}
} while (!$server_sock);
@@ -353,6 +398,11 @@ sub end
my $self = shift;
return $self->{end};
}
+sub supports_IPv6
+{
+ my $self = shift;
+ return $have_IPv6;
+}
#Read/write accessors
sub proxy_addr