diff --git a/Source/Core/Core/HW/EXI/BBA/TAPServerConnection.cpp b/Source/Core/Core/HW/EXI/BBA/TAPServerConnection.cpp index 1f76340222..b67a94dff1 100644 --- a/Source/Core/Core/HW/EXI/BBA/TAPServerConnection.cpp +++ b/Source/Core/Core/HW/EXI/BBA/TAPServerConnection.cpp @@ -266,7 +266,7 @@ void TAPServerConnection::ReadThreadHandler() if (select_res < 0) { ERROR_LOG_FMT(SP1, "Can\'t poll tapserver fd: {}", Common::StrNetworkError()); - break; + continue; } if (select_res == 0) continue; @@ -295,7 +295,10 @@ void TAPServerConnection::ReadThreadHandler() } else { - read_state = ReadState::DATA; + // If read is disabled, we still need to actually read the frame in + // order to avoid applying backpressure on the remote end, but we + // should drop the frame instead of forwarding it to the client. + read_state = m_read_enabled.IsSet() ? ReadState::DATA : ReadState::SKIP; } } else @@ -326,7 +329,7 @@ void TAPServerConnection::ReadThreadHandler() } else { - read_state = ReadState::DATA; + read_state = m_read_enabled.IsSet() ? ReadState::DATA : ReadState::SKIP; } break; } diff --git a/Source/Core/Core/HW/EXI/EXI_DeviceModem.cpp b/Source/Core/Core/HW/EXI/EXI_DeviceModem.cpp index 02f2e33613..17d4a7c484 100644 --- a/Source/Core/Core/HW/EXI/EXI_DeviceModem.cpp +++ b/Source/Core/Core/HW/EXI/EXI_DeviceModem.cpp @@ -44,6 +44,7 @@ CEXIModem::CEXIModem(Core::System& system, ModemDeviceType type) : IEXIDevice(sy CEXIModem::~CEXIModem() { + m_network_interface->RecvStop(); m_network_interface->Deactivate(); } @@ -69,6 +70,7 @@ void CEXIModem::ImmWrite(u32 data, u32 size) m_transfer_descriptor = data; if (m_transfer_descriptor == 0x00008000) { // Reset + m_network_interface->RecvStop(); m_network_interface->Deactivate(); m_transfer_descriptor = INVALID_TRANSFER_DESCRIPTOR; } @@ -366,6 +368,7 @@ void CEXIModem::RunAllPendingATCommands() if (command.substr(0, 3) == "ATZ" || command == "ATH0") { // Reset (ATZ) or hang up (ATH0) + m_network_interface->RecvStop(); m_network_interface->Deactivate(); AddATReply("OK\r"); } @@ -374,6 +377,7 @@ void CEXIModem::RunAllPendingATCommands() // Dial if (m_network_interface->Activate()) { + m_network_interface->RecvStart(); AddATReply("OK\rCONNECT 115200\r"); // Maximum baud rate } else