rAc - revert invalid suggestions to edit mode
[chromium-blink-merge.git] / net / quic / quic_sent_packet_manager.h
blob4690f21deece01399eacc9a7c9c05528ca21722f
1 // Copyright 2013 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_SENT_PACKET_MANAGER_H_
6 #define NET_QUIC_QUIC_SENT_PACKET_MANAGER_H_
8 #include <deque>
9 #include <list>
10 #include <map>
11 #include <queue>
12 #include <set>
13 #include <utility>
14 #include <vector>
16 #include "base/containers/hash_tables.h"
17 #include "base/memory/scoped_ptr.h"
18 #include "net/base/linked_hash_map.h"
19 #include "net/quic/congestion_control/loss_detection_interface.h"
20 #include "net/quic/congestion_control/send_algorithm_interface.h"
21 #include "net/quic/quic_ack_notifier_manager.h"
22 #include "net/quic/quic_protocol.h"
23 #include "net/quic/quic_unacked_packet_map.h"
25 NET_EXPORT_PRIVATE extern bool FLAGS_track_retransmission_history;
26 NET_EXPORT_PRIVATE extern bool FLAGS_enable_quic_pacing;
28 namespace net {
30 namespace test {
31 class QuicConnectionPeer;
32 class QuicSentPacketManagerPeer;
33 } // namespace test
35 class QuicClock;
36 class QuicConfig;
37 struct QuicConnectionStats;
39 // Class which tracks the set of packets sent on a QUIC connection and contains
40 // a send algorithm to decide when to send new packets. It keeps track of any
41 // retransmittable data associated with each packet. If a packet is
42 // retransmitted, it will keep track of each version of a packet so that if a
43 // previous transmission is acked, the data will not be retransmitted.
44 class NET_EXPORT_PRIVATE QuicSentPacketManager {
45 public:
46 // Struct to store the pending retransmission information.
47 struct PendingRetransmission {
48 PendingRetransmission(QuicPacketSequenceNumber sequence_number,
49 TransmissionType transmission_type,
50 const RetransmittableFrames& retransmittable_frames,
51 QuicSequenceNumberLength sequence_number_length)
52 : sequence_number(sequence_number),
53 transmission_type(transmission_type),
54 retransmittable_frames(retransmittable_frames),
55 sequence_number_length(sequence_number_length) {
58 QuicPacketSequenceNumber sequence_number;
59 TransmissionType transmission_type;
60 const RetransmittableFrames& retransmittable_frames;
61 QuicSequenceNumberLength sequence_number_length;
64 QuicSentPacketManager(bool is_server,
65 const QuicClock* clock,
66 QuicConnectionStats* stats,
67 CongestionFeedbackType congestion_type);
68 virtual ~QuicSentPacketManager();
70 virtual void SetFromConfig(const QuicConfig& config);
72 // Called when a new packet is serialized. If the packet contains
73 // retransmittable data, it will be added to the unacked packet map.
74 void OnSerializedPacket(const SerializedPacket& serialized_packet);
76 // Called when a packet is retransmitted with a new sequence number.
77 // Replaces the old entry in the unacked packet map with the new
78 // sequence number.
79 void OnRetransmittedPacket(QuicPacketSequenceNumber old_sequence_number,
80 QuicPacketSequenceNumber new_sequence_number);
82 // Processes the incoming ack and returns true if the retransmission or ack
83 // alarm should be reset.
84 bool OnIncomingAck(const ReceivedPacketInfo& received_info,
85 QuicTime ack_receive_time);
87 // Discards any information for the packet corresponding to |sequence_number|.
88 // If this packet has been retransmitted, information on those packets
89 // will be discarded as well. Also discards it from the congestion window if
90 // it is present.
91 void DiscardUnackedPacket(QuicPacketSequenceNumber sequence_number);
93 // Returns true if the non-FEC packet |sequence_number| is unacked.
94 bool IsUnacked(QuicPacketSequenceNumber sequence_number) const;
96 // Requests retransmission of all unacked packets of |retransmission_type|.
97 void RetransmitUnackedPackets(RetransmissionType retransmission_type);
99 // Returns true if the unacked packet |sequence_number| has retransmittable
100 // frames. This will only return false if the packet has been acked, if a
101 // previous transmission of this packet was ACK'd, or if this packet has been
102 // retransmitted as with different sequence number.
103 bool HasRetransmittableFrames(QuicPacketSequenceNumber sequence_number) const;
105 // Returns true if there are pending retransmissions.
106 bool HasPendingRetransmissions() const;
108 // Retrieves the next pending retransmission.
109 PendingRetransmission NextPendingRetransmission();
111 bool HasUnackedPackets() const;
113 // Returns the smallest sequence number of a serialized packet which has not
114 // been acked by the peer. If there are no unacked packets, returns 0.
115 QuicPacketSequenceNumber GetLeastUnackedSentPacket() const;
117 // Called when a congestion feedback frame is received from peer.
118 virtual void OnIncomingQuicCongestionFeedbackFrame(
119 const QuicCongestionFeedbackFrame& frame,
120 const QuicTime& feedback_receive_time);
122 // Called when we have sent bytes to the peer. This informs the manager both
123 // the number of bytes sent and if they were retransmitted. Returns true if
124 // the sender should reset the retransmission timer.
125 virtual bool OnPacketSent(QuicPacketSequenceNumber sequence_number,
126 QuicTime sent_time,
127 QuicByteCount bytes,
128 TransmissionType transmission_type,
129 HasRetransmittableData has_retransmittable_data);
131 // Called when the retransmission timer expires.
132 virtual void OnRetransmissionTimeout();
134 // Calculate the time until we can send the next packet to the wire.
135 // Note 1: When kUnknownWaitTime is returned, there is no need to poll
136 // TimeUntilSend again until we receive an OnIncomingAckFrame event.
137 // Note 2: Send algorithms may or may not use |retransmit| in their
138 // calculations.
139 virtual QuicTime::Delta TimeUntilSend(QuicTime now,
140 TransmissionType transmission_type,
141 HasRetransmittableData retransmittable,
142 IsHandshake handshake);
144 // Returns amount of time for delayed ack timer.
145 const QuicTime::Delta DelayedAckTime() const;
147 // Returns the current delay for the retransmission timer, which may send
148 // either a tail loss probe or do a full RTO. Returns QuicTime::Zero() if
149 // there are no retransmittable packets.
150 const QuicTime GetRetransmissionTime() const;
152 // Returns the estimated smoothed RTT calculated by the congestion algorithm.
153 const QuicTime::Delta SmoothedRtt() const;
155 // Returns the estimated bandwidth calculated by the congestion algorithm.
156 QuicBandwidth BandwidthEstimate() const;
158 // Returns the size of the current congestion window in bytes. Note, this is
159 // not the *available* window. Some send algorithms may not use a congestion
160 // window and will return 0.
161 QuicByteCount GetCongestionWindow() const;
163 // Enables pacing if it has not already been enabled, and if
164 // FLAGS_enable_quic_pacing is set.
165 void MaybeEnablePacing();
167 bool using_pacing() const { return using_pacing_; }
169 private:
170 friend class test::QuicConnectionPeer;
171 friend class test::QuicSentPacketManagerPeer;
173 enum ReceivedByPeer {
174 RECEIVED_BY_PEER,
175 NOT_RECEIVED_BY_PEER,
178 enum RetransmissionTimeoutMode {
179 RTO_MODE,
180 TLP_MODE,
181 HANDSHAKE_MODE,
184 typedef linked_hash_map<QuicPacketSequenceNumber,
185 TransmissionType> PendingRetransmissionMap;
187 // Process the incoming ack looking for newly ack'd data packets.
188 void HandleAckForSentPackets(const ReceivedPacketInfo& received_info);
190 // Called when a packet is timed out, such as an RTO. Removes the bytes from
191 // the congestion manager, but does not change the congestion window size.
192 void OnPacketAbandoned(QuicPacketSequenceNumber sequence_number);
194 // Returns the current retransmission mode.
195 RetransmissionTimeoutMode GetRetransmissionMode() const;
197 // Retransmits all crypto stream packets.
198 void RetransmitCryptoPackets();
200 // Retransmits the oldest pending packet.
201 void RetransmitOldestPacket();
203 // Retransmits all the packets and abandons by invoking a full RTO.
204 void RetransmitAllPackets();
206 // Returns the timer for retransmitting crypto handshake packets.
207 const QuicTime::Delta GetCryptoRetransmissionDelay() const;
209 // Returns the timer for a new tail loss probe.
210 const QuicTime::Delta GetTailLossProbeDelay() const;
212 // Returns the retransmission timeout, after which a full RTO occurs.
213 const QuicTime::Delta GetRetransmissionDelay() const;
215 // Update the RTT if the ack is for the largest acked sequence number.
216 void MaybeUpdateRTT(const ReceivedPacketInfo& received_info,
217 const QuicTime& ack_receive_time);
219 // Chooses whether to nack retransmit any packets based on the receipt info.
220 // All acks have been handled before this method is invoked.
221 void MaybeRetransmitOnAckFrame(const ReceivedPacketInfo& received_info,
222 const QuicTime& ack_receive_time);
224 // Invokes the loss detection algorithm and loses and retransmits packets if
225 // necessary.
226 void InvokeLossDetection(QuicTime time);
228 // Marks |sequence_number| as being fully handled, either due to receipt
229 // by the peer, or having been discarded as indecipherable. Returns an
230 // iterator to the next remaining unacked packet.
231 QuicUnackedPacketMap::const_iterator MarkPacketHandled(
232 QuicPacketSequenceNumber sequence_number,
233 ReceivedByPeer received_by_peer);
235 // Request that |sequence_number| be retransmitted after the other pending
236 // retransmissions. Does not add it to the retransmissions if it's already
237 // a pending retransmission.
238 void MarkForRetransmission(QuicPacketSequenceNumber sequence_number,
239 TransmissionType transmission_type);
241 // Newly serialized retransmittable and fec packets are added to this map,
242 // which contains owning pointers to any contained frames. If a packet is
243 // retransmitted, this map will contain entries for both the old and the new
244 // packet. The old packet's retransmittable frames entry will be NULL, while
245 // the new packet's entry will contain the frames to retransmit.
246 // If the old packet is acked before the new packet, then the old entry will
247 // be removed from the map and the new entry's retransmittable frames will be
248 // set to NULL.
249 QuicUnackedPacketMap unacked_packets_;
251 // Pending retransmissions which have not been packetized and sent yet.
252 PendingRetransmissionMap pending_retransmissions_;
254 // Tracks if the connection was created by the server.
255 bool is_server_;
257 // An AckNotifier can register to be informed when ACKs have been received for
258 // all packets that a given block of data was sent in. The AckNotifierManager
259 // maintains the currently active notifiers.
260 AckNotifierManager ack_notifier_manager_;
262 const QuicClock* clock_;
263 QuicConnectionStats* stats_;
264 scoped_ptr<SendAlgorithmInterface> send_algorithm_;
265 scoped_ptr<LossDetectionInterface> loss_algorithm_;
266 QuicTime::Delta rtt_sample_; // RTT estimate from the most recent ACK.
267 QuicPacketSequenceNumber largest_observed_; // From the most recent ACK.
268 // Number of outstanding crypto handshake packets.
269 size_t pending_crypto_packet_count_;
270 // Number of times the RTO timer has fired in a row without receiving an ack.
271 size_t consecutive_rto_count_;
272 // Number of times the tail loss probe has been sent.
273 size_t consecutive_tlp_count_;
274 // Number of times the crypto handshake has been retransmitted.
275 size_t consecutive_crypto_retransmission_count_;
276 // Maximum number of tail loss probes to send before firing an RTO.
277 size_t max_tail_loss_probes_;
278 bool using_pacing_;
280 DISALLOW_COPY_AND_ASSIGN(QuicSentPacketManager);
283 } // namespace net
285 #endif // NET_QUIC_QUIC_SENT_PACKET_MANAGER_H_