1
0
mirror of https://github.com/danog/libtgvoip.git synced 2024-12-04 02:27:46 +01:00
libtgvoip/controller/protocol/packets/PacketStructs.h

190 lines
5.9 KiB
C
Raw Normal View History

2020-01-28 13:18:38 +01:00
#pragma once
2020-03-21 21:33:51 +01:00
#include "../../../tools/Buffers.h"
#include "../../PrivateDefines.h"
2020-03-24 12:15:04 +01:00
#include "../../net/CongestionControl.h"
2020-03-21 21:33:51 +01:00
#include "../protocol/Extra.h"
#include "../protocol/Interface.h"
2020-03-24 12:15:04 +01:00
#include <vector>
2020-01-28 13:18:38 +01:00
//#include "../net/PacketSender.h"
namespace tgvoip
{
class PacketSender;
2020-03-22 21:25:02 +01:00
class PacketManager;
2020-03-24 12:15:04 +01:00
struct OutgoingPacket
2020-03-22 21:25:02 +01:00
{
2020-03-24 12:15:04 +01:00
OutgoingPacket(Packet &&packet_, int64_t endpoint_ = 0)
: packet(std::move(packet_)),
endpoint(endpoint_)
2020-03-22 21:25:02 +01:00
{
}
2020-03-24 12:15:04 +01:00
TGVOIP_MOVE_ONLY(OutgoingPacket);
TGVOIP_DISALLOW_COPY_AND_ASSIGN(OutgoingPacket);
Packet packet;
int64_t endpoint = 0;
};
struct PendingOutgoingPacket
{
PendingOutgoingPacket(std::shared_ptr<Buffer> &&_packet, CongestionControlPacket &&_pktInfo, int64_t _endpoint) : packet(std::move(_packet)),
pktInfo(std::move(pktInfo)),
endpoint(_endpoint){};
//TGVOIP_MOVE_ONLY(PendingOutgoingPacket);
//TGVOIP_DISALLOW_COPY_AND_ASSIGN(PendingOutgoingPacket);
std::shared_ptr<Buffer> packet;
CongestionControlPacket pktInfo;
int64_t endpoint = 0;
2020-03-22 21:25:02 +01:00
};
struct ReliableOutgoingPacket
{
2020-03-24 12:15:04 +01:00
PendingOutgoingPacket pkt;
2020-03-22 21:25:02 +01:00
double firstSentTime;
double lastSentTime;
double retryInterval;
double timeout;
uint8_t tries;
};
2020-03-24 12:15:04 +01:00
2020-03-24 15:07:56 +01:00
struct RecentOutgoingPacket
{
RecentOutgoingPacket(const PendingOutgoingPacket &_pkt) : pkt(_pkt.pktInfo),
size(_pkt.packet->Length()),
endpoint(_pkt.endpoint),
sendTime(VoIPController::GetCurrentTime()){};
CongestionControlPacket pkt;
size_t size;
int64_t endpoint;
uint16_t id; // for group calls only
double sendTime;
double ackTime = 0.0;
double rttTime = 0.0;
bool lost = false;
};
2020-03-24 12:15:04 +01:00
struct UnacknowledgedExtraData
2020-03-22 21:25:02 +01:00
{
2020-03-24 12:15:04 +01:00
UnacknowledgedExtraData(Wrapped<Extra> &&data_, int64_t _endpointId = 0)
: data(std::move(data_)),
endpointId(_endpointId)
2020-03-22 21:25:02 +01:00
{
}
2020-03-17 20:11:27 +01:00
2020-03-24 12:15:04 +01:00
TGVOIP_DISALLOW_COPY_AND_ASSIGN(UnacknowledgedExtraData);
Wrapped<Extra> data;
2020-03-24 17:10:40 +01:00
HistoricBuffer<uint32_t, 16> seqs{};
2020-03-24 12:15:04 +01:00
int64_t endpointId = 0;
};
2020-03-18 21:43:44 +01:00
struct Packet : public Serializable, SingleChoice<Packet>
2020-03-17 20:11:27 +01:00
{
public:
2020-03-18 21:43:44 +01:00
bool parse(const BufferInputStream &in, const VersionInfo &ver) override;
void serialize(BufferOutputStream &out, const VersionInfo &ver) const override;
private:
bool parseLegacy(const BufferInputStream &in, const VersionInfo &ver);
bool parseLegacyLegacy(const BufferInputStream &in, unsigned char &type, uint32_t &ackId, uint32_t &pseq, uint32_t &acks, unsigned char &pflags, size_t &packetInnerLen, int peerVersion);
2020-03-17 20:11:27 +01:00
2020-03-21 15:08:03 +01:00
public:
2020-03-21 21:33:51 +01:00
void serializeLegacy(std::vector<std::tuple<unsigned char *, size_t, bool>> &out, const VersionInfo &ver, const int state, const unsigned char *callID);
2020-03-21 15:08:03 +01:00
private:
void writePacketHeaderLegacy(BufferOutputStream &out, const VersionInfo &ver, const uint32_t seq, const uint32_t ackSeq, const uint32_t ackMask, const unsigned char type, const std::vector<Wrapped<Extra>> &extras);
void writePacketHeaderLegacyLegacy(BufferOutputStream &out, const VersionInfo &ver, const uint32_t pseq, const uint32_t ackSeq, const uint32_t ackMask, const unsigned char type, const uint32_t length, const std::vector<Wrapped<Extra>> &extras, const int state, const unsigned char *callID);
2020-03-22 21:25:02 +01:00
public:
2020-03-24 12:15:04 +01:00
void prepare(PacketManager &pm);
void prepare(PacketManager &pm, std::vector<UnacknowledgedExtraData> &currentExtras, const int64_t &endpointId);
2020-03-24 17:10:40 +01:00
void prepare(PacketManager &pm, std::vector<UnacknowledgedExtraData> &currentExtras, const int64_t &endpointId, PacketManager &legacyPm, const int peerVersion);
2020-03-24 12:15:04 +01:00
2020-03-17 20:11:27 +01:00
public:
enum Flags : uint8_t
{
Len16 = 1,
2020-03-18 21:43:44 +01:00
RecvTS = 2,
ExtraEC = 4,
2020-03-18 21:43:44 +01:00
ExtraSignaling = 8
2020-03-17 20:11:27 +01:00
};
enum EFlags : uint8_t
{
Fragmented = 1,
Keyframe = 2
};
enum StreamId : uint8_t
{
Signaling = 0,
Audio = 1,
Video = 2,
Extended = 3
};
bool legacy = false;
uint32_t legacySeq = 0;
2020-03-24 12:15:04 +01:00
bool nopPacket = true;
uint32_t seq = 0;
uint32_t ackSeq = 0;
uint32_t ackMask = 0;
2020-03-16 16:07:13 +01:00
uint8_t streamId = 0;
2020-03-17 20:11:27 +01:00
uint8_t eFlags = 0;
uint8_t fragmentIndex = 0;
uint8_t fragmentCount = 1;
2020-03-17 20:11:27 +01:00
uint32_t recvTS = 0;
2020-03-16 16:07:13 +01:00
Buffer data;
2020-03-17 20:11:27 +01:00
Mask<Wrapped<Bytes>> extraEC;
2020-03-18 21:43:44 +01:00
Array<Wrapped<Extra>> extraSignaling;
2020-03-21 15:08:03 +01:00
// Ugly backwards compatibility hacks
std::vector<Packet> otherPackets; // parse
public:
2020-03-21 15:08:03 +01:00
operator bool()
{
2020-03-24 12:15:04 +01:00
return data || extraEC || extraSignaling || nopPacket;
}
2020-03-22 20:09:44 +01:00
std::string print() const override
{
std::stringstream res;
2020-03-24 12:15:04 +01:00
res << data ? "Data packet" : extraEC ? "EC packet" : extraSignaling ? "Signaling packet" : nopPacket ? "NOP packet" : "Empty packet";
2020-03-22 20:09:44 +01:00
res << "(streamId=" << streamId << ")";
if (extraEC)
res << "; extraEC";
if (extraSignaling)
res << "; signaling " + extraSignaling.print();
return res.str();
}
size_t getSize(const VersionInfo &ver) const override
{
if (!ver.isNew())
return 0; // Don't even try
return sizeof(seq) +
sizeof(ackSeq) +
sizeof(ackMask) +
sizeof(streamId) +
(streamId > StreamId::Extended ? sizeof(streamId) : 0) +
(data.Length() > 0xFF || eFlags ? 2 : 1) + // Length
(recvTS ? sizeof(recvTS) : 0) +
(extraEC ? extraEC.getSize(ver) : 0) +
(extraSignaling ? extraSignaling.getSize(ver) : 0);
}
2020-03-17 20:11:27 +01:00
};
2020-03-22 20:09:44 +01:00
using StreamId = Packet::StreamId;
2020-01-28 13:18:38 +01:00
/*
struct DebugLoggedPacket
{
int32_t seq;
double timestamp;
int32_t length;
};
*/
} // namespace tgvoip