diff --git a/src/core/hle/service/nwm/nwm.cpp b/src/core/hle/service/nwm/nwm.cpp index ce4c98bce..8d63cb89f 100644 --- a/src/core/hle/service/nwm/nwm.cpp +++ b/src/core/hle/service/nwm/nwm.cpp @@ -2,6 +2,7 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include #include "core/hle/service/nwm/nwm.h" #include "core/hle/service/nwm/nwm_cec.h" #include "core/hle/service/nwm/nwm_ext.h" @@ -10,6 +11,8 @@ #include "core/hle/service/nwm/nwm_soc.h" #include "core/hle/service/nwm/nwm_tst.h" #include "core/hle/service/nwm/nwm_uds.h" +#include "core/hle/shared_page.h" +#include "network/network.h" namespace Service { namespace NWM { @@ -21,6 +24,19 @@ void Init() { AddService(new NWM_SAP); AddService(new NWM_SOC); AddService(new NWM_TST); + + CryptoPP::AutoSeededRandomPool rng; + auto mac = SharedPage::DefaultMac; + // Keep the Nintendo 3DS MAC header and randomly generate the last 3 bytes + rng.GenerateBlock(static_cast(mac.data() + 3), 3); + + if (auto room_member = Network::GetRoomMember().lock()) { + if (room_member->IsConnected()) { + mac = room_member->GetMacAddress(); + } + } + SharedPage::SetMacAddress(mac); + SharedPage::SetWifiLinkLevel(SharedPage::WifiLinkLevel::BEST); } void InstallInterfaces(SM::ServiceManager& service_manager) { diff --git a/src/core/hle/shared_page.cpp b/src/core/hle/shared_page.cpp index eb9a87438..0102d0f5e 100644 --- a/src/core/hle/shared_page.cpp +++ b/src/core/hle/shared_page.cpp @@ -85,4 +85,12 @@ void Init() { CoreTiming::ScheduleEvent(0, update_time_event); } -} // namespace +void SetMacAddress(const MacAddress& addr) { + std::memcpy(shared_page.wifi_macaddr, addr.data(), sizeof(MacAddress)); +} + +void SetWifiLinkLevel(WifiLinkLevel level) { + shared_page.wifi_link_level = static_cast(level); +} + +} // namespace SharedPage diff --git a/src/core/hle/shared_page.h b/src/core/hle/shared_page.h index 864695ae1..1e2fce6b7 100644 --- a/src/core/hle/shared_page.h +++ b/src/core/hle/shared_page.h @@ -37,6 +37,18 @@ union BatteryState { BitField<2, 3, u8> charge_level; }; +using MacAddress = std::array; + +// Default MAC address in the Nintendo 3DS range +constexpr MacAddress DefaultMac = {0x40, 0xF4, 0x07, 0x00, 0x00, 0x00}; + +enum class WifiLinkLevel : u8 { + OFF = 0, + POOR = 1, + GOOD = 2, + BEST = 3, +}; + struct SharedPageDef { // Most of these names are taken from the 3dbrew page linked above. u32_le date_time_counter; // 0 @@ -66,4 +78,8 @@ extern SharedPageDef shared_page; void Init(); -} // namespace +void SetMacAddress(const MacAddress&); + +void SetWifiLinkLevel(WifiLinkLevel); + +} // namespace SharedPage