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. 4 5 #ifndef NET_QUIC_QUIC_UNACKED_PACKET_MAP_H_ 6 #define NET_QUIC_QUIC_UNACKED_PACKET_MAP_H_ 7 8 #include <deque> 9 10 #include "net/quic/quic_protocol.h" 11 12 namespace net { 13 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 { 19 public: 20 QuicUnackedPacketMap(); 21 ~QuicUnackedPacketMap(); 22 23 // Adds |serialized_packet| to the map. Does not mark it in flight. 24 void AddPacket(const SerializedPacket& serialized_packet); 25 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); 33 34 // Returns true if the packet |sequence_number| is unacked. 35 bool IsUnacked(QuicPacketSequenceNumber sequence_number) const; 36 37 // Sets the nack count to the max of the current nack count and |min_nacks|. 38 void NackPacket(QuicPacketSequenceNumber sequence_number, 39 size_t min_nacks); 40 41 // Marks |sequence_number| as no longer in flight. 42 void RemoveFromInFlight(QuicPacketSequenceNumber sequence_number); 43 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; 50 51 // Returns true if there are any unacked packets. 52 bool HasUnackedPackets() const; 53 54 // Returns true if there are any unacked packets which have retransmittable 55 // frames. 56 bool HasUnackedRetransmittableFrames() const; 57 58 // Returns the largest sequence number that has been sent. largest_sent_packet()59 QuicPacketSequenceNumber largest_sent_packet() const { 60 return largest_sent_packet_; 61 } 62 63 // Returns the largest sequence number that has been acked. largest_observed()64 QuicPacketSequenceNumber largest_observed() const { 65 return largest_observed_; 66 } 67 68 // Returns the sum of bytes from all packets in flight. bytes_in_flight()69 QuicByteCount bytes_in_flight() const { 70 return bytes_in_flight_; 71 } 72 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; 76 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, 82 QuicTime sent_time, 83 QuicByteCount bytes_sent, 84 bool set_in_flight); 85 86 // Restores the in flight status for a packet that was previously sent. 87 void RestoreInFlight(QuicPacketSequenceNumber sequence_number); 88 89 // Clears all previous transmissions in order to make room in the ack frame 90 // for newly acked packets. 91 void ClearAllPreviousRetransmissions(); 92 93 typedef std::deque<TransmissionInfo> UnackedPacketMap; 94 95 typedef UnackedPacketMap::const_iterator const_iterator; 96 begin()97 const_iterator begin() const { return unacked_packets_.begin(); } end()98 const_iterator end() const { return unacked_packets_.end(); } 99 100 // Returns true if there are unacked packets that are in flight. 101 bool HasInFlightPackets() const; 102 103 // Returns the TransmissionInfo associated with |sequence_number|, which 104 // must be unacked. 105 const TransmissionInfo& GetTransmissionInfo( 106 QuicPacketSequenceNumber sequence_number) const; 107 108 // Returns the time that the last unacked packet was sent. 109 QuicTime GetLastPacketSentTime() const; 110 111 // Returns the time that the first in flight packet was sent. 112 QuicTime GetFirstInFlightPacketSentTime() const; 113 114 // Returns the number of unacked packets. 115 size_t GetNumUnackedPacketsDebugOnly() const; 116 117 // Returns true if there are multiple packets in flight. 118 bool HasMultipleInFlightPackets() const; 119 120 // Returns true if there are any pending crypto packets. 121 bool HasPendingCryptoPackets() const; 122 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); 127 128 // Removes any other retransmissions and marks all transmissions unackable. 129 void RemoveAckability(TransmissionInfo* info); 130 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); 134 135 // Remove any packets no longer needed for retransmission, congestion, or 136 // RTT measurement purposes. 137 void RemoveObsoletePackets(); 138 139 private: 140 void MaybeRemoveRetransmittableFrames(TransmissionInfo* transmission_info); 141 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; 149 150 QuicPacketSequenceNumber largest_sent_packet_; 151 QuicPacketSequenceNumber largest_observed_; 152 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 160 // set to NULL. 161 UnackedPacketMap unacked_packets_; 162 // The packet at the 0th index of unacked_packets_. 163 QuicPacketSequenceNumber least_unacked_; 164 165 size_t bytes_in_flight_; 166 // Number of retransmittable crypto handshake packets. 167 size_t pending_crypto_packet_count_; 168 169 DISALLOW_COPY_AND_ASSIGN(QuicUnackedPacketMap); 170 }; 171 172 } // namespace net 173 174 #endif // NET_QUIC_QUIC_UNACKED_PACKET_MAP_H_ 175