network.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <array>
  5. #include <optional>
  6. #include <vector>
  7. #include "common/common_funcs.h"
  8. #include "common/common_types.h"
  9. #include "common/socket_types.h"
  10. #ifdef _WIN32
  11. #include <winsock2.h>
  12. #elif YUZU_UNIX
  13. #include <netinet/in.h>
  14. #endif
  15. namespace Common {
  16. template <typename T, typename E>
  17. class Expected;
  18. }
  19. namespace Network {
  20. class SocketBase;
  21. class Socket;
  22. /// Error code for network functions
  23. enum class Errno {
  24. SUCCESS,
  25. BADF,
  26. INVAL,
  27. MFILE,
  28. PIPE,
  29. NOTCONN,
  30. AGAIN,
  31. CONNREFUSED,
  32. CONNRESET,
  33. CONNABORTED,
  34. HOSTUNREACH,
  35. NETDOWN,
  36. NETUNREACH,
  37. TIMEDOUT,
  38. MSGSIZE,
  39. INPROGRESS,
  40. OTHER,
  41. };
  42. enum class GetAddrInfoError {
  43. SUCCESS,
  44. ADDRFAMILY,
  45. AGAIN,
  46. BADFLAGS,
  47. FAIL,
  48. FAMILY,
  49. MEMORY,
  50. NODATA,
  51. NONAME,
  52. SERVICE,
  53. SOCKTYPE,
  54. SYSTEM,
  55. BADHINTS,
  56. PROTOCOL,
  57. OVERFLOW_,
  58. OTHER,
  59. };
  60. /// Cross-platform poll fd structure
  61. enum class PollEvents : u16 {
  62. // Using Pascal case because IN is a macro on Windows.
  63. In = 1 << 0,
  64. Pri = 1 << 1,
  65. Out = 1 << 2,
  66. Err = 1 << 3,
  67. Hup = 1 << 4,
  68. Nval = 1 << 5,
  69. RdNorm = 1 << 6,
  70. RdBand = 1 << 7,
  71. WrBand = 1 << 8,
  72. };
  73. DECLARE_ENUM_FLAG_OPERATORS(PollEvents);
  74. struct PollFD {
  75. SocketBase* socket;
  76. PollEvents events;
  77. PollEvents revents;
  78. };
  79. class NetworkInstance {
  80. public:
  81. explicit NetworkInstance();
  82. ~NetworkInstance();
  83. };
  84. void CancelPendingSocketOperations();
  85. void RestartSocketOperations();
  86. #ifdef _WIN32
  87. constexpr IPv4Address TranslateIPv4(in_addr addr) {
  88. auto& bytes = addr.S_un.S_un_b;
  89. return IPv4Address{bytes.s_b1, bytes.s_b2, bytes.s_b3, bytes.s_b4};
  90. }
  91. #elif YUZU_UNIX
  92. constexpr IPv4Address TranslateIPv4(in_addr addr) {
  93. const u32 bytes = addr.s_addr;
  94. return IPv4Address{static_cast<u8>(bytes), static_cast<u8>(bytes >> 8),
  95. static_cast<u8>(bytes >> 16), static_cast<u8>(bytes >> 24)};
  96. }
  97. #endif
  98. /// @brief Returns host's IPv4 address
  99. /// @return human ordered IPv4 address (e.g. 192.168.0.1) as an array
  100. std::optional<IPv4Address> GetHostIPv4Address();
  101. std::string IPv4AddressToString(IPv4Address ip_addr);
  102. u32 IPv4AddressToInteger(IPv4Address ip_addr);
  103. // named to avoid name collision with Windows macro
  104. Common::Expected<std::vector<AddrInfo>, GetAddrInfoError> GetAddressInfo(
  105. const std::string& host, const std::optional<std::string>& service);
  106. } // namespace Network