1 // Copyright 2014 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.
5 #ifndef NET_QUIC_QUIC_UNACKED_PACKET_MAP_H_
6 #define NET_QUIC_QUIC_UNACKED_PACKET_MAP_H_
10 #include "net/quic/quic_protocol.h"
14 // Class which tracks unacked packets for three purposes:
15 // 1) Track retransmittable data, including multiple transmissions of frames.
16 // 2) Track packets and bytes in flight for congestion control.
17 // 3) Track sent time of packets to provide RTT measurements from acks.
18 class NET_EXPORT_PRIVATE QuicUnackedPacketMap {
20 QuicUnackedPacketMap();
21 ~QuicUnackedPacketMap();
23 // Adds |serialized_packet| to the map. Does not mark it in flight.
24 void AddPacket(const SerializedPacket& serialized_packet);
26 // Called when a packet is retransmitted with a new sequence number.
27 // |old_sequence_number| will remain unacked, but will have no
28 // retransmittable data associated with it. |new_sequence_number| will
29 // be both unacked and associated with retransmittable data.
30 void OnRetransmittedPacket(QuicPacketSequenceNumber old_sequence_number,
31 QuicPacketSequenceNumber new_sequence_number,
32 TransmissionType transmission_type);
34 // Returns true if the packet |sequence_number| is unacked.
35 bool IsUnacked(QuicPacketSequenceNumber sequence_number) const;
37 // Sets the nack count to the max of the current nack count and |min_nacks|.
38 void NackPacket(QuicPacketSequenceNumber sequence_number,
41 // Marks |sequence_number| as no longer in flight.
42 void RemoveFromInFlight(QuicPacketSequenceNumber sequence_number);
44 // Returns true if the unacked packet |sequence_number| has retransmittable
45 // frames. This will return false if the packet has been acked, if a
46 // previous transmission of this packet was ACK'd, or if this packet has been
47 // retransmitted as with different sequence number, or if the packet never
48 // had any retransmittable packets in the first place.
49 bool HasRetransmittableFrames(QuicPacketSequenceNumber sequence_number) const;
51 // Returns true if there are any unacked packets.
52 bool HasUnackedPackets() const;
54 // Returns true if there are any unacked packets which have retransmittable
56 bool HasUnackedRetransmittableFrames() const;
58 // Returns the largest sequence number that has been sent.
59 QuicPacketSequenceNumber largest_sent_packet() const {
60 return largest_sent_packet_;
63 // Returns the largest sequence number that has been acked.
64 QuicPacketSequenceNumber largest_observed() const {
65 return largest_observed_;
68 // Returns the sum of bytes from all packets in flight.
69 QuicByteCount bytes_in_flight() const {
70 return bytes_in_flight_;
73 // Returns the smallest sequence number of a serialized packet which has not
74 // been acked by the peer. If there are no unacked packets, returns 0.
75 QuicPacketSequenceNumber GetLeastUnacked() const;
77 // Sets a packet as sent with the sent time |sent_time|. Marks the packet
78 // as in flight if |set_in_flight| is true.
79 // Packets marked as in flight are expected to be marked as missing when they
80 // don't arrive, indicating the need for retransmission.
81 void SetSent(QuicPacketSequenceNumber sequence_number,
83 QuicByteCount bytes_sent,
86 // Restores the in flight status for a packet that was previously sent.
87 void RestoreInFlight(QuicPacketSequenceNumber sequence_number);
89 // Clears all previous transmissions in order to make room in the ack frame
90 // for newly acked packets.
91 void ClearAllPreviousRetransmissions();
93 typedef std::deque<TransmissionInfo> UnackedPacketMap;
95 typedef UnackedPacketMap::const_iterator const_iterator;
97 const_iterator begin() const { return unacked_packets_.begin(); }
98 const_iterator end() const { return unacked_packets_.end(); }
100 // Returns true if there are unacked packets that are in flight.
101 bool HasInFlightPackets() const;
103 // Returns the TransmissionInfo associated with |sequence_number|, which
105 const TransmissionInfo& GetTransmissionInfo(
106 QuicPacketSequenceNumber sequence_number) const;
108 // Returns the time that the last unacked packet was sent.
109 QuicTime GetLastPacketSentTime() const;
111 // Returns the time that the first in flight packet was sent.
112 QuicTime GetFirstInFlightPacketSentTime() const;
114 // Returns the number of unacked packets.
115 size_t GetNumUnackedPacketsDebugOnly() const;
117 // Returns true if there are multiple packets in flight.
118 bool HasMultipleInFlightPackets() const;
120 // Returns true if there are any pending crypto packets.
121 bool HasPendingCryptoPackets() const;
123 // Removes any retransmittable frames from this transmission or an associated
124 // transmission. It removes now useless transmissions, and disconnects any
125 // other packets from other transmissions.
126 void RemoveRetransmittability(QuicPacketSequenceNumber sequence_number);
128 // Removes any other retransmissions and marks all transmissions unackable.
129 void RemoveAckability(TransmissionInfo* info);
131 // Increases the largest observed. Any packets less or equal to
132 // |largest_acked_packet| are discarded if they are only for the RTT purposes.
133 void IncreaseLargestObserved(QuicPacketSequenceNumber largest_observed);
135 // Remove any packets no longer needed for retransmission, congestion, or
136 // RTT measurement purposes.
137 void RemoveObsoletePackets();
140 void MaybeRemoveRetransmittableFrames(TransmissionInfo* transmission_info);
142 // Returns true if the packet no longer has a purpose in the map.
143 bool IsPacketUseless(QuicPacketSequenceNumber sequence_number,
144 const TransmissionInfo& info) const;
145 // Returns true if the packet is useless or it's only purpose is RTT
146 // measurement, and it's old enough that is unlikely to ever happen.
147 bool IsPacketRemovable(QuicPacketSequenceNumber sequence_number,
148 const TransmissionInfo& info) const;
150 QuicPacketSequenceNumber largest_sent_packet_;
151 QuicPacketSequenceNumber largest_observed_;
153 // Newly serialized retransmittable and fec packets are added to this map,
154 // which contains owning pointers to any contained frames. If a packet is
155 // retransmitted, this map will contain entries for both the old and the new
156 // packet. The old packet's retransmittable frames entry will be NULL, while
157 // the new packet's entry will contain the frames to retransmit.
158 // If the old packet is acked before the new packet, then the old entry will
159 // be removed from the map and the new entry's retransmittable frames will be
161 UnackedPacketMap unacked_packets_;
162 // The packet at the 0th index of unacked_packets_.
163 QuicPacketSequenceNumber least_unacked_;
165 size_t bytes_in_flight_;
166 // Number of retransmittable crypto handshake packets.
167 size_t pending_crypto_packet_count_;
169 DISALLOW_COPY_AND_ASSIGN(QuicUnackedPacketMap);
174 #endif // NET_QUIC_QUIC_UNACKED_PACKET_MAP_H_