BBA/HLE: Poll as much data as possible

This commit is contained in:
Sepalani 2024-02-03 15:14:01 +04:00
parent c71134c4ab
commit 05ed1a2fae

View File

@ -159,13 +159,27 @@ void CEXIETHERNET::BuiltInBBAInterface::PollData(std::size_t* datasize)
} }
// Check for connection data // Check for connection data
if (*datasize != 0) if (*datasize == 0)
continue;
const auto socket_data = TryGetDataFromSocket(&net_ref);
if (socket_data.has_value())
{ {
*datasize = socket_data->size(); // Send it to the network buffer if empty
std::memcpy(m_eth_ref->mRecvBuffer.get(), socket_data->data(), *datasize); const auto socket_data = TryGetDataFromSocket(&net_ref);
if (socket_data.has_value())
{
*datasize = socket_data->size();
std::memcpy(m_eth_ref->mRecvBuffer.get(), socket_data->data(), *datasize);
}
}
else if (!WillQueueOverrun())
{
// Otherwise, enqueue it
const auto socket_data = TryGetDataFromSocket(&net_ref);
if (socket_data.has_value())
WriteToQueue(*socket_data);
}
else
{
WARN_LOG_FMT(SP1, "BBA queue might overrun, can't poll more data");
return;
} }
} }
} }
@ -232,7 +246,7 @@ void CEXIETHERNET::BuiltInBBAInterface::HandleDHCP(const Common::UDPPacket& pack
std::optional<std::vector<u8>> std::optional<std::vector<u8>>
CEXIETHERNET::BuiltInBBAInterface::TryGetDataFromSocket(StackRef* ref) CEXIETHERNET::BuiltInBBAInterface::TryGetDataFromSocket(StackRef* ref)
{ {
size_t datasize = 0; // Set by socket.receive using a non-const reference std::size_t datasize = 0; // Set by socket.receive using a non-const reference
unsigned short remote_port; unsigned short remote_port;
switch (ref->type) switch (ref->type)
@ -380,7 +394,7 @@ void CEXIETHERNET::BuiltInBBAInterface::HandleTCPFrame(const Common::TCPPacket&
{ {
// only if contain data // only if contain data
if (static_cast<int>(this_seq - ref->ack_num) >= 0 && if (static_cast<int>(this_seq - ref->ack_num) >= 0 &&
data.size() >= static_cast<size_t>(size)) data.size() >= static_cast<std::size_t>(size))
{ {
ref->tcp_socket.send(data.data(), size); ref->tcp_socket.send(data.data(), size);
ref->ack_num += size; ref->ack_num += size;
@ -671,7 +685,7 @@ void CEXIETHERNET::BuiltInBBAInterface::ReadThreadHandler(CEXIETHERNET::BuiltInB
if (!self->m_read_enabled.IsSet()) if (!self->m_read_enabled.IsSet())
continue; continue;
size_t datasize = 0; std::size_t datasize = 0;
u8 wp = self->m_eth_ref->page_ptr(BBA_RWP); u8 wp = self->m_eth_ref->page_ptr(BBA_RWP);
const u8 rp = self->m_eth_ref->page_ptr(BBA_RRP); const u8 rp = self->m_eth_ref->page_ptr(BBA_RRP);