| Index: net/quic/quic_connection.cc
|
| diff --git a/net/quic/quic_connection.cc b/net/quic/quic_connection.cc
|
| index 5fdc4b9528d0afd62a74bbc5bfd34daa9a09dcf6..07ef30c69f60199c036d041f3a90ea9454c7df90 100644
|
| --- a/net/quic/quic_connection.cc
|
| +++ b/net/quic/quic_connection.cc
|
| @@ -1070,13 +1070,9 @@ QuicConsumedData QuicConnection::SendStreamData(
|
| QuicAckNotifier::DelegateInterface* delegate) {
|
| if (!fin && data.Empty()) {
|
| LOG(DFATAL) << "Attempt to send empty stream frame";
|
| - }
|
| -
|
| - // This notifier will be owned by the AckNotifierManager (or deleted below if
|
| - // no data or FIN was consumed).
|
| - QuicAckNotifier* notifier = nullptr;
|
| - if (delegate) {
|
| - notifier = new QuicAckNotifier(delegate);
|
| + if (FLAGS_quic_empty_data_no_fin_early_return) {
|
| + return QuicConsumedData(0, false);
|
| + }
|
| }
|
|
|
| // Opportunistically bundle an ack with every outgoing packet.
|
| @@ -1093,17 +1089,8 @@ QuicConsumedData QuicConnection::SendStreamData(
|
| // also if there is possibility of revival. Only bundle an ack if there's no
|
| // processing left that may cause received_info_ to change.
|
| ScopedPacketBundler ack_bundler(this, BUNDLE_PENDING_ACK);
|
| - QuicConsumedData consumed_data =
|
| - packet_generator_.ConsumeData(id, data, offset, fin, fec_protection,
|
| - notifier);
|
| -
|
| - if (notifier &&
|
| - (consumed_data.bytes_consumed == 0 && !consumed_data.fin_consumed)) {
|
| - // No data was consumed, nor was a fin consumed, so delete the notifier.
|
| - delete notifier;
|
| - }
|
| -
|
| - return consumed_data;
|
| + return packet_generator_.ConsumeData(id, data, offset, fin, fec_protection,
|
| + delegate);
|
| }
|
|
|
| void QuicConnection::SendRstStream(QuicStreamId id,
|
| @@ -1130,11 +1117,30 @@ void QuicConnection::SendBlocked(QuicStreamId id) {
|
| }
|
|
|
| const QuicConnectionStats& QuicConnection::GetStats() {
|
| - // Update rtt and estimated bandwidth.
|
| - stats_.min_rtt_us =
|
| - sent_packet_manager_.GetRttStats()->min_rtt().ToMicroseconds();
|
| - stats_.srtt_us =
|
| - sent_packet_manager_.GetRttStats()->smoothed_rtt().ToMicroseconds();
|
| + 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();
|
| +
|
| + // 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();
|
| + }
|
| +
|
| stats_.estimated_bandwidth = sent_packet_manager_.BandwidthEstimate();
|
| stats_.max_packet_size = packet_generator_.max_packet_length();
|
| return stats_;
|
| @@ -1598,6 +1604,16 @@ void QuicConnection::OnCongestionWindowChange() {
|
| visitor_->OnCongestionWindowChange(clock_->ApproximateNow());
|
| }
|
|
|
| +void QuicConnection::OnRttChange() {
|
| + // Uses the connection's smoothed RTT. If zero, uses initial_rtt.
|
| + QuicTime::Delta rtt = sent_packet_manager_.GetRttStats()->smoothed_rtt();
|
| + if (rtt.IsZero()) {
|
| + rtt = QuicTime::Delta::FromMicroseconds(
|
| + sent_packet_manager_.GetRttStats()->initial_rtt_us());
|
| + }
|
| + packet_generator_.OnRttChange(rtt);
|
| +}
|
| +
|
| void QuicConnection::OnHandshakeComplete() {
|
| sent_packet_manager_.SetHandshakeConfirmed();
|
| // The client should immediately ack the SHLO to confirm the handshake is
|
|
|