Index: net/quic/core/frames/quic_ack_frame.cc |
diff --git a/net/quic/core/frames/quic_ack_frame.cc b/net/quic/core/frames/quic_ack_frame.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..bf0cc633c58ce78eee04997df7535e131b1c41e0 |
--- /dev/null |
+++ b/net/quic/core/frames/quic_ack_frame.cc |
@@ -0,0 +1,163 @@ |
+// Copyright (c) 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "net/quic/core/frames/quic_ack_frame.h" |
+ |
+#include "net/quic/core/quic_constants.h" |
+ |
+using std::ostream; |
+ |
+namespace net { |
+ |
+bool IsAwaitingPacket(const QuicAckFrame& ack_frame, |
+ QuicPacketNumber packet_number, |
+ QuicPacketNumber peer_least_packet_awaiting_ack) { |
+ return packet_number >= peer_least_packet_awaiting_ack && |
+ !ack_frame.packets.Contains(packet_number); |
+} |
+ |
+QuicAckFrame::QuicAckFrame() |
+ : largest_observed(0), |
+ ack_delay_time(QuicTime::Delta::Infinite()), |
+ path_id(kDefaultPathId) {} |
+ |
+QuicAckFrame::QuicAckFrame(const QuicAckFrame& other) = default; |
+ |
+QuicAckFrame::~QuicAckFrame() {} |
+ |
+ostream& operator<<(std::ostream& os, const QuicAckFrame& ack_frame) { |
+ os << "{ largest_observed: " << ack_frame.largest_observed |
+ << ", ack_delay_time: " << ack_frame.ack_delay_time.ToMicroseconds() |
+ << ", packets: [ " << ack_frame.packets << " ]" |
+ << ", received_packets: [ "; |
+ for (const std::pair<QuicPacketNumber, QuicTime>& p : |
+ ack_frame.received_packet_times) { |
+ os << p.first << " at " << p.second.ToDebuggingValue() << " "; |
+ } |
+ os << " ] }\n"; |
+ return os; |
+} |
+ |
+PacketNumberQueue::PacketNumberQueue() = default; |
+PacketNumberQueue::PacketNumberQueue(const PacketNumberQueue& other) = default; |
+PacketNumberQueue::PacketNumberQueue(PacketNumberQueue&& other) = default; |
+PacketNumberQueue::~PacketNumberQueue() {} |
+ |
+PacketNumberQueue& PacketNumberQueue::operator=( |
+ const PacketNumberQueue& other) = default; |
+PacketNumberQueue& PacketNumberQueue::operator=(PacketNumberQueue&& other) = |
+ default; |
+ |
+void PacketNumberQueue::Add(QuicPacketNumber packet_number) { |
+ packet_number_intervals_.Add(packet_number, packet_number + 1); |
+} |
+ |
+void PacketNumberQueue::Add(QuicPacketNumber lower, QuicPacketNumber higher) { |
+ packet_number_intervals_.Add(lower, higher); |
+} |
+ |
+void PacketNumberQueue::Remove(QuicPacketNumber packet_number) { |
+ packet_number_intervals_.Difference(packet_number, packet_number + 1); |
+} |
+ |
+void PacketNumberQueue::Remove(QuicPacketNumber lower, |
+ QuicPacketNumber higher) { |
+ packet_number_intervals_.Difference(lower, higher); |
+} |
+ |
+bool PacketNumberQueue::RemoveUpTo(QuicPacketNumber higher) { |
+ if (Empty()) { |
+ return false; |
+ } |
+ const QuicPacketNumber old_min = Min(); |
+ packet_number_intervals_.Difference(0, higher); |
+ return Empty() || old_min != Min(); |
+} |
+ |
+void PacketNumberQueue::Complement() { |
+ if (Empty()) { |
+ return; |
+ } |
+ packet_number_intervals_.Complement(Min(), Max() + 1); |
+} |
+ |
+bool PacketNumberQueue::Contains(QuicPacketNumber packet_number) const { |
+ return packet_number_intervals_.Contains(packet_number); |
+} |
+ |
+bool PacketNumberQueue::Empty() const { |
+ return packet_number_intervals_.Empty(); |
+} |
+ |
+QuicPacketNumber PacketNumberQueue::Min() const { |
+ DCHECK(!Empty()); |
+ return packet_number_intervals_.begin()->min(); |
+} |
+ |
+QuicPacketNumber PacketNumberQueue::Max() const { |
+ DCHECK(!Empty()); |
+ return packet_number_intervals_.rbegin()->max() - 1; |
+} |
+ |
+size_t PacketNumberQueue::NumPacketsSlow() const { |
+ size_t num_packets = 0; |
+ for (const auto& interval : packet_number_intervals_) { |
+ num_packets += interval.Length(); |
+ } |
+ return num_packets; |
+} |
+ |
+size_t PacketNumberQueue::NumIntervals() const { |
+ return packet_number_intervals_.Size(); |
+} |
+ |
+QuicPacketNumber PacketNumberQueue::LastIntervalLength() const { |
+ DCHECK(!Empty()); |
+ return packet_number_intervals_.rbegin()->Length(); |
+} |
+ |
+PacketNumberQueue::const_iterator PacketNumberQueue::lower_bound( |
+ QuicPacketNumber packet_number) const { |
+ // lower_bound returns the first interval that contains |packet_number| or the |
+ // first interval after |packet_number|. |
+ auto itr = packet_number_intervals_.Find(packet_number); |
+ if (itr != packet_number_intervals_.end()) { |
+ return itr; |
+ } |
+ for (itr = packet_number_intervals_.begin(); |
+ itr != packet_number_intervals_.end(); ++itr) { |
+ if (packet_number < itr->min()) { |
+ return itr; |
+ } |
+ } |
+ return packet_number_intervals_.end(); |
+} |
+ |
+PacketNumberQueue::const_iterator PacketNumberQueue::begin() const { |
+ return packet_number_intervals_.begin(); |
+} |
+ |
+PacketNumberQueue::const_iterator PacketNumberQueue::end() const { |
+ return packet_number_intervals_.end(); |
+} |
+ |
+PacketNumberQueue::const_reverse_iterator PacketNumberQueue::rbegin() const { |
+ return packet_number_intervals_.rbegin(); |
+} |
+ |
+PacketNumberQueue::const_reverse_iterator PacketNumberQueue::rend() const { |
+ return packet_number_intervals_.rend(); |
+} |
+ |
+ostream& operator<<(ostream& os, const PacketNumberQueue& q) { |
+ for (const Interval<QuicPacketNumber>& interval : q) { |
+ for (QuicPacketNumber packet_number = interval.min(); |
+ packet_number < interval.max(); ++packet_number) { |
+ os << packet_number << " "; |
+ } |
+ } |
+ return os; |
+} |
+ |
+} // namespace net |