socket.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783
  1. /*
  2. * QEMU System Emulator
  3. *
  4. * Copyright (c) 2003-2008 Fabrice Bellard
  5. *
  6. * Permission is hereby granted, free of charge, to any person obtaining a copy
  7. * of this software and associated documentation files (the "Software"), to deal
  8. * in the Software without restriction, including without limitation the rights
  9. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10. * copies of the Software, and to permit persons to whom the Software is
  11. * furnished to do so, subject to the following conditions:
  12. *
  13. * The above copyright notice and this permission notice shall be included in
  14. * all copies or substantial portions of the Software.
  15. *
  16. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  19. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22. * THE SOFTWARE.
  23. */
  24. #include "qemu/osdep.h"
  25. #include "net/net.h"
  26. #include "clients.h"
  27. #include "monitor/monitor.h"
  28. #include "qapi/error.h"
  29. #include "qemu-common.h"
  30. #include "qemu/error-report.h"
  31. #include "qemu/option.h"
  32. #include "qemu/sockets.h"
  33. #include "qemu/iov.h"
  34. #include "qemu/main-loop.h"
  35. typedef struct NetSocketState {
  36. NetClientState nc;
  37. int listen_fd;
  38. int fd;
  39. SocketReadState rs;
  40. unsigned int send_index; /* number of bytes sent (only SOCK_STREAM) */
  41. struct sockaddr_in dgram_dst; /* contains inet host and port destination iff connectionless (SOCK_DGRAM) */
  42. IOHandler *send_fn; /* differs between SOCK_STREAM/SOCK_DGRAM */
  43. bool read_poll; /* waiting to receive data? */
  44. bool write_poll; /* waiting to transmit data? */
  45. } NetSocketState;
  46. static void net_socket_accept(void *opaque);
  47. static void net_socket_writable(void *opaque);
  48. static void net_socket_update_fd_handler(NetSocketState *s)
  49. {
  50. qemu_set_fd_handler(s->fd,
  51. s->read_poll ? s->send_fn : NULL,
  52. s->write_poll ? net_socket_writable : NULL,
  53. s);
  54. }
  55. static void net_socket_read_poll(NetSocketState *s, bool enable)
  56. {
  57. s->read_poll = enable;
  58. net_socket_update_fd_handler(s);
  59. }
  60. static void net_socket_write_poll(NetSocketState *s, bool enable)
  61. {
  62. s->write_poll = enable;
  63. net_socket_update_fd_handler(s);
  64. }
  65. static void net_socket_writable(void *opaque)
  66. {
  67. NetSocketState *s = opaque;
  68. net_socket_write_poll(s, false);
  69. qemu_flush_queued_packets(&s->nc);
  70. }
  71. static ssize_t net_socket_receive(NetClientState *nc, const uint8_t *buf, size_t size)
  72. {
  73. NetSocketState *s = DO_UPCAST(NetSocketState, nc, nc);
  74. uint32_t len = htonl(size);
  75. struct iovec iov[] = {
  76. {
  77. .iov_base = &len,
  78. .iov_len = sizeof(len),
  79. }, {
  80. .iov_base = (void *)buf,
  81. .iov_len = size,
  82. },
  83. };
  84. size_t remaining;
  85. ssize_t ret;
  86. remaining = iov_size(iov, 2) - s->send_index;
  87. ret = iov_send(s->fd, iov, 2, s->send_index, remaining);
  88. if (ret == -1 && errno == EAGAIN) {
  89. ret = 0; /* handled further down */
  90. }
  91. if (ret == -1) {
  92. s->send_index = 0;
  93. return -errno;
  94. }
  95. if (ret < (ssize_t)remaining) {
  96. s->send_index += ret;
  97. net_socket_write_poll(s, true);
  98. return 0;
  99. }
  100. s->send_index = 0;
  101. return size;
  102. }
  103. static ssize_t net_socket_receive_dgram(NetClientState *nc, const uint8_t *buf, size_t size)
  104. {
  105. NetSocketState *s = DO_UPCAST(NetSocketState, nc, nc);
  106. ssize_t ret;
  107. do {
  108. if (s->dgram_dst.sin_family != AF_UNIX) {
  109. ret = qemu_sendto(s->fd, buf, size, 0,
  110. (struct sockaddr *)&s->dgram_dst,
  111. sizeof(s->dgram_dst));
  112. } else {
  113. ret = send(s->fd, buf, size, 0);
  114. }
  115. } while (ret == -1 && errno == EINTR);
  116. if (ret == -1 && errno == EAGAIN) {
  117. net_socket_write_poll(s, true);
  118. return 0;
  119. }
  120. return ret;
  121. }
  122. static void net_socket_send_completed(NetClientState *nc, ssize_t len)
  123. {
  124. NetSocketState *s = DO_UPCAST(NetSocketState, nc, nc);
  125. if (!s->read_poll) {
  126. net_socket_read_poll(s, true);
  127. }
  128. }
  129. static void net_socket_rs_finalize(SocketReadState *rs)
  130. {
  131. NetSocketState *s = container_of(rs, NetSocketState, rs);
  132. if (qemu_send_packet_async(&s->nc, rs->buf,
  133. rs->packet_len,
  134. net_socket_send_completed) == 0) {
  135. net_socket_read_poll(s, false);
  136. }
  137. }
  138. static void net_socket_send(void *opaque)
  139. {
  140. NetSocketState *s = opaque;
  141. int size;
  142. int ret;
  143. uint8_t buf1[NET_BUFSIZE];
  144. const uint8_t *buf;
  145. size = qemu_recv(s->fd, buf1, sizeof(buf1), 0);
  146. if (size < 0) {
  147. if (errno != EWOULDBLOCK)
  148. goto eoc;
  149. } else if (size == 0) {
  150. /* end of connection */
  151. eoc:
  152. net_socket_read_poll(s, false);
  153. net_socket_write_poll(s, false);
  154. if (s->listen_fd != -1) {
  155. qemu_set_fd_handler(s->listen_fd, net_socket_accept, NULL, s);
  156. }
  157. closesocket(s->fd);
  158. s->fd = -1;
  159. net_socket_rs_init(&s->rs, net_socket_rs_finalize, false);
  160. s->nc.link_down = true;
  161. memset(s->nc.info_str, 0, sizeof(s->nc.info_str));
  162. return;
  163. }
  164. buf = buf1;
  165. ret = net_fill_rstate(&s->rs, buf, size);
  166. if (ret == -1) {
  167. goto eoc;
  168. }
  169. }
  170. static void net_socket_send_dgram(void *opaque)
  171. {
  172. NetSocketState *s = opaque;
  173. int size;
  174. size = qemu_recv(s->fd, s->rs.buf, sizeof(s->rs.buf), 0);
  175. if (size < 0)
  176. return;
  177. if (size == 0) {
  178. /* end of connection */
  179. net_socket_read_poll(s, false);
  180. net_socket_write_poll(s, false);
  181. return;
  182. }
  183. if (qemu_send_packet_async(&s->nc, s->rs.buf, size,
  184. net_socket_send_completed) == 0) {
  185. net_socket_read_poll(s, false);
  186. }
  187. }
  188. static int net_socket_mcast_create(struct sockaddr_in *mcastaddr,
  189. struct in_addr *localaddr,
  190. Error **errp)
  191. {
  192. struct ip_mreq imr;
  193. int fd;
  194. int val, ret;
  195. #ifdef __OpenBSD__
  196. unsigned char loop;
  197. #else
  198. int loop;
  199. #endif
  200. if (!IN_MULTICAST(ntohl(mcastaddr->sin_addr.s_addr))) {
  201. error_setg(errp, "specified mcastaddr %s (0x%08x) "
  202. "does not contain a multicast address",
  203. inet_ntoa(mcastaddr->sin_addr),
  204. (int)ntohl(mcastaddr->sin_addr.s_addr));
  205. return -1;
  206. }
  207. fd = qemu_socket(PF_INET, SOCK_DGRAM, 0);
  208. if (fd < 0) {
  209. error_setg_errno(errp, errno, "can't create datagram socket");
  210. return -1;
  211. }
  212. /* Allow multiple sockets to bind the same multicast ip and port by setting
  213. * SO_REUSEADDR. This is the only situation where SO_REUSEADDR should be set
  214. * on windows. Use socket_set_fast_reuse otherwise as it sets SO_REUSEADDR
  215. * only on posix systems.
  216. */
  217. val = 1;
  218. ret = qemu_setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
  219. if (ret < 0) {
  220. error_setg_errno(errp, errno,
  221. "can't set socket option SO_REUSEADDR");
  222. goto fail;
  223. }
  224. ret = bind(fd, (struct sockaddr *)mcastaddr, sizeof(*mcastaddr));
  225. if (ret < 0) {
  226. error_setg_errno(errp, errno, "can't bind ip=%s to socket",
  227. inet_ntoa(mcastaddr->sin_addr));
  228. goto fail;
  229. }
  230. /* Add host to multicast group */
  231. imr.imr_multiaddr = mcastaddr->sin_addr;
  232. if (localaddr) {
  233. imr.imr_interface = *localaddr;
  234. } else {
  235. imr.imr_interface.s_addr = htonl(INADDR_ANY);
  236. }
  237. ret = qemu_setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
  238. &imr, sizeof(struct ip_mreq));
  239. if (ret < 0) {
  240. error_setg_errno(errp, errno,
  241. "can't add socket to multicast group %s",
  242. inet_ntoa(imr.imr_multiaddr));
  243. goto fail;
  244. }
  245. /* Force mcast msgs to loopback (eg. several QEMUs in same host */
  246. loop = 1;
  247. ret = qemu_setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,
  248. &loop, sizeof(loop));
  249. if (ret < 0) {
  250. error_setg_errno(errp, errno,
  251. "can't force multicast message to loopback");
  252. goto fail;
  253. }
  254. /* If a bind address is given, only send packets from that address */
  255. if (localaddr != NULL) {
  256. ret = qemu_setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
  257. localaddr, sizeof(*localaddr));
  258. if (ret < 0) {
  259. error_setg_errno(errp, errno,
  260. "can't set the default network send interface");
  261. goto fail;
  262. }
  263. }
  264. qemu_set_nonblock(fd);
  265. return fd;
  266. fail:
  267. if (fd >= 0)
  268. closesocket(fd);
  269. return -1;
  270. }
  271. static void net_socket_cleanup(NetClientState *nc)
  272. {
  273. NetSocketState *s = DO_UPCAST(NetSocketState, nc, nc);
  274. if (s->fd != -1) {
  275. net_socket_read_poll(s, false);
  276. net_socket_write_poll(s, false);
  277. close(s->fd);
  278. s->fd = -1;
  279. }
  280. if (s->listen_fd != -1) {
  281. qemu_set_fd_handler(s->listen_fd, NULL, NULL, NULL);
  282. closesocket(s->listen_fd);
  283. s->listen_fd = -1;
  284. }
  285. }
  286. static NetClientInfo net_dgram_socket_info = {
  287. .type = NET_CLIENT_DRIVER_SOCKET,
  288. .size = sizeof(NetSocketState),
  289. .receive = net_socket_receive_dgram,
  290. .cleanup = net_socket_cleanup,
  291. };
  292. static NetSocketState *net_socket_fd_init_dgram(NetClientState *peer,
  293. const char *model,
  294. const char *name,
  295. int fd, int is_connected,
  296. const char *mcast,
  297. Error **errp)
  298. {
  299. struct sockaddr_in saddr;
  300. int newfd;
  301. NetClientState *nc;
  302. NetSocketState *s;
  303. SocketAddress *sa;
  304. SocketAddressType sa_type;
  305. sa = socket_local_address(fd, errp);
  306. if (!sa) {
  307. return NULL;
  308. }
  309. sa_type = sa->type;
  310. qapi_free_SocketAddress(sa);
  311. /* fd passed: multicast: "learn" dgram_dst address from bound address and save it
  312. * Because this may be "shared" socket from a "master" process, datagrams would be recv()
  313. * by ONLY ONE process: we must "clone" this dgram socket --jjo
  314. */
  315. if (is_connected && mcast != NULL) {
  316. if (parse_host_port(&saddr, mcast, errp) < 0) {
  317. goto err;
  318. }
  319. /* must be bound */
  320. if (saddr.sin_addr.s_addr == 0) {
  321. error_setg(errp, "can't setup multicast destination address");
  322. goto err;
  323. }
  324. /* clone dgram socket */
  325. newfd = net_socket_mcast_create(&saddr, NULL, errp);
  326. if (newfd < 0) {
  327. goto err;
  328. }
  329. /* clone newfd to fd, close newfd */
  330. dup2(newfd, fd);
  331. close(newfd);
  332. }
  333. nc = qemu_new_net_client(&net_dgram_socket_info, peer, model, name);
  334. s = DO_UPCAST(NetSocketState, nc, nc);
  335. s->fd = fd;
  336. s->listen_fd = -1;
  337. s->send_fn = net_socket_send_dgram;
  338. net_socket_rs_init(&s->rs, net_socket_rs_finalize, false);
  339. net_socket_read_poll(s, true);
  340. /* mcast: save bound address as dst */
  341. if (is_connected && mcast != NULL) {
  342. s->dgram_dst = saddr;
  343. snprintf(nc->info_str, sizeof(nc->info_str),
  344. "socket: fd=%d (cloned mcast=%s:%d)",
  345. fd, inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
  346. } else {
  347. if (sa_type == SOCKET_ADDRESS_TYPE_UNIX) {
  348. s->dgram_dst.sin_family = AF_UNIX;
  349. }
  350. snprintf(nc->info_str, sizeof(nc->info_str),
  351. "socket: fd=%d %s", fd, SocketAddressType_str(sa_type));
  352. }
  353. return s;
  354. err:
  355. closesocket(fd);
  356. return NULL;
  357. }
  358. static void net_socket_connect(void *opaque)
  359. {
  360. NetSocketState *s = opaque;
  361. s->send_fn = net_socket_send;
  362. net_socket_read_poll(s, true);
  363. }
  364. static NetClientInfo net_socket_info = {
  365. .type = NET_CLIENT_DRIVER_SOCKET,
  366. .size = sizeof(NetSocketState),
  367. .receive = net_socket_receive,
  368. .cleanup = net_socket_cleanup,
  369. };
  370. static NetSocketState *net_socket_fd_init_stream(NetClientState *peer,
  371. const char *model,
  372. const char *name,
  373. int fd, int is_connected)
  374. {
  375. NetClientState *nc;
  376. NetSocketState *s;
  377. nc = qemu_new_net_client(&net_socket_info, peer, model, name);
  378. snprintf(nc->info_str, sizeof(nc->info_str), "socket: fd=%d", fd);
  379. s = DO_UPCAST(NetSocketState, nc, nc);
  380. s->fd = fd;
  381. s->listen_fd = -1;
  382. net_socket_rs_init(&s->rs, net_socket_rs_finalize, false);
  383. /* Disable Nagle algorithm on TCP sockets to reduce latency */
  384. socket_set_nodelay(fd);
  385. if (is_connected) {
  386. net_socket_connect(s);
  387. } else {
  388. qemu_set_fd_handler(s->fd, NULL, net_socket_connect, s);
  389. }
  390. return s;
  391. }
  392. static NetSocketState *net_socket_fd_init(NetClientState *peer,
  393. const char *model, const char *name,
  394. int fd, int is_connected,
  395. const char *mc, Error **errp)
  396. {
  397. int so_type = -1, optlen=sizeof(so_type);
  398. if(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&so_type,
  399. (socklen_t *)&optlen)< 0) {
  400. error_setg(errp, "can't get socket option SO_TYPE");
  401. closesocket(fd);
  402. return NULL;
  403. }
  404. switch(so_type) {
  405. case SOCK_DGRAM:
  406. return net_socket_fd_init_dgram(peer, model, name, fd, is_connected,
  407. mc, errp);
  408. case SOCK_STREAM:
  409. return net_socket_fd_init_stream(peer, model, name, fd, is_connected);
  410. default:
  411. error_setg(errp, "socket type=%d for fd=%d must be either"
  412. " SOCK_DGRAM or SOCK_STREAM", so_type, fd);
  413. closesocket(fd);
  414. }
  415. return NULL;
  416. }
  417. static void net_socket_accept(void *opaque)
  418. {
  419. NetSocketState *s = opaque;
  420. struct sockaddr_in saddr;
  421. socklen_t len;
  422. int fd;
  423. for(;;) {
  424. len = sizeof(saddr);
  425. fd = qemu_accept(s->listen_fd, (struct sockaddr *)&saddr, &len);
  426. if (fd < 0 && errno != EINTR) {
  427. return;
  428. } else if (fd >= 0) {
  429. qemu_set_fd_handler(s->listen_fd, NULL, NULL, NULL);
  430. break;
  431. }
  432. }
  433. s->fd = fd;
  434. s->nc.link_down = false;
  435. net_socket_connect(s);
  436. snprintf(s->nc.info_str, sizeof(s->nc.info_str),
  437. "socket: connection from %s:%d",
  438. inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
  439. }
  440. static int net_socket_listen_init(NetClientState *peer,
  441. const char *model,
  442. const char *name,
  443. const char *host_str,
  444. Error **errp)
  445. {
  446. NetClientState *nc;
  447. NetSocketState *s;
  448. struct sockaddr_in saddr;
  449. int fd, ret;
  450. if (parse_host_port(&saddr, host_str, errp) < 0) {
  451. return -1;
  452. }
  453. fd = qemu_socket(PF_INET, SOCK_STREAM, 0);
  454. if (fd < 0) {
  455. error_setg_errno(errp, errno, "can't create stream socket");
  456. return -1;
  457. }
  458. qemu_set_nonblock(fd);
  459. socket_set_fast_reuse(fd);
  460. ret = bind(fd, (struct sockaddr *)&saddr, sizeof(saddr));
  461. if (ret < 0) {
  462. error_setg_errno(errp, errno, "can't bind ip=%s to socket",
  463. inet_ntoa(saddr.sin_addr));
  464. closesocket(fd);
  465. return -1;
  466. }
  467. ret = listen(fd, 0);
  468. if (ret < 0) {
  469. error_setg_errno(errp, errno, "can't listen on socket");
  470. closesocket(fd);
  471. return -1;
  472. }
  473. nc = qemu_new_net_client(&net_socket_info, peer, model, name);
  474. s = DO_UPCAST(NetSocketState, nc, nc);
  475. s->fd = -1;
  476. s->listen_fd = fd;
  477. s->nc.link_down = true;
  478. net_socket_rs_init(&s->rs, net_socket_rs_finalize, false);
  479. qemu_set_fd_handler(s->listen_fd, net_socket_accept, NULL, s);
  480. return 0;
  481. }
  482. static int net_socket_connect_init(NetClientState *peer,
  483. const char *model,
  484. const char *name,
  485. const char *host_str,
  486. Error **errp)
  487. {
  488. NetSocketState *s;
  489. int fd, connected, ret;
  490. struct sockaddr_in saddr;
  491. if (parse_host_port(&saddr, host_str, errp) < 0) {
  492. return -1;
  493. }
  494. fd = qemu_socket(PF_INET, SOCK_STREAM, 0);
  495. if (fd < 0) {
  496. error_setg_errno(errp, errno, "can't create stream socket");
  497. return -1;
  498. }
  499. qemu_set_nonblock(fd);
  500. connected = 0;
  501. for(;;) {
  502. ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr));
  503. if (ret < 0) {
  504. if (errno == EINTR || errno == EWOULDBLOCK) {
  505. /* continue */
  506. } else if (errno == EINPROGRESS ||
  507. errno == EALREADY ||
  508. errno == EINVAL) {
  509. break;
  510. } else {
  511. error_setg_errno(errp, errno, "can't connect socket");
  512. closesocket(fd);
  513. return -1;
  514. }
  515. } else {
  516. connected = 1;
  517. break;
  518. }
  519. }
  520. s = net_socket_fd_init(peer, model, name, fd, connected, NULL, errp);
  521. if (!s) {
  522. return -1;
  523. }
  524. snprintf(s->nc.info_str, sizeof(s->nc.info_str),
  525. "socket: connect to %s:%d",
  526. inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
  527. return 0;
  528. }
  529. static int net_socket_mcast_init(NetClientState *peer,
  530. const char *model,
  531. const char *name,
  532. const char *host_str,
  533. const char *localaddr_str,
  534. Error **errp)
  535. {
  536. NetSocketState *s;
  537. int fd;
  538. struct sockaddr_in saddr;
  539. struct in_addr localaddr, *param_localaddr;
  540. if (parse_host_port(&saddr, host_str, errp) < 0) {
  541. return -1;
  542. }
  543. if (localaddr_str != NULL) {
  544. if (inet_aton(localaddr_str, &localaddr) == 0) {
  545. error_setg(errp, "localaddr '%s' is not a valid IPv4 address",
  546. localaddr_str);
  547. return -1;
  548. }
  549. param_localaddr = &localaddr;
  550. } else {
  551. param_localaddr = NULL;
  552. }
  553. fd = net_socket_mcast_create(&saddr, param_localaddr, errp);
  554. if (fd < 0) {
  555. return -1;
  556. }
  557. s = net_socket_fd_init(peer, model, name, fd, 0, NULL, errp);
  558. if (!s) {
  559. return -1;
  560. }
  561. s->dgram_dst = saddr;
  562. snprintf(s->nc.info_str, sizeof(s->nc.info_str),
  563. "socket: mcast=%s:%d",
  564. inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
  565. return 0;
  566. }
  567. static int net_socket_udp_init(NetClientState *peer,
  568. const char *model,
  569. const char *name,
  570. const char *rhost,
  571. const char *lhost,
  572. Error **errp)
  573. {
  574. NetSocketState *s;
  575. int fd, ret;
  576. struct sockaddr_in laddr, raddr;
  577. if (parse_host_port(&laddr, lhost, errp) < 0) {
  578. return -1;
  579. }
  580. if (parse_host_port(&raddr, rhost, errp) < 0) {
  581. return -1;
  582. }
  583. fd = qemu_socket(PF_INET, SOCK_DGRAM, 0);
  584. if (fd < 0) {
  585. error_setg_errno(errp, errno, "can't create datagram socket");
  586. return -1;
  587. }
  588. ret = socket_set_fast_reuse(fd);
  589. if (ret < 0) {
  590. error_setg_errno(errp, errno,
  591. "can't set socket option SO_REUSEADDR");
  592. closesocket(fd);
  593. return -1;
  594. }
  595. ret = bind(fd, (struct sockaddr *)&laddr, sizeof(laddr));
  596. if (ret < 0) {
  597. error_setg_errno(errp, errno, "can't bind ip=%s to socket",
  598. inet_ntoa(laddr.sin_addr));
  599. closesocket(fd);
  600. return -1;
  601. }
  602. qemu_set_nonblock(fd);
  603. s = net_socket_fd_init(peer, model, name, fd, 0, NULL, errp);
  604. if (!s) {
  605. return -1;
  606. }
  607. s->dgram_dst = raddr;
  608. snprintf(s->nc.info_str, sizeof(s->nc.info_str),
  609. "socket: udp=%s:%d",
  610. inet_ntoa(raddr.sin_addr), ntohs(raddr.sin_port));
  611. return 0;
  612. }
  613. int net_init_socket(const Netdev *netdev, const char *name,
  614. NetClientState *peer, Error **errp)
  615. {
  616. const NetdevSocketOptions *sock;
  617. assert(netdev->type == NET_CLIENT_DRIVER_SOCKET);
  618. sock = &netdev->u.socket;
  619. if (sock->has_fd + sock->has_listen + sock->has_connect + sock->has_mcast +
  620. sock->has_udp != 1) {
  621. error_setg(errp, "exactly one of listen=, connect=, mcast= or udp="
  622. " is required");
  623. return -1;
  624. }
  625. if (sock->has_localaddr && !sock->has_mcast && !sock->has_udp) {
  626. error_setg(errp, "localaddr= is only valid with mcast= or udp=");
  627. return -1;
  628. }
  629. if (sock->has_fd) {
  630. int fd, ret;
  631. fd = monitor_fd_param(cur_mon, sock->fd, errp);
  632. if (fd == -1) {
  633. return -1;
  634. }
  635. ret = qemu_try_set_nonblock(fd);
  636. if (ret < 0) {
  637. error_setg_errno(errp, -ret, "%s: Can't use file descriptor %d",
  638. name, fd);
  639. return -1;
  640. }
  641. if (!net_socket_fd_init(peer, "socket", name, fd, 1, sock->mcast,
  642. errp)) {
  643. return -1;
  644. }
  645. return 0;
  646. }
  647. if (sock->has_listen) {
  648. if (net_socket_listen_init(peer, "socket", name, sock->listen, errp)
  649. < 0) {
  650. return -1;
  651. }
  652. return 0;
  653. }
  654. if (sock->has_connect) {
  655. if (net_socket_connect_init(peer, "socket", name, sock->connect, errp)
  656. < 0) {
  657. return -1;
  658. }
  659. return 0;
  660. }
  661. if (sock->has_mcast) {
  662. /* if sock->localaddr is missing, it has been initialized to "all bits
  663. * zero" */
  664. if (net_socket_mcast_init(peer, "socket", name, sock->mcast,
  665. sock->localaddr, errp) < 0) {
  666. return -1;
  667. }
  668. return 0;
  669. }
  670. assert(sock->has_udp);
  671. if (!sock->has_localaddr) {
  672. error_setg(errp, "localaddr= is mandatory with udp=");
  673. return -1;
  674. }
  675. if (net_socket_udp_init(peer, "socket", name, sock->udp, sock->localaddr,
  676. errp) < 0) {
  677. return -1;
  678. }
  679. return 0;
  680. }