diff options
author | Richard Levitte <levitte@openssl.org> | 2016-02-03 00:57:30 +0100 |
---|---|---|
committer | Richard Levitte <levitte@openssl.org> | 2016-02-03 20:36:59 +0100 |
commit | 72b65aa4cb7fd9a41935a2e057e44cb40fb4faa2 (patch) | |
tree | 91fbf6ba9636938e09c907954096395f560509ed /util | |
parent | ab69ac00f3c7a04151662813794ac82bc591a89b (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.pm | 72 |
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 |