1d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// found in the LICENSE file.
4d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#ifndef NET_QUIC_QUIC_SENT_PACKET_MANAGER_H_
6d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#define NET_QUIC_QUIC_SENT_PACKET_MANAGER_H_
7d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
8d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include <deque>
9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include <list>
10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include <map>
11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include <queue>
12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include <set>
13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include <utility>
14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include <vector>
15d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/containers/hash_tables.h"
17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "net/base/linked_hash_map.h"
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "net/quic/congestion_control/send_algorithm_interface.h"
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/quic/quic_ack_notifier_manager.h"
20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "net/quic/quic_protocol.h"
21d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)NET_EXPORT_PRIVATE extern bool FLAGS_track_retransmission_history;
23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)NET_EXPORT_PRIVATE extern bool FLAGS_limit_rto_increase_for_tests;
24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)NET_EXPORT_PRIVATE extern bool FLAGS_enable_quic_pacing;
2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
26d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace net {
27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace test {
29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class QuicConnectionPeer;
30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class QuicSentPacketManagerPeer;
31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}  // namespace test
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class QuicClock;
34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class QuicConfig;
35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Class which tracks the set of packets sent on a QUIC connection and contains
37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// a send algorithm to decide when to send new packets.  It keeps track of any
38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// retransmittable data associated with each packet. If a packet is
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// retransmitted, it will keep track of each version of a packet so that if a
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// previous transmission is acked, the data will not be retransmitted.
41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class NET_EXPORT_PRIVATE QuicSentPacketManager {
42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public:
4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Struct to store the pending retransmission information.
4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  struct PendingRetransmission {
4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    PendingRetransmission(QuicPacketSequenceNumber sequence_number,
4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                          TransmissionType transmission_type,
4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                          const RetransmittableFrames& retransmittable_frames,
4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                          QuicSequenceNumberLength sequence_number_length)
4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            : sequence_number(sequence_number),
5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)              transmission_type(transmission_type),
5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)              retransmittable_frames(retransmittable_frames),
5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)              sequence_number_length(sequence_number_length) {
5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        }
5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        QuicPacketSequenceNumber sequence_number;
5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        TransmissionType transmission_type;
5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        const RetransmittableFrames& retransmittable_frames;
5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        QuicSequenceNumberLength sequence_number_length;
5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  };
6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Interface which provides callbacks that the manager needs.
62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  class NET_EXPORT_PRIVATE HelperInterface {
63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)   public:
6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    virtual ~HelperInterface();
6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // Called to return the sequence number of the next packet to be sent.
67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    virtual QuicPacketSequenceNumber GetNextPacketSequenceNumber() = 0;
68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  };
69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  QuicSentPacketManager(bool is_server,
71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        HelperInterface* helper,
72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        const QuicClock* clock,
73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        CongestionFeedbackType congestion_type);
74d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual ~QuicSentPacketManager();
75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void SetFromConfig(const QuicConfig& config);
77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void SetMaxPacketSize(QuicByteCount max_packet_size);
79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Called when a new packet is serialized.  If the packet contains
81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // retransmittable data, it will be added to the unacked packet map.
82d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  void OnSerializedPacket(const SerializedPacket& serialized_packet);
83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
84d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Called when a packet is retransmitted with a new sequence number.
85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Replaces the old entry in the unacked packet map with the new
86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // sequence number.
87d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  void OnRetransmittedPacket(QuicPacketSequenceNumber old_sequence_number,
88d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                             QuicPacketSequenceNumber new_sequence_number);
89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Processes the incoming ack and returns true if the retransmission or ack
91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // alarm should be reset.
92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool OnIncomingAck(const ReceivedPacketInfo& received_info,
93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     QuicTime ack_receive_time);
94d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
9568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Discards any information for the packet corresponding to |sequence_number|.
9668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // If this packet has been retransmitted, information on those packets
9768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // will be discarded as well.
9868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void DiscardUnackedPacket(QuicPacketSequenceNumber sequence_number);
99d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
100d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Returns true if the non-FEC packet |sequence_number| is unacked.
101d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool IsUnacked(QuicPacketSequenceNumber sequence_number) const;
102d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Requests retransmission of all unacked packets of |retransmission_type|.
104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void RetransmitUnackedPackets(RetransmissionType retransmission_type);
105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
10668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Returns true if the unacked packet |sequence_number| has retransmittable
10768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // frames.  This will only return false if the packet has been acked, if a
10868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // previous transmission of this packet was ACK'd, or if this packet has been
10968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // retransmitted as with different sequence number.
11068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool HasRetransmittableFrames(QuicPacketSequenceNumber sequence_number) const;
11168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Returns true if there are pending retransmissions.
11368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool HasPendingRetransmissions() const;
11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Retrieves the next pending retransmission.
11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  PendingRetransmission NextPendingRetransmission();
11768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool HasUnackedPackets() const;
119d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Returns the number of unacked packets which have retransmittable frames.
121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  size_t GetNumRetransmittablePackets() const;
122d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
12368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Returns the smallest sequence number of a sent packet which has not been
12468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // acked by the peer.  Excludes any packets which have been retransmitted
12568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // with a new sequence number. If all packets have been acked, returns the
126d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // sequence number of the next packet that will be sent.
127d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  QuicPacketSequenceNumber GetLeastUnackedSentPacket() const;
128d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
12968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Returns the set of sequence numbers of all unacked packets.
130d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  // Test only.
131d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  SequenceNumberSet GetUnackedPackets() const;
132d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
13368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Returns true if |sequence_number| is a previous transmission of packet.
13468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool IsPreviousTransmission(QuicPacketSequenceNumber sequence_number) const;
13568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // TODO(ianswett): Combine the congestion control related methods below with
137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // some of the methods above and cleanup the resulting code.
138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Called when we have received an ack frame from peer.
139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Returns a set containing all the sequence numbers to be nack retransmitted
140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // as a result of the ack.
141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual SequenceNumberSet OnIncomingAckFrame(
142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const ReceivedPacketInfo& received_info,
143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const QuicTime& ack_receive_time);
144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Called when a congestion feedback frame is received from peer.
146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void OnIncomingQuicCongestionFeedbackFrame(
147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const QuicCongestionFeedbackFrame& frame,
148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const QuicTime& feedback_receive_time);
149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Called when we have sent bytes to the peer.  This informs the manager both
151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // the number of bytes sent and if they were retransmitted.
152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void OnPacketSent(QuicPacketSequenceNumber sequence_number,
153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            QuicTime sent_time,
154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            QuicByteCount bytes,
155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            TransmissionType transmission_type,
156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            HasRetransmittableData has_retransmittable_data);
157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Called when the retransmission timer expires.
159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void OnRetransmissionTimeout();
160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Called when a packet is timed out, such as an RTO.  Removes the bytes from
162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // the congestion manager, but does not change the congestion window size.
163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void OnPacketAbandoned(QuicPacketSequenceNumber sequence_number);
164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Calculate the time until we can send the next packet to the wire.
166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Note 1: When kUnknownWaitTime is returned, there is no need to poll
167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // TimeUntilSend again until we receive an OnIncomingAckFrame event.
168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Note 2: Send algorithms may or may not use |retransmit| in their
169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // calculations.
170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual QuicTime::Delta TimeUntilSend(QuicTime now,
171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                        TransmissionType transmission_type,
172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                        HasRetransmittableData retransmittable,
173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                        IsHandshake handshake);
174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Returns amount of time for delayed ack timer.
176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const QuicTime::Delta DelayedAckTime();
177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Returns the current RTO delay.
179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const QuicTime::Delta GetRetransmissionDelay() const;
180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Returns the estimated smoothed RTT calculated by the congestion algorithm.
182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const QuicTime::Delta SmoothedRtt() const;
183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Returns the estimated bandwidth calculated by the congestion algorithm.
185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  QuicBandwidth BandwidthEstimate() const;
186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Returns the size of the current congestion window in bytes.  Note, this is
188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // not the *available* window.  Some send algorithms may not use a congestion
189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // window and will return 0.
190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  QuicByteCount GetCongestionWindow() const;
191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Enables pacing if it has not already been enabled, and if
193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // FLAGS_enable_quic_pacing is set.
194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void MaybeEnablePacing();
195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool using_pacing() const { return using_pacing_; }
197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
199d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private:
200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  friend class test::QuicConnectionPeer;
201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  friend class test::QuicSentPacketManagerPeer;
202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  struct TransmissionInfo {
204d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)    TransmissionInfo()
205d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)        : retransmittable_frames(NULL),
206d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)          sequence_number_length(PACKET_1BYTE_SEQUENCE_NUMBER),
207d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)          sent_time(QuicTime::Zero()),
208d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)          previous_transmissions(NULL) { }
209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    TransmissionInfo(RetransmittableFrames* retransmittable_frames,
210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                     QuicSequenceNumberLength sequence_number_length)
211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        : retransmittable_frames(retransmittable_frames),
212d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)          sequence_number_length(sequence_number_length),
213d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)          sent_time(QuicTime::Zero()),
214d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)          previous_transmissions(NULL) {
215d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
216d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    RetransmittableFrames* retransmittable_frames;
218d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    QuicSequenceNumberLength sequence_number_length;
219d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)    // Zero when the packet is serialized, non-zero once it's sent.
220d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)    QuicTime sent_time;
221d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)    // Stores all previous transmissions if the packet has been retransmitted,
222d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)    // and is NULL otherwise.
223d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)    SequenceNumberSet* previous_transmissions;
224d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  };
225d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
226d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  typedef linked_hash_map<QuicPacketSequenceNumber,
227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                          TransmissionInfo> UnackedPacketMap;
22868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  typedef linked_hash_map<QuicPacketSequenceNumber,
22968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                          TransmissionType> PendingRetransmissionMap;
23068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  typedef base::hash_map<QuicPacketSequenceNumber, SequenceNumberSet*>
23168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                         PreviousTransmissionMap;
23268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
23368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Process the incoming ack looking for newly ack'd data packets.
234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void HandleAckForSentPackets(const ReceivedPacketInfo& received_info);
23568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Update the RTT if the ack is for the largest acked sequence number.
237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void MaybeUpdateRTT(const ReceivedPacketInfo& received_info,
238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                      const QuicTime& ack_receive_time);
239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
24068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Marks |sequence_number| as having been seen by the peer.  Returns an
24168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // iterator to the next remaining unacked packet.
24268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  UnackedPacketMap::iterator MarkPacketReceivedByPeer(
24368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      QuicPacketSequenceNumber sequence_number);
24468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
24568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Simply removes the entries, if any, from the unacked packet map
24668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // and the retransmission map.
24768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void DiscardPacket(QuicPacketSequenceNumber sequence_number);
24868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Request that |sequence_number| be retransmitted after the other pending
250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // retransmissions.  Returns false if there are no retransmittable frames for
251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // |sequence_number| and true if it will be retransmitted.
252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool MarkForRetransmission(QuicPacketSequenceNumber sequence_number,
253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             TransmissionType transmission_type);
254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
25568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Returns the length of the serialized sequence number for
25668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // the packet |sequence_number|.
25768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  QuicSequenceNumberLength GetSequenceNumberLength(
25868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      QuicPacketSequenceNumber sequence_number) const;
25968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
260a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Clears up to |num_to_clear| previous transmissions in order to make room
261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // in the ack frame for new acks.
262a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void ClearPreviousRetransmissions(size_t num_to_clear);
263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void CleanupPacketHistory();
265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
266d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  // Newly serialized retransmittable and fec packets are added to this map,
267d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  // which contains owning pointers to any contained frames.  If a packet is
268d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  // retransmitted, this map will contain entries for both the old and the new
269d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  // packet. The old packet's retransmittable frames entry will be NULL, while
270d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  // the new packet's entry will contain the frames to retransmit.
27168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // If the old packet is acked before the new packet, then the old entry will
27268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // be removed from the map and the new entry's retransmittable frames will be
27368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // set to NULL.
274d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  UnackedPacketMap unacked_packets_;
275d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
27668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Pending retransmissions which have not been packetized and sent yet.
27768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  PendingRetransmissionMap pending_retransmissions_;
278d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
279d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Tracks if the connection was created by the server.
280d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool is_server_;
28168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
282d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  HelperInterface* helper_;
283d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // An AckNotifier can register to be informed when ACKs have been received for
2854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // all packets that a given block of data was sent in. The AckNotifierManager
2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // maintains the currently active notifiers.
2874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AckNotifierManager ack_notifier_manager_;
2884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
289a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const QuicClock* clock_;
290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_ptr<SendAlgorithmInterface> send_algorithm_;
291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Tracks the send time, size, and nack count of sent packets.  Packets are
292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // removed after 5 seconds and they've been removed from pending_packets_.
293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SendAlgorithmInterface::SentPacketsMap packet_history_map_;
294a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Packets that are outstanding and have not been abandoned or lost.
295a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SequenceNumberSet pending_packets_;
296a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  QuicTime::Delta rtt_sample_;  // RTT estimate from the most recent ACK.
297a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Number of times the RTO timer has fired in a row without receiving an ack.
298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  size_t consecutive_rto_count_;
299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool using_pacing_;
300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
301d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuicSentPacketManager);
302d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)};
303d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
304d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}  // namespace net
305d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
306d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif  // NET_QUIC_QUIC_SENT_PACKET_MANAGER_H_
307