| Index: net/quic/quic_multipath_sent_packet_manager.cc
|
| diff --git a/net/quic/quic_multipath_sent_packet_manager.cc b/net/quic/quic_multipath_sent_packet_manager.cc
|
| deleted file mode 100644
|
| index 10609344689bca5c75c9cfd8a990e3d4251fd087..0000000000000000000000000000000000000000
|
| --- a/net/quic/quic_multipath_sent_packet_manager.cc
|
| +++ /dev/null
|
| @@ -1,504 +0,0 @@
|
| -// Copyright (c) 2012 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.
|
| -
|
| -#include "net/quic/quic_multipath_sent_packet_manager.h"
|
| -
|
| -#include <cstdint>
|
| -
|
| -#include "base/strings/string_number_conversions.h"
|
| -#include "net/quic/quic_bug_tracker.h"
|
| -
|
| -using std::string;
|
| -using std::max;
|
| -
|
| -namespace net {
|
| -
|
| -QuicMultipathSentPacketManager::QuicMultipathSentPacketManager(
|
| - QuicSentPacketManagerInterface* manager,
|
| - QuicConnectionCloseDelegateInterface* delegate)
|
| - : delegate_(delegate) {
|
| - path_managers_info_.push_back(PathSentPacketManagerInfo(manager, ACTIVE));
|
| -}
|
| -
|
| -QuicMultipathSentPacketManager::~QuicMultipathSentPacketManager() {
|
| - for (PathSentPacketManagerInfo path_manager_info : path_managers_info_) {
|
| - delete path_manager_info.manager;
|
| - }
|
| -}
|
| -
|
| -void QuicMultipathSentPacketManager::SetFromConfig(const QuicConfig& config) {
|
| - for (PathSentPacketManagerInfo path_manager_info : path_managers_info_) {
|
| - if (path_manager_info.manager != nullptr) {
|
| - path_manager_info.manager->SetFromConfig(config);
|
| - }
|
| - }
|
| -}
|
| -
|
| -void QuicMultipathSentPacketManager::ResumeConnectionState(
|
| - const CachedNetworkParameters& cached_network_params,
|
| - bool max_bandwidth_resumption) {
|
| - QuicSentPacketManagerInterface* path_manager =
|
| - MaybeGetSentPacketManagerForActivePath(kDefaultPathId);
|
| - if (path_manager == nullptr) {
|
| - OnUnrecoverablePathError(kDefaultPathId);
|
| - return;
|
| - }
|
| - path_manager->ResumeConnectionState(cached_network_params,
|
| - max_bandwidth_resumption);
|
| -}
|
| -
|
| -void QuicMultipathSentPacketManager::SetNumOpenStreams(size_t num_streams) {
|
| - for (PathSentPacketManagerInfo path_manager_info : path_managers_info_) {
|
| - if (path_manager_info.manager != nullptr) {
|
| - path_manager_info.manager->SetNumOpenStreams(num_streams);
|
| - }
|
| - }
|
| -}
|
| -
|
| -void QuicMultipathSentPacketManager::SetMaxPacingRate(
|
| - QuicBandwidth max_pacing_rate) {
|
| - QuicSentPacketManagerInterface* path_manager =
|
| - MaybeGetSentPacketManagerForActivePath(kDefaultPathId);
|
| - if (path_manager == nullptr) {
|
| - OnUnrecoverablePathError(kDefaultPathId);
|
| - return;
|
| - }
|
| - path_manager->SetMaxPacingRate(max_pacing_rate);
|
| -}
|
| -
|
| -void QuicMultipathSentPacketManager::SetHandshakeConfirmed() {
|
| - QuicSentPacketManagerInterface* path_manager =
|
| - MaybeGetSentPacketManagerForActivePath(kDefaultPathId);
|
| - if (path_manager == nullptr) {
|
| - OnUnrecoverablePathError(kDefaultPathId);
|
| - return;
|
| - }
|
| - path_manager->SetHandshakeConfirmed();
|
| -}
|
| -
|
| -void QuicMultipathSentPacketManager::OnIncomingAck(
|
| - const QuicAckFrame& ack_frame,
|
| - QuicTime ack_receive_time) {
|
| - if (ack_frame.path_id >= path_managers_info_.size() ||
|
| - path_managers_info_[ack_frame.path_id].state != ACTIVE) {
|
| - return;
|
| - }
|
| - path_managers_info_[ack_frame.path_id].manager->OnIncomingAck(
|
| - ack_frame, ack_receive_time);
|
| -}
|
| -
|
| -void QuicMultipathSentPacketManager::RetransmitUnackedPackets(
|
| - TransmissionType retransmission_type) {
|
| - QuicSentPacketManagerInterface* path_manager =
|
| - MaybeGetSentPacketManagerForActivePath(kDefaultPathId);
|
| - if (path_manager == nullptr) {
|
| - OnUnrecoverablePathError(kDefaultPathId);
|
| - return;
|
| - }
|
| - path_manager->RetransmitUnackedPackets(retransmission_type);
|
| -}
|
| -
|
| -bool QuicMultipathSentPacketManager::MaybeRetransmitTailLossProbe() {
|
| - for (PathSentPacketManagerInfo path_manager_info : path_managers_info_) {
|
| - if (path_manager_info.manager != nullptr &&
|
| - path_manager_info.state == ACTIVE) {
|
| - if (path_manager_info.manager->MaybeRetransmitTailLossProbe()) {
|
| - return true;
|
| - }
|
| - }
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -void QuicMultipathSentPacketManager::NeuterUnencryptedPackets() {
|
| - QuicSentPacketManagerInterface* path_manager =
|
| - MaybeGetSentPacketManagerForActivePath(kDefaultPathId);
|
| - if (path_manager == nullptr) {
|
| - OnUnrecoverablePathError(kDefaultPathId);
|
| - return;
|
| - }
|
| - path_manager->NeuterUnencryptedPackets();
|
| -}
|
| -
|
| -bool QuicMultipathSentPacketManager::HasPendingRetransmissions() const {
|
| - // TODO(fayang): Move pending_retransmissions_ from path sent packet manager
|
| - // to multipath sent packet manager.
|
| - QuicSentPacketManagerInterface* path_manager =
|
| - MaybeGetSentPacketManagerForActivePath(kDefaultPathId);
|
| - return path_manager != nullptr && path_manager->HasPendingRetransmissions();
|
| -}
|
| -
|
| -PendingRetransmission
|
| -QuicMultipathSentPacketManager::NextPendingRetransmission() {
|
| - // TODO(fayang): Move pending_retransmissions_ from path sent packet manager
|
| - // to multipath sent packet manager.
|
| - QuicSentPacketManagerInterface* path_manager =
|
| - MaybeGetSentPacketManagerForActivePath(kDefaultPathId);
|
| - if (path_manager == nullptr) {
|
| - OnUnrecoverablePathError(kDefaultPathId);
|
| - QuicFrames retransmittable_frames;
|
| - return PendingRetransmission(kInvalidPathId, 0u, NOT_RETRANSMISSION,
|
| - retransmittable_frames, false, 0,
|
| - ENCRYPTION_NONE, PACKET_1BYTE_PACKET_NUMBER);
|
| - }
|
| - return path_manager->NextPendingRetransmission();
|
| -}
|
| -
|
| -bool QuicMultipathSentPacketManager::HasUnackedPackets() const {
|
| - for (PathSentPacketManagerInfo path_manager_info : path_managers_info_) {
|
| - if (path_manager_info.manager != nullptr &&
|
| - path_manager_info.state == ACTIVE &&
|
| - path_manager_info.manager->HasUnackedPackets()) {
|
| - return true;
|
| - }
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -QuicPacketNumber QuicMultipathSentPacketManager::GetLeastUnacked(
|
| - QuicPathId path_id) const {
|
| - QuicSentPacketManagerInterface* path_manager =
|
| - MaybeGetSentPacketManagerForPath(path_id);
|
| - if (path_manager == nullptr) {
|
| - return 0;
|
| - }
|
| - return path_manager->GetLeastUnacked(path_id);
|
| -}
|
| -
|
| -bool QuicMultipathSentPacketManager::OnPacketSent(
|
| - SerializedPacket* serialized_packet,
|
| - QuicPathId original_path_id,
|
| - QuicPacketNumber original_packet_number,
|
| - QuicTime sent_time,
|
| - TransmissionType transmission_type,
|
| - HasRetransmittableData has_retransmittable_data) {
|
| - QuicSentPacketManagerInterface* path_manager =
|
| - MaybeGetSentPacketManagerForActivePath(serialized_packet->path_id);
|
| - // TODO(fayang): Handle packets retransmitted on different path.
|
| - DCHECK(original_packet_number == 0 ||
|
| - original_path_id == serialized_packet->path_id);
|
| - if (path_manager == nullptr) {
|
| - OnUnrecoverablePathError(serialized_packet->path_id);
|
| - return false;
|
| - }
|
| -
|
| - return path_manager->OnPacketSent(
|
| - serialized_packet, original_path_id, original_packet_number, sent_time,
|
| - transmission_type, has_retransmittable_data);
|
| -}
|
| -
|
| -void QuicMultipathSentPacketManager::OnRetransmissionTimeout() {
|
| - QuicPathId rto_path = DetermineRetransmissionTimeoutPath();
|
| - DCHECK_NE(kInvalidPathId, rto_path);
|
| - QuicSentPacketManagerInterface* path_manager =
|
| - MaybeGetSentPacketManagerForActivePath(rto_path);
|
| - if (path_manager == nullptr) {
|
| - OnUnrecoverablePathError(rto_path);
|
| - return;
|
| - }
|
| - path_manager->OnRetransmissionTimeout();
|
| -}
|
| -
|
| -QuicTime::Delta QuicMultipathSentPacketManager::TimeUntilSend(
|
| - QuicTime now,
|
| - HasRetransmittableData retransmittable,
|
| - QuicPathId* path_id) {
|
| - QuicTime::Delta delay = QuicTime::Delta::Infinite();
|
| - *path_id = kInvalidPathId;
|
| - for (size_t i = 0; i < path_managers_info_.size(); ++i) {
|
| - if (path_managers_info_[i].manager == nullptr ||
|
| - path_managers_info_[i].state != ACTIVE) {
|
| - continue;
|
| - }
|
| -
|
| - QuicTime::Delta path_delay = path_managers_info_[i].manager->TimeUntilSend(
|
| - now, retransmittable, path_id);
|
| - if (!path_delay.IsInfinite() && path_delay < delay) {
|
| - delay = path_delay;
|
| - *path_id = i;
|
| - }
|
| - }
|
| - DCHECK(*path_id == kInvalidPathId || !delay.IsInfinite());
|
| - return delay;
|
| -}
|
| -
|
| -const QuicTime QuicMultipathSentPacketManager::GetRetransmissionTime() const {
|
| - QuicTime retransmission_time = QuicTime::Zero();
|
| - for (PathSentPacketManagerInfo path_manager_info : path_managers_info_) {
|
| - if (path_manager_info.manager == nullptr ||
|
| - path_manager_info.state != ACTIVE) {
|
| - continue;
|
| - }
|
| - QuicTime path_retransmission_time =
|
| - path_manager_info.manager->GetRetransmissionTime();
|
| - if (!path_retransmission_time.IsInitialized()) {
|
| - continue;
|
| - }
|
| - if (!retransmission_time.IsInitialized() ||
|
| - path_retransmission_time < retransmission_time) {
|
| - retransmission_time = path_retransmission_time;
|
| - }
|
| - }
|
| -
|
| - return retransmission_time;
|
| -}
|
| -
|
| -const RttStats* QuicMultipathSentPacketManager::GetRttStats() const {
|
| - QuicSentPacketManagerInterface* path_manager =
|
| - MaybeGetSentPacketManagerForActivePath(kDefaultPathId);
|
| - if (path_manager == nullptr) {
|
| - return nullptr;
|
| - }
|
| - return path_manager->GetRttStats();
|
| -}
|
| -
|
| -QuicBandwidth QuicMultipathSentPacketManager::BandwidthEstimate() const {
|
| - QuicSentPacketManagerInterface* path_manager =
|
| - MaybeGetSentPacketManagerForActivePath(kDefaultPathId);
|
| - if (path_manager == nullptr) {
|
| - return QuicBandwidth::Zero();
|
| - }
|
| - return path_manager->BandwidthEstimate();
|
| -}
|
| -
|
| -const QuicSustainedBandwidthRecorder*
|
| -QuicMultipathSentPacketManager::SustainedBandwidthRecorder() const {
|
| - QuicSentPacketManagerInterface* path_manager =
|
| - MaybeGetSentPacketManagerForActivePath(kDefaultPathId);
|
| - if (path_manager == nullptr) {
|
| - return nullptr;
|
| - }
|
| - return path_manager->SustainedBandwidthRecorder();
|
| -}
|
| -
|
| -QuicPacketCount QuicMultipathSentPacketManager::GetCongestionWindowInTcpMss()
|
| - const {
|
| - QuicSentPacketManagerInterface* path_manager =
|
| - MaybeGetSentPacketManagerForActivePath(kDefaultPathId);
|
| - if (path_manager == nullptr) {
|
| - return 0;
|
| - }
|
| - return path_manager->GetCongestionWindowInTcpMss();
|
| -}
|
| -
|
| -QuicPacketCount QuicMultipathSentPacketManager::EstimateMaxPacketsInFlight(
|
| - QuicByteCount max_packet_length) const {
|
| - QuicPacketCount max_packets_in_flight = 0;
|
| - for (PathSentPacketManagerInfo path_manager_info : path_managers_info_) {
|
| - if (path_manager_info.manager != nullptr) {
|
| - max_packets_in_flight =
|
| - max(max_packets_in_flight,
|
| - path_manager_info.manager->EstimateMaxPacketsInFlight(
|
| - max_packet_length));
|
| - }
|
| - }
|
| - DCHECK_LT(0u, max_packets_in_flight);
|
| - return max_packets_in_flight;
|
| -}
|
| -
|
| -QuicByteCount QuicMultipathSentPacketManager::GetCongestionWindowInBytes()
|
| - const {
|
| - QuicSentPacketManagerInterface* path_manager =
|
| - MaybeGetSentPacketManagerForActivePath(kDefaultPathId);
|
| - if (path_manager == nullptr) {
|
| - return 0;
|
| - }
|
| - return path_manager->GetCongestionWindowInBytes();
|
| -}
|
| -
|
| -QuicPacketCount QuicMultipathSentPacketManager::GetSlowStartThresholdInTcpMss()
|
| - const {
|
| - QuicSentPacketManagerInterface* path_manager =
|
| - MaybeGetSentPacketManagerForActivePath(kDefaultPathId);
|
| - if (path_manager == nullptr) {
|
| - return 0;
|
| - }
|
| - return path_manager->GetSlowStartThresholdInTcpMss();
|
| -}
|
| -
|
| -void QuicMultipathSentPacketManager::CancelRetransmissionsForStream(
|
| - QuicStreamId stream_id) {
|
| - for (PathSentPacketManagerInfo path_manager_info : path_managers_info_) {
|
| - if (path_manager_info.manager != nullptr) {
|
| - path_manager_info.manager->CancelRetransmissionsForStream(stream_id);
|
| - }
|
| - }
|
| -}
|
| -
|
| -void QuicMultipathSentPacketManager::OnConnectionMigration(
|
| - QuicPathId path_id,
|
| - PeerAddressChangeType type) {
|
| - QuicSentPacketManagerInterface* path_manager =
|
| - MaybeGetSentPacketManagerForActivePath(path_id);
|
| - if (path_manager == nullptr) {
|
| - OnUnrecoverablePathError(path_id);
|
| - return;
|
| - }
|
| - path_manager->OnConnectionMigration(path_id, type);
|
| -}
|
| -
|
| -bool QuicMultipathSentPacketManager::IsHandshakeConfirmed() const {
|
| - QuicSentPacketManagerInterface* path_manager =
|
| - MaybeGetSentPacketManagerForActivePath(kDefaultPathId);
|
| - return path_manager != nullptr && path_manager->IsHandshakeConfirmed();
|
| -}
|
| -
|
| -void QuicMultipathSentPacketManager::SetDebugDelegate(
|
| - DebugDelegate* debug_delegate) {
|
| - for (PathSentPacketManagerInfo path_manager_info : path_managers_info_) {
|
| - if (path_manager_info.manager == nullptr) {
|
| - continue;
|
| - }
|
| - path_manager_info.manager->SetDebugDelegate(debug_delegate);
|
| - }
|
| -}
|
| -
|
| -QuicPacketNumber QuicMultipathSentPacketManager::GetLargestObserved(
|
| - QuicPathId path_id) const {
|
| - QuicSentPacketManagerInterface* path_manager =
|
| - MaybeGetSentPacketManagerForPath(path_id);
|
| - if (path_manager == nullptr) {
|
| - return 0;
|
| - }
|
| - return path_manager->GetLargestObserved(path_id);
|
| -}
|
| -
|
| -QuicPacketNumber QuicMultipathSentPacketManager::GetLargestSentPacket(
|
| - QuicPathId path_id) const {
|
| - QuicSentPacketManagerInterface* path_manager =
|
| - MaybeGetSentPacketManagerForPath(path_id);
|
| - if (path_manager == nullptr) {
|
| - return 0;
|
| - }
|
| - return path_manager->GetLargestSentPacket(path_id);
|
| -}
|
| -
|
| -QuicPacketNumber QuicMultipathSentPacketManager::GetLeastPacketAwaitedByPeer(
|
| - QuicPathId path_id) const {
|
| - QuicSentPacketManagerInterface* path_manager =
|
| - MaybeGetSentPacketManagerForPath(path_id);
|
| - if (path_manager == nullptr) {
|
| - return 0;
|
| - }
|
| - return path_manager->GetLeastPacketAwaitedByPeer(path_id);
|
| -}
|
| -
|
| -void QuicMultipathSentPacketManager::SetNetworkChangeVisitor(
|
| - NetworkChangeVisitor* visitor) {
|
| - for (PathSentPacketManagerInfo path_manager_info : path_managers_info_) {
|
| - if (path_manager_info.manager == nullptr ||
|
| - path_manager_info.state != ACTIVE) {
|
| - continue;
|
| - }
|
| - path_manager_info.manager->SetNetworkChangeVisitor(visitor);
|
| - }
|
| -}
|
| -
|
| -bool QuicMultipathSentPacketManager::InSlowStart() const {
|
| - QuicSentPacketManagerInterface* path_manager =
|
| - MaybeGetSentPacketManagerForActivePath(kDefaultPathId);
|
| - return path_manager != nullptr && path_manager->InSlowStart();
|
| -}
|
| -
|
| -size_t QuicMultipathSentPacketManager::GetConsecutiveRtoCount() const {
|
| - QuicSentPacketManagerInterface* path_manager =
|
| - MaybeGetSentPacketManagerForActivePath(kDefaultPathId);
|
| - if (path_manager == nullptr) {
|
| - return 0;
|
| - }
|
| - return path_manager->GetConsecutiveRtoCount();
|
| -}
|
| -size_t QuicMultipathSentPacketManager::GetConsecutiveTlpCount() const {
|
| - QuicSentPacketManagerInterface* path_manager =
|
| - MaybeGetSentPacketManagerForActivePath(kDefaultPathId);
|
| - if (path_manager == nullptr) {
|
| - return 0;
|
| - }
|
| - return path_manager->GetConsecutiveTlpCount();
|
| -}
|
| -
|
| -QuicMultipathSentPacketManager::PathSentPacketManagerInfo::
|
| - PathSentPacketManagerInfo()
|
| - : manager(nullptr), state(CLOSING) {}
|
| -
|
| -QuicMultipathSentPacketManager::PathSentPacketManagerInfo::
|
| - PathSentPacketManagerInfo(QuicSentPacketManagerInterface* manager,
|
| - PathSentPacketManagerState state)
|
| - : manager(manager), state(state) {}
|
| -
|
| -QuicMultipathSentPacketManager::PathSentPacketManagerInfo::
|
| - PathSentPacketManagerInfo(const PathSentPacketManagerInfo& other) = default;
|
| -
|
| -QuicSentPacketManagerInterface*
|
| -QuicMultipathSentPacketManager::MaybeGetSentPacketManagerForPath(
|
| - QuicPathId path_id) const {
|
| - if (path_id >= path_managers_info_.size() ||
|
| - path_managers_info_[path_id].manager == nullptr) {
|
| - QUIC_BUG << "Sent packet manager of path: (" + base::IntToString(path_id) +
|
| - ") must exist but does not.";
|
| - return nullptr;
|
| - }
|
| -
|
| - return path_managers_info_[path_id].manager;
|
| -}
|
| -
|
| -QuicSentPacketManagerInterface*
|
| -QuicMultipathSentPacketManager::MaybeGetSentPacketManagerForActivePath(
|
| - QuicPathId path_id) const {
|
| - QuicSentPacketManagerInterface* path_manager =
|
| - MaybeGetSentPacketManagerForPath(path_id);
|
| - if (path_manager == nullptr) {
|
| - return nullptr;
|
| - }
|
| - if (path_managers_info_[path_id].state != ACTIVE) {
|
| - QUIC_BUG << "Sent packet manager of path: (" + base::IntToString(path_id) +
|
| - ") must be active but is not.";
|
| - return nullptr;
|
| - }
|
| -
|
| - return path_manager;
|
| -}
|
| -
|
| -QuicPathId QuicMultipathSentPacketManager::DetermineRetransmissionTimeoutPath()
|
| - const {
|
| - QuicTime retransmission_time = QuicTime::Zero();
|
| - QuicPathId rto_path = kInvalidPathId;
|
| - for (size_t i = 0; i < path_managers_info_.size(); ++i) {
|
| - if (path_managers_info_[i].manager == nullptr ||
|
| - path_managers_info_[i].state != ACTIVE) {
|
| - continue;
|
| - }
|
| - QuicTime path_retransmission_time =
|
| - path_managers_info_[i].manager->GetRetransmissionTime();
|
| - if (!path_retransmission_time.IsInitialized()) {
|
| - continue;
|
| - }
|
| - if (!retransmission_time.IsInitialized() ||
|
| - path_retransmission_time < retransmission_time) {
|
| - retransmission_time = path_retransmission_time;
|
| - rto_path = i;
|
| - }
|
| - }
|
| - return rto_path;
|
| -}
|
| -
|
| -void QuicMultipathSentPacketManager::OnUnrecoverablePathError(
|
| - QuicPathId path_id) {
|
| - if (MaybeGetSentPacketManagerForPath(path_id) == nullptr) {
|
| - const string error_details = "Sent packet manager of path: (" +
|
| - base::IntToString(path_id) +
|
| - ") must exist but does not.";
|
| - delegate_->OnUnrecoverableError(QUIC_MULTIPATH_PATH_DOES_NOT_EXIST,
|
| - error_details,
|
| - ConnectionCloseSource::FROM_SELF);
|
| - return;
|
| - }
|
| - const string error_details = "Sent packet manager of path: (" +
|
| - base::IntToString(path_id) +
|
| - ") must be active but is not.";
|
| - delegate_->OnUnrecoverableError(QUIC_MULTIPATH_PATH_NOT_ACTIVE, error_details,
|
| - ConnectionCloseSource::FROM_SELF);
|
| -}
|
| -
|
| -} // namespace net
|
|
|