blob: c366ed6bc040414d71b03f2d39c5ce9172d11ee2 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef NET_QUIC_QUIC_SENT_PACKET_MANAGER_INTERFACE_H_
#define NET_QUIC_QUIC_SENT_PACKET_MANAGER_INTERFACE_H_
#include "base/macros.h"
#include "net/quic/core/quic_protocol.h"
#include "net/quic/core/quic_sustained_bandwidth_recorder.h"
namespace net {
class QuicConfig;
class RttStats;
class NET_EXPORT_PRIVATE QuicSentPacketManagerInterface {
public:
// Interface which gets callbacks from the QuicSentPacketManager at
// interesting points. Implementations must not mutate the state of
// the packet manager or connection as a result of these callbacks.
class NET_EXPORT_PRIVATE DebugDelegate {
public:
virtual ~DebugDelegate() {}
// Called when a spurious retransmission is detected.
virtual void OnSpuriousPacketRetransmission(
TransmissionType transmission_type,
QuicByteCount byte_size) {}
virtual void OnIncomingAck(const QuicAckFrame& ack_frame,
QuicTime ack_receive_time,
QuicPacketNumber largest_observed,
bool rtt_updated,
QuicPacketNumber least_unacked_sent_packet) {}
virtual void OnPacketLoss(QuicPacketNumber lost_packet_number,
TransmissionType transmission_type,
QuicTime detection_time) {}
};
// Interface which gets callbacks from the QuicSentPacketManager when
// network-related state changes. Implementations must not mutate the
// state of the packet manager as a result of these callbacks.
class NET_EXPORT_PRIVATE NetworkChangeVisitor {
public:
virtual ~NetworkChangeVisitor() {}
// Called when congestion window or RTT may have changed.
virtual void OnCongestionChange() = 0;
// Called with the path may be degrading. Note that the path may only be
// temporarily degrading.
// TODO(jri): With multipath, this method should probably have a path_id
// parameter, and should maybe result in the path being marked as inactive.
virtual void OnPathDegrading() = 0;
// Called when the Path MTU may have increased.
virtual void OnPathMtuIncreased(QuicPacketLength packet_size) = 0;
};
virtual ~QuicSentPacketManagerInterface() {}
virtual void SetFromConfig(const QuicConfig& config) = 0;
// Resumes connection state on the default path.
virtual void ResumeConnectionState(
const CachedNetworkParameters& cached_network_params,
bool max_bandwidth_resumption) = 0;
// Sets number of active streams of all paths.
virtual void SetNumOpenStreams(size_t num_streams) = 0;
// Sets max pacing rate of the default path.
virtual void SetMaxPacingRate(QuicBandwidth max_pacing_rate) = 0;
// Indicates the handshake has completed, so no handshake packets need to be
// retransmitted.
virtual void SetHandshakeConfirmed() = 0;
virtual void OnIncomingAck(const QuicAckFrame& ack_frame,
QuicTime ack_receive_time) = 0;
// Requests retransmission of all unacked packets of |retransmission_type| on
// the default path.
virtual void RetransmitUnackedPackets(
TransmissionType retransmission_type) = 0;
// Retransmits the oldest pending packet on the path (on which retransmission
// alarm fires) if there is still a tail loss probe pending. Invoked after
// OnRetransmissionTimeout.
virtual bool MaybeRetransmitTailLossProbe() = 0;
// Removes the retransmittable frames from all unencrypted packets on the
// default path to ensure they don't get retransmitted.
virtual void NeuterUnencryptedPackets() = 0;
virtual bool HasPendingRetransmissions() const = 0;
virtual PendingRetransmission NextPendingRetransmission() = 0;
// Returns true if the default path has unacked packets.
virtual bool HasUnackedPackets() const = 0;
virtual QuicPacketNumber GetLeastUnacked(QuicPathId path_id) const = 0;
virtual bool OnPacketSent(
SerializedPacket* serialized_packet,
QuicPathId original_path_id,
QuicPacketNumber original_packet_number,
QuicTime sent_time,
TransmissionType transmission_type,
HasRetransmittableData has_retransmittable_data) = 0;
virtual void OnRetransmissionTimeout() = 0;
// Returns the earliest time we can send the next packet. Sets |path_id| to be
// the path on which the next packet will be sent.
virtual QuicTime::Delta TimeUntilSend(QuicTime now, QuicPathId* path_id) = 0;
// Returns the earliest retransmission time of all paths.
// TODO(fayang): This method should not be const becasue the return value
// depends upon the time it is invoked.
virtual const QuicTime GetRetransmissionTime() const = 0;
// Returns the rtt stats of the default path.
virtual const RttStats* GetRttStats() const = 0;
// Returns the estimated bandwidth on default path calculated by the
// congestion algorithm.
virtual QuicBandwidth BandwidthEstimate() const = 0;
// Returns the sustained bandwidth recorder on the default path.
virtual const QuicSustainedBandwidthRecorder* SustainedBandwidthRecorder()
const = 0;
// Returns the size of the current congestion window on default path in number
// of kDefaultTCPMSS-sized segments.
virtual QuicPacketCount GetCongestionWindowInTcpMss() const = 0;
// Determines the number of packets of length |max_packet_length| which fit in
// the congestion windows for all paths, and returns the max number of packets
// across all paths.
virtual QuicPacketCount EstimateMaxPacketsInFlight(
QuicByteCount max_packet_length) const = 0;
// Returns the size of the current congestion window size on the default path
// in bytes.
virtual QuicByteCount GetCongestionWindowInBytes() const = 0;
// Returns the size of the slow start congestion window in number of 1460 byte
// TCP segments on the default path.
virtual QuicPacketCount GetSlowStartThresholdInTcpMss() const = 0;
// Returns debugging information about the current state of the
// congestion controller.
virtual std::string GetDebugState() const = 0;
// No longer retransmit data for |stream_id| on all paths.
virtual void CancelRetransmissionsForStream(QuicStreamId stream_id) = 0;
// Called when peer address changes and the connection migrates on |path_id|.
// TODO(fayang): Name of this method is confusing in multipath world because
// this migration is path level. Need to rename this as OnPeerMigration.
virtual void OnConnectionMigration(QuicPathId path_id,
PeerAddressChangeType type) = 0;
virtual bool IsHandshakeConfirmed() const = 0;
virtual void SetDebugDelegate(DebugDelegate* debug_delegate) = 0;
virtual QuicPacketNumber GetLargestObserved(QuicPathId path_id) const = 0;
virtual QuicPacketNumber GetLargestSentPacket(QuicPathId path_id) const = 0;
virtual QuicPacketNumber GetLeastPacketAwaitedByPeer(
QuicPathId path_id) const = 0;
virtual void SetNetworkChangeVisitor(NetworkChangeVisitor* visitor) = 0;
// Returns true if the default path is in slow start.
virtual bool InSlowStart() const = 0;
// These two methods return the consecutive RTO or TLP count of the default
// path.
virtual size_t GetConsecutiveRtoCount() const = 0;
virtual size_t GetConsecutiveTlpCount() const = 0;
// Signals to the congestion controller that the connection has no outstanding
// data to send.
virtual void OnApplicationLimited() = 0;
};
} // namespace net
#endif // NET_QUIC_QUIC_SENT_PACKET_MANAGER_INTERFACE_H_