| Index: net/quic/quic_received_packet_manager.cc
|
| diff --git a/net/quic/quic_received_packet_manager.cc b/net/quic/quic_received_packet_manager.cc
|
| index aa3c9fd4f9408b8e3a8d60e990e67487911d5dc8..a5cf1ff2bd5cf2ae32975ae4186cc96f30bae05b 100644
|
| --- a/net/quic/quic_received_packet_manager.cc
|
| +++ b/net/quic/quic_received_packet_manager.cc
|
| @@ -14,6 +14,7 @@
|
| #include "net/quic/crypto/crypto_protocol.h"
|
| #include "net/quic/quic_bug_tracker.h"
|
| #include "net/quic/quic_connection_stats.h"
|
| +#include "net/quic/quic_flags.h"
|
|
|
| using std::max;
|
| using std::min;
|
| @@ -146,8 +147,10 @@ void QuicReceivedPacketManager::RecordPacketReceived(
|
| QuicTime receipt_time) {
|
| QuicPacketNumber packet_number = header.packet_number;
|
| DCHECK(IsAwaitingPacket(packet_number));
|
| + if (FLAGS_quic_dont_copy_acks && !ack_frame_updated_) {
|
| + ack_frame_.received_packet_times.clear();
|
| + }
|
| ack_frame_updated_ = true;
|
| -
|
| // Adds the range of packet numbers from max(largest observed + 1, least
|
| // awaiting ack) up to packet_number not including packet_number.
|
| ack_frame_.missing_packets.Add(
|
| @@ -205,6 +208,7 @@ struct isTooLarge {
|
| void QuicReceivedPacketManager::UpdateReceivedPacketInfo(
|
| QuicAckFrame* ack_frame,
|
| QuicTime approximate_now) {
|
| + DCHECK(!FLAGS_quic_dont_copy_acks);
|
| ack_frame_updated_ = false;
|
| *ack_frame = ack_frame_;
|
| ack_frame->entropy_hash = EntropyHash(ack_frame_.largest_observed);
|
| @@ -233,13 +237,41 @@ void QuicReceivedPacketManager::UpdateReceivedPacketInfo(
|
| }
|
| }
|
|
|
| - // TODO(ianswett): Instead of transferring all the information over,
|
| - // consider giving the QuicPacketGenerator a reference to this ack frame
|
| - // and clear it afterwards.
|
| ack_frame->received_packet_times.clear();
|
| ack_frame->received_packet_times.swap(ack_frame_.received_packet_times);
|
| }
|
|
|
| +const QuicFrame QuicReceivedPacketManager::GetUpdatedAckFrame(
|
| + QuicTime approximate_now) {
|
| + ack_frame_updated_ = false;
|
| + ack_frame_.entropy_hash = EntropyHash(ack_frame_.largest_observed);
|
| +
|
| + if (time_largest_observed_ == QuicTime::Zero()) {
|
| + // We have received no packets.
|
| + ack_frame_.ack_delay_time = QuicTime::Delta::Infinite();
|
| + } else {
|
| + // Ensure the delta is zero if approximate now is "in the past".
|
| + ack_frame_.ack_delay_time =
|
| + approximate_now < time_largest_observed_
|
| + ? QuicTime::Delta::Zero()
|
| + : approximate_now.Subtract(time_largest_observed_);
|
| + }
|
| +
|
| + // Clear all packet times if any are too far from largest observed.
|
| + // It's expected this is extremely rare.
|
| + for (PacketTimeVector::iterator it = ack_frame_.received_packet_times.begin();
|
| + it != ack_frame_.received_packet_times.end();) {
|
| + if (ack_frame_.largest_observed - it->first >=
|
| + numeric_limits<uint8_t>::max()) {
|
| + it = ack_frame_.received_packet_times.erase(it);
|
| + } else {
|
| + ++it;
|
| + }
|
| + }
|
| +
|
| + return QuicFrame(&ack_frame_);
|
| +}
|
| +
|
| QuicPacketEntropyHash QuicReceivedPacketManager::EntropyHash(
|
| QuicPacketNumber packet_number) const {
|
| return entropy_tracker_.EntropyHash(packet_number);
|
|
|