Index: net/quic/quic_sent_packet_manager.cc |
diff --git a/net/quic/quic_sent_packet_manager.cc b/net/quic/quic_sent_packet_manager.cc |
index 089b301d8b60c5cd1072b1bb22aa43a99972c00b..21a4fbcd84b6f16856a8ba4e21e8f2a851baee31 100644 |
--- a/net/quic/quic_sent_packet_manager.cc |
+++ b/net/quic/quic_sent_packet_manager.cc |
@@ -78,7 +78,7 @@ QuicSentPacketManager::QuicSentPacketManager( |
congestion_control_type, |
stats)), |
loss_algorithm_(LossDetectionInterface::Create(loss_type)), |
- largest_observed_(0), |
+ least_packet_awaited_by_peer_(1), |
first_rto_transmission_(0), |
consecutive_rto_count_(0), |
consecutive_tlp_count_(0), |
@@ -113,8 +113,13 @@ void QuicSentPacketManager::SetFromConfig(const QuicConfig& config) { |
send_algorithm_.reset( |
SendAlgorithmInterface::Create(clock_, &rtt_stats_, kReno, stats_)); |
} |
- if (config.HasReceivedConnectionOptions() && |
- ContainsQuicTag(config.ReceivedConnectionOptions(), kPACE)) { |
+ if (is_server_) { |
+ if (config.HasReceivedConnectionOptions() && |
+ ContainsQuicTag(config.ReceivedConnectionOptions(), kPACE)) { |
+ EnablePacing(); |
+ } |
+ } else if (config.HasSendConnectionOptions() && |
+ ContainsQuicTag(config.SendConnectionOptions(), kPACE)) { |
EnablePacing(); |
} |
// TODO(ianswett): Remove the "HasReceivedLossDetection" branch once |
@@ -179,17 +184,25 @@ void QuicSentPacketManager::OnIncomingAck(const QuicAckFrame& ack_frame, |
QuicTime ack_receive_time) { |
QuicByteCount bytes_in_flight = unacked_packets_.bytes_in_flight(); |
+ UpdatePacketInformationReceivedByPeer(ack_frame); |
// We rely on delta_time_largest_observed to compute an RTT estimate, so |
// we only update rtt when the largest observed gets acked. |
bool largest_observed_acked = MaybeUpdateRTT(ack_frame, ack_receive_time); |
- if (largest_observed_ < ack_frame.largest_observed) { |
- largest_observed_ = ack_frame.largest_observed; |
- unacked_packets_.IncreaseLargestObserved(largest_observed_); |
- } |
+ DCHECK_GE(ack_frame.largest_observed, unacked_packets_.largest_observed()); |
+ unacked_packets_.IncreaseLargestObserved(ack_frame.largest_observed); |
+ |
HandleAckForSentPackets(ack_frame); |
InvokeLossDetection(ack_receive_time); |
MaybeInvokeCongestionEvent(largest_observed_acked, bytes_in_flight); |
+ sustained_bandwidth_recorder_.RecordEstimate( |
+ send_algorithm_->InRecovery(), |
+ send_algorithm_->InSlowStart(), |
+ send_algorithm_->BandwidthEstimate(), |
+ ack_receive_time, |
+ clock_->WallNow(), |
+ rtt_stats_.SmoothedRtt()); |
+ |
// If we have received a truncated ack, then we need to clear out some |
// previous transmissions to allow the peer to actually ACK new packets. |
if (ack_frame.is_truncated) { |
@@ -209,12 +222,21 @@ void QuicSentPacketManager::OnIncomingAck(const QuicAckFrame& ack_frame, |
if (debug_delegate_ != NULL) { |
debug_delegate_->OnIncomingAck(ack_frame, |
ack_receive_time, |
- largest_observed_, |
+ unacked_packets_.largest_observed(), |
largest_observed_acked, |
GetLeastUnackedSentPacket()); |
} |
} |
+void QuicSentPacketManager::UpdatePacketInformationReceivedByPeer( |
+ const QuicAckFrame& ack_frame) { |
+ if (ack_frame.missing_packets.empty()) { |
+ least_packet_awaited_by_peer_ = ack_frame.largest_observed + 1; |
+ } else { |
+ least_packet_awaited_by_peer_ = *(ack_frame.missing_packets.begin()); |
+ } |
+} |
+ |
void QuicSentPacketManager::MaybeInvokeCongestionEvent( |
bool rtt_updated, QuicByteCount bytes_in_flight) { |
if (!rtt_updated && packets_acked_.empty() && packets_lost_.empty()) { |
@@ -501,15 +523,11 @@ bool QuicSentPacketManager::OnPacketSent( |
TransmissionType transmission_type, |
HasRetransmittableData has_retransmittable_data) { |
DCHECK_LT(0u, sequence_number); |
+ DCHECK(unacked_packets_.IsUnacked(sequence_number)); |
LOG_IF(DFATAL, bytes == 0) << "Cannot send empty packets."; |
if (pending_timer_transmission_count_ > 0) { |
--pending_timer_transmission_count_; |
} |
- // In rare circumstances, the packet could be serialized, sent, and then acked |
- // before OnPacketSent is called. |
- if (!unacked_packets_.IsUnacked(sequence_number)) { |
- return false; |
- } |
if (unacked_packets_.bytes_in_flight() == 0) { |
// TODO(ianswett): Consider being less aggressive to force a new |
@@ -680,7 +698,7 @@ void QuicSentPacketManager::InvokeLossDetection(QuicTime time) { |
SequenceNumberSet lost_packets = |
loss_algorithm_->DetectLostPackets(unacked_packets_, |
time, |
- largest_observed_, |
+ unacked_packets_.largest_observed(), |
rtt_stats_); |
for (SequenceNumberSet::const_iterator it = lost_packets.begin(); |
it != lost_packets.end(); ++it) { |
@@ -851,6 +869,11 @@ bool QuicSentPacketManager::HasReliableBandwidthEstimate() const { |
return send_algorithm_->HasReliableBandwidthEstimate(); |
} |
+const QuicSustainedBandwidthRecorder& |
+QuicSentPacketManager::SustainedBandwidthRecorder() const { |
+ return sustained_bandwidth_recorder_; |
+} |
+ |
QuicByteCount QuicSentPacketManager::GetCongestionWindow() const { |
return send_algorithm_->GetCongestionWindow(); |
} |