| 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(
|
|
|