| Index: net/quic/quic_connection_logger.cc
|
| diff --git a/net/quic/quic_connection_logger.cc b/net/quic/quic_connection_logger.cc
|
| index ae67e08ae0778faba0f735311a6b6c669a07c938..acdb3f2976851497882098de195294478a065fc6 100644
|
| --- a/net/quic/quic_connection_logger.cc
|
| +++ b/net/quic/quic_connection_logger.cc
|
| @@ -392,13 +392,32 @@ void QuicConnectionLogger::OnFrameAddedToPacket(const QuicFrame& frame) {
|
| NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_SENT,
|
| base::Bind(&NetLogQuicStreamFrameCallback, frame.stream_frame));
|
| break;
|
| - case ACK_FRAME:
|
| + case ACK_FRAME: {
|
| net_log_.AddEvent(
|
| NetLog::TYPE_QUIC_SESSION_ACK_FRAME_SENT,
|
| base::Bind(&NetLogQuicAckFrameCallback, frame.ack_frame));
|
| - if (frame.ack_frame->is_truncated)
|
| - ++num_truncated_acks_sent_;
|
| + const SequenceNumberSet& missing_packets =
|
| + frame.ack_frame->missing_packets;
|
| + const uint8 max_ranges = std::numeric_limits<uint8>::max();
|
| + // Compute an upper bound on the number of NACK ranges. If the bound
|
| + // is below the max, then it clearly isn't truncated.
|
| + if (missing_packets.size() < max_ranges ||
|
| + (*missing_packets.rbegin() - *missing_packets.begin() -
|
| + missing_packets.size() + 1) < max_ranges) {
|
| + break;
|
| + }
|
| + size_t num_ranges = 0;
|
| + QuicPacketSequenceNumber last_missing = 0;
|
| + for (SequenceNumberSet::const_iterator it = missing_packets.begin();
|
| + it != missing_packets.end(); ++it) {
|
| + if (*it != last_missing + 1 && ++num_ranges >= max_ranges) {
|
| + ++num_truncated_acks_sent_;
|
| + break;
|
| + }
|
| + last_missing = *it;
|
| + }
|
| break;
|
| + }
|
| case CONGESTION_FEEDBACK_FRAME:
|
| net_log_.AddEvent(
|
| NetLog::TYPE_QUIC_SESSION_CONGESTION_FEEDBACK_FRAME_SENT,
|
|
|