diff --git a/common/net/daybreak_connection.cpp b/common/net/daybreak_connection.cpp index 6c69bdf61..63bf38894 100644 --- a/common/net/daybreak_connection.cpp +++ b/common/net/daybreak_connection.cpp @@ -1130,7 +1130,9 @@ void EQ::Net::DaybreakConnection::ProcessResend(int stream) auto now_ms = std::chrono::duration_cast(now.time_since_epoch()).count(); auto first_sent_ms = std::chrono::duration_cast(first_packet.first_sent.time_since_epoch()).count(); LogNetClient( - "Closing connection time_since_first_sent [{}] >= m_owner->m_options.resend_timeout [{}] now [{}] first_packet.first_sent [{}]", + "Closing connection for m_endpoint [{}] m_port [{}] time_since_first_sent [{}] >= m_owner->m_options.resend_timeout [{}] now [{}] first_packet.first_sent [{}]", + m_endpoint, + m_port, time_since_first_sent, m_owner->m_options.resend_timeout, now_ms, @@ -1139,41 +1141,61 @@ void EQ::Net::DaybreakConnection::ProcessResend(int stream) Close(); return; } + + if (m_last_ack - now > std::chrono::milliseconds(1000)) { + LogNetClient( + "Resetting m_acked_since_last_resend flag for m_endpoint [{}] m_port [{}]", + m_endpoint, + m_port + ); + m_acked_since_last_resend = true; + } + + // make sure that the first_packet in the list first_sent time is within the resend_delay and now + // if it is not, then we need to resend all packets in the list + if (time_since_first_sent <= first_packet.resend_delay && !m_acked_since_last_resend) { + LogNetClient( + "Not resending packets for m_endpoint [{}] m_port [{}] packets [{}] time_first_sent [{}] resend_delay [{}] m_acked_since_last_resend [{}]", + m_endpoint, + m_port, + s->sent_packets.size(), + time_since_first_sent, + first_packet.resend_delay, + m_acked_since_last_resend + ); + return; + } } - if (LogSys.IsLogEnabled(Logs::Detail, Logs::Netcode)) { + if (LogSys.IsLogEnabled(Logs::General, Logs::NetClient)) { size_t total_size = 0; for (auto &e: s->sent_packets) { total_size += e.second.packet.Length(); } LogNetClient( - "Resending packets for stream [{}] packet count [{}] total packet size [{}]", - stream, + "Resending packets for m_endpoint [{}] m_port [{}] packet count [{}] total packet size [{}] m_acked_since_last_resend [{}]", + m_endpoint, + m_port, s->sent_packets.size(), - total_size + total_size, + m_acked_since_last_resend ); } - LogNetClient("Resending packets for stream [{}] packet count [{}] total packet size [{}]", - stream, - s->sent_packets.size(), - m_resend_bytes_sent - ); - for (auto &e: s->sent_packets) { - // if (m_resend_packets_sent >= MAX_CLIENT_RECV_PACKETS_PER_WINDOW || - // m_resend_bytes_sent >= MAX_CLIENT_RECV_BYTES_PER_WINDOW) { - // LogNetClient( - // "Stopping resend because we hit thresholds m_resend_packets_sent [{}] max [{}] in_queue [{}] m_resend_bytes_sent [{}] max [{}]", - // m_resend_packets_sent, - // MAX_CLIENT_RECV_PACKETS_PER_WINDOW, - // s->sent_packets.size(), - // m_resend_bytes_sent, - // MAX_CLIENT_RECV_BYTES_PER_WINDOW - // ); - // break; - // } + if (m_resend_packets_sent >= MAX_CLIENT_RECV_PACKETS_PER_WINDOW || + m_resend_bytes_sent >= MAX_CLIENT_RECV_BYTES_PER_WINDOW) { + LogNetClient( + "Stopping resend because we hit thresholds m_resend_packets_sent [{}] max [{}] in_queue [{}] m_resend_bytes_sent [{}] max [{}]", + m_resend_packets_sent, + MAX_CLIENT_RECV_PACKETS_PER_WINDOW, + s->sent_packets.size(), + m_resend_bytes_sent, + MAX_CLIENT_RECV_BYTES_PER_WINDOW + ); + break; + } auto &sp = e.second; auto &p = sp.packet; @@ -1203,11 +1225,13 @@ void EQ::Net::DaybreakConnection::ProcessResend(int stream) m_owner->m_options.resend_delay_max ); } + + m_acked_since_last_resend = false; + m_last_ack = now; } void EQ::Net::DaybreakConnection::Ack(int stream, uint16_t seq) { - auto now = Clock::now(); auto s = &m_streams[stream]; auto iter = s->sent_packets.begin(); @@ -1228,6 +1252,9 @@ void EQ::Net::DaybreakConnection::Ack(int stream, uint16_t seq) ++iter; } } + + m_acked_since_last_resend = true; + m_last_ack = now; } void EQ::Net::DaybreakConnection::OutOfOrderAck(int stream, uint16_t seq) @@ -1245,6 +1272,9 @@ void EQ::Net::DaybreakConnection::OutOfOrderAck(int stream, uint16_t seq) s->sent_packets.erase(iter); } + + m_acked_since_last_resend = true; + m_last_ack = now; } void EQ::Net::DaybreakConnection::UpdateDataBudget(double budget_add) diff --git a/common/net/daybreak_connection.h b/common/net/daybreak_connection.h index 016f7f4ea..90f66145d 100644 --- a/common/net/daybreak_connection.h +++ b/common/net/daybreak_connection.h @@ -185,6 +185,8 @@ namespace EQ // resend tracking size_t m_resend_packets_sent = 0; size_t m_resend_bytes_sent = 0; + bool m_acked_since_last_resend = false; + Timestamp m_last_ack; struct DaybreakSentPacket {