2
0

dgram.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623
  1. /*
  2. * QEMU System Emulator
  3. *
  4. * Copyright (c) 2003-2008 Fabrice Bellard
  5. * Copyright (c) 2022 Red Hat, Inc.
  6. *
  7. * Permission is hereby granted, free of charge, to any person obtaining a copy
  8. * of this software and associated documentation files (the "Software"), to deal
  9. * in the Software without restriction, including without limitation the rights
  10. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11. * copies of the Software, and to permit persons to whom the Software is
  12. * furnished to do so, subject to the following conditions:
  13. *
  14. * The above copyright notice and this permission notice shall be included in
  15. * all copies or substantial portions of the Software.
  16. *
  17. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  20. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  23. * THE SOFTWARE.
  24. */
  25. #include "qemu/osdep.h"
  26. #include "net/net.h"
  27. #include "clients.h"
  28. #include "monitor/monitor.h"
  29. #include "qapi/error.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. #include "qemu/cutils.h"
  36. typedef struct NetDgramState {
  37. NetClientState nc;
  38. int fd;
  39. SocketReadState rs;
  40. bool read_poll; /* waiting to receive data? */
  41. bool write_poll; /* waiting to transmit data? */
  42. /* contains destination iff connectionless */
  43. struct sockaddr *dest_addr;
  44. socklen_t dest_len;
  45. } NetDgramState;
  46. static void net_dgram_send(void *opaque);
  47. static void net_dgram_writable(void *opaque);
  48. static void net_dgram_update_fd_handler(NetDgramState *s)
  49. {
  50. qemu_set_fd_handler(s->fd,
  51. s->read_poll ? net_dgram_send : NULL,
  52. s->write_poll ? net_dgram_writable : NULL,
  53. s);
  54. }
  55. static void net_dgram_read_poll(NetDgramState *s, bool enable)
  56. {
  57. s->read_poll = enable;
  58. net_dgram_update_fd_handler(s);
  59. }
  60. static void net_dgram_write_poll(NetDgramState *s, bool enable)
  61. {
  62. s->write_poll = enable;
  63. net_dgram_update_fd_handler(s);
  64. }
  65. static void net_dgram_writable(void *opaque)
  66. {
  67. NetDgramState *s = opaque;
  68. net_dgram_write_poll(s, false);
  69. qemu_flush_queued_packets(&s->nc);
  70. }
  71. static ssize_t net_dgram_receive(NetClientState *nc,
  72. const uint8_t *buf, size_t size)
  73. {
  74. NetDgramState *s = DO_UPCAST(NetDgramState, nc, nc);
  75. ssize_t ret;
  76. do {
  77. if (s->dest_addr) {
  78. ret = sendto(s->fd, buf, size, 0, s->dest_addr, s->dest_len);
  79. } else {
  80. ret = send(s->fd, buf, size, 0);
  81. }
  82. } while (ret == -1 && errno == EINTR);
  83. if (ret == -1 && errno == EAGAIN) {
  84. net_dgram_write_poll(s, true);
  85. return 0;
  86. }
  87. return ret;
  88. }
  89. static void net_dgram_send_completed(NetClientState *nc, ssize_t len)
  90. {
  91. NetDgramState *s = DO_UPCAST(NetDgramState, nc, nc);
  92. if (!s->read_poll) {
  93. net_dgram_read_poll(s, true);
  94. }
  95. }
  96. static void net_dgram_rs_finalize(SocketReadState *rs)
  97. {
  98. NetDgramState *s = container_of(rs, NetDgramState, rs);
  99. if (qemu_send_packet_async(&s->nc, rs->buf,
  100. rs->packet_len,
  101. net_dgram_send_completed) == 0) {
  102. net_dgram_read_poll(s, false);
  103. }
  104. }
  105. static void net_dgram_send(void *opaque)
  106. {
  107. NetDgramState *s = opaque;
  108. int size;
  109. size = recv(s->fd, s->rs.buf, sizeof(s->rs.buf), 0);
  110. if (size < 0) {
  111. return;
  112. }
  113. if (size == 0) {
  114. /* end of connection */
  115. net_dgram_read_poll(s, false);
  116. net_dgram_write_poll(s, false);
  117. return;
  118. }
  119. if (qemu_send_packet_async(&s->nc, s->rs.buf, size,
  120. net_dgram_send_completed) == 0) {
  121. net_dgram_read_poll(s, false);
  122. }
  123. }
  124. static int net_dgram_mcast_create(struct sockaddr_in *mcastaddr,
  125. struct in_addr *localaddr,
  126. Error **errp)
  127. {
  128. struct ip_mreq imr;
  129. int fd;
  130. int val, ret;
  131. #ifdef __OpenBSD__
  132. unsigned char loop;
  133. #else
  134. int loop;
  135. #endif
  136. if (!IN_MULTICAST(ntohl(mcastaddr->sin_addr.s_addr))) {
  137. error_setg(errp, "specified mcastaddr %s (0x%08x) "
  138. "does not contain a multicast address",
  139. inet_ntoa(mcastaddr->sin_addr),
  140. (int)ntohl(mcastaddr->sin_addr.s_addr));
  141. return -1;
  142. }
  143. fd = qemu_socket(PF_INET, SOCK_DGRAM, 0);
  144. if (fd < 0) {
  145. error_setg_errno(errp, errno, "can't create datagram socket");
  146. return -1;
  147. }
  148. /*
  149. * Allow multiple sockets to bind the same multicast ip and port by setting
  150. * SO_REUSEADDR. This is the only situation where SO_REUSEADDR should be set
  151. * on windows. Use socket_set_fast_reuse otherwise as it sets SO_REUSEADDR
  152. * only on posix systems.
  153. */
  154. val = 1;
  155. ret = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
  156. if (ret < 0) {
  157. error_setg_errno(errp, errno, "can't set socket option SO_REUSEADDR");
  158. goto fail;
  159. }
  160. ret = bind(fd, (struct sockaddr *)mcastaddr, sizeof(*mcastaddr));
  161. if (ret < 0) {
  162. error_setg_errno(errp, errno, "can't bind ip=%s to socket",
  163. inet_ntoa(mcastaddr->sin_addr));
  164. goto fail;
  165. }
  166. /* Add host to multicast group */
  167. imr.imr_multiaddr = mcastaddr->sin_addr;
  168. if (localaddr) {
  169. imr.imr_interface = *localaddr;
  170. } else {
  171. imr.imr_interface.s_addr = htonl(INADDR_ANY);
  172. }
  173. ret = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
  174. &imr, sizeof(struct ip_mreq));
  175. if (ret < 0) {
  176. error_setg_errno(errp, errno,
  177. "can't add socket to multicast group %s",
  178. inet_ntoa(imr.imr_multiaddr));
  179. goto fail;
  180. }
  181. /* Force mcast msgs to loopback (eg. several QEMUs in same host */
  182. loop = 1;
  183. ret = setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,
  184. &loop, sizeof(loop));
  185. if (ret < 0) {
  186. error_setg_errno(errp, errno,
  187. "can't force multicast message to loopback");
  188. goto fail;
  189. }
  190. /* If a bind address is given, only send packets from that address */
  191. if (localaddr != NULL) {
  192. ret = setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
  193. localaddr, sizeof(*localaddr));
  194. if (ret < 0) {
  195. error_setg_errno(errp, errno,
  196. "can't set the default network send interface");
  197. goto fail;
  198. }
  199. }
  200. qemu_socket_set_nonblock(fd);
  201. return fd;
  202. fail:
  203. if (fd >= 0) {
  204. close(fd);
  205. }
  206. return -1;
  207. }
  208. static void net_dgram_cleanup(NetClientState *nc)
  209. {
  210. NetDgramState *s = DO_UPCAST(NetDgramState, nc, nc);
  211. if (s->fd != -1) {
  212. net_dgram_read_poll(s, false);
  213. net_dgram_write_poll(s, false);
  214. close(s->fd);
  215. s->fd = -1;
  216. }
  217. g_free(s->dest_addr);
  218. s->dest_addr = NULL;
  219. s->dest_len = 0;
  220. }
  221. static NetClientInfo net_dgram_socket_info = {
  222. .type = NET_CLIENT_DRIVER_DGRAM,
  223. .size = sizeof(NetDgramState),
  224. .receive = net_dgram_receive,
  225. .cleanup = net_dgram_cleanup,
  226. };
  227. static NetDgramState *net_dgram_fd_init(NetClientState *peer,
  228. const char *model,
  229. const char *name,
  230. int fd,
  231. Error **errp)
  232. {
  233. NetClientState *nc;
  234. NetDgramState *s;
  235. nc = qemu_new_net_client(&net_dgram_socket_info, peer, model, name);
  236. s = DO_UPCAST(NetDgramState, nc, nc);
  237. s->fd = fd;
  238. net_socket_rs_init(&s->rs, net_dgram_rs_finalize, false);
  239. net_dgram_read_poll(s, true);
  240. return s;
  241. }
  242. static int net_dgram_mcast_init(NetClientState *peer,
  243. const char *model,
  244. const char *name,
  245. SocketAddress *remote,
  246. SocketAddress *local,
  247. Error **errp)
  248. {
  249. NetDgramState *s;
  250. int fd, ret;
  251. struct sockaddr_in *saddr;
  252. if (remote->type != SOCKET_ADDRESS_TYPE_INET) {
  253. error_setg(errp, "multicast only support inet type");
  254. return -1;
  255. }
  256. saddr = g_new(struct sockaddr_in, 1);
  257. if (convert_host_port(saddr, remote->u.inet.host, remote->u.inet.port,
  258. errp) < 0) {
  259. g_free(saddr);
  260. return -1;
  261. }
  262. if (!local) {
  263. fd = net_dgram_mcast_create(saddr, NULL, errp);
  264. if (fd < 0) {
  265. g_free(saddr);
  266. return -1;
  267. }
  268. } else {
  269. switch (local->type) {
  270. case SOCKET_ADDRESS_TYPE_INET: {
  271. struct in_addr localaddr;
  272. if (inet_aton(local->u.inet.host, &localaddr) == 0) {
  273. g_free(saddr);
  274. error_setg(errp, "localaddr '%s' is not a valid IPv4 address",
  275. local->u.inet.host);
  276. return -1;
  277. }
  278. fd = net_dgram_mcast_create(saddr, &localaddr, errp);
  279. if (fd < 0) {
  280. g_free(saddr);
  281. return -1;
  282. }
  283. break;
  284. }
  285. case SOCKET_ADDRESS_TYPE_FD: {
  286. int newfd;
  287. fd = monitor_fd_param(monitor_cur(), local->u.fd.str, errp);
  288. if (fd == -1) {
  289. g_free(saddr);
  290. return -1;
  291. }
  292. ret = qemu_socket_try_set_nonblock(fd);
  293. if (ret < 0) {
  294. g_free(saddr);
  295. error_setg_errno(errp, -ret, "%s: Can't use file descriptor %d",
  296. name, fd);
  297. return -1;
  298. }
  299. /*
  300. * fd passed: multicast: "learn" dest_addr address from bound
  301. * address and save it. Because this may be "shared" socket from a
  302. * "master" process, datagrams would be recv() by ONLY ONE process:
  303. * we must "clone" this dgram socket --jjo
  304. */
  305. saddr = g_new(struct sockaddr_in, 1);
  306. if (convert_host_port(saddr, local->u.inet.host, local->u.inet.port,
  307. errp) < 0) {
  308. g_free(saddr);
  309. close(fd);
  310. return -1;
  311. }
  312. /* must be bound */
  313. if (saddr->sin_addr.s_addr == 0) {
  314. error_setg(errp, "can't setup multicast destination address");
  315. g_free(saddr);
  316. close(fd);
  317. return -1;
  318. }
  319. /* clone dgram socket */
  320. newfd = net_dgram_mcast_create(saddr, NULL, errp);
  321. if (newfd < 0) {
  322. g_free(saddr);
  323. close(fd);
  324. return -1;
  325. }
  326. /* clone newfd to fd, close newfd */
  327. dup2(newfd, fd);
  328. close(newfd);
  329. break;
  330. }
  331. default:
  332. g_free(saddr);
  333. error_setg(errp, "only support inet or fd type for local");
  334. return -1;
  335. }
  336. }
  337. s = net_dgram_fd_init(peer, model, name, fd, errp);
  338. if (!s) {
  339. g_free(saddr);
  340. return -1;
  341. }
  342. g_assert(s->dest_addr == NULL);
  343. s->dest_addr = (struct sockaddr *)saddr;
  344. s->dest_len = sizeof(*saddr);
  345. if (!local) {
  346. qemu_set_info_str(&s->nc, "mcast=%s:%d",
  347. inet_ntoa(saddr->sin_addr),
  348. ntohs(saddr->sin_port));
  349. } else {
  350. switch (local->type) {
  351. case SOCKET_ADDRESS_TYPE_INET:
  352. qemu_set_info_str(&s->nc, "mcast=%s:%d",
  353. inet_ntoa(saddr->sin_addr),
  354. ntohs(saddr->sin_port));
  355. break;
  356. case SOCKET_ADDRESS_TYPE_FD:
  357. qemu_set_info_str(&s->nc, "fd=%d (cloned mcast=%s:%d)",
  358. fd, inet_ntoa(saddr->sin_addr),
  359. ntohs(saddr->sin_port));
  360. break;
  361. default:
  362. g_assert_not_reached();
  363. }
  364. }
  365. return 0;
  366. }
  367. int net_init_dgram(const Netdev *netdev, const char *name,
  368. NetClientState *peer, Error **errp)
  369. {
  370. NetDgramState *s;
  371. int fd, ret;
  372. SocketAddress *remote, *local;
  373. struct sockaddr *dest_addr;
  374. struct sockaddr_in laddr_in, raddr_in;
  375. struct sockaddr_un laddr_un, raddr_un;
  376. socklen_t dest_len;
  377. assert(netdev->type == NET_CLIENT_DRIVER_DGRAM);
  378. remote = netdev->u.dgram.remote;
  379. local = netdev->u.dgram.local;
  380. /* detect multicast address */
  381. if (remote && remote->type == SOCKET_ADDRESS_TYPE_INET) {
  382. struct sockaddr_in mcastaddr;
  383. if (convert_host_port(&mcastaddr, remote->u.inet.host,
  384. remote->u.inet.port, errp) < 0) {
  385. return -1;
  386. }
  387. if (IN_MULTICAST(ntohl(mcastaddr.sin_addr.s_addr))) {
  388. return net_dgram_mcast_init(peer, "dram", name, remote, local,
  389. errp);
  390. }
  391. }
  392. /* unicast address */
  393. if (!local) {
  394. error_setg(errp, "dgram requires local= parameter");
  395. return -1;
  396. }
  397. if (remote) {
  398. if (local->type == SOCKET_ADDRESS_TYPE_FD) {
  399. error_setg(errp, "don't set remote with local.fd");
  400. return -1;
  401. }
  402. if (remote->type != local->type) {
  403. error_setg(errp, "remote and local types must be the same");
  404. return -1;
  405. }
  406. } else {
  407. if (local->type != SOCKET_ADDRESS_TYPE_FD) {
  408. error_setg(errp,
  409. "type=inet or type=unix requires remote parameter");
  410. return -1;
  411. }
  412. }
  413. switch (local->type) {
  414. case SOCKET_ADDRESS_TYPE_INET:
  415. if (convert_host_port(&laddr_in, local->u.inet.host, local->u.inet.port,
  416. errp) < 0) {
  417. return -1;
  418. }
  419. if (convert_host_port(&raddr_in, remote->u.inet.host,
  420. remote->u.inet.port, errp) < 0) {
  421. return -1;
  422. }
  423. fd = qemu_socket(PF_INET, SOCK_DGRAM, 0);
  424. if (fd < 0) {
  425. error_setg_errno(errp, errno, "can't create datagram socket");
  426. return -1;
  427. }
  428. ret = socket_set_fast_reuse(fd);
  429. if (ret < 0) {
  430. error_setg_errno(errp, errno,
  431. "can't set socket option SO_REUSEADDR");
  432. close(fd);
  433. return -1;
  434. }
  435. ret = bind(fd, (struct sockaddr *)&laddr_in, sizeof(laddr_in));
  436. if (ret < 0) {
  437. error_setg_errno(errp, errno, "can't bind ip=%s to socket",
  438. inet_ntoa(laddr_in.sin_addr));
  439. close(fd);
  440. return -1;
  441. }
  442. qemu_socket_set_nonblock(fd);
  443. dest_len = sizeof(raddr_in);
  444. dest_addr = g_malloc(dest_len);
  445. memcpy(dest_addr, &raddr_in, dest_len);
  446. break;
  447. case SOCKET_ADDRESS_TYPE_UNIX:
  448. ret = unlink(local->u.q_unix.path);
  449. if (ret < 0 && errno != ENOENT) {
  450. error_setg_errno(errp, errno, "failed to unlink socket %s",
  451. local->u.q_unix.path);
  452. return -1;
  453. }
  454. laddr_un.sun_family = PF_UNIX;
  455. ret = snprintf(laddr_un.sun_path, sizeof(laddr_un.sun_path), "%s",
  456. local->u.q_unix.path);
  457. if (ret < 0 || ret >= sizeof(laddr_un.sun_path)) {
  458. error_setg(errp, "UNIX socket path '%s' is too long",
  459. local->u.q_unix.path);
  460. error_append_hint(errp, "Path must be less than %zu bytes\n",
  461. sizeof(laddr_un.sun_path));
  462. }
  463. raddr_un.sun_family = PF_UNIX;
  464. ret = snprintf(raddr_un.sun_path, sizeof(raddr_un.sun_path), "%s",
  465. remote->u.q_unix.path);
  466. if (ret < 0 || ret >= sizeof(raddr_un.sun_path)) {
  467. error_setg(errp, "UNIX socket path '%s' is too long",
  468. remote->u.q_unix.path);
  469. error_append_hint(errp, "Path must be less than %zu bytes\n",
  470. sizeof(raddr_un.sun_path));
  471. }
  472. fd = qemu_socket(PF_UNIX, SOCK_DGRAM, 0);
  473. if (fd < 0) {
  474. error_setg_errno(errp, errno, "can't create datagram socket");
  475. return -1;
  476. }
  477. ret = bind(fd, (struct sockaddr *)&laddr_un, sizeof(laddr_un));
  478. if (ret < 0) {
  479. error_setg_errno(errp, errno, "can't bind unix=%s to socket",
  480. laddr_un.sun_path);
  481. close(fd);
  482. return -1;
  483. }
  484. qemu_socket_set_nonblock(fd);
  485. dest_len = sizeof(raddr_un);
  486. dest_addr = g_malloc(dest_len);
  487. memcpy(dest_addr, &raddr_un, dest_len);
  488. break;
  489. case SOCKET_ADDRESS_TYPE_FD:
  490. fd = monitor_fd_param(monitor_cur(), local->u.fd.str, errp);
  491. if (fd == -1) {
  492. return -1;
  493. }
  494. ret = qemu_socket_try_set_nonblock(fd);
  495. if (ret < 0) {
  496. error_setg_errno(errp, -ret, "%s: Can't use file descriptor %d",
  497. name, fd);
  498. return -1;
  499. }
  500. dest_addr = NULL;
  501. dest_len = 0;
  502. break;
  503. default:
  504. error_setg(errp, "only support inet or fd type for local");
  505. return -1;
  506. }
  507. s = net_dgram_fd_init(peer, "dgram", name, fd, errp);
  508. if (!s) {
  509. return -1;
  510. }
  511. if (remote) {
  512. g_assert(s->dest_addr == NULL);
  513. s->dest_addr = dest_addr;
  514. s->dest_len = dest_len;
  515. }
  516. switch (local->type) {
  517. case SOCKET_ADDRESS_TYPE_INET:
  518. qemu_set_info_str(&s->nc, "udp=%s:%d/%s:%d",
  519. inet_ntoa(laddr_in.sin_addr),
  520. ntohs(laddr_in.sin_port),
  521. inet_ntoa(raddr_in.sin_addr),
  522. ntohs(raddr_in.sin_port));
  523. break;
  524. case SOCKET_ADDRESS_TYPE_UNIX:
  525. qemu_set_info_str(&s->nc, "udp=%s:%s",
  526. laddr_un.sun_path, raddr_un.sun_path);
  527. break;
  528. case SOCKET_ADDRESS_TYPE_FD: {
  529. SocketAddress *sa;
  530. SocketAddressType sa_type;
  531. sa = socket_local_address(fd, errp);
  532. if (sa) {
  533. sa_type = sa->type;
  534. qapi_free_SocketAddress(sa);
  535. qemu_set_info_str(&s->nc, "fd=%d %s", fd,
  536. SocketAddressType_str(sa_type));
  537. } else {
  538. qemu_set_info_str(&s->nc, "fd=%d", fd);
  539. }
  540. break;
  541. }
  542. default:
  543. g_assert_not_reached();
  544. }
  545. return 0;
  546. }