1
0
mirror of https://github.com/facebookincubator/mvfst.git synced 2025-08-09 20:42:44 +03:00
Files
mvfst/quic/congestion_control/CongestionControlFunctions.cpp
Xiaoting Tang 2d00d56fbd Put outstanding packets, events and associated counters in one class
Summary: ^

Reviewed By: yangchi

Differential Revision: D21956286

fbshipit-source-id: 305b879ad11df23aae8e0c3aac4645c0136b3012
2020-06-10 12:45:28 -07:00

58 lines
1.8 KiB
C++

/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*/
#include <quic/congestion_control/CongestionControlFunctions.h>
#include <quic/QuicConstants.h>
#include <quic/common/TimeUtil.h>
#include <algorithm>
namespace quic {
uint64_t boundedCwnd(
uint64_t cwndBytes,
uint64_t packetLength,
uint64_t maxCwndInMss,
uint64_t minCwndInMss) noexcept {
return std::max(
std::min(cwndBytes, maxCwndInMss * packetLength),
minCwndInMss * packetLength);
}
PacingRate calculatePacingRate(
const QuicConnectionStateBase& conn,
uint64_t cwnd,
uint64_t minCwndInMss,
std::chrono::microseconds rtt) {
if (conn.transportSettings.pacingTimerTickInterval > rtt) {
// We cannot really pace in this case.
return PacingRate::Builder()
.setInterval(0us)
.setBurstSize(conn.transportSettings.writeConnectionDataPacketsLimit)
.build();
}
uint64_t cwndInPackets = std::max(minCwndInMss, cwnd / conn.udpSendPacketLen);
// Each interval we want to send cwndInpackets / (rtt / minimalInverval)
// number of packets.
uint64_t burstPerInterval = std::max(
conn.transportSettings.minBurstPackets,
static_cast<uint64_t>(std::ceil(
static_cast<double>(cwndInPackets) *
static_cast<double>(
conn.transportSettings.pacingTimerTickInterval.count()) /
static_cast<double>(rtt.count()))));
auto interval = timeMax(
conn.transportSettings.pacingTimerTickInterval,
rtt * burstPerInterval / cwndInPackets);
return PacingRate::Builder()
.setInterval(interval)
.setBurstSize(burstPerInterval)
.build();
}
} // namespace quic