From ec60416c00fe5487af7f3b144abb1c7e47d45b74 Mon Sep 17 00:00:00 2001 From: Sepalani Date: Sat, 30 Jul 2022 23:17:34 +0400 Subject: [PATCH 1/6] BBA/BuiltIn: Add an ARP table --- Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp | 20 +++++++++++++++++++- Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h | 5 ++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp b/Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp index 9e2a4dcca7..284f9634a5 100644 --- a/Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp +++ b/Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp @@ -174,6 +174,8 @@ void CEXIETHERNET::BuiltInBBAInterface::Deactivate() ref.ip = 0; } + m_arp_table.clear(); + // Wait for read thread to exit. if (m_read_thread.joinable()) m_read_thread.join(); @@ -206,7 +208,8 @@ void CEXIETHERNET::BuiltInBBAInterface::HandleARP(const Common::ARPPacket& packe } else { - response.arp_header = Common::ARPHeader(arpdata.target_ip, m_fake_mac, m_current_ip, bba_mac); + response.arp_header = Common::ARPHeader(arpdata.target_ip, ResolveAddress(arpdata.target_ip), + m_current_ip, bba_mac); } WriteToQueue(response.Build()); @@ -488,6 +491,21 @@ void CEXIETHERNET::BuiltInBBAInterface::HandleUDPFrame(const Common::UDPPacket& ref->udp_socket.send(data.data(), data.size(), target, ntohs(udp_header.destination_port)); } +const Common::MACAddress& CEXIETHERNET::BuiltInBBAInterface::ResolveAddress(u32 inet_ip) +{ + auto it = m_arp_table.lower_bound(inet_ip); + if (it != m_arp_table.end() && it->first == inet_ip) + { + return it->second; + } + else + { + return m_arp_table + .emplace_hint(it, inet_ip, Common::GenerateMacAddress(Common::MACConsumer::BBA)) + ->second; + } +} + bool CEXIETHERNET::BuiltInBBAInterface::SendFrame(const u8* frame, u32 size) { std::lock_guard lock(m_mtx); diff --git a/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h b/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h index 3ca1f26b01..e69033ed2b 100644 --- a/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h +++ b/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h @@ -4,6 +4,8 @@ #pragma once #include +#include +#include #include #include @@ -13,7 +15,6 @@ #include -#include #include "Common/Flag.h" #include "Common/Network.h" #include "Core/HW/EXI/BBA/BuiltIn.h" @@ -445,6 +446,7 @@ private: std::string m_local_ip; u32 m_current_ip = 0; u32 m_router_ip = 0; + std::map m_arp_table; #if defined(WIN32) || defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || \ defined(__OpenBSD__) || defined(__NetBSD__) || defined(__HAIKU__) std::array network_ref{}; // max 10 at same time, i think most gc game had a @@ -464,6 +466,7 @@ private: void HandleTCPFrame(const Common::TCPPacket& packet); void InitUDPPort(u16 port); void HandleUDPFrame(const Common::UDPPacket& packet); + const Common::MACAddress& ResolveAddress(u32 inet_ip); }; std::unique_ptr m_network_interface; From 0f5fe2274a1582e34418a42537853d93681de63e Mon Sep 17 00:00:00 2001 From: Sepalani Date: Sat, 30 Jul 2022 23:31:59 +0400 Subject: [PATCH 2/6] BBA/BuiltIn: Save current MAC address --- Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp | 22 +++++++++----------- Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h | 1 + 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp b/Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp index 284f9634a5..c3c730d2d6 100644 --- a/Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp +++ b/Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp @@ -143,6 +143,7 @@ bool CEXIETHERNET::BuiltInBBAInterface::Activate() const u32 ip = m_local_ip.empty() ? sf::IpAddress::getLocalAddress().toInteger() : sf::IpAddress(m_local_ip).toInteger(); m_current_ip = htonl(ip); + m_current_mac = Common::BitCastPtr(&m_eth_ref->mBbaMem[BBA_NAFR_PAR0]); m_router_ip = (m_current_ip & 0xFFFFFF) | 0x01000000; // clear all ref @@ -197,19 +198,18 @@ void CEXIETHERNET::BuiltInBBAInterface::WriteToQueue(const std::vector& data void CEXIETHERNET::BuiltInBBAInterface::HandleARP(const Common::ARPPacket& packet) { const auto& [hwdata, arpdata] = packet; - const Common::MACAddress bba_mac = - Common::BitCastPtr(&m_eth_ref->mBbaMem[BBA_NAFR_PAR0]); - Common::ARPPacket response(bba_mac, m_fake_mac); + Common::ARPPacket response(m_current_mac, m_fake_mac); if (arpdata.target_ip == m_current_ip) { // game asked for himself, reply with his mac address - response.arp_header = Common::ARPHeader(arpdata.target_ip, bba_mac, m_current_ip, bba_mac); + response.arp_header = + Common::ARPHeader(arpdata.target_ip, m_current_mac, m_current_ip, m_current_mac); } else { response.arp_header = Common::ARPHeader(arpdata.target_ip, ResolveAddress(arpdata.target_ip), - m_current_ip, bba_mac); + m_current_ip, m_current_mac); } WriteToQueue(response.Build()); @@ -234,10 +234,8 @@ void CEXIETHERNET::BuiltInBBAInterface::HandleDHCP(const Common::UDPPacket& pack const std::vector timeout_24h = {0, 1, 0x51, 0x80}; - const Common::MACAddress bba_mac = - Common::BitCastPtr(&m_eth_ref->mBbaMem[BBA_NAFR_PAR0]); Common::DHCPPacket reply; - reply.body = Common::DHCPBody(request.transaction_id, bba_mac, m_current_ip, m_router_ip); + reply.body = Common::DHCPBody(request.transaction_id, m_current_mac, m_current_ip, m_router_ip); // options // send our emulated lan settings @@ -256,7 +254,7 @@ void CEXIETHERNET::BuiltInBBAInterface::HandleDHCP(const Common::UDPPacket& pack reply.AddOption(3, ip_part); // router ip reply.AddOption(255, {}); // end - const Common::UDPPacket response(bba_mac, m_fake_mac, from, to, reply.Build()); + const Common::UDPPacket response(m_current_mac, m_fake_mac, from, to, reply.Build()); WriteToQueue(response.Build()); } @@ -329,7 +327,7 @@ void CEXIETHERNET::BuiltInBBAInterface::HandleTCPFrame(const Common::TCPPacket& ref->from.sin_port = tcp_header.destination_port; ref->to.sin_addr.s_addr = Common::BitCast(ip_header.source_addr); ref->to.sin_port = tcp_header.source_port; - ref->bba_mac = Common::BitCastPtr(&m_eth_ref->mBbaMem[BBA_NAFR_PAR0]); + ref->bba_mac = m_current_mac; ref->my_mac = m_fake_mac; ref->tcp_socket.setBlocking(false); @@ -420,7 +418,7 @@ void CEXIETHERNET::BuiltInBBAInterface::InitUDPPort(u16 port) ref->local = htons(port); ref->remote = htons(port); ref->type = IPPROTO_UDP; - ref->bba_mac = Common::BitCastPtr(&m_eth_ref->mBbaMem[BBA_NAFR_PAR0]); + ref->bba_mac = m_current_mac; ref->my_mac = m_fake_mac; ref->from.sin_addr.s_addr = 0; ref->from.sin_port = htons(port); @@ -450,7 +448,7 @@ void CEXIETHERNET::BuiltInBBAInterface::HandleUDPFrame(const Common::UDPPacket& ref->local = udp_header.source_port; ref->remote = udp_header.destination_port; ref->type = IPPROTO_UDP; - ref->bba_mac = Common::BitCastPtr(&m_eth_ref->mBbaMem[BBA_NAFR_PAR0]); + ref->bba_mac = m_current_mac; ref->my_mac = m_fake_mac; ref->from.sin_addr.s_addr = destination_addr; ref->from.sin_port = udp_header.destination_port; diff --git a/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h b/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h index e69033ed2b..ac9015a4c1 100644 --- a/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h +++ b/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h @@ -445,6 +445,7 @@ private: std::mutex m_mtx; std::string m_local_ip; u32 m_current_ip = 0; + Common::MACAddress m_current_mac{}; u32 m_router_ip = 0; std::map m_arp_table; #if defined(WIN32) || defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || \ From cc7cfe249e38c8e958d1819e78369a70dbc22a0b Mon Sep 17 00:00:00 2001 From: Sepalani Date: Sat, 30 Jul 2022 23:47:03 +0400 Subject: [PATCH 3/6] BBA/BuiltIn: Move TryGetDataFromSocket --- Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp | 145 ++++++++++--------- Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h | 1 + 2 files changed, 74 insertions(+), 72 deletions(-) diff --git a/Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp b/Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp index c3c730d2d6..732793a725 100644 --- a/Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp +++ b/Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp @@ -56,77 +56,6 @@ void SetIPIdentification(u8* ptr, std::size_t size, u16 value) checksum_bitcast_ptr = u16(0); checksum_bitcast_ptr = htons(Common::ComputeNetworkChecksum(ip_ptr, ip_header_size)); } - -std::optional> TryGetDataFromSocket(StackRef* ref) -{ - size_t datasize = 0; // Set by socket.receive using a non-const reference - unsigned short remote_port; - - switch (ref->type) - { - case IPPROTO_UDP: - { - std::array buffer; - ref->udp_socket.receive(buffer.data(), MAX_UDP_LENGTH, datasize, ref->target, remote_port); - if (datasize > 0) - { - ref->from.sin_port = htons(remote_port); - ref->from.sin_addr.s_addr = htonl(ref->target.toInteger()); - const std::vector udp_data(buffer.begin(), buffer.begin() + datasize); - const Common::UDPPacket packet(ref->bba_mac, ref->my_mac, ref->from, ref->to, udp_data); - return packet.Build(); - } - break; - } - - case IPPROTO_TCP: - sf::Socket::Status st = sf::Socket::Status::Done; - TcpBuffer* tcp_buffer = nullptr; - for (auto& tcp_buf : ref->tcp_buffers) - { - if (tcp_buf.used) - continue; - tcp_buffer = &tcp_buf; - break; - } - - // set default size to 0 to avoid issue - datasize = 0; - const bool can_go = (GetTickCountStd() - ref->poke_time > 100 || ref->window_size > 2000); - std::array buffer; - if (tcp_buffer != nullptr && ref->ready && can_go) - st = ref->tcp_socket.receive(buffer.data(), MAX_TCP_LENGTH, datasize); - - if (datasize > 0) - { - Common::TCPPacket packet(ref->bba_mac, ref->my_mac, ref->from, ref->to, ref->seq_num, - ref->ack_num, TCP_FLAG_ACK); - packet.data = std::vector(buffer.begin(), buffer.begin() + datasize); - - // build buffer - tcp_buffer->seq_id = ref->seq_num; - tcp_buffer->tick = GetTickCountStd(); - tcp_buffer->data = packet.Build(); - tcp_buffer->seq_id = ref->seq_num; - tcp_buffer->used = true; - ref->seq_num += static_cast(datasize); - ref->poke_time = GetTickCountStd(); - return tcp_buffer->data; - } - if (GetTickCountStd() - ref->delay > 3000) - { - if (st == sf::Socket::Disconnected || st == sf::Socket::Error) - { - ref->ip = 0; - ref->tcp_socket.disconnect(); - return BuildFINFrame(ref); - } - } - break; - } - - return std::nullopt; -} } // namespace bool CEXIETHERNET::BuiltInBBAInterface::Activate() @@ -289,6 +218,78 @@ StackRef* CEXIETHERNET::BuiltInBBAInterface::GetTCPSlot(u16 src_port, u16 dst_po return nullptr; } +std::optional> +CEXIETHERNET::BuiltInBBAInterface::TryGetDataFromSocket(StackRef* ref) +{ + size_t datasize = 0; // Set by socket.receive using a non-const reference + unsigned short remote_port; + + switch (ref->type) + { + case IPPROTO_UDP: + { + std::array buffer; + ref->udp_socket.receive(buffer.data(), MAX_UDP_LENGTH, datasize, ref->target, remote_port); + if (datasize > 0) + { + ref->from.sin_port = htons(remote_port); + ref->from.sin_addr.s_addr = htonl(ref->target.toInteger()); + const std::vector udp_data(buffer.begin(), buffer.begin() + datasize); + const Common::UDPPacket packet(ref->bba_mac, ref->my_mac, ref->from, ref->to, udp_data); + return packet.Build(); + } + break; + } + + case IPPROTO_TCP: + sf::Socket::Status st = sf::Socket::Status::Done; + TcpBuffer* tcp_buffer = nullptr; + for (auto& tcp_buf : ref->tcp_buffers) + { + if (tcp_buf.used) + continue; + tcp_buffer = &tcp_buf; + break; + } + + // set default size to 0 to avoid issue + datasize = 0; + const bool can_go = (GetTickCountStd() - ref->poke_time > 100 || ref->window_size > 2000); + std::array buffer; + if (tcp_buffer != nullptr && ref->ready && can_go) + st = ref->tcp_socket.receive(buffer.data(), MAX_TCP_LENGTH, datasize); + + if (datasize > 0) + { + Common::TCPPacket packet(ref->bba_mac, ref->my_mac, ref->from, ref->to, ref->seq_num, + ref->ack_num, TCP_FLAG_ACK); + packet.data = std::vector(buffer.begin(), buffer.begin() + datasize); + + // build buffer + tcp_buffer->seq_id = ref->seq_num; + tcp_buffer->tick = GetTickCountStd(); + tcp_buffer->data = packet.Build(); + tcp_buffer->seq_id = ref->seq_num; + tcp_buffer->used = true; + ref->seq_num += static_cast(datasize); + ref->poke_time = GetTickCountStd(); + return tcp_buffer->data; + } + if (GetTickCountStd() - ref->delay > 3000) + { + if (st == sf::Socket::Disconnected || st == sf::Socket::Error) + { + ref->ip = 0; + ref->tcp_socket.disconnect(); + return BuildFINFrame(ref); + } + } + break; + } + + return std::nullopt; +} + void CEXIETHERNET::BuiltInBBAInterface::HandleTCPFrame(const Common::TCPPacket& packet) { const auto& [hwdata, ip_header, tcp_header, ip_options, tcp_options, data] = packet; @@ -629,7 +630,7 @@ void CEXIETHERNET::BuiltInBBAInterface::ReadThreadHandler(CEXIETHERNET::BuiltInB { if (net_ref.ip == 0) continue; - const auto socket_data = TryGetDataFromSocket(&net_ref); + const auto socket_data = self->TryGetDataFromSocket(&net_ref); if (socket_data.has_value()) { datasize = socket_data->size(); diff --git a/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h b/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h index ac9015a4c1..5d3343c619 100644 --- a/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h +++ b/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h @@ -461,6 +461,7 @@ private: void WriteToQueue(const std::vector& data); StackRef* GetAvailableSlot(u16 port); StackRef* GetTCPSlot(u16 src_port, u16 dst_port, u32 ip); + std::optional> TryGetDataFromSocket(StackRef* ref); void HandleARP(const Common::ARPPacket& packet); void HandleDHCP(const Common::UDPPacket& packet); From b029b468cda473ede64eb8af6ac42163b7823c21 Mon Sep 17 00:00:00 2001 From: Sepalani Date: Sun, 31 Jul 2022 00:01:31 +0400 Subject: [PATCH 4/6] BBA/BuiltIn: Fix MAC address issues with TCP and UDP --- Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp b/Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp index 732793a725..b48a069d7e 100644 --- a/Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp +++ b/Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp @@ -233,7 +233,9 @@ CEXIETHERNET::BuiltInBBAInterface::TryGetDataFromSocket(StackRef* ref) if (datasize > 0) { ref->from.sin_port = htons(remote_port); - ref->from.sin_addr.s_addr = htonl(ref->target.toInteger()); + const u32 remote_ip = htonl(ref->target.toInteger()); + ref->from.sin_addr.s_addr = remote_ip; + ref->my_mac = ResolveAddress(remote_ip); const std::vector udp_data(buffer.begin(), buffer.begin() + datasize); const Common::UDPPacket packet(ref->bba_mac, ref->my_mac, ref->from, ref->to, udp_data); return packet.Build(); @@ -324,12 +326,13 @@ void CEXIETHERNET::BuiltInBBAInterface::HandleTCPFrame(const Common::TCPPacket& ref->type = IPPROTO_TCP; for (auto& tcp_buf : ref->tcp_buffers) tcp_buf.used = false; - ref->from.sin_addr.s_addr = Common::BitCast(ip_header.destination_addr); + const u32 destination_ip = Common::BitCast(ip_header.destination_addr); + ref->from.sin_addr.s_addr = destination_ip; ref->from.sin_port = tcp_header.destination_port; ref->to.sin_addr.s_addr = Common::BitCast(ip_header.source_addr); ref->to.sin_port = tcp_header.source_port; ref->bba_mac = m_current_mac; - ref->my_mac = m_fake_mac; + ref->my_mac = ResolveAddress(destination_ip); ref->tcp_socket.setBlocking(false); // reply with a sin_ack @@ -339,7 +342,7 @@ void CEXIETHERNET::BuiltInBBAInterface::HandleTCPFrame(const Common::TCPPacket& result.tcp_options = {0x02, 0x04, 0x05, 0xb4, 0x01, 0x01, 0x01, 0x01}; ref->seq_num++; - target = sf::IpAddress(ntohl(Common::BitCast(ip_header.destination_addr))); + target = sf::IpAddress(ntohl(destination_ip)); ref->tcp_socket.connect(target, ntohs(tcp_header.destination_port)); ref->ready = false; ref->ip = Common::BitCast(ip_header.destination_addr); From 7e9711d73824fcf2ddd885865080fe3f0f582c20 Mon Sep 17 00:00:00 2001 From: Sepalani Date: Sun, 31 Jul 2022 00:06:04 +0400 Subject: [PATCH 5/6] BBA/BuiltIn: Rename m_fake_mac to m_router_mac --- Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp | 10 +++++----- Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp b/Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp index b48a069d7e..9e790484a2 100644 --- a/Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp +++ b/Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp @@ -66,7 +66,6 @@ bool CEXIETHERNET::BuiltInBBAInterface::Activate() m_active = true; for (auto& buf : m_queue_data) buf.reserve(2048); - m_fake_mac = Common::GenerateMacAddress(Common::MACConsumer::BBA); // Workaround to get the host IP (might not be accurate) const u32 ip = m_local_ip.empty() ? sf::IpAddress::getLocalAddress().toInteger() : @@ -74,6 +73,7 @@ bool CEXIETHERNET::BuiltInBBAInterface::Activate() m_current_ip = htonl(ip); m_current_mac = Common::BitCastPtr(&m_eth_ref->mBbaMem[BBA_NAFR_PAR0]); m_router_ip = (m_current_ip & 0xFFFFFF) | 0x01000000; + m_router_mac = Common::GenerateMacAddress(Common::MACConsumer::BBA); // clear all ref for (auto& ref : network_ref) @@ -127,7 +127,7 @@ void CEXIETHERNET::BuiltInBBAInterface::WriteToQueue(const std::vector& data void CEXIETHERNET::BuiltInBBAInterface::HandleARP(const Common::ARPPacket& packet) { const auto& [hwdata, arpdata] = packet; - Common::ARPPacket response(m_current_mac, m_fake_mac); + Common::ARPPacket response(m_current_mac, m_router_mac); if (arpdata.target_ip == m_current_ip) { @@ -183,7 +183,7 @@ void CEXIETHERNET::BuiltInBBAInterface::HandleDHCP(const Common::UDPPacket& pack reply.AddOption(3, ip_part); // router ip reply.AddOption(255, {}); // end - const Common::UDPPacket response(m_current_mac, m_fake_mac, from, to, reply.Build()); + const Common::UDPPacket response(m_current_mac, m_router_mac, from, to, reply.Build()); WriteToQueue(response.Build()); } @@ -423,7 +423,7 @@ void CEXIETHERNET::BuiltInBBAInterface::InitUDPPort(u16 port) ref->remote = htons(port); ref->type = IPPROTO_UDP; ref->bba_mac = m_current_mac; - ref->my_mac = m_fake_mac; + ref->my_mac = m_router_mac; ref->from.sin_addr.s_addr = 0; ref->from.sin_port = htons(port); ref->to.sin_addr.s_addr = m_current_ip; @@ -453,7 +453,7 @@ void CEXIETHERNET::BuiltInBBAInterface::HandleUDPFrame(const Common::UDPPacket& ref->remote = udp_header.destination_port; ref->type = IPPROTO_UDP; ref->bba_mac = m_current_mac; - ref->my_mac = m_fake_mac; + ref->my_mac = m_router_mac; ref->from.sin_addr.s_addr = destination_addr; ref->from.sin_port = udp_header.destination_port; ref->to.sin_addr.s_addr = Common::BitCast(ip_header.source_addr); diff --git a/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h b/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h index 5d3343c619..4a6c4019f5 100644 --- a/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h +++ b/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h @@ -447,6 +447,7 @@ private: u32 m_current_ip = 0; Common::MACAddress m_current_mac{}; u32 m_router_ip = 0; + Common::MACAddress m_router_mac{}; std::map m_arp_table; #if defined(WIN32) || defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || \ defined(__OpenBSD__) || defined(__NetBSD__) || defined(__HAIKU__) @@ -455,7 +456,6 @@ private: std::thread m_read_thread; Common::Flag m_read_enabled; Common::Flag m_read_thread_shutdown; - Common::MACAddress m_fake_mac{}; static void ReadThreadHandler(BuiltInBBAInterface* self); #endif void WriteToQueue(const std::vector& data); From bfc2d11891e12494e7ec0e70bb4594bcfea30798 Mon Sep 17 00:00:00 2001 From: Sepalani Date: Sun, 31 Jul 2022 01:33:49 +0400 Subject: [PATCH 6/6] BBA/BuiltIn: Simplify HandleARP --- Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp b/Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp index 9e790484a2..c02cb8585f 100644 --- a/Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp +++ b/Source/Core/Core/HW/EXI/BBA/BuiltIn.cpp @@ -72,8 +72,10 @@ bool CEXIETHERNET::BuiltInBBAInterface::Activate() sf::IpAddress(m_local_ip).toInteger(); m_current_ip = htonl(ip); m_current_mac = Common::BitCastPtr(&m_eth_ref->mBbaMem[BBA_NAFR_PAR0]); + m_arp_table[m_current_ip] = m_current_mac; m_router_ip = (m_current_ip & 0xFFFFFF) | 0x01000000; m_router_mac = Common::GenerateMacAddress(Common::MACConsumer::BBA); + m_arp_table[m_router_ip] = m_router_mac; // clear all ref for (auto& ref : network_ref) @@ -128,19 +130,8 @@ void CEXIETHERNET::BuiltInBBAInterface::HandleARP(const Common::ARPPacket& packe { const auto& [hwdata, arpdata] = packet; Common::ARPPacket response(m_current_mac, m_router_mac); - - if (arpdata.target_ip == m_current_ip) - { - // game asked for himself, reply with his mac address - response.arp_header = - Common::ARPHeader(arpdata.target_ip, m_current_mac, m_current_ip, m_current_mac); - } - else - { - response.arp_header = Common::ARPHeader(arpdata.target_ip, ResolveAddress(arpdata.target_ip), - m_current_ip, m_current_mac); - } - + response.arp_header = Common::ARPHeader(arpdata.target_ip, ResolveAddress(arpdata.target_ip), + m_current_ip, m_current_mac); WriteToQueue(response.Build()); }