group2 0.1.0
CSE 125 Group 2
Loading...
Searching...
No Matches
PacketHeader.hpp
Go to the documentation of this file.
1
9
10#pragma once
11
12#include <SDL3/SDL_stdinc.h>
13
14#include <cstddef>
15#include <cstdint>
16#include <cstring>
17#include <vector>
18
19namespace net
20{
21
23inline constexpr std::uint16_t k_protocolMagic = 0x3247;
24
26inline constexpr std::uint8_t k_protocolVersion = 2;
27
32inline constexpr int k_maxPacketBytes = 1200;
33
45
63
64inline constexpr std::uint8_t k_flagFragmented = 0x01;
65inline constexpr std::uint8_t k_flagEncrypted = 0x02;
66inline constexpr std::uint8_t k_flagRelayPreferred = 0x04;
67
68#pragma pack(push, 1)
71{
72 std::uint16_t magic = k_protocolMagic;
73 std::uint8_t version = k_protocolVersion;
74 std::uint8_t kind = static_cast<std::uint8_t>(PacketKind::Payload);
75 std::uint64_t connectionId = 0;
76 std::uint32_t sequence = 0;
77 std::uint32_t ack = 0;
78 std::uint32_t ackBits = 0;
79 std::uint16_t routeId = 0;
80 std::uint8_t channel = static_cast<std::uint8_t>(ChannelId::InputUnreliable);
81 std::uint8_t flags = 0;
82 std::uint16_t fragmentInfo = 0;
83 std::uint16_t fragmentGroup = 0;
84 std::uint32_t _pad = 0;
85};
86#pragma pack(pop)
87static_assert(sizeof(PacketHeader) == 36, "PacketHeader must be exactly 36 bytes on the wire");
88
90inline constexpr int k_maxPayloadBytes = k_maxPacketBytes - static_cast<int>(sizeof(PacketHeader));
91
92inline void writeU16Le(std::uint8_t* out, std::uint16_t v)
93{
94 out[0] = static_cast<std::uint8_t>(v & 0xffu);
95 out[1] = static_cast<std::uint8_t>((v >> 8) & 0xffu);
96}
97
98inline void writeU32Le(std::uint8_t* out, std::uint32_t v)
99{
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);
104}
105
106inline void writeU64Le(std::uint8_t* out, std::uint64_t v)
107{
108 writeU32Le(out, static_cast<std::uint32_t>(v & 0xffffffffULL));
109 writeU32Le(out + 4, static_cast<std::uint32_t>((v >> 32) & 0xffffffffULL));
110}
111
112inline std::uint16_t readU16Le(const std::uint8_t* in)
113{
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));
116}
117
118inline std::uint32_t readU32Le(const std::uint8_t* in)
119{
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);
122}
123
124inline std::uint64_t readU64Le(const std::uint8_t* in)
125{
126 return static_cast<std::uint64_t>(readU32Le(in)) | (static_cast<std::uint64_t>(readU32Le(in + 4)) << 32);
127}
128
129inline void encodePacketHeader(const PacketHeader& hdr, std::uint8_t* out)
130{
131 writeU16Le(out + 0, hdr.magic);
132 out[2] = hdr.version;
133 out[3] = hdr.kind;
134 writeU64Le(out + 4, hdr.connectionId);
135 writeU32Le(out + 12, hdr.sequence);
136 writeU32Le(out + 16, hdr.ack);
137 writeU32Le(out + 20, hdr.ackBits);
138 writeU16Le(out + 24, hdr.routeId);
139 out[26] = hdr.channel;
140 out[27] = hdr.flags;
141 writeU16Le(out + 28, hdr.fragmentInfo);
142 writeU16Le(out + 30, hdr.fragmentGroup);
143 writeU32Le(out + 32, hdr._pad);
144}
145
146inline bool decodePacketHeader(const std::uint8_t* data, std::size_t len, PacketHeader& out)
147{
148 if (len < sizeof(PacketHeader))
149 return false;
150
151 out.magic = readU16Le(data + 0);
152 out.version = data[2];
153 out.kind = data[3];
154 out.connectionId = readU64Le(data + 4);
155 out.sequence = readU32Le(data + 12);
156 out.ack = readU32Le(data + 16);
157 out.ackBits = readU32Le(data + 20);
158 out.routeId = readU16Le(data + 24);
159 out.channel = data[26];
160 out.flags = data[27];
161 out.fragmentInfo = readU16Le(data + 28);
162 out.fragmentGroup = readU16Le(data + 30);
163 out._pad = readU32Le(data + 32);
164 return out.magic == k_protocolMagic && out.version == k_protocolVersion;
165}
166
167inline std::vector<std::uint8_t> makeDatagram(PacketHeader hdr, const void* payload, int payloadLen)
168{
169 if (payloadLen < 0)
170 payloadLen = 0;
171
174 hdr._pad = 0;
175
176 std::vector<std::uint8_t> bytes(sizeof(PacketHeader) + static_cast<std::size_t>(payloadLen));
177 encodePacketHeader(hdr, bytes.data());
178 if (payloadLen > 0 && payload)
179 std::memcpy(bytes.data() + sizeof(PacketHeader), payload, static_cast<std::size_t>(payloadLen));
180 return bytes;
181}
182
183} // namespace net
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
36-byte header at the start of every UDP datagram.
Definition PacketHeader.hpp:71
std::uint16_t magic
Definition PacketHeader.hpp:72
std::uint8_t channel
Definition PacketHeader.hpp:80
std::uint64_t connectionId
Server-assigned session id; 0 pre-handshake.
Definition PacketHeader.hpp:75
std::uint16_t fragmentGroup
Logical fragmented-message id.
Definition PacketHeader.hpp:83
std::uint32_t sequence
Per-(connection, channel) sequence.
Definition PacketHeader.hpp:76
std::uint32_t ackBits
Bit i acks ack-(i+1).
Definition PacketHeader.hpp:78
std::uint16_t fragmentInfo
hi 8 = fragment index, lo 8 = fragment count.
Definition PacketHeader.hpp:82
std::uint32_t ack
Most-recent sequence received on this channel.
Definition PacketHeader.hpp:77
std::uint8_t flags
Definition PacketHeader.hpp:81
std::uint32_t _pad
Definition PacketHeader.hpp:84
std::uint8_t version
Definition PacketHeader.hpp:73
std::uint16_t routeId
0 direct, non-zero relay/future Steam route.
Definition PacketHeader.hpp:79
std::uint8_t kind
Definition PacketHeader.hpp:74