refactor: remove the packet macros, WriteHeader and PacketUtils

Nothing in the server writes or reads a packet by hand any more, so the
helpers for doing so go:
- CBITSTREAM, CMSGHEADER, CINSTREAM, CINSTREAM_SKIP_HEADER, SEND_PACKET,
  SEND_PACKET_BROADCAST and HEADER_SIZE leave dCommonVars.h;
- the free BitStreamUtils::WriteHeader (LUBitStream::WriteHeader writes the
  same bytes) and the unused PacketUtils::SavePacket are deleted.
The last raw reads are replaced: WorldServer builds its input stream
directly, the master packet logs read the header with
LUBitStream::ReadHeader instead of peeking at packet->data[1] and [3], and
MessageInspector reads a sent game message's header with the new
NetGameMsg::ReadPacketHeader (the counterpart of WritePacket) instead of
memcmp/memcpy. packet->data[0] is still compared with RakNet's own
connection IDs.

The frozen oracles keep using the macros verbatim through the test-only
tests/dGameTests/LegacyPacketMacros.h; the HeaderSkip tests, which only
tested CINSTREAM_SKIP_HEADER, are removed.

docs/PacketArchitecture.md: "where we are" now describes the final state
and what still touches raw bytes (RakNet IDs, replica headers, behavior bit
streams), and a new section collects the known wire discrepancies found
during the conversion, with client addresses.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Aaron Kimbrell
2026-09-27 00:59:12 -05:00
parent acdfd2212d
commit 370a03f0a3
34 changed files with 154 additions and 100 deletions

View File

@@ -21,7 +21,7 @@ std::unique_ptr<AMFBaseValue> ReadFromBitStream(RakNet::BitStream& bitStream) {
* @brief Test reading an AMFUndefined value from a BitStream.
*/
TEST(dCommonTests, AMFDeserializeAMFUndefinedTest) {
CBITSTREAM;
RakNet::BitStream bitStream;
bitStream.Write<uint8_t>(0x00);
std::unique_ptr<AMFBaseValue> res{ ReadFromBitStream(bitStream) };
ASSERT_EQ(res->GetValueType(), eAmf::Undefined);
@@ -32,7 +32,7 @@ TEST(dCommonTests, AMFDeserializeAMFUndefinedTest) {
*
*/
TEST(dCommonTests, AMFDeserializeAMFNullTest) {
CBITSTREAM;
RakNet::BitStream bitStream;
bitStream.Write<uint8_t>(0x01);
std::unique_ptr<AMFBaseValue> res{ ReadFromBitStream(bitStream) };
ASSERT_EQ(res->GetValueType(), eAmf::Null);
@@ -42,7 +42,7 @@ TEST(dCommonTests, AMFDeserializeAMFNullTest) {
* @brief Test reading an AMFFalse value from a BitStream.
*/
TEST(dCommonTests, AMFDeserializeAMFFalseTest) {
CBITSTREAM;
RakNet::BitStream bitStream;
bitStream.Write<uint8_t>(0x02);
std::unique_ptr<AMFBaseValue> res{ ReadFromBitStream(bitStream) };
ASSERT_EQ(res->GetValueType(), eAmf::False);
@@ -52,7 +52,7 @@ TEST(dCommonTests, AMFDeserializeAMFFalseTest) {
* @brief Test reading an AMFTrue value from a BitStream.
*/
TEST(dCommonTests, AMFDeserializeAMFTrueTest) {
CBITSTREAM;
RakNet::BitStream bitStream;
bitStream.Write<uint8_t>(0x03);
std::unique_ptr<AMFBaseValue> res{ ReadFromBitStream(bitStream) };
ASSERT_EQ(res->GetValueType(), eAmf::True);
@@ -62,7 +62,7 @@ TEST(dCommonTests, AMFDeserializeAMFTrueTest) {
* @brief Test reading an AMFInteger value from a BitStream.
*/
TEST(dCommonTests, AMFDeserializeAMFIntegerTest) {
CBITSTREAM;
RakNet::BitStream bitStream;
{
bitStream.Write<uint8_t>(0x04);
// 127 == 01111111
@@ -113,7 +113,7 @@ TEST(dCommonTests, AMFDeserializeAMFIntegerTest) {
* @brief Test reading an AMFDouble value from a BitStream.
*/
TEST(dCommonTests, AMFDeserializeAMFDoubleTest) {
CBITSTREAM;
RakNet::BitStream bitStream;
bitStream.Write<uint8_t>(0x05);
bitStream.Write<double>(25346.4f);
std::unique_ptr<AMFBaseValue> res{ ReadFromBitStream(bitStream) };
@@ -125,7 +125,7 @@ TEST(dCommonTests, AMFDeserializeAMFDoubleTest) {
* @brief Test reading an AMFString value from a BitStream.
*/
TEST(dCommonTests, AMFDeserializeAMFStringTest) {
CBITSTREAM;
RakNet::BitStream bitStream;
bitStream.Write<uint8_t>(0x06);
bitStream.Write<uint8_t>(0x0F);
std::string toWrite = "stateID";
@@ -139,7 +139,7 @@ TEST(dCommonTests, AMFDeserializeAMFStringTest) {
* @brief Test reading an AMFArray value from a BitStream.
*/
TEST(dCommonTests, AMFDeserializeAMFArrayTest) {
CBITSTREAM;
RakNet::BitStream bitStream;
// Test empty AMFArray
bitStream.Write<uint8_t>(0x09);
bitStream.Write<uint8_t>(0x01);
@@ -490,20 +490,20 @@ TEST_F(AMFDeserializeLimitsTest, NestingLimitTest) {
};
{
CBITSTREAM;
RakNet::BitStream bitStream;
writeNested(bitStream, AMFDeserialize::MaxDepth);
std::unique_ptr<AMFBaseValue> res;
ASSERT_NO_THROW(res = ReadFromBitStream(bitStream));
ASSERT_EQ(res->GetValueType(), eAmf::Array);
}
{
CBITSTREAM;
RakNet::BitStream bitStream;
writeNested(bitStream, AMFDeserialize::MaxDepth + 1);
ASSERT_THROW(ReadFromBitStream(bitStream), std::invalid_argument);
}
{
// Far past the limit, what a malicious client would send to overflow the stack.
CBITSTREAM;
RakNet::BitStream bitStream;
writeNested(bitStream, 100'000);
ASSERT_THROW(ReadFromBitStream(bitStream), std::invalid_argument);
}
@@ -524,14 +524,14 @@ TEST_F(AMFDeserializeLimitsTest, AssociativeLimitTest) {
};
{
CBITSTREAM;
RakNet::BitStream bitStream;
writeArray(bitStream, AMFDeserialize::MaxArraySize);
std::unique_ptr<AMFBaseValue> res;
ASSERT_NO_THROW(res = ReadFromBitStream(bitStream));
ASSERT_EQ(static_cast<AMFArrayValue*>(res.get())->GetAssociative().size(), AMFDeserialize::MaxArraySize);
}
{
CBITSTREAM;
RakNet::BitStream bitStream;
writeArray(bitStream, AMFDeserialize::MaxArraySize + 1);
ASSERT_THROW(ReadFromBitStream(bitStream), std::invalid_argument);
}
@@ -541,7 +541,7 @@ TEST_F(AMFDeserializeLimitsTest, AssociativeLimitTest) {
* @brief The dense size is checked before any of the associative part is read.
*/
TEST_F(AMFDeserializeLimitsTest, DenseLimitTest) {
CBITSTREAM;
RakNet::BitStream bitStream;
bitStream.Write<uint8_t>(0x09);
WriteU29(bitStream, ((AMFDeserialize::MaxArraySize + 1) << 1) | 1);
bitStream.Write<uint8_t>(0x01);
@@ -552,7 +552,7 @@ TEST_F(AMFDeserializeLimitsTest, DenseLimitTest) {
* @brief Many small arrays that are each within limits still count toward one total budget.
*/
TEST_F(AMFDeserializeLimitsTest, TotalValueLimitTest) {
CBITSTREAM;
RakNet::BitStream bitStream;
// An outer array of 20 arrays with 10,000 values each is 200,000 values.
bitStream.Write<uint8_t>(0x09);
WriteU29(bitStream, (20 << 1) | 1);
@@ -570,7 +570,7 @@ TEST_F(AMFDeserializeLimitsTest, TotalValueLimitTest) {
* @brief Sending a key twice keeps the last value, and the returned reference is to a live value.
*/
TEST_F(AMFDeserializeLimitsTest, DuplicateKeyTest) {
CBITSTREAM;
RakNet::BitStream bitStream;
bitStream.Write<uint8_t>(0x09);
bitStream.Write<uint8_t>(0x01);
WriteShortAmfString(bitStream, "key");

View File

@@ -3,7 +3,6 @@ set(DCOMMONTEST_SOURCES
"Amf3Tests.cpp"
"ToUnderlyingTests.cpp"
"InstanceMigrationTests.cpp"
"HeaderSkipTest.cpp"
"TestCDFeatureGatingTable.cpp"
"TestLDFFormat.cpp"
"TestNiPoint3.cpp"

View File

@@ -3,7 +3,7 @@
#include "dCommonVars.h"
TEST(LUString33Test, SerializeWriteTestOld) {
CBITSTREAM;
RakNet::BitStream bitStream;
std::string testString;
for (int i = 0; i < 33; i++) testString += "a";
for (const auto& c : testString) bitStream.Write(c);
@@ -14,7 +14,7 @@ TEST(LUString33Test, SerializeWriteTestOld) {
}
TEST(LUString33Test, SerializeWriteTestOldPartial) {
CBITSTREAM;
RakNet::BitStream bitStream;
std::string testString;
for (int i = 0; i < 15; i++) testString += "a";
for (const auto& c : testString) bitStream.Write(c);
@@ -34,7 +34,7 @@ TEST(LUString33Test, SerializeWriteTestOldPartial) {
}
TEST(LUString33Test, SerializeWriteTestNew) {
CBITSTREAM;
RakNet::BitStream bitStream;
std::string testString;
for (int i = 0; i < 33; i++) testString += "a";
bitStream.Write(LUString(testString, 33));
@@ -45,7 +45,7 @@ TEST(LUString33Test, SerializeWriteTestNew) {
}
TEST(LUString33Test, SerializeWriteTestNewPartial) {
CBITSTREAM;
RakNet::BitStream bitStream;
std::string testString;
for (int i = 0; i < 15; i++) testString += "a";
bitStream.Write(LUString(testString, 33));
@@ -64,7 +64,7 @@ TEST(LUString33Test, SerializeWriteTestNewPartial) {
}
TEST(LUString33Test, SerializeReadTestOld) {
CBITSTREAM;
RakNet::BitStream bitStream;
std::string testString;
for (int i = 0; i < 33; i++) testString += "a";
for (const auto& c : testString) bitStream.Write(c);
@@ -76,7 +76,7 @@ TEST(LUString33Test, SerializeReadTestOld) {
}
TEST(LUString33Test, SerializeReadTestOldPartial) {
CBITSTREAM;
RakNet::BitStream bitStream;
std::string testString;
for (int i = 0; i < 15; i++) testString += "a";
for (const auto& c : testString) bitStream.Write(c);
@@ -97,7 +97,7 @@ TEST(LUString33Test, SerializeReadTestOldPartial) {
}
TEST(LUString33Test, SerializeReadTestNew) {
CBITSTREAM;
RakNet::BitStream bitStream;
std::string testString;
for (int i = 0; i < 33; i++) testString += "a";
bitStream.Write(LUString(testString, 33));
@@ -109,7 +109,7 @@ TEST(LUString33Test, SerializeReadTestNew) {
}
TEST(LUString33Test, SerializeReadTestNewPartial) {
CBITSTREAM;
RakNet::BitStream bitStream;
std::string testString;
for (int i = 0; i < 15; i++) testString += "a";
bitStream.Write(LUString(testString, 33));

View File

@@ -3,7 +3,7 @@
#include "dCommonVars.h"
TEST(LUWString33Test, SerializeWriteTestOld) {
CBITSTREAM;
RakNet::BitStream bitStream;
std::u16string testString;
for (int i = 0; i < 33; i++) testString += u'ü';
for (const auto& c : testString) bitStream.Write(c);
@@ -14,7 +14,7 @@ TEST(LUWString33Test, SerializeWriteTestOld) {
}
TEST(LUWString33Test, SerializeWriteTestOldPartial) {
CBITSTREAM;
RakNet::BitStream bitStream;
std::u16string testString;
for (int i = 0; i < 15; i++) testString += u'ü';
for (const auto& c : testString) bitStream.Write(c);
@@ -34,7 +34,7 @@ TEST(LUWString33Test, SerializeWriteTestOldPartial) {
}
TEST(LUWString33Test, SerializeWriteTestNew) {
CBITSTREAM;
RakNet::BitStream bitStream;
std::u16string testString;
for (int i = 0; i < 33; i++) testString += u'ü';
bitStream.Write(LUWString(testString, 33));
@@ -45,7 +45,7 @@ TEST(LUWString33Test, SerializeWriteTestNew) {
}
TEST(LUWString33Test, SerializeWriteTestNewPartial) {
CBITSTREAM;
RakNet::BitStream bitStream;
std::u16string testString;
for (int i = 0; i < 15; i++) testString += u'ü';
bitStream.Write(LUWString(testString, 33));
@@ -64,7 +64,7 @@ TEST(LUWString33Test, SerializeWriteTestNewPartial) {
}
TEST(LUWString33Test, SerializeReadTestOld) {
CBITSTREAM;
RakNet::BitStream bitStream;
std::u16string testString;
for (int i = 0; i < 33; i++) testString += u'ü';
for (const auto& c : testString) bitStream.Write(c);
@@ -76,7 +76,7 @@ TEST(LUWString33Test, SerializeReadTestOld) {
}
TEST(LUWString33Test, SerializeReadTestOldPartial) {
CBITSTREAM;
RakNet::BitStream bitStream;
std::u16string testString;
for (int i = 0; i < 15; i++) testString += u'ü';
for (const auto& c : testString) bitStream.Write(c);
@@ -97,7 +97,7 @@ TEST(LUWString33Test, SerializeReadTestOldPartial) {
}
TEST(LUWString33Test, SerializeReadTestNew) {
CBITSTREAM;
RakNet::BitStream bitStream;
std::u16string testString;
for (int i = 0; i < 33; i++) testString += u'ü';
bitStream.Write(LUWString(testString, 33));
@@ -109,7 +109,7 @@ TEST(LUWString33Test, SerializeReadTestNew) {
}
TEST(LUWString33Test, SerializeReadTestNewPartial) {
CBITSTREAM;
RakNet::BitStream bitStream;
std::u16string testString;
for (int i = 0; i < 15; i++) testString += u'ü';
bitStream.Write(LUWString(testString, 33));