2020-03-17 20:11:27 +01:00
|
|
|
#include "PacketStructs.h"
|
2020-03-25 15:49:13 +01:00
|
|
|
#include "../../../VoIPController.h"
|
2020-03-22 21:25:02 +01:00
|
|
|
#include "PacketManager.h"
|
2020-03-17 20:11:27 +01:00
|
|
|
|
|
|
|
using namespace tgvoip;
|
|
|
|
|
2020-03-18 19:54:56 +01:00
|
|
|
bool Packet::parse(const BufferInputStream &in, const VersionInfo &ver)
|
2020-03-17 20:11:27 +01:00
|
|
|
{
|
2020-03-18 19:54:56 +01:00
|
|
|
if (!ver.isNew())
|
2020-03-17 20:11:27 +01:00
|
|
|
{
|
2020-03-18 21:43:44 +01:00
|
|
|
return parseLegacy(in, ver);
|
2020-03-17 20:11:27 +01:00
|
|
|
}
|
2020-03-19 14:20:01 +01:00
|
|
|
|
2020-03-27 19:13:37 +01:00
|
|
|
uint16_t length = 0;
|
2020-03-19 17:43:50 +01:00
|
|
|
uint8_t flags;
|
2020-03-19 14:20:01 +01:00
|
|
|
bool res = in.TryRead(seq) &&
|
|
|
|
in.TryRead(ackSeq) &&
|
|
|
|
in.TryRead(ackMask) &&
|
|
|
|
in.TryRead(flags);
|
|
|
|
if (!res)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
streamId = flags & 3;
|
|
|
|
flags >>= 2;
|
|
|
|
|
2020-03-27 19:13:37 +01:00
|
|
|
if (!(flags & Flags::Reserved))
|
|
|
|
{
|
|
|
|
LOGW("No reserved flag in new flag, probably legacy packet");
|
|
|
|
return false;
|
|
|
|
}
|
2020-03-19 17:43:50 +01:00
|
|
|
if (streamId == StreamId::Extended && !in.TryRead(streamId))
|
|
|
|
return false;
|
2020-03-19 14:20:01 +01:00
|
|
|
if (!(flags & Flags::Len16 ? in.TryRead(length) : in.TryReadCompat<uint8_t>(length)))
|
|
|
|
return false;
|
|
|
|
|
|
|
|
eFlags = length >> 11;
|
|
|
|
length &= 0x7FF;
|
|
|
|
|
|
|
|
if (eFlags & EFlags::Fragmented)
|
|
|
|
{
|
|
|
|
if (!in.TryRead(fragmentCount))
|
|
|
|
return false;
|
|
|
|
if (!in.TryRead(fragmentIndex))
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2020-03-26 17:42:34 +01:00
|
|
|
if (length)
|
|
|
|
{
|
|
|
|
data = std::make_unique<Buffer>(length);
|
|
|
|
if (!in.TryRead(*data))
|
|
|
|
return false;
|
|
|
|
}
|
2020-03-27 19:13:37 +01:00
|
|
|
|
2020-03-19 14:20:01 +01:00
|
|
|
if ((flags & Flags::RecvTS) && !in.TryRead(recvTS))
|
|
|
|
return false;
|
2020-03-19 17:43:50 +01:00
|
|
|
if ((flags & Flags::ExtraEC) && !in.TryRead(extraEC, ver))
|
2020-03-19 14:20:01 +01:00
|
|
|
return false;
|
|
|
|
if ((flags & Flags::ExtraSignaling) && !in.TryRead(extraSignaling, ver))
|
|
|
|
return false;
|
2020-03-19 17:43:50 +01:00
|
|
|
|
2020-03-19 14:20:01 +01:00
|
|
|
return true;
|
2020-03-17 20:11:27 +01:00
|
|
|
}
|
|
|
|
|
2020-03-19 17:43:50 +01:00
|
|
|
void Packet::serialize(BufferOutputStream &out, const VersionInfo &ver) const
|
2020-03-17 20:11:27 +01:00
|
|
|
{
|
2020-03-19 17:43:50 +01:00
|
|
|
uint8_t shortStreamId = streamId > StreamId::Extended ? StreamId::Extended : streamId;
|
2020-03-27 19:13:37 +01:00
|
|
|
uint8_t flags = Flags::Reserved; // Always true, allows us to distinguish from legacy packets if the maxLayer is wrong.
|
2020-03-25 21:38:07 +01:00
|
|
|
size_t length = data ? data->Length() : 0;
|
|
|
|
|
|
|
|
if (length > 0xFF || eFlags)
|
2020-03-19 17:43:50 +01:00
|
|
|
flags |= Flags::Len16;
|
|
|
|
if (recvTS)
|
|
|
|
flags |= Flags::RecvTS;
|
|
|
|
if (extraEC)
|
|
|
|
flags |= Flags::ExtraEC;
|
|
|
|
if (extraSignaling)
|
|
|
|
flags |= Flags::ExtraSignaling;
|
|
|
|
|
|
|
|
out.WriteUInt32(seq);
|
|
|
|
out.WriteUInt32(ackSeq);
|
|
|
|
out.WriteUInt32(ackMask);
|
|
|
|
out.WriteByte(shortStreamId | (flags << 2));
|
|
|
|
|
|
|
|
if (shortStreamId == StreamId::Extended)
|
|
|
|
out.WriteByte(streamId);
|
|
|
|
|
|
|
|
if (flags & Flags::Len16)
|
2020-03-25 21:38:07 +01:00
|
|
|
out.WriteUInt16(length | (eFlags << 11));
|
2020-03-17 20:11:27 +01:00
|
|
|
else
|
2020-03-25 21:38:07 +01:00
|
|
|
out.WriteByte(length);
|
2020-03-22 21:25:02 +01:00
|
|
|
|
2020-03-25 21:38:07 +01:00
|
|
|
if (length)
|
|
|
|
out.WriteBytes(*data);
|
2020-03-19 17:43:50 +01:00
|
|
|
|
|
|
|
if (flags & Flags::RecvTS)
|
|
|
|
out.WriteUInt32(recvTS);
|
|
|
|
if (flags & Flags::ExtraEC)
|
|
|
|
out.Write(extraEC, ver);
|
|
|
|
if (flags & Flags::ExtraSignaling)
|
|
|
|
out.Write(extraSignaling, ver);
|
|
|
|
}
|
2020-03-17 20:11:27 +01:00
|
|
|
|
2020-03-24 12:15:04 +01:00
|
|
|
void Packet::prepare(PacketManager &pm)
|
2020-03-22 21:25:02 +01:00
|
|
|
{
|
|
|
|
if (!seq)
|
|
|
|
{
|
|
|
|
seq = pm.nextLocalSeq();
|
|
|
|
ackSeq = pm.getLastRemoteSeq();
|
|
|
|
ackMask = pm.getRemoteAckMask();
|
2020-03-26 17:42:34 +01:00
|
|
|
streamId = pm.transportId;
|
2020-03-22 21:25:02 +01:00
|
|
|
}
|
2020-03-24 12:15:04 +01:00
|
|
|
}
|
|
|
|
void Packet::prepare(PacketManager &pm, std::vector<UnacknowledgedExtraData> ¤tExtras, const int64_t &endpointId)
|
|
|
|
{
|
|
|
|
prepare(pm);
|
2020-03-25 21:38:07 +01:00
|
|
|
extraSignaling.v.clear();
|
|
|
|
for (auto &extra : currentExtras)
|
|
|
|
{
|
|
|
|
if (!extra.endpointId || extra.endpointId == endpointId)
|
|
|
|
{
|
|
|
|
extraSignaling.v.push_back(extra.data);
|
|
|
|
extra.seqs.Add(seq);
|
|
|
|
}
|
|
|
|
}
|
2020-03-24 12:15:04 +01:00
|
|
|
}
|
2020-03-24 17:10:40 +01:00
|
|
|
void Packet::prepare(PacketManager &pm, std::vector<UnacknowledgedExtraData> ¤tExtras, const int64_t &endpointId, PacketManager &legacyPm, const int peerVersion)
|
2020-03-24 12:15:04 +01:00
|
|
|
{
|
2020-03-24 17:10:40 +01:00
|
|
|
prepare(pm);
|
2020-03-24 12:15:04 +01:00
|
|
|
if (!legacySeq)
|
|
|
|
{
|
|
|
|
if (pm != legacyPm)
|
|
|
|
{
|
|
|
|
legacySeq = legacyPm.nextLocalSeq();
|
|
|
|
ackSeq = pm.getLastRemoteSeq();
|
|
|
|
ackMask = pm.getRemoteAckMask();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
legacySeq = seq;
|
|
|
|
}
|
2020-03-22 21:25:02 +01:00
|
|
|
}
|
2020-03-24 17:10:40 +01:00
|
|
|
|
|
|
|
int tmpLegacySeq = legacySeq;
|
|
|
|
|
|
|
|
extraSignaling.v.clear();
|
|
|
|
for (auto &extra : currentExtras)
|
|
|
|
{
|
2020-03-25 21:38:07 +01:00
|
|
|
if (!extra.endpointId || extra.endpointId == endpointId)
|
2020-03-24 17:10:40 +01:00
|
|
|
{
|
|
|
|
extraSignaling.v.push_back(extra.data);
|
|
|
|
if (extra.data.d->chooseType(peerVersion) == PKT_NOP)
|
|
|
|
{
|
|
|
|
extra.seqs.Add(seq);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
extra.seqs.Add(tmpLegacySeq++);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-03-22 21:25:02 +01:00
|
|
|
}
|
2020-03-21 21:33:51 +01:00
|
|
|
#include "Legacy.cpp"
|