DEV9: Improve tracking of acknowledged data

This commit is contained in:
TheLastRar 2024-04-06 20:36:37 +01:00 committed by lightningterror
parent 8a14552e56
commit 7903c7c17e
4 changed files with 28 additions and 7 deletions

View File

@ -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);

View File

@ -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();

View File

@ -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);

View File

@ -442,6 +442,8 @@ namespace Sessions
myNumberACKed.store(true);
}
UpdateReceivedAckNumber(tcp->acknowledgementNumber);
if (tcp->sequenceNumber != expectedSeqNumber)
{
if (tcp->GetPayload()->GetLength() == 0)