12 #ifndef hifi_CongestionControl_h
13 #define hifi_CongestionControl_h
19 #include <PortableHighResolutionClock.h>
22 #include "SequenceNumber.h"
26 static const int32_t DEFAULT_SYN_INTERVAL = 2000000;
31 class CongestionControl {
32 friend class Connection;
35 CongestionControl() =
default;
36 virtual ~CongestionControl() =
default;
38 void setMaxBandwidth(
int maxBandwidth);
40 virtual void init() {}
43 virtual bool onACK(SequenceNumber ackNum, p_high_resolution_clock::time_point receiveTime) {
return false; }
45 virtual void onTimeout() {}
47 virtual void onPacketSent(
int wireSize, SequenceNumber seqNum, p_high_resolution_clock::time_point timePoint) {}
48 virtual void onPacketReSent(
int wireSize, SequenceNumber seqNum, p_high_resolution_clock::time_point timePoint) {}
50 virtual int estimatedTimeout()
const = 0;
52 virtual int roundTripTime() {
return _roundTripTime; }
55 void setMSS(
int mss) { _mss = mss; }
56 virtual void setInitialSendSequenceNumber(SequenceNumber seqNum) = 0;
57 void setSendCurrentSequenceNumber(SequenceNumber seqNum) { _sendCurrSeqNum = seqNum; }
58 void setPacketSendPeriod(
double newSendPeriod);
60 double _packetSendPeriod { 1.0 };
61 int _roundTripTime { -1 };
62 int _congestionWindowSize { 16 };
64 std::atomic<int> _maxBandwidth { -1 };
67 SequenceNumber _sendCurrSeqNum;
70 Q_DISABLE_COPY(CongestionControl);
74 class CongestionControlVirtualFactory {
76 virtual ~CongestionControlVirtualFactory() {}
78 virtual std::unique_ptr<CongestionControl> create() = 0;
81 template <
class T>
class CongestionControlFactory:
public CongestionControlVirtualFactory {
83 virtual ~CongestionControlFactory() {}
84 virtual std::unique_ptr<CongestionControl> create()
override {
return std::unique_ptr<T>(
new T()); }