Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #9455 from lioncash/traversal
TraversalProto: Minor cleanup
  • Loading branch information
leoetlino committed Jan 27, 2021
2 parents bb121dc + b425250 commit 4ba9bb2
Show file tree
Hide file tree
Showing 9 changed files with 97 additions and 87 deletions.
50 changes: 25 additions & 25 deletions Source/Core/Common/TraversalClient.cpp
Expand Up @@ -48,41 +48,41 @@ void TraversalClient::ReconnectToServer()
}
m_ServerAddress.port = m_port;

m_State = Connecting;
m_State = State::Connecting;

TraversalPacket hello = {};
hello.type = TraversalPacketHelloFromClient;
hello.type = TraversalPacketType::HelloFromClient;
hello.helloFromClient.protoVersion = TraversalProtoVersion;
SendTraversalPacket(hello);
if (m_Client)
m_Client->OnTraversalStateChanged();
}

static ENetAddress MakeENetAddress(TraversalInetAddress* address)
static ENetAddress MakeENetAddress(const TraversalInetAddress& address)
{
ENetAddress eaddr;
if (address->isIPV6)
ENetAddress eaddr{};
if (address.isIPV6)
{
eaddr.port = 0; // no support yet :(
}
else
{
eaddr.host = address->address[0];
eaddr.port = ntohs(address->port);
eaddr.host = address.address[0];
eaddr.port = ntohs(address.port);
}
return eaddr;
}

void TraversalClient::ConnectToClient(const std::string& host)
void TraversalClient::ConnectToClient(std::string_view host)
{
if (host.size() > sizeof(TraversalHostId))
{
PanicAlertFmt("Host too long");
return;
}
TraversalPacket packet = {};
packet.type = TraversalPacketConnectPlease;
memcpy(packet.connectPlease.hostId.data(), host.c_str(), host.size());
packet.type = TraversalPacketType::ConnectPlease;
memcpy(packet.connectPlease.hostId.data(), host.data(), host.size());
m_ConnectRequestId = SendTraversalPacket(packet);
m_PendingConnect = true;
}
Expand Down Expand Up @@ -129,7 +129,7 @@ void TraversalClient::HandleServerPacket(TraversalPacket* packet)
u8 ok = 1;
switch (packet->type)
{
case TraversalPacketAck:
case TraversalPacketType::Ack:
if (!packet->ack.ok)
{
OnFailure(FailureReason::ServerForgotAboutUs);
Expand All @@ -144,23 +144,23 @@ void TraversalClient::HandleServerPacket(TraversalPacket* packet)
}
}
break;
case TraversalPacketHelloFromServer:
if (m_State != Connecting)
case TraversalPacketType::HelloFromServer:
if (!IsConnecting())
break;
if (!packet->helloFromServer.ok)
{
OnFailure(FailureReason::VersionTooOld);
break;
}
m_HostId = packet->helloFromServer.yourHostId;
m_State = Connected;
m_State = State::Connected;
if (m_Client)
m_Client->OnTraversalStateChanged();
break;
case TraversalPacketPleaseSendPacket:
case TraversalPacketType::PleaseSendPacket:
{
// security is overrated.
ENetAddress addr = MakeENetAddress(&packet->pleaseSendPacket.address);
ENetAddress addr = MakeENetAddress(packet->pleaseSendPacket.address);
if (addr.port != 0)
{
char message[] = "Hello from Dolphin Netplay...";
Expand All @@ -176,8 +176,8 @@ void TraversalClient::HandleServerPacket(TraversalPacket* packet)
}
break;
}
case TraversalPacketConnectReady:
case TraversalPacketConnectFailed:
case TraversalPacketType::ConnectReady:
case TraversalPacketType::ConnectFailed:
{
if (!m_PendingConnect || packet->connectReady.requestId != m_ConnectRequestId)
break;
Expand All @@ -187,8 +187,8 @@ void TraversalClient::HandleServerPacket(TraversalPacket* packet)
if (!m_Client)
break;

if (packet->type == TraversalPacketConnectReady)
m_Client->OnConnectReady(MakeENetAddress(&packet->connectReady.address));
if (packet->type == TraversalPacketType::ConnectReady)
m_Client->OnConnectReady(MakeENetAddress(packet->connectReady.address));
else
m_Client->OnConnectFailed(packet->connectFailed.reason);
break;
Expand All @@ -197,10 +197,10 @@ void TraversalClient::HandleServerPacket(TraversalPacket* packet)
WARN_LOG_FMT(NETPLAY, "Received unknown packet with type {}", packet->type);
break;
}
if (packet->type != TraversalPacketAck)
if (packet->type != TraversalPacketType::Ack)
{
TraversalPacket ack = {};
ack.type = TraversalPacketAck;
ack.type = TraversalPacketType::Ack;
ack.requestId = packet->requestId;
ack.ack.ok = ok;

Expand All @@ -214,7 +214,7 @@ void TraversalClient::HandleServerPacket(TraversalPacket* packet)

void TraversalClient::OnFailure(FailureReason reason)
{
m_State = Failure;
m_State = State::Failure;
m_FailureReason = reason;

if (m_Client)
Expand Down Expand Up @@ -257,10 +257,10 @@ void TraversalClient::HandleResends()
void TraversalClient::HandlePing()
{
const u32 now = enet_time_get();
if (m_State == Connected && now - m_PingTime >= 500)
if (IsConnected() && now - m_PingTime >= 500)
{
TraversalPacket ping = {};
ping.type = TraversalPacketPing;
ping.type = TraversalPacketType::Ping;
ping.ping.hostId = m_HostId;
SendTraversalPacket(ping);
m_PingTime = now;
Expand Down
13 changes: 9 additions & 4 deletions Source/Core/Common/TraversalClient.h
Expand Up @@ -6,6 +6,7 @@
#include <list>
#include <memory>
#include <string>
#include <string_view>

#include <enet/enet.h>

Expand All @@ -19,17 +20,17 @@ class TraversalClientClient
virtual ~TraversalClientClient() = default;
virtual void OnTraversalStateChanged() = 0;
virtual void OnConnectReady(ENetAddress addr) = 0;
virtual void OnConnectFailed(u8 reason) = 0;
virtual void OnConnectFailed(TraversalConnectFailedReason reason) = 0;
};

class TraversalClient
{
public:
enum State
enum class State
{
Connecting,
Connected,
Failure
Failure,
};
enum class FailureReason
{
Expand All @@ -46,8 +47,12 @@ class TraversalClient
State GetState() const;
FailureReason GetFailureReason() const;

bool HasFailed() const { return m_State == State::Failure; }
bool IsConnecting() const { return m_State == State::Connecting; }
bool IsConnected() const { return m_State == State::Connected; }

void Reset();
void ConnectToClient(const std::string& host);
void ConnectToClient(std::string_view host);
void ReconnectToServer();
void Update();
void HandleResends();
Expand Down
43 changes: 21 additions & 22 deletions Source/Core/Common/TraversalProto.h
@@ -1,44 +1,43 @@
// This file is public domain, in case it's useful to anyone. -comex

#pragma once

#include <array>
#include <cstddef>
#include "Common/CommonTypes.h"

#define NETPLAY_CODE_SIZE 8
typedef std::array<char, NETPLAY_CODE_SIZE> TraversalHostId;
typedef u64 TraversalRequestId;
constexpr size_t NETPLAY_CODE_SIZE = 8;
using TraversalHostId = std::array<char, NETPLAY_CODE_SIZE>;
using TraversalRequestId = u64;

enum TraversalPacketType
enum class TraversalPacketType : u8
{
// [*->*]
TraversalPacketAck = 0,
Ack = 0,
// [c->s]
TraversalPacketPing = 1,
Ping = 1,
// [c->s]
TraversalPacketHelloFromClient = 2,
HelloFromClient = 2,
// [s->c]
TraversalPacketHelloFromServer = 3,
HelloFromServer = 3,
// [c->s] When connecting, first the client asks the central server...
TraversalPacketConnectPlease = 4,
ConnectPlease = 4,
// [s->c] ...who asks the game host to send a UDP packet to the
// client... (an ack implies success)
TraversalPacketPleaseSendPacket = 5,
PleaseSendPacket = 5,
// [s->c] ...which the central server relays back to the client.
TraversalPacketConnectReady = 6,
ConnectReady = 6,
// [s->c] Alternately, the server might not have heard of this host.
TraversalPacketConnectFailed = 7
ConnectFailed = 7,
};

enum
{
TraversalProtoVersion = 0
};
constexpr u8 TraversalProtoVersion = 0;

enum TraversalConnectFailedReason
enum class TraversalConnectFailedReason : u8
{
TraversalConnectFailedClientDidntRespond = 0,
TraversalConnectFailedClientFailure,
TraversalConnectFailedNoSuchClient
ClientDidntRespond = 0,
ClientFailure,
NoSuchClient,
};

#pragma pack(push, 1)
Expand All @@ -50,7 +49,7 @@ struct TraversalInetAddress
};
struct TraversalPacket
{
u8 type;
TraversalPacketType type;
TraversalRequestId requestId;
union
{
Expand Down Expand Up @@ -88,7 +87,7 @@ struct TraversalPacket
struct
{
TraversalRequestId requestId;
u8 reason;
TraversalConnectFailedReason reason;
} connectFailed;
};
};
Expand Down

0 comments on commit 4ba9bb2

Please sign in to comment.