win_socket.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697
  1. /*
  2. * Copyright (C) 2021 Intel Corporation. All rights reserved.
  3. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. */
  5. #include "platform_api_vmcore.h"
  6. #include "platform_api_extension.h"
  7. /* link with Ws2_32.lib */
  8. #pragma comment(lib, "ws2_32.lib")
  9. static bool is_winsock_inited = false;
  10. #define CHECK_VALID_SOCKET_HANDLE(win_handle) \
  11. do { \
  12. if ((win_handle) == NULL) { \
  13. errno = EBADF; \
  14. return BHT_ERROR; \
  15. } \
  16. if ((win_handle)->type != windows_handle_type_socket) { \
  17. errno = ENOTSOCK; \
  18. return BHT_ERROR; \
  19. } \
  20. if ((win_handle)->raw.socket == INVALID_SOCKET) { \
  21. errno = EBADF; \
  22. return BHT_ERROR; \
  23. } \
  24. } while (0)
  25. int
  26. init_winsock()
  27. {
  28. WSADATA wsaData;
  29. if (!is_winsock_inited) {
  30. if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
  31. os_printf("winsock init failed");
  32. return BHT_ERROR;
  33. }
  34. is_winsock_inited = true;
  35. }
  36. return BHT_OK;
  37. }
  38. void
  39. deinit_winsock()
  40. {
  41. if (is_winsock_inited) {
  42. WSACleanup();
  43. }
  44. }
  45. int
  46. os_socket_create(bh_socket_t *sock, bool is_ipv4, bool is_tcp)
  47. {
  48. int af;
  49. if (!sock) {
  50. return BHT_ERROR;
  51. }
  52. *(sock) = BH_MALLOC(sizeof(windows_handle));
  53. if ((*sock) == NULL) {
  54. errno = ENOMEM;
  55. return BHT_ERROR;
  56. }
  57. (*sock)->type = windows_handle_type_socket;
  58. (*sock)->access_mode = windows_access_mode_read | windows_access_mode_write;
  59. (*sock)->fdflags = 0;
  60. if (is_ipv4) {
  61. af = AF_INET;
  62. }
  63. else {
  64. errno = ENOSYS;
  65. return BHT_ERROR;
  66. }
  67. if (is_tcp) {
  68. (*sock)->raw.socket = socket(af, SOCK_STREAM, IPPROTO_TCP);
  69. }
  70. else {
  71. (*sock)->raw.socket = socket(af, SOCK_DGRAM, 0);
  72. }
  73. if ((*sock)->raw.socket == INVALID_SOCKET) {
  74. BH_FREE(*sock);
  75. return BHT_ERROR;
  76. }
  77. return BHT_OK;
  78. }
  79. int
  80. os_socket_bind(bh_socket_t socket, const char *host, int *port)
  81. {
  82. CHECK_VALID_SOCKET_HANDLE(socket);
  83. struct sockaddr_in addr;
  84. int socklen, ret;
  85. assert(host);
  86. assert(port);
  87. addr.sin_addr.s_addr = inet_addr(host);
  88. addr.sin_port = htons(*port);
  89. addr.sin_family = AF_INET;
  90. ret = bind(socket->raw.socket, (struct sockaddr *)&addr, sizeof(addr));
  91. if (ret < 0) {
  92. goto fail;
  93. }
  94. socklen = sizeof(addr);
  95. if (getsockname(socket->raw.socket, (void *)&addr, &socklen) == -1) {
  96. os_printf("getsockname failed with error %d\n", WSAGetLastError());
  97. goto fail;
  98. }
  99. *port = ntohs(addr.sin_port);
  100. return BHT_OK;
  101. fail:
  102. return BHT_ERROR;
  103. }
  104. int
  105. os_socket_settimeout(bh_socket_t socket, uint64 timeout_us)
  106. {
  107. CHECK_VALID_SOCKET_HANDLE(socket);
  108. DWORD tv = (DWORD)(timeout_us / 1000UL);
  109. if (setsockopt(socket->raw.socket, SOL_SOCKET, SO_RCVTIMEO,
  110. (const char *)&tv, sizeof(tv))
  111. != 0) {
  112. return BHT_ERROR;
  113. }
  114. return BHT_OK;
  115. }
  116. int
  117. os_socket_listen(bh_socket_t socket, int max_client)
  118. {
  119. CHECK_VALID_SOCKET_HANDLE(socket);
  120. if (listen(socket->raw.socket, max_client) != 0) {
  121. os_printf("socket listen failed with error %d\n", WSAGetLastError());
  122. return BHT_ERROR;
  123. }
  124. return BHT_OK;
  125. }
  126. int
  127. os_socket_accept(bh_socket_t server_sock, bh_socket_t *sock, void *addr,
  128. unsigned int *addrlen)
  129. {
  130. CHECK_VALID_SOCKET_HANDLE(server_sock);
  131. struct sockaddr addr_tmp;
  132. unsigned int len = sizeof(struct sockaddr);
  133. *sock = BH_MALLOC(sizeof(windows_handle));
  134. if (*sock == NULL) {
  135. errno = ENOMEM;
  136. return BHT_ERROR;
  137. }
  138. (*sock)->type = windows_handle_type_socket;
  139. (*sock)->access_mode = windows_access_mode_read | windows_access_mode_write;
  140. (*sock)->fdflags = 0;
  141. (*sock)->raw.socket =
  142. accept(server_sock->raw.socket, (struct sockaddr *)&addr_tmp, &len);
  143. if ((*sock)->raw.socket == INVALID_SOCKET) {
  144. BH_FREE(*sock);
  145. os_printf("socket accept failed with error %d\n", WSAGetLastError());
  146. return BHT_ERROR;
  147. }
  148. return BHT_OK;
  149. }
  150. int
  151. os_socket_recv(bh_socket_t socket, void *buf, unsigned int len)
  152. {
  153. CHECK_VALID_SOCKET_HANDLE(socket);
  154. return recv(socket->raw.socket, buf, len, 0);
  155. }
  156. int
  157. os_socket_recv_from(bh_socket_t socket, void *buf, unsigned int len, int flags,
  158. bh_sockaddr_t *src_addr)
  159. {
  160. CHECK_VALID_SOCKET_HANDLE(socket);
  161. errno = ENOSYS;
  162. return BHT_ERROR;
  163. }
  164. int
  165. os_socket_send(bh_socket_t socket, const void *buf, unsigned int len)
  166. {
  167. CHECK_VALID_SOCKET_HANDLE(socket);
  168. return send(socket->raw.socket, buf, len, 0);
  169. }
  170. int
  171. os_socket_send_to(bh_socket_t socket, const void *buf, unsigned int len,
  172. int flags, const bh_sockaddr_t *dest_addr)
  173. {
  174. CHECK_VALID_SOCKET_HANDLE(socket);
  175. errno = ENOSYS;
  176. return BHT_ERROR;
  177. }
  178. int
  179. os_socket_close(bh_socket_t socket)
  180. {
  181. CHECK_VALID_SOCKET_HANDLE(socket);
  182. closesocket(socket->raw.socket);
  183. BH_FREE(socket);
  184. return BHT_OK;
  185. }
  186. int
  187. os_socket_shutdown(bh_socket_t socket)
  188. {
  189. CHECK_VALID_SOCKET_HANDLE(socket);
  190. shutdown(socket->raw.socket, SD_BOTH);
  191. return BHT_OK;
  192. }
  193. int
  194. os_socket_inet_network(bool is_ipv4, const char *cp, bh_ip_addr_buffer_t *out)
  195. {
  196. if (!cp)
  197. return BHT_ERROR;
  198. if (is_ipv4) {
  199. if (inet_pton(AF_INET, cp, &out->ipv4) != 1) {
  200. return BHT_ERROR;
  201. }
  202. /* Note: ntohl(INADDR_NONE) == INADDR_NONE */
  203. out->ipv4 = ntohl(out->ipv4);
  204. }
  205. else {
  206. if (inet_pton(AF_INET6, cp, out->ipv6) != 1) {
  207. return BHT_ERROR;
  208. }
  209. for (int i = 0; i < 8; i++) {
  210. out->ipv6[i] = ntohs(out->ipv6[i]);
  211. }
  212. }
  213. return BHT_OK;
  214. }
  215. int
  216. os_socket_connect(bh_socket_t socket, const char *addr, int port)
  217. {
  218. CHECK_VALID_SOCKET_HANDLE(socket);
  219. errno = ENOSYS;
  220. return BHT_ERROR;
  221. }
  222. int
  223. os_socket_addr_resolve(const char *host, const char *service,
  224. uint8_t *hint_is_tcp, uint8_t *hint_is_ipv4,
  225. bh_addr_info_t *addr_info, size_t addr_info_size,
  226. size_t *max_info_size)
  227. {
  228. errno = ENOSYS;
  229. return BHT_ERROR;
  230. }
  231. int
  232. os_socket_addr_local(bh_socket_t socket, bh_sockaddr_t *sockaddr)
  233. {
  234. CHECK_VALID_SOCKET_HANDLE(socket);
  235. errno = ENOSYS;
  236. return BHT_ERROR;
  237. }
  238. int
  239. os_socket_set_send_timeout(bh_socket_t socket, uint64 timeout_us)
  240. {
  241. CHECK_VALID_SOCKET_HANDLE(socket);
  242. errno = ENOSYS;
  243. return BHT_ERROR;
  244. }
  245. int
  246. os_socket_get_send_timeout(bh_socket_t socket, uint64 *timeout_us)
  247. {
  248. CHECK_VALID_SOCKET_HANDLE(socket);
  249. errno = ENOSYS;
  250. return BHT_ERROR;
  251. }
  252. int
  253. os_socket_set_recv_timeout(bh_socket_t socket, uint64 timeout_us)
  254. {
  255. CHECK_VALID_SOCKET_HANDLE(socket);
  256. errno = ENOSYS;
  257. return BHT_ERROR;
  258. }
  259. int
  260. os_socket_get_recv_timeout(bh_socket_t socket, uint64 *timeout_us)
  261. {
  262. CHECK_VALID_SOCKET_HANDLE(socket);
  263. errno = ENOSYS;
  264. return BHT_ERROR;
  265. }
  266. int
  267. os_socket_addr_remote(bh_socket_t socket, bh_sockaddr_t *sockaddr)
  268. {
  269. CHECK_VALID_SOCKET_HANDLE(socket);
  270. errno = ENOSYS;
  271. return BHT_ERROR;
  272. }
  273. int
  274. os_socket_set_send_buf_size(bh_socket_t socket, size_t bufsiz)
  275. {
  276. CHECK_VALID_SOCKET_HANDLE(socket);
  277. errno = ENOSYS;
  278. return BHT_ERROR;
  279. }
  280. int
  281. os_socket_get_send_buf_size(bh_socket_t socket, size_t *bufsiz)
  282. {
  283. CHECK_VALID_SOCKET_HANDLE(socket);
  284. errno = ENOSYS;
  285. return BHT_ERROR;
  286. }
  287. int
  288. os_socket_set_recv_buf_size(bh_socket_t socket, size_t bufsiz)
  289. {
  290. CHECK_VALID_SOCKET_HANDLE(socket);
  291. errno = ENOSYS;
  292. return BHT_ERROR;
  293. }
  294. int
  295. os_socket_get_recv_buf_size(bh_socket_t socket, size_t *bufsiz)
  296. {
  297. CHECK_VALID_SOCKET_HANDLE(socket);
  298. errno = ENOSYS;
  299. return BHT_ERROR;
  300. }
  301. int
  302. os_socket_set_keep_alive(bh_socket_t socket, bool is_enabled)
  303. {
  304. CHECK_VALID_SOCKET_HANDLE(socket);
  305. errno = ENOSYS;
  306. return BHT_ERROR;
  307. }
  308. int
  309. os_socket_get_keep_alive(bh_socket_t socket, bool *is_enabled)
  310. {
  311. CHECK_VALID_SOCKET_HANDLE(socket);
  312. errno = ENOSYS;
  313. return BHT_ERROR;
  314. }
  315. int
  316. os_socket_set_reuse_addr(bh_socket_t socket, bool is_enabled)
  317. {
  318. CHECK_VALID_SOCKET_HANDLE(socket);
  319. errno = ENOSYS;
  320. return BHT_ERROR;
  321. }
  322. int
  323. os_socket_get_reuse_addr(bh_socket_t socket, bool *is_enabled)
  324. {
  325. CHECK_VALID_SOCKET_HANDLE(socket);
  326. errno = ENOSYS;
  327. return BHT_ERROR;
  328. }
  329. int
  330. os_socket_set_reuse_port(bh_socket_t socket, bool is_enabled)
  331. {
  332. CHECK_VALID_SOCKET_HANDLE(socket);
  333. errno = ENOSYS;
  334. return BHT_ERROR;
  335. }
  336. int
  337. os_socket_get_reuse_port(bh_socket_t socket, bool *is_enabled)
  338. {
  339. CHECK_VALID_SOCKET_HANDLE(socket);
  340. errno = ENOSYS;
  341. return BHT_ERROR;
  342. }
  343. int
  344. os_socket_set_linger(bh_socket_t socket, bool is_enabled, int linger_s)
  345. {
  346. CHECK_VALID_SOCKET_HANDLE(socket);
  347. errno = ENOSYS;
  348. return BHT_ERROR;
  349. }
  350. int
  351. os_socket_get_linger(bh_socket_t socket, bool *is_enabled, int *linger_s)
  352. {
  353. CHECK_VALID_SOCKET_HANDLE(socket);
  354. errno = ENOSYS;
  355. return BHT_ERROR;
  356. }
  357. int
  358. os_socket_set_tcp_no_delay(bh_socket_t socket, bool is_enabled)
  359. {
  360. CHECK_VALID_SOCKET_HANDLE(socket);
  361. errno = ENOSYS;
  362. return BHT_ERROR;
  363. }
  364. int
  365. os_socket_get_tcp_no_delay(bh_socket_t socket, bool *is_enabled)
  366. {
  367. CHECK_VALID_SOCKET_HANDLE(socket);
  368. errno = ENOSYS;
  369. return BHT_ERROR;
  370. }
  371. int
  372. os_socket_set_tcp_quick_ack(bh_socket_t socket, bool is_enabled)
  373. {
  374. CHECK_VALID_SOCKET_HANDLE(socket);
  375. errno = ENOSYS;
  376. return BHT_ERROR;
  377. }
  378. int
  379. os_socket_get_tcp_quick_ack(bh_socket_t socket, bool *is_enabled)
  380. {
  381. CHECK_VALID_SOCKET_HANDLE(socket);
  382. errno = ENOSYS;
  383. return BHT_ERROR;
  384. }
  385. int
  386. os_socket_set_tcp_keep_idle(bh_socket_t socket, uint32 time_s)
  387. {
  388. CHECK_VALID_SOCKET_HANDLE(socket);
  389. errno = ENOSYS;
  390. return BHT_ERROR;
  391. }
  392. int
  393. os_socket_get_tcp_keep_idle(bh_socket_t socket, uint32 *time_s)
  394. {
  395. CHECK_VALID_SOCKET_HANDLE(socket);
  396. errno = ENOSYS;
  397. return BHT_ERROR;
  398. }
  399. int
  400. os_socket_set_tcp_keep_intvl(bh_socket_t socket, uint32 time_s)
  401. {
  402. CHECK_VALID_SOCKET_HANDLE(socket);
  403. errno = ENOSYS;
  404. return BHT_ERROR;
  405. }
  406. int
  407. os_socket_get_tcp_keep_intvl(bh_socket_t socket, uint32 *time_s)
  408. {
  409. CHECK_VALID_SOCKET_HANDLE(socket);
  410. errno = ENOSYS;
  411. return BHT_ERROR;
  412. }
  413. int
  414. os_socket_set_tcp_fastopen_connect(bh_socket_t socket, bool is_enabled)
  415. {
  416. CHECK_VALID_SOCKET_HANDLE(socket);
  417. errno = ENOSYS;
  418. return BHT_ERROR;
  419. }
  420. int
  421. os_socket_get_tcp_fastopen_connect(bh_socket_t socket, bool *is_enabled)
  422. {
  423. CHECK_VALID_SOCKET_HANDLE(socket);
  424. errno = ENOSYS;
  425. return BHT_ERROR;
  426. }
  427. int
  428. os_socket_set_ip_multicast_loop(bh_socket_t socket, bool ipv6, bool is_enabled)
  429. {
  430. CHECK_VALID_SOCKET_HANDLE(socket);
  431. errno = ENOSYS;
  432. return BHT_ERROR;
  433. }
  434. int
  435. os_socket_get_ip_multicast_loop(bh_socket_t socket, bool ipv6, bool *is_enabled)
  436. {
  437. CHECK_VALID_SOCKET_HANDLE(socket);
  438. errno = ENOSYS;
  439. return BHT_ERROR;
  440. }
  441. int
  442. os_socket_set_ip_add_membership(bh_socket_t socket,
  443. bh_ip_addr_buffer_t *imr_multiaddr,
  444. uint32_t imr_interface, bool is_ipv6)
  445. {
  446. CHECK_VALID_SOCKET_HANDLE(socket);
  447. errno = ENOSYS;
  448. return BHT_ERROR;
  449. }
  450. int
  451. os_socket_set_ip_drop_membership(bh_socket_t socket,
  452. bh_ip_addr_buffer_t *imr_multiaddr,
  453. uint32_t imr_interface, bool is_ipv6)
  454. {
  455. CHECK_VALID_SOCKET_HANDLE(socket);
  456. errno = ENOSYS;
  457. return BHT_ERROR;
  458. }
  459. int
  460. os_socket_set_ip_ttl(bh_socket_t socket, uint8_t ttl_s)
  461. {
  462. CHECK_VALID_SOCKET_HANDLE(socket);
  463. errno = ENOSYS;
  464. return BHT_ERROR;
  465. }
  466. int
  467. os_socket_get_ip_ttl(bh_socket_t socket, uint8_t *ttl_s)
  468. {
  469. CHECK_VALID_SOCKET_HANDLE(socket);
  470. errno = ENOSYS;
  471. return BHT_ERROR;
  472. }
  473. int
  474. os_socket_set_ip_multicast_ttl(bh_socket_t socket, uint8_t ttl_s)
  475. {
  476. CHECK_VALID_SOCKET_HANDLE(socket);
  477. errno = ENOSYS;
  478. return BHT_ERROR;
  479. }
  480. int
  481. os_socket_get_ip_multicast_ttl(bh_socket_t socket, uint8_t *ttl_s)
  482. {
  483. CHECK_VALID_SOCKET_HANDLE(socket);
  484. errno = ENOSYS;
  485. return BHT_ERROR;
  486. }
  487. int
  488. os_socket_set_ipv6_only(bh_socket_t socket, bool option)
  489. {
  490. CHECK_VALID_SOCKET_HANDLE(socket);
  491. errno = ENOSYS;
  492. return BHT_ERROR;
  493. }
  494. int
  495. os_socket_get_ipv6_only(bh_socket_t socket, bool *option)
  496. {
  497. CHECK_VALID_SOCKET_HANDLE(socket);
  498. errno = ENOSYS;
  499. return BHT_ERROR;
  500. }
  501. int
  502. os_socket_set_broadcast(bh_socket_t socket, bool is_enabled)
  503. {
  504. CHECK_VALID_SOCKET_HANDLE(socket);
  505. errno = ENOSYS;
  506. return BHT_ERROR;
  507. }
  508. int
  509. os_socket_get_broadcast(bh_socket_t socket, bool *is_enabled)
  510. {
  511. CHECK_VALID_SOCKET_HANDLE(socket);
  512. errno = ENOSYS;
  513. return BHT_ERROR;
  514. }