File: TraversalProto.h

package info (click to toggle)
dolphin-emu 2503%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 111,624 kB
  • sloc: cpp: 787,747; ansic: 217,914; xml: 31,400; python: 4,226; yacc: 3,985; javascript: 2,430; makefile: 777; asm: 726; sh: 281; pascal: 257; perl: 97; objc: 75
file content (105 lines) | stat: -rw-r--r-- 2,136 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// SPDX-License-Identifier: CC0-1.0

#pragma once

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

namespace Common
{
constexpr size_t NETPLAY_CODE_SIZE = 8;
using TraversalHostId = std::array<char, NETPLAY_CODE_SIZE>;
using TraversalRequestId = u64;

enum class TraversalPacketType : u8
{
  // [*->*]
  Ack = 0,
  // [c->s]
  Ping = 1,
  // [c->s]
  HelloFromClient = 2,
  // [s->c]
  HelloFromServer = 3,
  // [c->s] When connecting, first the client asks the central server...
  ConnectPlease = 4,
  // [s->c] ...who asks the game host to send a UDP packet to the
  // client... (an ack implies success)
  PleaseSendPacket = 5,
  // [s->c] ...which the central server relays back to the client.
  ConnectReady = 6,
  // [s->c] Alternately, the server might not have heard of this host.
  ConnectFailed = 7,
  // [c->s] Perform a traveral test. This will send two acks:
  // one via the server's alt port, and one to the address corresponding to
  // the given host ID.
  TestPlease = 8,
};

constexpr u8 TraversalProtoVersion = 0;

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

#pragma pack(push, 1)
struct TraversalInetAddress
{
  u8 isIPV6;
  u32 address[4];
  u16 port;
};
struct TraversalPacket
{
  TraversalPacketType type;
  TraversalRequestId requestId;
  union
  {
    struct
    {
      u8 ok;
    } ack;
    struct
    {
      TraversalHostId hostId;
    } ping;
    struct
    {
      u8 protoVersion;
    } helloFromClient;
    struct
    {
      u8 ok;
      TraversalHostId yourHostId;
      TraversalInetAddress yourAddress;
    } helloFromServer;
    struct
    {
      TraversalHostId hostId;
    } connectPlease;
    struct
    {
      TraversalInetAddress address;
    } pleaseSendPacket;
    struct
    {
      TraversalRequestId requestId;
      TraversalInetAddress address;
    } connectReady;
    struct
    {
      TraversalRequestId requestId;
      TraversalConnectFailedReason reason;
    } connectFailed;
    struct
    {
      TraversalHostId hostId;
    } testPlease;
  };
};
#pragma pack(pop)
}  // namespace Common