summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2020-07-11 22:32:58 -0300
committerGravatar ReinUsesLisp2020-07-28 01:47:03 -0300
commit80b4bd358348893f891f722d70a0d8ff44cc44c6 (patch)
tree2d4405c23e5952a4b89538254de8866c7f5aa8be /src/core
parentservice/sockets: Add enumerations and structures (diff)
downloadyuzu-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.txt2
-rw-r--r--src/core/hle/service/sockets/sockets_translate.cpp165
-rw-r--r--src/core/hle/service/sockets/sockets_translate.h48
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
13namespace Service::Sockets {
14
15Errno 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
35std::pair<s32, Errno> Translate(std::pair<s32, Network::Errno> value) {
36 return {value.first, Translate(value.second)};
37}
38
39Network::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
49Domain 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
59Network::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
70Network::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
92u16 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
111u16 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
131Network::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
141SockAddrIn 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
151Network::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
13namespace Service::Sockets {
14
15/// Translate abstract errno to guest errno
16Errno Translate(Network::Errno value);
17
18/// Translate abstract return value errno pair to guest return value errno pair
19std::pair<s32, Errno> Translate(std::pair<s32, Network::Errno> value);
20
21/// Translate guest domain to abstract domain
22Network::Domain Translate(Domain domain);
23
24/// Translate abstract domain to guest domain
25Domain Translate(Network::Domain domain);
26
27/// Translate guest type to abstract type
28Network::Type Translate(Type type);
29
30/// Translate guest protocol to abstract protocol
31Network::Protocol Translate(Type type, Protocol protocol);
32
33/// Translate abstract poll event flags to guest poll event flags
34u16 TranslatePollEventsToHost(u16 flags);
35
36/// Translate guest poll event flags to abstract poll event flags
37u16 TranslatePollEventsToGuest(u16 flags);
38
39/// Translate guest socket address structure to abstract socket address structure
40Network::SockAddrIn Translate(SockAddrIn value);
41
42/// Translate abstract socket address structure to guest socket address structure
43SockAddrIn Translate(Network::SockAddrIn value);
44
45/// Translate guest shutdown mode to abstract shutdown mode
46Network::ShutdownHow Translate(ShutdownHow how);
47
48} // namespace Service::Sockets