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 = 10000;
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;
53 void setMSS(
int mss) { _mss = mss; }
54 virtual void setInitialSendSequenceNumber(SequenceNumber seqNum) = 0;
55 void setSendCurrentSequenceNumber(SequenceNumber seqNum) { _sendCurrSeqNum = seqNum; }
56 void setPacketSendPeriod(
double newSendPeriod);
58 double _packetSendPeriod { 1.0 };
59 int _congestionWindowSize { 16 };
61 std::atomic<int> _maxBandwidth { -1 };
64 SequenceNumber _sendCurrSeqNum;
67 Q_DISABLE_COPY(CongestionControl);
71 class CongestionControlVirtualFactory {
73 virtual ~CongestionControlVirtualFactory() {}
75 virtual std::unique_ptr<CongestionControl> create() = 0;
78 template <
class T>
class CongestionControlFactory:
public CongestionControlVirtualFactory {
80 virtual ~CongestionControlFactory() {}
81 virtual std::unique_ptr<CongestionControl> create()
override {
return std::unique_ptr<T>(
new T()); }