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
Yang Chi c0a659a30a Replace pacing related callsites with new Pacer interface
Summary:
Use the new Pacer interface in the transport where we currently
directly use CongestinoController interrace for paciner related APIs.

Reviewed By: mjoras

Differential Revision: D16918672

fbshipit-source-id: 410f72d567e71bdd3279e344f6e9abf5e132518e
2019-08-30 19:30:44 -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::min(
conn.transportSettings.maxBurstPackets,
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