Chromium Code Reviews| Index: net/quic/quic_multipath_sent_packet_manager.h |
| diff --git a/net/quic/quic_multipath_sent_packet_manager.h b/net/quic/quic_multipath_sent_packet_manager.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..8c2e9b95662f77b0ae44fffd238419606ac8521e |
| --- /dev/null |
| +++ b/net/quic/quic_multipath_sent_packet_manager.h |
| @@ -0,0 +1,223 @@ |
| +#ifndef NET_QUIC_QUIC_MULTIPATH_SENT_PACKET_MANAGER_H_ |
|
Zhongyi Shi
2016/07/25 22:30:34
Could you add chromium license to this new file?
|
| +#define NET_QUIC_QUIC_MULTIPATH_SENT_PACKET_MANAGER_H_ |
| + |
| +#include <vector> |
| + |
| +#include "net/base/net_export.h" |
| +#include "net/quic/quic_protocol.h" |
| +#include "net/quic/quic_sent_packet_manager.h" |
| +#include "net/quic/quic_sent_packet_manager_interface.h" |
| + |
| +namespace net { |
| + |
| +namespace test { |
| +class QuicConnectionPeer; |
| +class QuicMultipathSentPacketManagerPeer; |
| +} // namespace test |
| + |
| +// A connection level sent packet manager which manages a sent packet manager |
| +// per path. The main duties of multipath sent packet manager comprise: |
| +// (1) manages a pending retransmission queue shared among all paths; |
| +// (2) records mapping of packets transmitted on different paths; |
| +// (3) consults paths which should timeout on a retransmission timeout. |
| +// TODO(fayang): Currently above duties are not fully implemented, need to |
| +// finish them. |
| +class NET_EXPORT_PRIVATE QuicMultipathSentPacketManager : |
| + public QuicSentPacketManagerInterface { |
| + public: |
| + // Multipath sent packet manager takes ownership of |manager|. |
| + explicit QuicMultipathSentPacketManager( |
| + QuicSentPacketManagerInterface* manager, |
| + QuicConnectionCloseDelegateInterface* delegate); |
| + ~QuicMultipathSentPacketManager() override; |
| + |
| + // Start implementation of QuicSentPacketManagerInterface. |
| + // Sets all paths from |config|. |
| + void SetFromConfig(const QuicConfig& config) override; |
| + |
| + // Resumes connection state on the default path. |
| + void ResumeConnectionState( |
| + const CachedNetworkParameters& cached_network_params, |
| + bool max_bandwidth_resumption) override; |
| + |
| + // Sets number of active streams of all paths. |
| + void SetNumOpenStreams(size_t num_streams) override; |
| + |
| + // Sets max pacing rate of the default path. |
| + void SetMaxPacingRate(QuicBandwidth max_pacing_rate) override; |
| + |
| + void SetHandshakeConfirmed() override; |
| + |
| + // Directs |ack_frame| to the appropriate path sent packet manager. |
| + void OnIncomingAck(const QuicAckFrame& ack_frame, |
| + QuicTime ack_receive_time) override; |
| + |
| + // Returns true if |packet_number| is unacked on path with |path_id|. |
| + bool IsUnacked(QuicPathId path_id, |
| + QuicPacketNumber packet_number) const override; |
| + |
| + // Returns true if |packet_number| on |path_id| is unacked and has |
| + // retransmittable frames. |
| + bool HasRetransmittableFrames(QuicPathId path_id, |
| + QuicPacketNumber packet_number) const override; |
| + |
| + // Requests retransmission of all unacked packets of |retransmission_type| on |
| + // the default path. |
| + void RetransmitUnackedPackets(TransmissionType retransmission_type) override; |
| + |
| + // Tries to retransmit the oldest pending packet across all paths. The |
| + // retransmission is sent on the path that has a TLP timer pending. |
| + bool MaybeRetransmitTailLossProbe() override; |
| + |
| + // Removes the retransmittable frames from all unencrypted packets on the |
| + // default path to ensure they don't get retransmitted. |
| + void NeuterUnencryptedPackets() override; |
| + |
| + // Returns true if there are pending retransmissions. |
| + bool HasPendingRetransmissions() const override; |
| + |
| + // Retrieves the next pending retransmission. Caller must ensure that |
| + // there are pending retransmissions prior to calling this function. |
| + PendingRetransmission NextPendingRetransmission() override; |
| + |
| + // Returns true if the any path has unacked packets. |
| + bool HasUnackedPackets() const override; |
| + |
| + // Returns the smallest packet number of a serialized packet which has not |
| + // been acked on |path_id|. |
| + QuicPacketNumber GetLeastUnacked(QuicPathId path_id) const override; |
| + |
| + // Called when a packet has been sent to the peer. If this packet is a |
| + // retransmission on a different path than the original packet, records the |
| + // mapping in |transmissions_map_|. Retransmittable frames are transfered from |
| + // original packet to the sent packet. |
| + bool OnPacketSent(SerializedPacket* serialized_packet, |
| + QuicPathId original_path_id, |
| + QuicPacketNumber original_packet_number, |
| + QuicTime sent_time, |
| + TransmissionType transmission_type, |
| + HasRetransmittableData has_retransmittable_data) override; |
| + |
| + // Called when the retransmission timer expires. |
| + void OnRetransmissionTimeout() override; |
| + |
| + // Returns the earliest time the next packet can be sent. Sets |path_id| to be |
| + // the path on which the next packet should be sent. |
| + QuicTime::Delta TimeUntilSend(QuicTime now, |
| + HasRetransmittableData retransmittable, |
| + QuicPathId* path_id) override; |
| + |
| + // Returns the earliest retransmission time of all paths. |
| + const QuicTime GetRetransmissionTime() const override; |
| + |
| + // Returns the rtt stats of the default path. |
| + const RttStats* GetRttStats() const override; |
| + |
| + // Returns the estimated bandwidth on default path calculated by the |
| + // congestion algorithm. |
| + QuicBandwidth BandwidthEstimate() const override; |
| + |
| + // Returns the sustained bandwidth recorder on the default path. |
| + const QuicSustainedBandwidthRecorder* SustainedBandwidthRecorder() |
| + const override; |
| + |
| + // Returns the size of the current congestion window on default path in number |
| + // of kDefaultTCPMSS-sized segments. |
| + QuicPacketCount GetCongestionWindowInTcpMss() const override; |
| + |
| + // 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. |
| + QuicPacketCount EstimateMaxPacketsInFlight( |
| + QuicByteCount max_packet_length) const override; |
| + |
| + // Returns the size of the current congestion window size on the default path |
| + // in bytes. |
| + QuicByteCount GetCongestionWindowInBytes() const override; |
| + |
| + // Returns the size of the slow start congestion window in number of 1460 byte |
| + // TCP segments on the default path. |
| + QuicPacketCount GetSlowStartThresholdInTcpMss() const override; |
| + |
| + // No longer retransmit data for |stream_id| on all paths and any pending |
| + // retransmissions in pending_retransmissions_. |
| + void CancelRetransmissionsForStream(QuicStreamId stream_id) override; |
| + |
| + void OnConnectionMigration(QuicPathId path_id, |
| + PeerAddressChangeType type) override; |
| + |
| + bool IsHandshakeConfirmed() const override; |
| + |
| + // Sets debug delegate for all active paths. |
| + void SetDebugDelegate(DebugDelegate* debug_delegate) override; |
| + |
| + QuicPacketNumber GetLargestObserved(QuicPathId path_id) const override; |
| + |
| + QuicPacketNumber GetLargestSentPacket(QuicPathId path_id) const override; |
| + |
| + QuicPacketNumber GetLeastPacketAwaitedByPeer( |
| + QuicPathId path_id) const override; |
| + |
| + // Sets network change visitor for all active paths. |
| + void SetNetworkChangeVisitor(NetworkChangeVisitor* visitor) override; |
| + |
| + // Returns true if the default path is in slow start. |
| + bool InSlowStart() const override; |
| + |
| + // These two methods return the consecutive RTO or TLP count of the default |
| + // path. |
| + size_t GetConsecutiveRtoCount() const override; |
| + size_t GetConsecutiveTlpCount() const override; |
| + |
| + private: |
| + friend class test::QuicConnectionPeer; |
| + friend class test::QuicMultipathSentPacketManagerPeer; |
| + |
| + // State of per path sent packet manager. |
| + // TODO(fayang): Need to add a state that path can receive acks but cannot |
| + // send data. |
| + enum PathSentPacketManagerState { |
| + ACTIVE, // We both send packets and receiving acks on this path. |
| + CLOSING, // We stop sending packets and receiving acks on this path. There |
| + // are retransmittable frames in the unacked packets map. |
| + }; |
| + |
| + // PathSentPacketManagerInfo contains sent packet manager and its state. |
| + struct PathSentPacketManagerInfo { |
| + PathSentPacketManagerInfo(); |
| + PathSentPacketManagerInfo(QuicSentPacketManagerInterface* manager, |
| + PathSentPacketManagerState state); |
| + PathSentPacketManagerInfo(const PathSentPacketManagerInfo& other); |
| + |
| + QuicSentPacketManagerInterface* manager; |
| + PathSentPacketManagerState state; |
| + }; |
| + |
| + // Returns path sent packet manager if it exists for |path_id|, returns |
| + // nullptr otherwise. |
| + QuicSentPacketManagerInterface* MaybeGetSentPacketManagerForPath( |
| + QuicPathId path_id) const; |
| + |
| + // Returns path sent packet manager if it exists and |path_id| is ACTIVE, |
| + // returns nullptr otherwise. |
| + QuicSentPacketManagerInterface* MaybeGetSentPacketManagerForActivePath( |
| + QuicPathId path_id) const; |
| + |
| + // Returns the path which has the earliest retransmission time. |
| + QuicPathId DetermineRetransmissionTimeoutPath() const; |
| + |
| + // Close the connection on unrecoverable path errors. |
| + void OnUnrecoverablePathError(QuicPathId path_id); |
| + |
| + // Current path sent packet managers info, index is path id. |
| + std::vector<PathSentPacketManagerInfo> path_managers_info_; |
| + |
| + // Does not own this delegate. |
| + QuicConnectionCloseDelegateInterface* delegate_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(QuicMultipathSentPacketManager); |
| +}; |
| + |
| +} // namespace net |
| + |
| +#endif // NET_QUIC_QUIC_MULTIPATH_SENT_PACKET_MANAGER_H_ |