Index: net/quic/core/quic_sent_packet_manager.cc |
diff --git a/net/quic/core/quic_sent_packet_manager.cc b/net/quic/core/quic_sent_packet_manager.cc |
index b71fe7239a89ecca4eac65870c8865e8d235ab4b..05909afe18a58676b475ca4215ca5bf059e9b93a 100644 |
--- a/net/quic/core/quic_sent_packet_manager.cc |
+++ b/net/quic/core/quic_sent_packet_manager.cc |
@@ -45,7 +45,7 @@ static const int64_t kConservativeMinHandshakeTimeoutMs = kMaxDelayedAckTimeMs; |
// per draft RFC draft-dukkipati-tcpm-tcp-loss-probe. |
static const size_t kDefaultMaxTailLossProbes = 2; |
-bool HasCryptoHandshake(const TransmissionInfo& transmission_info) { |
+bool HasCryptoHandshake(const QuicTransmissionInfo& transmission_info) { |
DCHECK(!transmission_info.has_crypto_handshake || |
!transmission_info.retransmittable_frames.empty()); |
return transmission_info.has_crypto_handshake; |
@@ -111,23 +111,47 @@ void QuicSentPacketManager::SetFromConfig(const QuicConfig& config) { |
min(kMaxInitialRoundTripTimeUs, |
config.GetInitialRoundTripTimeUsToSend()))); |
} |
- if (FLAGS_quic_allow_new_bbr && config.HasReceivedConnectionOptions() && |
- ContainsQuicTag(config.ReceivedConnectionOptions(), kTBBR)) { |
- SetSendAlgorithm(kBBR); |
- } |
- if (config.HasReceivedConnectionOptions() && |
- ContainsQuicTag(config.ReceivedConnectionOptions(), kRENO)) { |
- if (ContainsQuicTag(config.ReceivedConnectionOptions(), kBYTE)) { |
- SetSendAlgorithm(kRenoBytes); |
- } else { |
- SetSendAlgorithm(kReno); |
+ // Configure congestion control. |
+ const bool enable_client_connection_options = |
+ FLAGS_quic_client_connection_options; |
+ if (enable_client_connection_options) { |
+ if (FLAGS_quic_allow_new_bbr && |
+ config.HasClientRequestedIndependentOption(kTBBR, perspective_)) { |
+ SetSendAlgorithm(kBBR); |
} |
- } else if (config.HasReceivedConnectionOptions() && |
- ContainsQuicTag(config.ReceivedConnectionOptions(), kBYTE)) { |
- if (FLAGS_quic_default_enable_cubic_bytes) { |
- SetSendAlgorithm(kCubic); |
- } else { |
- SetSendAlgorithm(kCubicBytes); |
+ if (config.HasClientRequestedIndependentOption(kRENO, perspective_)) { |
+ if (config.HasClientRequestedIndependentOption(kBYTE, perspective_)) { |
+ SetSendAlgorithm(kRenoBytes); |
+ } else { |
+ SetSendAlgorithm(kReno); |
+ } |
+ } else if (config.HasClientRequestedIndependentOption(kBYTE, |
+ perspective_)) { |
+ if (FLAGS_quic_default_enable_cubic_bytes) { |
+ SetSendAlgorithm(kCubic); |
+ } else { |
+ SetSendAlgorithm(kCubicBytes); |
+ } |
+ } |
+ } else { |
+ if (FLAGS_quic_allow_new_bbr && config.HasReceivedConnectionOptions() && |
+ ContainsQuicTag(config.ReceivedConnectionOptions(), kTBBR)) { |
+ SetSendAlgorithm(kBBR); |
+ } |
+ if (config.HasReceivedConnectionOptions() && |
+ ContainsQuicTag(config.ReceivedConnectionOptions(), kRENO)) { |
+ if (ContainsQuicTag(config.ReceivedConnectionOptions(), kBYTE)) { |
+ SetSendAlgorithm(kRenoBytes); |
+ } else { |
+ SetSendAlgorithm(kReno); |
+ } |
+ } else if (config.HasReceivedConnectionOptions() && |
+ ContainsQuicTag(config.ReceivedConnectionOptions(), kBYTE)) { |
+ if (FLAGS_quic_default_enable_cubic_bytes) { |
+ SetSendAlgorithm(kCubic); |
+ } else { |
+ SetSendAlgorithm(kCubicBytes); |
+ } |
} |
} |
using_pacing_ = !FLAGS_quic_disable_pacing_for_perf_tests; |
@@ -147,17 +171,31 @@ void QuicSentPacketManager::SetFromConfig(const QuicConfig& config) { |
if (config.HasClientSentConnectionOption(kNRTO, perspective_)) { |
use_new_rto_ = true; |
} |
- if (config.HasReceivedConnectionOptions() && |
- ContainsQuicTag(config.ReceivedConnectionOptions(), kTIME)) { |
- general_loss_algorithm_.SetLossDetectionType(kTime); |
- } |
- if (config.HasReceivedConnectionOptions() && |
- ContainsQuicTag(config.ReceivedConnectionOptions(), kATIM)) { |
- general_loss_algorithm_.SetLossDetectionType(kAdaptiveTime); |
- } |
- if (FLAGS_quic_enable_lazy_fack && config.HasReceivedConnectionOptions() && |
- ContainsQuicTag(config.ReceivedConnectionOptions(), kLFAK)) { |
- general_loss_algorithm_.SetLossDetectionType(kLazyFack); |
+ // Configure loss detection. |
+ if (enable_client_connection_options) { |
+ if (config.HasClientRequestedIndependentOption(kTIME, perspective_)) { |
+ general_loss_algorithm_.SetLossDetectionType(kTime); |
+ } |
+ if (config.HasClientRequestedIndependentOption(kATIM, perspective_)) { |
+ general_loss_algorithm_.SetLossDetectionType(kAdaptiveTime); |
+ } |
+ if (FLAGS_quic_enable_lazy_fack && |
+ config.HasClientRequestedIndependentOption(kLFAK, perspective_)) { |
+ general_loss_algorithm_.SetLossDetectionType(kLazyFack); |
+ } |
+ } else { |
+ if (config.HasReceivedConnectionOptions() && |
+ ContainsQuicTag(config.ReceivedConnectionOptions(), kTIME)) { |
+ general_loss_algorithm_.SetLossDetectionType(kTime); |
+ } |
+ if (config.HasReceivedConnectionOptions() && |
+ ContainsQuicTag(config.ReceivedConnectionOptions(), kATIM)) { |
+ general_loss_algorithm_.SetLossDetectionType(kAdaptiveTime); |
+ } |
+ if (FLAGS_quic_enable_lazy_fack && config.HasReceivedConnectionOptions() && |
+ ContainsQuicTag(config.ReceivedConnectionOptions(), kLFAK)) { |
+ general_loss_algorithm_.SetLossDetectionType(kLazyFack); |
+ } |
} |
if (config.HasClientSentConnectionOption(kUNDO, perspective_)) { |
undo_pending_retransmits_ = true; |
@@ -366,7 +404,7 @@ void QuicSentPacketManager::NeuterUnencryptedPackets() { |
void QuicSentPacketManager::MarkForRetransmission( |
QuicPacketNumber packet_number, |
TransmissionType transmission_type) { |
- const TransmissionInfo& transmission_info = |
+ const QuicTransmissionInfo& transmission_info = |
unacked_packets_.GetTransmissionInfo(packet_number); |
QUIC_BUG_IF(transmission_info.retransmittable_frames.empty()); |
// Both TLP and the new RTO leave the packets in flight and let the loss |
@@ -390,7 +428,7 @@ void QuicSentPacketManager::MarkForRetransmission( |
} |
void QuicSentPacketManager::RecordOneSpuriousRetransmission( |
- const TransmissionInfo& info) { |
+ const QuicTransmissionInfo& info) { |
stats_->bytes_spuriously_retransmitted += info.bytes_sent; |
++stats_->packets_spuriously_retransmitted; |
if (debug_delegate_ != nullptr) { |
@@ -400,11 +438,11 @@ void QuicSentPacketManager::RecordOneSpuriousRetransmission( |
} |
void QuicSentPacketManager::RecordSpuriousRetransmissions( |
- const TransmissionInfo& info, |
+ const QuicTransmissionInfo& info, |
QuicPacketNumber acked_packet_number) { |
QuicPacketNumber retransmission = info.retransmission; |
while (retransmission != 0) { |
- const TransmissionInfo& retransmit_info = |
+ const QuicTransmissionInfo& retransmit_info = |
unacked_packets_.GetTransmissionInfo(retransmission); |
retransmission = retransmit_info.retransmission; |
RecordOneSpuriousRetransmission(retransmit_info); |
@@ -421,7 +459,7 @@ bool QuicSentPacketManager::HasPendingRetransmissions() const { |
return !pending_retransmissions_.empty(); |
} |
-PendingRetransmission QuicSentPacketManager::NextPendingRetransmission() { |
+QuicPendingRetransmission QuicSentPacketManager::NextPendingRetransmission() { |
QUIC_BUG_IF(pending_retransmissions_.empty()) |
<< "Unexpected call to PendingRetransmissions() with empty pending " |
<< "retransmission list. Corrupted memory usage imminent."; |
@@ -439,21 +477,21 @@ PendingRetransmission QuicSentPacketManager::NextPendingRetransmission() { |
} |
} |
DCHECK(unacked_packets_.IsUnacked(packet_number)) << packet_number; |
- const TransmissionInfo& transmission_info = |
+ const QuicTransmissionInfo& transmission_info = |
unacked_packets_.GetTransmissionInfo(packet_number); |
DCHECK(!transmission_info.retransmittable_frames.empty()); |
- return PendingRetransmission(path_id_, packet_number, transmission_type, |
- transmission_info.retransmittable_frames, |
- transmission_info.has_crypto_handshake, |
- transmission_info.num_padding_bytes, |
- transmission_info.encryption_level, |
- transmission_info.packet_number_length); |
+ return QuicPendingRetransmission(path_id_, packet_number, transmission_type, |
+ transmission_info.retransmittable_frames, |
+ transmission_info.has_crypto_handshake, |
+ transmission_info.num_padding_bytes, |
+ transmission_info.encryption_level, |
+ transmission_info.packet_number_length); |
} |
QuicPacketNumber QuicSentPacketManager::GetNewestRetransmission( |
QuicPacketNumber packet_number, |
- const TransmissionInfo& transmission_info) const { |
+ const QuicTransmissionInfo& transmission_info) const { |
QuicPacketNumber retransmission = transmission_info.retransmission; |
while (retransmission != 0) { |
packet_number = retransmission; |
@@ -470,7 +508,7 @@ void QuicSentPacketManager::MarkPacketNotRetransmittable( |
return; |
} |
- const TransmissionInfo& transmission_info = |
+ const QuicTransmissionInfo& transmission_info = |
unacked_packets_.GetTransmissionInfo(packet_number); |
QuicPacketNumber newest_transmission = |
GetNewestRetransmission(packet_number, transmission_info); |
@@ -487,7 +525,7 @@ void QuicSentPacketManager::MarkPacketNotRetransmittable( |
} |
void QuicSentPacketManager::MarkPacketHandled(QuicPacketNumber packet_number, |
- TransmissionInfo* info, |
+ QuicTransmissionInfo* info, |
QuicTime::Delta ack_delay_time) { |
QuicPacketNumber newest_transmission = |
GetNewestRetransmission(packet_number, *info); |
@@ -514,7 +552,7 @@ void QuicSentPacketManager::MarkPacketHandled(QuicPacketNumber packet_number, |
// transmission of a crypto packet is in flight at once. |
// TODO(ianswett): Instead of handling all crypto packets special, |
// only handle nullptr encrypted packets in a special way. |
- const TransmissionInfo& newest_transmission_info = |
+ const QuicTransmissionInfo& newest_transmission_info = |
unacked_packets_.GetTransmissionInfo(newest_transmission); |
if (HasCryptoHandshake(newest_transmission_info)) { |
unacked_packets_.RemoveFromInFlight(newest_transmission); |
@@ -745,7 +783,7 @@ bool QuicSentPacketManager::MaybeUpdateRTT(const QuicAckFrame& ack_frame, |
} |
// We calculate the RTT based on the highest ACKed packet number, the lower |
// packet numbers will include the ACK aggregation delay. |
- const TransmissionInfo& transmission_info = |
+ const QuicTransmissionInfo& transmission_info = |
unacked_packets_.GetTransmissionInfo(ack_frame.largest_observed); |
// Ensure the packet has a valid sent time. |
if (transmission_info.sent_time == QuicTime::Zero()) { |
@@ -1011,7 +1049,7 @@ size_t QuicSentPacketManager::GetConsecutiveTlpCount() const { |
return consecutive_tlp_count_; |
} |
-TransmissionInfo* QuicSentPacketManager::GetMutableTransmissionInfo( |
+QuicTransmissionInfo* QuicSentPacketManager::GetMutableTransmissionInfo( |
QuicPacketNumber packet_number) { |
return unacked_packets_.GetMutableTransmissionInfo(packet_number); |
} |
@@ -1024,4 +1062,8 @@ void QuicSentPacketManager::OnApplicationLimited() { |
send_algorithm_->OnApplicationLimited(unacked_packets_.bytes_in_flight()); |
} |
+const SendAlgorithmInterface* QuicSentPacketManager::GetSendAlgorithm() const { |
+ return send_algorithm_.get(); |
+} |
+ |
} // namespace net |