master
c 1,592 lines 48.6 KB
Raw
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
25 #include "qemu/osdep.h"
26 #include "chardev/char.h"
27 #include "io/channel-socket.h"
28 #include "io/channel-websock.h"
29 #include "qemu/error-report.h"
30 #include "qemu/module.h"
31 #include "qemu/option.h"
32 #include "qapi/error.h"
33 #include "qapi/clone-visitor.h"
34 #include "qapi/qapi-visit-sockets.h"
35 #include "qemu/yank.h"
36 #include "trace.h"
37
38 #include "chardev/char-io.h"
39 #include "chardev/char-socket.h"
40
41 static gboolean socket_reconnect_timeout(gpointer opaque);
42 static void tcp_chr_telnet_init(Chardev *chr);
43 static char *qemu_chr_compute_filename(SocketChardev *s);
44
45 static void tcp_chr_change_state(SocketChardev *s, TCPChardevState state)
46 {
47 switch (state) {
48 case TCP_CHARDEV_STATE_DISCONNECTED:
49 break;
50 case TCP_CHARDEV_STATE_CONNECTING:
51 assert(s->state == TCP_CHARDEV_STATE_DISCONNECTED);
52 break;
53 case TCP_CHARDEV_STATE_CONNECTED:
54 assert(s->state == TCP_CHARDEV_STATE_CONNECTING);
55 break;
56 }
57 s->state = state;
58 }
59
60 static void tcp_chr_reconn_timer_cancel(SocketChardev *s)
61 {
62 if (s->reconnect_timer) {
63 g_source_destroy(s->reconnect_timer);
64 g_source_unref(s->reconnect_timer);
65 s->reconnect_timer = NULL;
66 }
67 }
68
69 static void qemu_chr_socket_restart_timer(Chardev *chr)
70 {
71 SocketChardev *s = SOCKET_CHARDEV(chr);
72 char *name;
73
74 assert(s->state == TCP_CHARDEV_STATE_DISCONNECTED);
75 assert(!s->reconnect_timer);
76 name = g_strdup_printf("chardev-socket-reconnect-%s", chr->label);
77 s->reconnect_timer = qemu_chr_timeout_add_ms(chr,
78 s->reconnect_time_ms,
79 socket_reconnect_timeout,
80 chr);
81 g_source_set_name(s->reconnect_timer, name);
82 g_free(name);
83 }
84
85 static void check_report_connect_error(Chardev *chr,
86 Error *err)
87 {
88 SocketChardev *s = SOCKET_CHARDEV(chr);
89
90 if (!s->connect_err_reported) {
91 error_reportf_err(err,
92 "Unable to connect character device %s: ",
93 chr->label);
94 s->connect_err_reported = true;
95 } else {
96 error_free(err);
97 }
98 qemu_chr_socket_restart_timer(chr);
99 }
100
101 static void tcp_chr_accept(QIONetListener *listener,
102 QIOChannelSocket *cioc,
103 void *opaque);
104
105 static int tcp_chr_read_poll(void *opaque);
106 static void tcp_chr_disconnect_locked(Chardev *chr);
107
108 /* Called with chr_write_lock held. */
109 static int tcp_chr_write(Chardev *chr, const uint8_t *buf, int len)
110 {
111 SocketChardev *s = SOCKET_CHARDEV(chr);
112
113 if (s->state == TCP_CHARDEV_STATE_CONNECTED) {
114 int ret = io_channel_send_full(s->ioc, buf, len,
115 s->write_msgfds,
116 s->write_msgfds_num);
117
118 /* free the written msgfds in any cases
119 * other than ret < 0 && errno == EAGAIN
120 */
121 if (!(ret < 0 && EAGAIN == errno)
122 && s->write_msgfds_num) {
123 g_free(s->write_msgfds);
124 s->write_msgfds = 0;
125 s->write_msgfds_num = 0;
126 }
127
128 if (ret < 0 && errno != EAGAIN) {
129 if (tcp_chr_read_poll(chr) <= 0) {
130 /* Perform disconnect and return error. */
131 trace_chr_socket_poll_err(chr, chr->label);
132 tcp_chr_disconnect_locked(chr);
133 } /* else let the read handler finish it properly */
134 }
135
136 return ret;
137 } else {
138 /* Indicate an error. */
139 errno = EIO;
140 return -1;
141 }
142 }
143
144 static int tcp_chr_read_poll(void *opaque)
145 {
146 Chardev *chr = CHARDEV(opaque);
147 SocketChardev *s = SOCKET_CHARDEV(opaque);
148 if (s->state != TCP_CHARDEV_STATE_CONNECTED) {
149 return 0;
150 }
151 s->max_size = qemu_chr_be_can_write(chr);
152 return s->max_size;
153 }
154
155 static void tcp_chr_process_IAC_bytes(Chardev *chr,
156 SocketChardev *s,
157 uint8_t *buf, int *size)
158 {
159 /* Handle any telnet or tn3270 client's basic IAC options.
160 * For telnet options, it satisfies char by char mode with no echo.
161 * For tn3270 options, it satisfies binary mode with EOR.
162 * All IAC options will be removed from the buf and the do_opt
163 * pointer will be used to track the state of the width of the
164 * IAC information.
165 *
166 * RFC854: "All TELNET commands consist of at least a two byte sequence.
167 * The commands dealing with option negotiation are three byte sequences,
168 * the third byte being the code for the option referenced."
169 * "IAC BREAK", "IAC IP", "IAC NOP" and the double IAC are two bytes.
170 * "IAC SB", "IAC SE" and "IAC EOR" are saved to split up data boundary
171 * for tn3270.
172 * NOP, Break and Interrupt Process(IP) might be encountered during a TN3270
173 * session, and NOP and IP need to be done later.
174 */
175
176 int i;
177 int j = 0;
178
179 for (i = 0; i < *size; i++) {
180 if (s->do_telnetopt > 1) {
181 if ((unsigned char)buf[i] == IAC && s->do_telnetopt == 2) {
182 /* Double IAC means send an IAC */
183 if (j != i) {
184 buf[j] = buf[i];
185 }
186 j++;
187 s->do_telnetopt = 1;
188 } else {
189 if ((unsigned char)buf[i] == IAC_BREAK
190 && s->do_telnetopt == 2) {
191 /* Handle IAC break commands by sending a serial break */
192 qemu_chr_be_event(chr, CHR_EVENT_BREAK);
193 s->do_telnetopt++;
194 } else if (s->is_tn3270 && ((unsigned char)buf[i] == IAC_EOR
195 || (unsigned char)buf[i] == IAC_SB
196 || (unsigned char)buf[i] == IAC_SE)
197 && s->do_telnetopt == 2) {
198 buf[j++] = IAC;
199 buf[j++] = buf[i];
200 s->do_telnetopt++;
201 } else if (s->is_tn3270 && ((unsigned char)buf[i] == IAC_IP
202 || (unsigned char)buf[i] == IAC_NOP)
203 && s->do_telnetopt == 2) {
204 /* TODO: IP and NOP need to be implemented later. */
205 s->do_telnetopt++;
206 }
207 s->do_telnetopt++;
208 }
209 if (s->do_telnetopt >= 4) {
210 s->do_telnetopt = 1;
211 }
212 } else {
213 if ((unsigned char)buf[i] == IAC) {
214 s->do_telnetopt = 2;
215 } else {
216 if (j != i) {
217 buf[j] = buf[i];
218 }
219 j++;
220 }
221 }
222 }
223 *size = j;
224 }
225
226 static int tcp_chr_get_msgfds(Chardev *chr, int *fds, int num)
227 {
228 SocketChardev *s = SOCKET_CHARDEV(chr);
229
230 int to_copy = (s->read_msgfds_num < num) ? s->read_msgfds_num : num;
231
232 assert(num <= TCP_MAX_FDS);
233
234 if (to_copy) {
235 int i;
236
237 memcpy(fds, s->read_msgfds, to_copy * sizeof(int));
238
239 /* Close unused fds */
240 for (i = to_copy; i < s->read_msgfds_num; i++) {
241 close(s->read_msgfds[i]);
242 }
243
244 g_free(s->read_msgfds);
245 s->read_msgfds = 0;
246 s->read_msgfds_num = 0;
247 }
248
249 return to_copy;
250 }
251
252 static int tcp_chr_set_msgfds(Chardev *chr, int *fds, int num)
253 {
254 SocketChardev *s = SOCKET_CHARDEV(chr);
255
256 /* clear old pending fd array */
257 g_free(s->write_msgfds);
258 s->write_msgfds = NULL;
259 s->write_msgfds_num = 0;
260
261 if ((s->state != TCP_CHARDEV_STATE_CONNECTED) ||
262 !qio_channel_has_feature(s->ioc,
263 QIO_CHANNEL_FEATURE_FD_PASS)) {
264 return -1;
265 }
266
267 if (num) {
268 s->write_msgfds = g_new(int, num);
269 memcpy(s->write_msgfds, fds, num * sizeof(int));
270 }
271
272 s->write_msgfds_num = num;
273
274 return 0;
275 }
276
277 static ssize_t tcp_chr_recv(Chardev *chr, char *buf, size_t len)
278 {
279 SocketChardev *s = SOCKET_CHARDEV(chr);
280 struct iovec iov = { .iov_base = buf, .iov_len = len };
281 int ret;
282 size_t i;
283 int *msgfds = NULL;
284 size_t msgfds_num = 0;
285 Error *err = NULL;
286
287 if (qio_channel_has_feature(s->ioc, QIO_CHANNEL_FEATURE_FD_PASS)) {
288 ret = qio_channel_readv_full(s->ioc, &iov, 1,
289 &msgfds, &msgfds_num,
290 0, &err);
291 } else {
292 ret = qio_channel_readv_full(s->ioc, &iov, 1,
293 NULL, NULL,
294 0, &err);
295 }
296
297 if (msgfds_num) {
298 /*
299 * Close and clean previous read_msgfds, they are obsolete at
300 * this point, regardless result of new call to
301 * qio_channel_readv_full().
302 */
303
304 for (i = 0; i < s->read_msgfds_num; i++) {
305 close(s->read_msgfds[i]);
306 }
307
308 if (s->read_msgfds_num) {
309 g_free(s->read_msgfds);
310 }
311
312 s->read_msgfds = msgfds;
313 s->read_msgfds_num = msgfds_num;
314 }
315
316 if (ret == QIO_CHANNEL_ERR_BLOCK) {
317 errno = EAGAIN;
318 ret = -1;
319 } else if (ret == -1) {
320 trace_chr_socket_recv_err(chr, chr->label, error_get_pretty(err));
321 error_free(err);
322 errno = EIO;
323 } else if (ret == 0) {
324 trace_chr_socket_recv_eof(chr, chr->label);
325 }
326
327 return ret;
328 }
329
330 static GSource *tcp_chr_add_watch(Chardev *chr, GIOCondition cond)
331 {
332 SocketChardev *s = SOCKET_CHARDEV(chr);
333 if (!s->ioc) {
334 return NULL;
335 }
336 return qio_channel_create_watch(s->ioc, cond);
337 }
338
339 static void remove_hup_source(SocketChardev *s)
340 {
341 if (s->hup_source != NULL) {
342 g_source_destroy(s->hup_source);
343 g_source_unref(s->hup_source);
344 s->hup_source = NULL;
345 }
346 }
347
348 static void char_socket_yank_iochannel(void *opaque)
349 {
350 QIOChannel *ioc = QIO_CHANNEL(opaque);
351
352 qio_channel_shutdown(ioc, QIO_CHANNEL_SHUTDOWN_BOTH, NULL);
353 }
354
355 static void tcp_chr_free_connection(Chardev *chr)
356 {
357 SocketChardev *s = SOCKET_CHARDEV(chr);
358 int i;
359
360 if (s->read_msgfds_num) {
361 for (i = 0; i < s->read_msgfds_num; i++) {
362 close(s->read_msgfds[i]);
363 }
364 g_free(s->read_msgfds);
365 s->read_msgfds = NULL;
366 s->read_msgfds_num = 0;
367 }
368
369 remove_hup_source(s);
370
371 tcp_chr_set_msgfds(chr, NULL, 0);
372 remove_fd_in_watch(chr);
373
374 if (s->registered_yank && s->sioc &&
375 (s->state == TCP_CHARDEV_STATE_CONNECTING
376 || s->state == TCP_CHARDEV_STATE_CONNECTED)) {
377 yank_unregister_function(CHARDEV_YANK_INSTANCE(chr->label),
378 char_socket_yank_iochannel,
379 QIO_CHANNEL(s->sioc));
380 }
381
382 if (s->ioc) {
383 qio_channel_close(s->ioc, NULL);
384 }
385 object_unref(OBJECT(s->sioc));
386 s->sioc = NULL;
387 object_unref(OBJECT(s->ioc));
388 s->ioc = NULL;
389 tcp_chr_change_state(s, TCP_CHARDEV_STATE_DISCONNECTED);
390 }
391
392 static const char *qemu_chr_socket_protocol(SocketChardev *s)
393 {
394 if (s->is_telnet) {
395 return "telnet";
396 }
397 return s->is_websock ? "websocket" : "tcp";
398 }
399
400 static char *qemu_chr_socket_address(SocketChardev *s, const char *prefix)
401 {
402 switch (s->addr->type) {
403 case SOCKET_ADDRESS_TYPE_INET:
404 return g_strdup_printf("%s%s:%s:%s%s", prefix,
405 qemu_chr_socket_protocol(s),
406 s->addr->u.inet.host,
407 s->addr->u.inet.port,
408 s->is_listen ? ",server=on" : "");
409 break;
410 case SOCKET_ADDRESS_TYPE_UNIX:
411 {
412 const char *tight = "", *abstract = "";
413 UnixSocketAddress *sa = &s->addr->u.q_unix;
414
415 #ifdef CONFIG_LINUX
416 if (sa->has_abstract && sa->abstract) {
417 abstract = ",abstract=on";
418 if (sa->has_tight && sa->tight) {
419 tight = ",tight=on";
420 }
421 }
422 #endif
423
424 return g_strdup_printf("%sunix:%s%s%s%s", prefix, sa->path,
425 abstract, tight,
426 s->is_listen ? ",server=on" : "");
427 break;
428 }
429 case SOCKET_ADDRESS_TYPE_FD:
430 return g_strdup_printf("%sfd:%s%s", prefix, s->addr->u.fd.str,
431 s->is_listen ? ",server=on" : "");
432 break;
433 case SOCKET_ADDRESS_TYPE_VSOCK:
434 return g_strdup_printf("%svsock:%s:%s", prefix,
435 s->addr->u.vsock.cid,
436 s->addr->u.vsock.port);
437 default:
438 abort();
439 }
440 }
441
442 static char *tcp_chr_get_filename(Chardev *chr)
443 {
444 SocketChardev *s = SOCKET_CHARDEV(chr);
445
446 if (s->state == TCP_CHARDEV_STATE_CONNECTED) {
447 return qemu_chr_compute_filename(s);
448 } else if (s->addr) {
449 return qemu_chr_socket_address(s, "disconnected:");
450 }
451
452 return g_strdup("disconnected:socket");
453 }
454
455 /* NB may be called even if tcp_chr_connect has not been
456 * reached, due to TLS or telnet initialization failure,
457 * so can *not* assume s->state == TCP_CHARDEV_STATE_CONNECTED
458 * This must be called with chr->chr_write_lock held.
459 */
460 static void tcp_chr_disconnect_locked(Chardev *chr)
461 {
462 SocketChardev *s = SOCKET_CHARDEV(chr);
463 bool emit_close = s->state == TCP_CHARDEV_STATE_CONNECTED;
464
465 trace_chr_socket_disconnect(chr, chr->label);
466 tcp_chr_free_connection(chr);
467
468 if (s->listener) {
469 qio_net_listener_set_client_func_full(s->listener, tcp_chr_accept,
470 chr, NULL, chr->gcontext);
471 }
472 if (emit_close) {
473 qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
474 }
475 if (s->reconnect_time_ms && !s->reconnect_timer) {
476 qemu_chr_socket_restart_timer(chr);
477 }
478 }
479
480 static void tcp_chr_disconnect(Chardev *chr)
481 {
482 qemu_mutex_lock(&chr->chr_write_lock);
483 tcp_chr_disconnect_locked(chr);
484 qemu_mutex_unlock(&chr->chr_write_lock);
485 }
486
487 static gboolean tcp_chr_read(QIOChannel *chan, GIOCondition cond, void *opaque)
488 {
489 Chardev *chr = CHARDEV(opaque);
490 SocketChardev *s = SOCKET_CHARDEV(opaque);
491 QEMU_UNINITIALIZED uint8_t buf[CHR_READ_BUF_LEN];
492 int len, size;
493
494 if ((s->state != TCP_CHARDEV_STATE_CONNECTED) ||
495 s->max_size <= 0) {
496 return TRUE;
497 }
498 len = sizeof(buf);
499 if (len > s->max_size) {
500 len = s->max_size;
501 }
502 size = tcp_chr_recv(chr, (void *)buf, len);
503 if (size == 0 || (size == -1 && errno != EAGAIN)) {
504 /* connection closed */
505 tcp_chr_disconnect(chr);
506 } else if (size > 0) {
507 if (s->do_telnetopt) {
508 tcp_chr_process_IAC_bytes(chr, s, buf, &size);
509 }
510 if (size > 0) {
511 qemu_chr_be_write(chr, buf, size);
512 }
513 }
514
515 return TRUE;
516 }
517
518 static gboolean tcp_chr_hup(QIOChannel *channel,
519 GIOCondition cond,
520 void *opaque)
521 {
522 Chardev *chr = CHARDEV(opaque);
523 trace_chr_socket_hangup(chr, chr->label);
524 tcp_chr_disconnect(chr);
525 return G_SOURCE_REMOVE;
526 }
527
528 static int tcp_chr_sync_read(Chardev *chr, const uint8_t *buf, int len)
529 {
530 SocketChardev *s = SOCKET_CHARDEV(chr);
531 int size;
532 int saved_errno;
533 Error *local_err = NULL;
534
535 if (s->state != TCP_CHARDEV_STATE_CONNECTED) {
536 return 0;
537 }
538
539 if (!qio_channel_set_blocking(s->ioc, true, &local_err)) {
540 error_report_err(local_err);
541 return -1;
542 }
543 size = tcp_chr_recv(chr, (void *) buf, len);
544 saved_errno = errno;
545 if (s->state != TCP_CHARDEV_STATE_DISCONNECTED) {
546 if (!qio_channel_set_blocking(s->ioc, false, &local_err)) {
547 error_report_err(local_err);
548 /* failed to recover non-blocking state */
549 tcp_chr_disconnect(chr);
550 }
551 }
552 if (size == 0) {
553 /* connection closed */
554 tcp_chr_disconnect(chr);
555 }
556
557 errno = saved_errno;
558 return size;
559 }
560
561 static char *qemu_chr_compute_filename(SocketChardev *s)
562 {
563 struct sockaddr_storage *ss = &s->sioc->localAddr;
564 struct sockaddr_storage *ps = &s->sioc->remoteAddr;
565 socklen_t ss_len = s->sioc->localAddrLen;
566 socklen_t ps_len = s->sioc->remoteAddrLen;
567 char shost[NI_MAXHOST], sserv[NI_MAXSERV];
568 char phost[NI_MAXHOST], pserv[NI_MAXSERV];
569 const char *left = "", *right = "";
570
571 switch (ss->ss_family) {
572 case AF_UNIX:
573 if (s->is_listen) {
574 return g_strdup_printf("unix:%s,server=on",
575 ((struct sockaddr_un *)(ss))->sun_path);
576 } else {
577 return g_strdup_printf("unix:%s",
578 ((struct sockaddr_un *)(ps))->sun_path);
579 }
580 case AF_INET6:
581 left = "[";
582 right = "]";
583 /* fall through */
584 case AF_INET:
585 getnameinfo((struct sockaddr *) ss, ss_len, shost, sizeof(shost),
586 sserv, sizeof(sserv), NI_NUMERICHOST | NI_NUMERICSERV);
587 getnameinfo((struct sockaddr *) ps, ps_len, phost, sizeof(phost),
588 pserv, sizeof(pserv), NI_NUMERICHOST | NI_NUMERICSERV);
589 return g_strdup_printf("%s:%s%s%s:%s%s <-> %s%s%s:%s",
590 qemu_chr_socket_protocol(s),
591 left, shost, right, sserv,
592 s->is_listen ? ",server=on" : "",
593 left, phost, right, pserv);
594
595 default:
596 return g_strdup_printf("unknown");
597 }
598 }
599
600 static void update_ioc_handlers(SocketChardev *s)
601 {
602 Chardev *chr = CHARDEV(s);
603
604 if (s->state != TCP_CHARDEV_STATE_CONNECTED) {
605 return;
606 }
607
608 remove_fd_in_watch(chr);
609 chr->gsource = io_add_watch_poll(chr, s->ioc,
610 tcp_chr_read_poll,
611 tcp_chr_read, chr,
612 chr->gcontext);
613
614 remove_hup_source(s);
615 s->hup_source = qio_channel_create_watch(s->ioc, G_IO_HUP);
616 /*
617 * poll() is liable to return POLLHUP even when there is
618 * still incoming data available to read on the FD. If
619 * we have the hup_source at the same priority as the
620 * main io_add_watch_poll GSource, then we might end up
621 * processing the POLLHUP event first, closing the FD,
622 * and as a result silently discard data we should have
623 * read.
624 *
625 * By setting the hup_source to G_PRIORITY_DEFAULT + 1,
626 * we ensure that io_add_watch_poll GSource will always
627 * be dispatched first, thus guaranteeing we will be
628 * able to process all incoming data before closing the
629 * FD
630 */
631 g_source_set_priority(s->hup_source, G_PRIORITY_DEFAULT + 1);
632 g_source_set_callback(s->hup_source, (GSourceFunc)tcp_chr_hup,
633 chr, NULL);
634 g_source_attach(s->hup_source, chr->gcontext);
635 }
636
637 static void tcp_chr_connect(void *opaque)
638 {
639 Chardev *chr = CHARDEV(opaque);
640 SocketChardev *s = SOCKET_CHARDEV(opaque);
641
642 tcp_chr_change_state(s, TCP_CHARDEV_STATE_CONNECTED);
643 update_ioc_handlers(s);
644 qemu_chr_be_event(chr, CHR_EVENT_OPENED);
645 }
646
647 static void tcp_chr_telnet_destroy(SocketChardev *s)
648 {
649 if (s->telnet_source) {
650 g_source_destroy(s->telnet_source);
651 g_source_unref(s->telnet_source);
652 s->telnet_source = NULL;
653 }
654 }
655
656 static void tcp_chr_update_read_handler(Chardev *chr)
657 {
658 SocketChardev *s = SOCKET_CHARDEV(chr);
659
660 if (s->listener && s->state == TCP_CHARDEV_STATE_DISCONNECTED) {
661 /*
662 * It's possible that chardev context is changed in
663 * qemu_chr_be_update_read_handlers(). Reset it for QIO net
664 * listener if there is.
665 */
666 qio_net_listener_set_client_func_full(s->listener, tcp_chr_accept,
667 chr, NULL, chr->gcontext);
668 }
669
670 if (s->telnet_source) {
671 tcp_chr_telnet_init(CHARDEV(s));
672 }
673
674 update_ioc_handlers(s);
675 }
676
677 static gboolean tcp_chr_telnet_init_io(QIOChannel *ioc,
678 GIOCondition cond G_GNUC_UNUSED,
679 gpointer user_data)
680 {
681 SocketChardev *s = user_data;
682 Chardev *chr = CHARDEV(s);
683 TCPChardevTelnetInit *init = s->telnet_init;
684 Error *err = NULL;
685 ssize_t ret;
686
687 assert(init);
688
689 ret = qio_channel_write(ioc, init->buf, init->buflen, &err);
690 if (ret < 0) {
691 if (ret == QIO_CHANNEL_ERR_BLOCK) {
692 ret = 0;
693 } else {
694 trace_chr_socket_write_err(chr, chr->label, error_get_pretty(err));
695 error_free(err);
696 tcp_chr_disconnect(chr);
697 goto end;
698 }
699 }
700 init->buflen -= ret;
701
702 if (init->buflen == 0) {
703 tcp_chr_connect(chr);
704 goto end;
705 }
706
707 memmove(init->buf, init->buf + ret, init->buflen);
708
709 return G_SOURCE_CONTINUE;
710
711 end:
712 g_free(s->telnet_init);
713 s->telnet_init = NULL;
714 g_source_unref(s->telnet_source);
715 s->telnet_source = NULL;
716 return G_SOURCE_REMOVE;
717 }
718
719 static void tcp_chr_telnet_init(Chardev *chr)
720 {
721 SocketChardev *s = SOCKET_CHARDEV(chr);
722 TCPChardevTelnetInit *init;
723 size_t n = 0;
724
725 /* Destroy existing task */
726 tcp_chr_telnet_destroy(s);
727
728 if (s->telnet_init) {
729 /* We are possibly during a handshake already */
730 goto cont;
731 }
732
733 s->telnet_init = g_new0(TCPChardevTelnetInit, 1);
734 init = s->telnet_init;
735
736 #define IACSET(x, a, b, c) \
737 do { \
738 x[n++] = a; \
739 x[n++] = b; \
740 x[n++] = c; \
741 } while (0)
742
743 if (!s->is_tn3270) {
744 init->buflen = 12;
745 /* Prep the telnet negotiation to put telnet in binary,
746 * no echo, single char mode */
747 IACSET(init->buf, 0xff, 0xfb, 0x01); /* IAC WILL ECHO */
748 IACSET(init->buf, 0xff, 0xfb, 0x03); /* IAC WILL Suppress go ahead */
749 IACSET(init->buf, 0xff, 0xfb, 0x00); /* IAC WILL Binary */
750 IACSET(init->buf, 0xff, 0xfd, 0x00); /* IAC DO Binary */
751 } else {
752 init->buflen = 21;
753 /* Prep the TN3270 negotiation based on RFC1576 */
754 IACSET(init->buf, 0xff, 0xfd, 0x19); /* IAC DO EOR */
755 IACSET(init->buf, 0xff, 0xfb, 0x19); /* IAC WILL EOR */
756 IACSET(init->buf, 0xff, 0xfd, 0x00); /* IAC DO BINARY */
757 IACSET(init->buf, 0xff, 0xfb, 0x00); /* IAC WILL BINARY */
758 IACSET(init->buf, 0xff, 0xfd, 0x18); /* IAC DO TERMINAL TYPE */
759 IACSET(init->buf, 0xff, 0xfa, 0x18); /* IAC SB TERMINAL TYPE */
760 IACSET(init->buf, 0x01, 0xff, 0xf0); /* SEND IAC SE */
761 }
762
763 #undef IACSET
764
765 cont:
766 s->telnet_source = qio_channel_add_watch_source(s->ioc, G_IO_OUT,
767 tcp_chr_telnet_init_io,
768 s, NULL,
769 chr->gcontext);
770 }
771
772
773 static void tcp_chr_websock_handshake(QIOTask *task, gpointer user_data)
774 {
775 Chardev *chr = user_data;
776 SocketChardev *s = user_data;
777 Error *err = NULL;
778
779 if (qio_task_propagate_error(task, &err)) {
780 trace_chr_socket_ws_handshake_err(chr, chr->label,
781 error_get_pretty(err));
782 error_free(err);
783 tcp_chr_disconnect(chr);
784 } else {
785 if (s->do_telnetopt) {
786 tcp_chr_telnet_init(chr);
787 } else {
788 tcp_chr_connect(chr);
789 }
790 }
791 }
792
793
794 static void tcp_chr_websock_init(Chardev *chr)
795 {
796 SocketChardev *s = SOCKET_CHARDEV(chr);
797 QIOChannelWebsock *wioc = NULL;
798 gchar *name;
799
800 wioc = qio_channel_websock_new_server(s->ioc);
801
802 name = g_strdup_printf("chardev-websocket-server-%s", chr->label);
803 qio_channel_set_name(QIO_CHANNEL(wioc), name);
804 g_free(name);
805 object_unref(OBJECT(s->ioc));
806 s->ioc = QIO_CHANNEL(wioc);
807
808 qio_channel_websock_handshake(wioc, tcp_chr_websock_handshake, chr, NULL);
809 }
810
811
812 static void tcp_chr_tls_handshake(QIOTask *task,
813 gpointer user_data)
814 {
815 Chardev *chr = user_data;
816 SocketChardev *s = user_data;
817 Error *err = NULL;
818
819 if (qio_task_propagate_error(task, &err)) {
820 trace_chr_socket_tls_handshake_err(chr, chr->label,
821 error_get_pretty(err));
822 error_free(err);
823 tcp_chr_disconnect(chr);
824 } else {
825 if (s->is_websock) {
826 tcp_chr_websock_init(chr);
827 } else if (s->do_telnetopt) {
828 tcp_chr_telnet_init(chr);
829 } else {
830 tcp_chr_connect(chr);
831 }
832 }
833 }
834
835
836 static void tcp_chr_tls_init(Chardev *chr)
837 {
838 SocketChardev *s = SOCKET_CHARDEV(chr);
839 QIOChannelTLS *tioc;
840 gchar *name;
841 Error *err = NULL;
842
843 if (s->is_listen) {
844 tioc = qio_channel_tls_new_server(
845 s->ioc, s->tls_creds,
846 s->tls_authz,
847 &err);
848 } else {
849 tioc = qio_channel_tls_new_client(
850 s->ioc, s->tls_creds,
851 s->addr->u.inet.host,
852 &err);
853 }
854 if (tioc == NULL) {
855 trace_chr_socket_tls_init_err(chr, chr->label, error_get_pretty(err));
856 error_free(err);
857 tcp_chr_disconnect(chr);
858 return;
859 }
860 name = g_strdup_printf("chardev-tls-%s-%s",
861 s->is_listen ? "server" : "client",
862 chr->label);
863 qio_channel_set_name(QIO_CHANNEL(tioc), name);
864 g_free(name);
865 object_unref(OBJECT(s->ioc));
866 s->ioc = QIO_CHANNEL(tioc);
867
868 qio_channel_tls_handshake(tioc,
869 tcp_chr_tls_handshake,
870 chr,
871 NULL,
872 chr->gcontext);
873 }
874
875
876 static void tcp_chr_set_client_ioc_name(Chardev *chr,
877 QIOChannelSocket *sioc)
878 {
879 SocketChardev *s = SOCKET_CHARDEV(chr);
880 char *name;
881 name = g_strdup_printf("chardev-tcp-%s-%s",
882 s->is_listen ? "server" : "client",
883 chr->label);
884 qio_channel_set_name(QIO_CHANNEL(sioc), name);
885 g_free(name);
886
887 }
888
889 static int tcp_chr_new_client(Chardev *chr, QIOChannelSocket *sioc)
890 {
891 SocketChardev *s = SOCKET_CHARDEV(chr);
892 Error *local_err = NULL;
893
894 if (s->state != TCP_CHARDEV_STATE_CONNECTING) {
895 return -1;
896 }
897
898 if (!qio_channel_set_blocking(QIO_CHANNEL(sioc), false, &local_err)) {
899 error_report_err(local_err);
900 return -1;
901 }
902
903 s->ioc = QIO_CHANNEL(sioc);
904 object_ref(OBJECT(sioc));
905 s->sioc = sioc;
906 object_ref(OBJECT(sioc));
907
908 if (s->registered_yank) {
909 yank_register_function(CHARDEV_YANK_INSTANCE(chr->label),
910 char_socket_yank_iochannel,
911 QIO_CHANNEL(sioc));
912 }
913
914 if (s->do_nodelay) {
915 qio_channel_set_delay(s->ioc, false);
916 }
917 if (s->listener) {
918 qio_net_listener_set_client_func_full(s->listener, NULL, NULL,
919 NULL, chr->gcontext);
920 }
921
922 if (s->tls_creds) {
923 tcp_chr_tls_init(chr);
924 } else if (s->is_websock) {
925 tcp_chr_websock_init(chr);
926 } else if (s->do_telnetopt) {
927 tcp_chr_telnet_init(chr);
928 } else {
929 tcp_chr_connect(chr);
930 }
931
932 return 0;
933 }
934
935
936 static int tcp_chr_add_client(Chardev *chr, int fd)
937 {
938 int ret;
939 QIOChannelSocket *sioc;
940 SocketChardev *s = SOCKET_CHARDEV(chr);
941
942 if (s->state != TCP_CHARDEV_STATE_DISCONNECTED) {
943 return -1;
944 }
945
946 sioc = qio_channel_socket_new_fd(fd, NULL);
947 if (!sioc) {
948 return -1;
949 }
950 tcp_chr_change_state(s, TCP_CHARDEV_STATE_CONNECTING);
951 tcp_chr_set_client_ioc_name(chr, sioc);
952 ret = tcp_chr_new_client(chr, sioc);
953 object_unref(OBJECT(sioc));
954 return ret;
955 }
956
957 static void tcp_chr_accept(QIONetListener *listener,
958 QIOChannelSocket *cioc,
959 void *opaque)
960 {
961 Chardev *chr = CHARDEV(opaque);
962 SocketChardev *s = SOCKET_CHARDEV(chr);
963
964 tcp_chr_change_state(s, TCP_CHARDEV_STATE_CONNECTING);
965 tcp_chr_set_client_ioc_name(chr, cioc);
966 tcp_chr_new_client(chr, cioc);
967 }
968
969
970 static int tcp_chr_connect_client_sync(Chardev *chr, Error **errp)
971 {
972 SocketChardev *s = SOCKET_CHARDEV(chr);
973 QIOChannelSocket *sioc = qio_channel_socket_new();
974 tcp_chr_change_state(s, TCP_CHARDEV_STATE_CONNECTING);
975 tcp_chr_set_client_ioc_name(chr, sioc);
976 if (qio_channel_socket_connect_sync(sioc, s->addr, errp) < 0) {
977 tcp_chr_change_state(s, TCP_CHARDEV_STATE_DISCONNECTED);
978 object_unref(OBJECT(sioc));
979 return -1;
980 }
981 tcp_chr_new_client(chr, sioc);
982 object_unref(OBJECT(sioc));
983 return 0;
984 }
985
986
987 static void tcp_chr_accept_server_sync(Chardev *chr)
988 {
989 SocketChardev *s = SOCKET_CHARDEV(chr);
990 QIOChannelSocket *sioc;
991 g_autofree char *filename = qemu_chr_get_filename(chr);
992 info_report("QEMU waiting for connection on: %s", filename);
993 tcp_chr_change_state(s, TCP_CHARDEV_STATE_CONNECTING);
994 sioc = qio_net_listener_wait_client(s->listener);
995 tcp_chr_set_client_ioc_name(chr, sioc);
996 tcp_chr_new_client(chr, sioc);
997 object_unref(OBJECT(sioc));
998 }
999
1000
1001 static int tcp_chr_wait_connected(Chardev *chr, Error **errp)
1002 {
1003 SocketChardev *s = SOCKET_CHARDEV(chr);
1004 const char *opts[] = { "telnet", "tn3270", "websock", "tls-creds" };
1005 bool optset[] = { s->is_telnet, s->is_tn3270, s->is_websock, s->tls_creds };
1006 size_t i;
1007
1008 QEMU_BUILD_BUG_ON(G_N_ELEMENTS(opts) != G_N_ELEMENTS(optset));
1009 for (i = 0; i < G_N_ELEMENTS(opts); i++) {
1010 if (optset[i]) {
1011 error_setg(errp,
1012 "'%s' option is incompatible with waiting for "
1013 "connection completion", opts[i]);
1014 return -1;
1015 }
1016 }
1017
1018 tcp_chr_reconn_timer_cancel(s);
1019
1020 /*
1021 * We expect states to be as follows:
1022 *
1023 * - server
1024 * - wait -> CONNECTED
1025 * - nowait -> DISCONNECTED
1026 * - client
1027 * - reconnect == 0 -> CONNECTED
1028 * - reconnect != 0 -> CONNECTING
1029 *
1030 */
1031 if (s->state == TCP_CHARDEV_STATE_CONNECTING) {
1032 if (!s->connect_task) {
1033 error_setg(errp,
1034 "Unexpected 'connecting' state without connect task "
1035 "while waiting for connection completion");
1036 return -1;
1037 }
1038 /*
1039 * tcp_chr_wait_connected should only ever be run from the
1040 * main loop thread associated with chr->gcontext, otherwise
1041 * qio_task_wait_thread has a dangerous race condition with
1042 * free'ing of the s->connect_task object.
1043 *
1044 * Acquiring the main context doesn't 100% prove we're in
1045 * the main loop thread, but it does at least guarantee
1046 * that the main loop won't be executed by another thread
1047 * avoiding the race condition with the task idle callback.
1048 */
1049 g_main_context_acquire(chr->gcontext);
1050 qio_task_wait_thread(s->connect_task);
1051 g_main_context_release(chr->gcontext);
1052
1053 /*
1054 * The completion callback (qemu_chr_socket_connected) for
1055 * s->connect_task should have set this to NULL by the time
1056 * qio_task_wait_thread has returned.
1057 */
1058 assert(!s->connect_task);
1059
1060 /*
1061 * NB we are *not* guaranteed to have "s->state == ..CONNECTED"
1062 * at this point as this first connect may be failed, so
1063 * allow the next loop to run regardless.
1064 */
1065 }
1066
1067 while (s->state != TCP_CHARDEV_STATE_CONNECTED) {
1068 if (s->is_listen) {
1069 tcp_chr_accept_server_sync(chr);
1070 } else {
1071 Error *err = NULL;
1072 if (tcp_chr_connect_client_sync(chr, &err) < 0) {
1073 if (s->reconnect_time_ms) {
1074 error_free(err);
1075 g_usleep(s->reconnect_time_ms * 1000ULL);
1076 } else {
1077 error_propagate(errp, err);
1078 return -1;
1079 }
1080 }
1081 }
1082 }
1083
1084 return 0;
1085 }
1086
1087 static void char_socket_finalize(Object *obj)
1088 {
1089 Chardev *chr = CHARDEV(obj);
1090 SocketChardev *s = SOCKET_CHARDEV(obj);
1091
1092 tcp_chr_free_connection(chr);
1093 tcp_chr_reconn_timer_cancel(s);
1094 qapi_free_SocketAddress(s->addr);
1095 tcp_chr_telnet_destroy(s);
1096 g_free(s->telnet_init);
1097 if (s->listener) {
1098 qio_net_listener_set_client_func_full(s->listener, NULL, NULL,
1099 NULL, chr->gcontext);
1100 object_unref(OBJECT(s->listener));
1101 s->listener = NULL;
1102 }
1103 if (s->tls_creds) {
1104 object_unref(OBJECT(s->tls_creds));
1105 }
1106 g_free(s->tls_authz);
1107 if (s->registered_yank) {
1108 /*
1109 * In the chardev-change special-case, we shouldn't unregister the yank
1110 * instance, as it still may be needed.
1111 */
1112 if (!chr->handover_yank_instance) {
1113 yank_unregister_instance(CHARDEV_YANK_INSTANCE(chr->label));
1114 }
1115 }
1116
1117 qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
1118 }
1119
1120 static void qemu_chr_socket_connected(QIOTask *task, void *opaque)
1121 {
1122 QIOChannelSocket *sioc = QIO_CHANNEL_SOCKET(qio_task_get_source(task));
1123 Chardev *chr = CHARDEV(opaque);
1124 SocketChardev *s = SOCKET_CHARDEV(chr);
1125 Error *err = NULL;
1126
1127 s->connect_task = NULL;
1128
1129 if (qio_task_propagate_error(task, &err)) {
1130 tcp_chr_change_state(s, TCP_CHARDEV_STATE_DISCONNECTED);
1131 check_report_connect_error(chr, err);
1132 goto cleanup;
1133 }
1134
1135 s->connect_err_reported = false;
1136 tcp_chr_new_client(chr, sioc);
1137
1138 cleanup:
1139 object_unref(OBJECT(sioc));
1140 }
1141
1142
1143 static void tcp_chr_connect_client_task(QIOTask *task,
1144 gpointer opaque)
1145 {
1146 QIOChannelSocket *ioc = QIO_CHANNEL_SOCKET(qio_task_get_source(task));
1147 SocketAddress *addr = opaque;
1148 Error *err = NULL;
1149
1150 qio_channel_socket_connect_sync(ioc, addr, &err);
1151
1152 qio_task_set_error(task, err);
1153 }
1154
1155
1156 static void tcp_chr_connect_client_async(Chardev *chr)
1157 {
1158 SocketChardev *s = SOCKET_CHARDEV(chr);
1159 QIOChannelSocket *sioc;
1160
1161 tcp_chr_change_state(s, TCP_CHARDEV_STATE_CONNECTING);
1162 sioc = qio_channel_socket_new();
1163 tcp_chr_set_client_ioc_name(chr, sioc);
1164 /*
1165 * Normally code would use the qio_channel_socket_connect_async
1166 * method which uses a QIOTask + qio_task_set_error internally
1167 * to avoid blocking. The tcp_chr_wait_connected method, however,
1168 * needs a way to synchronize with completion of the background
1169 * connect task which can't be done with the QIOChannelSocket
1170 * async APIs. Thus we must use QIOTask directly to implement
1171 * the non-blocking concept locally.
1172 */
1173 s->connect_task = qio_task_new(OBJECT(sioc),
1174 qemu_chr_socket_connected,
1175 object_ref(OBJECT(chr)),
1176 (GDestroyNotify)object_unref);
1177 qio_task_run_in_thread(s->connect_task,
1178 tcp_chr_connect_client_task,
1179 s->addr,
1180 NULL,
1181 chr->gcontext);
1182 }
1183
1184 static gboolean socket_reconnect_timeout(gpointer opaque)
1185 {
1186 Chardev *chr = CHARDEV(opaque);
1187 SocketChardev *s = SOCKET_CHARDEV(opaque);
1188
1189 qemu_mutex_lock(&chr->chr_write_lock);
1190 g_source_unref(s->reconnect_timer);
1191 s->reconnect_timer = NULL;
1192 qemu_mutex_unlock(&chr->chr_write_lock);
1193
1194 if (chr->be_open) {
1195 return false;
1196 }
1197
1198 tcp_chr_connect_client_async(chr);
1199
1200 return false;
1201 }
1202
1203
1204 static int qmp_chardev_open_socket_server(Chardev *chr,
1205 bool is_telnet,
1206 bool is_waitconnect,
1207 Error **errp)
1208 {
1209 SocketChardev *s = SOCKET_CHARDEV(chr);
1210 char *name;
1211 if (is_telnet) {
1212 s->do_telnetopt = 1;
1213 }
1214 s->listener = qio_net_listener_new();
1215
1216 name = g_strdup_printf("chardev-tcp-listener-%s", chr->label);
1217 qio_net_listener_set_name(s->listener, name);
1218 g_free(name);
1219
1220 if (s->addr->type == SOCKET_ADDRESS_TYPE_FD && !*s->addr->u.fd.str) {
1221 goto skip_listen;
1222 }
1223
1224 if (qio_net_listener_open_sync(s->listener, s->addr, 1, errp) < 0) {
1225 object_unref(OBJECT(s->listener));
1226 s->listener = NULL;
1227 return -1;
1228 }
1229
1230 qapi_free_SocketAddress(s->addr);
1231 s->addr = qio_net_listener_get_local_address(s->listener, 0, errp);
1232
1233 skip_listen:
1234 if (is_waitconnect) {
1235 tcp_chr_accept_server_sync(chr);
1236 } else {
1237 qio_net_listener_set_client_func_full(s->listener,
1238 tcp_chr_accept,
1239 chr, NULL,
1240 chr->gcontext);
1241 }
1242
1243 return 0;
1244 }
1245
1246
1247 static int qmp_chardev_open_socket_client(Chardev *chr,
1248 int64_t reconnect_ms,
1249 Error **errp)
1250 {
1251 SocketChardev *s = SOCKET_CHARDEV(chr);
1252
1253 if (reconnect_ms > 0) {
1254 s->reconnect_time_ms = reconnect_ms;
1255 tcp_chr_connect_client_async(chr);
1256 return 0;
1257 } else {
1258 return tcp_chr_connect_client_sync(chr, errp);
1259 }
1260 }
1261
1262
1263 static bool qmp_chardev_validate_socket(ChardevSocket *sock,
1264 SocketAddress *addr,
1265 Error **errp)
1266 {
1267 /* Validate any options which have a dependency on address type */
1268 switch (addr->type) {
1269 case SOCKET_ADDRESS_TYPE_FD:
1270 if (sock->has_reconnect_ms) {
1271 error_setg(errp,
1272 "'reconnect-ms' option is incompatible with "
1273 "'fd' address type");
1274 return false;
1275 }
1276 if (sock->tls_creds &&
1277 !(sock->has_server && sock->server)) {
1278 error_setg(errp,
1279 "'tls_creds' option is incompatible with "
1280 "'fd' address type as client");
1281 return false;
1282 }
1283 break;
1284
1285 case SOCKET_ADDRESS_TYPE_UNIX:
1286 if (sock->tls_creds) {
1287 error_setg(errp,
1288 "'tls_creds' option is incompatible with "
1289 "'unix' address type");
1290 return false;
1291 }
1292 break;
1293
1294 case SOCKET_ADDRESS_TYPE_INET:
1295 break;
1296
1297 case SOCKET_ADDRESS_TYPE_VSOCK:
1298 if (sock->tls_creds) {
1299 error_setg(errp,
1300 "'tls_creds' option is incompatible with "
1301 "'vsock' address type");
1302 return false;
1303 }
1304
1305 default:
1306 break;
1307 }
1308
1309 if (sock->tls_authz && !sock->tls_creds) {
1310 error_setg(errp, "'tls_authz' option requires 'tls_creds' option");
1311 return false;
1312 }
1313
1314 /* Validate any options which have a dependency on client vs server */
1315 if (!sock->has_server || sock->server) {
1316 if (sock->has_reconnect_ms) {
1317 error_setg(errp,
1318 "'reconnect-ms' option is incompatible with "
1319 "socket in server listen mode");
1320 return false;
1321 }
1322 } else {
1323 if (sock->has_websocket && sock->websocket) {
1324 error_setg(errp, "%s", "Websocket client is not implemented");
1325 return false;
1326 }
1327 if (sock->has_wait) {
1328 error_setg(errp, "%s",
1329 "'wait' option is incompatible with "
1330 "socket in client connect mode");
1331 return false;
1332 }
1333 }
1334
1335 return true;
1336 }
1337
1338
1339 static bool tcp_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)
1340 {
1341 SocketChardev *s = SOCKET_CHARDEV(chr);
1342 ChardevSocket *sock = backend->u.socket.data;
1343 bool do_nodelay = sock->has_nodelay ? sock->nodelay : false;
1344 bool is_listen = sock->has_server ? sock->server : true;
1345 bool is_telnet = sock->has_telnet ? sock->telnet : false;
1346 bool is_tn3270 = sock->has_tn3270 ? sock->tn3270 : false;
1347 bool is_waitconnect = sock->has_wait ? sock->wait : false;
1348 bool is_websock = sock->has_websocket ? sock->websocket : false;
1349 int64_t reconnect_ms = sock->has_reconnect_ms ? sock->reconnect_ms : 0;
1350 SocketAddress *addr;
1351
1352 s->is_listen = is_listen;
1353 s->is_telnet = is_telnet;
1354 s->is_tn3270 = is_tn3270;
1355 s->is_websock = is_websock;
1356 s->do_nodelay = do_nodelay;
1357 if (sock->tls_creds) {
1358 Object *creds;
1359 creds = object_resolve_path_component(
1360 object_get_objects_root(), sock->tls_creds);
1361 if (!creds) {
1362 error_setg(errp, "No TLS credentials with id '%s'",
1363 sock->tls_creds);
1364 return false;
1365 }
1366 s->tls_creds = (QCryptoTLSCreds *)
1367 object_dynamic_cast(creds,
1368 TYPE_QCRYPTO_TLS_CREDS);
1369 if (!s->tls_creds) {
1370 error_setg(errp, "Object with id '%s' is not TLS credentials",
1371 sock->tls_creds);
1372 return false;
1373 }
1374 object_ref(OBJECT(s->tls_creds));
1375 if (!qcrypto_tls_creds_check_endpoint(s->tls_creds,
1376 is_listen
1377 ? QCRYPTO_TLS_CREDS_ENDPOINT_SERVER
1378 : QCRYPTO_TLS_CREDS_ENDPOINT_CLIENT,
1379 errp)) {
1380 return false;
1381 }
1382 }
1383 s->tls_authz = g_strdup(sock->tls_authz);
1384
1385 s->addr = addr = socket_address_flatten(sock->addr);
1386
1387 if (!qmp_chardev_validate_socket(sock, addr, errp)) {
1388 return false;
1389 }
1390
1391 qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_RECONNECTABLE);
1392 #ifndef _WIN32
1393 /* TODO SOCKET_ADDRESS_FD where fd has AF_UNIX */
1394 if (addr->type == SOCKET_ADDRESS_TYPE_UNIX) {
1395 qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_FD_PASS);
1396 }
1397 #endif
1398
1399 /*
1400 * In the chardev-change special-case, we shouldn't register a new yank
1401 * instance, as there already may be one.
1402 */
1403 if (!chr->handover_yank_instance) {
1404 if (!yank_register_instance(CHARDEV_YANK_INSTANCE(chr->label), errp)) {
1405 return false;
1406 }
1407 }
1408 s->registered_yank = true;
1409
1410 if (s->is_listen) {
1411 if (qmp_chardev_open_socket_server(chr, is_telnet || is_tn3270,
1412 is_waitconnect, errp) < 0) {
1413 return false;
1414 }
1415 } else {
1416 if (qmp_chardev_open_socket_client(chr, reconnect_ms, errp) < 0) {
1417 return false;
1418 }
1419 }
1420
1421 /* be isn't opened until we get a connection */
1422 return true;
1423 }
1424
1425 static void tcp_chr_parse(QemuOpts *opts, ChardevBackend *backend, Error **errp)
1426 {
1427 const char *path = qemu_opt_get(opts, "path");
1428 const char *host = qemu_opt_get(opts, "host");
1429 const char *port = qemu_opt_get(opts, "port");
1430 const char *fd = qemu_opt_get(opts, "fd");
1431 #ifdef CONFIG_LINUX
1432 bool tight = qemu_opt_get_bool(opts, "tight", true);
1433 bool abstract = qemu_opt_get_bool(opts, "abstract", false);
1434 #endif
1435 SocketAddressLegacy *addr;
1436 ChardevSocket *sock;
1437
1438 if ((!!path + !!fd + !!host) > 1) {
1439 error_setg(errp,
1440 "None or one of 'path', 'fd' or 'host' option required.");
1441 return;
1442 }
1443
1444 if (host && !port) {
1445 error_setg(errp, "chardev: socket: no port given");
1446 return;
1447 }
1448
1449 backend->type = CHARDEV_BACKEND_KIND_SOCKET;
1450 sock = backend->u.socket.data = g_new0(ChardevSocket, 1);
1451 qemu_chr_parse_common(opts, qapi_ChardevSocket_base(sock));
1452
1453 if (qemu_opt_get(opts, "delay") && qemu_opt_get(opts, "nodelay")) {
1454 error_setg(errp, "'delay' and 'nodelay' are mutually exclusive");
1455 return;
1456 }
1457 sock->has_nodelay =
1458 qemu_opt_get(opts, "delay") ||
1459 qemu_opt_get(opts, "nodelay");
1460 sock->nodelay =
1461 !qemu_opt_get_bool(opts, "delay", true) ||
1462 qemu_opt_get_bool(opts, "nodelay", false);
1463
1464 /*
1465 * We have different default to QMP for 'server', hence
1466 * we can't just check for existence of 'server'
1467 */
1468 sock->has_server = true;
1469 sock->server = qemu_opt_get_bool(opts, "server", false);
1470 sock->has_telnet = qemu_opt_get(opts, "telnet");
1471 sock->telnet = qemu_opt_get_bool(opts, "telnet", false);
1472 sock->has_tn3270 = qemu_opt_get(opts, "tn3270");
1473 sock->tn3270 = qemu_opt_get_bool(opts, "tn3270", false);
1474 sock->has_websocket = qemu_opt_get(opts, "websocket");
1475 sock->websocket = qemu_opt_get_bool(opts, "websocket", false);
1476 /*
1477 * We have different default to QMP for 'wait' when 'server'
1478 * is set, hence we can't just check for existence of 'wait'
1479 */
1480 sock->has_wait = qemu_opt_find(opts, "wait") || sock->server;
1481 sock->wait = qemu_opt_get_bool(opts, "wait", true);
1482 sock->has_reconnect_ms = qemu_opt_find(opts, "reconnect-ms");
1483 sock->reconnect_ms = qemu_opt_get_number(opts, "reconnect-ms", 0);
1484
1485 sock->tls_creds = g_strdup(qemu_opt_get(opts, "tls-creds"));
1486 sock->tls_authz = g_strdup(qemu_opt_get(opts, "tls-authz"));
1487
1488 addr = g_new0(SocketAddressLegacy, 1);
1489 if (path) {
1490 UnixSocketAddress *q_unix;
1491 addr->type = SOCKET_ADDRESS_TYPE_UNIX;
1492 q_unix = addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
1493 q_unix->path = g_strdup(path);
1494 #ifdef CONFIG_LINUX
1495 q_unix->has_tight = true;
1496 q_unix->tight = tight;
1497 q_unix->has_abstract = true;
1498 q_unix->abstract = abstract;
1499 #endif
1500 } else if (host) {
1501 addr->type = SOCKET_ADDRESS_TYPE_INET;
1502 addr->u.inet.data = g_new(InetSocketAddress, 1);
1503 *addr->u.inet.data = (InetSocketAddress) {
1504 .host = g_strdup(host),
1505 .port = g_strdup(port),
1506 .has_to = qemu_opt_get(opts, "to"),
1507 .to = qemu_opt_get_number(opts, "to", 0),
1508 .has_ipv4 = qemu_opt_get(opts, "ipv4"),
1509 .ipv4 = qemu_opt_get_bool(opts, "ipv4", 0),
1510 .has_ipv6 = qemu_opt_get(opts, "ipv6"),
1511 .ipv6 = qemu_opt_get_bool(opts, "ipv6", 0),
1512 };
1513 } else {
1514 addr->type = SOCKET_ADDRESS_TYPE_FD;
1515 addr->u.fd.data = g_new(FdSocketAddress, 1);
1516 addr->u.fd.data->str = g_strdup(fd);
1517 }
1518 sock->addr = addr;
1519 }
1520
1521 static void
1522 char_socket_get_addr(Object *obj, Visitor *v, const char *name,
1523 void *opaque, Error **errp)
1524 {
1525 SocketChardev *s = SOCKET_CHARDEV(obj);
1526
1527 if (!s->addr) {
1528 error_setg(errp, "socket not connected");
1529 return;
1530 }
1531 visit_type_SocketAddress(v, name, &s->addr, errp);
1532 }
1533
1534 static bool
1535 char_socket_get_connected(Object *obj, Error **errp)
1536 {
1537 SocketChardev *s = SOCKET_CHARDEV(obj);
1538
1539 return s->state == TCP_CHARDEV_STATE_CONNECTED;
1540 }
1541
1542 static void tcp_chr_listener_cleanup(Chardev *chr)
1543 {
1544 SocketChardev *s = SOCKET_CHARDEV(chr);
1545 if (s->listener) {
1546 qio_net_listener_set_client_func_full(s->listener, NULL, NULL,
1547 NULL, chr->gcontext);
1548 }
1549 }
1550
1551 static void char_socket_class_init(ObjectClass *oc, const void *data)
1552 {
1553 ChardevClass *cc = CHARDEV_CLASS(oc);
1554
1555 cc->supports_yank = true;
1556
1557 cc->chr_parse = tcp_chr_parse;
1558 cc->chr_open = tcp_chr_open;
1559 cc->chr_wait_connected = tcp_chr_wait_connected;
1560 cc->chr_write = tcp_chr_write;
1561 cc->chr_sync_read = tcp_chr_sync_read;
1562 cc->chr_disconnect = tcp_chr_disconnect;
1563 cc->chr_get_msgfds = tcp_chr_get_msgfds;
1564 cc->chr_set_msgfds = tcp_chr_set_msgfds;
1565 cc->chr_add_client = tcp_chr_add_client;
1566 cc->chr_add_watch = tcp_chr_add_watch;
1567 cc->chr_update_read_handler = tcp_chr_update_read_handler;
1568 cc->chr_listener_cleanup = tcp_chr_listener_cleanup;
1569 cc->chr_get_filename = tcp_chr_get_filename;
1570
1571 object_class_property_add(oc, "addr", "SocketAddress",
1572 char_socket_get_addr, NULL,
1573 NULL, NULL);
1574
1575 object_class_property_add_bool(oc, "connected", char_socket_get_connected,
1576 NULL);
1577 }
1578
1579 static const TypeInfo char_socket_type_info = {
1580 .name = TYPE_CHARDEV_SOCKET,
1581 .parent = TYPE_CHARDEV,
1582 .instance_size = sizeof(SocketChardev),
1583 .instance_finalize = char_socket_finalize,
1584 .class_init = char_socket_class_init,
1585 };
1586
1587 static void register_types(void)
1588 {
1589 type_register_static(&char_socket_type_info);
1590 }
1591
1592 type_init(register_types);