Index: net/quic/quic_connection.cc |
diff --git a/net/quic/quic_connection.cc b/net/quic/quic_connection.cc |
index 4adf6246d7ef9c061c2953ea6ed5c9e31e5829d7..f84d08c9eace955fffe66eb7cb543f0d9a53025c 100644 |
--- a/net/quic/quic_connection.cc |
+++ b/net/quic/quic_connection.cc |
@@ -933,9 +933,7 @@ void QuicConnection::UpdateStopWaitingCount() { |
} |
QuicPacketSequenceNumber QuicConnection::GetLeastUnacked() const { |
- return sent_packet_manager_.HasUnackedPackets() ? |
- sent_packet_manager_.GetLeastUnackedSentPacket() : |
- packet_generator_.sequence_number() + 1; |
+ return sent_packet_manager_.GetLeastUnacked(); |
} |
void QuicConnection::MaybeSendInResponseToPacket() { |
@@ -1304,11 +1302,7 @@ bool QuicConnection::CanWrite(HasRetransmittableData retransmittable) { |
} |
bool QuicConnection::WritePacket(const QueuedPacket& packet) { |
- QuicPacketSequenceNumber sequence_number = |
- packet.serialized_packet.sequence_number; |
- if (ShouldDiscardPacket(packet.encryption_level, |
- sequence_number, |
- IsRetransmittable(packet))) { |
+ if (ShouldDiscardPacket(packet)) { |
++stats_.packets_discarded; |
return true; |
} |
@@ -1317,6 +1311,8 @@ bool QuicConnection::WritePacket(const QueuedPacket& packet) { |
return false; |
} |
+ QuicPacketSequenceNumber sequence_number = |
+ packet.serialized_packet.sequence_number; |
// Some encryption algorithms require the packet sequence numbers not be |
// repeated. |
DCHECK_LE(sequence_number_of_last_sent_packet_, sequence_number); |
@@ -1436,16 +1432,15 @@ bool QuicConnection::WritePacket(const QueuedPacket& packet) { |
return true; |
} |
-bool QuicConnection::ShouldDiscardPacket( |
- EncryptionLevel level, |
- QuicPacketSequenceNumber sequence_number, |
- HasRetransmittableData retransmittable) { |
+bool QuicConnection::ShouldDiscardPacket(const QueuedPacket& packet) { |
if (!connected_) { |
DVLOG(1) << ENDPOINT |
<< "Not sending packet as connection is disconnected."; |
return true; |
} |
+ QuicPacketSequenceNumber sequence_number = |
+ packet.serialized_packet.sequence_number; |
// If the packet has been discarded before sending, don't send it. |
// This occurs if a packet gets serialized, queued, then discarded. |
if (!sent_packet_manager_.IsUnacked(sequence_number)) { |
@@ -1455,7 +1450,7 @@ bool QuicConnection::ShouldDiscardPacket( |
} |
if (encryption_level_ == ENCRYPTION_FORWARD_SECURE && |
- level == ENCRYPTION_NONE) { |
+ packet.encryption_level == ENCRYPTION_NONE) { |
// Drop packets that are NULL encrypted since the peer won't accept them |
// anymore. |
DVLOG(1) << ENDPOINT << "Dropping NULL encrypted packet: " |
@@ -1467,7 +1462,7 @@ bool QuicConnection::ShouldDiscardPacket( |
return true; |
} |
- if (retransmittable == HAS_RETRANSMITTABLE_DATA && |
+ if (packet.transmission_type != NOT_RETRANSMISSION && |
!sent_packet_manager_.HasRetransmittableFrames(sequence_number)) { |
DVLOG(1) << ENDPOINT << "Dropping unacked packet: " << sequence_number |
<< " A previous transmission was acked while write blocked."; |
@@ -1978,9 +1973,9 @@ QuicConnection::ScopedPacketBundler::~ScopedPacketBundler() { |
} |
HasRetransmittableData QuicConnection::IsRetransmittable( |
- QueuedPacket packet) { |
- // TODO(cyr): Understand why the first check here is necessary. Without it, |
- // DiscardRetransmit test fails. |
+ const QueuedPacket& packet) { |
+ // Retransmitted packets retransmittable frames are owned by the unacked |
+ // packet map, but are not present in the serialized packet. |
if (packet.transmission_type != NOT_RETRANSMISSION || |
packet.serialized_packet.retransmittable_frames != NULL) { |
return HAS_RETRANSMITTABLE_DATA; |