diff --git a/pcsx2/DEV9/Sessions/TCP_Session/TCP_Session.cpp b/pcsx2/DEV9/Sessions/TCP_Session/TCP_Session.cpp index f86d2c3cd2..2a08eae80d 100644 --- a/pcsx2/DEV9/Sessions/TCP_Session/TCP_Session.cpp +++ b/pcsx2/DEV9/Sessions/TCP_Session/TCP_Session.cpp @@ -55,6 +55,11 @@ namespace Sessions std::lock_guard numberlock(myNumberSentry); return GetDelta(_MySequenceNumber, _ReceivedAckNumber); } + bool TCP_Session::ShouldWaitForAck() + { + std::lock_guard numberlock(myNumberSentry); + return _OldMyNumbers[0] == _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 800466d219..09109af5c8 100644 --- a/pcsx2/DEV9/Sessions/TCP_Session/TCP_Session.h +++ b/pcsx2/DEV9/Sessions/TCP_Session/TCP_Session.h @@ -93,6 +93,7 @@ namespace Sessions void UpdateReceivedAckNumber(u32 ack); u32 GetMyNumber(); u32 GetOutstandingSequenceLength(); + bool ShouldWaitForAck(); 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 fde4339d29..8a8eeb50c5 100644 --- a/pcsx2/DEV9/Sessions/TCP_Session/TCP_Session_In.cpp +++ b/pcsx2/DEV9/Sessions/TCP_Session/TCP_Session_In.cpp @@ -67,6 +67,8 @@ namespace Sessions return nullptr; } + if (ShouldWaitForAck()) + return nullptr; //Note, windowSize will be updated before _ReceivedAckNumber, potential race condition //in practice, we just get a smaller or -ve maxSize @@ -78,8 +80,7 @@ namespace Sessions else maxSize = std::min(maxSegmentSize, windowSize.load() - outstanding); - if (maxSize > 0 && - myNumberACKed.load()) + if (maxSize > 0) { std::unique_ptr buffer; int err = 0;