diff --git a/Source/Core/Core/CMakeLists.txt b/Source/Core/Core/CMakeLists.txt index 2b7c141e68..01f5591258 100644 --- a/Source/Core/Core/CMakeLists.txt +++ b/Source/Core/Core/CMakeLists.txt @@ -591,8 +591,8 @@ endif() if(WIN32) target_sources(core PRIVATE - HW/EXI/BBA-TAP/TAP_Win32.cpp - HW/EXI/BBA-TAP/TAP_Win32.h + HW/EXI/BBA/TAP_Win32.cpp + HW/EXI/BBA/TAP_Win32.h HW/WiimoteReal/IOWin.cpp HW/WiimoteReal/IOWin.h ) @@ -605,7 +605,7 @@ if(WIN32) target_compile_definitions(core PRIVATE "-D_WINSOCK_DEPRECATED_NO_WARNINGS") elseif(APPLE) target_sources(core PRIVATE - HW/EXI/BBA-TAP/TAP_Apple.cpp + HW/EXI/BBA/TAP_Apple.cpp HW/WiimoteReal/IOdarwin.h HW/WiimoteReal/IOdarwin_private.h HW/WiimoteReal/IOdarwin.mm @@ -613,7 +613,7 @@ elseif(APPLE) target_link_libraries(core PUBLIC ${IOB_LIBRARY}) elseif(UNIX) target_sources(core PRIVATE - HW/EXI/BBA-TAP/TAP_Unix.cpp + HW/EXI/BBA/TAP_Unix.cpp ) if(ANDROID) target_sources(core PRIVATE diff --git a/Source/Core/Core/ConfigManager.cpp b/Source/Core/Core/ConfigManager.cpp index 092d45b1da..3f3f1c238f 100644 --- a/Source/Core/Core/ConfigManager.cpp +++ b/Source/Core/Core/ConfigManager.cpp @@ -223,7 +223,7 @@ void SConfig::SaveCoreSettings(IniFile& ini) core->Set("SlotA", m_EXIDevice[0]); core->Set("SlotB", m_EXIDevice[1]); core->Set("SerialPort1", m_EXIDevice[2]); - core->Set("BBA_MAC", m_bba_mac); + core->Set("BBA_TAP_MAC", m_bba_tap_mac); for (int i = 0; i < SerialInterface::MAX_SI_CHANNELS; ++i) { core->Set(fmt::format("SIDevice{}", i), m_SIDevice[i]); @@ -488,7 +488,7 @@ void SConfig::LoadCoreSettings(IniFile& ini) core->Get("SlotA", (int*)&m_EXIDevice[0], ExpansionInterface::EXIDEVICE_MEMORYCARDFOLDER); core->Get("SlotB", (int*)&m_EXIDevice[1], ExpansionInterface::EXIDEVICE_NONE); core->Get("SerialPort1", (int*)&m_EXIDevice[2], ExpansionInterface::EXIDEVICE_NONE); - core->Get("BBA_MAC", &m_bba_mac); + core->Get("BBA_TAP_MAC", &m_bba_tap_mac); for (size_t i = 0; i < std::size(m_SIDevice); ++i) { core->Get(fmt::format("SIDevice{}", i), &m_SIDevice[i], diff --git a/Source/Core/Core/ConfigManager.h b/Source/Core/Core/ConfigManager.h index 4341f88196..9c60dd50a1 100644 --- a/Source/Core/Core/ConfigManager.h +++ b/Source/Core/Core/ConfigManager.h @@ -226,7 +226,8 @@ struct SConfig std::string m_strGbaCartB; ExpansionInterface::TEXIDevices m_EXIDevice[3]; SerialInterface::SIDevices m_SIDevice[4]; - std::string m_bba_mac; + + std::string m_bba_tap_mac; // interface language std::string m_InterfaceLanguage; diff --git a/Source/Core/Core/Core.vcxproj b/Source/Core/Core/Core.vcxproj index deeab45e20..4828f5d1dc 100644 --- a/Source/Core/Core/Core.vcxproj +++ b/Source/Core/Core/Core.vcxproj @@ -1,4 +1,4 @@ - + @@ -140,7 +140,7 @@ - + @@ -498,7 +498,7 @@ - + diff --git a/Source/Core/Core/Core.vcxproj.filters b/Source/Core/Core/Core.vcxproj.filters index 7fe19d606b..9f64208ece 100644 --- a/Source/Core/Core/Core.vcxproj.filters +++ b/Source/Core/Core/Core.vcxproj.filters @@ -1,4 +1,4 @@ - + @@ -993,6 +993,9 @@ PowerPC\Jit64 + + HW %28Flipper/Hollywood%29\EXI - Expansion Interface\BBA + @@ -1740,6 +1743,9 @@ PowerPC\JitArmCommon + + HW %28Flipper/Hollywood%29\EXI - Expansion Interface\BBA + diff --git a/Source/Core/Core/HW/EXI/BBA-TAP/TAP_Apple.cpp b/Source/Core/Core/HW/EXI/BBA/TAP_Apple.cpp similarity index 69% rename from Source/Core/Core/HW/EXI/BBA-TAP/TAP_Apple.cpp rename to Source/Core/Core/HW/EXI/BBA/TAP_Apple.cpp index 6dbed04f20..4024447893 100644 --- a/Source/Core/Core/HW/EXI/BBA-TAP/TAP_Apple.cpp +++ b/Source/Core/Core/HW/EXI/BBA/TAP_Apple.cpp @@ -12,7 +12,7 @@ namespace ExpansionInterface { -bool CEXIETHERNET::Activate() +bool CEXIETHERNET::TAPNetworkInterface::Activate() { if (IsActivated()) return true; @@ -30,7 +30,7 @@ bool CEXIETHERNET::Activate() return RecvInit(); } -void CEXIETHERNET::Deactivate() +void CEXIETHERNET::TAPNetworkInterface::Deactivate() { close(fd); fd = -1; @@ -41,12 +41,12 @@ void CEXIETHERNET::Deactivate() readThread.join(); } -bool CEXIETHERNET::IsActivated() +bool CEXIETHERNET::TAPNetworkInterface::IsActivated() { return fd != -1; } -bool CEXIETHERNET::SendFrame(const u8* frame, u32 size) +bool CEXIETHERNET::TAPNetworkInterface::SendFrame(const u8* frame, u32 size) { INFO_LOG(SP1, "SendFrame %x\n%s", size, ArrayToString(frame, size, 0x10).c_str()); @@ -58,12 +58,12 @@ bool CEXIETHERNET::SendFrame(const u8* frame, u32 size) } else { - SendComplete(); + m_eth_ref->SendComplete(); return true; } } -void CEXIETHERNET::ReadThreadHandler(CEXIETHERNET* self) +void CEXIETHERNET::TAPNetworkInterface::ReadThreadHandler(TAPNetworkInterface* self) { while (!self->readThreadShutdown.IsSet()) { @@ -77,7 +77,7 @@ void CEXIETHERNET::ReadThreadHandler(CEXIETHERNET* self) if (select(self->fd + 1, &rfds, nullptr, nullptr, &timeout) <= 0) continue; - int readBytes = read(self->fd, self->mRecvBuffer.get(), BBA_RECV_SIZE); + int readBytes = read(self->fd, self->m_eth_ref->mRecvBuffer.get(), BBA_RECV_SIZE); if (readBytes < 0) { ERROR_LOG(SP1, "Failed to read from BBA, err=%d", readBytes); @@ -85,25 +85,25 @@ void CEXIETHERNET::ReadThreadHandler(CEXIETHERNET* self) else if (self->readEnabled.IsSet()) { INFO_LOG(SP1, "Read data: %s", - ArrayToString(self->mRecvBuffer.get(), readBytes, 0x10).c_str()); - self->mRecvBufferLength = readBytes; - self->RecvHandlePacket(); + ArrayToString(self->m_eth_ref->mRecvBuffer.get(), readBytes, 0x10).c_str()); + self->m_eth_ref->mRecvBufferLength = readBytes; + self->m_eth_ref->RecvHandlePacket(); } } } -bool CEXIETHERNET::RecvInit() +bool CEXIETHERNET::TAPNetworkInterface::RecvInit() { readThread = std::thread(ReadThreadHandler, this); return true; } -void CEXIETHERNET::RecvStart() +void CEXIETHERNET::TAPNetworkInterface::RecvStart() { readEnabled.Set(); } -void CEXIETHERNET::RecvStop() +void CEXIETHERNET::TAPNetworkInterface::RecvStop() { readEnabled.Clear(); } diff --git a/Source/Core/Core/HW/EXI/BBA-TAP/TAP_Unix.cpp b/Source/Core/Core/HW/EXI/BBA/TAP_Unix.cpp similarity index 80% rename from Source/Core/Core/HW/EXI/BBA-TAP/TAP_Unix.cpp rename to Source/Core/Core/HW/EXI/BBA/TAP_Unix.cpp index f13db04b65..4911f370bb 100644 --- a/Source/Core/Core/HW/EXI/BBA-TAP/TAP_Unix.cpp +++ b/Source/Core/Core/HW/EXI/BBA/TAP_Unix.cpp @@ -28,7 +28,7 @@ namespace ExpansionInterface #define NOTIMPLEMENTED(Name) \ NOTICE_LOG(SP1, "CEXIETHERNET::%s not implemented for your UNIX", Name); -bool CEXIETHERNET::Activate() +bool CEXIETHERNET::TAPNetworkInterface::Activate() { #ifdef __linux__ if (IsActivated()) @@ -50,7 +50,7 @@ bool CEXIETHERNET::Activate() const int MAX_INTERFACES = 32; for (int i = 0; i < MAX_INTERFACES; ++i) { - strncpy(ifr.ifr_name, StringFromFormat("Dolphin%d", i).c_str(), IFNAMSIZ - 1); + strncpy(ifr.ifr_name, StringFromFormat("Dolphin%d", i).c_str(), IFNAMSIZ); int err; if ((err = ioctl(fd, TUNSETIFF, (void*)&ifr)) < 0) @@ -78,7 +78,7 @@ bool CEXIETHERNET::Activate() #endif } -void CEXIETHERNET::Deactivate() +void CEXIETHERNET::TAPNetworkInterface::Deactivate() { #ifdef __linux__ close(fd); @@ -93,7 +93,7 @@ void CEXIETHERNET::Deactivate() #endif } -bool CEXIETHERNET::IsActivated() +bool CEXIETHERNET::TAPNetworkInterface::IsActivated() { #ifdef __linux__ return fd != -1 ? true : false; @@ -102,7 +102,7 @@ bool CEXIETHERNET::IsActivated() #endif } -bool CEXIETHERNET::SendFrame(const u8* frame, u32 size) +bool CEXIETHERNET::TAPNetworkInterface::SendFrame(const u8* frame, u32 size) { #ifdef __linux__ DEBUG_LOG(SP1, "SendFrame %x\n%s", size, ArrayToString(frame, size, 0x10).c_str()); @@ -115,7 +115,7 @@ bool CEXIETHERNET::SendFrame(const u8* frame, u32 size) } else { - SendComplete(); + m_eth_ref->SendComplete(); return true; } #else @@ -125,7 +125,7 @@ bool CEXIETHERNET::SendFrame(const u8* frame, u32 size) } #ifdef __linux__ -void CEXIETHERNET::ReadThreadHandler(CEXIETHERNET* self) +void CEXIETHERNET::TAPNetworkInterface::ReadThreadHandler(TAPNetworkInterface* self) { while (!self->readThreadShutdown.IsSet()) { @@ -139,7 +139,7 @@ void CEXIETHERNET::ReadThreadHandler(CEXIETHERNET* self) if (select(self->fd + 1, &rfds, nullptr, nullptr, &timeout) <= 0) continue; - int readBytes = read(self->fd, self->mRecvBuffer.get(), BBA_RECV_SIZE); + int readBytes = read(self->fd, self->m_eth_ref->mRecvBuffer.get(), BBA_RECV_SIZE); if (readBytes < 0) { ERROR_LOG(SP1, "Failed to read from BBA, err=%d", readBytes); @@ -147,15 +147,15 @@ void CEXIETHERNET::ReadThreadHandler(CEXIETHERNET* self) else if (self->readEnabled.IsSet()) { DEBUG_LOG(SP1, "Read data: %s", - ArrayToString(self->mRecvBuffer.get(), readBytes, 0x10).c_str()); - self->mRecvBufferLength = readBytes; - self->RecvHandlePacket(); + ArrayToString(self->m_eth_ref->mRecvBuffer.get(), readBytes, 0x10).c_str()); + self->m_eth_ref->mRecvBufferLength = readBytes; + self->m_eth_ref->RecvHandlePacket(); } } } #endif -bool CEXIETHERNET::RecvInit() +bool CEXIETHERNET::TAPNetworkInterface::RecvInit() { #ifdef __linux__ readThread = std::thread(ReadThreadHandler, this); @@ -166,7 +166,7 @@ bool CEXIETHERNET::RecvInit() #endif } -void CEXIETHERNET::RecvStart() +void CEXIETHERNET::TAPNetworkInterface::RecvStart() { #ifdef __linux__ readEnabled.Set(); @@ -175,7 +175,7 @@ void CEXIETHERNET::RecvStart() #endif } -void CEXIETHERNET::RecvStop() +void CEXIETHERNET::TAPNetworkInterface::RecvStop() { #ifdef __linux__ readEnabled.Clear(); diff --git a/Source/Core/Core/HW/EXI/BBA-TAP/TAP_Win32.cpp b/Source/Core/Core/HW/EXI/BBA/TAP_Win32.cpp similarity index 92% rename from Source/Core/Core/HW/EXI/BBA-TAP/TAP_Win32.cpp rename to Source/Core/Core/HW/EXI/BBA/TAP_Win32.cpp index 3e8b4d5442..a421484005 100644 --- a/Source/Core/Core/HW/EXI/BBA-TAP/TAP_Win32.cpp +++ b/Source/Core/Core/HW/EXI/BBA/TAP_Win32.cpp @@ -2,7 +2,7 @@ // Licensed under GPLv2+ // Refer to the license.txt file included. -#include "Core/HW/EXI/BBA-TAP/TAP_Win32.h" +#include "Core/HW/EXI/BBA/TAP_Win32.h" #include "Common/Assert.h" #include "Common/Logging/Log.h" #include "Common/MsgHandler.h" @@ -167,7 +167,7 @@ bool OpenTAP(HANDLE& adapter, const std::basic_string& device_guid) namespace ExpansionInterface { -bool CEXIETHERNET::Activate() +bool CEXIETHERNET::TAPNetworkInterface::Activate() { if (IsActivated()) return true; @@ -233,7 +233,7 @@ bool CEXIETHERNET::Activate() return RecvInit(); } -void CEXIETHERNET::Deactivate() +void CEXIETHERNET::TAPNetworkInterface::Deactivate() { if (!IsActivated()) return; @@ -258,19 +258,19 @@ void CEXIETHERNET::Deactivate() memset(&mWriteOverlapped, 0, sizeof(mWriteOverlapped)); } -bool CEXIETHERNET::IsActivated() +bool CEXIETHERNET::TAPNetworkInterface::IsActivated() { return mHAdapter != INVALID_HANDLE_VALUE; } -void CEXIETHERNET::ReadThreadHandler(CEXIETHERNET* self) +void CEXIETHERNET::TAPNetworkInterface::ReadThreadHandler(TAPNetworkInterface* self) { while (!self->readThreadShutdown.IsSet()) { DWORD transferred; // Read from TAP into internal buffer. - if (ReadFile(self->mHAdapter, self->mRecvBuffer.get(), BBA_RECV_SIZE, &transferred, + if (ReadFile(self->mHAdapter, self->m_eth_ref->mRecvBuffer.get(), BBA_RECV_SIZE, &transferred, &self->mReadOverlapped)) { // Returning immediately is not likely to happen, but if so, reset the event state manually. @@ -300,16 +300,16 @@ void CEXIETHERNET::ReadThreadHandler(CEXIETHERNET* self) // Copy to BBA buffer, and fire interrupt if enabled. DEBUG_LOG(SP1, "Received %u bytes:\n %s", transferred, - ArrayToString(self->mRecvBuffer.get(), transferred, 0x10).c_str()); + ArrayToString(self->m_eth_ref->mRecvBuffer.get(), transferred, 0x10).c_str()); if (self->readEnabled.IsSet()) { - self->mRecvBufferLength = transferred; - self->RecvHandlePacket(); + self->m_eth_ref->mRecvBufferLength = transferred; + self->m_eth_ref->RecvHandlePacket(); } } } -bool CEXIETHERNET::SendFrame(const u8* frame, u32 size) +bool CEXIETHERNET::TAPNetworkInterface::SendFrame(const u8* frame, u32 size) { DEBUG_LOG(SP1, "SendFrame %u bytes:\n%s", size, ArrayToString(frame, size, 0x10).c_str()); @@ -345,22 +345,22 @@ bool CEXIETHERNET::SendFrame(const u8* frame, u32 size) } // Always report the packet as being sent successfully, even though it might be a lie - SendComplete(); + m_eth_ref->SendComplete(); return true; } -bool CEXIETHERNET::RecvInit() +bool CEXIETHERNET::TAPNetworkInterface::RecvInit() { readThread = std::thread(ReadThreadHandler, this); return true; } -void CEXIETHERNET::RecvStart() +void CEXIETHERNET::TAPNetworkInterface::RecvStart() { readEnabled.Set(); } -void CEXIETHERNET::RecvStop() +void CEXIETHERNET::TAPNetworkInterface::RecvStop() { readEnabled.Clear(); } diff --git a/Source/Core/Core/HW/EXI/BBA-TAP/TAP_Win32.h b/Source/Core/Core/HW/EXI/BBA/TAP_Win32.h similarity index 100% rename from Source/Core/Core/HW/EXI/BBA-TAP/TAP_Win32.h rename to Source/Core/Core/HW/EXI/BBA/TAP_Win32.h diff --git a/Source/Core/Core/HW/EXI/EXI_Device.cpp b/Source/Core/Core/HW/EXI/EXI_Device.cpp index be4a7029c8..9995d6c156 100644 --- a/Source/Core/Core/HW/EXI/EXI_Device.cpp +++ b/Source/Core/Core/HW/EXI/EXI_Device.cpp @@ -132,7 +132,7 @@ std::unique_ptr EXIDevice_Create(const TEXIDevices device_type, cons break; case EXIDEVICE_ETH: - result = std::make_unique(); + result = std::make_unique(BBADeviceType::BBA_TAP); break; case EXIDEVICE_GECKO: diff --git a/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.cpp b/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.cpp index 1972e3e3ea..d303dbcdfb 100644 --- a/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.cpp +++ b/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.cpp @@ -23,17 +23,11 @@ namespace ExpansionInterface // Multiple parts of this implementation depend on Dolphin // being compiled for a little endian host. -CEXIETHERNET::CEXIETHERNET() +CEXIETHERNET::CEXIETHERNET(BBADeviceType type) { - tx_fifo = std::make_unique(BBA_TXFIFO_SIZE); - mBbaMem = std::make_unique(BBA_MEM_SIZE); - mRecvBuffer = std::make_unique(BBA_RECV_SIZE); - - MXHardReset(); - - // Parse MAC address from config, and generate a new one if it doesn't + // Parse BBA (TAP) MAC address from config, and generate a new one if it doesn't // exist or can't be parsed. - std::string& mac_addr_setting = SConfig::GetInstance().m_bba_mac; + std::string& mac_addr_setting = SConfig::GetInstance().m_bba_tap_mac; std::optional mac_addr = Common::StringToMacAddress(mac_addr_setting); if (!mac_addr) @@ -43,6 +37,20 @@ CEXIETHERNET::CEXIETHERNET() SConfig::GetInstance().SaveSettings(); } + switch (type) + { + case BBADeviceType::BBA_TAP: + network_interface = std::make_unique(this); + INFO_LOG(SP1, "Created TAP physical network interface."); + break; + } + + tx_fifo = std::make_unique(BBA_TXFIFO_SIZE); + mBbaMem = std::make_unique(BBA_MEM_SIZE); + mRecvBuffer = std::make_unique(BBA_RECV_SIZE); + + MXHardReset(); + const auto& mac = mac_addr.value(); memcpy(&mBbaMem[BBA_NAFR_PAR0], mac.data(), mac.size()); @@ -52,7 +60,7 @@ CEXIETHERNET::CEXIETHERNET() CEXIETHERNET::~CEXIETHERNET() { - Deactivate(); + network_interface->Deactivate(); } void CEXIETHERNET::SetCS(int cs) @@ -303,7 +311,7 @@ void CEXIETHERNET::MXCommandHandler(u32 data, u32 size) { INFO_LOG(SP1, "Software reset"); // MXSoftReset(); - Activate(); + network_interface->Activate(); } if ((mBbaMem[BBA_NCRA] & NCRA_SR) ^ (data & NCRA_SR)) @@ -311,9 +319,9 @@ void CEXIETHERNET::MXCommandHandler(u32 data, u32 size) DEBUG_LOG(SP1, "%s rx", (data & NCRA_SR) ? "start" : "stop"); if (data & NCRA_SR) - RecvStart(); + network_interface->RecvStart(); else - RecvStop(); + network_interface->RecvStop(); } // Only start transfer if there isn't one currently running @@ -386,7 +394,7 @@ void CEXIETHERNET::DirectFIFOWrite(const u8* data, u32 size) void CEXIETHERNET::SendFromDirectFIFO() { - SendFrame(tx_fifo.get(), *(u16*)&mBbaMem[BBA_TXFIFOCNT]); + network_interface->SendFrame(tx_fifo.get(), *(u16*)&mBbaMem[BBA_TXFIFOCNT]); } void CEXIETHERNET::SendFromPacketBuffer() @@ -579,7 +587,7 @@ bool CEXIETHERNET::RecvHandlePacket() wait_for_next: if (mBbaMem[BBA_NCRA] & NCRA_SR) - RecvStart(); + network_interface->RecvStart(); return true; } diff --git a/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h b/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h index 38a27bd7e0..a4d7efa789 100644 --- a/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h +++ b/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h @@ -196,10 +196,15 @@ enum RecvStatus #define BBA_RECV_SIZE 0x800 +enum class BBADeviceType +{ + BBA_TAP, +}; + class CEXIETHERNET : public IEXIDevice { public: - CEXIETHERNET(); + explicit CEXIETHERNET(BBADeviceType type); virtual ~CEXIETHERNET(); void SetCS(int cs) override; bool IsPresent() const override; @@ -297,34 +302,70 @@ private: std::unique_ptr mBbaMem; std::unique_ptr tx_fifo; - // TAP interface - static void ReadThreadHandler(CEXIETHERNET* self); - bool Activate(); - void Deactivate(); - bool IsActivated(); - bool SendFrame(const u8* frame, u32 size); - bool RecvInit(); - void RecvStart(); - void RecvStop(); + class NetworkInterface + { + protected: + CEXIETHERNET* m_eth_ref = nullptr; + explicit NetworkInterface(CEXIETHERNET* eth_ref) : m_eth_ref{eth_ref} {} - std::unique_ptr mRecvBuffer; - u32 mRecvBufferLength = 0; + public: + virtual bool Activate() { return false; } + virtual void Deactivate() {} + virtual bool IsActivated() { return false; } + virtual bool SendFrame(const u8* frame, u32 size) { return false; } + virtual bool RecvInit() { return false; } + virtual void RecvStart() {} + virtual void RecvStop() {} -#if defined(_WIN32) - HANDLE mHAdapter = INVALID_HANDLE_VALUE; - OVERLAPPED mReadOverlapped = {}; - OVERLAPPED mWriteOverlapped = {}; - std::vector mWriteBuffer; - bool mWritePending = false; -#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) - int fd = -1; + virtual ~NetworkInterface() = default; + }; + + class TAPNetworkInterface : public NetworkInterface + { + public: + explicit TAPNetworkInterface(CEXIETHERNET* eth_ref) : NetworkInterface(eth_ref) + { + } + + public: + bool Activate() override; + void Deactivate() override; + bool IsActivated() override; + bool SendFrame(const u8* frame, u32 size) override; + bool RecvInit() override; + void RecvStart() override; + void RecvStop() override; + + private: +#if defined(WIN32) || defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || \ + defined(__OpenBSD__) + std::thread readThread; + Common::Flag readEnabled; + Common::Flag readThreadShutdown; + static void ReadThreadHandler(TAPNetworkInterface* self); #endif +#if defined(_WIN32) + HANDLE mHAdapter = INVALID_HANDLE_VALUE; + OVERLAPPED mReadOverlapped = {}; + OVERLAPPED mWriteOverlapped = {}; + std::vector mWriteBuffer; + bool mWritePending = false; +#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) + int fd = -1; +#endif + }; #if defined(WIN32) || defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || \ defined(__OpenBSD__) - std::thread readThread; - Common::Flag readEnabled; - Common::Flag readThreadShutdown; + std::thread readThread; + Common::Flag readEnabled; + Common::Flag readThreadShutdown; #endif +}; + + std::unique_ptr network_interface; + + std::unique_ptr mRecvBuffer; + u32 mRecvBufferLength = 0; }; } // namespace ExpansionInterface diff --git a/Source/Core/DolphinQt/Settings/GameCubePane.cpp b/Source/Core/DolphinQt/Settings/GameCubePane.cpp index 6700984ac7..d17009290f 100644 --- a/Source/Core/DolphinQt/Settings/GameCubePane.cpp +++ b/Source/Core/DolphinQt/Settings/GameCubePane.cpp @@ -103,7 +103,7 @@ void GameCubePane::CreateWidgets() for (const auto& entry : {std::make_pair(tr(""), ExpansionInterface::EXIDEVICE_NONE), std::make_pair(tr("Dummy"), ExpansionInterface::EXIDEVICE_DUMMY), - std::make_pair(tr("Broadband Adapter"), ExpansionInterface::EXIDEVICE_ETH)}) + std::make_pair(tr("Broadband Adapter (TAP)"), ExpansionInterface::EXIDEVICE_ETH), { m_slot_combos[2]->addItem(entry.first, entry.second); } @@ -186,10 +186,13 @@ void GameCubePane::OnConfigPressed(int slot) { bool ok; const auto new_mac = QInputDialog::getText( - this, tr("Broadband Adapter MAC address"), tr("Enter new Broadband Adapter MAC address:"), - QLineEdit::Normal, QString::fromStdString(SConfig::GetInstance().m_bba_mac), &ok); + this, tr("Broadband Adapter (TAP) MAC address"), + tr("Enter new Broadband Adapter (TAP) MAC address:"), QLineEdit::Normal, + QString::fromStdString(SConfig::GetInstance().m_bba_tap_mac), &ok); if (ok) - SConfig::GetInstance().m_bba_mac = new_mac.toStdString(); + SConfig::GetInstance().m_bba_tap_mac = new_mac.toStdString(); + return; + } return; } default: