sockets_translate.cpp 4.9 KB

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