lan_discovery.h 3.9 KB

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