Skip to content
Permalink
Browse files
Merge pull request #8861 from JosJuice/netplay-hash
Make netplay's "same game" check more robust
  • Loading branch information
JMC47 committed Sep 6, 2020
2 parents 344fdab + fc6c193 commit e7e5175
Show file tree
Hide file tree
Showing 35 changed files with 523 additions and 157 deletions.
@@ -37,6 +37,7 @@ add_library(core
PatchEngine.h
State.cpp
State.h
SyncIdentifier.h
SysConf.cpp
SysConf.h
TitleDatabase.cpp
@@ -673,6 +673,7 @@
<ClInclude Include="PowerPC\PPCTables.h" />
<ClInclude Include="PowerPC\Profiler.h" />
<ClInclude Include="State.h" />
<ClInclude Include="SyncIdentifier.h" />
<ClInclude Include="SysConf.h" />
<ClInclude Include="Titles.h" />
<ClInclude Include="TitleDatabase.h" />
@@ -1757,7 +1757,8 @@
</ClInclude>
<ClInclude Include="HW\EXI\BBA\TAP_Win32.h">
<Filter>HW %28Flipper/Hollywood%29\EXI - Expansion Interface\BBA</Filter>
</ClInclude>
</ClInclude>
<ClInclude Include="SyncIdentifier.h" />
</ItemGroup>
<ItemGroup>
<Text Include="CMakeLists.txt" />
@@ -53,9 +53,11 @@
#include "Core/IOS/Uids.h"
#include "Core/Movie.h"
#include "Core/PowerPC/PowerPC.h"
#include "Core/SyncIdentifier.h"
#include "InputCommon/ControllerEmu/ControlGroup/Attachments.h"
#include "InputCommon/GCAdapter.h"
#include "InputCommon/InputConfig.h"
#include "UICommon/GameFile.h"
#include "VideoCommon/OnScreenDisplay.h"
#include "VideoCommon/VideoConfig.h"

@@ -284,6 +286,22 @@ bool NetPlayClient::Connect()
}
}

static void ReceiveSyncIdentifier(sf::Packet& spac, SyncIdentifier& sync_identifier)
{
// We use a temporary variable here due to a potential long vs long long mismatch
sf::Uint64 dol_elf_size;
spac >> dol_elf_size;
sync_identifier.dol_elf_size = dol_elf_size;

spac >> sync_identifier.game_id;
spac >> sync_identifier.revision;
spac >> sync_identifier.disc_number;
spac >> sync_identifier.is_datel;

for (u8& x : sync_identifier.sync_hash)
spac >> x;
}

// called from ---NETPLAY--- thread
unsigned int NetPlayClient::OnData(sf::Packet& packet)
{
@@ -572,24 +590,25 @@ unsigned int NetPlayClient::OnData(sf::Packet& packet)

case NP_MSG_CHANGE_GAME:
{
std::string netplay_name;
{
std::lock_guard<std::recursive_mutex> lkg(m_crit.game);
packet >> m_selected_game;
ReceiveSyncIdentifier(packet, m_selected_game);
packet >> netplay_name;
}

INFO_LOG(NETPLAY, "Game changed to %s", m_selected_game.c_str());
INFO_LOG(NETPLAY, "Game changed to %s", netplay_name.c_str());

// update gui
m_dialog->OnMsgChangeGame(m_selected_game);
m_dialog->OnMsgChangeGame(m_selected_game, netplay_name);

sf::Packet game_status_packet;
game_status_packet << static_cast<MessageId>(NP_MSG_GAME_STATUS);

PlayerGameStatus status = m_dialog->FindGame(m_selected_game).empty() ?
PlayerGameStatus::NotFound :
PlayerGameStatus::Ok;
SyncIdentifierComparison result;
m_dialog->FindGameFile(m_selected_game, &result);

game_status_packet << static_cast<u32>(status);
game_status_packet << static_cast<u32>(result);
Send(game_status_packet);

sf::Packet ipl_status_packet;
@@ -609,7 +628,7 @@ unsigned int NetPlayClient::OnData(sf::Packet& packet)
Player& player = m_players[pid];
u32 status;
packet >> status;
player.game_status = static_cast<PlayerGameStatus>(status);
player.game_status = static_cast<SyncIdentifierComparison>(status);
}

m_dialog->Update();
@@ -623,7 +642,7 @@ unsigned int NetPlayClient::OnData(sf::Packet& packet)
packet >> m_current_game;
packet >> m_net_settings.m_CPUthread;

INFO_LOG(NETPLAY, "Start of game %s", m_selected_game.c_str());
INFO_LOG(NETPLAY, "Start of game %s", m_selected_game.game_id.c_str());

{
std::underlying_type_t<PowerPC::CPUCore> core;
@@ -1172,10 +1191,10 @@ unsigned int NetPlayClient::OnData(sf::Packet& packet)

case NP_MSG_COMPUTE_MD5:
{
std::string file_identifier;
packet >> file_identifier;
SyncIdentifier sync_identifier;
ReceiveSyncIdentifier(packet, sync_identifier);

ComputeMD5(file_identifier);
ComputeMD5(sync_identifier);
}
break;

@@ -1382,11 +1401,15 @@ void NetPlayClient::GetPlayerList(std::string& list, std::vector<int>& pid_list)

switch (player.game_status)
{
case PlayerGameStatus::Ok:
case SyncIdentifierComparison::SameGame:
ss << "ready";
break;

case PlayerGameStatus::NotFound:
case SyncIdentifierComparison::DifferentVersion:
ss << "wrong game version";
break;

case SyncIdentifierComparison::DifferentGame:
ss << "game missing";
break;

@@ -2286,23 +2309,24 @@ bool NetPlayClient::DoAllPlayersHaveGame()
{
std::lock_guard<std::recursive_mutex> lkp(m_crit.players);

return std::all_of(std::begin(m_players), std::end(m_players),
[](auto entry) { return entry.second.game_status == PlayerGameStatus::Ok; });
return std::all_of(std::begin(m_players), std::end(m_players), [](auto entry) {
return entry.second.game_status == SyncIdentifierComparison::SameGame;
});
}

void NetPlayClient::ComputeMD5(const std::string& file_identifier)
void NetPlayClient::ComputeMD5(const SyncIdentifier& sync_identifier)
{
if (m_should_compute_MD5)
return;

m_dialog->ShowMD5Dialog(file_identifier);
m_dialog->ShowMD5Dialog(sync_identifier.game_id);
m_should_compute_MD5 = true;

std::string file;
if (file_identifier == WII_SDCARD)
if (sync_identifier == GetSDCardIdentifier())
file = File::GetUserPath(F_WIISDCARD_IDX);
else
file = m_dialog->FindGame(file_identifier);
else if (auto game = m_dialog->FindGameFile(sync_identifier))
file = game->GetFilePath();

if (file.empty() || !File::Exists(file))
{
@@ -2348,6 +2372,11 @@ void NetPlayClient::AdjustPadBufferSize(const unsigned int size)
m_dialog->OnPadBufferChanged(size);
}

SyncIdentifier NetPlayClient::GetSDCardIdentifier()
{
return SyncIdentifier{{}, "sd", {}, {}, {}, {}};
}

bool IsNetPlayRunning()
{
return netplay_client != nullptr;
@@ -22,6 +22,7 @@
#include "Common/SPSCQueue.h"
#include "Common/TraversalClient.h"
#include "Core/NetPlayProto.h"
#include "Core/SyncIdentifier.h"
#include "InputCommon/GCPadStatus.h"

namespace UICommon
@@ -42,7 +43,8 @@ class NetPlayUI
virtual void Update() = 0;
virtual void AppendChat(const std::string& msg) = 0;

virtual void OnMsgChangeGame(const std::string& filename) = 0;
virtual void OnMsgChangeGame(const SyncIdentifier& sync_identifier,
const std::string& netplay_name) = 0;
virtual void OnMsgStartGame() = 0;
virtual void OnMsgStopGame() = 0;
virtual void OnMsgPowerButton() = 0;
@@ -59,9 +61,10 @@ class NetPlayUI
virtual void OnGolferChanged(bool is_golfer, const std::string& golfer_name) = 0;

virtual bool IsRecording() = 0;
virtual std::string FindGame(const std::string& game) = 0;
virtual std::shared_ptr<const UICommon::GameFile> FindGameFile(const std::string& game) = 0;
virtual void ShowMD5Dialog(const std::string& file_identifier) = 0;
virtual std::shared_ptr<const UICommon::GameFile>
FindGameFile(const SyncIdentifier& sync_identifier,
SyncIdentifierComparison* found = nullptr) = 0;
virtual void ShowMD5Dialog(const std::string& title) = 0;
virtual void SetMD5Progress(int pid, int progress) = 0;
virtual void SetMD5Result(int pid, const std::string& result) = 0;
virtual void AbortMD5() = 0;
@@ -75,21 +78,14 @@ class NetPlayUI
virtual void SetChunkedProgress(int pid, u64 progress) = 0;
};

enum class PlayerGameStatus
{
Unknown,
Ok,
NotFound
};

class Player
{
public:
PlayerId pid;
std::string name;
std::string revision;
u32 ping;
PlayerGameStatus game_status;
SyncIdentifierComparison game_status;

bool IsHost() const { return pid == 1; }
};
@@ -149,6 +145,8 @@ class NetPlayClient : public TraversalClientClient

void AdjustPadBufferSize(unsigned int size);

static SyncIdentifier GetSDCardIdentifier();

protected:
struct AsyncQueueEntry
{
@@ -182,7 +180,7 @@ class NetPlayClient : public TraversalClientClient
ENetPeer* m_server = nullptr;
std::thread m_thread;

std::string m_selected_game;
SyncIdentifier m_selected_game;
Common::Flag m_is_running{false};
Common::Flag m_do_loop{true};

@@ -237,7 +235,7 @@ class NetPlayClient : public TraversalClientClient
void Send(const sf::Packet& packet, u8 channel_id = DEFAULT_CHANNEL);
void Disconnect();
bool Connect();
void ComputeMD5(const std::string& file_identifier);
void ComputeMD5(const SyncIdentifier& sync_identifier);
void DisplayPlayersPing();
u32 GetPlayersMaxPing() const;

0 comments on commit e7e5175

Please sign in to comment.