sgx_socket.c 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. /*
  2. * Copyright (C) 2019 Intel Corporation. All rights reserved.
  3. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. */
  5. #include "platform_api_vmcore.h"
  6. #ifndef SGX_DISABLE_WASI
  7. #define TRACE_OCALL_FAIL() os_printf("ocall %s failed!\n", __FUNCTION__)
  8. int
  9. ocall_socket(int *p_ret, int domain, int type, int protocol);
  10. int
  11. ocall_getsockopt(int *p_ret, int sockfd, int level, int optname, void *val_buf,
  12. unsigned int val_buf_size, void *len_buf);
  13. int
  14. ocall_sendmsg(ssize_t *p_ret, int sockfd, void *msg_buf,
  15. unsigned int msg_buf_size, int flags);
  16. int
  17. ocall_recvmsg(ssize_t *p_ret, int sockfd, void *msg_buf,
  18. unsigned int msg_buf_size, int flags);
  19. int
  20. ocall_shutdown(int *p_ret, int sockfd, int how);
  21. int
  22. socket(int domain, int type, int protocol)
  23. {
  24. int ret;
  25. if (ocall_socket(&ret, domain, type, protocol) != SGX_SUCCESS) {
  26. TRACE_OCALL_FAIL();
  27. return -1;
  28. }
  29. if (ret == -1)
  30. errno = get_errno();
  31. return ret;
  32. }
  33. int
  34. getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen)
  35. {
  36. int ret;
  37. unsigned int val_buf_size = *optlen;
  38. if (ocall_getsockopt(&ret, sockfd, level, optname, optval, val_buf_size,
  39. (void *)optlen)
  40. != SGX_SUCCESS) {
  41. TRACE_OCALL_FAIL();
  42. return -1;
  43. }
  44. if (ret == -1)
  45. errno = get_errno();
  46. return ret;
  47. }
  48. ssize_t
  49. sendmsg(int sockfd, const struct msghdr *msg, int flags)
  50. {
  51. ssize_t ret;
  52. int i;
  53. char *p;
  54. struct msghdr *msg1;
  55. uint64 total_size = sizeof(struct msghdr) + (uint64)msg->msg_namelen
  56. + (uint64)msg->msg_controllen;
  57. total_size += sizeof(struct iovec) * (msg->msg_iovlen);
  58. for (i = 0; i < msg->msg_iovlen; i++) {
  59. total_size += msg->msg_iov[i].iov_len;
  60. }
  61. if (total_size >= UINT32_MAX)
  62. return -1;
  63. msg1 = BH_MALLOC((uint32)total_size);
  64. if (msg1 == NULL)
  65. return -1;
  66. p = (char *)(uintptr_t)sizeof(struct msghdr);
  67. if (msg->msg_name != NULL) {
  68. msg1->msg_name = p;
  69. memcpy((uintptr_t)p + (char *)msg1, msg->msg_name,
  70. (size_t)msg->msg_namelen);
  71. p += msg->msg_namelen;
  72. }
  73. if (msg->msg_control != NULL) {
  74. msg1->msg_control = p;
  75. memcpy((uintptr_t)p + (char *)msg1, msg->msg_control,
  76. (size_t)msg->msg_control);
  77. p += msg->msg_controllen;
  78. }
  79. if (msg->msg_iov != NULL) {
  80. msg1->msg_iov = (struct iovec *)p;
  81. p += (uintptr_t)(sizeof(struct iovec) * (msg->msg_iovlen));
  82. for (i = 0; i < msg->msg_iovlen; i++) {
  83. msg1->msg_iov[i].iov_base = p;
  84. msg1->msg_iov[i].iov_len = msg->msg_iov[i].iov_len;
  85. memcpy((uintptr_t)p + (char *)msg1, msg->msg_iov[i].iov_base,
  86. (size_t)(msg->msg_iov[i].iov_len));
  87. p += msg->msg_iov[i].iov_len;
  88. }
  89. }
  90. if (ocall_sendmsg(&ret, sockfd, (void *)msg1, (uint32)total_size, flags)
  91. != SGX_SUCCESS) {
  92. TRACE_OCALL_FAIL();
  93. return -1;
  94. }
  95. if (ret == -1)
  96. errno = get_errno();
  97. return ret;
  98. }
  99. ssize_t
  100. recvmsg(int sockfd, struct msghdr *msg, int flags)
  101. {
  102. ssize_t ret;
  103. int i;
  104. char *p;
  105. struct msghdr *msg1;
  106. uint64 total_size = sizeof(struct msghdr) + (uint64)msg->msg_namelen
  107. + (uint64)msg->msg_controllen;
  108. total_size += sizeof(struct iovec) * (msg->msg_iovlen);
  109. for (i = 0; i < msg->msg_iovlen; i++) {
  110. total_size += msg->msg_iov[i].iov_len;
  111. }
  112. if (total_size >= UINT32_MAX)
  113. return -1;
  114. msg1 = BH_MALLOC((uint32)total_size);
  115. if (msg1 == NULL)
  116. return -1;
  117. memset(msg1, 0, total_size);
  118. p = (char *)(uintptr_t)sizeof(struct msghdr);
  119. if (msg->msg_name != NULL) {
  120. msg1->msg_name = p;
  121. p += msg->msg_namelen;
  122. }
  123. if (msg->msg_control != NULL) {
  124. msg1->msg_control = p;
  125. p += msg->msg_controllen;
  126. }
  127. if (msg->msg_iov != NULL) {
  128. msg1->msg_iov = (struct iovec *)p;
  129. p += (uintptr_t)(sizeof(struct iovec) * (msg->msg_iovlen));
  130. for (i = 0; i < msg->msg_iovlen; i++) {
  131. msg1->msg_iov[i].iov_base = p;
  132. msg1->msg_iov[i].iov_len = msg->msg_iov[i].iov_len;
  133. p += msg->msg_iov[i].iov_len;
  134. }
  135. }
  136. if (ocall_recvmsg(&ret, sockfd, (void *)msg1, (uint32)total_size, flags)
  137. != SGX_SUCCESS) {
  138. TRACE_OCALL_FAIL();
  139. return -1;
  140. }
  141. p = (char *)(uintptr_t)(sizeof(struct msghdr));
  142. if (msg1->msg_name != NULL) {
  143. memcpy(msg->msg_name, (uintptr_t)p + (char *)msg1,
  144. (size_t)msg1->msg_namelen);
  145. p += msg1->msg_namelen;
  146. }
  147. if (msg1->msg_control != NULL) {
  148. memcpy(msg->msg_control, (uintptr_t)p + (char *)msg1,
  149. (size_t)msg1->msg_control);
  150. p += msg->msg_controllen;
  151. }
  152. if (msg1->msg_iov != NULL) {
  153. p += (uintptr_t)(sizeof(struct iovec) * (msg1->msg_iovlen));
  154. for (i = 0; i < msg1->msg_iovlen; i++) {
  155. memcpy(msg->msg_iov[i].iov_base, (uintptr_t)p + (char *)msg1,
  156. (size_t)(msg1->msg_iov[i].iov_len));
  157. p += msg1->msg_iov[i].iov_len;
  158. }
  159. }
  160. if (ret == -1)
  161. errno = get_errno();
  162. return ret;
  163. }
  164. int
  165. shutdown(int sockfd, int how)
  166. {
  167. int ret;
  168. if (ocall_shutdown(&ret, sockfd, how) != SGX_SUCCESS) {
  169. TRACE_OCALL_FAIL();
  170. return -1;
  171. }
  172. if (ret == -1)
  173. errno = get_errno();
  174. return ret;
  175. }
  176. int
  177. os_socket_accept(bh_socket_t server_sock, bh_socket_t *sock, void *addr,
  178. unsigned int *addrlen)
  179. {
  180. errno = ENOSYS;
  181. return -1;
  182. }
  183. int
  184. os_socket_bind(bh_socket_t socket, const char *host, int *port)
  185. {
  186. errno = ENOSYS;
  187. return -1;
  188. }
  189. int
  190. os_socket_close(bh_socket_t socket)
  191. {
  192. errno = ENOSYS;
  193. return -1;
  194. }
  195. int
  196. os_socket_connect(bh_socket_t socket, const char *addr, int port)
  197. {}
  198. int
  199. os_socket_create(bh_socket_t *sock, int tcp_or_udp)
  200. {
  201. errno = ENOSYS;
  202. return -1;
  203. }
  204. int
  205. os_socket_inet_network(const char *cp, uint32 *out)
  206. {
  207. errno = ENOSYS;
  208. return -1;
  209. }
  210. int
  211. os_socket_listen(bh_socket_t socket, int max_client)
  212. {
  213. errno = ENOSYS;
  214. return -1;
  215. }
  216. int
  217. os_socket_recv(bh_socket_t socket, void *buf, unsigned int len)
  218. {
  219. errno = ENOSYS;
  220. return -1;
  221. }
  222. int
  223. os_socket_send(bh_socket_t socket, const void *buf, unsigned int len)
  224. {
  225. errno = ENOSYS;
  226. return -1;
  227. }
  228. int
  229. os_socket_shutdown(bh_socket_t socket)
  230. {
  231. errno = ENOSYS;
  232. return -1;
  233. }
  234. #endif