mirror of https://github.com/PCSX2/pcsx2.git
DEV9: Improve tracking of acknowledged data
This commit is contained in:
parent
8a14552e56
commit
7903c7c17e
|
@ -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<u32, std::vector<u32>> TCP_Session::GetAllMyNumbers()
|
||||
{
|
||||
std::lock_guard numberlock(myNumberSentry);
|
||||
|
|
|
@ -71,6 +71,7 @@ namespace Sessions
|
|||
const int oldMyNumCount = 64;
|
||||
u32 _MySequenceNumber = 1;
|
||||
std::vector<u32> _OldMyNumbers;
|
||||
u32 _ReceivedAckNumber = 1;
|
||||
std::atomic<bool> 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<u32, std::vector<u32>> GetAllMyNumbers();
|
||||
void ResetMyNumbers();
|
||||
|
||||
|
|
|
@ -67,13 +67,18 @@ namespace Sessions
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
uint maxSize = 0;
|
||||
if (sendTimeStamps)
|
||||
maxSize = std::min<uint>(maxSegmentSize - 12, windowSize.load());
|
||||
else
|
||||
maxSize = std::min<uint>(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<int>(maxSegmentSize - 12, windowSize.load() - outstanding);
|
||||
else
|
||||
maxSize = std::min<int>(maxSegmentSize, windowSize.load() - outstanding);
|
||||
|
||||
if (maxSize > 0 &&
|
||||
myNumberACKed.load())
|
||||
{
|
||||
std::unique_ptr<u8[]> buffer;
|
||||
|
@ -90,7 +95,7 @@ namespace Sessions
|
|||
#endif
|
||||
if (err != SOCKET_ERROR)
|
||||
{
|
||||
if (available > maxSize)
|
||||
if (available > static_cast<uint>(maxSize))
|
||||
Console.WriteLn("DEV9: TCP: Got a lot of data: %lu Using: %d", available, maxSize);
|
||||
|
||||
buffer = std::make_unique<u8[]>(maxSize);
|
||||
|
|
|
@ -442,6 +442,8 @@ namespace Sessions
|
|||
myNumberACKed.store(true);
|
||||
}
|
||||
|
||||
UpdateReceivedAckNumber(tcp->acknowledgementNumber);
|
||||
|
||||
if (tcp->sequenceNumber != expectedSeqNumber)
|
||||
{
|
||||
if (tcp->GetPayload()->GetLength() == 0)
|
||||
|
|
Loading…
Reference in New Issue