12#include <SDL3/SDL_stdinc.h>
77 std::uint32_t
ack = 0;
87static_assert(
sizeof(
PacketHeader) == 36,
"PacketHeader must be exactly 36 bytes on the wire");
92inline void writeU16Le(std::uint8_t* out, std::uint16_t v)
94 out[0] =
static_cast<std::uint8_t
>(v & 0xffu);
95 out[1] =
static_cast<std::uint8_t
>((v >> 8) & 0xffu);
98inline void writeU32Le(std::uint8_t* out, std::uint32_t v)
100 out[0] =
static_cast<std::uint8_t
>(v & 0xffu);
101 out[1] =
static_cast<std::uint8_t
>((v >> 8) & 0xffu);
102 out[2] =
static_cast<std::uint8_t
>((v >> 16) & 0xffu);
103 out[3] =
static_cast<std::uint8_t
>((v >> 24) & 0xffu);
108 writeU32Le(out,
static_cast<std::uint32_t
>(v & 0xffffffffULL));
109 writeU32Le(out + 4,
static_cast<std::uint32_t
>((v >> 32) & 0xffffffffULL));
114 return static_cast<std::uint16_t
>(
static_cast<std::uint16_t
>(in[0]) |
115 static_cast<std::uint16_t
>(
static_cast<std::uint16_t
>(in[1]) << 8));
120 return static_cast<std::uint32_t
>(in[0]) | (
static_cast<std::uint32_t
>(in[1]) << 8) |
121 (
static_cast<std::uint32_t
>(in[2]) << 16) | (
static_cast<std::uint32_t
>(in[3]) << 24);
126 return static_cast<std::uint64_t
>(
readU32Le(in)) | (
static_cast<std::uint64_t
>(
readU32Le(in + 4)) << 32);
160 out.
flags = data[27];
176 std::vector<std::uint8_t> bytes(
sizeof(
PacketHeader) +
static_cast<std::size_t
>(payloadLen));
178 if (payloadLen > 0 && payload)
179 std::memcpy(bytes.data() +
sizeof(
PacketHeader), payload,
static_cast<std::size_t
>(payloadLen));
Definition ChatProtocol.cpp:12
constexpr std::uint8_t k_protocolVersion
Wire-format version. Bump on any incompatible layout change.
Definition PacketHeader.hpp:26
constexpr std::uint8_t k_flagEncrypted
Definition PacketHeader.hpp:65
void writeU16Le(std::uint8_t *out, std::uint16_t v)
Definition PacketHeader.hpp:92
constexpr int k_maxPayloadBytes
Maximum payload bytes a single non-fragmented datagram can carry.
Definition PacketHeader.hpp:90
constexpr int k_maxPacketBytes
Maximum total UDP datagram bytes we intentionally emit.
Definition PacketHeader.hpp:32
void writeU32Le(std::uint8_t *out, std::uint32_t v)
Definition PacketHeader.hpp:98
void encodePacketHeader(const PacketHeader &hdr, std::uint8_t *out)
Definition PacketHeader.hpp:129
constexpr std::uint16_t k_protocolMagic
Magic bytes identifying our protocol. ASCII "G2" little-endian.
Definition PacketHeader.hpp:23
void writeU64Le(std::uint8_t *out, std::uint64_t v)
Definition PacketHeader.hpp:106
std::uint64_t readU64Le(const std::uint8_t *in)
Definition PacketHeader.hpp:124
ChannelId
Per-channel reliability + ordering semantics.
Definition PacketHeader.hpp:48
@ VoiceUnreliableSequenced
Definition PacketHeader.hpp:53
@ ReliableOrdered
Definition PacketHeader.hpp:60
@ Unreliable
Definition PacketHeader.hpp:58
@ EventReliableOrdered
Definition PacketHeader.hpp:52
@ SnapshotUnreliableSequenced
Definition PacketHeader.hpp:50
@ ReliableUnordered
Definition PacketHeader.hpp:61
@ UnreliableSequenced
Definition PacketHeader.hpp:59
@ Count
Definition PacketHeader.hpp:55
@ InputUnreliable
Definition PacketHeader.hpp:49
@ ControlReliableOrdered
Definition PacketHeader.hpp:51
std::uint16_t readU16Le(const std::uint8_t *in)
Definition PacketHeader.hpp:112
constexpr std::uint8_t k_flagFragmented
Definition PacketHeader.hpp:64
bool decodePacketHeader(const std::uint8_t *data, std::size_t len, PacketHeader &out)
Definition PacketHeader.hpp:146
std::vector< std::uint8_t > makeDatagram(PacketHeader hdr, const void *payload, int payloadLen)
Definition PacketHeader.hpp:167
constexpr std::uint8_t k_flagRelayPreferred
Definition PacketHeader.hpp:66
PacketKind
Packet kind discriminator (PacketHeader::kind field).
Definition PacketHeader.hpp:36
@ Payload
Definition PacketHeader.hpp:37
@ DirectoryControl
Definition PacketHeader.hpp:43
@ KeepAlive
Definition PacketHeader.hpp:41
@ Disconnect
Definition PacketHeader.hpp:40
@ ConnectionAccepted
Definition PacketHeader.hpp:39
@ ConnectionRequest
Definition PacketHeader.hpp:38
@ RelayPayload
Definition PacketHeader.hpp:42
std::uint32_t readU32Le(const std::uint8_t *in)
Definition PacketHeader.hpp:118