13 #ifndef hifi_Connection_h
14 #define hifi_Connection_h
19 #include <QtCore/QObject>
21 #include <PortableHighResolutionClock.h>
23 #include "ConnectionStats.h"
24 #include "Constants.h"
26 #include "SendQueue.h"
27 #include "../SockAddr.h"
31 class CongestionControl;
37 class PendingReceivedMessage {
39 void enqueuePacket(std::unique_ptr<Packet> packet);
40 bool hasAvailablePackets()
const;
41 std::unique_ptr<Packet> removeNextPacket();
43 std::list<std::unique_ptr<Packet>> _packets;
46 Packet::MessagePartNumber _nextPartNumber = 0;
49 class Connection :
public QObject {
52 using ControlPacketPointer = std::unique_ptr<ControlPacket>;
54 Connection(Socket* parentSocket, SockAddr destination, std::unique_ptr<CongestionControl> congestionControl);
55 virtual ~Connection();
57 void sendReliablePacket(std::unique_ptr<Packet> packet);
58 void sendReliablePacketList(std::unique_ptr<PacketList> packet);
63 bool processReceivedSequenceNumber(SequenceNumber sequenceNumber,
int packetSize,
int payloadSize);
64 void processControl(ControlPacketPointer controlPacket);
66 void queueReceivedMessagePacket(std::unique_ptr<Packet> packet);
68 ConnectionStats::Stats sampleStats() {
return _stats.sample(); }
70 SockAddr getDestination()
const {
return _destination; }
72 void setMaxBandwidth(
int maxBandwidth);
74 void sendHandshakeRequest();
75 bool hasReceivedHandshake()
const {
return _hasReceivedHandshake; }
77 void recordSentUnreliablePackets(
int wireSize,
int payloadSize);
78 void recordReceivedUnreliablePackets(
int wireSize,
int payloadSize);
79 void setDestinationAddress(
const SockAddr& destination);
83 void receiverHandshakeRequestComplete(
const SockAddr& sockAddr);
84 void destinationAddressChange(SockAddr currentAddress);
87 void recordSentPackets(
int wireSize,
int payloadSize, SequenceNumber seqNum, p_high_resolution_clock::time_point timePoint);
88 void recordRetransmission(
int wireSize,
int payloadSize, SequenceNumber sequenceNumber, p_high_resolution_clock::time_point timePoint);
96 void processACK(ControlPacketPointer controlPacket);
97 void processHandshake(ControlPacketPointer controlPacket);
98 void processHandshakeACK(ControlPacketPointer controlPacket);
100 void resetReceiveState();
102 SendQueue& getSendQueue();
103 SequenceNumber nextACK()
const;
105 void updateCongestionControlAndSendQueue(std::function<
void()> congestionCallback);
107 void stopSendQueue();
109 bool _hasReceivedHandshake {
false };
110 bool _hasReceivedHandshakeACK {
false };
111 bool _didRequestHandshake {
false };
113 SequenceNumber _initialSequenceNumber;
114 SequenceNumber _initialReceiveSequenceNumber;
116 MessageNumber _lastMessageNumber { 0 };
119 SequenceNumber _lastReceivedSequenceNumber;
120 SequenceNumber _lastReceivedACK;
122 Socket* _parentSocket {
nullptr };
123 SockAddr _destination;
125 std::unique_ptr<CongestionControl> _congestionControl;
127 std::unique_ptr<SendQueue> _sendQueue;
129 std::map<MessageNumber, PendingReceivedMessage> _pendingReceivedMessages;
132 ControlPacketPointer _ackPacket;
133 ControlPacketPointer _handshakeACK;
135 ConnectionStats _stats;