diff --git a/rpcs3/Emu/NP/np_handler.cpp b/rpcs3/Emu/NP/np_handler.cpp index 3eb2bef0ed..0d628e299e 100644 --- a/rpcs3/Emu/NP/np_handler.cpp +++ b/rpcs3/Emu/NP/np_handler.cpp @@ -612,6 +612,15 @@ namespace np bool np_handler::discover_ether_address() { + if (g_cfg.net.derive_mac_from_psid) + { + const u128 psid = g_cfg.sys.console_psid; + memcpy(ether_address.data(), &psid, 6); + ether_address[0] &= 0xFE; + ether_address[0] |= 0x02; + return true; + } + #if defined(__FreeBSD__) || defined(__APPLE__) ifaddrs* ifap; diff --git a/rpcs3/Emu/system_config.h b/rpcs3/Emu/system_config.h index e10c12610a..08004f5a46 100644 --- a/rpcs3/Emu/system_config.h +++ b/rpcs3/Emu/system_config.h @@ -332,6 +332,7 @@ struct cfg_root : cfg::node cfg::string dns{this, "DNS address", "8.8.8.8"}; cfg::string swap_list{this, "IP swap list", ""}; cfg::_bool upnp_enabled{this, "UPNP Enabled", false}; + cfg::_bool derive_mac_from_psid{this, "Derive MAC from PSID", false}; cfg::_enum psn_status{this, "PSN status", np_psn_status::disabled}; cfg::string country{this, "PSN Country", "us"}; diff --git a/rpcs3/rpcs3qt/emu_settings_type.cpp b/rpcs3/rpcs3qt/emu_settings_type.cpp index 6a9ff966b5..0307f764d5 100644 --- a/rpcs3/rpcs3qt/emu_settings_type.cpp +++ b/rpcs3/rpcs3qt/emu_settings_type.cpp @@ -219,6 +219,7 @@ const std::map settings_location = { emu_settings_type::PSNStatus, get_cfg_location(local_cfg.net.psn_status) }, { emu_settings_type::BindAddress, get_cfg_location(local_cfg.net.bind_address) }, { emu_settings_type::EnableUpnp, get_cfg_location(local_cfg.net.upnp_enabled) }, + { emu_settings_type::DeriveMacFromPsid, get_cfg_location(local_cfg.net.derive_mac_from_psid) }, { emu_settings_type::PSNCountry, get_cfg_location(local_cfg.net.country) }, { emu_settings_type::EnableClans, get_cfg_location(local_cfg.net.clans_enabled) }, diff --git a/rpcs3/rpcs3qt/emu_settings_type.h b/rpcs3/rpcs3qt/emu_settings_type.h index d6105beb1f..fbc3996e03 100644 --- a/rpcs3/rpcs3qt/emu_settings_type.h +++ b/rpcs3/rpcs3qt/emu_settings_type.h @@ -210,6 +210,7 @@ enum class emu_settings_type PSNStatus, BindAddress, EnableUpnp, + DeriveMacFromPsid, PSNCountry, EnableClans, diff --git a/rpcs3/rpcs3qt/settings_dialog.cpp b/rpcs3/rpcs3qt/settings_dialog.cpp index fabc1f024e..dddb803c4f 100644 --- a/rpcs3/rpcs3qt/settings_dialog.cpp +++ b/rpcs3/rpcs3qt/settings_dialog.cpp @@ -1432,14 +1432,19 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std m_emu_settings->EnhanceCheckBox(ui->enable_upnp, emu_settings_type::EnableUpnp); SubscribeTooltip(ui->enable_upnp, tooltips.settings.enable_upnp); + m_emu_settings->EnhanceCheckBox(ui->derive_mac_from_psid, emu_settings_type::DeriveMacFromPsid); + SubscribeTooltip(ui->derive_mac_from_psid, tooltips.settings.derive_mac_from_psid); + // Comboboxes connect(ui->netStatusBox, &QComboBox::currentIndexChanged, [this](int index) { if (index < 0) return; const auto [text, value] = get_data(ui->netStatusBox, index); - ui->gb_edit_dns->setEnabled(static_cast(value) != np_internet_status::disabled); - ui->enable_upnp->setEnabled(static_cast(value) != np_internet_status::disabled); + const bool internet_enabled = static_cast(value) != np_internet_status::disabled; + ui->gb_edit_dns->setEnabled(internet_enabled); + ui->enable_upnp->setEnabled(internet_enabled); + ui->derive_mac_from_psid->setEnabled(internet_enabled); if (static_cast(value) == np_internet_status::disabled) { diff --git a/rpcs3/rpcs3qt/settings_dialog.ui b/rpcs3/rpcs3qt/settings_dialog.ui index a8f17f0310..d5024f4bef 100644 --- a/rpcs3/rpcs3qt/settings_dialog.ui +++ b/rpcs3/rpcs3qt/settings_dialog.ui @@ -2305,6 +2305,13 @@ + + + + Derive ethernet address from PSID + + + diff --git a/rpcs3/rpcs3qt/tooltips.h b/rpcs3/rpcs3qt/tooltips.h index 9e8bac8c49..dba2bd5c1d 100644 --- a/rpcs3/rpcs3qt/tooltips.h +++ b/rpcs3/rpcs3qt/tooltips.h @@ -265,6 +265,7 @@ public: const QString dns_swap = tr("DNS Swap List.\nOnly available in custom configurations."); const QString bind = tr("Interface IP Address to bind to.\nOnly available in custom configurations."); const QString enable_upnp = tr("Enable UPNP.\nThis will automatically forward ports bound on 0.0.0.0 if your router has UPNP enabled."); + const QString derive_mac_from_psid = tr("Derive the MAC address from the PSID."); const QString psn_country = tr("Changes the RPCN country."); const QString enable_clans = tr("Enable connection to the Clans server.\nOnly affects games supporting the Clans feature.");