| Index: net/quic/quic_connection.cc
|
| diff --git a/net/quic/quic_connection.cc b/net/quic/quic_connection.cc
|
| index 454a15b59b5780745b593b603b0c4c06aa0d8bf2..a441c1b94fc9154a39456111288f0b595300a9b6 100644
|
| --- a/net/quic/quic_connection.cc
|
| +++ b/net/quic/quic_connection.cc
|
| @@ -272,6 +272,9 @@ QuicConnection::QuicConnection(QuicConnectionId connection_id,
|
| framer_.set_received_entropy_calculator(&received_packet_manager_);
|
| stats_.connection_creation_time = clock_->ApproximateNow();
|
| sent_packet_manager_.set_network_change_visitor(this);
|
| + if (FLAGS_quic_small_default_packet_size && is_server_) {
|
| + set_max_packet_length(kDefaultServerMaxPacketSize);
|
| + }
|
| }
|
|
|
| QuicConnection::~QuicConnection() {
|
| @@ -291,7 +294,7 @@ void QuicConnection::SetFromConfig(const QuicConfig& config) {
|
| if (config.negotiated()) {
|
| SetNetworkTimeouts(QuicTime::Delta::Infinite(),
|
| config.IdleConnectionStateLifetime());
|
| - if (FLAGS_quic_allow_silent_close && config.SilentClose()) {
|
| + if (config.SilentClose()) {
|
| silent_close_enabled_ = true;
|
| }
|
| } else {
|
| @@ -969,18 +972,16 @@ void QuicConnection::MaybeCloseIfTooManyOutstandingPackets() {
|
| }
|
| }
|
|
|
| -QuicAckFrame* QuicConnection::CreateAckFrame() {
|
| - QuicAckFrame* outgoing_ack = new QuicAckFrame();
|
| - received_packet_manager_.UpdateReceivedPacketInfo(
|
| - outgoing_ack, clock_->ApproximateNow());
|
| - DVLOG(1) << ENDPOINT << "Creating ack frame: " << *outgoing_ack;
|
| - return outgoing_ack;
|
| +void QuicConnection::PopulateAckFrame(QuicAckFrame* ack) {
|
| + received_packet_manager_.UpdateReceivedPacketInfo(ack,
|
| + clock_->ApproximateNow());
|
| }
|
|
|
| -QuicStopWaitingFrame* QuicConnection::CreateStopWaitingFrame() {
|
| - QuicStopWaitingFrame stop_waiting;
|
| - UpdateStopWaiting(&stop_waiting);
|
| - return new QuicStopWaitingFrame(stop_waiting);
|
| +void QuicConnection::PopulateStopWaitingFrame(
|
| + QuicStopWaitingFrame* stop_waiting) {
|
| + stop_waiting->least_unacked = GetLeastUnacked();
|
| + stop_waiting->entropy_hash = sent_entropy_manager_.GetCumulativeEntropy(
|
| + stop_waiting->least_unacked - 1);
|
| }
|
|
|
| bool QuicConnection::ShouldLastPacketInstigateAck() const {
|
| @@ -1123,29 +1124,22 @@ void QuicConnection::SendBlocked(QuicStreamId id) {
|
| }
|
|
|
| const QuicConnectionStats& QuicConnection::GetStats() {
|
| - if (!FLAGS_quic_use_initial_rtt_for_stats) {
|
| - stats_.min_rtt_us =
|
| - sent_packet_manager_.GetRttStats()->min_rtt().ToMicroseconds();
|
| - stats_.srtt_us =
|
| - sent_packet_manager_.GetRttStats()->smoothed_rtt().ToMicroseconds();
|
| - } else {
|
| - const RttStats* rtt_stats = sent_packet_manager_.GetRttStats();
|
| + const RttStats* rtt_stats = sent_packet_manager_.GetRttStats();
|
|
|
| - // Update rtt and estimated bandwidth.
|
| - QuicTime::Delta min_rtt = rtt_stats->min_rtt();
|
| - if (min_rtt.IsZero()) {
|
| - // If min RTT has not been set, use initial RTT instead.
|
| - min_rtt = QuicTime::Delta::FromMicroseconds(rtt_stats->initial_rtt_us());
|
| - }
|
| - stats_.min_rtt_us = min_rtt.ToMicroseconds();
|
| + // Update rtt and estimated bandwidth.
|
| + QuicTime::Delta min_rtt = rtt_stats->min_rtt();
|
| + if (min_rtt.IsZero()) {
|
| + // If min RTT has not been set, use initial RTT instead.
|
| + min_rtt = QuicTime::Delta::FromMicroseconds(rtt_stats->initial_rtt_us());
|
| + }
|
| + stats_.min_rtt_us = min_rtt.ToMicroseconds();
|
|
|
| - QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
|
| - if (srtt.IsZero()) {
|
| - // If SRTT has not been set, use initial RTT instead.
|
| - srtt = QuicTime::Delta::FromMicroseconds(rtt_stats->initial_rtt_us());
|
| - }
|
| - stats_.srtt_us = srtt.ToMicroseconds();
|
| + QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
|
| + if (srtt.IsZero()) {
|
| + // If SRTT has not been set, use initial RTT instead.
|
| + srtt = QuicTime::Delta::FromMicroseconds(rtt_stats->initial_rtt_us());
|
| }
|
| + stats_.srtt_us = srtt.ToMicroseconds();
|
|
|
| stats_.estimated_bandwidth = sent_packet_manager_.BandwidthEstimate();
|
| stats_.max_packet_size = packet_generator_.max_packet_length();
|
| @@ -1316,8 +1310,13 @@ void QuicConnection::WritePendingRetransmissions() {
|
| // does not require the creator to be flushed.
|
| packet_generator_.FlushAllQueuedFrames();
|
| SerializedPacket serialized_packet = packet_generator_.ReserializeAllFrames(
|
| - pending.retransmittable_frames.frames(),
|
| - pending.sequence_number_length);
|
| + pending.retransmittable_frames, pending.sequence_number_length);
|
| + if (serialized_packet.packet == nullptr) {
|
| + // We failed to serialize the packet, so close the connection.
|
| + // CloseConnection does not send close packet, so no infinite loop here.
|
| + CloseConnection(QUIC_ENCRYPTION_FAILURE, false);
|
| + return;
|
| + }
|
|
|
| DVLOG(1) << ENDPOINT << "Retransmitting " << pending.sequence_number
|
| << " as " << serialized_packet.sequence_number;
|
| @@ -1403,7 +1402,8 @@ bool QuicConnection::WritePacketInner(QueuedPacket* packet) {
|
| return true;
|
| }
|
| // Connection close packets are encrypted and saved, so don't exit early.
|
| - if (writer_->IsWriteBlocked() && !IsConnectionClose(*packet)) {
|
| + const bool is_connection_close = IsConnectionClose(*packet);
|
| + if (writer_->IsWriteBlocked() && !is_connection_close) {
|
| return false;
|
| }
|
|
|
| @@ -1412,32 +1412,19 @@ bool QuicConnection::WritePacketInner(QueuedPacket* packet) {
|
| DCHECK_LE(sequence_number_of_last_sent_packet_, sequence_number);
|
| sequence_number_of_last_sent_packet_ = sequence_number;
|
|
|
| - QuicEncryptedPacket* encrypted = framer_.EncryptPacket(
|
| - packet->encryption_level,
|
| - sequence_number,
|
| - *packet->serialized_packet.packet);
|
| - if (encrypted == nullptr) {
|
| - LOG(DFATAL) << ENDPOINT << "Failed to encrypt packet number "
|
| - << sequence_number;
|
| - // CloseConnection does not send close packet, so no infinite loop here.
|
| - CloseConnection(QUIC_ENCRYPTION_FAILURE, false);
|
| - return false;
|
| - }
|
| -
|
| + QuicEncryptedPacket* encrypted = packet->serialized_packet.packet;
|
| // Connection close packets are eventually owned by TimeWaitListManager.
|
| // Others are deleted at the end of this call.
|
| - scoped_ptr<QuicEncryptedPacket> encrypted_deleter;
|
| - if (IsConnectionClose(*packet)) {
|
| + if (is_connection_close) {
|
| DCHECK(connection_close_packet_.get() == nullptr);
|
| connection_close_packet_.reset(encrypted);
|
| + packet->serialized_packet.packet = nullptr;
|
| // This assures we won't try to write *forced* packets when blocked.
|
| // Return true to stop processing.
|
| if (writer_->IsWriteBlocked()) {
|
| visitor_->OnWriteBlocked();
|
| return true;
|
| }
|
| - } else {
|
| - encrypted_deleter.reset(encrypted);
|
| }
|
|
|
| if (!FLAGS_quic_allow_oversized_packets_for_test) {
|
| @@ -1445,18 +1432,15 @@ bool QuicConnection::WritePacketInner(QueuedPacket* packet) {
|
| }
|
| DCHECK_LE(encrypted->length(), packet_generator_.max_packet_length());
|
| DVLOG(1) << ENDPOINT << "Sending packet " << sequence_number << " : "
|
| - << (packet->serialized_packet.packet->is_fec_packet() ? "FEC " :
|
| - (IsRetransmittable(*packet) == HAS_RETRANSMITTABLE_DATA
|
| - ? "data bearing " : " ack only "))
|
| - << ", encryption level: "
|
| + << (packet->serialized_packet.is_fec_packet
|
| + ? "FEC "
|
| + : (IsRetransmittable(*packet) == HAS_RETRANSMITTABLE_DATA
|
| + ? "data bearing "
|
| + : " ack only ")) << ", encryption level: "
|
| << QuicUtils::EncryptionLevelToString(packet->encryption_level)
|
| - << ", length:"
|
| - << packet->serialized_packet.packet->length()
|
| - << ", encrypted length:"
|
| - << encrypted->length();
|
| + << ", encrypted length:" << encrypted->length();
|
| DVLOG(2) << ENDPOINT << "packet(" << sequence_number << "): " << std::endl
|
| - << QuicUtils::StringToHexASCIIDump(
|
| - packet->serialized_packet.packet->AsStringPiece());
|
| + << QuicUtils::StringToHexASCIIDump(encrypted->AsStringPiece());
|
|
|
| QuicTime packet_send_time = QuicTime::Zero();
|
| if (FLAGS_quic_record_send_time_before_write) {
|
| @@ -1542,6 +1526,10 @@ bool QuicConnection::WritePacketInner(QueuedPacket* packet) {
|
|
|
| if (result.status == WRITE_STATUS_ERROR) {
|
| OnWriteError(result.error_code);
|
| + DLOG(ERROR) << ENDPOINT << "failed writing " << encrypted->length()
|
| + << "bytes "
|
| + << " from host " << self_address().ToStringWithoutPort()
|
| + << " to address " << peer_address().ToString();
|
| return false;
|
| }
|
|
|
| @@ -1589,24 +1577,19 @@ void QuicConnection::OnWriteError(int error_code) {
|
|
|
| void QuicConnection::OnSerializedPacket(
|
| const SerializedPacket& serialized_packet) {
|
| - // If a forward-secure encrypter is available but is not being used and this
|
| - // packet's sequence number is after the first packet which requires
|
| - // forward security, start using the forward-secure encrypter.
|
| - if (encryption_level_ != ENCRYPTION_FORWARD_SECURE &&
|
| - has_forward_secure_encrypter_ &&
|
| - serialized_packet.sequence_number >=
|
| - first_required_forward_secure_packet_) {
|
| - SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
|
| + if (serialized_packet.packet == nullptr) {
|
| + // We failed to serialize the packet, so close the connection.
|
| + // CloseConnection does not send close packet, so no infinite loop here.
|
| + CloseConnection(QUIC_ENCRYPTION_FAILURE, false);
|
| + return;
|
| }
|
| if (serialized_packet.retransmittable_frames) {
|
| serialized_packet.retransmittable_frames->
|
| set_encryption_level(encryption_level_);
|
|
|
| - if (FLAGS_quic_ack_notifier_informed_on_serialized) {
|
| - sent_packet_manager_.OnSerializedPacket(serialized_packet);
|
| - }
|
| + sent_packet_manager_.OnSerializedPacket(serialized_packet);
|
| }
|
| - if (serialized_packet.packet->is_fec_packet() && fec_alarm_->IsSet()) {
|
| + if (serialized_packet.is_fec_packet && fec_alarm_->IsSet()) {
|
| // If an FEC packet is serialized with the FEC alarm set, cancel the alarm.
|
| fec_alarm_->Cancel();
|
| }
|
| @@ -1653,12 +1636,16 @@ void QuicConnection::SendOrQueuePacket(QueuedPacket packet) {
|
| if (!WritePacket(&packet)) {
|
| queued_packets_.push_back(packet);
|
| }
|
| -}
|
|
|
| -void QuicConnection::UpdateStopWaiting(QuicStopWaitingFrame* stop_waiting) {
|
| - stop_waiting->least_unacked = GetLeastUnacked();
|
| - stop_waiting->entropy_hash = sent_entropy_manager_.GetCumulativeEntropy(
|
| - stop_waiting->least_unacked - 1);
|
| + // If a forward-secure encrypter is available but is not being used and the
|
| + // next sequence number is the first packet which requires
|
| + // forward security, start using the forward-secure encrypter.
|
| + if (encryption_level_ != ENCRYPTION_FORWARD_SECURE &&
|
| + has_forward_secure_encrypter_ &&
|
| + packet.serialized_packet.sequence_number >=
|
| + first_required_forward_secure_packet_ - 1) {
|
| + SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
|
| + }
|
| }
|
|
|
| void QuicConnection::SendPing() {
|
| @@ -2104,15 +2091,14 @@ HasRetransmittableData QuicConnection::IsRetransmittable(
|
| }
|
| }
|
|
|
| -bool QuicConnection::IsConnectionClose(
|
| - QueuedPacket packet) {
|
| - RetransmittableFrames* retransmittable_frames =
|
| +bool QuicConnection::IsConnectionClose(const QueuedPacket& packet) {
|
| + const RetransmittableFrames* retransmittable_frames =
|
| packet.serialized_packet.retransmittable_frames;
|
| - if (!retransmittable_frames) {
|
| + if (retransmittable_frames == nullptr) {
|
| return false;
|
| }
|
| - for (size_t i = 0; i < retransmittable_frames->frames().size(); ++i) {
|
| - if (retransmittable_frames->frames()[i].type == CONNECTION_CLOSE_FRAME) {
|
| + for (const QuicFrame& frame : retransmittable_frames->frames()) {
|
| + if (frame.type == CONNECTION_CLOSE_FRAME) {
|
| return true;
|
| }
|
| }
|
|
|