network.h 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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 "common/common_funcs.h"
  7. #include "common/common_types.h"
  8. #ifdef _WIN32
  9. #include <winsock2.h>
  10. #elif YUZU_UNIX
  11. #include <netinet/in.h>
  12. #endif
  13. namespace Network {
  14. class Socket;
  15. /// Error code for network functions
  16. enum class Errno {
  17. SUCCESS,
  18. BADF,
  19. INVAL,
  20. MFILE,
  21. NOTCONN,
  22. AGAIN,
  23. CONNREFUSED,
  24. HOSTUNREACH,
  25. NETDOWN,
  26. NETUNREACH,
  27. OTHER,
  28. };
  29. /// Address families
  30. enum class Domain {
  31. INET, ///< Address family for IPv4
  32. };
  33. /// Socket types
  34. enum class Type {
  35. STREAM,
  36. DGRAM,
  37. RAW,
  38. SEQPACKET,
  39. };
  40. /// Protocol values for sockets
  41. enum class Protocol {
  42. ICMP,
  43. TCP,
  44. UDP,
  45. };
  46. /// Shutdown mode
  47. enum class ShutdownHow {
  48. RD,
  49. WR,
  50. RDWR,
  51. };
  52. /// Array of IPv4 address
  53. using IPv4Address = std::array<u8, 4>;
  54. /// Cross-platform sockaddr structure
  55. struct SockAddrIn {
  56. Domain family;
  57. IPv4Address ip;
  58. u16 portno;
  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. };
  70. DECLARE_ENUM_FLAG_OPERATORS(PollEvents);
  71. struct PollFD {
  72. Socket* socket;
  73. PollEvents events;
  74. PollEvents revents;
  75. };
  76. class NetworkInstance {
  77. public:
  78. explicit NetworkInstance();
  79. ~NetworkInstance();
  80. };
  81. #ifdef _WIN32
  82. constexpr IPv4Address TranslateIPv4(in_addr addr) {
  83. auto& bytes = addr.S_un.S_un_b;
  84. return IPv4Address{bytes.s_b1, bytes.s_b2, bytes.s_b3, bytes.s_b4};
  85. }
  86. #elif YUZU_UNIX
  87. constexpr IPv4Address TranslateIPv4(in_addr addr) {
  88. const u32 bytes = addr.s_addr;
  89. return IPv4Address{static_cast<u8>(bytes), static_cast<u8>(bytes >> 8),
  90. static_cast<u8>(bytes >> 16), static_cast<u8>(bytes >> 24)};
  91. }
  92. #endif
  93. /// @brief Returns host's IPv4 address
  94. /// @return human ordered IPv4 address (e.g. 192.168.0.1) as an array
  95. std::optional<IPv4Address> GetHostIPv4Address();
  96. } // namespace Network