Index: net/quic/congestion_control/tcp_cubic_sender.cc |
diff --git a/net/quic/congestion_control/tcp_cubic_sender.cc b/net/quic/congestion_control/tcp_cubic_sender.cc |
index 4c82a351bd9f55e17699ef440ced93b1df20fbba..70367ff52f734344589beba72e9eed83cb3e0109 100644 |
--- a/net/quic/congestion_control/tcp_cubic_sender.cc |
+++ b/net/quic/congestion_control/tcp_cubic_sender.cc |
@@ -14,6 +14,7 @@ const QuicByteCount kDefaultReceiveWindow = 64000; |
const int64 kInitialCongestionWindow = 10; |
const int64 kMaxCongestionWindow = 10000; |
const int kMaxBurstLength = 3; |
+const int kInitialRttMs = 60; // At a typical RTT 60 ms. |
}; |
TcpCubicSender::TcpCubicSender(const QuicClock* clock, bool reno) |
@@ -84,11 +85,8 @@ void TcpCubicSender::OnIncomingLoss(QuicTime /*ack_receive_time*/) { |
void TcpCubicSender::SentPacket(QuicTime /*sent_time*/, |
QuicPacketSequenceNumber sequence_number, |
QuicByteCount bytes, |
- bool is_retransmission, |
- bool has_retransmittable_data) { |
- if (!is_retransmission && has_retransmittable_data) { |
- bytes_in_flight_ += bytes; |
- } |
+ bool is_retransmission) { |
+ bytes_in_flight_ += bytes; |
if (!is_retransmission && update_end_sequence_number_) { |
end_sequence_number_ = sequence_number; |
if (AvailableCongestionWindow() == 0) { |
@@ -98,10 +96,16 @@ void TcpCubicSender::SentPacket(QuicTime /*sent_time*/, |
} |
} |
+void TcpCubicSender::AbandoningPacket(QuicPacketSequenceNumber sequence_number, |
+ QuicByteCount abandoned_bytes) { |
+ bytes_in_flight_ -= abandoned_bytes; |
+} |
+ |
QuicTime::Delta TcpCubicSender::TimeUntilSend(QuicTime now, |
- bool is_retransmission) { |
- if (is_retransmission) { |
- // For TCP we can always send a retransmission immediately. |
+ bool is_retransmission, |
+ bool has_retransmittable_data) { |
+ if (is_retransmission || !has_retransmittable_data) { |
+ // For TCP we can always send a retransmission and/or an ACK immediately. |
return QuicTime::Delta::Zero(); |
} |
if (AvailableCongestionWindow() == 0) { |
@@ -130,6 +134,14 @@ QuicBandwidth TcpCubicSender::BandwidthEstimate() { |
return QuicBandwidth::Zero(); |
} |
+QuicTime::Delta TcpCubicSender::SmoothedRtt() { |
+ // TODO(satyamshekhar): Return the smoothed averaged RTT. |
+ if (delay_min_.IsZero()) { |
+ return QuicTime::Delta::FromMilliseconds(kInitialRttMs); |
+ } |
+ return delay_min_; |
+} |
+ |
void TcpCubicSender::Reset() { |
delay_min_ = QuicTime::Delta::Zero(); |
hybrid_slow_start_.Restart(); |
@@ -192,10 +204,12 @@ void TcpCubicSender::OnTimeOut() { |
} |
void TcpCubicSender::AckAccounting(QuicTime::Delta rtt) { |
- if (rtt.ToMicroseconds() <= 0) { |
- // RTT can't be 0 or negative. |
+ if (rtt.IsInfinite() || rtt.IsZero()) { |
return; |
} |
+ // RTT can't be negative. |
+ DCHECK_LT(0, rtt.ToMicroseconds()); |
+ |
// TODO(pwestin): Discard delay samples right after fast recovery, |
// during 1 second?. |