lan_discovery.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <array>
  5. #include <cstring>
  6. #include <functional>
  7. #include <memory>
  8. #include <mutex>
  9. #include <optional>
  10. #include <random>
  11. #include <span>
  12. #include <thread>
  13. #include <unordered_map>
  14. #include "common/logging/log.h"
  15. #include "common/socket_types.h"
  16. #include "core/hle/result.h"
  17. #include "core/hle/service/ldn/ldn_results.h"
  18. #include "core/hle/service/ldn/ldn_types.h"
  19. #include "network/network.h"
  20. namespace Service::LDN {
  21. class LANDiscovery;
  22. class LanStation {
  23. public:
  24. LanStation(s8 node_id_, LANDiscovery* discovery_);
  25. ~LanStation();
  26. void OnClose();
  27. NodeStatus GetStatus() const;
  28. void Reset();
  29. void OverrideInfo();
  30. protected:
  31. friend class LANDiscovery;
  32. NodeInfo* node_info;
  33. NodeStatus status;
  34. s8 node_id;
  35. LANDiscovery* discovery;
  36. };
  37. class LANDiscovery {
  38. public:
  39. using LanEventFunc = std::function<void()>;
  40. LANDiscovery(Network::RoomNetwork& room_network_);
  41. ~LANDiscovery();
  42. State GetState() const;
  43. void SetState(State new_state);
  44. Result GetNetworkInfo(NetworkInfo& out_network) const;
  45. Result GetNetworkInfo(NetworkInfo& out_network, std::vector<NodeLatestUpdate>& out_updates,
  46. std::size_t buffer_count);
  47. DisconnectReason GetDisconnectReason() const;
  48. Result Scan(std::vector<NetworkInfo>& networks, u16& count, const ScanFilter& filter);
  49. Result SetAdvertiseData(std::span<const u8> data);
  50. Result OpenAccessPoint();
  51. Result CloseAccessPoint();
  52. Result OpenStation();
  53. Result CloseStation();
  54. Result CreateNetwork(const SecurityConfig& security_config, const UserConfig& user_config,
  55. const NetworkConfig& network_config);
  56. Result DestroyNetwork();
  57. Result Connect(const NetworkInfo& network_info_, const UserConfig& user_config,
  58. u16 local_communication_version);
  59. Result Disconnect();
  60. Result Initialize(LanEventFunc lan_event_ = empty_func, bool listening = true);
  61. Result Finalize();
  62. void ReceivePacket(const Network::LDNPacket& packet);
  63. protected:
  64. friend class LanStation;
  65. void InitNetworkInfo();
  66. void InitNodeStateChange();
  67. void ResetStations();
  68. void UpdateNodes();
  69. void OnSyncNetwork(const NetworkInfo& info);
  70. void OnDisconnectFromHost();
  71. void OnNetworkInfoChanged();
  72. bool IsNodeStateChanged();
  73. bool IsFlagSet(ScanFilterFlag flag, ScanFilterFlag search_flag) const;
  74. int GetStationCount() const;
  75. MacAddress GetFakeMac() const;
  76. Result GetNodeInfo(NodeInfo& node, const UserConfig& user_config,
  77. u16 local_communication_version);
  78. Network::IPv4Address GetLocalIp() const;
  79. template <typename Data>
  80. void SendPacket(Network::LDNPacketType type, const Data& data, Ipv4Address remote_ip);
  81. void SendPacket(Network::LDNPacketType type, Ipv4Address remote_ip);
  82. template <typename Data>
  83. void SendBroadcast(Network::LDNPacketType type, const Data& data);
  84. void SendBroadcast(Network::LDNPacketType type);
  85. void SendPacket(const Network::LDNPacket& packet);
  86. static const LanEventFunc empty_func;
  87. static constexpr Ssid fake_ssid{"YuzuFakeSsidForLdn"};
  88. bool inited{};
  89. std::mutex packet_mutex;
  90. std::array<LanStation, StationCountMax> stations;
  91. std::array<NodeLatestUpdate, NodeCountMax> node_changes{};
  92. std::array<u8, NodeCountMax> node_last_states{};
  93. std::unordered_map<MacAddress, NetworkInfo, MACAddressHash> scan_results{};
  94. NodeInfo node_info{};
  95. NetworkInfo network_info{};
  96. State state{State::None};
  97. DisconnectReason disconnect_reason{DisconnectReason::None};
  98. // TODO (flTobi): Should this be an std::set?
  99. std::vector<Ipv4Address> connected_clients;
  100. std::optional<Ipv4Address> host_ip;
  101. LanEventFunc lan_event;
  102. Network::RoomNetwork& room_network;
  103. };
  104. } // namespace Service::LDN