From 5c6f6848084770ae7822197af7664a57d30b28ef Mon Sep 17 00:00:00 2001 From: KimLS Date: Thu, 29 Jun 2017 14:13:55 -0700 Subject: [PATCH 01/12] Some work on congestion avoidance now uses a sliding congestion window instead of a static one --- common/net/daybreak_connection.cpp | 78 ++++++++++++++++++++++++------ common/net/daybreak_connection.h | 11 ++--- 2 files changed, 68 insertions(+), 21 deletions(-) diff --git a/common/net/daybreak_connection.cpp b/common/net/daybreak_connection.cpp index 82a7e2d12..57f83e9d1 100644 --- a/common/net/daybreak_connection.cpp +++ b/common/net/daybreak_connection.cpp @@ -283,6 +283,9 @@ EQ::Net::DaybreakConnection::DaybreakConnection(DaybreakConnectionManager *owner m_combined[0] = 0; m_combined[1] = OP_Combined; m_last_session_stats = Clock::now(); + m_outstanding_bytes = 0; + m_cwnd = m_max_packet_size; + m_ssthresh = m_owner->m_options.max_outstanding_bytes; } //new connection made as client @@ -306,6 +309,9 @@ EQ::Net::DaybreakConnection::DaybreakConnection(DaybreakConnectionManager *owner m_combined[0] = 0; m_combined[1] = OP_Combined; m_last_session_stats = Clock::now(); + m_outstanding_bytes = 0; + m_cwnd = m_max_packet_size; + m_ssthresh = m_owner->m_options.max_outstanding_bytes; } EQ::Net::DaybreakConnection::~DaybreakConnection() @@ -463,20 +469,16 @@ void EQ::Net::DaybreakConnection::ProcessOutboundQueue() { for (int i = 0; i < 4; ++i) { auto stream = &m_streams[i]; - - if (stream->outstanding_bytes == 0) { - continue; - } while (!stream->buffered_packets.empty()) { auto &buff = stream->buffered_packets.front(); - if (stream->outstanding_bytes + buff.sent.packet.Length() >= m_owner->m_options.max_outstanding_bytes || - stream->outstanding_packets.size() + 1 >= m_owner->m_options.max_outstanding_packets) { + if (m_outstanding_bytes + buff.sent.packet.Length() >= m_cwnd) { break; } - stream->outstanding_bytes += buff.sent.packet.Length(); + LogF(Logs::Detail, Logs::Netcode, "Sending buffered packet {0} on stream {1}", buff.seq, i); + m_outstanding_bytes += buff.sent.packet.Length(); stream->outstanding_packets.insert(std::make_pair(buff.seq, buff.sent)); InternalSend(buff.sent.packet); stream->buffered_packets.pop_front(); @@ -1051,7 +1053,10 @@ void EQ::Net::DaybreakConnection::ProcessResend(int stream) InternalBufferedSend(entry.second.packet); entry.second.last_sent = now; entry.second.times_resent++; - m_rolling_ping += 100; + + LogF(Logs::Detail, Logs::Netcode, "Congestion detected, reducing window size"); + m_ssthresh = m_cwnd / 2; + m_cwnd = m_cwnd / 2; } } else { @@ -1065,7 +1070,10 @@ void EQ::Net::DaybreakConnection::ProcessResend(int stream) InternalBufferedSend(entry.second.packet); entry.second.last_sent = now; entry.second.times_resent++; - m_rolling_ping += 100; + + LogF(Logs::Detail, Logs::Netcode, "Congestion detected, reducing window size"); + m_ssthresh = m_cwnd / 2; + m_cwnd = m_cwnd / 2; } } } @@ -1086,10 +1094,29 @@ void EQ::Net::DaybreakConnection::Ack(int stream, uint16_t seq) m_stats.max_ping = std::max(m_stats.max_ping, round_time); m_stats.min_ping = std::min(m_stats.min_ping, round_time); m_stats.last_ping = round_time; - m_rolling_ping = (m_rolling_ping * 2 + round_time) / 3; + m_rolling_ping = (m_rolling_ping * 4 + round_time) / 5; - s->outstanding_bytes -= iter->second.packet.Length(); + m_outstanding_bytes -= iter->second.packet.Length(); iter = s->outstanding_packets.erase(iter); + if (m_cwnd < m_ssthresh) { + //Still in slow start mode + m_cwnd *= 2; + if (m_cwnd > m_owner->m_options.max_outstanding_bytes) { + m_cwnd = m_owner->m_options.max_outstanding_bytes; + } + + LogF(Logs::Detail, Logs::Netcode, "Increasing cwnd size new size is {0}", m_cwnd); + } + else { + m_cwnd += m_max_packet_size; + + if (m_cwnd > m_owner->m_options.max_outstanding_bytes) { + m_cwnd = m_owner->m_options.max_outstanding_bytes; + } + + LogF(Logs::Detail, Logs::Netcode, "Increasing cwnd size new size is {0}", m_cwnd); + } + ProcessOutboundQueue(); } else { @@ -1111,8 +1138,28 @@ void EQ::Net::DaybreakConnection::OutOfOrderAck(int stream, uint16_t seq) m_stats.last_ping = round_time; m_rolling_ping = (m_rolling_ping * 2 + round_time) / 3; - s->outstanding_bytes -= iter->second.packet.Length(); + m_outstanding_bytes -= iter->second.packet.Length(); s->outstanding_packets.erase(iter); + + if (m_cwnd < m_ssthresh) { + //Still in slow start mode + m_cwnd *= 2; + if (m_cwnd > m_owner->m_options.max_outstanding_bytes) { + m_cwnd = m_owner->m_options.max_outstanding_bytes; + } + + LogF(Logs::Detail, Logs::Netcode, "Increasing cwnd size new size is {0}", m_cwnd); + } + else { + m_cwnd += m_max_packet_size; + + if (m_cwnd > m_owner->m_options.max_outstanding_bytes) { + m_cwnd = m_owner->m_options.max_outstanding_bytes; + } + + LogF(Logs::Detail, Logs::Netcode, "Increasing cwnd size new size is {0}", m_cwnd); + } + ProcessOutboundQueue(); } } @@ -1122,16 +1169,17 @@ void EQ::Net::DaybreakConnection::BufferPacket(int stream, uint16_t seq, Daybrea auto s = &m_streams[stream]; //If we can send the packet then send it //else buffer it to be sent when we can send it - if (s->outstanding_bytes + sent.packet.Length() >= m_owner->m_options.max_outstanding_bytes || s->outstanding_packets.size() + 1 >= m_owner->m_options.max_outstanding_packets) { + if (m_outstanding_bytes + sent.packet.Length() > m_cwnd) { //Would go over one of the limits, buffer this packet. DaybreakBufferedPacket bp; bp.sent = std::move(sent); bp.seq = seq; s->buffered_packets.push_back(bp); + LogF(Logs::Detail, Logs::Netcode, "Buffering packet {0} on stream {1}", seq, stream); return; } - s->outstanding_bytes += sent.packet.Length(); + m_outstanding_bytes += sent.packet.Length(); s->outstanding_packets.insert(std::make_pair(seq, sent)); InternalSend(sent.packet); } @@ -1438,4 +1486,4 @@ EQ::Net::SequenceOrder EQ::Net::DaybreakConnection::CompareSequence(uint16_t exp } return SequencePast; -} \ No newline at end of file +} diff --git a/common/net/daybreak_connection.h b/common/net/daybreak_connection.h index 2ec7f200f..c337ed262 100644 --- a/common/net/daybreak_connection.h +++ b/common/net/daybreak_connection.h @@ -136,7 +136,10 @@ namespace EQ size_t m_resend_delay; size_t m_rolling_ping; Timestamp m_close_time; - + size_t m_outstanding_bytes; + size_t m_cwnd; + size_t m_ssthresh; + struct DaybreakSentPacket { DynamicPacket packet; @@ -158,7 +161,6 @@ namespace EQ sequence_out = 0; fragment_current_bytes = 0; fragment_total_bytes = 0; - outstanding_bytes = 0; } uint16_t sequence_in; @@ -171,7 +173,6 @@ namespace EQ uint32_t fragment_total_bytes; std::unordered_map outstanding_packets; - size_t outstanding_bytes; }; DaybreakStream m_streams[4]; @@ -236,8 +237,7 @@ namespace EQ tic_rate_hertz = 60.0; resend_timeout = 90000; connection_close_time = 2000; - max_outstanding_packets = 300; - max_outstanding_bytes = 200 * 512; + max_outstanding_bytes = 65535; } size_t max_packet_size; @@ -260,7 +260,6 @@ namespace EQ size_t connection_close_time; DaybreakEncodeType encode_passes[2]; int port; - size_t max_outstanding_packets; size_t max_outstanding_bytes; }; From 62531621660aa2f10f012921d079d966ac4bd974 Mon Sep 17 00:00:00 2001 From: KimLS Date: Thu, 29 Jun 2017 14:15:11 -0700 Subject: [PATCH 02/12] Change settings --- common/net/daybreak_connection.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/net/daybreak_connection.h b/common/net/daybreak_connection.h index 21ef8ffa6..9cf96b8f7 100644 --- a/common/net/daybreak_connection.h +++ b/common/net/daybreak_connection.h @@ -220,8 +220,8 @@ namespace EQ keepalive_delay_ms = 9000; resend_delay_ms = 150; resend_delay_factor = 1.5; - resend_delay_min = 150; - resend_delay_max = 1000; + resend_delay_min = 500; + resend_delay_max = 4000; connect_delay_ms = 500; stale_connection_ms = 90000; connect_stale_ms = 5000; From 8d680b22222f39ae1fec3434824434d3fd182ae7 Mon Sep 17 00:00:00 2001 From: KimLS Date: Fri, 30 Jun 2017 22:40:05 -0700 Subject: [PATCH 03/12] Some changes --- common/net/daybreak_connection.cpp | 16 +++++++++------- common/net/daybreak_connection.h | 4 ++-- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/common/net/daybreak_connection.cpp b/common/net/daybreak_connection.cpp index 57f83e9d1..2c8f59903 100644 --- a/common/net/daybreak_connection.cpp +++ b/common/net/daybreak_connection.cpp @@ -1089,18 +1089,19 @@ void EQ::Net::DaybreakConnection::Ack(int stream, uint16_t seq) auto order = CompareSequence(seq, iter->first); if (order != SequenceFuture) { - uint64_t round_time = (uint64_t)std::chrono::duration_cast(now - iter->second.last_sent).count(); + uint64_t round_time = (uint64_t)std::chrono::duration_cast(now - iter->second.first_sent).count(); m_stats.max_ping = std::max(m_stats.max_ping, round_time); m_stats.min_ping = std::min(m_stats.min_ping, round_time); m_stats.last_ping = round_time; m_rolling_ping = (m_rolling_ping * 4 + round_time) / 5; + bool filled_window = m_outstanding_bytes >= m_cwnd; m_outstanding_bytes -= iter->second.packet.Length(); iter = s->outstanding_packets.erase(iter); if (m_cwnd < m_ssthresh) { //Still in slow start mode - m_cwnd *= 2; + m_cwnd += m_max_packet_size; if (m_cwnd > m_owner->m_options.max_outstanding_bytes) { m_cwnd = m_owner->m_options.max_outstanding_bytes; } @@ -1108,7 +1109,7 @@ void EQ::Net::DaybreakConnection::Ack(int stream, uint16_t seq) LogF(Logs::Detail, Logs::Netcode, "Increasing cwnd size new size is {0}", m_cwnd); } else { - m_cwnd += m_max_packet_size; + m_cwnd += std::max((size_t)1UL, (m_max_packet_size * m_max_packet_size) / m_cwnd); if (m_cwnd > m_owner->m_options.max_outstanding_bytes) { m_cwnd = m_owner->m_options.max_outstanding_bytes; @@ -1131,19 +1132,20 @@ void EQ::Net::DaybreakConnection::OutOfOrderAck(int stream, uint16_t seq) auto s = &m_streams[stream]; auto iter = s->outstanding_packets.find(seq); if (iter != s->outstanding_packets.end()) { - uint64_t round_time = (uint64_t)std::chrono::duration_cast(now - iter->second.last_sent).count(); + uint64_t round_time = (uint64_t)std::chrono::duration_cast(now - iter->second.first_sent).count(); m_stats.max_ping = std::max(m_stats.max_ping, round_time); m_stats.min_ping = std::min(m_stats.min_ping, round_time); m_stats.last_ping = round_time; - m_rolling_ping = (m_rolling_ping * 2 + round_time) / 3; + m_rolling_ping = (m_rolling_ping * 4 + round_time) / 5; + bool filled_window = m_outstanding_bytes >= m_cwnd; m_outstanding_bytes -= iter->second.packet.Length(); s->outstanding_packets.erase(iter); if (m_cwnd < m_ssthresh) { //Still in slow start mode - m_cwnd *= 2; + m_cwnd += m_max_packet_size; if (m_cwnd > m_owner->m_options.max_outstanding_bytes) { m_cwnd = m_owner->m_options.max_outstanding_bytes; } @@ -1151,7 +1153,7 @@ void EQ::Net::DaybreakConnection::OutOfOrderAck(int stream, uint16_t seq) LogF(Logs::Detail, Logs::Netcode, "Increasing cwnd size new size is {0}", m_cwnd); } else { - m_cwnd += m_max_packet_size; + m_cwnd += std::max((size_t)1UL, (m_max_packet_size * m_max_packet_size) / m_cwnd); if (m_cwnd > m_owner->m_options.max_outstanding_bytes) { m_cwnd = m_owner->m_options.max_outstanding_bytes; diff --git a/common/net/daybreak_connection.h b/common/net/daybreak_connection.h index 9cf96b8f7..722b82c49 100644 --- a/common/net/daybreak_connection.h +++ b/common/net/daybreak_connection.h @@ -219,7 +219,7 @@ namespace EQ max_connection_count = 0; keepalive_delay_ms = 9000; resend_delay_ms = 150; - resend_delay_factor = 1.5; + resend_delay_factor = 1.25; resend_delay_min = 500; resend_delay_max = 4000; connect_delay_ms = 500; @@ -237,7 +237,7 @@ namespace EQ tic_rate_hertz = 60.0; resend_timeout = 90000; connection_close_time = 2000; - max_outstanding_bytes = 65535; + max_outstanding_bytes = 204800; } size_t max_packet_size; From eddc9c9baf70265cbe280736f6fc7d86499f7e50 Mon Sep 17 00:00:00 2001 From: KimLS Date: Sat, 1 Jul 2017 13:46:39 -0700 Subject: [PATCH 04/12] Only increase cwnd when full, fiddled with formulas --- common/net/daybreak_connection.cpp | 119 +++++++++++++---------------- common/net/daybreak_connection.h | 3 + 2 files changed, 55 insertions(+), 67 deletions(-) diff --git a/common/net/daybreak_connection.cpp b/common/net/daybreak_connection.cpp index 2c8f59903..ab4790447 100644 --- a/common/net/daybreak_connection.cpp +++ b/common/net/daybreak_connection.cpp @@ -486,6 +486,44 @@ void EQ::Net::DaybreakConnection::ProcessOutboundQueue() } } +bool EQ::Net::DaybreakConnection::CongestionWindowFull() const +{ + for (int i = 0; i < 4; ++i) { + auto stream = &m_streams[i]; + + if (!stream->buffered_packets.empty()) { + //We had to buffer packets and we only do that if the window was full + return true; + } + } + + return false; +} + +void EQ::Net::DaybreakConnection::IncreaseCongestionWindow() +{ + if (!CongestionWindowFull()) { + return; + } + + if (m_cwnd < m_ssthresh) { + m_cwnd += m_cwnd; + } + else { + m_cwnd += m_max_packet_size; + } + + m_cwnd = EQEmu::Clamp(m_cwnd, (size_t)m_max_packet_size, m_owner->m_options.max_outstanding_bytes); + LogF(Logs::Detail, Logs::Netcode, "Increasing cwnd size new size is {0}", m_cwnd); +} + +void EQ::Net::DaybreakConnection::ReduceCongestionWindow() +{ + m_cwnd = EQEmu::Clamp(m_cwnd / 2, (size_t)m_max_packet_size, m_owner->m_options.max_outstanding_bytes); + m_ssthresh = m_cwnd; + LogF(Logs::Detail, Logs::Netcode, "Reducing cwnd size new size is {0}", m_cwnd); +} + void EQ::Net::DaybreakConnection::RemoveFromQueue(int stream, uint16_t seq) { auto s = &m_streams[stream]; @@ -1048,33 +1086,17 @@ void EQ::Net::DaybreakConnection::ProcessResend(int stream) auto s = &m_streams[stream]; for (auto &entry : s->outstanding_packets) { auto time_since_last_send = std::chrono::duration_cast(now - entry.second.last_sent); - if (entry.second.times_resent == 0) { - if ((size_t)time_since_last_send.count() > m_resend_delay) { - InternalBufferedSend(entry.second.packet); - entry.second.last_sent = now; - entry.second.times_resent++; - - LogF(Logs::Detail, Logs::Netcode, "Congestion detected, reducing window size"); - m_ssthresh = m_cwnd / 2; - m_cwnd = m_cwnd / 2; - } + auto time_since_first_sent = std::chrono::duration_cast(now - entry.second.first_sent); + if (time_since_first_sent.count() >= m_owner->m_options.resend_timeout) { + Close(); + return; } - else { - auto time_since_first_sent = std::chrono::duration_cast(now - entry.second.first_sent); - if (time_since_first_sent.count() >= m_owner->m_options.resend_timeout) { - Close(); - return; - } - if ((size_t)time_since_last_send.count() > m_resend_delay) { - InternalBufferedSend(entry.second.packet); - entry.second.last_sent = now; - entry.second.times_resent++; - - LogF(Logs::Detail, Logs::Netcode, "Congestion detected, reducing window size"); - m_ssthresh = m_cwnd / 2; - m_cwnd = m_cwnd / 2; - } + if ((size_t)time_since_last_send.count() > m_resend_delay) { + InternalBufferedSend(entry.second.packet); + entry.second.last_sent = now; + entry.second.times_resent++; + ReduceCongestionWindow(); } } } @@ -1089,35 +1111,17 @@ void EQ::Net::DaybreakConnection::Ack(int stream, uint16_t seq) auto order = CompareSequence(seq, iter->first); if (order != SequenceFuture) { - uint64_t round_time = (uint64_t)std::chrono::duration_cast(now - iter->second.first_sent).count(); + uint64_t round_time = (uint64_t)std::chrono::duration_cast(now - iter->second.last_sent).count(); m_stats.max_ping = std::max(m_stats.max_ping, round_time); m_stats.min_ping = std::min(m_stats.min_ping, round_time); m_stats.last_ping = round_time; m_rolling_ping = (m_rolling_ping * 4 + round_time) / 5; - bool filled_window = m_outstanding_bytes >= m_cwnd; m_outstanding_bytes -= iter->second.packet.Length(); iter = s->outstanding_packets.erase(iter); - if (m_cwnd < m_ssthresh) { - //Still in slow start mode - m_cwnd += m_max_packet_size; - if (m_cwnd > m_owner->m_options.max_outstanding_bytes) { - m_cwnd = m_owner->m_options.max_outstanding_bytes; - } - - LogF(Logs::Detail, Logs::Netcode, "Increasing cwnd size new size is {0}", m_cwnd); - } - else { - m_cwnd += std::max((size_t)1UL, (m_max_packet_size * m_max_packet_size) / m_cwnd); - - if (m_cwnd > m_owner->m_options.max_outstanding_bytes) { - m_cwnd = m_owner->m_options.max_outstanding_bytes; - } - - LogF(Logs::Detail, Logs::Netcode, "Increasing cwnd size new size is {0}", m_cwnd); - } + IncreaseCongestionWindow(); ProcessOutboundQueue(); } else { @@ -1132,36 +1136,17 @@ void EQ::Net::DaybreakConnection::OutOfOrderAck(int stream, uint16_t seq) auto s = &m_streams[stream]; auto iter = s->outstanding_packets.find(seq); if (iter != s->outstanding_packets.end()) { - uint64_t round_time = (uint64_t)std::chrono::duration_cast(now - iter->second.first_sent).count(); + uint64_t round_time = (uint64_t)std::chrono::duration_cast(now - iter->second.last_sent).count(); m_stats.max_ping = std::max(m_stats.max_ping, round_time); m_stats.min_ping = std::min(m_stats.min_ping, round_time); m_stats.last_ping = round_time; - m_rolling_ping = (m_rolling_ping * 4 + round_time) / 5; + m_rolling_ping = (m_rolling_ping * 2 + round_time) / 3; - bool filled_window = m_outstanding_bytes >= m_cwnd; m_outstanding_bytes -= iter->second.packet.Length(); s->outstanding_packets.erase(iter); - if (m_cwnd < m_ssthresh) { - //Still in slow start mode - m_cwnd += m_max_packet_size; - if (m_cwnd > m_owner->m_options.max_outstanding_bytes) { - m_cwnd = m_owner->m_options.max_outstanding_bytes; - } - - LogF(Logs::Detail, Logs::Netcode, "Increasing cwnd size new size is {0}", m_cwnd); - } - else { - m_cwnd += std::max((size_t)1UL, (m_max_packet_size * m_max_packet_size) / m_cwnd); - - if (m_cwnd > m_owner->m_options.max_outstanding_bytes) { - m_cwnd = m_owner->m_options.max_outstanding_bytes; - } - - LogF(Logs::Detail, Logs::Netcode, "Increasing cwnd size new size is {0}", m_cwnd); - } - + IncreaseCongestionWindow(); ProcessOutboundQueue(); } } diff --git a/common/net/daybreak_connection.h b/common/net/daybreak_connection.h index 722b82c49..b190e7900 100644 --- a/common/net/daybreak_connection.h +++ b/common/net/daybreak_connection.h @@ -182,6 +182,9 @@ namespace EQ void ProcessPacket(Packet &p); void ProcessInboundQueue(); void ProcessOutboundQueue(); + bool CongestionWindowFull() const; + void IncreaseCongestionWindow(); + void ReduceCongestionWindow(); void RemoveFromQueue(int stream, uint16_t seq); void AddToQueue(int stream, uint16_t seq, const Packet &p); void ProcessDecodedPacket(const Packet &p); From c6bb4a647076e5bb4d54588855cbdf6d63d4566d Mon Sep 17 00:00:00 2001 From: KimLS Date: Mon, 3 Jul 2017 21:31:25 -0700 Subject: [PATCH 05/12] Some tweaks --- common/net/daybreak_connection.cpp | 25 ++++--------------------- common/net/daybreak_connection.h | 7 +++---- 2 files changed, 7 insertions(+), 25 deletions(-) diff --git a/common/net/daybreak_connection.cpp b/common/net/daybreak_connection.cpp index ab4790447..c8e8b1a6d 100644 --- a/common/net/daybreak_connection.cpp +++ b/common/net/daybreak_connection.cpp @@ -486,31 +486,14 @@ void EQ::Net::DaybreakConnection::ProcessOutboundQueue() } } -bool EQ::Net::DaybreakConnection::CongestionWindowFull() const -{ - for (int i = 0; i < 4; ++i) { - auto stream = &m_streams[i]; - - if (!stream->buffered_packets.empty()) { - //We had to buffer packets and we only do that if the window was full - return true; - } - } - - return false; -} - void EQ::Net::DaybreakConnection::IncreaseCongestionWindow() { - if (!CongestionWindowFull()) { - return; - } - if (m_cwnd < m_ssthresh) { - m_cwnd += m_cwnd; + m_cwnd += m_max_packet_size; } else { - m_cwnd += m_max_packet_size; + size_t denom = std::max(m_cwnd, (size_t)1U); + m_cwnd += std::max((size_t)(m_max_packet_size * m_max_packet_size / denom), (size_t)1U); } m_cwnd = EQEmu::Clamp(m_cwnd, (size_t)m_max_packet_size, m_owner->m_options.max_outstanding_bytes); @@ -519,7 +502,7 @@ void EQ::Net::DaybreakConnection::IncreaseCongestionWindow() void EQ::Net::DaybreakConnection::ReduceCongestionWindow() { - m_cwnd = EQEmu::Clamp(m_cwnd / 2, (size_t)m_max_packet_size, m_owner->m_options.max_outstanding_bytes); + m_cwnd = EQEmu::Clamp((size_t)m_max_packet_size, (size_t)m_max_packet_size, m_owner->m_options.max_outstanding_bytes); m_ssthresh = m_cwnd; LogF(Logs::Detail, Logs::Netcode, "Reducing cwnd size new size is {0}", m_cwnd); } diff --git a/common/net/daybreak_connection.h b/common/net/daybreak_connection.h index b190e7900..8cdbcb33a 100644 --- a/common/net/daybreak_connection.h +++ b/common/net/daybreak_connection.h @@ -182,7 +182,6 @@ namespace EQ void ProcessPacket(Packet &p); void ProcessInboundQueue(); void ProcessOutboundQueue(); - bool CongestionWindowFull() const; void IncreaseCongestionWindow(); void ReduceCongestionWindow(); void RemoveFromQueue(int stream, uint16_t seq); @@ -224,7 +223,7 @@ namespace EQ resend_delay_ms = 150; resend_delay_factor = 1.25; resend_delay_min = 500; - resend_delay_max = 4000; + resend_delay_max = 5000; connect_delay_ms = 500; stale_connection_ms = 90000; connect_stale_ms = 5000; @@ -234,13 +233,13 @@ namespace EQ encode_passes[1] = DaybreakEncodeType::EncodeNone; port = 0; hold_size = 448; - hold_length_ms = 10; + hold_length_ms = 40; simulated_in_packet_loss = 0; simulated_out_packet_loss = 0; tic_rate_hertz = 60.0; resend_timeout = 90000; connection_close_time = 2000; - max_outstanding_bytes = 204800; + max_outstanding_bytes = 48000; } size_t max_packet_size; From 10b01e62dfa95d859b2f3dc02e88cc1ff25a3459 Mon Sep 17 00:00:00 2001 From: KimLS Date: Tue, 4 Jul 2017 12:45:23 -0700 Subject: [PATCH 06/12] More tweaks --- common/net/daybreak_connection.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/common/net/daybreak_connection.cpp b/common/net/daybreak_connection.cpp index c8e8b1a6d..73b3b7b9b 100644 --- a/common/net/daybreak_connection.cpp +++ b/common/net/daybreak_connection.cpp @@ -284,7 +284,7 @@ EQ::Net::DaybreakConnection::DaybreakConnection(DaybreakConnectionManager *owner m_combined[1] = OP_Combined; m_last_session_stats = Clock::now(); m_outstanding_bytes = 0; - m_cwnd = m_max_packet_size; + m_cwnd = m_max_packet_size * 4; m_ssthresh = m_owner->m_options.max_outstanding_bytes; } @@ -310,7 +310,7 @@ EQ::Net::DaybreakConnection::DaybreakConnection(DaybreakConnectionManager *owner m_combined[1] = OP_Combined; m_last_session_stats = Clock::now(); m_outstanding_bytes = 0; - m_cwnd = m_max_packet_size; + m_cwnd = m_max_packet_size * 4; m_ssthresh = m_owner->m_options.max_outstanding_bytes; } @@ -502,8 +502,9 @@ void EQ::Net::DaybreakConnection::IncreaseCongestionWindow() void EQ::Net::DaybreakConnection::ReduceCongestionWindow() { - m_cwnd = EQEmu::Clamp((size_t)m_max_packet_size, (size_t)m_max_packet_size, m_owner->m_options.max_outstanding_bytes); - m_ssthresh = m_cwnd; + m_ssthresh = EQEmu::ClampLower(m_cwnd / 2, (size_t)(8 * m_max_packet_size)); + m_cwnd = (size_t)m_max_packet_size * 4; + LogF(Logs::Detail, Logs::Netcode, "Reducing cwnd size new size is {0}", m_cwnd); } From 49505a7a45b83457705f6d033ce8461f4eacbc1d Mon Sep 17 00:00:00 2001 From: KimLS Date: Tue, 4 Jul 2017 21:03:49 -0700 Subject: [PATCH 07/12] Bug fix plus tweak to reset cwnd when no longer needed --- common/net/daybreak_connection.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/common/net/daybreak_connection.cpp b/common/net/daybreak_connection.cpp index 73b3b7b9b..cac63451c 100644 --- a/common/net/daybreak_connection.cpp +++ b/common/net/daybreak_connection.cpp @@ -140,8 +140,9 @@ void EQ::Net::DaybreakConnectionManager::Process() if ((size_t)time_since_last_send.count() > m_options.connect_delay_ms) { connection->SendConnect(); } + + break; } - break; case StatusConnected: { if (m_options.keepalive_delay_ms != 0) { auto time_since_last_send = std::chrono::duration_cast(now - connection->m_last_send); @@ -372,6 +373,11 @@ void EQ::Net::DaybreakConnection::Process() } ProcessInboundQueue(); + + if (m_outstanding_bytes == 0) { + m_cwnd = 4 * m_max_packet_size; + m_ssthresh = m_owner->m_options.max_outstanding_bytes; + } } catch (std::exception ex) { LogF(Logs::Detail, Logs::Netcode, "Error processing connection: {0}", ex.what()); @@ -480,7 +486,7 @@ void EQ::Net::DaybreakConnection::ProcessOutboundQueue() LogF(Logs::Detail, Logs::Netcode, "Sending buffered packet {0} on stream {1}", buff.seq, i); m_outstanding_bytes += buff.sent.packet.Length(); stream->outstanding_packets.insert(std::make_pair(buff.seq, buff.sent)); - InternalSend(buff.sent.packet); + InternalBufferedSend(buff.sent.packet); stream->buffered_packets.pop_front(); } } @@ -502,7 +508,7 @@ void EQ::Net::DaybreakConnection::IncreaseCongestionWindow() void EQ::Net::DaybreakConnection::ReduceCongestionWindow() { - m_ssthresh = EQEmu::ClampLower(m_cwnd / 2, (size_t)(8 * m_max_packet_size)); + m_ssthresh = std::max((size_t)m_cwnd / 2, (size_t)m_max_packet_size * 2); m_cwnd = (size_t)m_max_packet_size * 4; LogF(Logs::Detail, Logs::Netcode, "Reducing cwnd size new size is {0}", m_cwnd); From a7c0e82c9ebbde140ab83e2b7358e11eef51166b Mon Sep 17 00:00:00 2001 From: KimLS Date: Wed, 5 Jul 2017 20:24:39 -0700 Subject: [PATCH 08/12] Tweaks and bug fixes --- common/net/daybreak_connection.cpp | 46 +++++++++++++++++++----------- common/net/daybreak_connection.h | 5 +++- 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/common/net/daybreak_connection.cpp b/common/net/daybreak_connection.cpp index cac63451c..34f325434 100644 --- a/common/net/daybreak_connection.cpp +++ b/common/net/daybreak_connection.cpp @@ -285,7 +285,8 @@ EQ::Net::DaybreakConnection::DaybreakConnection(DaybreakConnectionManager *owner m_combined[1] = OP_Combined; m_last_session_stats = Clock::now(); m_outstanding_bytes = 0; - m_cwnd = m_max_packet_size * 4; + m_outstanding_packets = 0; + m_cwnd = m_max_packet_size; m_ssthresh = m_owner->m_options.max_outstanding_bytes; } @@ -311,7 +312,8 @@ EQ::Net::DaybreakConnection::DaybreakConnection(DaybreakConnectionManager *owner m_combined[1] = OP_Combined; m_last_session_stats = Clock::now(); m_outstanding_bytes = 0; - m_cwnd = m_max_packet_size * 4; + m_outstanding_packets = 0; + m_cwnd = m_max_packet_size; m_ssthresh = m_owner->m_options.max_outstanding_bytes; } @@ -373,11 +375,6 @@ void EQ::Net::DaybreakConnection::Process() } ProcessInboundQueue(); - - if (m_outstanding_bytes == 0) { - m_cwnd = 4 * m_max_packet_size; - m_ssthresh = m_owner->m_options.max_outstanding_bytes; - } } catch (std::exception ex) { LogF(Logs::Detail, Logs::Netcode, "Error processing connection: {0}", ex.what()); @@ -479,12 +476,17 @@ void EQ::Net::DaybreakConnection::ProcessOutboundQueue() while (!stream->buffered_packets.empty()) { auto &buff = stream->buffered_packets.front(); + if (m_outstanding_packets + 1 >= m_owner->m_options.max_outstanding_packets) { + break; + } + if (m_outstanding_bytes + buff.sent.packet.Length() >= m_cwnd) { break; } LogF(Logs::Detail, Logs::Netcode, "Sending buffered packet {0} on stream {1}", buff.seq, i); m_outstanding_bytes += buff.sent.packet.Length(); + m_outstanding_packets++; stream->outstanding_packets.insert(std::make_pair(buff.seq, buff.sent)); InternalBufferedSend(buff.sent.packet); stream->buffered_packets.pop_front(); @@ -495,11 +497,11 @@ void EQ::Net::DaybreakConnection::ProcessOutboundQueue() void EQ::Net::DaybreakConnection::IncreaseCongestionWindow() { if (m_cwnd < m_ssthresh) { - m_cwnd += m_max_packet_size; + m_cwnd *= 2; } else { size_t denom = std::max(m_cwnd, (size_t)1U); - m_cwnd += std::max((size_t)(m_max_packet_size * m_max_packet_size / denom), (size_t)1U); + m_cwnd += m_max_packet_size; } m_cwnd = EQEmu::Clamp(m_cwnd, (size_t)m_max_packet_size, m_owner->m_options.max_outstanding_bytes); @@ -509,7 +511,7 @@ void EQ::Net::DaybreakConnection::IncreaseCongestionWindow() void EQ::Net::DaybreakConnection::ReduceCongestionWindow() { m_ssthresh = std::max((size_t)m_cwnd / 2, (size_t)m_max_packet_size * 2); - m_cwnd = (size_t)m_max_packet_size * 4; + m_cwnd = m_ssthresh; LogF(Logs::Detail, Logs::Netcode, "Reducing cwnd size new size is {0}", m_cwnd); } @@ -1097,6 +1099,7 @@ void EQ::Net::DaybreakConnection::Ack(int stream, uint16_t seq) auto now = Clock::now(); auto s = &m_streams[stream]; auto iter = s->outstanding_packets.begin(); + bool success = false; while (iter != s->outstanding_packets.end()) { auto order = CompareSequence(seq, iter->first); @@ -1109,15 +1112,19 @@ void EQ::Net::DaybreakConnection::Ack(int stream, uint16_t seq) m_rolling_ping = (m_rolling_ping * 4 + round_time) / 5; m_outstanding_bytes -= iter->second.packet.Length(); + m_outstanding_packets--; iter = s->outstanding_packets.erase(iter); - - IncreaseCongestionWindow(); - ProcessOutboundQueue(); + success = true; } else { ++iter; } } + + if (success) { + IncreaseCongestionWindow(); + ProcessOutboundQueue(); + } } void EQ::Net::DaybreakConnection::OutOfOrderAck(int stream, uint16_t seq) @@ -1134,6 +1141,7 @@ void EQ::Net::DaybreakConnection::OutOfOrderAck(int stream, uint16_t seq) m_rolling_ping = (m_rolling_ping * 2 + round_time) / 3; m_outstanding_bytes -= iter->second.packet.Length(); + m_outstanding_packets--; s->outstanding_packets.erase(iter); IncreaseCongestionWindow(); @@ -1144,9 +1152,8 @@ void EQ::Net::DaybreakConnection::OutOfOrderAck(int stream, uint16_t seq) void EQ::Net::DaybreakConnection::BufferPacket(int stream, uint16_t seq, DaybreakSentPacket &sent) { auto s = &m_streams[stream]; - //If we can send the packet then send it - //else buffer it to be sent when we can send it - if (m_outstanding_bytes + sent.packet.Length() > m_cwnd) { + if (m_outstanding_bytes + sent.packet.Length() > m_cwnd || + m_outstanding_packets + 1 > m_owner->m_options.max_outstanding_packets) { //Would go over one of the limits, buffer this packet. DaybreakBufferedPacket bp; bp.sent = std::move(sent); @@ -1157,8 +1164,9 @@ void EQ::Net::DaybreakConnection::BufferPacket(int stream, uint16_t seq, Daybrea } m_outstanding_bytes += sent.packet.Length(); + m_outstanding_packets++; s->outstanding_packets.insert(std::make_pair(seq, sent)); - InternalSend(sent.packet); + InternalBufferedSend(sent.packet); } void EQ::Net::DaybreakConnection::SendAck(int stream_id, uint16_t seq) @@ -1212,6 +1220,10 @@ void EQ::Net::DaybreakConnection::InternalBufferedSend(Packet &p) FlushBuffer(); } + if (m_buffered_packets_length == 0) { + m_hold_time = Clock::now(); + } + DynamicPacket copy; copy.PutPacket(0, p); m_buffered_packets.push_back(copy); diff --git a/common/net/daybreak_connection.h b/common/net/daybreak_connection.h index 8cdbcb33a..0e4b5b9b8 100644 --- a/common/net/daybreak_connection.h +++ b/common/net/daybreak_connection.h @@ -137,6 +137,7 @@ namespace EQ size_t m_rolling_ping; Timestamp m_close_time; size_t m_outstanding_bytes; + size_t m_outstanding_packets; size_t m_cwnd; size_t m_ssthresh; @@ -239,7 +240,8 @@ namespace EQ tic_rate_hertz = 60.0; resend_timeout = 90000; connection_close_time = 2000; - max_outstanding_bytes = 48000; + max_outstanding_bytes = 204800; + max_outstanding_packets = 400; } size_t max_packet_size; @@ -263,6 +265,7 @@ namespace EQ DaybreakEncodeType encode_passes[2]; int port; size_t max_outstanding_bytes; + size_t max_outstanding_packets; }; class DaybreakConnectionManager From f8b56371127af9a36a2dcb4f79da9da96c68d526 Mon Sep 17 00:00:00 2001 From: Akkadius Date: Thu, 6 Jul 2017 10:13:33 -0500 Subject: [PATCH 09/12] Fix close combat positioning issues --- zone/mob_ai.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/zone/mob_ai.cpp b/zone/mob_ai.cpp index dd814df12..d777c5f44 100644 --- a/zone/mob_ai.cpp +++ b/zone/mob_ai.cpp @@ -1003,6 +1003,10 @@ void Mob::AI_Process() { if (DistanceNoZ(this->GetPosition(), this->GetTarget()->GetPosition()) > 50) { this->FixZ(); } + /* If we are close to client and our Z differences aren't big, match the client */ + else if (std::abs(this->GetZ() - this->GetTarget()->GetZ()) <= 5) { + this->m_Position.z = this->GetTarget()->GetZ(); + } } if (!(m_PlayerState & static_cast(PlayerState::Aggressive))) From 786e03b0acc1dc5bd904ba5b03112d431de21fa0 Mon Sep 17 00:00:00 2001 From: Akkadius Date: Thu, 6 Jul 2017 10:33:03 -0500 Subject: [PATCH 10/12] One more check --- zone/mob_ai.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zone/mob_ai.cpp b/zone/mob_ai.cpp index d777c5f44..6b3be34d8 100644 --- a/zone/mob_ai.cpp +++ b/zone/mob_ai.cpp @@ -1004,7 +1004,7 @@ void Mob::AI_Process() { this->FixZ(); } /* If we are close to client and our Z differences aren't big, match the client */ - else if (std::abs(this->GetZ() - this->GetTarget()->GetZ()) <= 5) { + else if (std::abs(this->GetZ() - this->GetTarget()->GetZ()) <= 5 && this->GetTarget()->IsClient()) { this->m_Position.z = this->GetTarget()->GetZ(); } } From 3878bd0c76ea49f017011f3cb36af3df09a1aa7a Mon Sep 17 00:00:00 2001 From: KimLS Date: Thu, 6 Jul 2017 17:25:00 -0700 Subject: [PATCH 11/12] Move to an older implementation --- common/net/daybreak_connection.cpp | 115 ++++++++++------------------- common/net/daybreak_connection.h | 26 +++---- 2 files changed, 50 insertions(+), 91 deletions(-) diff --git a/common/net/daybreak_connection.cpp b/common/net/daybreak_connection.cpp index 34f325434..f3329a976 100644 --- a/common/net/daybreak_connection.cpp +++ b/common/net/daybreak_connection.cpp @@ -140,9 +140,8 @@ void EQ::Net::DaybreakConnectionManager::Process() if ((size_t)time_since_last_send.count() > m_options.connect_delay_ms) { connection->SendConnect(); } - - break; } + break; case StatusConnected: { if (m_options.keepalive_delay_ms != 0) { auto time_since_last_send = std::chrono::duration_cast(now - connection->m_last_send); @@ -284,10 +283,6 @@ EQ::Net::DaybreakConnection::DaybreakConnection(DaybreakConnectionManager *owner m_combined[0] = 0; m_combined[1] = OP_Combined; m_last_session_stats = Clock::now(); - m_outstanding_bytes = 0; - m_outstanding_packets = 0; - m_cwnd = m_max_packet_size; - m_ssthresh = m_owner->m_options.max_outstanding_bytes; } //new connection made as client @@ -311,10 +306,6 @@ EQ::Net::DaybreakConnection::DaybreakConnection(DaybreakConnectionManager *owner m_combined[0] = 0; m_combined[1] = OP_Combined; m_last_session_stats = Clock::now(); - m_outstanding_bytes = 0; - m_outstanding_packets = 0; - m_cwnd = m_max_packet_size; - m_ssthresh = m_owner->m_options.max_outstanding_bytes; } EQ::Net::DaybreakConnection::~DaybreakConnection() @@ -473,49 +464,26 @@ void EQ::Net::DaybreakConnection::ProcessOutboundQueue() for (int i = 0; i < 4; ++i) { auto stream = &m_streams[i]; + if (stream->outstanding_bytes == 0) { + continue; + } + while (!stream->buffered_packets.empty()) { auto &buff = stream->buffered_packets.front(); - if (m_outstanding_packets + 1 >= m_owner->m_options.max_outstanding_packets) { + if (stream->outstanding_bytes + buff.sent.packet.Length() >= m_owner->m_options.max_outstanding_bytes || + stream->outstanding_packets.size() + 1 >= m_owner->m_options.max_outstanding_packets) { break; } - if (m_outstanding_bytes + buff.sent.packet.Length() >= m_cwnd) { - break; - } - - LogF(Logs::Detail, Logs::Netcode, "Sending buffered packet {0} on stream {1}", buff.seq, i); - m_outstanding_bytes += buff.sent.packet.Length(); - m_outstanding_packets++; + stream->outstanding_bytes += buff.sent.packet.Length(); stream->outstanding_packets.insert(std::make_pair(buff.seq, buff.sent)); - InternalBufferedSend(buff.sent.packet); + InternalSend(buff.sent.packet); stream->buffered_packets.pop_front(); } } } -void EQ::Net::DaybreakConnection::IncreaseCongestionWindow() -{ - if (m_cwnd < m_ssthresh) { - m_cwnd *= 2; - } - else { - size_t denom = std::max(m_cwnd, (size_t)1U); - m_cwnd += m_max_packet_size; - } - - m_cwnd = EQEmu::Clamp(m_cwnd, (size_t)m_max_packet_size, m_owner->m_options.max_outstanding_bytes); - LogF(Logs::Detail, Logs::Netcode, "Increasing cwnd size new size is {0}", m_cwnd); -} - -void EQ::Net::DaybreakConnection::ReduceCongestionWindow() -{ - m_ssthresh = std::max((size_t)m_cwnd / 2, (size_t)m_max_packet_size * 2); - m_cwnd = m_ssthresh; - - LogF(Logs::Detail, Logs::Netcode, "Reducing cwnd size new size is {0}", m_cwnd); -} - void EQ::Net::DaybreakConnection::RemoveFromQueue(int stream, uint16_t seq) { auto s = &m_streams[stream]; @@ -1078,17 +1046,27 @@ void EQ::Net::DaybreakConnection::ProcessResend(int stream) auto s = &m_streams[stream]; for (auto &entry : s->outstanding_packets) { auto time_since_last_send = std::chrono::duration_cast(now - entry.second.last_sent); - auto time_since_first_sent = std::chrono::duration_cast(now - entry.second.first_sent); - if (time_since_first_sent.count() >= m_owner->m_options.resend_timeout) { - Close(); - return; + if (entry.second.times_resent == 0) { + if ((size_t)time_since_last_send.count() > m_resend_delay) { + InternalBufferedSend(entry.second.packet); + entry.second.last_sent = now; + entry.second.times_resent++; + m_rolling_ping += 100; + } } + else { + auto time_since_first_sent = std::chrono::duration_cast(now - entry.second.first_sent); + if (time_since_first_sent.count() >= m_owner->m_options.resend_timeout) { + Close(); + return; + } - if ((size_t)time_since_last_send.count() > m_resend_delay) { - InternalBufferedSend(entry.second.packet); - entry.second.last_sent = now; - entry.second.times_resent++; - ReduceCongestionWindow(); + if ((size_t)time_since_last_send.count() > m_resend_delay) { + InternalBufferedSend(entry.second.packet); + entry.second.last_sent = now; + entry.second.times_resent++; + m_rolling_ping += 100; + } } } } @@ -1099,32 +1077,25 @@ void EQ::Net::DaybreakConnection::Ack(int stream, uint16_t seq) auto now = Clock::now(); auto s = &m_streams[stream]; auto iter = s->outstanding_packets.begin(); - bool success = false; while (iter != s->outstanding_packets.end()) { auto order = CompareSequence(seq, iter->first); - if (order != SequenceFuture) { + if (order != SequenceFuture) { uint64_t round_time = (uint64_t)std::chrono::duration_cast(now - iter->second.last_sent).count(); m_stats.max_ping = std::max(m_stats.max_ping, round_time); m_stats.min_ping = std::min(m_stats.min_ping, round_time); m_stats.last_ping = round_time; - m_rolling_ping = (m_rolling_ping * 4 + round_time) / 5; + m_rolling_ping = (m_rolling_ping * 2 + round_time) / 3; - m_outstanding_bytes -= iter->second.packet.Length(); - m_outstanding_packets--; + s->outstanding_bytes -= iter->second.packet.Length(); iter = s->outstanding_packets.erase(iter); - success = true; + ProcessOutboundQueue(); } else { ++iter; } } - - if (success) { - IncreaseCongestionWindow(); - ProcessOutboundQueue(); - } } void EQ::Net::DaybreakConnection::OutOfOrderAck(int stream, uint16_t seq) @@ -1140,11 +1111,8 @@ void EQ::Net::DaybreakConnection::OutOfOrderAck(int stream, uint16_t seq) m_stats.last_ping = round_time; m_rolling_ping = (m_rolling_ping * 2 + round_time) / 3; - m_outstanding_bytes -= iter->second.packet.Length(); - m_outstanding_packets--; + s->outstanding_bytes -= iter->second.packet.Length(); s->outstanding_packets.erase(iter); - - IncreaseCongestionWindow(); ProcessOutboundQueue(); } } @@ -1152,21 +1120,20 @@ void EQ::Net::DaybreakConnection::OutOfOrderAck(int stream, uint16_t seq) void EQ::Net::DaybreakConnection::BufferPacket(int stream, uint16_t seq, DaybreakSentPacket &sent) { auto s = &m_streams[stream]; - if (m_outstanding_bytes + sent.packet.Length() > m_cwnd || - m_outstanding_packets + 1 > m_owner->m_options.max_outstanding_packets) { + //If we can send the packet then send it + //else buffer it to be sent when we can send it + if (s->outstanding_bytes + sent.packet.Length() >= m_owner->m_options.max_outstanding_bytes || s->outstanding_packets.size() + 1 >= m_owner->m_options.max_outstanding_packets) { //Would go over one of the limits, buffer this packet. DaybreakBufferedPacket bp; bp.sent = std::move(sent); bp.seq = seq; s->buffered_packets.push_back(bp); - LogF(Logs::Detail, Logs::Netcode, "Buffering packet {0} on stream {1}", seq, stream); return; } - m_outstanding_bytes += sent.packet.Length(); - m_outstanding_packets++; + s->outstanding_bytes += sent.packet.Length(); s->outstanding_packets.insert(std::make_pair(seq, sent)); - InternalBufferedSend(sent.packet); + InternalSend(sent.packet); } void EQ::Net::DaybreakConnection::SendAck(int stream_id, uint16_t seq) @@ -1220,10 +1187,6 @@ void EQ::Net::DaybreakConnection::InternalBufferedSend(Packet &p) FlushBuffer(); } - if (m_buffered_packets_length == 0) { - m_hold_time = Clock::now(); - } - DynamicPacket copy; copy.PutPacket(0, p); m_buffered_packets.push_back(copy); @@ -1475,4 +1438,4 @@ EQ::Net::SequenceOrder EQ::Net::DaybreakConnection::CompareSequence(uint16_t exp } return SequencePast; -} +} \ No newline at end of file diff --git a/common/net/daybreak_connection.h b/common/net/daybreak_connection.h index 0e4b5b9b8..ffda5cbae 100644 --- a/common/net/daybreak_connection.h +++ b/common/net/daybreak_connection.h @@ -136,11 +136,7 @@ namespace EQ size_t m_resend_delay; size_t m_rolling_ping; Timestamp m_close_time; - size_t m_outstanding_bytes; - size_t m_outstanding_packets; - size_t m_cwnd; - size_t m_ssthresh; - + struct DaybreakSentPacket { DynamicPacket packet; @@ -162,6 +158,7 @@ namespace EQ sequence_out = 0; fragment_current_bytes = 0; fragment_total_bytes = 0; + outstanding_bytes = 0; } uint16_t sequence_in; @@ -174,6 +171,7 @@ namespace EQ uint32_t fragment_total_bytes; std::unordered_map outstanding_packets; + size_t outstanding_bytes; }; DaybreakStream m_streams[4]; @@ -183,8 +181,6 @@ namespace EQ void ProcessPacket(Packet &p); void ProcessInboundQueue(); void ProcessOutboundQueue(); - void IncreaseCongestionWindow(); - void ReduceCongestionWindow(); void RemoveFromQueue(int stream, uint16_t seq); void AddToQueue(int stream, uint16_t seq, const Packet &p); void ProcessDecodedPacket(const Packet &p); @@ -222,9 +218,9 @@ namespace EQ max_connection_count = 0; keepalive_delay_ms = 9000; resend_delay_ms = 150; - resend_delay_factor = 1.25; - resend_delay_min = 500; - resend_delay_max = 5000; + resend_delay_factor = 1.5; + resend_delay_min = 150; + resend_delay_max = 1000; connect_delay_ms = 500; stale_connection_ms = 90000; connect_stale_ms = 5000; @@ -234,14 +230,14 @@ namespace EQ encode_passes[1] = DaybreakEncodeType::EncodeNone; port = 0; hold_size = 448; - hold_length_ms = 40; + hold_length_ms = 10; simulated_in_packet_loss = 0; simulated_out_packet_loss = 0; tic_rate_hertz = 60.0; resend_timeout = 90000; connection_close_time = 2000; - max_outstanding_bytes = 204800; - max_outstanding_packets = 400; + max_outstanding_packets = 300; + max_outstanding_bytes = 200 * 512; } size_t max_packet_size; @@ -264,8 +260,8 @@ namespace EQ size_t connection_close_time; DaybreakEncodeType encode_passes[2]; int port; - size_t max_outstanding_bytes; size_t max_outstanding_packets; + size_t max_outstanding_bytes; }; class DaybreakConnectionManager @@ -302,4 +298,4 @@ namespace EQ friend class DaybreakConnection; }; } -} +} \ No newline at end of file From 7300776a856d8076b9c91a1e215fb7dc99d38199 Mon Sep 17 00:00:00 2001 From: KimLS Date: Thu, 6 Jul 2017 18:03:19 -0700 Subject: [PATCH 12/12] Fix for bug where packets were not combining when sent inside cwnd, altered some settings --- common/net/daybreak_connection.cpp | 10 +++++++--- common/net/daybreak_connection.h | 10 +++++----- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/common/net/daybreak_connection.cpp b/common/net/daybreak_connection.cpp index f3329a976..de21485d3 100644 --- a/common/net/daybreak_connection.cpp +++ b/common/net/daybreak_connection.cpp @@ -141,7 +141,7 @@ void EQ::Net::DaybreakConnectionManager::Process() connection->SendConnect(); } } - break; + break; case StatusConnected: { if (m_options.keepalive_delay_ms != 0) { auto time_since_last_send = std::chrono::duration_cast(now - connection->m_last_send); @@ -478,7 +478,7 @@ void EQ::Net::DaybreakConnection::ProcessOutboundQueue() stream->outstanding_bytes += buff.sent.packet.Length(); stream->outstanding_packets.insert(std::make_pair(buff.seq, buff.sent)); - InternalSend(buff.sent.packet); + InternalBufferedSend(buff.sent.packet); stream->buffered_packets.pop_front(); } } @@ -1133,7 +1133,7 @@ void EQ::Net::DaybreakConnection::BufferPacket(int stream, uint16_t seq, Daybrea s->outstanding_bytes += sent.packet.Length(); s->outstanding_packets.insert(std::make_pair(seq, sent)); - InternalSend(sent.packet); + InternalBufferedSend(sent.packet); } void EQ::Net::DaybreakConnection::SendAck(int stream_id, uint16_t seq) @@ -1187,6 +1187,10 @@ void EQ::Net::DaybreakConnection::InternalBufferedSend(Packet &p) FlushBuffer(); } + if (m_buffered_packets.size() == 0) { + m_hold_time = Clock::now(); + } + DynamicPacket copy; copy.PutPacket(0, p); m_buffered_packets.push_back(copy); diff --git a/common/net/daybreak_connection.h b/common/net/daybreak_connection.h index ffda5cbae..bbd0c7d93 100644 --- a/common/net/daybreak_connection.h +++ b/common/net/daybreak_connection.h @@ -219,8 +219,8 @@ namespace EQ keepalive_delay_ms = 9000; resend_delay_ms = 150; resend_delay_factor = 1.5; - resend_delay_min = 150; - resend_delay_max = 1000; + resend_delay_min = 300; + resend_delay_max = 3000; connect_delay_ms = 500; stale_connection_ms = 90000; connect_stale_ms = 5000; @@ -230,14 +230,14 @@ namespace EQ encode_passes[1] = DaybreakEncodeType::EncodeNone; port = 0; hold_size = 448; - hold_length_ms = 10; + hold_length_ms = 50; simulated_in_packet_loss = 0; simulated_out_packet_loss = 0; tic_rate_hertz = 60.0; resend_timeout = 90000; connection_close_time = 2000; - max_outstanding_packets = 300; - max_outstanding_bytes = 200 * 512; + max_outstanding_packets = 400; + max_outstanding_bytes = 400 * 512; } size_t max_packet_size;