sockets_translate.cpp 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  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. case Network::Errno::CONNRESET:
  27. return Errno::CONNRESET;
  28. case Network::Errno::INPROGRESS:
  29. return Errno::INPROGRESS;
  30. default:
  31. UNIMPLEMENTED_MSG("Unimplemented errno={}", value);
  32. return Errno::SUCCESS;
  33. }
  34. }
  35. std::pair<s32, Errno> Translate(std::pair<s32, Network::Errno> value) {
  36. return {value.first, Translate(value.second)};
  37. }
  38. GetAddrInfoError Translate(Network::GetAddrInfoError error) {
  39. switch (error) {
  40. case Network::GetAddrInfoError::SUCCESS:
  41. return GetAddrInfoError::SUCCESS;
  42. case Network::GetAddrInfoError::ADDRFAMILY:
  43. return GetAddrInfoError::ADDRFAMILY;
  44. case Network::GetAddrInfoError::AGAIN:
  45. return GetAddrInfoError::AGAIN;
  46. case Network::GetAddrInfoError::BADFLAGS:
  47. return GetAddrInfoError::BADFLAGS;
  48. case Network::GetAddrInfoError::FAIL:
  49. return GetAddrInfoError::FAIL;
  50. case Network::GetAddrInfoError::FAMILY:
  51. return GetAddrInfoError::FAMILY;
  52. case Network::GetAddrInfoError::MEMORY:
  53. return GetAddrInfoError::MEMORY;
  54. case Network::GetAddrInfoError::NODATA:
  55. return GetAddrInfoError::NODATA;
  56. case Network::GetAddrInfoError::NONAME:
  57. return GetAddrInfoError::NONAME;
  58. case Network::GetAddrInfoError::SERVICE:
  59. return GetAddrInfoError::SERVICE;
  60. case Network::GetAddrInfoError::SOCKTYPE:
  61. return GetAddrInfoError::SOCKTYPE;
  62. case Network::GetAddrInfoError::SYSTEM:
  63. return GetAddrInfoError::SYSTEM;
  64. case Network::GetAddrInfoError::BADHINTS:
  65. return GetAddrInfoError::BADHINTS;
  66. case Network::GetAddrInfoError::PROTOCOL:
  67. return GetAddrInfoError::PROTOCOL;
  68. case Network::GetAddrInfoError::OVERFLOW_:
  69. return GetAddrInfoError::OVERFLOW_;
  70. case Network::GetAddrInfoError::OTHER:
  71. return GetAddrInfoError::OTHER;
  72. default:
  73. UNIMPLEMENTED_MSG("Unimplemented GetAddrInfoError={}", error);
  74. return GetAddrInfoError::OTHER;
  75. }
  76. }
  77. Network::Domain Translate(Domain domain) {
  78. switch (domain) {
  79. case Domain::Unspecified:
  80. return Network::Domain::Unspecified;
  81. case Domain::INET:
  82. return Network::Domain::INET;
  83. default:
  84. UNIMPLEMENTED_MSG("Unimplemented domain={}", domain);
  85. return {};
  86. }
  87. }
  88. Domain Translate(Network::Domain domain) {
  89. switch (domain) {
  90. case Network::Domain::Unspecified:
  91. return Domain::Unspecified;
  92. case Network::Domain::INET:
  93. return Domain::INET;
  94. default:
  95. UNIMPLEMENTED_MSG("Unimplemented domain={}", domain);
  96. return {};
  97. }
  98. }
  99. Network::Type Translate(Type type) {
  100. switch (type) {
  101. case Type::Unspecified:
  102. return Network::Type::Unspecified;
  103. case Type::STREAM:
  104. return Network::Type::STREAM;
  105. case Type::DGRAM:
  106. return Network::Type::DGRAM;
  107. case Type::RAW:
  108. return Network::Type::RAW;
  109. case Type::SEQPACKET:
  110. return Network::Type::SEQPACKET;
  111. default:
  112. UNIMPLEMENTED_MSG("Unimplemented type={}", type);
  113. return Network::Type{};
  114. }
  115. }
  116. Type Translate(Network::Type type) {
  117. switch (type) {
  118. case Network::Type::Unspecified:
  119. return Type::Unspecified;
  120. case Network::Type::STREAM:
  121. return Type::STREAM;
  122. case Network::Type::DGRAM:
  123. return Type::DGRAM;
  124. case Network::Type::RAW:
  125. return Type::RAW;
  126. case Network::Type::SEQPACKET:
  127. return Type::SEQPACKET;
  128. default:
  129. UNIMPLEMENTED_MSG("Unimplemented type={}", type);
  130. return Type{};
  131. }
  132. }
  133. Network::Protocol Translate(Protocol protocol) {
  134. switch (protocol) {
  135. case Protocol::Unspecified:
  136. return Network::Protocol::Unspecified;
  137. case Protocol::TCP:
  138. return Network::Protocol::TCP;
  139. case Protocol::UDP:
  140. return Network::Protocol::UDP;
  141. default:
  142. UNIMPLEMENTED_MSG("Unimplemented protocol={}", protocol);
  143. return Network::Protocol::Unspecified;
  144. }
  145. }
  146. Protocol Translate(Network::Protocol protocol) {
  147. switch (protocol) {
  148. case Network::Protocol::Unspecified:
  149. return Protocol::Unspecified;
  150. case Network::Protocol::TCP:
  151. return Protocol::TCP;
  152. case Network::Protocol::UDP:
  153. return Protocol::UDP;
  154. default:
  155. UNIMPLEMENTED_MSG("Unimplemented protocol={}", protocol);
  156. return Protocol::Unspecified;
  157. }
  158. }
  159. Network::PollEvents Translate(PollEvents flags) {
  160. Network::PollEvents result{};
  161. const auto translate = [&result, &flags](PollEvents from, Network::PollEvents to) {
  162. if (True(flags & from)) {
  163. flags &= ~from;
  164. result |= to;
  165. }
  166. };
  167. translate(PollEvents::In, Network::PollEvents::In);
  168. translate(PollEvents::Pri, Network::PollEvents::Pri);
  169. translate(PollEvents::Out, Network::PollEvents::Out);
  170. translate(PollEvents::Err, Network::PollEvents::Err);
  171. translate(PollEvents::Hup, Network::PollEvents::Hup);
  172. translate(PollEvents::Nval, Network::PollEvents::Nval);
  173. translate(PollEvents::RdNorm, Network::PollEvents::RdNorm);
  174. translate(PollEvents::RdBand, Network::PollEvents::RdBand);
  175. translate(PollEvents::WrBand, Network::PollEvents::WrBand);
  176. UNIMPLEMENTED_IF_MSG((u16)flags != 0, "Unimplemented flags={}", (u16)flags);
  177. return result;
  178. }
  179. PollEvents Translate(Network::PollEvents flags) {
  180. PollEvents result{};
  181. const auto translate = [&result, &flags](Network::PollEvents from, PollEvents to) {
  182. if (True(flags & from)) {
  183. flags &= ~from;
  184. result |= to;
  185. }
  186. };
  187. translate(Network::PollEvents::In, PollEvents::In);
  188. translate(Network::PollEvents::Pri, PollEvents::Pri);
  189. translate(Network::PollEvents::Out, PollEvents::Out);
  190. translate(Network::PollEvents::Err, PollEvents::Err);
  191. translate(Network::PollEvents::Hup, PollEvents::Hup);
  192. translate(Network::PollEvents::Nval, PollEvents::Nval);
  193. translate(Network::PollEvents::RdNorm, PollEvents::RdNorm);
  194. translate(Network::PollEvents::RdBand, PollEvents::RdBand);
  195. translate(Network::PollEvents::WrBand, PollEvents::WrBand);
  196. UNIMPLEMENTED_IF_MSG((u16)flags != 0, "Unimplemented flags={}", (u16)flags);
  197. return result;
  198. }
  199. Network::SockAddrIn Translate(SockAddrIn value) {
  200. // Note: 6 is incorrect, but can be passed by homebrew (because libnx sets
  201. // sin_len to 6 when deserializing getaddrinfo results).
  202. ASSERT(value.len == 0 || value.len == sizeof(value) || value.len == 6);
  203. return {
  204. .family = Translate(static_cast<Domain>(value.family)),
  205. .ip = value.ip,
  206. .portno = static_cast<u16>(value.portno >> 8 | value.portno << 8),
  207. };
  208. }
  209. SockAddrIn Translate(Network::SockAddrIn value) {
  210. return {
  211. .len = sizeof(SockAddrIn),
  212. .family = static_cast<u8>(Translate(value.family)),
  213. .portno = static_cast<u16>(value.portno >> 8 | value.portno << 8),
  214. .ip = value.ip,
  215. .zeroes = {},
  216. };
  217. }
  218. Network::ShutdownHow Translate(ShutdownHow how) {
  219. switch (how) {
  220. case ShutdownHow::RD:
  221. return Network::ShutdownHow::RD;
  222. case ShutdownHow::WR:
  223. return Network::ShutdownHow::WR;
  224. case ShutdownHow::RDWR:
  225. return Network::ShutdownHow::RDWR;
  226. default:
  227. UNIMPLEMENTED_MSG("Unimplemented how={}", how);
  228. return {};
  229. }
  230. }
  231. } // namespace Service::Sockets