From 29bdc86d120e6b479cae82f74153348cd2ff759c Mon Sep 17 00:00:00 2001 From: KimLS Date: Tue, 28 Jan 2025 23:39:51 -0800 Subject: [PATCH] Refactoring streams, will be an ongoing process. --- common/net/daybreak_connection.cpp | 37 +++++---------- common/net/daybreak_connection.h | 75 ++++++++++++++++++------------ 2 files changed, 56 insertions(+), 56 deletions(-) diff --git a/common/net/daybreak_connection.cpp b/common/net/daybreak_connection.cpp index f1a55cfbb..4e1ff6025 100644 --- a/common/net/daybreak_connection.cpp +++ b/common/net/daybreak_connection.cpp @@ -337,20 +337,10 @@ EQ::Net::DaybreakConnection::DaybreakConnection(DaybreakConnectionManager *owner m_combined[1] = OP_Combined; m_last_session_stats = Clock::now(); m_outgoing_budget = owner->m_options.outgoing_data_rate; - m_streams = new DaybreakStream*[4]; - m_streams[0] = nullptr; - m_streams[1] = nullptr; - m_streams[2] = nullptr; - m_streams[3] = nullptr; } EQ::Net::DaybreakConnection::~DaybreakConnection() { - for (int i = 0; i < 4; ++i) { - if (m_streams[i] != nullptr) { - delete m_streams[i]; - } - } } void EQ::Net::DaybreakConnection::Close() @@ -505,7 +495,7 @@ void EQ::Net::DaybreakConnection::ProcessPacket(Packet &p) void EQ::Net::DaybreakConnection::ProcessQueue() { for (int i = 0; i < 4; ++i) { - auto stream = m_streams[i]; + auto &stream = m_streams[i]; for (;;) { if (stream == nullptr) break; @@ -525,7 +515,7 @@ void EQ::Net::DaybreakConnection::ProcessQueue() void EQ::Net::DaybreakConnection::RemoveFromQueue(int stream, uint16_t seq) { - auto s = m_streams[stream]; + auto &s = m_streams[stream]; if (s == nullptr) { return; } @@ -540,7 +530,7 @@ void EQ::Net::DaybreakConnection::RemoveFromQueue(int stream, uint16_t seq) void EQ::Net::DaybreakConnection::AddToQueue(int stream, uint16_t seq, const Packet &p) { - auto s = m_streams[stream]; + auto &s = m_streams[stream]; if (s == nullptr) { return; } @@ -699,10 +689,9 @@ void EQ::Net::DaybreakConnection::ProcessDecodedPacket(const Packet &p) auto header = p.GetSerialize(0); auto sequence = NetworkToHost(header.sequence); auto stream_id = header.opcode - OP_Packet; - auto stream = m_streams[stream_id]; + auto &stream = m_streams[stream_id]; if (stream == nullptr) { - stream = new DaybreakStream(); - m_streams[stream_id] = stream; + stream.reset(new DaybreakReliableStream()); } auto order = CompareSequence(stream->sequence_in, sequence); @@ -732,10 +721,9 @@ void EQ::Net::DaybreakConnection::ProcessDecodedPacket(const Packet &p) auto header = p.GetSerialize(0); auto sequence = NetworkToHost(header.sequence); auto stream_id = header.opcode - OP_Fragment; - auto stream = m_streams[stream_id]; + auto &stream = m_streams[stream_id]; if (stream == nullptr) { - stream = new DaybreakStream(); - m_streams[stream_id] = stream; + stream.reset(new DaybreakReliableStream()); } auto order = CompareSequence(stream->sequence_in, sequence); @@ -1130,7 +1118,7 @@ void EQ::Net::DaybreakConnection::ProcessResend(int stream) auto resends = 0; auto now = Clock::now(); - auto s = m_streams[stream]; + auto &s = m_streams[stream]; if (s == nullptr) { return; } @@ -1196,7 +1184,7 @@ void EQ::Net::DaybreakConnection::Ack(int stream, uint16_t seq) { auto now = Clock::now(); - auto s = m_streams[stream]; + auto &s = m_streams[stream]; if (s == nullptr) { return; } @@ -1224,7 +1212,7 @@ void EQ::Net::DaybreakConnection::Ack(int stream, uint16_t seq) void EQ::Net::DaybreakConnection::OutOfOrderAck(int stream, uint16_t seq) { auto now = Clock::now(); - auto s = m_streams[stream]; + auto &s = m_streams[stream]; if (s == nullptr) { return; } @@ -1444,10 +1432,9 @@ void EQ::Net::DaybreakConnection::InternalQueuePacket(Packet &p, int stream_id, return; } - auto stream = m_streams[stream_id]; + auto &stream = m_streams[stream_id]; if (stream == nullptr) { - stream = new DaybreakStream(); - m_streams[stream_id] = stream; + stream.reset(new DaybreakReliableStream()); } auto max_raw_size = m_max_packet_size - m_crc_bytes - DaybreakReliableHeader::size() - 1; // -1 for compress flag diff --git a/common/net/daybreak_connection.h b/common/net/daybreak_connection.h index a93b9bad4..612412e01 100644 --- a/common/net/daybreak_connection.h +++ b/common/net/daybreak_connection.h @@ -133,6 +133,38 @@ namespace EQ uint64_t bytes_before_encode; }; + //Refactoring this stuff + struct DaybreakSentPacket + { + DynamicPacket packet; + Timestamp last_sent; + Timestamp first_sent; + size_t times_resent; + size_t resend_delay; + }; + + class DaybreakReliableStream + { + public: + DaybreakReliableStream() { + sequence_in = 0; + sequence_out = 0; + fragment_current_bytes = 0; + fragment_total_bytes = 0; + } + //private: + + uint16_t sequence_in; + uint16_t sequence_out; + std::map packet_queue; + + DynamicPacket fragment_packet; + uint32_t fragment_current_bytes; + uint32_t fragment_total_bytes; + + std::map sent_packets; + }; + class DaybreakConnectionManager; class DaybreakConnection; class DaybreakConnection @@ -181,37 +213,7 @@ namespace EQ Timestamp m_close_time; double m_outgoing_budget; - struct DaybreakSentPacket - { - DynamicPacket packet; - Timestamp last_sent; - Timestamp first_sent; - size_t times_resent; - size_t resend_delay; - }; - - class DaybreakStream - { - public: - DaybreakStream() { - sequence_in = 0; - sequence_out = 0; - fragment_current_bytes = 0; - fragment_total_bytes = 0; - } - //private: - uint16_t sequence_in; - uint16_t sequence_out; - std::map packet_queue; - - DynamicPacket fragment_packet; - uint32_t fragment_current_bytes; - uint32_t fragment_total_bytes; - - std::map sent_packets; - }; - - DaybreakStream** m_streams; + std::unique_ptr m_streams[4]; std::weak_ptr m_self; void Process(); @@ -273,6 +275,14 @@ namespace EQ resend_timeout = 30000; connection_close_time = 2000; outgoing_data_rate = 0.0; + //this is emperically based on what the client seems to set for theirs + //this is the max number of packets that can be sent/recv per channel before acks come in + //we'll use this to preallocate some buffers + max_outgoing_packets_per_channel = 400; + max_incoming_packets_per_channel = 400; + + //This is the max size of a packet that can be sent or received + max_total_packet_size = 1024 * 1024 * 16; } size_t max_packet_size; @@ -296,6 +306,9 @@ namespace EQ DaybreakEncodeType encode_passes[2]; int port; double outgoing_data_rate; + int max_outgoing_packets_per_channel; + int max_incoming_packets_per_channel; + int max_total_packet_size; }; class DaybreakConnectionManager