From 319e754aff027eb831c8b3fdd3cd9731e45dda7c Mon Sep 17 00:00:00 2001 From: Green Sky Date: Mon, 27 May 2024 11:59:32 +0200 Subject: [PATCH] rework time since reduction to only grow if cca is active, also start warm --- solanaceae/ngc_ft1/cubic.cpp | 25 +++++++++++++++++++------ solanaceae/ngc_ft1/cubic.hpp | 6 +++++- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/solanaceae/ngc_ft1/cubic.cpp b/solanaceae/ngc_ft1/cubic.cpp index 2a930c8..42f4727 100644 --- a/solanaceae/ngc_ft1/cubic.cpp +++ b/solanaceae/ngc_ft1/cubic.cpp @@ -3,14 +3,25 @@ #include #include +void CUBIC::updateReductionTimer(float time_delta) { + const auto now {getTimeNow()}; + + // only keep updating while the cca interaction is not too long ago + if (now - _time_point_last_update <= getCurrentDelay()*2.f) { + _time_since_reduction += time_delta; + } +} + +void CUBIC::resetReductionTimer(void) { + _time_since_reduction = 0.f; +} + float CUBIC::getCWnD(void) const { const double K = cbrt( (_window_max * (1. - BETA)) / SCALING_CONSTANT ); - const double time_since_reduction = getTimeNow() - _time_point_reduction; - - const double TK = time_since_reduction - K; + const double TK = _time_since_reduction - K; const double cwnd = SCALING_CONSTANT @@ -34,13 +45,13 @@ float CUBIC::getCWnD(void) const { void CUBIC::onCongestion(void) { // 8 is probably too much (800ms for 100ms rtt) - if (getTimeNow() - _time_point_reduction >= getCurrentDelay()*4.f) { - const auto tmp_old_tp = getTimeNow() - _time_point_reduction; + if (_time_since_reduction >= getCurrentDelay()*4.f) { + const auto tmp_old_tp = _time_since_reduction; const auto current_cwnd = getCWnD(); // TODO: remove, only used by logging? const auto current_wnd = getWindow(); // respects cwnd and fwnd - _time_point_reduction = getTimeNow(); + resetReductionTimer(); if (current_cwnd < _window_max) { // congestion before reaching the inflection point (prev window_max). @@ -72,6 +83,8 @@ float CUBIC::getWindow(void) { int64_t CUBIC::canSend(float time_delta) { const auto fspace_pkgs = FlowOnly::canSend(time_delta); + updateReductionTimer(time_delta); + if (fspace_pkgs == 0u) { return 0u; } diff --git a/solanaceae/ngc_ft1/cubic.hpp b/solanaceae/ngc_ft1/cubic.hpp index f76518d..621800d 100644 --- a/solanaceae/ngc_ft1/cubic.hpp +++ b/solanaceae/ngc_ft1/cubic.hpp @@ -17,9 +17,13 @@ struct CUBIC : public FlowOnly { // window size before last reduciton double _window_max {2.f * MAXIMUM_SEGMENT_SIZE}; // start with mss*2 //double _window_last_max {2.f * MAXIMUM_SEGMENT_SIZE}; - double _time_point_reduction {getTimeNow()}; + + double _time_since_reduction {12.f}; // warm start private: + void updateReductionTimer(float time_delta); + void resetReductionTimer(void); + float getCWnD(void) const; // moving avg over the last few delay samples