network.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644
  1. // Copyright 2020 yuzu emulator team
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include <algorithm>
  5. #include <cstring>
  6. #include <limits>
  7. #include <utility>
  8. #include <vector>
  9. #include "common/common_funcs.h"
  10. #ifdef _WIN32
  11. #include <winsock2.h>
  12. #include <ws2tcpip.h>
  13. #elif YUZU_UNIX
  14. #include <arpa/inet.h>
  15. #include <errno.h>
  16. #include <fcntl.h>
  17. #include <netdb.h>
  18. #include <netinet/in.h>
  19. #include <poll.h>
  20. #include <sys/socket.h>
  21. #include <unistd.h>
  22. #else
  23. #error "Unimplemented platform"
  24. #endif
  25. #include "common/assert.h"
  26. #include "common/common_types.h"
  27. #include "common/logging/log.h"
  28. #include "common/settings.h"
  29. #include "core/network/network.h"
  30. #include "core/network/network_interface.h"
  31. #include "core/network/sockets.h"
  32. namespace Network {
  33. namespace {
  34. #ifdef _WIN32
  35. using socklen_t = int;
  36. void Initialize() {
  37. WSADATA wsa_data;
  38. (void)WSAStartup(MAKEWORD(2, 2), &wsa_data);
  39. }
  40. void Finalize() {
  41. WSACleanup();
  42. }
  43. constexpr IPv4Address TranslateIPv4(in_addr addr) {
  44. auto& bytes = addr.S_un.S_un_b;
  45. return IPv4Address{bytes.s_b1, bytes.s_b2, bytes.s_b3, bytes.s_b4};
  46. }
  47. sockaddr TranslateFromSockAddrIn(SockAddrIn input) {
  48. sockaddr_in result;
  49. #if YUZU_UNIX
  50. result.sin_len = sizeof(result);
  51. #endif
  52. switch (static_cast<Domain>(input.family)) {
  53. case Domain::INET:
  54. result.sin_family = AF_INET;
  55. break;
  56. default:
  57. UNIMPLEMENTED_MSG("Unhandled sockaddr family={}", input.family);
  58. result.sin_family = AF_INET;
  59. break;
  60. }
  61. result.sin_port = htons(input.portno);
  62. auto& ip = result.sin_addr.S_un.S_un_b;
  63. ip.s_b1 = input.ip[0];
  64. ip.s_b2 = input.ip[1];
  65. ip.s_b3 = input.ip[2];
  66. ip.s_b4 = input.ip[3];
  67. sockaddr addr;
  68. std::memcpy(&addr, &result, sizeof(addr));
  69. return addr;
  70. }
  71. LINGER MakeLinger(bool enable, u32 linger_value) {
  72. ASSERT(linger_value <= std::numeric_limits<u_short>::max());
  73. LINGER value;
  74. value.l_onoff = enable ? 1 : 0;
  75. value.l_linger = static_cast<u_short>(linger_value);
  76. return value;
  77. }
  78. bool EnableNonBlock(SOCKET fd, bool enable) {
  79. u_long value = enable ? 1 : 0;
  80. return ioctlsocket(fd, FIONBIO, &value) != SOCKET_ERROR;
  81. }
  82. Errno TranslateNativeError(int e) {
  83. switch (e) {
  84. case WSAEBADF:
  85. return Errno::BADF;
  86. case WSAEINVAL:
  87. return Errno::INVAL;
  88. case WSAEMFILE:
  89. return Errno::MFILE;
  90. case WSAENOTCONN:
  91. return Errno::NOTCONN;
  92. case WSAEWOULDBLOCK:
  93. return Errno::AGAIN;
  94. case WSAECONNREFUSED:
  95. return Errno::CONNREFUSED;
  96. case WSAEHOSTUNREACH:
  97. return Errno::HOSTUNREACH;
  98. case WSAENETDOWN:
  99. return Errno::NETDOWN;
  100. case WSAENETUNREACH:
  101. return Errno::NETUNREACH;
  102. default:
  103. return Errno::OTHER;
  104. }
  105. }
  106. #elif YUZU_UNIX // ^ _WIN32 v YUZU_UNIX
  107. using SOCKET = int;
  108. using WSAPOLLFD = pollfd;
  109. using ULONG = u64;
  110. constexpr SOCKET INVALID_SOCKET = -1;
  111. constexpr SOCKET SOCKET_ERROR = -1;
  112. constexpr int SD_RECEIVE = SHUT_RD;
  113. constexpr int SD_SEND = SHUT_WR;
  114. constexpr int SD_BOTH = SHUT_RDWR;
  115. void Initialize() {}
  116. void Finalize() {}
  117. constexpr IPv4Address TranslateIPv4(in_addr addr) {
  118. const u32 bytes = addr.s_addr;
  119. return IPv4Address{static_cast<u8>(bytes), static_cast<u8>(bytes >> 8),
  120. static_cast<u8>(bytes >> 16), static_cast<u8>(bytes >> 24)};
  121. }
  122. sockaddr TranslateFromSockAddrIn(SockAddrIn input) {
  123. sockaddr_in result;
  124. switch (static_cast<Domain>(input.family)) {
  125. case Domain::INET:
  126. result.sin_family = AF_INET;
  127. break;
  128. default:
  129. UNIMPLEMENTED_MSG("Unhandled sockaddr family={}", input.family);
  130. result.sin_family = AF_INET;
  131. break;
  132. }
  133. result.sin_port = htons(input.portno);
  134. result.sin_addr.s_addr = input.ip[0] | input.ip[1] << 8 | input.ip[2] << 16 | input.ip[3] << 24;
  135. sockaddr addr;
  136. std::memcpy(&addr, &result, sizeof(addr));
  137. return addr;
  138. }
  139. int WSAPoll(WSAPOLLFD* fds, ULONG nfds, int timeout) {
  140. return poll(fds, static_cast<nfds_t>(nfds), timeout);
  141. }
  142. int closesocket(SOCKET fd) {
  143. return close(fd);
  144. }
  145. linger MakeLinger(bool enable, u32 linger_value) {
  146. linger value;
  147. value.l_onoff = enable ? 1 : 0;
  148. value.l_linger = linger_value;
  149. return value;
  150. }
  151. bool EnableNonBlock(int fd, bool enable) {
  152. int flags = fcntl(fd, F_GETFL);
  153. if (flags == -1) {
  154. return false;
  155. }
  156. if (enable) {
  157. flags |= O_NONBLOCK;
  158. } else {
  159. flags &= ~O_NONBLOCK;
  160. }
  161. return fcntl(fd, F_SETFL, flags) == 0;
  162. }
  163. Errno TranslateNativeError(int e) {
  164. switch (e) {
  165. case EBADF:
  166. return Errno::BADF;
  167. case EINVAL:
  168. return Errno::INVAL;
  169. case EMFILE:
  170. return Errno::MFILE;
  171. case ENOTCONN:
  172. return Errno::NOTCONN;
  173. case EAGAIN:
  174. return Errno::AGAIN;
  175. case ECONNREFUSED:
  176. return Errno::CONNREFUSED;
  177. case EHOSTUNREACH:
  178. return Errno::HOSTUNREACH;
  179. case ENETDOWN:
  180. return Errno::NETDOWN;
  181. case ENETUNREACH:
  182. return Errno::NETUNREACH;
  183. default:
  184. return Errno::OTHER;
  185. }
  186. }
  187. #endif
  188. Errno GetAndLogLastError() {
  189. #ifdef _WIN32
  190. int e = WSAGetLastError();
  191. #else
  192. int e = errno;
  193. #endif
  194. const Errno err = TranslateNativeError(e);
  195. if (err == Errno::AGAIN) {
  196. return err;
  197. }
  198. LOG_ERROR(Network, "Socket operation error: {}", NativeErrorToString(e));
  199. return err;
  200. }
  201. int TranslateDomain(Domain domain) {
  202. switch (domain) {
  203. case Domain::INET:
  204. return AF_INET;
  205. default:
  206. UNIMPLEMENTED_MSG("Unimplemented domain={}", domain);
  207. return 0;
  208. }
  209. }
  210. int TranslateType(Type type) {
  211. switch (type) {
  212. case Type::STREAM:
  213. return SOCK_STREAM;
  214. case Type::DGRAM:
  215. return SOCK_DGRAM;
  216. default:
  217. UNIMPLEMENTED_MSG("Unimplemented type={}", type);
  218. return 0;
  219. }
  220. }
  221. int TranslateProtocol(Protocol protocol) {
  222. switch (protocol) {
  223. case Protocol::TCP:
  224. return IPPROTO_TCP;
  225. case Protocol::UDP:
  226. return IPPROTO_UDP;
  227. default:
  228. UNIMPLEMENTED_MSG("Unimplemented protocol={}", protocol);
  229. return 0;
  230. }
  231. }
  232. SockAddrIn TranslateToSockAddrIn(sockaddr input_) {
  233. sockaddr_in input;
  234. std::memcpy(&input, &input_, sizeof(input));
  235. SockAddrIn result;
  236. switch (input.sin_family) {
  237. case AF_INET:
  238. result.family = Domain::INET;
  239. break;
  240. default:
  241. UNIMPLEMENTED_MSG("Unhandled sockaddr family={}", input.sin_family);
  242. result.family = Domain::INET;
  243. break;
  244. }
  245. result.portno = ntohs(input.sin_port);
  246. result.ip = TranslateIPv4(input.sin_addr);
  247. return result;
  248. }
  249. short TranslatePollEvents(PollEvents events) {
  250. short result = 0;
  251. if (True(events & PollEvents::In)) {
  252. events &= ~PollEvents::In;
  253. result |= POLLIN;
  254. }
  255. if (True(events & PollEvents::Pri)) {
  256. events &= ~PollEvents::Pri;
  257. #ifdef _WIN32
  258. LOG_WARNING(Service, "Winsock doesn't support POLLPRI");
  259. #else
  260. result |= POLLPRI;
  261. #endif
  262. }
  263. if (True(events & PollEvents::Out)) {
  264. events &= ~PollEvents::Out;
  265. result |= POLLOUT;
  266. }
  267. UNIMPLEMENTED_IF_MSG((u16)events != 0, "Unhandled guest events=0x{:x}", (u16)events);
  268. return result;
  269. }
  270. PollEvents TranslatePollRevents(short revents) {
  271. PollEvents result{};
  272. const auto translate = [&result, &revents](short host, PollEvents guest) {
  273. if ((revents & host) != 0) {
  274. revents &= static_cast<short>(~host);
  275. result |= guest;
  276. }
  277. };
  278. translate(POLLIN, PollEvents::In);
  279. translate(POLLPRI, PollEvents::Pri);
  280. translate(POLLOUT, PollEvents::Out);
  281. translate(POLLERR, PollEvents::Err);
  282. translate(POLLHUP, PollEvents::Hup);
  283. UNIMPLEMENTED_IF_MSG(revents != 0, "Unhandled host revents=0x{:x}", revents);
  284. return result;
  285. }
  286. template <typename T>
  287. Errno SetSockOpt(SOCKET fd, int option, T value) {
  288. const int result =
  289. setsockopt(fd, SOL_SOCKET, option, reinterpret_cast<const char*>(&value), sizeof(value));
  290. if (result != SOCKET_ERROR) {
  291. return Errno::SUCCESS;
  292. }
  293. return GetAndLogLastError();
  294. }
  295. } // Anonymous namespace
  296. NetworkInstance::NetworkInstance() {
  297. Initialize();
  298. }
  299. NetworkInstance::~NetworkInstance() {
  300. Finalize();
  301. }
  302. std::optional<IPv4Address> GetHostIPv4Address() {
  303. const std::string& selected_network_interface = Settings::values.network_interface.GetValue();
  304. const auto network_interfaces = Network::GetAvailableNetworkInterfaces();
  305. ASSERT_MSG(network_interfaces.size() > 0,
  306. "GetAvailableNetworkInterfaces returned no interfaces");
  307. const auto res = std::ranges::find_if(network_interfaces,
  308. [&selected_network_interface](const auto& interface) {
  309. return interface.name == selected_network_interface;
  310. });
  311. if (res != network_interfaces.end()) {
  312. char ip_addr[16] = {};
  313. ASSERT(inet_ntop(AF_INET, &res->ip_address, ip_addr, sizeof(ip_addr)) != nullptr);
  314. LOG_INFO(Network, "IP address: {}", ip_addr);
  315. return TranslateIPv4(res->ip_address);
  316. } else {
  317. LOG_ERROR(Network, "Couldn't find selected interface \"{}\"", selected_network_interface);
  318. return {};
  319. }
  320. }
  321. std::pair<s32, Errno> Poll(std::vector<PollFD>& pollfds, s32 timeout) {
  322. const size_t num = pollfds.size();
  323. std::vector<WSAPOLLFD> host_pollfds(pollfds.size());
  324. std::transform(pollfds.begin(), pollfds.end(), host_pollfds.begin(), [](PollFD fd) {
  325. WSAPOLLFD result;
  326. result.fd = fd.socket->fd;
  327. result.events = TranslatePollEvents(fd.events);
  328. result.revents = 0;
  329. return result;
  330. });
  331. const int result = WSAPoll(host_pollfds.data(), static_cast<ULONG>(num), timeout);
  332. if (result == 0) {
  333. ASSERT(std::all_of(host_pollfds.begin(), host_pollfds.end(),
  334. [](WSAPOLLFD fd) { return fd.revents == 0; }));
  335. return {0, Errno::SUCCESS};
  336. }
  337. for (size_t i = 0; i < num; ++i) {
  338. pollfds[i].revents = TranslatePollRevents(host_pollfds[i].revents);
  339. }
  340. if (result > 0) {
  341. return {result, Errno::SUCCESS};
  342. }
  343. ASSERT(result == SOCKET_ERROR);
  344. return {-1, GetAndLogLastError()};
  345. }
  346. Socket::~Socket() {
  347. if (fd == INVALID_SOCKET) {
  348. return;
  349. }
  350. (void)closesocket(fd);
  351. fd = INVALID_SOCKET;
  352. }
  353. Socket::Socket(Socket&& rhs) noexcept : fd{std::exchange(rhs.fd, INVALID_SOCKET)} {}
  354. Errno Socket::Initialize(Domain domain, Type type, Protocol protocol) {
  355. fd = socket(TranslateDomain(domain), TranslateType(type), TranslateProtocol(protocol));
  356. if (fd != INVALID_SOCKET) {
  357. return Errno::SUCCESS;
  358. }
  359. return GetAndLogLastError();
  360. }
  361. std::pair<Socket::AcceptResult, Errno> Socket::Accept() {
  362. sockaddr addr;
  363. socklen_t addrlen = sizeof(addr);
  364. const SOCKET new_socket = accept(fd, &addr, &addrlen);
  365. if (new_socket == INVALID_SOCKET) {
  366. return {AcceptResult{}, GetAndLogLastError()};
  367. }
  368. AcceptResult result;
  369. result.socket = std::make_unique<Socket>();
  370. result.socket->fd = new_socket;
  371. ASSERT(addrlen == sizeof(sockaddr_in));
  372. result.sockaddr_in = TranslateToSockAddrIn(addr);
  373. return {std::move(result), Errno::SUCCESS};
  374. }
  375. Errno Socket::Connect(SockAddrIn addr_in) {
  376. const sockaddr host_addr_in = TranslateFromSockAddrIn(addr_in);
  377. if (connect(fd, &host_addr_in, sizeof(host_addr_in)) != SOCKET_ERROR) {
  378. return Errno::SUCCESS;
  379. }
  380. return GetAndLogLastError();
  381. }
  382. std::pair<SockAddrIn, Errno> Socket::GetPeerName() {
  383. sockaddr addr;
  384. socklen_t addrlen = sizeof(addr);
  385. if (getpeername(fd, &addr, &addrlen) == SOCKET_ERROR) {
  386. return {SockAddrIn{}, GetAndLogLastError()};
  387. }
  388. ASSERT(addrlen == sizeof(sockaddr_in));
  389. return {TranslateToSockAddrIn(addr), Errno::SUCCESS};
  390. }
  391. std::pair<SockAddrIn, Errno> Socket::GetSockName() {
  392. sockaddr addr;
  393. socklen_t addrlen = sizeof(addr);
  394. if (getsockname(fd, &addr, &addrlen) == SOCKET_ERROR) {
  395. return {SockAddrIn{}, GetAndLogLastError()};
  396. }
  397. ASSERT(addrlen == sizeof(sockaddr_in));
  398. return {TranslateToSockAddrIn(addr), Errno::SUCCESS};
  399. }
  400. Errno Socket::Bind(SockAddrIn addr) {
  401. const sockaddr addr_in = TranslateFromSockAddrIn(addr);
  402. if (bind(fd, &addr_in, sizeof(addr_in)) != SOCKET_ERROR) {
  403. return Errno::SUCCESS;
  404. }
  405. return GetAndLogLastError();
  406. }
  407. Errno Socket::Listen(s32 backlog) {
  408. if (listen(fd, backlog) != SOCKET_ERROR) {
  409. return Errno::SUCCESS;
  410. }
  411. return GetAndLogLastError();
  412. }
  413. Errno Socket::Shutdown(ShutdownHow how) {
  414. int host_how = 0;
  415. switch (how) {
  416. case ShutdownHow::RD:
  417. host_how = SD_RECEIVE;
  418. break;
  419. case ShutdownHow::WR:
  420. host_how = SD_SEND;
  421. break;
  422. case ShutdownHow::RDWR:
  423. host_how = SD_BOTH;
  424. break;
  425. default:
  426. UNIMPLEMENTED_MSG("Unimplemented flag how={}", how);
  427. return Errno::SUCCESS;
  428. }
  429. if (shutdown(fd, host_how) != SOCKET_ERROR) {
  430. return Errno::SUCCESS;
  431. }
  432. return GetAndLogLastError();
  433. }
  434. std::pair<s32, Errno> Socket::Recv(int flags, std::vector<u8>& message) {
  435. ASSERT(flags == 0);
  436. ASSERT(message.size() < static_cast<size_t>(std::numeric_limits<int>::max()));
  437. const auto result =
  438. recv(fd, reinterpret_cast<char*>(message.data()), static_cast<int>(message.size()), 0);
  439. if (result != SOCKET_ERROR) {
  440. return {static_cast<s32>(result), Errno::SUCCESS};
  441. }
  442. return {-1, GetAndLogLastError()};
  443. }
  444. std::pair<s32, Errno> Socket::RecvFrom(int flags, std::vector<u8>& message, SockAddrIn* addr) {
  445. ASSERT(flags == 0);
  446. ASSERT(message.size() < static_cast<size_t>(std::numeric_limits<int>::max()));
  447. sockaddr addr_in{};
  448. socklen_t addrlen = sizeof(addr_in);
  449. socklen_t* const p_addrlen = addr ? &addrlen : nullptr;
  450. sockaddr* const p_addr_in = addr ? &addr_in : nullptr;
  451. const auto result = recvfrom(fd, reinterpret_cast<char*>(message.data()),
  452. static_cast<int>(message.size()), 0, p_addr_in, p_addrlen);
  453. if (result != SOCKET_ERROR) {
  454. if (addr) {
  455. ASSERT(addrlen == sizeof(addr_in));
  456. *addr = TranslateToSockAddrIn(addr_in);
  457. }
  458. return {static_cast<s32>(result), Errno::SUCCESS};
  459. }
  460. return {-1, GetAndLogLastError()};
  461. }
  462. std::pair<s32, Errno> Socket::Send(const std::vector<u8>& message, int flags) {
  463. ASSERT(message.size() < static_cast<size_t>(std::numeric_limits<int>::max()));
  464. ASSERT(flags == 0);
  465. const auto result = send(fd, reinterpret_cast<const char*>(message.data()),
  466. static_cast<int>(message.size()), 0);
  467. if (result != SOCKET_ERROR) {
  468. return {static_cast<s32>(result), Errno::SUCCESS};
  469. }
  470. return {-1, GetAndLogLastError()};
  471. }
  472. std::pair<s32, Errno> Socket::SendTo(u32 flags, const std::vector<u8>& message,
  473. const SockAddrIn* addr) {
  474. ASSERT(flags == 0);
  475. const sockaddr* to = nullptr;
  476. const int tolen = addr ? sizeof(sockaddr) : 0;
  477. sockaddr host_addr_in;
  478. if (addr) {
  479. host_addr_in = TranslateFromSockAddrIn(*addr);
  480. to = &host_addr_in;
  481. }
  482. const auto result = sendto(fd, reinterpret_cast<const char*>(message.data()),
  483. static_cast<int>(message.size()), 0, to, tolen);
  484. if (result != SOCKET_ERROR) {
  485. return {static_cast<s32>(result), Errno::SUCCESS};
  486. }
  487. return {-1, GetAndLogLastError()};
  488. }
  489. Errno Socket::Close() {
  490. [[maybe_unused]] const int result = closesocket(fd);
  491. ASSERT(result == 0);
  492. fd = INVALID_SOCKET;
  493. return Errno::SUCCESS;
  494. }
  495. Errno Socket::SetLinger(bool enable, u32 linger) {
  496. return SetSockOpt(fd, SO_LINGER, MakeLinger(enable, linger));
  497. }
  498. Errno Socket::SetReuseAddr(bool enable) {
  499. return SetSockOpt<u32>(fd, SO_REUSEADDR, enable ? 1 : 0);
  500. }
  501. Errno Socket::SetBroadcast(bool enable) {
  502. return SetSockOpt<u32>(fd, SO_BROADCAST, enable ? 1 : 0);
  503. }
  504. Errno Socket::SetSndBuf(u32 value) {
  505. return SetSockOpt(fd, SO_SNDBUF, value);
  506. }
  507. Errno Socket::SetRcvBuf(u32 value) {
  508. return SetSockOpt(fd, SO_RCVBUF, value);
  509. }
  510. Errno Socket::SetSndTimeo(u32 value) {
  511. return SetSockOpt(fd, SO_SNDTIMEO, value);
  512. }
  513. Errno Socket::SetRcvTimeo(u32 value) {
  514. return SetSockOpt(fd, SO_RCVTIMEO, value);
  515. }
  516. Errno Socket::SetNonBlock(bool enable) {
  517. if (EnableNonBlock(fd, enable)) {
  518. return Errno::SUCCESS;
  519. }
  520. return GetAndLogLastError();
  521. }
  522. bool Socket::IsOpened() const {
  523. return fd != INVALID_SOCKET;
  524. }
  525. } // namespace Network