diff options
| author | 2020-07-11 22:32:58 -0300 | |
|---|---|---|
| committer | 2020-07-28 01:47:03 -0300 | |
| commit | 80b4bd358348893f891f722d70a0d8ff44cc44c6 (patch) | |
| tree | 2d4405c23e5952a4b89538254de8866c7f5aa8be /src/core | |
| parent | service/sockets: Add enumerations and structures (diff) | |
| download | yuzu-80b4bd358348893f891f722d70a0d8ff44cc44c6.tar.gz yuzu-80b4bd358348893f891f722d70a0d8ff44cc44c6.tar.xz yuzu-80b4bd358348893f891f722d70a0d8ff44cc44c6.zip | |
service/sockets: Add translate functions
These functions translate from Network enumerations/structures to guest
enumerations/structures and viceversa.
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/core/hle/service/sockets/sockets_translate.cpp | 165 | ||||
| -rw-r--r-- | src/core/hle/service/sockets/sockets_translate.h | 48 |
3 files changed, 215 insertions, 0 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index c85c9485f..48578ad48 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt | |||
| @@ -501,6 +501,8 @@ add_library(core STATIC | |||
| 501 | hle/service/sockets/sfdnsres.h | 501 | hle/service/sockets/sfdnsres.h |
| 502 | hle/service/sockets/sockets.cpp | 502 | hle/service/sockets/sockets.cpp |
| 503 | hle/service/sockets/sockets.h | 503 | hle/service/sockets/sockets.h |
| 504 | hle/service/sockets/sockets_translate.cpp | ||
| 505 | hle/service/sockets/sockets_translate.h | ||
| 504 | hle/service/spl/csrng.cpp | 506 | hle/service/spl/csrng.cpp |
| 505 | hle/service/spl/csrng.h | 507 | hle/service/spl/csrng.h |
| 506 | hle/service/spl/module.cpp | 508 | hle/service/spl/module.cpp |
diff --git a/src/core/hle/service/sockets/sockets_translate.cpp b/src/core/hle/service/sockets/sockets_translate.cpp new file mode 100644 index 000000000..2be8f642d --- /dev/null +++ b/src/core/hle/service/sockets/sockets_translate.cpp | |||
| @@ -0,0 +1,165 @@ | |||
| 1 | // Copyright 2020 yuzu emulator team | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #include <utility> | ||
| 6 | |||
| 7 | #include "common/assert.h" | ||
| 8 | #include "common/common_types.h" | ||
| 9 | #include "core/hle/service/sockets/sockets.h" | ||
| 10 | #include "core/hle/service/sockets/sockets_translate.h" | ||
| 11 | #include "core/network/network.h" | ||
| 12 | |||
| 13 | namespace Service::Sockets { | ||
| 14 | |||
| 15 | Errno Translate(Network::Errno value) { | ||
| 16 | switch (value) { | ||
| 17 | case Network::Errno::SUCCESS: | ||
| 18 | return Errno::SUCCESS; | ||
| 19 | case Network::Errno::BADF: | ||
| 20 | return Errno::BADF; | ||
| 21 | case Network::Errno::AGAIN: | ||
| 22 | return Errno::AGAIN; | ||
| 23 | case Network::Errno::INVAL: | ||
| 24 | return Errno::INVAL; | ||
| 25 | case Network::Errno::MFILE: | ||
| 26 | return Errno::MFILE; | ||
| 27 | case Network::Errno::NOTCONN: | ||
| 28 | return Errno::NOTCONN; | ||
| 29 | default: | ||
| 30 | UNIMPLEMENTED_MSG("Unimplemented errno={}", static_cast<int>(value)); | ||
| 31 | return Errno::SUCCESS; | ||
| 32 | } | ||
| 33 | } | ||
| 34 | |||
| 35 | std::pair<s32, Errno> Translate(std::pair<s32, Network::Errno> value) { | ||
| 36 | return {value.first, Translate(value.second)}; | ||
| 37 | } | ||
| 38 | |||
| 39 | Network::Domain Translate(Domain domain) { | ||
| 40 | switch (domain) { | ||
| 41 | case Domain::INET: | ||
| 42 | return Network::Domain::INET; | ||
| 43 | default: | ||
| 44 | UNIMPLEMENTED_MSG("Unimplemented domain={}", static_cast<int>(domain)); | ||
| 45 | return {}; | ||
| 46 | } | ||
| 47 | } | ||
| 48 | |||
| 49 | Domain Translate(Network::Domain domain) { | ||
| 50 | switch (domain) { | ||
| 51 | case Network::Domain::INET: | ||
| 52 | return Domain::INET; | ||
| 53 | default: | ||
| 54 | UNIMPLEMENTED_MSG("Unimplemented domain={}", static_cast<int>(domain)); | ||
| 55 | return {}; | ||
| 56 | } | ||
| 57 | } | ||
| 58 | |||
| 59 | Network::Type Translate(Type type) { | ||
| 60 | switch (type) { | ||
| 61 | case Type::STREAM: | ||
| 62 | return Network::Type::STREAM; | ||
| 63 | case Type::DGRAM: | ||
| 64 | return Network::Type::DGRAM; | ||
| 65 | default: | ||
| 66 | UNIMPLEMENTED_MSG("Unimplemented type={}", static_cast<int>(type)); | ||
| 67 | } | ||
| 68 | } | ||
| 69 | |||
| 70 | Network::Protocol Translate(Type type, Protocol protocol) { | ||
| 71 | switch (protocol) { | ||
| 72 | case Protocol::UNSPECIFIED: | ||
| 73 | LOG_WARNING(Service, "Unspecified protocol, assuming protocol from type"); | ||
| 74 | switch (type) { | ||
| 75 | case Type::DGRAM: | ||
| 76 | return Network::Protocol::UDP; | ||
| 77 | case Type::STREAM: | ||
| 78 | return Network::Protocol::TCP; | ||
| 79 | default: | ||
| 80 | return Network::Protocol::TCP; | ||
| 81 | } | ||
| 82 | case Protocol::TCP: | ||
| 83 | return Network::Protocol::TCP; | ||
| 84 | case Protocol::UDP: | ||
| 85 | return Network::Protocol::UDP; | ||
| 86 | default: | ||
| 87 | UNIMPLEMENTED_MSG("Unimplemented protocol={}", static_cast<int>(protocol)); | ||
| 88 | return Network::Protocol::TCP; | ||
| 89 | } | ||
| 90 | } | ||
| 91 | |||
| 92 | u16 TranslatePollEventsToHost(u16 flags) { | ||
| 93 | u16 result = 0; | ||
| 94 | const auto translate = [&result, &flags](u16 from, u16 to) { | ||
| 95 | if ((flags & from) != 0) { | ||
| 96 | flags &= ~from; | ||
| 97 | result |= to; | ||
| 98 | } | ||
| 99 | }; | ||
| 100 | translate(POLL_IN, Network::POLL_IN); | ||
| 101 | translate(POLL_PRI, Network::POLL_PRI); | ||
| 102 | translate(POLL_OUT, Network::POLL_OUT); | ||
| 103 | translate(POLL_ERR, Network::POLL_ERR); | ||
| 104 | translate(POLL_HUP, Network::POLL_HUP); | ||
| 105 | translate(POLL_NVAL, Network::POLL_NVAL); | ||
| 106 | |||
| 107 | UNIMPLEMENTED_IF_MSG(flags != 0, "Unimplemented flags={}", flags); | ||
| 108 | return result; | ||
| 109 | } | ||
| 110 | |||
| 111 | u16 TranslatePollEventsToGuest(u16 flags) { | ||
| 112 | u16 result = 0; | ||
| 113 | const auto translate = [&result, &flags](u16 from, u16 to) { | ||
| 114 | if ((flags & from) != 0) { | ||
| 115 | flags &= ~from; | ||
| 116 | result |= to; | ||
| 117 | } | ||
| 118 | }; | ||
| 119 | |||
| 120 | translate(Network::POLL_IN, POLL_IN); | ||
| 121 | translate(Network::POLL_PRI, POLL_PRI); | ||
| 122 | translate(Network::POLL_OUT, POLL_OUT); | ||
| 123 | translate(Network::POLL_ERR, POLL_ERR); | ||
| 124 | translate(Network::POLL_HUP, POLL_HUP); | ||
| 125 | translate(Network::POLL_NVAL, POLL_NVAL); | ||
| 126 | |||
| 127 | UNIMPLEMENTED_IF_MSG(flags != 0, "Unimplemented flags={}", flags); | ||
| 128 | return result; | ||
| 129 | } | ||
| 130 | |||
| 131 | Network::SockAddrIn Translate(SockAddrIn value) { | ||
| 132 | ASSERT(value.len == 0 || value.len == sizeof(value)); | ||
| 133 | |||
| 134 | Network::SockAddrIn result; | ||
| 135 | result.family = Translate(static_cast<Domain>(value.family)); | ||
| 136 | result.ip = value.ip; | ||
| 137 | result.portno = value.portno >> 8 | value.portno << 8; | ||
| 138 | return result; | ||
| 139 | } | ||
| 140 | |||
| 141 | SockAddrIn Translate(Network::SockAddrIn value) { | ||
| 142 | SockAddrIn result; | ||
| 143 | result.len = sizeof(result); | ||
| 144 | result.family = static_cast<u8>(Translate(value.family)); | ||
| 145 | result.portno = value.portno >> 8 | value.portno << 8; | ||
| 146 | result.ip = value.ip; | ||
| 147 | result.zeroes = {}; | ||
| 148 | return result; | ||
| 149 | } | ||
| 150 | |||
| 151 | Network::ShutdownHow Translate(ShutdownHow how) { | ||
| 152 | switch (how) { | ||
| 153 | case ShutdownHow::RD: | ||
| 154 | return Network::ShutdownHow::RD; | ||
| 155 | case ShutdownHow::WR: | ||
| 156 | return Network::ShutdownHow::WR; | ||
| 157 | case ShutdownHow::RDWR: | ||
| 158 | return Network::ShutdownHow::RDWR; | ||
| 159 | default: | ||
| 160 | UNIMPLEMENTED_MSG("Unimplemented how={}", static_cast<int>(how)); | ||
| 161 | return {}; | ||
| 162 | } | ||
| 163 | } | ||
| 164 | |||
| 165 | } // namespace Service::Sockets | ||
diff --git a/src/core/hle/service/sockets/sockets_translate.h b/src/core/hle/service/sockets/sockets_translate.h new file mode 100644 index 000000000..8ed041e31 --- /dev/null +++ b/src/core/hle/service/sockets/sockets_translate.h | |||
| @@ -0,0 +1,48 @@ | |||
| 1 | // Copyright 2020 yuzu emulator team | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #pragma once | ||
| 6 | |||
| 7 | #include <utility> | ||
| 8 | |||
| 9 | #include "common/common_types.h" | ||
| 10 | #include "core/hle/service/sockets/sockets.h" | ||
| 11 | #include "core/network/network.h" | ||
| 12 | |||
| 13 | namespace Service::Sockets { | ||
| 14 | |||
| 15 | /// Translate abstract errno to guest errno | ||
| 16 | Errno Translate(Network::Errno value); | ||
| 17 | |||
| 18 | /// Translate abstract return value errno pair to guest return value errno pair | ||
| 19 | std::pair<s32, Errno> Translate(std::pair<s32, Network::Errno> value); | ||
| 20 | |||
| 21 | /// Translate guest domain to abstract domain | ||
| 22 | Network::Domain Translate(Domain domain); | ||
| 23 | |||
| 24 | /// Translate abstract domain to guest domain | ||
| 25 | Domain Translate(Network::Domain domain); | ||
| 26 | |||
| 27 | /// Translate guest type to abstract type | ||
| 28 | Network::Type Translate(Type type); | ||
| 29 | |||
| 30 | /// Translate guest protocol to abstract protocol | ||
| 31 | Network::Protocol Translate(Type type, Protocol protocol); | ||
| 32 | |||
| 33 | /// Translate abstract poll event flags to guest poll event flags | ||
| 34 | u16 TranslatePollEventsToHost(u16 flags); | ||
| 35 | |||
| 36 | /// Translate guest poll event flags to abstract poll event flags | ||
| 37 | u16 TranslatePollEventsToGuest(u16 flags); | ||
| 38 | |||
| 39 | /// Translate guest socket address structure to abstract socket address structure | ||
| 40 | Network::SockAddrIn Translate(SockAddrIn value); | ||
| 41 | |||
| 42 | /// Translate abstract socket address structure to guest socket address structure | ||
| 43 | SockAddrIn Translate(Network::SockAddrIn value); | ||
| 44 | |||
| 45 | /// Translate guest shutdown mode to abstract shutdown mode | ||
| 46 | Network::ShutdownHow Translate(ShutdownHow how); | ||
| 47 | |||
| 48 | } // namespace Service::Sockets | ||