quic/congestion_control/NewReno.h (45 lines of code) (raw):
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
#include <quic/QuicException.h>
#include <quic/congestion_control/CongestionController.h>
#include <quic/state/AckEvent.h>
#include <quic/state/StateData.h>
#include <limits>
namespace quic {
class NewReno : public CongestionController {
public:
explicit NewReno(QuicConnectionStateBase& conn);
void onRemoveBytesFromInflight(uint64_t) override;
void onPacketSent(const OutstandingPacket& packet) override;
void onPacketAckOrLoss(
const AckEvent* FOLLY_NULLABLE,
const LossEvent* FOLLY_NULLABLE) override;
void onPacketAckOrLoss(
folly::Optional<AckEvent> ack,
folly::Optional<LossEvent> loss) {
onPacketAckOrLoss(ack.get_pointer(), loss.get_pointer());
}
uint64_t getWritableBytes() const noexcept override;
uint64_t getCongestionWindow() const noexcept override;
void setAppIdle(bool, TimePoint) noexcept override;
void setAppLimited() override;
void setBandwidthUtilizationFactor(
float /*bandwidthUtilizationFactor*/) noexcept override {}
bool isInBackgroundMode() const noexcept override {
return false;
}
CongestionControlType type() const noexcept override;
bool inSlowStart() const noexcept;
uint64_t getBytesInFlight() const noexcept;
bool isAppLimited() const noexcept override;
void getStats(CongestionControllerStats& /*stats*/) const override {}
private:
void onPacketLoss(const LossEvent&);
void onAckEvent(const AckEvent&);
void onPacketAcked(const CongestionController::AckEvent::AckPacket&);
private:
QuicConnectionStateBase& conn_;
uint64_t ssthresh_;
uint64_t cwndBytes_;
folly::Optional<TimePoint> endOfRecovery_;
};
} // namespace quic