OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "net/quic/core/frames/quic_ack_frame.h" |
| 6 |
| 7 #include "net/quic/core/quic_constants.h" |
| 8 |
| 9 using std::ostream; |
| 10 |
| 11 namespace net { |
| 12 |
| 13 bool IsAwaitingPacket(const QuicAckFrame& ack_frame, |
| 14 QuicPacketNumber packet_number, |
| 15 QuicPacketNumber peer_least_packet_awaiting_ack) { |
| 16 return packet_number >= peer_least_packet_awaiting_ack && |
| 17 !ack_frame.packets.Contains(packet_number); |
| 18 } |
| 19 |
| 20 QuicAckFrame::QuicAckFrame() |
| 21 : largest_observed(0), |
| 22 ack_delay_time(QuicTime::Delta::Infinite()), |
| 23 path_id(kDefaultPathId) {} |
| 24 |
| 25 QuicAckFrame::QuicAckFrame(const QuicAckFrame& other) = default; |
| 26 |
| 27 QuicAckFrame::~QuicAckFrame() {} |
| 28 |
| 29 ostream& operator<<(std::ostream& os, const QuicAckFrame& ack_frame) { |
| 30 os << "{ largest_observed: " << ack_frame.largest_observed |
| 31 << ", ack_delay_time: " << ack_frame.ack_delay_time.ToMicroseconds() |
| 32 << ", packets: [ " << ack_frame.packets << " ]" |
| 33 << ", received_packets: [ "; |
| 34 for (const std::pair<QuicPacketNumber, QuicTime>& p : |
| 35 ack_frame.received_packet_times) { |
| 36 os << p.first << " at " << p.second.ToDebuggingValue() << " "; |
| 37 } |
| 38 os << " ] }\n"; |
| 39 return os; |
| 40 } |
| 41 |
| 42 PacketNumberQueue::PacketNumberQueue() = default; |
| 43 PacketNumberQueue::PacketNumberQueue(const PacketNumberQueue& other) = default; |
| 44 PacketNumberQueue::PacketNumberQueue(PacketNumberQueue&& other) = default; |
| 45 PacketNumberQueue::~PacketNumberQueue() {} |
| 46 |
| 47 PacketNumberQueue& PacketNumberQueue::operator=( |
| 48 const PacketNumberQueue& other) = default; |
| 49 PacketNumberQueue& PacketNumberQueue::operator=(PacketNumberQueue&& other) = |
| 50 default; |
| 51 |
| 52 void PacketNumberQueue::Add(QuicPacketNumber packet_number) { |
| 53 packet_number_intervals_.Add(packet_number, packet_number + 1); |
| 54 } |
| 55 |
| 56 void PacketNumberQueue::Add(QuicPacketNumber lower, QuicPacketNumber higher) { |
| 57 packet_number_intervals_.Add(lower, higher); |
| 58 } |
| 59 |
| 60 void PacketNumberQueue::Remove(QuicPacketNumber packet_number) { |
| 61 packet_number_intervals_.Difference(packet_number, packet_number + 1); |
| 62 } |
| 63 |
| 64 void PacketNumberQueue::Remove(QuicPacketNumber lower, |
| 65 QuicPacketNumber higher) { |
| 66 packet_number_intervals_.Difference(lower, higher); |
| 67 } |
| 68 |
| 69 bool PacketNumberQueue::RemoveUpTo(QuicPacketNumber higher) { |
| 70 if (Empty()) { |
| 71 return false; |
| 72 } |
| 73 const QuicPacketNumber old_min = Min(); |
| 74 packet_number_intervals_.Difference(0, higher); |
| 75 return Empty() || old_min != Min(); |
| 76 } |
| 77 |
| 78 void PacketNumberQueue::Complement() { |
| 79 if (Empty()) { |
| 80 return; |
| 81 } |
| 82 packet_number_intervals_.Complement(Min(), Max() + 1); |
| 83 } |
| 84 |
| 85 bool PacketNumberQueue::Contains(QuicPacketNumber packet_number) const { |
| 86 return packet_number_intervals_.Contains(packet_number); |
| 87 } |
| 88 |
| 89 bool PacketNumberQueue::Empty() const { |
| 90 return packet_number_intervals_.Empty(); |
| 91 } |
| 92 |
| 93 QuicPacketNumber PacketNumberQueue::Min() const { |
| 94 DCHECK(!Empty()); |
| 95 return packet_number_intervals_.begin()->min(); |
| 96 } |
| 97 |
| 98 QuicPacketNumber PacketNumberQueue::Max() const { |
| 99 DCHECK(!Empty()); |
| 100 return packet_number_intervals_.rbegin()->max() - 1; |
| 101 } |
| 102 |
| 103 size_t PacketNumberQueue::NumPacketsSlow() const { |
| 104 size_t num_packets = 0; |
| 105 for (const auto& interval : packet_number_intervals_) { |
| 106 num_packets += interval.Length(); |
| 107 } |
| 108 return num_packets; |
| 109 } |
| 110 |
| 111 size_t PacketNumberQueue::NumIntervals() const { |
| 112 return packet_number_intervals_.Size(); |
| 113 } |
| 114 |
| 115 QuicPacketNumber PacketNumberQueue::LastIntervalLength() const { |
| 116 DCHECK(!Empty()); |
| 117 return packet_number_intervals_.rbegin()->Length(); |
| 118 } |
| 119 |
| 120 PacketNumberQueue::const_iterator PacketNumberQueue::lower_bound( |
| 121 QuicPacketNumber packet_number) const { |
| 122 // lower_bound returns the first interval that contains |packet_number| or the |
| 123 // first interval after |packet_number|. |
| 124 auto itr = packet_number_intervals_.Find(packet_number); |
| 125 if (itr != packet_number_intervals_.end()) { |
| 126 return itr; |
| 127 } |
| 128 for (itr = packet_number_intervals_.begin(); |
| 129 itr != packet_number_intervals_.end(); ++itr) { |
| 130 if (packet_number < itr->min()) { |
| 131 return itr; |
| 132 } |
| 133 } |
| 134 return packet_number_intervals_.end(); |
| 135 } |
| 136 |
| 137 PacketNumberQueue::const_iterator PacketNumberQueue::begin() const { |
| 138 return packet_number_intervals_.begin(); |
| 139 } |
| 140 |
| 141 PacketNumberQueue::const_iterator PacketNumberQueue::end() const { |
| 142 return packet_number_intervals_.end(); |
| 143 } |
| 144 |
| 145 PacketNumberQueue::const_reverse_iterator PacketNumberQueue::rbegin() const { |
| 146 return packet_number_intervals_.rbegin(); |
| 147 } |
| 148 |
| 149 PacketNumberQueue::const_reverse_iterator PacketNumberQueue::rend() const { |
| 150 return packet_number_intervals_.rend(); |
| 151 } |
| 152 |
| 153 ostream& operator<<(ostream& os, const PacketNumberQueue& q) { |
| 154 for (const Interval<QuicPacketNumber>& interval : q) { |
| 155 for (QuicPacketNumber packet_number = interval.min(); |
| 156 packet_number < interval.max(); ++packet_number) { |
| 157 os << packet_number << " "; |
| 158 } |
| 159 } |
| 160 return os; |
| 161 } |
| 162 |
| 163 } // namespace net |
OLD | NEW |