From 7903c7c17e01950f27e0c27e2df8db1364a16f28 Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Sat, 6 Apr 2024 20:36:37 +0100 Subject: [PATCH] DEV9: Improve tracking of acknowledged data --- .../DEV9/Sessions/TCP_Session/TCP_Session.cpp | 11 +++++++++++ pcsx2/DEV9/Sessions/TCP_Session/TCP_Session.h | 3 +++ .../Sessions/TCP_Session/TCP_Session_In.cpp | 19 ++++++++++++------- .../Sessions/TCP_Session/TCP_Session_Out.cpp | 2 ++ 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/pcsx2/DEV9/Sessions/TCP_Session/TCP_Session.cpp b/pcsx2/DEV9/Sessions/TCP_Session/TCP_Session.cpp index 2185ab9a14..f86d2c3cd2 100644 --- a/pcsx2/DEV9/Sessions/TCP_Session/TCP_Session.cpp +++ b/pcsx2/DEV9/Sessions/TCP_Session/TCP_Session.cpp @@ -39,11 +39,22 @@ namespace Sessions _MySequenceNumber += amount; } + void TCP_Session::UpdateReceivedAckNumber(u32 ack) + { + std::lock_guard numberlock(myNumberSentry); + if (GetDelta(ack, _ReceivedAckNumber) > 0) + _ReceivedAckNumber = ack; + } u32 TCP_Session::GetMyNumber() { std::lock_guard numberlock(myNumberSentry); return _MySequenceNumber; } + u32 TCP_Session::GetOutstandingSequenceLength() + { + std::lock_guard numberlock(myNumberSentry); + return GetDelta(_MySequenceNumber, _ReceivedAckNumber); + } std::tuple> TCP_Session::GetAllMyNumbers() { std::lock_guard numberlock(myNumberSentry); diff --git a/pcsx2/DEV9/Sessions/TCP_Session/TCP_Session.h b/pcsx2/DEV9/Sessions/TCP_Session/TCP_Session.h index 765574fdca..800466d219 100644 --- a/pcsx2/DEV9/Sessions/TCP_Session/TCP_Session.h +++ b/pcsx2/DEV9/Sessions/TCP_Session/TCP_Session.h @@ -71,6 +71,7 @@ namespace Sessions const int oldMyNumCount = 64; u32 _MySequenceNumber = 1; std::vector _OldMyNumbers; + u32 _ReceivedAckNumber = 1; std::atomic myNumberACKed{true}; public: @@ -89,7 +90,9 @@ namespace Sessions PacketReader::IP::TCP::TCP_Packet* PopRecvBuff(); void IncrementMyNumber(u32 amount); + void UpdateReceivedAckNumber(u32 ack); u32 GetMyNumber(); + u32 GetOutstandingSequenceLength(); std::tuple> GetAllMyNumbers(); void ResetMyNumbers(); diff --git a/pcsx2/DEV9/Sessions/TCP_Session/TCP_Session_In.cpp b/pcsx2/DEV9/Sessions/TCP_Session/TCP_Session_In.cpp index 4fce5d68c2..fde4339d29 100644 --- a/pcsx2/DEV9/Sessions/TCP_Session/TCP_Session_In.cpp +++ b/pcsx2/DEV9/Sessions/TCP_Session/TCP_Session_In.cpp @@ -67,13 +67,18 @@ namespace Sessions return nullptr; } - uint maxSize = 0; - if (sendTimeStamps) - maxSize = std::min(maxSegmentSize - 12, windowSize.load()); - else - maxSize = std::min(maxSegmentSize, windowSize.load()); - if (maxSize != 0 && + //Note, windowSize will be updated before _ReceivedAckNumber, potential race condition + //in practice, we just get a smaller or -ve maxSize + const u32 outstanding = GetOutstandingSequenceLength(); + + int maxSize = 0; + if (sendTimeStamps) + maxSize = std::min(maxSegmentSize - 12, windowSize.load() - outstanding); + else + maxSize = std::min(maxSegmentSize, windowSize.load() - outstanding); + + if (maxSize > 0 && myNumberACKed.load()) { std::unique_ptr buffer; @@ -90,7 +95,7 @@ namespace Sessions #endif if (err != SOCKET_ERROR) { - if (available > maxSize) + if (available > static_cast(maxSize)) Console.WriteLn("DEV9: TCP: Got a lot of data: %lu Using: %d", available, maxSize); buffer = std::make_unique(maxSize); diff --git a/pcsx2/DEV9/Sessions/TCP_Session/TCP_Session_Out.cpp b/pcsx2/DEV9/Sessions/TCP_Session/TCP_Session_Out.cpp index 9eed93ca27..e67b31b005 100644 --- a/pcsx2/DEV9/Sessions/TCP_Session/TCP_Session_Out.cpp +++ b/pcsx2/DEV9/Sessions/TCP_Session/TCP_Session_Out.cpp @@ -442,6 +442,8 @@ namespace Sessions myNumberACKed.store(true); } + UpdateReceivedAckNumber(tcp->acknowledgementNumber); + if (tcp->sequenceNumber != expectedSeqNumber) { if (tcp->GetPayload()->GetLength() == 0)