#pragma once #include #include #include "PacketStructs.h" namespace tgvoip { #define SEQ_MAX 0xFFFFFFFF inline bool seqgt(uint32_t s1, uint32_t s2) { return ((s1 > s2) && (s1 - s2 <= SEQ_MAX / 2)) || ((s1 < s2) && (s2 - s1 > SEQ_MAX / 2)); } inline bool seqgte(uint32_t s1, uint32_t s2) { return s1 == s2 || seqgt(s1, s2); } // Local and remote packet history management struct PacketManager { PacketManager(); /* Local seqno ack */ // Ack specified local seq + up to 32 seqs ago, specified by mask void ackLocal(uint32_t ackId, uint32_t mask); // Check if local seq was acked bool wasLocalAcked(uint32_t seq); // Get next local seqno inline uint32_t nextLocalSeq() { return seq++; } // Get current local seqno inline uint32_t getLocalSeq() { return seq; } private: // Stream-specific local seqno std::atomic seq = ATOMIC_VAR_INIT(1); public: // Recent ougoing packets std::vector recentOutgoingPackets; // Seqno of last sent local packet uint32_t lastSentSeq = 0; // Status list of acked local seqnos, starting from the seq explicitly present in the packet + up to 32 seqs ago std::array peerAcks{0}; /* Remote seqno ack */ // Ack specified remote seq, returns false if too old or dupe bool ackRemoteSeq(uint32_t ackId); // Get ack mask for remote packets uint32_t getRemoteAckMask(); // Seqno of last received remote packet uint32_t lastRemoteSeq = 0; private: // Slowly encapsulate all the things // Recent incoming remote packets std::list recentIncomingSeqs; }; } // namespace tgvoip