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