Index: net/quic/quic_connection.cc |
diff --git a/net/quic/quic_connection.cc b/net/quic/quic_connection.cc |
index ca92f440c9eec4edc9a2bccaac6d4400429fdd17..b93fdee08579e00f1f48a5c0716af568c924e3ec 100644 |
--- a/net/quic/quic_connection.cc |
+++ b/net/quic/quic_connection.cc |
@@ -101,23 +101,6 @@ class RetransmissionAlarm : public QuicAlarm::Delegate { |
QuicConnection* connection_; |
}; |
-// This alarm will be scheduled any time a FEC-bearing packet is sent out. |
-// When the alarm goes off, the connection checks to see if the oldest packets |
-// have been acked, and removes them from the congestion window if not. |
-class AbandonFecAlarm : public QuicAlarm::Delegate { |
- public: |
- explicit AbandonFecAlarm(QuicConnection* connection) |
- : connection_(connection) { |
- } |
- |
- virtual QuicTime OnAlarm() OVERRIDE { |
- return connection_->OnAbandonFecTimeout(); |
- } |
- |
- private: |
- QuicConnection* connection_; |
-}; |
- |
// An alarm that is scheduled when the sent scheduler requires a |
// a delay before sending packets and fires when the packet may be sent. |
class SendAlarm : public QuicAlarm::Delegate { |
@@ -208,7 +191,6 @@ QuicConnection::QuicConnection(QuicGuid guid, |
received_packet_manager_(kTCP), |
ack_alarm_(helper->CreateAlarm(new AckAlarm(this))), |
retransmission_alarm_(helper->CreateAlarm(new RetransmissionAlarm(this))), |
- abandon_fec_alarm_(helper->CreateAlarm(new AbandonFecAlarm(this))), |
send_alarm_(helper->CreateAlarm(new SendAlarm(this))), |
resume_writes_alarm_(helper->CreateAlarm(new SendAlarm(this))), |
timeout_alarm_(helper->CreateAlarm(new TimeoutAlarm(this))), |
@@ -524,18 +506,13 @@ void QuicConnection::ProcessAckFrame(const QuicAckFrame& incoming_ack) { |
if (reset_retransmission_alarm) { |
retransmission_alarm_->Cancel(); |
- abandon_fec_alarm_->Cancel(); |
// Reset the RTO and FEC alarms if the are unacked packets. |
- QuicTime::Delta retransmission_delay = |
- sent_packet_manager_.GetRetransmissionDelay(); |
if (sent_packet_manager_.HasUnackedPackets()) { |
+ QuicTime::Delta retransmission_delay = |
+ sent_packet_manager_.GetRetransmissionDelay(); |
retransmission_alarm_->Set( |
clock_->ApproximateNow().Add(retransmission_delay)); |
} |
- if (sent_packet_manager_.HasUnackedFecPackets()) { |
- abandon_fec_alarm_->Set( |
- clock_->ApproximateNow().Add(retransmission_delay)); |
- } |
} |
} |
@@ -1108,9 +1085,8 @@ bool QuicConnection::CanWrite(TransmissionType transmission_type, |
return true; |
} |
-void QuicConnection::SetupRetransmission( |
- QuicPacketSequenceNumber sequence_number, |
- EncryptionLevel level) { |
+void QuicConnection::SetupRetransmissionAlarm( |
+ QuicPacketSequenceNumber sequence_number) { |
if (!sent_packet_manager_.HasRetransmittableFrames(sequence_number)) { |
DVLOG(1) << ENDPOINT << "Will not retransmit packet " << sequence_number; |
return; |
@@ -1128,16 +1104,6 @@ void QuicConnection::SetupRetransmission( |
clock_->ApproximateNow().Add(retransmission_delay)); |
} |
-void QuicConnection::SetupAbandonFecTimer( |
- QuicPacketSequenceNumber sequence_number) { |
- if (abandon_fec_alarm_->IsSet()) { |
- return; |
- } |
- QuicTime::Delta retransmission_delay = |
- sent_packet_manager_.GetRetransmissionDelay(); |
- abandon_fec_alarm_->Set(clock_->ApproximateNow().Add(retransmission_delay)); |
-} |
- |
bool QuicConnection::WritePacket(EncryptionLevel level, |
QuicPacketSequenceNumber sequence_number, |
QuicPacket* packet, |
@@ -1314,7 +1280,6 @@ bool QuicConnection::OnPacketSent(WriteResult result) { |
QuicPacketSequenceNumber sequence_number = pending_write_->sequence_number; |
TransmissionType transmission_type = pending_write_->transmission_type; |
HasRetransmittableData retransmittable = pending_write_->retransmittable; |
- EncryptionLevel level = pending_write_->level; |
bool is_fec_packet = pending_write_->is_fec_packet; |
size_t length = pending_write_->length; |
pending_write_.reset(); |
@@ -1336,10 +1301,8 @@ bool QuicConnection::OnPacketSent(WriteResult result) { |
// Set the retransmit alarm only when we have sent the packet to the client |
// and not when it goes to the pending queue, otherwise we will end up adding |
// an entry to retransmission_timeout_ every time we attempt a write. |
- if (retransmittable == HAS_RETRANSMITTABLE_DATA) { |
- SetupRetransmission(sequence_number, level); |
- } else if (is_fec_packet) { |
- SetupAbandonFecTimer(sequence_number); |
+ if (retransmittable == HAS_RETRANSMITTABLE_DATA || is_fec_packet) { |
+ SetupRetransmissionAlarm(sequence_number); |
} |
// TODO(ianswett): Change the sequence number length and other packet creator |
@@ -1350,7 +1313,7 @@ bool QuicConnection::OnPacketSent(WriteResult result) { |
sent_packet_manager_.SmoothedRtt())); |
sent_packet_manager_.OnPacketSent(sequence_number, now, length, |
- transmission_type, retransmittable); |
+ transmission_type, retransmittable); |
stats_.bytes_sent += result.bytes_written; |
++stats_.packets_sent; |
@@ -1370,8 +1333,7 @@ bool QuicConnection::OnSerializedPacket( |
serialized_packet.retransmittable_frames-> |
set_encryption_level(encryption_level_); |
} |
- sent_packet_manager_.OnSerializedPacket(serialized_packet, |
- clock_->ApproximateNow()); |
+ sent_packet_manager_.OnSerializedPacket(serialized_packet); |
// The TransmissionType is NOT_RETRANSMISSION because all retransmissions |
// serialize packets and invoke SendOrQueuePacket directly. |
return SendOrQueuePacket(encryption_level_, |
@@ -1436,16 +1398,14 @@ void QuicConnection::OnRetransmissionTimeout() { |
sent_packet_manager_.OnRetransmissionTimeout(); |
WriteIfNotBlocked(); |
-} |
- |
-QuicTime QuicConnection::OnAbandonFecTimeout() { |
- QuicTime fec_timeout = sent_packet_manager_.OnAbandonFecTimeout(); |
- // If a packet was abandoned, then the congestion window may have |
- // opened up, so attempt to write. |
- WriteIfNotBlocked(); |
- |
- return fec_timeout; |
+ // Ensure the retransmission alarm is always set if there are unacked packets. |
+ if (sent_packet_manager_.HasUnackedPackets() && !HasQueuedData() && |
+ !retransmission_alarm_->IsSet()) { |
+ QuicTime rto_timeout = clock_->ApproximateNow().Add( |
+ sent_packet_manager_.GetRetransmissionDelay()); |
+ retransmission_alarm_->Set(rto_timeout); |
+ } |
} |
void QuicConnection::SetEncrypter(EncryptionLevel level, |