Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Side by Side Diff: net/quic/core/quic_sent_packet_manager.cc

Issue 2228613002: Rollback of internal changelist 128865569. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@129053230
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/quic/core/quic_sent_packet_manager.h ('k') | net/quic/test_tools/quic_connection_peer.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/quic/core/quic_sent_packet_manager.h" 5 #include "net/quic/core/quic_sent_packet_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 24 matching lines...) Expand all
35 const size_t kMinTimeoutsBeforePathDegrading = 2; 35 const size_t kMinTimeoutsBeforePathDegrading = 2;
36 36
37 // Ensure the handshake timer isnt't faster than 10ms. 37 // Ensure the handshake timer isnt't faster than 10ms.
38 // This limits the tenth retransmitted packet to 10s after the initial CHLO. 38 // This limits the tenth retransmitted packet to 10s after the initial CHLO.
39 static const int64_t kMinHandshakeTimeoutMs = 10; 39 static const int64_t kMinHandshakeTimeoutMs = 10;
40 40
41 // Sends up to two tail loss probes before firing an RTO, 41 // Sends up to two tail loss probes before firing an RTO,
42 // per draft RFC draft-dukkipati-tcpm-tcp-loss-probe. 42 // per draft RFC draft-dukkipati-tcpm-tcp-loss-probe.
43 static const size_t kDefaultMaxTailLossProbes = 2; 43 static const size_t kDefaultMaxTailLossProbes = 2;
44 44
45 // Number of unpaced packets to send after quiescence.
46 static const size_t kInitialUnpacedBurst = 10;
47
45 bool HasCryptoHandshake(const TransmissionInfo& transmission_info) { 48 bool HasCryptoHandshake(const TransmissionInfo& transmission_info) {
46 DCHECK(!transmission_info.has_crypto_handshake || 49 DCHECK(!transmission_info.has_crypto_handshake ||
47 !transmission_info.retransmittable_frames.empty()); 50 !transmission_info.retransmittable_frames.empty());
48 return transmission_info.has_crypto_handshake; 51 return transmission_info.has_crypto_handshake;
49 } 52 }
50 53
51 } // namespace 54 } // namespace
52 55
53 #define ENDPOINT \ 56 #define ENDPOINT \
54 (perspective_ == Perspective::IS_SERVER ? "Server: " : "Client: ") 57 (perspective_ == Perspective::IS_SERVER ? "Server: " : "Client: ")
(...skipping 27 matching lines...) Expand all
82 receive_buffer_bytes_(kDefaultSocketReceiveBuffer), 85 receive_buffer_bytes_(kDefaultSocketReceiveBuffer),
83 least_packet_awaited_by_peer_(1), 86 least_packet_awaited_by_peer_(1),
84 first_rto_transmission_(0), 87 first_rto_transmission_(0),
85 consecutive_rto_count_(0), 88 consecutive_rto_count_(0),
86 consecutive_tlp_count_(0), 89 consecutive_tlp_count_(0),
87 consecutive_crypto_retransmission_count_(0), 90 consecutive_crypto_retransmission_count_(0),
88 pending_timer_transmission_count_(0), 91 pending_timer_transmission_count_(0),
89 max_tail_loss_probes_(kDefaultMaxTailLossProbes), 92 max_tail_loss_probes_(kDefaultMaxTailLossProbes),
90 enable_half_rtt_tail_loss_probe_(false), 93 enable_half_rtt_tail_loss_probe_(false),
91 using_pacing_(false), 94 using_pacing_(false),
92 using_inline_pacing_(false),
93 use_new_rto_(false), 95 use_new_rto_(false),
94 undo_pending_retransmits_(false), 96 undo_pending_retransmits_(false),
95 largest_newly_acked_(0), 97 largest_newly_acked_(0),
96 largest_mtu_acked_(0), 98 largest_mtu_acked_(0),
97 handshake_confirmed_(false) {} 99 handshake_confirmed_(false) {}
98 100
99 QuicSentPacketManager::~QuicSentPacketManager() {} 101 QuicSentPacketManager::~QuicSentPacketManager() {}
100 102
101 void QuicSentPacketManager::SetFromConfig(const QuicConfig& config) { 103 void QuicSentPacketManager::SetFromConfig(const QuicConfig& config) {
102 if (config.HasReceivedInitialRoundTripTimeUs() && 104 if (config.HasReceivedInitialRoundTripTimeUs() &&
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 188
187 void QuicSentPacketManager::SetNumOpenStreams(size_t num_streams) { 189 void QuicSentPacketManager::SetNumOpenStreams(size_t num_streams) {
188 if (n_connection_simulation_) { 190 if (n_connection_simulation_) {
189 // Ensure the number of connections is between 1 and 5. 191 // Ensure the number of connections is between 1 and 5.
190 send_algorithm_->SetNumEmulatedConnections( 192 send_algorithm_->SetNumEmulatedConnections(
191 min<size_t>(5, max<size_t>(1, num_streams))); 193 min<size_t>(5, max<size_t>(1, num_streams)));
192 } 194 }
193 } 195 }
194 196
195 void QuicSentPacketManager::SetMaxPacingRate(QuicBandwidth max_pacing_rate) { 197 void QuicSentPacketManager::SetMaxPacingRate(QuicBandwidth max_pacing_rate) {
196 if (using_inline_pacing_) { 198 if (using_pacing_) {
197 pacing_sender_.SetMaxPacingRate(max_pacing_rate);
198 } else if (using_pacing_) {
199 static_cast<PacingSender*>(send_algorithm_.get()) 199 static_cast<PacingSender*>(send_algorithm_.get())
200 ->SetMaxPacingRate(max_pacing_rate); 200 ->SetMaxPacingRate(max_pacing_rate);
201 } 201 }
202 } 202 }
203 203
204 void QuicSentPacketManager::SetHandshakeConfirmed() { 204 void QuicSentPacketManager::SetHandshakeConfirmed() {
205 handshake_confirmed_ = true; 205 handshake_confirmed_ = true;
206 } 206 }
207 207
208 void QuicSentPacketManager::OnIncomingAck(const QuicAckFrame& ack_frame, 208 void QuicSentPacketManager::OnIncomingAck(const QuicAckFrame& ack_frame,
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 least_packet_awaited_by_peer_ = ack_frame.packets.Min(); 276 least_packet_awaited_by_peer_ = ack_frame.packets.Min();
277 } 277 }
278 } 278 }
279 279
280 void QuicSentPacketManager::MaybeInvokeCongestionEvent( 280 void QuicSentPacketManager::MaybeInvokeCongestionEvent(
281 bool rtt_updated, 281 bool rtt_updated,
282 QuicByteCount bytes_in_flight) { 282 QuicByteCount bytes_in_flight) {
283 if (!rtt_updated && packets_acked_.empty() && packets_lost_.empty()) { 283 if (!rtt_updated && packets_acked_.empty() && packets_lost_.empty()) {
284 return; 284 return;
285 } 285 }
286 if (using_inline_pacing_) { 286 send_algorithm_->OnCongestionEvent(rtt_updated, bytes_in_flight,
287 pacing_sender_.OnCongestionEvent(rtt_updated, bytes_in_flight,
288 packets_acked_, packets_lost_); 287 packets_acked_, packets_lost_);
289 } else {
290 send_algorithm_->OnCongestionEvent(rtt_updated, bytes_in_flight,
291 packets_acked_, packets_lost_);
292 }
293 packets_acked_.clear(); 288 packets_acked_.clear();
294 packets_lost_.clear(); 289 packets_lost_.clear();
295 if (network_change_visitor_ != nullptr) { 290 if (network_change_visitor_ != nullptr) {
296 network_change_visitor_->OnCongestionChange(); 291 network_change_visitor_->OnCongestionChange();
297 } 292 }
298 } 293 }
299 294
300 void QuicSentPacketManager::HandleAckForSentPackets( 295 void QuicSentPacketManager::HandleAckForSentPackets(
301 const QuicAckFrame& ack_frame) { 296 const QuicAckFrame& ack_frame) {
302 // Go through the packets we have not received an ack for and see if this 297 // Go through the packets we have not received an ack for and see if this
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after
558 << "Cannot send empty packets."; 553 << "Cannot send empty packets.";
559 554
560 if (delegate_ == nullptr && original_packet_number != 0) { 555 if (delegate_ == nullptr && original_packet_number != 0) {
561 pending_retransmissions_.erase(original_packet_number); 556 pending_retransmissions_.erase(original_packet_number);
562 } 557 }
563 558
564 if (pending_timer_transmission_count_ > 0) { 559 if (pending_timer_transmission_count_ > 0) {
565 --pending_timer_transmission_count_; 560 --pending_timer_transmission_count_;
566 } 561 }
567 562
568 bool in_flight; 563 // TODO(ianswett): Remove sent_time, because it's unused.
569 if (using_inline_pacing_) { 564 const bool in_flight = send_algorithm_->OnPacketSent(
570 in_flight = pacing_sender_.OnPacketSent( 565 sent_time, unacked_packets_.bytes_in_flight(), packet_number,
571 sent_time, unacked_packets_.bytes_in_flight(), packet_number, 566 serialized_packet->encrypted_length, has_retransmittable_data);
572 serialized_packet->encrypted_length, has_retransmittable_data);
573 } else {
574 in_flight = send_algorithm_->OnPacketSent(
575 sent_time, unacked_packets_.bytes_in_flight(), packet_number,
576 serialized_packet->encrypted_length, has_retransmittable_data);
577 }
578 567
579 unacked_packets_.AddSentPacket(serialized_packet, original_packet_number, 568 unacked_packets_.AddSentPacket(serialized_packet, original_packet_number,
580 transmission_type, sent_time, in_flight); 569 transmission_type, sent_time, in_flight);
581 // Reset the retransmission timer anytime a pending packet is sent. 570 // Reset the retransmission timer anytime a pending packet is sent.
582 return in_flight; 571 return in_flight;
583 } 572 }
584 573
585 void QuicSentPacketManager::OnRetransmissionTimeout() { 574 void QuicSentPacketManager::OnRetransmissionTimeout() {
586 DCHECK(unacked_packets_.HasInFlightPackets()); 575 DCHECK(unacked_packets_.HasInFlightPackets());
587 DCHECK_EQ(0u, pending_timer_transmission_count_); 576 DCHECK_EQ(0u, pending_timer_transmission_count_);
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
779 } 768 }
780 769
781 QuicTime::Delta QuicSentPacketManager::TimeUntilSend(QuicTime now, 770 QuicTime::Delta QuicSentPacketManager::TimeUntilSend(QuicTime now,
782 QuicPathId* path_id) { 771 QuicPathId* path_id) {
783 QuicTime::Delta delay = QuicTime::Delta::Infinite(); 772 QuicTime::Delta delay = QuicTime::Delta::Infinite();
784 // The TLP logic is entirely contained within QuicSentPacketManager, so the 773 // The TLP logic is entirely contained within QuicSentPacketManager, so the
785 // send algorithm does not need to be consulted. 774 // send algorithm does not need to be consulted.
786 if (pending_timer_transmission_count_ > 0) { 775 if (pending_timer_transmission_count_ > 0) {
787 delay = QuicTime::Delta::Zero(); 776 delay = QuicTime::Delta::Zero();
788 } else { 777 } else {
789 if (using_inline_pacing_) { 778 delay =
790 delay = 779 send_algorithm_->TimeUntilSend(now, unacked_packets_.bytes_in_flight());
791 pacing_sender_.TimeUntilSend(now, unacked_packets_.bytes_in_flight());
792 } else {
793 delay = send_algorithm_->TimeUntilSend(
794 now, unacked_packets_.bytes_in_flight());
795 }
796 } 780 }
797 if (!delay.IsInfinite()) { 781 if (!delay.IsInfinite()) {
798 *path_id = path_id_; 782 *path_id = path_id_;
799 } 783 }
800 return delay; 784 return delay;
801 } 785 }
802 786
803 const QuicTime QuicSentPacketManager::GetRetransmissionTime() const { 787 const QuicTime QuicSentPacketManager::GetRetransmissionTime() const {
804 // Don't set the timer if there are no packets in flight or we've already 788 // Don't set the timer if there are no packets in flight or we've already
805 // queued a tlp transmission and it hasn't been sent yet. 789 // queued a tlp transmission and it hasn't been sent yet.
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
936 while (it != pending_retransmissions_.end()) { 920 while (it != pending_retransmissions_.end()) {
937 if (unacked_packets_.HasRetransmittableFrames(it->first)) { 921 if (unacked_packets_.HasRetransmittableFrames(it->first)) {
938 ++it; 922 ++it;
939 continue; 923 continue;
940 } 924 }
941 it = pending_retransmissions_.erase(it); 925 it = pending_retransmissions_.erase(it);
942 } 926 }
943 } 927 }
944 928
945 void QuicSentPacketManager::EnablePacing() { 929 void QuicSentPacketManager::EnablePacing() {
946 if (FLAGS_quic_use_inline_pacing) { 930 // TODO(ianswett): Replace with a method which wraps the send algorithm in a
947 using_inline_pacing_ = true; 931 // pacer every time a new algorithm is set.
948 pacing_sender_.SetSender(send_algorithm_.get(), false); 932 if (using_pacing_) {
949 } else { 933 return;
950 // TODO(ianswett): Replace with a method which wraps the send algorithm in a 934 }
951 // pacer every time a new algorithm is set.
952 if (using_pacing_) {
953 return;
954 }
955 935
956 // Set up a pacing sender with a 1 millisecond alarm granularity, the same 936 // Set up a pacing sender with a 1 millisecond alarm granularity, the same as
957 // as the default granularity of the Linux kernel's FQ qdisc. 937 // the default granularity of the Linux kernel's FQ qdisc.
958 using_pacing_ = true; 938 using_pacing_ = true;
959 PacingSender* pacing_sender = new PacingSender; 939 send_algorithm_.reset(new PacingSender(send_algorithm_.release(),
960 pacing_sender->SetSender(send_algorithm_.release(), true); 940 QuicTime::Delta::FromMilliseconds(1),
961 send_algorithm_.reset(pacing_sender); 941 kInitialUnpacedBurst));
962 }
963 } 942 }
964 943
965 void QuicSentPacketManager::OnConnectionMigration(QuicPathId, 944 void QuicSentPacketManager::OnConnectionMigration(QuicPathId,
966 PeerAddressChangeType type) { 945 PeerAddressChangeType type) {
967 if (type == PORT_CHANGE || type == IPV4_SUBNET_CHANGE) { 946 if (type == PORT_CHANGE || type == IPV4_SUBNET_CHANGE) {
968 // Rtt and cwnd do not need to be reset when the peer address change is 947 // Rtt and cwnd do not need to be reset when the peer address change is
969 // considered to be caused by NATs. 948 // considered to be caused by NATs.
970 return; 949 return;
971 } 950 }
972 consecutive_rto_count_ = 0; 951 consecutive_rto_count_ = 0;
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1019 TransmissionInfo* QuicSentPacketManager::GetMutableTransmissionInfo( 998 TransmissionInfo* QuicSentPacketManager::GetMutableTransmissionInfo(
1020 QuicPacketNumber packet_number) { 999 QuicPacketNumber packet_number) {
1021 return unacked_packets_.GetMutableTransmissionInfo(packet_number); 1000 return unacked_packets_.GetMutableTransmissionInfo(packet_number);
1022 } 1001 }
1023 1002
1024 void QuicSentPacketManager::RemoveObsoletePackets() { 1003 void QuicSentPacketManager::RemoveObsoletePackets() {
1025 unacked_packets_.RemoveObsoletePackets(); 1004 unacked_packets_.RemoveObsoletePackets();
1026 } 1005 }
1027 1006
1028 } // namespace net 1007 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/core/quic_sent_packet_manager.h ('k') | net/quic/test_tools/quic_connection_peer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698