diff options
author | wtc@chromium.org <wtc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-22 20:31:53 +0000 |
---|---|---|
committer | wtc@chromium.org <wtc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-22 20:31:53 +0000 |
commit | efaba4815ff6786082583393ad06f8c22ef11fa0 (patch) | |
tree | 368934ea021799b0b37d00bd60ecfb03888ae60a | |
parent | 638e491687f71c691ab7551795f827c86fb98765 (diff) | |
download | chromium_src-efaba4815ff6786082583393ad06f8c22ef11fa0.zip chromium_src-efaba4815ff6786082583393ad06f8c22ef11fa0.tar.gz chromium_src-efaba4815ff6786082583393ad06f8c22ef11fa0.tar.bz2 |
Make TCP FastOpen work again.
In TCPClientSocketLibevent, this requires making IsConnected pretend the
socket is connected so that GetPeerAddress will succeed.
In SSLClientSocketNSS, revert the workaround because we don't need to
delay the GetPeerAddress call.
R=mbelshe@chromium.org
BUG=none
TEST=none
Review URL: http://codereview.chromium.org/7155014
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@90090 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | net/socket/ssl_client_socket_nss.cc | 22 | ||||
-rw-r--r-- | net/socket/ssl_client_socket_nss.h | 3 | ||||
-rw-r--r-- | net/socket/tcp_client_socket_libevent.cc | 12 |
3 files changed, 17 insertions, 20 deletions
diff --git a/net/socket/ssl_client_socket_nss.cc b/net/socket/ssl_client_socket_nss.cc index 75de2c9..18b4e58 100644 --- a/net/socket/ssl_client_socket_nss.cc +++ b/net/socket/ssl_client_socket_nss.cc @@ -452,7 +452,6 @@ SSLClientSocketNSS::SSLClientSocketNSS(ClientSocketHandle* transport_socket, completed_handshake_(false), eset_mitm_detected_(false), predicted_cert_chain_correct_(false), - peername_initialized_(false), next_handshake_state_(STATE_NONE), nss_fd_(NULL), nss_bufs_(NULL), @@ -575,14 +574,10 @@ int SSLClientSocketNSS::Connect(CompletionCallback* callback) { return rv; } - // Attempt to initialize the peer name. In the case of TCP FastOpen, - // we don't have the peer yet. - if (!UsingTCPFastOpen()) { - rv = InitializeSSLPeerName(); - if (rv != OK) { - net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); - return rv; - } + rv = InitializeSSLPeerName(); + if (rv != OK) { + net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); + return rv; } if (ssl_config_.cached_info_enabled && ssl_host_info_.get()) { @@ -640,7 +635,6 @@ void SSLClientSocketNSS::Disconnect() { eset_mitm_detected_ = false; start_cert_verification_time_ = base::TimeTicks(); predicted_cert_chain_correct_ = false; - peername_initialized_ = false; nss_bufs_ = NULL; client_certs_.clear(); client_auth_cert_needed_ = false; @@ -967,7 +961,7 @@ int SSLClientSocketNSS::InitializeSSLOptions() { SSL_SetURL(nss_fd_, host_and_port_.host().c_str()); // Tell SSL we're a client; needed if not letting NSPR do socket I/O - SSL_ResetHandshake(nss_fd_, 0); + SSL_ResetHandshake(nss_fd_, PR_FALSE); return OK; } @@ -1004,7 +998,6 @@ int SSLClientSocketNSS::InitializeSSLPeerName() { if (rv != SECSuccess) LogFailedNSSFunction(net_log_, "SSL_SetSockPeerID", peer_id.c_str()); - peername_initialized_ = true; return OK; } @@ -1755,11 +1748,6 @@ int SSLClientSocketNSS::BufferSend(void) { void SSLClientSocketNSS::BufferSendComplete(int result) { EnterFunction(result); - - // In the case of TCP FastOpen, connect is now finished. - if (!peername_initialized_ && UsingTCPFastOpen()) - InitializeSSLPeerName(); - memio_PutWriteResult(nss_bufs_, MapErrorToNSS(result)); transport_send_busy_ = false; OnSendComplete(result); diff --git a/net/socket/ssl_client_socket_nss.h b/net/socket/ssl_client_socket_nss.h index c6fffc4..1c5d80e 100644 --- a/net/socket/ssl_client_socket_nss.h +++ b/net/socket/ssl_client_socket_nss.h @@ -226,9 +226,6 @@ class SSLClientSocketNSS : public SSLClientSocket { // that we found the prediction to be correct. bool predicted_cert_chain_correct_; - // True if the peer name has been initialized. - bool peername_initialized_; - // The time when we started waiting for DNSSEC records. base::Time dnssec_wait_start_time_; diff --git a/net/socket/tcp_client_socket_libevent.cc b/net/socket/tcp_client_socket_libevent.cc index 8540342..38c3446 100644 --- a/net/socket/tcp_client_socket_libevent.cc +++ b/net/socket/tcp_client_socket_libevent.cc @@ -384,6 +384,15 @@ bool TCPClientSocketLibevent::IsConnected() const { if (socket_ == kInvalidSocket || waiting_connect()) return false; + if (use_tcp_fastopen_ && !tcp_fastopen_connected_) { + // With TCP FastOpen, we pretend that the socket is connected. + // This allows GetPeerAddress() to return current_ai_ as the peer + // address. Since we don't fail over to the next address if + // sendto() fails, current_ai_ is the only possible peer address. + CHECK(current_ai_); + return true; + } + // Check if connection is alive. char c; int rv = HANDLE_EINTR(recv(socket_, &c, 1, MSG_PEEK)); @@ -401,6 +410,9 @@ bool TCPClientSocketLibevent::IsConnectedAndIdle() const { if (socket_ == kInvalidSocket || waiting_connect()) return false; + // TODO(wtc): should we also handle the TCP FastOpen case here, + // as we do in IsConnected()? + // Check if connection is alive and we haven't received any data // unexpectedly. char c; |