2023-08-24 18:04:25 +02:00
|
|
|
#include "./cubic.hpp"
|
|
|
|
|
|
|
|
#include <cmath>
|
|
|
|
#include <iostream>
|
|
|
|
|
|
|
|
float CUBIC::getCWnD(void) const {
|
|
|
|
const double K = cbrt(
|
|
|
|
(_window_max * (1. - BETA)) / SCALING_CONSTANT
|
|
|
|
);
|
|
|
|
|
2023-08-30 13:45:09 +02:00
|
|
|
const double time_since_reduction = getTimeNow() - _time_point_reduction;
|
2023-08-30 03:03:43 +02:00
|
|
|
|
|
|
|
const double TK = time_since_reduction - K;
|
2023-08-24 18:04:25 +02:00
|
|
|
|
|
|
|
const double cwnd =
|
|
|
|
SCALING_CONSTANT
|
|
|
|
* TK * TK * TK // TK^3
|
|
|
|
+ _window_max
|
|
|
|
;
|
|
|
|
|
2023-08-30 13:45:09 +02:00
|
|
|
#if 0
|
2023-08-30 03:03:43 +02:00
|
|
|
std::cout
|
|
|
|
<< "K:" << K
|
|
|
|
<< " ts:" << time_since_reduction
|
|
|
|
<< " TK:" << TK
|
|
|
|
<< " cwnd:" << cwnd
|
|
|
|
<< " rtt:" << getCurrentDelay()
|
|
|
|
<< "\n"
|
|
|
|
;
|
2023-08-30 13:45:09 +02:00
|
|
|
#endif
|
2023-08-24 18:04:25 +02:00
|
|
|
|
2023-08-30 03:03:43 +02:00
|
|
|
return std::max<float>(cwnd, 2.f * MAXIMUM_SEGMENT_SIZE);
|
2023-08-24 18:04:25 +02:00
|
|
|
}
|
|
|
|
|
2023-08-30 03:03:43 +02:00
|
|
|
void CUBIC::onCongestion(void) {
|
2023-09-01 15:51:28 +02:00
|
|
|
if (getTimeNow() - _time_point_reduction >= getCurrentDelay()*4.f) {
|
2023-09-02 02:28:22 +02:00
|
|
|
const auto tmp_old_tp = getTimeNow() - _time_point_reduction;
|
|
|
|
|
2023-08-30 13:45:09 +02:00
|
|
|
const auto current_cwnd = getCWnD();
|
2023-09-08 00:41:25 +02:00
|
|
|
const auto current_wnd = getWindow(); // respects cwnd and fwnd
|
|
|
|
|
2023-08-30 13:45:09 +02:00
|
|
|
_time_point_reduction = getTimeNow();
|
2023-09-08 00:41:25 +02:00
|
|
|
//_window_max = current_cwnd * BETA;
|
|
|
|
_window_max = current_wnd * BETA;
|
2023-09-01 15:51:28 +02:00
|
|
|
_window_max = std::max(_window_max, 2.*MAXIMUM_SEGMENT_SIZE);
|
2023-08-24 18:04:25 +02:00
|
|
|
|
2023-09-01 17:34:05 +02:00
|
|
|
#if 1
|
2023-09-02 02:28:22 +02:00
|
|
|
std::cout << "----CONGESTION!"
|
2023-09-08 00:41:25 +02:00
|
|
|
<< " cwnd:" << current_cwnd
|
|
|
|
<< " wnd:" << current_wnd
|
2023-09-01 17:34:05 +02:00
|
|
|
<< " cwnd_max:" << _window_max
|
|
|
|
<< " pts:" << tmp_old_tp
|
|
|
|
<< " rtt:" << getCurrentDelay()
|
|
|
|
<< "\n"
|
|
|
|
;
|
|
|
|
#endif
|
2023-08-30 13:45:09 +02:00
|
|
|
}
|
2023-08-24 18:04:25 +02:00
|
|
|
}
|
|
|
|
|
2023-09-08 00:41:25 +02:00
|
|
|
float CUBIC::getWindow(void) {
|
|
|
|
return std::min<float>(getCWnD(), FlowOnly::getWindow());
|
|
|
|
}
|
|
|
|
|
2023-09-01 17:34:05 +02:00
|
|
|
int64_t CUBIC::canSend(void) {
|
2023-08-30 13:45:09 +02:00
|
|
|
const auto fspace_pkgs = FlowOnly::canSend();
|
2023-08-24 18:04:25 +02:00
|
|
|
|
2023-08-30 13:45:09 +02:00
|
|
|
if (fspace_pkgs == 0u) {
|
|
|
|
return 0u;
|
2023-08-30 03:03:43 +02:00
|
|
|
}
|
2023-08-24 18:04:25 +02:00
|
|
|
|
2023-08-30 13:45:09 +02:00
|
|
|
const int64_t cspace_bytes = getCWnD() - _in_flight_bytes;
|
|
|
|
if (cspace_bytes < MAXIMUM_SEGMENT_DATA_SIZE) {
|
2023-08-30 03:03:43 +02:00
|
|
|
return 0u;
|
|
|
|
}
|
2023-08-24 18:04:25 +02:00
|
|
|
|
2023-08-30 03:03:43 +02:00
|
|
|
// limit to whole packets
|
2023-09-01 17:34:05 +02:00
|
|
|
int64_t cspace_pkgs = (cspace_bytes / MAXIMUM_SEGMENT_DATA_SIZE) * MAXIMUM_SEGMENT_DATA_SIZE;
|
2023-08-24 18:04:25 +02:00
|
|
|
|
2023-08-30 13:45:09 +02:00
|
|
|
return std::min(cspace_pkgs, fspace_pkgs);
|
2023-08-24 18:04:25 +02:00
|
|
|
}
|
|
|
|
|