Index: net/quic/quic_crypto_server_stream.cc |
diff --git a/net/quic/quic_crypto_server_stream.cc b/net/quic/quic_crypto_server_stream.cc |
index 7bd2c034d93b2d39bfc1c718f033739dc874710b..8e07f54a9d033010534b01496e6428a1b10f7d85 100644 |
--- a/net/quic/quic_crypto_server_stream.cc |
+++ b/net/quic/quic_crypto_server_stream.cc |
@@ -15,13 +15,23 @@ |
namespace net { |
+void ServerHelloNotifier::OnAckNotification( |
+ int num_original_packets, |
+ int num_original_bytes, |
+ int num_retransmitted_packets, |
+ int num_retransmitted_bytes, |
+ QuicTime::Delta delta_largest_observed) { |
+ server_stream_->OnServerHelloAcked(); |
+} |
+ |
QuicCryptoServerStream::QuicCryptoServerStream( |
const QuicCryptoServerConfig& crypto_config, |
QuicSession* session) |
: QuicCryptoStream(session), |
crypto_config_(crypto_config), |
validate_client_hello_cb_(NULL), |
- num_handshake_messages_(0) { |
+ num_handshake_messages_(0), |
+ num_server_config_update_messages_sent_(0) { |
} |
QuicCryptoServerStream::~QuicCryptoServerStream() { |
@@ -116,7 +126,16 @@ void QuicCryptoServerStream::FinishProcessingHandshakeMessage( |
session()->connection()->SetDecrypter( |
crypto_negotiated_params_.initial_crypters.decrypter.release(), |
ENCRYPTION_INITIAL); |
- SendHandshakeMessage(reply); |
+ |
+ // We want to be notified when the SHLO is ACKed so that we can disable |
+ // HANDSHAKE_MODE in the sent packet manager. |
+ if (session()->connection()->version() <= QUIC_VERSION_21) { |
+ SendHandshakeMessage(reply); |
+ } else { |
+ scoped_refptr<ServerHelloNotifier> server_hello_notifier( |
+ new ServerHelloNotifier(this)); |
+ SendHandshakeMessage(reply, server_hello_notifier.get()); |
+ } |
session()->connection()->SetEncrypter( |
ENCRYPTION_FORWARD_SECURE, |
@@ -130,6 +149,37 @@ void QuicCryptoServerStream::FinishProcessingHandshakeMessage( |
encryption_established_ = true; |
handshake_confirmed_ = true; |
session()->OnCryptoHandshakeEvent(QuicSession::HANDSHAKE_CONFIRMED); |
+ |
+ // Now that the handshake is complete, send an updated server config and |
+ // source-address token to the client. |
+ SendServerConfigUpdate(); |
+} |
+ |
+void QuicCryptoServerStream::SendServerConfigUpdate() { |
+ if (session()->connection()->version() <= QUIC_VERSION_21) { |
+ return; |
+ } |
+ |
+ CryptoHandshakeMessage server_config_update_message; |
+ if (!crypto_config_.BuildServerConfigUpdateMessage( |
+ session()->connection()->peer_address(), |
+ session()->connection()->clock(), |
+ session()->connection()->random_generator(), |
+ crypto_negotiated_params_, &server_config_update_message)) { |
+ DVLOG(1) << "Server: Failed to build server config update (SCUP)!"; |
+ return; |
+ } |
+ |
+ DVLOG(1) << "Server: Sending server config update (SCUP): " |
+ << server_config_update_message.DebugString(); |
+ const QuicData& data = server_config_update_message.GetSerialized(); |
+ WriteOrBufferData(string(data.data(), data.length()), false, NULL); |
+ |
+ ++num_server_config_update_messages_sent_; |
+} |
+ |
+void QuicCryptoServerStream::OnServerHelloAcked() { |
+ session()->connection()->OnHandshakeComplete(); |
} |
bool QuicCryptoServerStream::GetBase64SHA256ClientChannelID( |