• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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