NetPlayServer.h 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. // Copyright 2013 Dolphin Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <SFML/Network/Packet.hpp>
  5. #include <map>
  6. #include <memory>
  7. #include <mutex>
  8. #include <optional>
  9. #include <queue>
  10. #include <sstream>
  11. #include <thread>
  12. #include <unordered_map>
  13. #include <unordered_set>
  14. #include <utility>
  15. #include "Common/Event.h"
  16. #include "Common/QoSSession.h"
  17. #include "Common/SPSCQueue.h"
  18. #include "Common/Timer.h"
  19. #include "Common/TraversalClient.h"
  20. #include "Core/NetPlayProto.h"
  21. #include "Core/SyncIdentifier.h"
  22. #include "InputCommon/GCPadStatus.h"
  23. #include "UICommon/NetPlayIndex.h"
  24. namespace NetPlay
  25. {
  26. class NetPlayUI;
  27. struct SaveSyncInfo;
  28. class NetPlayServer : public Common::TraversalClientClient
  29. {
  30. public:
  31. void ThreadFunc();
  32. void SendAsync(sf::Packet&& packet, PlayerId pid, u8 channel_id = DEFAULT_CHANNEL);
  33. void SendAsyncToClients(sf::Packet&& packet, PlayerId skip_pid = 0,
  34. u8 channel_id = DEFAULT_CHANNEL);
  35. void SendChunked(sf::Packet&& packet, PlayerId pid, const std::string& title = "");
  36. void SendChunkedToClients(sf::Packet&& packet, PlayerId skip_pid = 0,
  37. const std::string& title = "");
  38. NetPlayServer(u16 port, bool forward_port, NetPlayUI* dialog,
  39. const NetTraversalConfig& traversal_config);
  40. ~NetPlayServer();
  41. bool ChangeGame(const SyncIdentifier& sync_identifier, const std::string& netplay_name);
  42. bool ComputeGameDigest(const SyncIdentifier& sync_identifier);
  43. bool AbortGameDigest();
  44. void SendChatMessage(const std::string& msg);
  45. bool DoAllPlayersHaveIPLDump() const;
  46. bool DoAllPlayersHaveHardwareFMA() const;
  47. bool StartGame();
  48. bool RequestStartGame();
  49. void AbortGameStart();
  50. PadMappingArray GetPadMapping() const;
  51. void SetPadMapping(const PadMappingArray& mappings);
  52. GBAConfigArray GetGBAConfig() const;
  53. void SetGBAConfig(const GBAConfigArray& configs, bool update_rom);
  54. PadMappingArray GetWiimoteMapping() const;
  55. void SetWiimoteMapping(const PadMappingArray& mappings);
  56. void AdjustPadBufferSize(unsigned int size);
  57. void SetHostInputAuthority(bool enable);
  58. void KickPlayer(PlayerId player);
  59. u16 GetPort() const;
  60. std::unordered_set<std::string> GetInterfaceSet() const;
  61. std::string GetInterfaceHost(const std::string& inter) const;
  62. bool is_connected = false;
  63. private:
  64. class Client
  65. {
  66. public:
  67. PlayerId pid{};
  68. std::string name;
  69. std::string revision;
  70. SyncIdentifierComparison game_status = SyncIdentifierComparison::Unknown;
  71. bool has_ipl_dump = false;
  72. bool has_hardware_fma = false;
  73. ENetPeer* socket = nullptr;
  74. u32 ping = 0;
  75. u32 current_game = 0;
  76. Common::QoSSession qos_session;
  77. bool operator==(const Client& other) const { return this == &other; }
  78. bool IsHost() const { return pid == 1; }
  79. };
  80. enum class TargetMode
  81. {
  82. Only,
  83. AllExcept
  84. };
  85. struct AsyncQueueEntry
  86. {
  87. sf::Packet packet;
  88. PlayerId target_pid{};
  89. TargetMode target_mode{};
  90. u8 channel_id = 0;
  91. };
  92. struct ChunkedDataQueueEntry
  93. {
  94. sf::Packet packet;
  95. PlayerId target_pid{};
  96. TargetMode target_mode{};
  97. std::string title;
  98. };
  99. bool SetupNetSettings();
  100. std::optional<SaveSyncInfo> CollectSaveSyncInfo();
  101. bool SyncSaveData(const SaveSyncInfo& sync_info);
  102. bool SyncCodes();
  103. void CheckSyncAndStartGame();
  104. u64 GetInitialNetPlayRTC() const;
  105. template <typename... Data>
  106. void SendResponseToPlayer(const Client& player, const MessageID message_id,
  107. Data&&... data_to_send);
  108. template <typename... Data>
  109. void SendResponseToAllPlayers(const MessageID message_id, Data&&... data_to_send);
  110. void SendToClients(const sf::Packet& packet, PlayerId skip_pid = 0,
  111. u8 channel_id = DEFAULT_CHANNEL);
  112. void Send(ENetPeer* socket, const sf::Packet& packet, u8 channel_id = DEFAULT_CHANNEL);
  113. ConnectionError OnConnect(ENetPeer* socket, sf::Packet& received_packet);
  114. unsigned int OnDisconnect(const Client& player);
  115. unsigned int OnData(sf::Packet& packet, Client& player);
  116. void OnTraversalStateChanged() override;
  117. void OnConnectReady(ENetAddress) override {}
  118. void OnConnectFailed(Common::TraversalConnectFailedReason) override {}
  119. void OnTtlDetermined(u8 ttl) override;
  120. void UpdatePadMapping();
  121. void UpdateGBAConfig();
  122. void UpdateWiimoteMapping();
  123. std::vector<std::pair<std::string, std::string>> GetInterfaceListInternal() const;
  124. void ChunkedDataThreadFunc();
  125. void ChunkedDataSend(sf::Packet&& packet, PlayerId pid, const TargetMode target_mode);
  126. void ChunkedDataAbort();
  127. void SetupIndex();
  128. bool PlayerHasControllerMapped(PlayerId pid) const;
  129. // pulled from OnConnect()
  130. void AssignNewUserAPad(const Client& player);
  131. // pulled from OnConnect()
  132. // returns the PID given
  133. PlayerId GiveFirstAvailableIDTo(ENetPeer* player);
  134. NetSettings m_settings;
  135. bool m_is_running = false;
  136. bool m_do_loop = false;
  137. Common::Timer m_ping_timer;
  138. u32 m_ping_key = 0;
  139. bool m_update_pings = false;
  140. u32 m_current_game = 0;
  141. unsigned int m_target_buffer_size = 0;
  142. PadMappingArray m_pad_map;
  143. GBAConfigArray m_gba_config;
  144. PadMappingArray m_wiimote_map;
  145. unsigned int m_save_data_synced_players = 0;
  146. unsigned int m_codes_synced_players = 0;
  147. bool m_saves_synced = true;
  148. bool m_codes_synced = true;
  149. bool m_start_pending = false;
  150. bool m_host_input_authority = false;
  151. PlayerId m_current_golfer = 1;
  152. PlayerId m_pending_golfer = 0;
  153. std::map<PlayerId, Client> m_players;
  154. std::unordered_map<u32, std::vector<std::pair<PlayerId, u64>>> m_timebase_by_frame;
  155. bool m_desync_detected = false;
  156. struct
  157. {
  158. std::recursive_mutex game;
  159. // lock order
  160. std::recursive_mutex players;
  161. std::recursive_mutex async_queue_write;
  162. std::recursive_mutex chunked_data_queue_write;
  163. } m_crit;
  164. Common::SPSCQueue<AsyncQueueEntry, false> m_async_queue;
  165. Common::SPSCQueue<ChunkedDataQueueEntry, false> m_chunked_data_queue;
  166. SyncIdentifier m_selected_game_identifier;
  167. std::string m_selected_game_name;
  168. std::thread m_thread;
  169. Common::Event m_chunked_data_event;
  170. Common::Event m_chunked_data_complete_event;
  171. std::thread m_chunked_data_thread;
  172. u32 m_next_chunked_data_id = 0;
  173. std::unordered_map<u32, unsigned int> m_chunked_data_complete_count;
  174. bool m_abort_chunked_data = false;
  175. ENetHost* m_server = nullptr;
  176. Common::TraversalClient* m_traversal_client = nullptr;
  177. NetPlayUI* m_dialog = nullptr;
  178. NetPlayIndex m_index;
  179. };
  180. } // namespace NetPlay