OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/congestion_control/bbr_sender.h" | 5 #include "net/quic/core/congestion_control/bbr_sender.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <sstream> | 8 #include <sstream> |
9 | 9 |
10 #include "net/quic/core/congestion_control/rtt_stats.h" | 10 #include "net/quic/core/congestion_control/rtt_stats.h" |
(...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
546 // Exit recovery when there are no losses for a round. | 546 // Exit recovery when there are no losses for a round. |
547 if (has_losses) { | 547 if (has_losses) { |
548 end_recovery_at_ = last_sent_packet_; | 548 end_recovery_at_ = last_sent_packet_; |
549 } | 549 } |
550 | 550 |
551 switch (recovery_state_) { | 551 switch (recovery_state_) { |
552 case NOT_IN_RECOVERY: | 552 case NOT_IN_RECOVERY: |
553 // Enter conservation on the first loss. | 553 // Enter conservation on the first loss. |
554 if (has_losses) { | 554 if (has_losses) { |
555 recovery_state_ = CONSERVATION; | 555 recovery_state_ = CONSERVATION; |
| 556 if (FLAGS_quic_reloadable_flag_quic_bbr_fix_conservation) { |
| 557 // This will cause the |recovery_window_| to be set to the correct |
| 558 // value in CalculateRecoveryWindow(). |
| 559 recovery_window_ = 0; |
| 560 QUIC_FLAG_COUNT_N(quic_reloadable_flag_quic_bbr_fix_conservation, 1, |
| 561 3); |
| 562 } |
556 // Since the conservation phase is meant to be lasting for a whole | 563 // Since the conservation phase is meant to be lasting for a whole |
557 // round, extend the current round as if it were started right now. | 564 // round, extend the current round as if it were started right now. |
558 current_round_trip_end_ = last_sent_packet_; | 565 current_round_trip_end_ = last_sent_packet_; |
559 } | 566 } |
560 break; | 567 break; |
561 | 568 |
562 case CONSERVATION: | 569 case CONSERVATION: |
563 if (is_round_start) { | 570 if (is_round_start) { |
564 recovery_state_ = GROWTH; | 571 recovery_state_ = GROWTH; |
565 } | 572 } |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
705 } | 712 } |
706 | 713 |
707 // Enforce the limits on the congestion window. | 714 // Enforce the limits on the congestion window. |
708 congestion_window_ = std::max(congestion_window_, kMinimumCongestionWindow); | 715 congestion_window_ = std::max(congestion_window_, kMinimumCongestionWindow); |
709 congestion_window_ = std::min(congestion_window_, max_congestion_window_); | 716 congestion_window_ = std::min(congestion_window_, max_congestion_window_); |
710 } | 717 } |
711 | 718 |
712 void BbrSender::CalculateRecoveryWindow(QuicByteCount bytes_acked) { | 719 void BbrSender::CalculateRecoveryWindow(QuicByteCount bytes_acked) { |
713 switch (recovery_state_) { | 720 switch (recovery_state_) { |
714 case CONSERVATION: | 721 case CONSERVATION: |
715 recovery_window_ = unacked_packets_->bytes_in_flight() + bytes_acked; | 722 if (FLAGS_quic_reloadable_flag_quic_bbr_fix_conservation) { |
| 723 QUIC_FLAG_COUNT_N(quic_reloadable_flag_quic_bbr_fix_conservation, 2, 3); |
| 724 recovery_window_ = |
| 725 std::max(unacked_packets_->bytes_in_flight() + bytes_acked, |
| 726 recovery_window_); |
| 727 } else { |
| 728 recovery_window_ = unacked_packets_->bytes_in_flight() + bytes_acked; |
| 729 } |
716 break; | 730 break; |
717 case GROWTH: | 731 case GROWTH: |
718 recovery_window_ = unacked_packets_->bytes_in_flight() + 2 * bytes_acked; | 732 if (FLAGS_quic_reloadable_flag_quic_bbr_fix_conservation) { |
| 733 QUIC_FLAG_COUNT_N(quic_reloadable_flag_quic_bbr_fix_conservation, 3, 3); |
| 734 recovery_window_ = |
| 735 std::max(unacked_packets_->bytes_in_flight() + 2 * bytes_acked, |
| 736 recovery_window_ + bytes_acked); |
| 737 } else { |
| 738 recovery_window_ = |
| 739 unacked_packets_->bytes_in_flight() + 2 * bytes_acked; |
| 740 } |
719 break; | 741 break; |
720 default: | 742 default: |
721 break; | 743 break; |
722 } | 744 } |
723 recovery_window_ = std::max(kMinimumCongestionWindow, recovery_window_); | 745 recovery_window_ = std::max(kMinimumCongestionWindow, recovery_window_); |
724 } | 746 } |
725 | 747 |
726 std::string BbrSender::GetDebugState() const { | 748 std::string BbrSender::GetDebugState() const { |
727 std::ostringstream stream; | 749 std::ostringstream stream; |
728 stream << ExportDebugState(); | 750 stream << ExportDebugState(); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
782 os << "Minimum RTT timestamp: " << state.min_rtt_timestamp.ToDebuggingValue() | 804 os << "Minimum RTT timestamp: " << state.min_rtt_timestamp.ToDebuggingValue() |
783 << std::endl; | 805 << std::endl; |
784 | 806 |
785 os << "Last sample is app-limited: " | 807 os << "Last sample is app-limited: " |
786 << (state.last_sample_is_app_limited ? "yes" : "no"); | 808 << (state.last_sample_is_app_limited ? "yes" : "no"); |
787 | 809 |
788 return os; | 810 return os; |
789 } | 811 } |
790 | 812 |
791 } // namespace net | 813 } // namespace net |
OLD | NEW |