sockets_translate.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. // Copyright 2020 yuzu emulator team
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include <utility>
  5. #include "common/assert.h"
  6. #include "common/common_types.h"
  7. #include "core/hle/service/sockets/sockets.h"
  8. #include "core/hle/service/sockets/sockets_translate.h"
  9. #include "core/network/network.h"
  10. namespace Service::Sockets {
  11. Errno Translate(Network::Errno value) {
  12. switch (value) {
  13. case Network::Errno::SUCCESS:
  14. return Errno::SUCCESS;
  15. case Network::Errno::BADF:
  16. return Errno::BADF;
  17. case Network::Errno::AGAIN:
  18. return Errno::AGAIN;
  19. case Network::Errno::INVAL:
  20. return Errno::INVAL;
  21. case Network::Errno::MFILE:
  22. return Errno::MFILE;
  23. case Network::Errno::NOTCONN:
  24. return Errno::NOTCONN;
  25. default:
  26. UNIMPLEMENTED_MSG("Unimplemented errno={}", static_cast<int>(value));
  27. return Errno::SUCCESS;
  28. }
  29. }
  30. std::pair<s32, Errno> Translate(std::pair<s32, Network::Errno> value) {
  31. return {value.first, Translate(value.second)};
  32. }
  33. Network::Domain Translate(Domain domain) {
  34. switch (domain) {
  35. case Domain::INET:
  36. return Network::Domain::INET;
  37. default:
  38. UNIMPLEMENTED_MSG("Unimplemented domain={}", static_cast<int>(domain));
  39. return {};
  40. }
  41. }
  42. Domain Translate(Network::Domain domain) {
  43. switch (domain) {
  44. case Network::Domain::INET:
  45. return Domain::INET;
  46. default:
  47. UNIMPLEMENTED_MSG("Unimplemented domain={}", static_cast<int>(domain));
  48. return {};
  49. }
  50. }
  51. Network::Type Translate(Type type) {
  52. switch (type) {
  53. case Type::STREAM:
  54. return Network::Type::STREAM;
  55. case Type::DGRAM:
  56. return Network::Type::DGRAM;
  57. default:
  58. UNIMPLEMENTED_MSG("Unimplemented type={}", static_cast<int>(type));
  59. }
  60. }
  61. Network::Protocol Translate(Type type, Protocol protocol) {
  62. switch (protocol) {
  63. case Protocol::UNSPECIFIED:
  64. LOG_WARNING(Service, "Unspecified protocol, assuming protocol from type");
  65. switch (type) {
  66. case Type::DGRAM:
  67. return Network::Protocol::UDP;
  68. case Type::STREAM:
  69. return Network::Protocol::TCP;
  70. default:
  71. return Network::Protocol::TCP;
  72. }
  73. case Protocol::TCP:
  74. return Network::Protocol::TCP;
  75. case Protocol::UDP:
  76. return Network::Protocol::UDP;
  77. default:
  78. UNIMPLEMENTED_MSG("Unimplemented protocol={}", static_cast<int>(protocol));
  79. return Network::Protocol::TCP;
  80. }
  81. }
  82. u16 TranslatePollEventsToHost(u32 flags) {
  83. u32 result = 0;
  84. const auto translate = [&result, &flags](u32 from, u32 to) {
  85. if ((flags & from) != 0) {
  86. flags &= ~from;
  87. result |= to;
  88. }
  89. };
  90. translate(POLL_IN, Network::POLL_IN);
  91. translate(POLL_PRI, Network::POLL_PRI);
  92. translate(POLL_OUT, Network::POLL_OUT);
  93. translate(POLL_ERR, Network::POLL_ERR);
  94. translate(POLL_HUP, Network::POLL_HUP);
  95. translate(POLL_NVAL, Network::POLL_NVAL);
  96. UNIMPLEMENTED_IF_MSG(flags != 0, "Unimplemented flags={}", flags);
  97. return static_cast<u16>(result);
  98. }
  99. u16 TranslatePollEventsToGuest(u32 flags) {
  100. u32 result = 0;
  101. const auto translate = [&result, &flags](u32 from, u32 to) {
  102. if ((flags & from) != 0) {
  103. flags &= ~from;
  104. result |= to;
  105. }
  106. };
  107. translate(Network::POLL_IN, POLL_IN);
  108. translate(Network::POLL_PRI, POLL_PRI);
  109. translate(Network::POLL_OUT, POLL_OUT);
  110. translate(Network::POLL_ERR, POLL_ERR);
  111. translate(Network::POLL_HUP, POLL_HUP);
  112. translate(Network::POLL_NVAL, POLL_NVAL);
  113. UNIMPLEMENTED_IF_MSG(flags != 0, "Unimplemented flags={}", flags);
  114. return static_cast<u16>(result);
  115. }
  116. Network::SockAddrIn Translate(SockAddrIn value) {
  117. ASSERT(value.len == 0 || value.len == sizeof(value));
  118. return {
  119. .family = Translate(static_cast<Domain>(value.family)),
  120. .ip = value.ip,
  121. .portno = static_cast<u16>(value.portno >> 8 | value.portno << 8),
  122. };
  123. }
  124. SockAddrIn Translate(Network::SockAddrIn value) {
  125. return {
  126. .len = sizeof(SockAddrIn),
  127. .family = static_cast<u8>(Translate(value.family)),
  128. .portno = static_cast<u16>(value.portno >> 8 | value.portno << 8),
  129. .ip = value.ip,
  130. .zeroes = {},
  131. };
  132. }
  133. Network::ShutdownHow Translate(ShutdownHow how) {
  134. switch (how) {
  135. case ShutdownHow::RD:
  136. return Network::ShutdownHow::RD;
  137. case ShutdownHow::WR:
  138. return Network::ShutdownHow::WR;
  139. case ShutdownHow::RDWR:
  140. return Network::ShutdownHow::RDWR;
  141. default:
  142. UNIMPLEMENTED_MSG("Unimplemented how={}", static_cast<int>(how));
  143. return {};
  144. }
  145. }
  146. } // namespace Service::Sockets