2 * QEMU VNC display driver
5 * Copyright (C) 2006 Fabrice Bellard
6 * Copyright (C) 2009 Red Hat, Inc
8 * Permission is hereby granted, free of charge, to any person obtaining a copy
9 * of this software and associated documentation files (the "Software"), to deal
10 * in the Software without restriction, including without limitation the rights
11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 * copies of the Software, and to permit persons to whom the Software is
13 * furnished to do so, subject to the following conditions:
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27 #include "qemu/osdep.h"
31 #include "sysemu/sysemu.h"
32 #include "qemu/error-report.h"
33 #include "qemu/sockets.h"
34 #include "qemu/timer.h"
36 #include "qemu/config-file.h"
37 #include "qapi/qmp/qerror.h"
38 #include "qapi/qmp/types.h"
39 #include "qmp-commands.h"
41 #include "qapi-event.h"
42 #include "crypto/hash.h"
43 #include "crypto/tlscredsanon.h"
44 #include "crypto/tlscredsx509.h"
45 #include "qom/object_interfaces.h"
46 #include "qemu/cutils.h"
47 #include "io/dns-resolver.h"
49 #define VNC_REFRESH_INTERVAL_BASE GUI_REFRESH_INTERVAL_DEFAULT
50 #define VNC_REFRESH_INTERVAL_INC 50
51 #define VNC_REFRESH_INTERVAL_MAX GUI_REFRESH_INTERVAL_IDLE
52 static const struct timeval VNC_REFRESH_STATS = { 0, 500000 };
53 static const struct timeval VNC_REFRESH_LOSSY = { 2, 0 };
55 #include "vnc_keysym.h"
56 #include "crypto/cipher.h"
58 static QTAILQ_HEAD(, VncDisplay) vnc_displays =
59 QTAILQ_HEAD_INITIALIZER(vnc_displays);
61 static int vnc_cursor_define(VncState *vs);
62 static void vnc_release_modifiers(VncState *vs);
64 static void vnc_set_share_mode(VncState *vs, VncShareMode mode)
67 static const char *mn[] = {
69 [VNC_SHARE_MODE_CONNECTING] = "connecting",
70 [VNC_SHARE_MODE_SHARED] = "shared",
71 [VNC_SHARE_MODE_EXCLUSIVE] = "exclusive",
72 [VNC_SHARE_MODE_DISCONNECTED] = "disconnected",
74 fprintf(stderr, "%s/%p: %s -> %s\n", __func__,
75 vs->ioc, mn[vs->share_mode], mn[mode]);
78 switch (vs->share_mode) {
79 case VNC_SHARE_MODE_CONNECTING:
80 vs->vd->num_connecting--;
82 case VNC_SHARE_MODE_SHARED:
85 case VNC_SHARE_MODE_EXCLUSIVE:
86 vs->vd->num_exclusive--;
92 vs->share_mode = mode;
94 switch (vs->share_mode) {
95 case VNC_SHARE_MODE_CONNECTING:
96 vs->vd->num_connecting++;
98 case VNC_SHARE_MODE_SHARED:
101 case VNC_SHARE_MODE_EXCLUSIVE:
102 vs->vd->num_exclusive++;
110 static void vnc_init_basic_info(SocketAddress *addr,
114 switch (addr->type) {
115 case SOCKET_ADDRESS_TYPE_INET:
116 info->host = g_strdup(addr->u.inet.host);
117 info->service = g_strdup(addr->u.inet.port);
118 if (addr->u.inet.ipv6) {
119 info->family = NETWORK_ADDRESS_FAMILY_IPV6;
121 info->family = NETWORK_ADDRESS_FAMILY_IPV4;
125 case SOCKET_ADDRESS_TYPE_UNIX:
126 info->host = g_strdup("");
127 info->service = g_strdup(addr->u.q_unix.path);
128 info->family = NETWORK_ADDRESS_FAMILY_UNIX;
131 case SOCKET_ADDRESS_TYPE_VSOCK:
132 case SOCKET_ADDRESS_TYPE_FD:
133 error_setg(errp, "Unsupported socket address type %s",
134 SocketAddressType_str(addr->type));
143 static void vnc_init_basic_info_from_server_addr(QIOChannelSocket *ioc,
147 SocketAddress *addr = NULL;
150 error_setg(errp, "No listener socket available");
154 addr = qio_channel_socket_get_local_address(ioc, errp);
159 vnc_init_basic_info(addr, info, errp);
160 qapi_free_SocketAddress(addr);
163 static void vnc_init_basic_info_from_remote_addr(QIOChannelSocket *ioc,
167 SocketAddress *addr = NULL;
169 addr = qio_channel_socket_get_remote_address(ioc, errp);
174 vnc_init_basic_info(addr, info, errp);
175 qapi_free_SocketAddress(addr);
178 static const char *vnc_auth_name(VncDisplay *vd) {
180 case VNC_AUTH_INVALID:
196 case VNC_AUTH_VENCRYPT:
197 switch (vd->subauth) {
198 case VNC_AUTH_VENCRYPT_PLAIN:
199 return "vencrypt+plain";
200 case VNC_AUTH_VENCRYPT_TLSNONE:
201 return "vencrypt+tls+none";
202 case VNC_AUTH_VENCRYPT_TLSVNC:
203 return "vencrypt+tls+vnc";
204 case VNC_AUTH_VENCRYPT_TLSPLAIN:
205 return "vencrypt+tls+plain";
206 case VNC_AUTH_VENCRYPT_X509NONE:
207 return "vencrypt+x509+none";
208 case VNC_AUTH_VENCRYPT_X509VNC:
209 return "vencrypt+x509+vnc";
210 case VNC_AUTH_VENCRYPT_X509PLAIN:
211 return "vencrypt+x509+plain";
212 case VNC_AUTH_VENCRYPT_TLSSASL:
213 return "vencrypt+tls+sasl";
214 case VNC_AUTH_VENCRYPT_X509SASL:
215 return "vencrypt+x509+sasl";
225 static VncServerInfo *vnc_server_info_get(VncDisplay *vd)
234 info = g_malloc0(sizeof(*info));
235 vnc_init_basic_info_from_server_addr(vd->lsock[0],
236 qapi_VncServerInfo_base(info), &err);
237 info->has_auth = true;
238 info->auth = g_strdup(vnc_auth_name(vd));
240 qapi_free_VncServerInfo(info);
247 static void vnc_client_cache_auth(VncState *client)
254 client->info->x509_dname =
255 qcrypto_tls_session_get_peer_name(client->tls);
256 client->info->has_x509_dname =
257 client->info->x509_dname != NULL;
259 #ifdef CONFIG_VNC_SASL
260 if (client->sasl.conn &&
261 client->sasl.username) {
262 client->info->has_sasl_username = true;
263 client->info->sasl_username = g_strdup(client->sasl.username);
268 static void vnc_client_cache_addr(VncState *client)
272 client->info = g_malloc0(sizeof(*client->info));
273 vnc_init_basic_info_from_remote_addr(client->sioc,
274 qapi_VncClientInfo_base(client->info),
277 qapi_free_VncClientInfo(client->info);
283 static void vnc_qmp_event(VncState *vs, QAPIEvent event)
291 si = vnc_server_info_get(vs->vd);
297 case QAPI_EVENT_VNC_CONNECTED:
298 qapi_event_send_vnc_connected(si, qapi_VncClientInfo_base(vs->info),
301 case QAPI_EVENT_VNC_INITIALIZED:
302 qapi_event_send_vnc_initialized(si, vs->info, &error_abort);
304 case QAPI_EVENT_VNC_DISCONNECTED:
305 qapi_event_send_vnc_disconnected(si, vs->info, &error_abort);
311 qapi_free_VncServerInfo(si);
314 static VncClientInfo *qmp_query_vnc_client(const VncState *client)
319 info = g_malloc0(sizeof(*info));
321 vnc_init_basic_info_from_remote_addr(client->sioc,
322 qapi_VncClientInfo_base(info),
326 qapi_free_VncClientInfo(info);
330 info->websocket = client->websocket;
333 info->x509_dname = qcrypto_tls_session_get_peer_name(client->tls);
334 info->has_x509_dname = info->x509_dname != NULL;
336 #ifdef CONFIG_VNC_SASL
337 if (client->sasl.conn && client->sasl.username) {
338 info->has_sasl_username = true;
339 info->sasl_username = g_strdup(client->sasl.username);
346 static VncDisplay *vnc_display_find(const char *id)
351 return QTAILQ_FIRST(&vnc_displays);
353 QTAILQ_FOREACH(vd, &vnc_displays, next) {
354 if (strcmp(id, vd->id) == 0) {
361 static VncClientInfoList *qmp_query_client_list(VncDisplay *vd)
363 VncClientInfoList *cinfo, *prev = NULL;
366 QTAILQ_FOREACH(client, &vd->clients, next) {
367 cinfo = g_new0(VncClientInfoList, 1);
368 cinfo->value = qmp_query_vnc_client(client);
375 VncInfo *qmp_query_vnc(Error **errp)
377 VncInfo *info = g_malloc0(sizeof(*info));
378 VncDisplay *vd = vnc_display_find(NULL);
379 SocketAddress *addr = NULL;
381 if (vd == NULL || !vd->nlsock) {
382 info->enabled = false;
384 info->enabled = true;
386 /* for compatibility with the original command */
387 info->has_clients = true;
388 info->clients = qmp_query_client_list(vd);
390 if (vd->lsock == NULL) {
394 addr = qio_channel_socket_get_local_address(vd->lsock[0], errp);
399 switch (addr->type) {
400 case SOCKET_ADDRESS_TYPE_INET:
401 info->host = g_strdup(addr->u.inet.host);
402 info->service = g_strdup(addr->u.inet.port);
403 if (addr->u.inet.ipv6) {
404 info->family = NETWORK_ADDRESS_FAMILY_IPV6;
406 info->family = NETWORK_ADDRESS_FAMILY_IPV4;
410 case SOCKET_ADDRESS_TYPE_UNIX:
411 info->host = g_strdup("");
412 info->service = g_strdup(addr->u.q_unix.path);
413 info->family = NETWORK_ADDRESS_FAMILY_UNIX;
416 case SOCKET_ADDRESS_TYPE_VSOCK:
417 case SOCKET_ADDRESS_TYPE_FD:
418 error_setg(errp, "Unsupported socket address type %s",
419 SocketAddressType_str(addr->type));
425 info->has_host = true;
426 info->has_service = true;
427 info->has_family = true;
429 info->has_auth = true;
430 info->auth = g_strdup(vnc_auth_name(vd));
433 qapi_free_SocketAddress(addr);
437 qapi_free_SocketAddress(addr);
438 qapi_free_VncInfo(info);
443 static void qmp_query_auth(int auth, int subauth,
444 VncPrimaryAuth *qmp_auth,
445 VncVencryptSubAuth *qmp_vencrypt,
446 bool *qmp_has_vencrypt);
448 static VncServerInfo2List *qmp_query_server_entry(QIOChannelSocket *ioc,
452 VncServerInfo2List *prev)
454 VncServerInfo2List *list;
455 VncServerInfo2 *info;
459 addr = qio_channel_socket_get_local_address(ioc, &err);
465 info = g_new0(VncServerInfo2, 1);
466 vnc_init_basic_info(addr, qapi_VncServerInfo2_base(info), &err);
467 qapi_free_SocketAddress(addr);
469 qapi_free_VncServerInfo2(info);
473 info->websocket = websocket;
475 qmp_query_auth(auth, subauth, &info->auth,
476 &info->vencrypt, &info->has_vencrypt);
478 list = g_new0(VncServerInfo2List, 1);
484 static void qmp_query_auth(int auth, int subauth,
485 VncPrimaryAuth *qmp_auth,
486 VncVencryptSubAuth *qmp_vencrypt,
487 bool *qmp_has_vencrypt)
491 *qmp_auth = VNC_PRIMARY_AUTH_VNC;
494 *qmp_auth = VNC_PRIMARY_AUTH_RA2;
497 *qmp_auth = VNC_PRIMARY_AUTH_RA2NE;
500 *qmp_auth = VNC_PRIMARY_AUTH_TIGHT;
503 *qmp_auth = VNC_PRIMARY_AUTH_ULTRA;
506 *qmp_auth = VNC_PRIMARY_AUTH_TLS;
508 case VNC_AUTH_VENCRYPT:
509 *qmp_auth = VNC_PRIMARY_AUTH_VENCRYPT;
510 *qmp_has_vencrypt = true;
512 case VNC_AUTH_VENCRYPT_PLAIN:
513 *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_PLAIN;
515 case VNC_AUTH_VENCRYPT_TLSNONE:
516 *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_TLS_NONE;
518 case VNC_AUTH_VENCRYPT_TLSVNC:
519 *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_TLS_VNC;
521 case VNC_AUTH_VENCRYPT_TLSPLAIN:
522 *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_TLS_PLAIN;
524 case VNC_AUTH_VENCRYPT_X509NONE:
525 *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_X509_NONE;
527 case VNC_AUTH_VENCRYPT_X509VNC:
528 *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_X509_VNC;
530 case VNC_AUTH_VENCRYPT_X509PLAIN:
531 *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_X509_PLAIN;
533 case VNC_AUTH_VENCRYPT_TLSSASL:
534 *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_TLS_SASL;
536 case VNC_AUTH_VENCRYPT_X509SASL:
537 *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_X509_SASL;
540 *qmp_has_vencrypt = false;
545 *qmp_auth = VNC_PRIMARY_AUTH_SASL;
549 *qmp_auth = VNC_PRIMARY_AUTH_NONE;
554 VncInfo2List *qmp_query_vnc_servers(Error **errp)
556 VncInfo2List *item, *prev = NULL;
562 QTAILQ_FOREACH(vd, &vnc_displays, next) {
563 info = g_new0(VncInfo2, 1);
564 info->id = g_strdup(vd->id);
565 info->clients = qmp_query_client_list(vd);
566 qmp_query_auth(vd->auth, vd->subauth, &info->auth,
567 &info->vencrypt, &info->has_vencrypt);
569 dev = DEVICE(object_property_get_link(OBJECT(vd->dcl.con),
571 info->has_display = true;
572 info->display = g_strdup(dev->id);
574 for (i = 0; i < vd->nlsock; i++) {
575 info->server = qmp_query_server_entry(
576 vd->lsock[i], false, vd->auth, vd->subauth, info->server);
578 for (i = 0; i < vd->nlwebsock; i++) {
579 info->server = qmp_query_server_entry(
580 vd->lwebsock[i], true, vd->ws_auth,
581 vd->ws_subauth, info->server);
584 item = g_new0(VncInfo2List, 1);
593 1) Get the queue working for IO.
594 2) there is some weirdness when using the -S option (the screen is grey
595 and not totally invalidated
596 3) resolutions > 1024
599 static int vnc_update_client(VncState *vs, int has_dirty);
600 static void vnc_disconnect_start(VncState *vs);
602 static void vnc_colordepth(VncState *vs);
603 static void framebuffer_update_request(VncState *vs, int incremental,
604 int x_position, int y_position,
606 static void vnc_refresh(DisplayChangeListener *dcl);
607 static int vnc_refresh_server_surface(VncDisplay *vd);
609 static int vnc_width(VncDisplay *vd)
611 return MIN(VNC_MAX_WIDTH, ROUND_UP(surface_width(vd->ds),
612 VNC_DIRTY_PIXELS_PER_BIT));
615 static int vnc_height(VncDisplay *vd)
617 return MIN(VNC_MAX_HEIGHT, surface_height(vd->ds));
620 static void vnc_set_area_dirty(DECLARE_BITMAP(dirty[VNC_MAX_HEIGHT],
621 VNC_MAX_WIDTH / VNC_DIRTY_PIXELS_PER_BIT),
623 int x, int y, int w, int h)
625 int width = vnc_width(vd);
626 int height = vnc_height(vd);
628 /* this is needed this to ensure we updated all affected
629 * blocks if x % VNC_DIRTY_PIXELS_PER_BIT != 0 */
630 w += (x % VNC_DIRTY_PIXELS_PER_BIT);
631 x -= (x % VNC_DIRTY_PIXELS_PER_BIT);
635 w = MIN(x + w, width) - x;
636 h = MIN(y + h, height);
639 bitmap_set(dirty[y], x / VNC_DIRTY_PIXELS_PER_BIT,
640 DIV_ROUND_UP(w, VNC_DIRTY_PIXELS_PER_BIT));
644 static void vnc_dpy_update(DisplayChangeListener *dcl,
645 int x, int y, int w, int h)
647 VncDisplay *vd = container_of(dcl, VncDisplay, dcl);
648 struct VncSurface *s = &vd->guest;
650 vnc_set_area_dirty(s->dirty, vd, x, y, w, h);
653 void vnc_framebuffer_update(VncState *vs, int x, int y, int w, int h,
656 vnc_write_u16(vs, x);
657 vnc_write_u16(vs, y);
658 vnc_write_u16(vs, w);
659 vnc_write_u16(vs, h);
661 vnc_write_s32(vs, encoding);
665 static void vnc_desktop_resize(VncState *vs)
667 if (vs->ioc == NULL || !vnc_has_feature(vs, VNC_FEATURE_RESIZE)) {
670 if (vs->client_width == pixman_image_get_width(vs->vd->server) &&
671 vs->client_height == pixman_image_get_height(vs->vd->server)) {
674 vs->client_width = pixman_image_get_width(vs->vd->server);
675 vs->client_height = pixman_image_get_height(vs->vd->server);
677 vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
679 vnc_write_u16(vs, 1); /* number of rects */
680 vnc_framebuffer_update(vs, 0, 0, vs->client_width, vs->client_height,
681 VNC_ENCODING_DESKTOPRESIZE);
682 vnc_unlock_output(vs);
686 static void vnc_abort_display_jobs(VncDisplay *vd)
690 QTAILQ_FOREACH(vs, &vd->clients, next) {
693 vnc_unlock_output(vs);
695 QTAILQ_FOREACH(vs, &vd->clients, next) {
698 QTAILQ_FOREACH(vs, &vd->clients, next) {
701 vnc_unlock_output(vs);
705 int vnc_server_fb_stride(VncDisplay *vd)
707 return pixman_image_get_stride(vd->server);
710 void *vnc_server_fb_ptr(VncDisplay *vd, int x, int y)
714 ptr = (uint8_t *)pixman_image_get_data(vd->server);
715 ptr += y * vnc_server_fb_stride(vd);
716 ptr += x * VNC_SERVER_FB_BYTES;
720 static void vnc_update_server_surface(VncDisplay *vd)
724 qemu_pixman_image_unref(vd->server);
727 if (QTAILQ_EMPTY(&vd->clients)) {
731 width = vnc_width(vd);
732 height = vnc_height(vd);
733 vd->server = pixman_image_create_bits(VNC_SERVER_FB_FORMAT,
737 memset(vd->guest.dirty, 0x00, sizeof(vd->guest.dirty));
738 vnc_set_area_dirty(vd->guest.dirty, vd, 0, 0,
742 static void vnc_dpy_switch(DisplayChangeListener *dcl,
743 DisplaySurface *surface)
745 VncDisplay *vd = container_of(dcl, VncDisplay, dcl);
748 vnc_abort_display_jobs(vd);
752 vnc_update_server_surface(vd);
755 qemu_pixman_image_unref(vd->guest.fb);
756 vd->guest.fb = pixman_image_ref(surface->image);
757 vd->guest.format = surface->format;
759 QTAILQ_FOREACH(vs, &vd->clients, next) {
761 vnc_desktop_resize(vs);
762 if (vs->vd->cursor) {
763 vnc_cursor_define(vs);
765 memset(vs->dirty, 0x00, sizeof(vs->dirty));
766 vnc_set_area_dirty(vs->dirty, vd, 0, 0,
773 static void vnc_write_pixels_copy(VncState *vs,
774 void *pixels, int size)
776 vnc_write(vs, pixels, size);
779 /* slowest but generic code. */
780 void vnc_convert_pixel(VncState *vs, uint8_t *buf, uint32_t v)
784 #if VNC_SERVER_FB_FORMAT == PIXMAN_FORMAT(32, PIXMAN_TYPE_ARGB, 0, 8, 8, 8)
785 r = (((v & 0x00ff0000) >> 16) << vs->client_pf.rbits) >> 8;
786 g = (((v & 0x0000ff00) >> 8) << vs->client_pf.gbits) >> 8;
787 b = (((v & 0x000000ff) >> 0) << vs->client_pf.bbits) >> 8;
789 # error need some bits here if you change VNC_SERVER_FB_FORMAT
791 v = (r << vs->client_pf.rshift) |
792 (g << vs->client_pf.gshift) |
793 (b << vs->client_pf.bshift);
794 switch (vs->client_pf.bytes_per_pixel) {
824 static void vnc_write_pixels_generic(VncState *vs,
825 void *pixels1, int size)
829 if (VNC_SERVER_FB_BYTES == 4) {
830 uint32_t *pixels = pixels1;
833 for (i = 0; i < n; i++) {
834 vnc_convert_pixel(vs, buf, pixels[i]);
835 vnc_write(vs, buf, vs->client_pf.bytes_per_pixel);
840 int vnc_raw_send_framebuffer_update(VncState *vs, int x, int y, int w, int h)
844 VncDisplay *vd = vs->vd;
846 row = vnc_server_fb_ptr(vd, x, y);
847 for (i = 0; i < h; i++) {
848 vs->write_pixels(vs, row, w * VNC_SERVER_FB_BYTES);
849 row += vnc_server_fb_stride(vd);
854 int vnc_send_framebuffer_update(VncState *vs, int x, int y, int w, int h)
857 bool encode_raw = false;
858 size_t saved_offs = vs->output.offset;
860 switch(vs->vnc_encoding) {
861 case VNC_ENCODING_ZLIB:
862 n = vnc_zlib_send_framebuffer_update(vs, x, y, w, h);
864 case VNC_ENCODING_HEXTILE:
865 vnc_framebuffer_update(vs, x, y, w, h, VNC_ENCODING_HEXTILE);
866 n = vnc_hextile_send_framebuffer_update(vs, x, y, w, h);
868 case VNC_ENCODING_TIGHT:
869 n = vnc_tight_send_framebuffer_update(vs, x, y, w, h);
871 case VNC_ENCODING_TIGHT_PNG:
872 n = vnc_tight_png_send_framebuffer_update(vs, x, y, w, h);
874 case VNC_ENCODING_ZRLE:
875 n = vnc_zrle_send_framebuffer_update(vs, x, y, w, h);
877 case VNC_ENCODING_ZYWRLE:
878 n = vnc_zywrle_send_framebuffer_update(vs, x, y, w, h);
885 /* If the client has the same pixel format as our internal buffer and
886 * a RAW encoding would need less space fall back to RAW encoding to
887 * save bandwidth and processing power in the client. */
888 if (!encode_raw && vs->write_pixels == vnc_write_pixels_copy &&
889 12 + h * w * VNC_SERVER_FB_BYTES <= (vs->output.offset - saved_offs)) {
890 vs->output.offset = saved_offs;
895 vnc_framebuffer_update(vs, x, y, w, h, VNC_ENCODING_RAW);
896 n = vnc_raw_send_framebuffer_update(vs, x, y, w, h);
902 static void vnc_mouse_set(DisplayChangeListener *dcl,
903 int x, int y, int visible)
905 /* can we ask the client(s) to move the pointer ??? */
908 static int vnc_cursor_define(VncState *vs)
910 QEMUCursor *c = vs->vd->cursor;
913 if (vnc_has_feature(vs, VNC_FEATURE_RICH_CURSOR)) {
915 vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
916 vnc_write_u8(vs, 0); /* padding */
917 vnc_write_u16(vs, 1); /* # of rects */
918 vnc_framebuffer_update(vs, c->hot_x, c->hot_y, c->width, c->height,
919 VNC_ENCODING_RICH_CURSOR);
920 isize = c->width * c->height * vs->client_pf.bytes_per_pixel;
921 vnc_write_pixels_generic(vs, c->data, isize);
922 vnc_write(vs, vs->vd->cursor_mask, vs->vd->cursor_msize);
923 vnc_unlock_output(vs);
929 static void vnc_dpy_cursor_define(DisplayChangeListener *dcl,
932 VncDisplay *vd = container_of(dcl, VncDisplay, dcl);
935 cursor_put(vd->cursor);
936 g_free(vd->cursor_mask);
939 cursor_get(vd->cursor);
940 vd->cursor_msize = cursor_get_mono_bpl(c) * c->height;
941 vd->cursor_mask = g_malloc0(vd->cursor_msize);
942 cursor_get_mono_mask(c, 0, vd->cursor_mask);
944 QTAILQ_FOREACH(vs, &vd->clients, next) {
945 vnc_cursor_define(vs);
949 static int find_and_clear_dirty_height(VncState *vs,
950 int y, int last_x, int x, int height)
954 for (h = 1; h < (height - y); h++) {
955 if (!test_bit(last_x, vs->dirty[y + h])) {
958 bitmap_clear(vs->dirty[y + h], last_x, x - last_x);
964 static int vnc_update_client(VncState *vs, int has_dirty)
966 if (vs->disconnecting) {
967 vnc_disconnect_finish(vs);
971 vs->has_dirty += has_dirty;
972 if (vs->need_update) {
973 VncDisplay *vd = vs->vd;
979 if (vs->output.offset && !vs->audio_cap && !vs->force_update)
980 /* kernel send buffers are full -> drop frames to throttle */
983 if (!vs->has_dirty && !vs->audio_cap && !vs->force_update)
987 * Send screen updates to the vnc client using the server
988 * surface and server dirty map. guest surface updates
989 * happening in parallel don't disturb us, the next pass will
990 * send them to the client.
992 job = vnc_job_new(vs);
994 height = pixman_image_get_height(vd->server);
995 width = pixman_image_get_width(vd->server);
1001 unsigned long offset = find_next_bit((unsigned long *) &vs->dirty,
1002 height * VNC_DIRTY_BPL(vs),
1003 y * VNC_DIRTY_BPL(vs));
1004 if (offset == height * VNC_DIRTY_BPL(vs)) {
1005 /* no more dirty bits */
1008 y = offset / VNC_DIRTY_BPL(vs);
1009 x = offset % VNC_DIRTY_BPL(vs);
1010 x2 = find_next_zero_bit((unsigned long *) &vs->dirty[y],
1011 VNC_DIRTY_BPL(vs), x);
1012 bitmap_clear(vs->dirty[y], x, x2 - x);
1013 h = find_and_clear_dirty_height(vs, y, x, x2, height);
1014 x2 = MIN(x2, width / VNC_DIRTY_PIXELS_PER_BIT);
1016 n += vnc_job_add_rect(job, x * VNC_DIRTY_PIXELS_PER_BIT, y,
1017 (x2 - x) * VNC_DIRTY_PIXELS_PER_BIT, h);
1019 if (!x && x2 == width / VNC_DIRTY_PIXELS_PER_BIT) {
1028 vs->force_update = 0;
1037 static void audio_capture_notify(void *opaque, audcnotification_e cmd)
1039 VncState *vs = opaque;
1042 case AUD_CNOTIFY_DISABLE:
1043 vnc_lock_output(vs);
1044 vnc_write_u8(vs, VNC_MSG_SERVER_QEMU);
1045 vnc_write_u8(vs, VNC_MSG_SERVER_QEMU_AUDIO);
1046 vnc_write_u16(vs, VNC_MSG_SERVER_QEMU_AUDIO_END);
1047 vnc_unlock_output(vs);
1051 case AUD_CNOTIFY_ENABLE:
1052 vnc_lock_output(vs);
1053 vnc_write_u8(vs, VNC_MSG_SERVER_QEMU);
1054 vnc_write_u8(vs, VNC_MSG_SERVER_QEMU_AUDIO);
1055 vnc_write_u16(vs, VNC_MSG_SERVER_QEMU_AUDIO_BEGIN);
1056 vnc_unlock_output(vs);
1062 static void audio_capture_destroy(void *opaque)
1066 static void audio_capture(void *opaque, void *buf, int size)
1068 VncState *vs = opaque;
1070 vnc_lock_output(vs);
1071 vnc_write_u8(vs, VNC_MSG_SERVER_QEMU);
1072 vnc_write_u8(vs, VNC_MSG_SERVER_QEMU_AUDIO);
1073 vnc_write_u16(vs, VNC_MSG_SERVER_QEMU_AUDIO_DATA);
1074 vnc_write_u32(vs, size);
1075 vnc_write(vs, buf, size);
1076 vnc_unlock_output(vs);
1080 static void audio_add(VncState *vs)
1082 struct audio_capture_ops ops;
1084 if (vs->audio_cap) {
1085 error_report("audio already running");
1089 ops.notify = audio_capture_notify;
1090 ops.destroy = audio_capture_destroy;
1091 ops.capture = audio_capture;
1093 vs->audio_cap = AUD_add_capture(&vs->as, &ops, vs);
1094 if (!vs->audio_cap) {
1095 error_report("Failed to add audio capture");
1099 static void audio_del(VncState *vs)
1101 if (vs->audio_cap) {
1102 AUD_del_capture(vs->audio_cap, vs);
1103 vs->audio_cap = NULL;
1107 static void vnc_disconnect_start(VncState *vs)
1109 if (vs->disconnecting) {
1112 trace_vnc_client_disconnect_start(vs, vs->ioc);
1113 vnc_set_share_mode(vs, VNC_SHARE_MODE_DISCONNECTED);
1115 g_source_remove(vs->ioc_tag);
1118 qio_channel_close(vs->ioc, NULL);
1119 vs->disconnecting = TRUE;
1122 void vnc_disconnect_finish(VncState *vs)
1126 trace_vnc_client_disconnect_finish(vs, vs->ioc);
1128 vnc_jobs_join(vs); /* Wait encoding jobs */
1130 vnc_lock_output(vs);
1131 vnc_qmp_event(vs, QAPI_EVENT_VNC_DISCONNECTED);
1133 buffer_free(&vs->input);
1134 buffer_free(&vs->output);
1136 qapi_free_VncClientInfo(vs->info);
1139 vnc_tight_clear(vs);
1142 #ifdef CONFIG_VNC_SASL
1143 vnc_sasl_client_cleanup(vs);
1144 #endif /* CONFIG_VNC_SASL */
1146 vnc_release_modifiers(vs);
1148 if (vs->mouse_mode_notifier.notify != NULL) {
1149 qemu_remove_mouse_mode_change_notifier(&vs->mouse_mode_notifier);
1151 QTAILQ_REMOVE(&vs->vd->clients, vs, next);
1152 if (QTAILQ_EMPTY(&vs->vd->clients)) {
1153 /* last client gone */
1154 vnc_update_server_surface(vs->vd);
1157 vnc_unlock_output(vs);
1159 qemu_mutex_destroy(&vs->output_mutex);
1160 if (vs->bh != NULL) {
1161 qemu_bh_delete(vs->bh);
1163 buffer_free(&vs->jobs_buffer);
1165 for (i = 0; i < VNC_STAT_ROWS; ++i) {
1166 g_free(vs->lossy_rect[i]);
1168 g_free(vs->lossy_rect);
1170 object_unref(OBJECT(vs->ioc));
1172 object_unref(OBJECT(vs->sioc));
1177 ssize_t vnc_client_io_error(VncState *vs, ssize_t ret, Error **errp)
1181 trace_vnc_client_eof(vs, vs->ioc);
1182 vnc_disconnect_start(vs);
1183 } else if (ret != QIO_CHANNEL_ERR_BLOCK) {
1184 trace_vnc_client_io_error(vs, vs->ioc,
1185 errp ? error_get_pretty(*errp) :
1187 vnc_disconnect_start(vs);
1200 void vnc_client_error(VncState *vs)
1202 VNC_DEBUG("Closing down client sock: protocol error\n");
1203 vnc_disconnect_start(vs);
1208 * Called to write a chunk of data to the client socket. The data may
1209 * be the raw data, or may have already been encoded by SASL.
1210 * The data will be written either straight onto the socket, or
1211 * written via the GNUTLS wrappers, if TLS/SSL encryption is enabled
1213 * NB, it is theoretically possible to have 2 layers of encryption,
1214 * both SASL, and this TLS layer. It is highly unlikely in practice
1215 * though, since SASL encryption will typically be a no-op if TLS
1218 * Returns the number of bytes written, which may be less than
1219 * the requested 'datalen' if the socket would block. Returns
1220 * -1 on error, and disconnects the client socket.
1222 ssize_t vnc_client_write_buf(VncState *vs, const uint8_t *data, size_t datalen)
1226 ret = qio_channel_write(
1227 vs->ioc, (const char *)data, datalen, &err);
1228 VNC_DEBUG("Wrote wire %p %zd -> %ld\n", data, datalen, ret);
1229 return vnc_client_io_error(vs, ret, &err);
1234 * Called to write buffered data to the client socket, when not
1235 * using any SASL SSF encryption layers. Will write as much data
1236 * as possible without blocking. If all buffered data is written,
1237 * will switch the FD poll() handler back to read monitoring.
1239 * Returns the number of bytes written, which may be less than
1240 * the buffered output data if the socket would block. Returns
1241 * -1 on error, and disconnects the client socket.
1243 static ssize_t vnc_client_write_plain(VncState *vs)
1247 #ifdef CONFIG_VNC_SASL
1248 VNC_DEBUG("Write Plain: Pending output %p size %zd offset %zd. Wait SSF %d\n",
1249 vs->output.buffer, vs->output.capacity, vs->output.offset,
1250 vs->sasl.waitWriteSSF);
1252 if (vs->sasl.conn &&
1254 vs->sasl.waitWriteSSF) {
1255 ret = vnc_client_write_buf(vs, vs->output.buffer, vs->sasl.waitWriteSSF);
1257 vs->sasl.waitWriteSSF -= ret;
1259 #endif /* CONFIG_VNC_SASL */
1260 ret = vnc_client_write_buf(vs, vs->output.buffer, vs->output.offset);
1264 buffer_advance(&vs->output, ret);
1266 if (vs->output.offset == 0) {
1268 g_source_remove(vs->ioc_tag);
1270 vs->ioc_tag = qio_channel_add_watch(
1271 vs->ioc, G_IO_IN, vnc_client_io, vs, NULL);
1279 * First function called whenever there is data to be written to
1280 * the client socket. Will delegate actual work according to whether
1281 * SASL SSF layers are enabled (thus requiring encryption calls)
1283 static void vnc_client_write_locked(VncState *vs)
1285 #ifdef CONFIG_VNC_SASL
1286 if (vs->sasl.conn &&
1288 !vs->sasl.waitWriteSSF) {
1289 vnc_client_write_sasl(vs);
1291 #endif /* CONFIG_VNC_SASL */
1293 vnc_client_write_plain(vs);
1297 static void vnc_client_write(VncState *vs)
1300 vnc_lock_output(vs);
1301 if (vs->output.offset) {
1302 vnc_client_write_locked(vs);
1303 } else if (vs->ioc != NULL) {
1305 g_source_remove(vs->ioc_tag);
1307 vs->ioc_tag = qio_channel_add_watch(
1308 vs->ioc, G_IO_IN, vnc_client_io, vs, NULL);
1310 vnc_unlock_output(vs);
1313 void vnc_read_when(VncState *vs, VncReadEvent *func, size_t expecting)
1315 vs->read_handler = func;
1316 vs->read_handler_expect = expecting;
1321 * Called to read a chunk of data from the client socket. The data may
1322 * be the raw data, or may need to be further decoded by SASL.
1323 * The data will be read either straight from to the socket, or
1324 * read via the GNUTLS wrappers, if TLS/SSL encryption is enabled
1326 * NB, it is theoretically possible to have 2 layers of encryption,
1327 * both SASL, and this TLS layer. It is highly unlikely in practice
1328 * though, since SASL encryption will typically be a no-op if TLS
1331 * Returns the number of bytes read, which may be less than
1332 * the requested 'datalen' if the socket would block. Returns
1333 * -1 on error, and disconnects the client socket.
1335 ssize_t vnc_client_read_buf(VncState *vs, uint8_t *data, size_t datalen)
1339 ret = qio_channel_read(
1340 vs->ioc, (char *)data, datalen, &err);
1341 VNC_DEBUG("Read wire %p %zd -> %ld\n", data, datalen, ret);
1342 return vnc_client_io_error(vs, ret, &err);
1347 * Called to read data from the client socket to the input buffer,
1348 * when not using any SASL SSF encryption layers. Will read as much
1349 * data as possible without blocking.
1351 * Returns the number of bytes read. Returns -1 on error, and
1352 * disconnects the client socket.
1354 static ssize_t vnc_client_read_plain(VncState *vs)
1357 VNC_DEBUG("Read plain %p size %zd offset %zd\n",
1358 vs->input.buffer, vs->input.capacity, vs->input.offset);
1359 buffer_reserve(&vs->input, 4096);
1360 ret = vnc_client_read_buf(vs, buffer_end(&vs->input), 4096);
1363 vs->input.offset += ret;
1367 static void vnc_jobs_bh(void *opaque)
1369 VncState *vs = opaque;
1371 vnc_jobs_consume_buffer(vs);
1375 * First function called whenever there is more data to be read from
1376 * the client socket. Will delegate actual work according to whether
1377 * SASL SSF layers are enabled (thus requiring decryption calls)
1378 * Returns 0 on success, -1 if client disconnected
1380 static int vnc_client_read(VncState *vs)
1384 #ifdef CONFIG_VNC_SASL
1385 if (vs->sasl.conn && vs->sasl.runSSF)
1386 ret = vnc_client_read_sasl(vs);
1388 #endif /* CONFIG_VNC_SASL */
1389 ret = vnc_client_read_plain(vs);
1391 if (vs->disconnecting) {
1392 vnc_disconnect_finish(vs);
1398 while (vs->read_handler && vs->input.offset >= vs->read_handler_expect) {
1399 size_t len = vs->read_handler_expect;
1402 ret = vs->read_handler(vs, vs->input.buffer, len);
1403 if (vs->disconnecting) {
1404 vnc_disconnect_finish(vs);
1409 buffer_advance(&vs->input, len);
1411 vs->read_handler_expect = ret;
1417 gboolean vnc_client_io(QIOChannel *ioc G_GNUC_UNUSED,
1418 GIOCondition condition, void *opaque)
1420 VncState *vs = opaque;
1421 if (condition & G_IO_IN) {
1422 if (vnc_client_read(vs) < 0) {
1426 if (condition & G_IO_OUT) {
1427 vnc_client_write(vs);
1433 void vnc_write(VncState *vs, const void *data, size_t len)
1435 buffer_reserve(&vs->output, len);
1437 if (vs->ioc != NULL && buffer_empty(&vs->output)) {
1439 g_source_remove(vs->ioc_tag);
1441 vs->ioc_tag = qio_channel_add_watch(
1442 vs->ioc, G_IO_IN | G_IO_OUT, vnc_client_io, vs, NULL);
1445 buffer_append(&vs->output, data, len);
1448 void vnc_write_s32(VncState *vs, int32_t value)
1450 vnc_write_u32(vs, *(uint32_t *)&value);
1453 void vnc_write_u32(VncState *vs, uint32_t value)
1457 buf[0] = (value >> 24) & 0xFF;
1458 buf[1] = (value >> 16) & 0xFF;
1459 buf[2] = (value >> 8) & 0xFF;
1460 buf[3] = value & 0xFF;
1462 vnc_write(vs, buf, 4);
1465 void vnc_write_u16(VncState *vs, uint16_t value)
1469 buf[0] = (value >> 8) & 0xFF;
1470 buf[1] = value & 0xFF;
1472 vnc_write(vs, buf, 2);
1475 void vnc_write_u8(VncState *vs, uint8_t value)
1477 vnc_write(vs, (char *)&value, 1);
1480 void vnc_flush(VncState *vs)
1482 vnc_lock_output(vs);
1483 if (vs->ioc != NULL && vs->output.offset) {
1484 vnc_client_write_locked(vs);
1486 vnc_unlock_output(vs);
1489 static uint8_t read_u8(uint8_t *data, size_t offset)
1491 return data[offset];
1494 static uint16_t read_u16(uint8_t *data, size_t offset)
1496 return ((data[offset] & 0xFF) << 8) | (data[offset + 1] & 0xFF);
1499 static int32_t read_s32(uint8_t *data, size_t offset)
1501 return (int32_t)((data[offset] << 24) | (data[offset + 1] << 16) |
1502 (data[offset + 2] << 8) | data[offset + 3]);
1505 uint32_t read_u32(uint8_t *data, size_t offset)
1507 return ((data[offset] << 24) | (data[offset + 1] << 16) |
1508 (data[offset + 2] << 8) | data[offset + 3]);
1511 static void client_cut_text(VncState *vs, size_t len, uint8_t *text)
1515 static void check_pointer_type_change(Notifier *notifier, void *data)
1517 VncState *vs = container_of(notifier, VncState, mouse_mode_notifier);
1518 int absolute = qemu_input_is_absolute();
1520 if (vnc_has_feature(vs, VNC_FEATURE_POINTER_TYPE_CHANGE) && vs->absolute != absolute) {
1521 vnc_lock_output(vs);
1522 vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
1523 vnc_write_u8(vs, 0);
1524 vnc_write_u16(vs, 1);
1525 vnc_framebuffer_update(vs, absolute, 0,
1526 pixman_image_get_width(vs->vd->server),
1527 pixman_image_get_height(vs->vd->server),
1528 VNC_ENCODING_POINTER_TYPE_CHANGE);
1529 vnc_unlock_output(vs);
1532 vs->absolute = absolute;
1535 static void pointer_event(VncState *vs, int button_mask, int x, int y)
1537 static uint32_t bmap[INPUT_BUTTON__MAX] = {
1538 [INPUT_BUTTON_LEFT] = 0x01,
1539 [INPUT_BUTTON_MIDDLE] = 0x02,
1540 [INPUT_BUTTON_RIGHT] = 0x04,
1541 [INPUT_BUTTON_WHEEL_UP] = 0x08,
1542 [INPUT_BUTTON_WHEEL_DOWN] = 0x10,
1544 QemuConsole *con = vs->vd->dcl.con;
1545 int width = pixman_image_get_width(vs->vd->server);
1546 int height = pixman_image_get_height(vs->vd->server);
1548 if (vs->last_bmask != button_mask) {
1549 qemu_input_update_buttons(con, bmap, vs->last_bmask, button_mask);
1550 vs->last_bmask = button_mask;
1554 qemu_input_queue_abs(con, INPUT_AXIS_X, x, 0, width);
1555 qemu_input_queue_abs(con, INPUT_AXIS_Y, y, 0, height);
1556 } else if (vnc_has_feature(vs, VNC_FEATURE_POINTER_TYPE_CHANGE)) {
1557 qemu_input_queue_rel(con, INPUT_AXIS_X, x - 0x7FFF);
1558 qemu_input_queue_rel(con, INPUT_AXIS_Y, y - 0x7FFF);
1560 if (vs->last_x != -1) {
1561 qemu_input_queue_rel(con, INPUT_AXIS_X, x - vs->last_x);
1562 qemu_input_queue_rel(con, INPUT_AXIS_Y, y - vs->last_y);
1567 qemu_input_event_sync();
1570 static void reset_keys(VncState *vs)
1573 for(i = 0; i < 256; i++) {
1574 if (vs->modifiers_state[i]) {
1575 qemu_input_event_send_key_number(vs->vd->dcl.con, i, false);
1576 qemu_input_event_send_key_delay(vs->vd->key_delay_ms);
1577 vs->modifiers_state[i] = 0;
1582 static void press_key(VncState *vs, int keysym)
1584 int keycode = keysym2scancode(vs->vd->kbd_layout, keysym) & SCANCODE_KEYMASK;
1585 qemu_input_event_send_key_number(vs->vd->dcl.con, keycode, true);
1586 qemu_input_event_send_key_delay(vs->vd->key_delay_ms);
1587 qemu_input_event_send_key_number(vs->vd->dcl.con, keycode, false);
1588 qemu_input_event_send_key_delay(vs->vd->key_delay_ms);
1591 static void vnc_led_state_change(VncState *vs)
1593 if (!vnc_has_feature(vs, VNC_FEATURE_LED_STATE)) {
1597 vnc_lock_output(vs);
1598 vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
1599 vnc_write_u8(vs, 0);
1600 vnc_write_u16(vs, 1);
1601 vnc_framebuffer_update(vs, 0, 0, 1, 1, VNC_ENCODING_LED_STATE);
1602 vnc_write_u8(vs, vs->vd->ledstate);
1603 vnc_unlock_output(vs);
1607 static void kbd_leds(void *opaque, int ledstate)
1609 VncDisplay *vd = opaque;
1612 trace_vnc_key_guest_leds((ledstate & QEMU_CAPS_LOCK_LED),
1613 (ledstate & QEMU_NUM_LOCK_LED),
1614 (ledstate & QEMU_SCROLL_LOCK_LED));
1616 if (ledstate == vd->ledstate) {
1620 vd->ledstate = ledstate;
1622 QTAILQ_FOREACH(client, &vd->clients, next) {
1623 vnc_led_state_change(client);
1627 static void do_key_event(VncState *vs, int down, int keycode, int sym)
1629 /* QEMU console switch */
1631 case 0x2a: /* Left Shift */
1632 case 0x36: /* Right Shift */
1633 case 0x1d: /* Left CTRL */
1634 case 0x9d: /* Right CTRL */
1635 case 0x38: /* Left ALT */
1636 case 0xb8: /* Right ALT */
1638 vs->modifiers_state[keycode] = 1;
1640 vs->modifiers_state[keycode] = 0;
1642 case 0x02 ... 0x0a: /* '1' to '9' keys */
1643 if (vs->vd->dcl.con == NULL &&
1644 down && vs->modifiers_state[0x1d] && vs->modifiers_state[0x38]) {
1645 /* Reset the modifiers sent to the current console */
1647 console_select(keycode - 0x02);
1651 case 0x3a: /* CapsLock */
1652 case 0x45: /* NumLock */
1654 vs->modifiers_state[keycode] ^= 1;
1658 /* Turn off the lock state sync logic if the client support the led
1661 if (down && vs->vd->lock_key_sync &&
1662 !vnc_has_feature(vs, VNC_FEATURE_LED_STATE) &&
1663 keycode_is_keypad(vs->vd->kbd_layout, keycode)) {
1664 /* If the numlock state needs to change then simulate an additional
1665 keypress before sending this one. This will happen if the user
1666 toggles numlock away from the VNC window.
1668 if (keysym_is_numlock(vs->vd->kbd_layout, sym & 0xFFFF)) {
1669 if (!vs->modifiers_state[0x45]) {
1670 trace_vnc_key_sync_numlock(true);
1671 vs->modifiers_state[0x45] = 1;
1672 press_key(vs, 0xff7f);
1675 if (vs->modifiers_state[0x45]) {
1676 trace_vnc_key_sync_numlock(false);
1677 vs->modifiers_state[0x45] = 0;
1678 press_key(vs, 0xff7f);
1683 if (down && vs->vd->lock_key_sync &&
1684 !vnc_has_feature(vs, VNC_FEATURE_LED_STATE) &&
1685 ((sym >= 'A' && sym <= 'Z') || (sym >= 'a' && sym <= 'z'))) {
1686 /* If the capslock state needs to change then simulate an additional
1687 keypress before sending this one. This will happen if the user
1688 toggles capslock away from the VNC window.
1690 int uppercase = !!(sym >= 'A' && sym <= 'Z');
1691 int shift = !!(vs->modifiers_state[0x2a] | vs->modifiers_state[0x36]);
1692 int capslock = !!(vs->modifiers_state[0x3a]);
1694 if (uppercase == shift) {
1695 trace_vnc_key_sync_capslock(false);
1696 vs->modifiers_state[0x3a] = 0;
1697 press_key(vs, 0xffe5);
1700 if (uppercase != shift) {
1701 trace_vnc_key_sync_capslock(true);
1702 vs->modifiers_state[0x3a] = 1;
1703 press_key(vs, 0xffe5);
1708 if (qemu_console_is_graphic(NULL)) {
1709 qemu_input_event_send_key_number(vs->vd->dcl.con, keycode, down);
1710 qemu_input_event_send_key_delay(vs->vd->key_delay_ms);
1712 bool numlock = vs->modifiers_state[0x45];
1713 bool control = (vs->modifiers_state[0x1d] ||
1714 vs->modifiers_state[0x9d]);
1715 /* QEMU console emulation */
1718 case 0x2a: /* Left Shift */
1719 case 0x36: /* Right Shift */
1720 case 0x1d: /* Left CTRL */
1721 case 0x9d: /* Right CTRL */
1722 case 0x38: /* Left ALT */
1723 case 0xb8: /* Right ALT */
1726 kbd_put_keysym(QEMU_KEY_UP);
1729 kbd_put_keysym(QEMU_KEY_DOWN);
1732 kbd_put_keysym(QEMU_KEY_LEFT);
1735 kbd_put_keysym(QEMU_KEY_RIGHT);
1738 kbd_put_keysym(QEMU_KEY_DELETE);
1741 kbd_put_keysym(QEMU_KEY_HOME);
1744 kbd_put_keysym(QEMU_KEY_END);
1747 kbd_put_keysym(QEMU_KEY_PAGEUP);
1750 kbd_put_keysym(QEMU_KEY_PAGEDOWN);
1754 kbd_put_keysym(numlock ? '7' : QEMU_KEY_HOME);
1757 kbd_put_keysym(numlock ? '8' : QEMU_KEY_UP);
1760 kbd_put_keysym(numlock ? '9' : QEMU_KEY_PAGEUP);
1763 kbd_put_keysym(numlock ? '4' : QEMU_KEY_LEFT);
1766 kbd_put_keysym('5');
1769 kbd_put_keysym(numlock ? '6' : QEMU_KEY_RIGHT);
1772 kbd_put_keysym(numlock ? '1' : QEMU_KEY_END);
1775 kbd_put_keysym(numlock ? '2' : QEMU_KEY_DOWN);
1778 kbd_put_keysym(numlock ? '3' : QEMU_KEY_PAGEDOWN);
1781 kbd_put_keysym('0');
1784 kbd_put_keysym(numlock ? '.' : QEMU_KEY_DELETE);
1788 kbd_put_keysym('/');
1791 kbd_put_keysym('*');
1794 kbd_put_keysym('-');
1797 kbd_put_keysym('+');
1800 kbd_put_keysym('\n');
1805 kbd_put_keysym(sym & 0x1f);
1807 kbd_put_keysym(sym);
1815 static void vnc_release_modifiers(VncState *vs)
1817 static const int keycodes[] = {
1818 /* shift, control, alt keys, both left & right */
1819 0x2a, 0x36, 0x1d, 0x9d, 0x38, 0xb8,
1823 if (!qemu_console_is_graphic(NULL)) {
1826 for (i = 0; i < ARRAY_SIZE(keycodes); i++) {
1827 keycode = keycodes[i];
1828 if (!vs->modifiers_state[keycode]) {
1831 qemu_input_event_send_key_number(vs->vd->dcl.con, keycode, false);
1832 qemu_input_event_send_key_delay(vs->vd->key_delay_ms);
1836 static const char *code2name(int keycode)
1838 return QKeyCode_str(qemu_input_key_number_to_qcode(keycode));
1841 static void key_event(VncState *vs, int down, uint32_t sym)
1846 if (lsym >= 'A' && lsym <= 'Z' && qemu_console_is_graphic(NULL)) {
1847 lsym = lsym - 'A' + 'a';
1850 keycode = keysym2scancode(vs->vd->kbd_layout, lsym & 0xFFFF) & SCANCODE_KEYMASK;
1851 trace_vnc_key_event_map(down, sym, keycode, code2name(keycode));
1852 do_key_event(vs, down, keycode, sym);
1855 static void ext_key_event(VncState *vs, int down,
1856 uint32_t sym, uint16_t keycode)
1858 /* if the user specifies a keyboard layout, always use it */
1859 if (keyboard_layout) {
1860 key_event(vs, down, sym);
1862 trace_vnc_key_event_ext(down, sym, keycode, code2name(keycode));
1863 do_key_event(vs, down, keycode, sym);
1867 static void framebuffer_update_request(VncState *vs, int incremental,
1868 int x, int y, int w, int h)
1870 vs->need_update = 1;
1876 vs->force_update = 1;
1877 vnc_set_area_dirty(vs->dirty, vs->vd, x, y, w, h);
1880 static void send_ext_key_event_ack(VncState *vs)
1882 vnc_lock_output(vs);
1883 vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
1884 vnc_write_u8(vs, 0);
1885 vnc_write_u16(vs, 1);
1886 vnc_framebuffer_update(vs, 0, 0,
1887 pixman_image_get_width(vs->vd->server),
1888 pixman_image_get_height(vs->vd->server),
1889 VNC_ENCODING_EXT_KEY_EVENT);
1890 vnc_unlock_output(vs);
1894 static void send_ext_audio_ack(VncState *vs)
1896 vnc_lock_output(vs);
1897 vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
1898 vnc_write_u8(vs, 0);
1899 vnc_write_u16(vs, 1);
1900 vnc_framebuffer_update(vs, 0, 0,
1901 pixman_image_get_width(vs->vd->server),
1902 pixman_image_get_height(vs->vd->server),
1903 VNC_ENCODING_AUDIO);
1904 vnc_unlock_output(vs);
1908 static void set_encodings(VncState *vs, int32_t *encodings, size_t n_encodings)
1911 unsigned int enc = 0;
1914 vs->vnc_encoding = 0;
1915 vs->tight.compression = 9;
1916 vs->tight.quality = -1; /* Lossless by default */
1920 * Start from the end because the encodings are sent in order of preference.
1921 * This way the preferred encoding (first encoding defined in the array)
1922 * will be set at the end of the loop.
1924 for (i = n_encodings - 1; i >= 0; i--) {
1927 case VNC_ENCODING_RAW:
1928 vs->vnc_encoding = enc;
1930 case VNC_ENCODING_COPYRECT:
1931 vs->features |= VNC_FEATURE_COPYRECT_MASK;
1933 case VNC_ENCODING_HEXTILE:
1934 vs->features |= VNC_FEATURE_HEXTILE_MASK;
1935 vs->vnc_encoding = enc;
1937 case VNC_ENCODING_TIGHT:
1938 vs->features |= VNC_FEATURE_TIGHT_MASK;
1939 vs->vnc_encoding = enc;
1941 #ifdef CONFIG_VNC_PNG
1942 case VNC_ENCODING_TIGHT_PNG:
1943 vs->features |= VNC_FEATURE_TIGHT_PNG_MASK;
1944 vs->vnc_encoding = enc;
1947 case VNC_ENCODING_ZLIB:
1948 vs->features |= VNC_FEATURE_ZLIB_MASK;
1949 vs->vnc_encoding = enc;
1951 case VNC_ENCODING_ZRLE:
1952 vs->features |= VNC_FEATURE_ZRLE_MASK;
1953 vs->vnc_encoding = enc;
1955 case VNC_ENCODING_ZYWRLE:
1956 vs->features |= VNC_FEATURE_ZYWRLE_MASK;
1957 vs->vnc_encoding = enc;
1959 case VNC_ENCODING_DESKTOPRESIZE:
1960 vs->features |= VNC_FEATURE_RESIZE_MASK;
1962 case VNC_ENCODING_POINTER_TYPE_CHANGE:
1963 vs->features |= VNC_FEATURE_POINTER_TYPE_CHANGE_MASK;
1965 case VNC_ENCODING_RICH_CURSOR:
1966 vs->features |= VNC_FEATURE_RICH_CURSOR_MASK;
1967 if (vs->vd->cursor) {
1968 vnc_cursor_define(vs);
1971 case VNC_ENCODING_EXT_KEY_EVENT:
1972 send_ext_key_event_ack(vs);
1974 case VNC_ENCODING_AUDIO:
1975 send_ext_audio_ack(vs);
1977 case VNC_ENCODING_WMVi:
1978 vs->features |= VNC_FEATURE_WMVI_MASK;
1980 case VNC_ENCODING_LED_STATE:
1981 vs->features |= VNC_FEATURE_LED_STATE_MASK;
1983 case VNC_ENCODING_COMPRESSLEVEL0 ... VNC_ENCODING_COMPRESSLEVEL0 + 9:
1984 vs->tight.compression = (enc & 0x0F);
1986 case VNC_ENCODING_QUALITYLEVEL0 ... VNC_ENCODING_QUALITYLEVEL0 + 9:
1987 if (vs->vd->lossy) {
1988 vs->tight.quality = (enc & 0x0F);
1992 VNC_DEBUG("Unknown encoding: %d (0x%.8x): %d\n", i, enc, enc);
1996 vnc_desktop_resize(vs);
1997 check_pointer_type_change(&vs->mouse_mode_notifier, NULL);
1998 vnc_led_state_change(vs);
2001 static void set_pixel_conversion(VncState *vs)
2003 pixman_format_code_t fmt = qemu_pixman_get_format(&vs->client_pf);
2005 if (fmt == VNC_SERVER_FB_FORMAT) {
2006 vs->write_pixels = vnc_write_pixels_copy;
2007 vnc_hextile_set_pixel_conversion(vs, 0);
2009 vs->write_pixels = vnc_write_pixels_generic;
2010 vnc_hextile_set_pixel_conversion(vs, 1);
2014 static void send_color_map(VncState *vs)
2018 vnc_write_u8(vs, VNC_MSG_SERVER_SET_COLOUR_MAP_ENTRIES);
2019 vnc_write_u8(vs, 0); /* padding */
2020 vnc_write_u16(vs, 0); /* first color */
2021 vnc_write_u16(vs, 256); /* # of colors */
2023 for (i = 0; i < 256; i++) {
2024 PixelFormat *pf = &vs->client_pf;
2026 vnc_write_u16(vs, (((i >> pf->rshift) & pf->rmax) << (16 - pf->rbits)));
2027 vnc_write_u16(vs, (((i >> pf->gshift) & pf->gmax) << (16 - pf->gbits)));
2028 vnc_write_u16(vs, (((i >> pf->bshift) & pf->bmax) << (16 - pf->bbits)));
2032 static void set_pixel_format(VncState *vs, int bits_per_pixel,
2033 int big_endian_flag, int true_color_flag,
2034 int red_max, int green_max, int blue_max,
2035 int red_shift, int green_shift, int blue_shift)
2037 if (!true_color_flag) {
2038 /* Expose a reasonable default 256 color map */
2048 switch (bits_per_pixel) {
2054 vnc_client_error(vs);
2058 vs->client_pf.rmax = red_max ? red_max : 0xFF;
2059 vs->client_pf.rbits = ctpopl(red_max);
2060 vs->client_pf.rshift = red_shift;
2061 vs->client_pf.rmask = red_max << red_shift;
2062 vs->client_pf.gmax = green_max ? green_max : 0xFF;
2063 vs->client_pf.gbits = ctpopl(green_max);
2064 vs->client_pf.gshift = green_shift;
2065 vs->client_pf.gmask = green_max << green_shift;
2066 vs->client_pf.bmax = blue_max ? blue_max : 0xFF;
2067 vs->client_pf.bbits = ctpopl(blue_max);
2068 vs->client_pf.bshift = blue_shift;
2069 vs->client_pf.bmask = blue_max << blue_shift;
2070 vs->client_pf.bits_per_pixel = bits_per_pixel;
2071 vs->client_pf.bytes_per_pixel = bits_per_pixel / 8;
2072 vs->client_pf.depth = bits_per_pixel == 32 ? 24 : bits_per_pixel;
2073 vs->client_be = big_endian_flag;
2075 if (!true_color_flag) {
2079 set_pixel_conversion(vs);
2081 graphic_hw_invalidate(vs->vd->dcl.con);
2082 graphic_hw_update(vs->vd->dcl.con);
2085 static void pixel_format_message (VncState *vs) {
2086 char pad[3] = { 0, 0, 0 };
2088 vs->client_pf = qemu_default_pixelformat(32);
2090 vnc_write_u8(vs, vs->client_pf.bits_per_pixel); /* bits-per-pixel */
2091 vnc_write_u8(vs, vs->client_pf.depth); /* depth */
2093 #ifdef HOST_WORDS_BIGENDIAN
2094 vnc_write_u8(vs, 1); /* big-endian-flag */
2096 vnc_write_u8(vs, 0); /* big-endian-flag */
2098 vnc_write_u8(vs, 1); /* true-color-flag */
2099 vnc_write_u16(vs, vs->client_pf.rmax); /* red-max */
2100 vnc_write_u16(vs, vs->client_pf.gmax); /* green-max */
2101 vnc_write_u16(vs, vs->client_pf.bmax); /* blue-max */
2102 vnc_write_u8(vs, vs->client_pf.rshift); /* red-shift */
2103 vnc_write_u8(vs, vs->client_pf.gshift); /* green-shift */
2104 vnc_write_u8(vs, vs->client_pf.bshift); /* blue-shift */
2105 vnc_write(vs, pad, 3); /* padding */
2107 vnc_hextile_set_pixel_conversion(vs, 0);
2108 vs->write_pixels = vnc_write_pixels_copy;
2111 static void vnc_colordepth(VncState *vs)
2113 if (vnc_has_feature(vs, VNC_FEATURE_WMVI)) {
2114 /* Sending a WMVi message to notify the client*/
2115 vnc_lock_output(vs);
2116 vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
2117 vnc_write_u8(vs, 0);
2118 vnc_write_u16(vs, 1); /* number of rects */
2119 vnc_framebuffer_update(vs, 0, 0,
2120 pixman_image_get_width(vs->vd->server),
2121 pixman_image_get_height(vs->vd->server),
2123 pixel_format_message(vs);
2124 vnc_unlock_output(vs);
2127 set_pixel_conversion(vs);
2131 static int protocol_client_msg(VncState *vs, uint8_t *data, size_t len)
2135 VncDisplay *vd = vs->vd;
2138 update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_BASE);
2142 case VNC_MSG_CLIENT_SET_PIXEL_FORMAT:
2146 set_pixel_format(vs, read_u8(data, 4),
2147 read_u8(data, 6), read_u8(data, 7),
2148 read_u16(data, 8), read_u16(data, 10),
2149 read_u16(data, 12), read_u8(data, 14),
2150 read_u8(data, 15), read_u8(data, 16));
2152 case VNC_MSG_CLIENT_SET_ENCODINGS:
2157 limit = read_u16(data, 2);
2159 return 4 + (limit * 4);
2161 limit = read_u16(data, 2);
2163 for (i = 0; i < limit; i++) {
2164 int32_t val = read_s32(data, 4 + (i * 4));
2165 memcpy(data + 4 + (i * 4), &val, sizeof(val));
2168 set_encodings(vs, (int32_t *)(data + 4), limit);
2170 case VNC_MSG_CLIENT_FRAMEBUFFER_UPDATE_REQUEST:
2174 framebuffer_update_request(vs,
2175 read_u8(data, 1), read_u16(data, 2), read_u16(data, 4),
2176 read_u16(data, 6), read_u16(data, 8));
2178 case VNC_MSG_CLIENT_KEY_EVENT:
2182 key_event(vs, read_u8(data, 1), read_u32(data, 4));
2184 case VNC_MSG_CLIENT_POINTER_EVENT:
2188 pointer_event(vs, read_u8(data, 1), read_u16(data, 2), read_u16(data, 4));
2190 case VNC_MSG_CLIENT_CUT_TEXT:
2195 uint32_t dlen = read_u32(data, 4);
2196 if (dlen > (1 << 20)) {
2197 error_report("vnc: client_cut_text msg payload has %u bytes"
2198 " which exceeds our limit of 1MB.", dlen);
2199 vnc_client_error(vs);
2207 client_cut_text(vs, read_u32(data, 4), data + 8);
2209 case VNC_MSG_CLIENT_QEMU:
2213 switch (read_u8(data, 1)) {
2214 case VNC_MSG_CLIENT_QEMU_EXT_KEY_EVENT:
2218 ext_key_event(vs, read_u16(data, 2),
2219 read_u32(data, 4), read_u32(data, 8));
2221 case VNC_MSG_CLIENT_QEMU_AUDIO:
2225 switch (read_u16 (data, 2)) {
2226 case VNC_MSG_CLIENT_QEMU_AUDIO_ENABLE:
2229 case VNC_MSG_CLIENT_QEMU_AUDIO_DISABLE:
2232 case VNC_MSG_CLIENT_QEMU_AUDIO_SET_FORMAT:
2235 switch (read_u8(data, 4)) {
2236 case 0: vs->as.fmt = AUD_FMT_U8; break;
2237 case 1: vs->as.fmt = AUD_FMT_S8; break;
2238 case 2: vs->as.fmt = AUD_FMT_U16; break;
2239 case 3: vs->as.fmt = AUD_FMT_S16; break;
2240 case 4: vs->as.fmt = AUD_FMT_U32; break;
2241 case 5: vs->as.fmt = AUD_FMT_S32; break;
2243 VNC_DEBUG("Invalid audio format %d\n", read_u8(data, 4));
2244 vnc_client_error(vs);
2247 vs->as.nchannels = read_u8(data, 5);
2248 if (vs->as.nchannels != 1 && vs->as.nchannels != 2) {
2249 VNC_DEBUG("Invalid audio channel count %d\n",
2251 vnc_client_error(vs);
2254 vs->as.freq = read_u32(data, 6);
2257 VNC_DEBUG("Invalid audio message %d\n", read_u8(data, 4));
2258 vnc_client_error(vs);
2264 VNC_DEBUG("Msg: %d\n", read_u16(data, 0));
2265 vnc_client_error(vs);
2270 VNC_DEBUG("Msg: %d\n", data[0]);
2271 vnc_client_error(vs);
2275 vnc_read_when(vs, protocol_client_msg, 1);
2279 static int protocol_client_init(VncState *vs, uint8_t *data, size_t len)
2285 mode = data[0] ? VNC_SHARE_MODE_SHARED : VNC_SHARE_MODE_EXCLUSIVE;
2286 switch (vs->vd->share_policy) {
2287 case VNC_SHARE_POLICY_IGNORE:
2289 * Ignore the shared flag. Nothing to do here.
2291 * Doesn't conform to the rfb spec but is traditional qemu
2292 * behavior, thus left here as option for compatibility
2296 case VNC_SHARE_POLICY_ALLOW_EXCLUSIVE:
2298 * Policy: Allow clients ask for exclusive access.
2300 * Implementation: When a client asks for exclusive access,
2301 * disconnect all others. Shared connects are allowed as long
2302 * as no exclusive connection exists.
2304 * This is how the rfb spec suggests to handle the shared flag.
2306 if (mode == VNC_SHARE_MODE_EXCLUSIVE) {
2308 QTAILQ_FOREACH(client, &vs->vd->clients, next) {
2312 if (client->share_mode != VNC_SHARE_MODE_EXCLUSIVE &&
2313 client->share_mode != VNC_SHARE_MODE_SHARED) {
2316 vnc_disconnect_start(client);
2319 if (mode == VNC_SHARE_MODE_SHARED) {
2320 if (vs->vd->num_exclusive > 0) {
2321 vnc_disconnect_start(vs);
2326 case VNC_SHARE_POLICY_FORCE_SHARED:
2328 * Policy: Shared connects only.
2329 * Implementation: Disallow clients asking for exclusive access.
2331 * Useful for shared desktop sessions where you don't want
2332 * someone forgetting to say -shared when running the vnc
2333 * client disconnect everybody else.
2335 if (mode == VNC_SHARE_MODE_EXCLUSIVE) {
2336 vnc_disconnect_start(vs);
2341 vnc_set_share_mode(vs, mode);
2343 if (vs->vd->num_shared > vs->vd->connections_limit) {
2344 vnc_disconnect_start(vs);
2348 vs->client_width = pixman_image_get_width(vs->vd->server);
2349 vs->client_height = pixman_image_get_height(vs->vd->server);
2350 vnc_write_u16(vs, vs->client_width);
2351 vnc_write_u16(vs, vs->client_height);
2353 pixel_format_message(vs);
2356 size = snprintf(buf, sizeof(buf), "QEMU (%s)", qemu_name);
2357 if (size > sizeof(buf)) {
2361 size = snprintf(buf, sizeof(buf), "QEMU");
2364 vnc_write_u32(vs, size);
2365 vnc_write(vs, buf, size);
2368 vnc_client_cache_auth(vs);
2369 vnc_qmp_event(vs, QAPI_EVENT_VNC_INITIALIZED);
2371 vnc_read_when(vs, protocol_client_msg, 1);
2376 void start_client_init(VncState *vs)
2378 vnc_read_when(vs, protocol_client_init, 1);
2381 static void make_challenge(VncState *vs)
2385 srand(time(NULL)+getpid()+getpid()*987654+rand());
2387 for (i = 0 ; i < sizeof(vs->challenge) ; i++)
2388 vs->challenge[i] = (int) (256.0*rand()/(RAND_MAX+1.0));
2391 static int protocol_client_auth_vnc(VncState *vs, uint8_t *data, size_t len)
2393 unsigned char response[VNC_AUTH_CHALLENGE_SIZE];
2395 unsigned char key[8];
2396 time_t now = time(NULL);
2397 QCryptoCipher *cipher = NULL;
2400 if (!vs->vd->password) {
2401 trace_vnc_auth_fail(vs, vs->auth, "password is not set", "");
2404 if (vs->vd->expires < now) {
2405 trace_vnc_auth_fail(vs, vs->auth, "password is expired", "");
2409 memcpy(response, vs->challenge, VNC_AUTH_CHALLENGE_SIZE);
2411 /* Calculate the expected challenge response */
2412 pwlen = strlen(vs->vd->password);
2413 for (i=0; i<sizeof(key); i++)
2414 key[i] = i<pwlen ? vs->vd->password[i] : 0;
2416 cipher = qcrypto_cipher_new(
2417 QCRYPTO_CIPHER_ALG_DES_RFB,
2418 QCRYPTO_CIPHER_MODE_ECB,
2419 key, G_N_ELEMENTS(key),
2422 trace_vnc_auth_fail(vs, vs->auth, "cannot create cipher",
2423 error_get_pretty(err));
2428 if (qcrypto_cipher_encrypt(cipher,
2431 VNC_AUTH_CHALLENGE_SIZE,
2433 trace_vnc_auth_fail(vs, vs->auth, "cannot encrypt challenge response",
2434 error_get_pretty(err));
2439 /* Compare expected vs actual challenge response */
2440 if (memcmp(response, data, VNC_AUTH_CHALLENGE_SIZE) != 0) {
2441 trace_vnc_auth_fail(vs, vs->auth, "mis-matched challenge response", "");
2444 trace_vnc_auth_pass(vs, vs->auth);
2445 vnc_write_u32(vs, 0); /* Accept auth */
2448 start_client_init(vs);
2451 qcrypto_cipher_free(cipher);
2455 vnc_write_u32(vs, 1); /* Reject auth */
2456 if (vs->minor >= 8) {
2457 static const char err[] = "Authentication failed";
2458 vnc_write_u32(vs, sizeof(err));
2459 vnc_write(vs, err, sizeof(err));
2462 vnc_client_error(vs);
2463 qcrypto_cipher_free(cipher);
2467 void start_auth_vnc(VncState *vs)
2470 /* Send client a 'random' challenge */
2471 vnc_write(vs, vs->challenge, sizeof(vs->challenge));
2474 vnc_read_when(vs, protocol_client_auth_vnc, sizeof(vs->challenge));
2478 static int protocol_client_auth(VncState *vs, uint8_t *data, size_t len)
2480 /* We only advertise 1 auth scheme at a time, so client
2481 * must pick the one we sent. Verify this */
2482 if (data[0] != vs->auth) { /* Reject auth */
2483 trace_vnc_auth_reject(vs, vs->auth, (int)data[0]);
2484 vnc_write_u32(vs, 1);
2485 if (vs->minor >= 8) {
2486 static const char err[] = "Authentication failed";
2487 vnc_write_u32(vs, sizeof(err));
2488 vnc_write(vs, err, sizeof(err));
2490 vnc_client_error(vs);
2491 } else { /* Accept requested auth */
2492 trace_vnc_auth_start(vs, vs->auth);
2495 if (vs->minor >= 8) {
2496 vnc_write_u32(vs, 0); /* Accept auth completion */
2499 trace_vnc_auth_pass(vs, vs->auth);
2500 start_client_init(vs);
2507 case VNC_AUTH_VENCRYPT:
2508 start_auth_vencrypt(vs);
2511 #ifdef CONFIG_VNC_SASL
2513 start_auth_sasl(vs);
2515 #endif /* CONFIG_VNC_SASL */
2517 default: /* Should not be possible, but just in case */
2518 trace_vnc_auth_fail(vs, vs->auth, "Unhandled auth method", "");
2519 vnc_write_u8(vs, 1);
2520 if (vs->minor >= 8) {
2521 static const char err[] = "Authentication failed";
2522 vnc_write_u32(vs, sizeof(err));
2523 vnc_write(vs, err, sizeof(err));
2525 vnc_client_error(vs);
2531 static int protocol_version(VncState *vs, uint8_t *version, size_t len)
2535 memcpy(local, version, 12);
2538 if (sscanf(local, "RFB %03d.%03d\n", &vs->major, &vs->minor) != 2) {
2539 VNC_DEBUG("Malformed protocol version %s\n", local);
2540 vnc_client_error(vs);
2543 VNC_DEBUG("Client request protocol version %d.%d\n", vs->major, vs->minor);
2544 if (vs->major != 3 ||
2550 VNC_DEBUG("Unsupported client version\n");
2551 vnc_write_u32(vs, VNC_AUTH_INVALID);
2553 vnc_client_error(vs);
2556 /* Some broken clients report v3.4 or v3.5, which spec requires to be treated
2557 * as equivalent to v3.3 by servers
2559 if (vs->minor == 4 || vs->minor == 5)
2562 if (vs->minor == 3) {
2563 trace_vnc_auth_start(vs, vs->auth);
2564 if (vs->auth == VNC_AUTH_NONE) {
2565 vnc_write_u32(vs, vs->auth);
2567 trace_vnc_auth_pass(vs, vs->auth);
2568 start_client_init(vs);
2569 } else if (vs->auth == VNC_AUTH_VNC) {
2570 VNC_DEBUG("Tell client VNC auth\n");
2571 vnc_write_u32(vs, vs->auth);
2575 trace_vnc_auth_fail(vs, vs->auth,
2576 "Unsupported auth method for v3.3", "");
2577 vnc_write_u32(vs, VNC_AUTH_INVALID);
2579 vnc_client_error(vs);
2582 vnc_write_u8(vs, 1); /* num auth */
2583 vnc_write_u8(vs, vs->auth);
2584 vnc_read_when(vs, protocol_client_auth, 1);
2591 static VncRectStat *vnc_stat_rect(VncDisplay *vd, int x, int y)
2593 struct VncSurface *vs = &vd->guest;
2595 return &vs->stats[y / VNC_STAT_RECT][x / VNC_STAT_RECT];
2598 void vnc_sent_lossy_rect(VncState *vs, int x, int y, int w, int h)
2602 w = (x + w) / VNC_STAT_RECT;
2603 h = (y + h) / VNC_STAT_RECT;
2607 for (j = y; j <= h; j++) {
2608 for (i = x; i <= w; i++) {
2609 vs->lossy_rect[j][i] = 1;
2614 static int vnc_refresh_lossy_rect(VncDisplay *vd, int x, int y)
2617 int sty = y / VNC_STAT_RECT;
2618 int stx = x / VNC_STAT_RECT;
2621 y = QEMU_ALIGN_DOWN(y, VNC_STAT_RECT);
2622 x = QEMU_ALIGN_DOWN(x, VNC_STAT_RECT);
2624 QTAILQ_FOREACH(vs, &vd->clients, next) {
2627 /* kernel send buffers are full -> refresh later */
2628 if (vs->output.offset) {
2632 if (!vs->lossy_rect[sty][stx]) {
2636 vs->lossy_rect[sty][stx] = 0;
2637 for (j = 0; j < VNC_STAT_RECT; ++j) {
2638 bitmap_set(vs->dirty[y + j],
2639 x / VNC_DIRTY_PIXELS_PER_BIT,
2640 VNC_STAT_RECT / VNC_DIRTY_PIXELS_PER_BIT);
2648 static int vnc_update_stats(VncDisplay *vd, struct timeval * tv)
2650 int width = MIN(pixman_image_get_width(vd->guest.fb),
2651 pixman_image_get_width(vd->server));
2652 int height = MIN(pixman_image_get_height(vd->guest.fb),
2653 pixman_image_get_height(vd->server));
2658 for (y = 0; y < height; y += VNC_STAT_RECT) {
2659 for (x = 0; x < width; x += VNC_STAT_RECT) {
2660 VncRectStat *rect = vnc_stat_rect(vd, x, y);
2662 rect->updated = false;
2666 qemu_timersub(tv, &VNC_REFRESH_STATS, &res);
2668 if (timercmp(&vd->guest.last_freq_check, &res, >)) {
2671 vd->guest.last_freq_check = *tv;
2673 for (y = 0; y < height; y += VNC_STAT_RECT) {
2674 for (x = 0; x < width; x += VNC_STAT_RECT) {
2675 VncRectStat *rect= vnc_stat_rect(vd, x, y);
2676 int count = ARRAY_SIZE(rect->times);
2677 struct timeval min, max;
2679 if (!timerisset(&rect->times[count - 1])) {
2683 max = rect->times[(rect->idx + count - 1) % count];
2684 qemu_timersub(tv, &max, &res);
2686 if (timercmp(&res, &VNC_REFRESH_LOSSY, >)) {
2688 has_dirty += vnc_refresh_lossy_rect(vd, x, y);
2689 memset(rect->times, 0, sizeof (rect->times));
2693 min = rect->times[rect->idx];
2694 max = rect->times[(rect->idx + count - 1) % count];
2695 qemu_timersub(&max, &min, &res);
2697 rect->freq = res.tv_sec + res.tv_usec / 1000000.;
2698 rect->freq /= count;
2699 rect->freq = 1. / rect->freq;
2705 double vnc_update_freq(VncState *vs, int x, int y, int w, int h)
2711 x = QEMU_ALIGN_DOWN(x, VNC_STAT_RECT);
2712 y = QEMU_ALIGN_DOWN(y, VNC_STAT_RECT);
2714 for (j = y; j <= y + h; j += VNC_STAT_RECT) {
2715 for (i = x; i <= x + w; i += VNC_STAT_RECT) {
2716 total += vnc_stat_rect(vs->vd, i, j)->freq;
2728 static void vnc_rect_updated(VncDisplay *vd, int x, int y, struct timeval * tv)
2732 rect = vnc_stat_rect(vd, x, y);
2733 if (rect->updated) {
2736 rect->times[rect->idx] = *tv;
2737 rect->idx = (rect->idx + 1) % ARRAY_SIZE(rect->times);
2738 rect->updated = true;
2741 static int vnc_refresh_server_surface(VncDisplay *vd)
2743 int width = MIN(pixman_image_get_width(vd->guest.fb),
2744 pixman_image_get_width(vd->server));
2745 int height = MIN(pixman_image_get_height(vd->guest.fb),
2746 pixman_image_get_height(vd->server));
2747 int cmp_bytes, server_stride, line_bytes, guest_ll, guest_stride, y = 0;
2748 uint8_t *guest_row0 = NULL, *server_row0;
2751 pixman_image_t *tmpbuf = NULL;
2753 struct timeval tv = { 0, 0 };
2755 if (!vd->non_adaptive) {
2756 gettimeofday(&tv, NULL);
2757 has_dirty = vnc_update_stats(vd, &tv);
2761 * Walk through the guest dirty map.
2762 * Check and copy modified bits from guest to server surface.
2763 * Update server dirty map.
2765 server_row0 = (uint8_t *)pixman_image_get_data(vd->server);
2766 server_stride = guest_stride = guest_ll =
2767 pixman_image_get_stride(vd->server);
2768 cmp_bytes = MIN(VNC_DIRTY_PIXELS_PER_BIT * VNC_SERVER_FB_BYTES,
2770 if (vd->guest.format != VNC_SERVER_FB_FORMAT) {
2771 int width = pixman_image_get_width(vd->server);
2772 tmpbuf = qemu_pixman_linebuf_create(VNC_SERVER_FB_FORMAT, width);
2775 PIXMAN_FORMAT_BPP(pixman_image_get_format(vd->guest.fb));
2776 guest_row0 = (uint8_t *)pixman_image_get_data(vd->guest.fb);
2777 guest_stride = pixman_image_get_stride(vd->guest.fb);
2778 guest_ll = pixman_image_get_width(vd->guest.fb) * (DIV_ROUND_UP(guest_bpp, 8));
2780 line_bytes = MIN(server_stride, guest_ll);
2784 uint8_t *guest_ptr, *server_ptr;
2785 unsigned long offset = find_next_bit((unsigned long *) &vd->guest.dirty,
2786 height * VNC_DIRTY_BPL(&vd->guest),
2787 y * VNC_DIRTY_BPL(&vd->guest));
2788 if (offset == height * VNC_DIRTY_BPL(&vd->guest)) {
2789 /* no more dirty bits */
2792 y = offset / VNC_DIRTY_BPL(&vd->guest);
2793 x = offset % VNC_DIRTY_BPL(&vd->guest);
2795 server_ptr = server_row0 + y * server_stride + x * cmp_bytes;
2797 if (vd->guest.format != VNC_SERVER_FB_FORMAT) {
2798 qemu_pixman_linebuf_fill(tmpbuf, vd->guest.fb, width, 0, y);
2799 guest_ptr = (uint8_t *)pixman_image_get_data(tmpbuf);
2801 guest_ptr = guest_row0 + y * guest_stride;
2803 guest_ptr += x * cmp_bytes;
2805 for (; x < DIV_ROUND_UP(width, VNC_DIRTY_PIXELS_PER_BIT);
2806 x++, guest_ptr += cmp_bytes, server_ptr += cmp_bytes) {
2807 int _cmp_bytes = cmp_bytes;
2808 if (!test_and_clear_bit(x, vd->guest.dirty[y])) {
2811 if ((x + 1) * cmp_bytes > line_bytes) {
2812 _cmp_bytes = line_bytes - x * cmp_bytes;
2814 assert(_cmp_bytes >= 0);
2815 if (memcmp(server_ptr, guest_ptr, _cmp_bytes) == 0) {
2818 memcpy(server_ptr, guest_ptr, _cmp_bytes);
2819 if (!vd->non_adaptive) {
2820 vnc_rect_updated(vd, x * VNC_DIRTY_PIXELS_PER_BIT,
2823 QTAILQ_FOREACH(vs, &vd->clients, next) {
2824 set_bit(x, vs->dirty[y]);
2831 qemu_pixman_image_unref(tmpbuf);
2835 static void vnc_refresh(DisplayChangeListener *dcl)
2837 VncDisplay *vd = container_of(dcl, VncDisplay, dcl);
2839 int has_dirty, rects = 0;
2841 if (QTAILQ_EMPTY(&vd->clients)) {
2842 update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_MAX);
2846 graphic_hw_update(vd->dcl.con);
2848 if (vnc_trylock_display(vd)) {
2849 update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_BASE);
2853 has_dirty = vnc_refresh_server_surface(vd);
2854 vnc_unlock_display(vd);
2856 QTAILQ_FOREACH_SAFE(vs, &vd->clients, next, vn) {
2857 rects += vnc_update_client(vs, has_dirty);
2858 /* vs might be free()ed here */
2861 if (has_dirty && rects) {
2862 vd->dcl.update_interval /= 2;
2863 if (vd->dcl.update_interval < VNC_REFRESH_INTERVAL_BASE) {
2864 vd->dcl.update_interval = VNC_REFRESH_INTERVAL_BASE;
2867 vd->dcl.update_interval += VNC_REFRESH_INTERVAL_INC;
2868 if (vd->dcl.update_interval > VNC_REFRESH_INTERVAL_MAX) {
2869 vd->dcl.update_interval = VNC_REFRESH_INTERVAL_MAX;
2874 static void vnc_connect(VncDisplay *vd, QIOChannelSocket *sioc,
2875 bool skipauth, bool websocket)
2877 VncState *vs = g_new0(VncState, 1);
2878 bool first_client = QTAILQ_EMPTY(&vd->clients);
2881 trace_vnc_client_connect(vs, sioc);
2883 object_ref(OBJECT(vs->sioc));
2884 vs->ioc = QIO_CHANNEL(sioc);
2885 object_ref(OBJECT(vs->ioc));
2888 buffer_init(&vs->input, "vnc-input/%p", sioc);
2889 buffer_init(&vs->output, "vnc-output/%p", sioc);
2890 buffer_init(&vs->jobs_buffer, "vnc-jobs_buffer/%p", sioc);
2892 buffer_init(&vs->tight.tight, "vnc-tight/%p", sioc);
2893 buffer_init(&vs->tight.zlib, "vnc-tight-zlib/%p", sioc);
2894 buffer_init(&vs->tight.gradient, "vnc-tight-gradient/%p", sioc);
2895 #ifdef CONFIG_VNC_JPEG
2896 buffer_init(&vs->tight.jpeg, "vnc-tight-jpeg/%p", sioc);
2898 #ifdef CONFIG_VNC_PNG
2899 buffer_init(&vs->tight.png, "vnc-tight-png/%p", sioc);
2901 buffer_init(&vs->zlib.zlib, "vnc-zlib/%p", sioc);
2902 buffer_init(&vs->zrle.zrle, "vnc-zrle/%p", sioc);
2903 buffer_init(&vs->zrle.fb, "vnc-zrle-fb/%p", sioc);
2904 buffer_init(&vs->zrle.zlib, "vnc-zrle-zlib/%p", sioc);
2907 vs->auth = VNC_AUTH_NONE;
2908 vs->subauth = VNC_AUTH_INVALID;
2911 vs->auth = vd->ws_auth;
2912 vs->subauth = VNC_AUTH_INVALID;
2914 vs->auth = vd->auth;
2915 vs->subauth = vd->subauth;
2918 VNC_DEBUG("Client sioc=%p ws=%d auth=%d subauth=%d\n",
2919 sioc, websocket, vs->auth, vs->subauth);
2921 vs->lossy_rect = g_malloc0(VNC_STAT_ROWS * sizeof (*vs->lossy_rect));
2922 for (i = 0; i < VNC_STAT_ROWS; ++i) {
2923 vs->lossy_rect[i] = g_new0(uint8_t, VNC_STAT_COLS);
2926 VNC_DEBUG("New client on socket %p\n", vs->sioc);
2927 update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_BASE);
2928 qio_channel_set_blocking(vs->ioc, false, NULL);
2930 g_source_remove(vs->ioc_tag);
2935 vs->ioc_tag = qio_channel_add_watch(
2936 vs->ioc, G_IO_IN, vncws_tls_handshake_io, vs, NULL);
2938 vs->ioc_tag = qio_channel_add_watch(
2939 vs->ioc, G_IO_IN, vncws_handshake_io, vs, NULL);
2942 vs->ioc_tag = qio_channel_add_watch(
2943 vs->ioc, G_IO_IN, vnc_client_io, vs, NULL);
2946 vnc_client_cache_addr(vs);
2947 vnc_qmp_event(vs, QAPI_EVENT_VNC_CONNECTED);
2948 vnc_set_share_mode(vs, VNC_SHARE_MODE_CONNECTING);
2953 vs->as.freq = 44100;
2954 vs->as.nchannels = 2;
2955 vs->as.fmt = AUD_FMT_S16;
2956 vs->as.endianness = 0;
2958 qemu_mutex_init(&vs->output_mutex);
2959 vs->bh = qemu_bh_new(vnc_jobs_bh, vs);
2961 QTAILQ_INSERT_TAIL(&vd->clients, vs, next);
2963 vnc_update_server_surface(vd);
2966 graphic_hw_update(vd->dcl.con);
2968 if (!vs->websocket) {
2969 vnc_start_protocol(vs);
2972 if (vd->num_connecting > vd->connections_limit) {
2973 QTAILQ_FOREACH(vs, &vd->clients, next) {
2974 if (vs->share_mode == VNC_SHARE_MODE_CONNECTING) {
2975 vnc_disconnect_start(vs);
2982 void vnc_start_protocol(VncState *vs)
2984 vnc_write(vs, "RFB 003.008\n", 12);
2986 vnc_read_when(vs, protocol_version, 12);
2988 vs->mouse_mode_notifier.notify = check_pointer_type_change;
2989 qemu_add_mouse_mode_change_notifier(&vs->mouse_mode_notifier);
2992 static gboolean vnc_listen_io(QIOChannel *ioc,
2993 GIOCondition condition,
2996 VncDisplay *vd = opaque;
2997 QIOChannelSocket *sioc = NULL;
2999 bool isWebsock = false;
3002 for (i = 0; i < vd->nlwebsock; i++) {
3003 if (ioc == QIO_CHANNEL(vd->lwebsock[i])) {
3009 sioc = qio_channel_socket_accept(QIO_CHANNEL_SOCKET(ioc), &err);
3011 qio_channel_set_name(QIO_CHANNEL(sioc),
3012 isWebsock ? "vnc-ws-server" : "vnc-server");
3013 qio_channel_set_delay(QIO_CHANNEL(sioc), false);
3014 vnc_connect(vd, sioc, false, isWebsock);
3015 object_unref(OBJECT(sioc));
3017 /* client probably closed connection before we got there */
3024 static const DisplayChangeListenerOps dcl_ops = {
3026 .dpy_refresh = vnc_refresh,
3027 .dpy_gfx_update = vnc_dpy_update,
3028 .dpy_gfx_switch = vnc_dpy_switch,
3029 .dpy_gfx_check_format = qemu_pixman_check_format,
3030 .dpy_mouse_set = vnc_mouse_set,
3031 .dpy_cursor_define = vnc_dpy_cursor_define,
3034 void vnc_display_init(const char *id)
3038 if (vnc_display_find(id) != NULL) {
3041 vd = g_malloc0(sizeof(*vd));
3043 vd->id = strdup(id);
3044 QTAILQ_INSERT_TAIL(&vnc_displays, vd, next);
3046 QTAILQ_INIT(&vd->clients);
3047 vd->expires = TIME_MAX;
3049 if (keyboard_layout) {
3050 trace_vnc_key_map_init(keyboard_layout);
3051 vd->kbd_layout = init_keyboard_layout(name2keysym, keyboard_layout);
3053 vd->kbd_layout = init_keyboard_layout(name2keysym, "en-us");
3056 if (!vd->kbd_layout) {
3060 vd->share_policy = VNC_SHARE_POLICY_ALLOW_EXCLUSIVE;
3061 vd->connections_limit = 32;
3063 qemu_mutex_init(&vd->mutex);
3064 vnc_start_worker_thread();
3066 vd->dcl.ops = &dcl_ops;
3067 register_displaychangelistener(&vd->dcl);
3071 static void vnc_display_close(VncDisplay *vd)
3077 vd->is_unix = false;
3078 for (i = 0; i < vd->nlsock; i++) {
3079 if (vd->lsock_tag[i]) {
3080 g_source_remove(vd->lsock_tag[i]);
3082 object_unref(OBJECT(vd->lsock[i]));
3085 g_free(vd->lsock_tag);
3087 vd->lsock_tag = NULL;
3090 for (i = 0; i < vd->nlwebsock; i++) {
3091 if (vd->lwebsock_tag[i]) {
3092 g_source_remove(vd->lwebsock_tag[i]);
3094 object_unref(OBJECT(vd->lwebsock[i]));
3096 g_free(vd->lwebsock);
3097 g_free(vd->lwebsock_tag);
3098 vd->lwebsock = NULL;
3099 vd->lwebsock_tag = NULL;
3102 vd->auth = VNC_AUTH_INVALID;
3103 vd->subauth = VNC_AUTH_INVALID;
3105 object_unparent(OBJECT(vd->tlscreds));
3106 vd->tlscreds = NULL;
3108 g_free(vd->tlsaclname);
3109 vd->tlsaclname = NULL;
3110 if (vd->lock_key_sync) {
3111 qemu_remove_led_event_handler(vd->led);
3116 int vnc_display_password(const char *id, const char *password)
3118 VncDisplay *vd = vnc_display_find(id);
3123 if (vd->auth == VNC_AUTH_NONE) {
3124 error_printf_unless_qmp("If you want use passwords please enable "
3125 "password auth using '-vnc ${dpy},password'.\n");
3129 g_free(vd->password);
3130 vd->password = g_strdup(password);
3135 int vnc_display_pw_expire(const char *id, time_t expires)
3137 VncDisplay *vd = vnc_display_find(id);
3143 vd->expires = expires;
3147 static void vnc_display_print_local_addr(VncDisplay *vd)
3149 SocketAddress *addr;
3156 addr = qio_channel_socket_get_local_address(vd->lsock[0], &err);
3161 if (addr->type != SOCKET_ADDRESS_TYPE_INET) {
3162 qapi_free_SocketAddress(addr);
3165 error_printf_unless_qmp("VNC server running on %s:%s\n",
3168 qapi_free_SocketAddress(addr);
3171 static QemuOptsList qemu_vnc_opts = {
3173 .head = QTAILQ_HEAD_INITIALIZER(qemu_vnc_opts.head),
3174 .implied_opt_name = "vnc",
3178 .type = QEMU_OPT_STRING,
3180 .name = "websocket",
3181 .type = QEMU_OPT_STRING,
3183 .name = "tls-creds",
3184 .type = QEMU_OPT_STRING,
3186 /* Deprecated in favour of tls-creds */
3188 .type = QEMU_OPT_STRING,
3191 .type = QEMU_OPT_STRING,
3194 .type = QEMU_OPT_STRING,
3197 .type = QEMU_OPT_NUMBER,
3199 .name = "connections",
3200 .type = QEMU_OPT_NUMBER,
3203 .type = QEMU_OPT_NUMBER,
3206 .type = QEMU_OPT_BOOL,
3209 .type = QEMU_OPT_BOOL,
3212 .type = QEMU_OPT_BOOL,
3215 .type = QEMU_OPT_BOOL,
3217 .name = "lock-key-sync",
3218 .type = QEMU_OPT_BOOL,
3220 .name = "key-delay-ms",
3221 .type = QEMU_OPT_NUMBER,
3224 .type = QEMU_OPT_BOOL,
3226 /* Deprecated in favour of tls-creds */
3228 .type = QEMU_OPT_BOOL,
3230 /* Deprecated in favour of tls-creds */
3231 .name = "x509verify",
3232 .type = QEMU_OPT_STRING,
3235 .type = QEMU_OPT_BOOL,
3238 .type = QEMU_OPT_BOOL,
3240 .name = "non-adaptive",
3241 .type = QEMU_OPT_BOOL,
3243 { /* end of list */ }
3249 vnc_display_setup_auth(int *auth,
3251 QCryptoTLSCreds *tlscreds,
3258 * We have a choice of 3 authentication options
3264 * The channel can be run in 2 modes
3269 * And TLS can use 2 types of credentials
3274 * We thus have 9 possible logical combinations
3279 * 4. tls + anon + none
3280 * 5. tls + anon + vnc
3281 * 6. tls + anon + sasl
3282 * 7. tls + x509 + none
3283 * 8. tls + x509 + vnc
3284 * 9. tls + x509 + sasl
3286 * These need to be mapped into the VNC auth schemes
3287 * in an appropriate manner. In regular VNC, all the
3288 * TLS options get mapped into VNC_AUTH_VENCRYPT
3291 * In websockets, the https:// protocol already provides
3292 * TLS support, so there is no need to make use of the
3293 * VeNCrypt extension. Furthermore, websockets browser
3294 * clients could not use VeNCrypt even if they wanted to,
3295 * as they cannot control when the TLS handshake takes
3296 * place. Thus there is no option but to rely on https://,
3297 * meaning combinations 4->6 and 7->9 will be mapped to
3298 * VNC auth schemes in the same way as combos 1->3.
3300 * Regardless of fact that we have a different mapping to
3301 * VNC auth mechs for plain VNC vs websockets VNC, the end
3302 * result has the same security characteristics.
3304 if (websocket || !tlscreds) {
3306 VNC_DEBUG("Initializing VNC server with password auth\n");
3307 *auth = VNC_AUTH_VNC;
3309 VNC_DEBUG("Initializing VNC server with SASL auth\n");
3310 *auth = VNC_AUTH_SASL;
3312 VNC_DEBUG("Initializing VNC server with no auth\n");
3313 *auth = VNC_AUTH_NONE;
3315 *subauth = VNC_AUTH_INVALID;
3317 bool is_x509 = object_dynamic_cast(OBJECT(tlscreds),
3318 TYPE_QCRYPTO_TLS_CREDS_X509) != NULL;
3319 bool is_anon = object_dynamic_cast(OBJECT(tlscreds),
3320 TYPE_QCRYPTO_TLS_CREDS_ANON) != NULL;
3322 if (!is_x509 && !is_anon) {
3324 "Unsupported TLS cred type %s",
3325 object_get_typename(OBJECT(tlscreds)));
3328 *auth = VNC_AUTH_VENCRYPT;
3331 VNC_DEBUG("Initializing VNC server with x509 password auth\n");
3332 *subauth = VNC_AUTH_VENCRYPT_X509VNC;
3334 VNC_DEBUG("Initializing VNC server with TLS password auth\n");
3335 *subauth = VNC_AUTH_VENCRYPT_TLSVNC;
3340 VNC_DEBUG("Initializing VNC server with x509 SASL auth\n");
3341 *subauth = VNC_AUTH_VENCRYPT_X509SASL;
3343 VNC_DEBUG("Initializing VNC server with TLS SASL auth\n");
3344 *subauth = VNC_AUTH_VENCRYPT_TLSSASL;
3348 VNC_DEBUG("Initializing VNC server with x509 no auth\n");
3349 *subauth = VNC_AUTH_VENCRYPT_X509NONE;
3351 VNC_DEBUG("Initializing VNC server with TLS no auth\n");
3352 *subauth = VNC_AUTH_VENCRYPT_TLSNONE;
3361 * Handle back compat with old CLI syntax by creating some
3362 * suitable QCryptoTLSCreds objects
3364 static QCryptoTLSCreds *
3365 vnc_display_create_creds(bool x509,
3371 gchar *credsid = g_strdup_printf("tlsvnc%s", id);
3372 Object *parent = object_get_objects_root();
3377 creds = object_new_with_props(TYPE_QCRYPTO_TLS_CREDS_X509,
3381 "endpoint", "server",
3383 "verify-peer", x509verify ? "yes" : "no",
3386 creds = object_new_with_props(TYPE_QCRYPTO_TLS_CREDS_ANON,
3390 "endpoint", "server",
3397 error_propagate(errp, err);
3401 return QCRYPTO_TLS_CREDS(creds);
3405 static int vnc_display_get_address(const char *addrstr,
3414 SocketAddress **retaddr,
3418 SocketAddress *addr = NULL;
3420 addr = g_new0(SocketAddress, 1);
3422 if (strncmp(addrstr, "unix:", 5) == 0) {
3423 addr->type = SOCKET_ADDRESS_TYPE_UNIX;
3424 addr->u.q_unix.path = g_strdup(addrstr + 5);
3427 error_setg(errp, "UNIX sockets not supported with websock");
3432 error_setg(errp, "Port range not support with UNIX socket");
3439 unsigned long long baseport = 0;
3440 InetSocketAddress *inet;
3442 port = strrchr(addrstr, ':');
3448 error_setg(errp, "no vnc port specified");
3452 hostlen = port - addrstr;
3454 if (*port == '\0') {
3455 error_setg(errp, "vnc port cannot be empty");
3460 addr->type = SOCKET_ADDRESS_TYPE_INET;
3461 inet = &addr->u.inet;
3462 if (addrstr[0] == '[' && addrstr[hostlen - 1] == ']') {
3463 inet->host = g_strndup(addrstr + 1, hostlen - 2);
3465 inet->host = g_strndup(addrstr, hostlen);
3467 /* plain VNC port is just an offset, for websocket
3468 * port is absolute */
3470 if (g_str_equal(addrstr, "") ||
3471 g_str_equal(addrstr, "on")) {
3472 if (displaynum == -1) {
3473 error_setg(errp, "explicit websocket port is required");
3476 inet->port = g_strdup_printf(
3477 "%d", displaynum + 5700);
3479 inet->has_to = true;
3480 inet->to = to + 5700;
3483 inet->port = g_strdup(port);
3486 int offset = reverse ? 0 : 5900;
3487 if (parse_uint_full(port, &baseport, 10) < 0) {
3488 error_setg(errp, "can't convert to a number: %s", port);
3491 if (baseport > 65535 ||
3492 baseport + offset > 65535) {
3493 error_setg(errp, "port %s out of range", port);
3496 inet->port = g_strdup_printf(
3497 "%d", (int)baseport + offset);
3500 inet->has_to = true;
3501 inet->to = to + offset;
3506 inet->has_ipv4 = has_ipv4;
3508 inet->has_ipv6 = has_ipv6;
3517 qapi_free_SocketAddress(addr);
3522 static void vnc_free_addresses(SocketAddress ***retsaddr,
3527 for (i = 0; i < *retnsaddr; i++) {
3528 qapi_free_SocketAddress((*retsaddr)[i]);
3536 static int vnc_display_get_addresses(QemuOpts *opts,
3538 SocketAddress ***retsaddr,
3540 SocketAddress ***retwsaddr,
3544 SocketAddress *saddr = NULL;
3545 SocketAddress *wsaddr = NULL;
3546 QemuOptsIter addriter;
3548 int to = qemu_opt_get_number(opts, "to", 0);
3549 bool has_ipv4 = qemu_opt_get(opts, "ipv4");
3550 bool has_ipv6 = qemu_opt_get(opts, "ipv6");
3551 bool ipv4 = qemu_opt_get_bool(opts, "ipv4", false);
3552 bool ipv6 = qemu_opt_get_bool(opts, "ipv6", false);
3553 int displaynum = -1;
3561 addr = qemu_opt_get(opts, "vnc");
3562 if (addr == NULL || g_str_equal(addr, "none")) {
3566 if (qemu_opt_get(opts, "websocket") &&
3567 !qcrypto_hash_supports(QCRYPTO_HASH_ALG_SHA1)) {
3569 "SHA1 hash support is required for websockets");
3573 qemu_opt_iter_init(&addriter, opts, "vnc");
3574 while ((addr = qemu_opt_iter_next(&addriter)) != NULL) {
3576 rv = vnc_display_get_address(addr, false, reverse, 0, to,
3583 /* Historical compat - first listen address can be used
3584 * to set the default websocket port
3586 if (displaynum == -1) {
3589 *retsaddr = g_renew(SocketAddress *, *retsaddr, *retnsaddr + 1);
3590 (*retsaddr)[(*retnsaddr)++] = saddr;
3593 /* If we had multiple primary displays, we don't do defaults
3594 * for websocket, and require explicit config instead. */
3595 if (*retnsaddr > 1) {
3599 qemu_opt_iter_init(&addriter, opts, "websocket");
3600 while ((addr = qemu_opt_iter_next(&addriter)) != NULL) {
3601 if (vnc_display_get_address(addr, true, reverse, displaynum, to,
3604 &wsaddr, errp) < 0) {
3608 /* Historical compat - if only a single listen address was
3609 * provided, then this is used to set the default listen
3610 * address for websocket too
3612 if (*retnsaddr == 1 &&
3613 (*retsaddr)[0]->type == SOCKET_ADDRESS_TYPE_INET &&
3614 wsaddr->type == SOCKET_ADDRESS_TYPE_INET &&
3615 g_str_equal(wsaddr->u.inet.host, "") &&
3616 !g_str_equal((*retsaddr)[0]->u.inet.host, "")) {
3617 g_free(wsaddr->u.inet.host);
3618 wsaddr->u.inet.host = g_strdup((*retsaddr)[0]->u.inet.host);
3621 *retwsaddr = g_renew(SocketAddress *, *retwsaddr, *retnwsaddr + 1);
3622 (*retwsaddr)[(*retnwsaddr)++] = wsaddr;
3628 vnc_free_addresses(retsaddr, retnsaddr);
3629 vnc_free_addresses(retwsaddr, retnwsaddr);
3634 static int vnc_display_connect(VncDisplay *vd,
3635 SocketAddress **saddr,
3637 SocketAddress **wsaddr,
3641 /* connect to viewer */
3642 QIOChannelSocket *sioc = NULL;
3644 error_setg(errp, "Cannot use websockets in reverse mode");
3648 error_setg(errp, "Expected a single address in reverse mode");
3651 /* TODO SOCKET_ADDRESS_TYPE_FD when fd has AF_UNIX */
3652 vd->is_unix = saddr[0]->type == SOCKET_ADDRESS_TYPE_UNIX;
3653 sioc = qio_channel_socket_new();
3654 qio_channel_set_name(QIO_CHANNEL(sioc), "vnc-reverse");
3655 if (qio_channel_socket_connect_sync(sioc, saddr[0], errp) < 0) {
3658 vnc_connect(vd, sioc, false, false);
3659 object_unref(OBJECT(sioc));
3664 static int vnc_display_listen_addr(VncDisplay *vd,
3665 SocketAddress *addr,
3667 QIOChannelSocket ***lsock,
3672 QIODNSResolver *resolver = qio_dns_resolver_get_instance();
3673 SocketAddress **rawaddrs = NULL;
3674 size_t nrawaddrs = 0;
3675 Error *listenerr = NULL;
3676 bool listening = false;
3679 if (qio_dns_resolver_lookup_sync(resolver, addr, &nrawaddrs,
3680 &rawaddrs, errp) < 0) {
3684 for (i = 0; i < nrawaddrs; i++) {
3685 QIOChannelSocket *sioc = qio_channel_socket_new();
3687 qio_channel_set_name(QIO_CHANNEL(sioc), name);
3688 if (qio_channel_socket_listen_sync(
3689 sioc, rawaddrs[i], listenerr == NULL ? &listenerr : NULL) < 0) {
3690 object_unref(OBJECT(sioc));
3695 *lsock = g_renew(QIOChannelSocket *, *lsock, *nlsock);
3696 *lsock_tag = g_renew(guint, *lsock_tag, *nlsock);
3698 (*lsock)[*nlsock - 1] = sioc;
3699 (*lsock_tag)[*nlsock - 1] = 0;
3702 for (i = 0; i < nrawaddrs; i++) {
3703 qapi_free_SocketAddress(rawaddrs[i]);
3709 error_propagate(errp, listenerr);
3712 error_free(listenerr);
3716 for (i = 0; i < *nlsock; i++) {
3717 (*lsock_tag)[i] = qio_channel_add_watch(
3718 QIO_CHANNEL((*lsock)[i]),
3719 G_IO_IN, vnc_listen_io, vd, NULL);
3726 static int vnc_display_listen(VncDisplay *vd,
3727 SocketAddress **saddr,
3729 SocketAddress **wsaddr,
3735 for (i = 0; i < nsaddr; i++) {
3736 if (vnc_display_listen_addr(vd, saddr[i],
3745 for (i = 0; i < nwsaddr; i++) {
3746 if (vnc_display_listen_addr(vd, wsaddr[i],
3760 void vnc_display_open(const char *id, Error **errp)
3762 VncDisplay *vd = vnc_display_find(id);
3763 QemuOpts *opts = qemu_opts_find(&qemu_vnc_opts, id);
3764 SocketAddress **saddr = NULL, **wsaddr = NULL;
3765 size_t nsaddr, nwsaddr;
3766 const char *share, *device_id;
3768 bool password = false;
3769 bool reverse = false;
3772 #ifdef CONFIG_VNC_SASL
3776 int lock_key_sync = 1;
3780 error_setg(errp, "VNC display not active");
3783 vnc_display_close(vd);
3789 reverse = qemu_opt_get_bool(opts, "reverse", false);
3790 if (vnc_display_get_addresses(opts, reverse, &saddr, &nsaddr,
3791 &wsaddr, &nwsaddr, errp) < 0) {
3795 password = qemu_opt_get_bool(opts, "password", false);
3797 if (fips_get_state()) {
3799 "VNC password auth disabled due to FIPS mode, "
3800 "consider using the VeNCrypt or SASL authentication "
3801 "methods as an alternative");
3804 if (!qcrypto_cipher_supports(
3805 QCRYPTO_CIPHER_ALG_DES_RFB, QCRYPTO_CIPHER_MODE_ECB)) {
3807 "Cipher backend does not support DES RFB algorithm");
3812 lock_key_sync = qemu_opt_get_bool(opts, "lock-key-sync", true);
3813 key_delay_ms = qemu_opt_get_number(opts, "key-delay-ms", 10);
3814 sasl = qemu_opt_get_bool(opts, "sasl", false);
3815 #ifndef CONFIG_VNC_SASL
3817 error_setg(errp, "VNC SASL auth requires cyrus-sasl support");
3820 #endif /* CONFIG_VNC_SASL */
3821 credid = qemu_opt_get(opts, "tls-creds");
3824 if (qemu_opt_get(opts, "tls") ||
3825 qemu_opt_get(opts, "x509") ||
3826 qemu_opt_get(opts, "x509verify")) {
3828 "'tls-creds' parameter is mutually exclusive with "
3829 "'tls', 'x509' and 'x509verify' parameters");
3833 creds = object_resolve_path_component(
3834 object_get_objects_root(), credid);
3836 error_setg(errp, "No TLS credentials with id '%s'",
3840 vd->tlscreds = (QCryptoTLSCreds *)
3841 object_dynamic_cast(creds,
3842 TYPE_QCRYPTO_TLS_CREDS);
3843 if (!vd->tlscreds) {
3844 error_setg(errp, "Object with id '%s' is not TLS credentials",
3848 object_ref(OBJECT(vd->tlscreds));
3850 if (vd->tlscreds->endpoint != QCRYPTO_TLS_CREDS_ENDPOINT_SERVER) {
3852 "Expecting TLS credentials with a server endpoint");
3857 bool tls = false, x509 = false, x509verify = false;
3858 tls = qemu_opt_get_bool(opts, "tls", false);
3860 path = qemu_opt_get(opts, "x509");
3865 path = qemu_opt_get(opts, "x509verify");
3871 vd->tlscreds = vnc_display_create_creds(x509,
3876 if (!vd->tlscreds) {
3881 acl = qemu_opt_get_bool(opts, "acl", false);
3883 share = qemu_opt_get(opts, "share");
3885 if (strcmp(share, "ignore") == 0) {
3886 vd->share_policy = VNC_SHARE_POLICY_IGNORE;
3887 } else if (strcmp(share, "allow-exclusive") == 0) {
3888 vd->share_policy = VNC_SHARE_POLICY_ALLOW_EXCLUSIVE;
3889 } else if (strcmp(share, "force-shared") == 0) {
3890 vd->share_policy = VNC_SHARE_POLICY_FORCE_SHARED;
3892 error_setg(errp, "unknown vnc share= option");
3896 vd->share_policy = VNC_SHARE_POLICY_ALLOW_EXCLUSIVE;
3898 vd->connections_limit = qemu_opt_get_number(opts, "connections", 32);
3900 #ifdef CONFIG_VNC_JPEG
3901 vd->lossy = qemu_opt_get_bool(opts, "lossy", false);
3903 vd->non_adaptive = qemu_opt_get_bool(opts, "non-adaptive", false);
3904 /* adaptive updates are only used with tight encoding and
3905 * if lossy updates are enabled so we can disable all the
3906 * calculations otherwise */
3908 vd->non_adaptive = true;
3912 if (strcmp(vd->id, "default") == 0) {
3913 vd->tlsaclname = g_strdup("vnc.x509dname");
3915 vd->tlsaclname = g_strdup_printf("vnc.%s.x509dname", vd->id);
3917 qemu_acl_init(vd->tlsaclname);
3919 #ifdef CONFIG_VNC_SASL
3923 if (strcmp(vd->id, "default") == 0) {
3924 aclname = g_strdup("vnc.username");
3926 aclname = g_strdup_printf("vnc.%s.username", vd->id);
3928 vd->sasl.acl = qemu_acl_init(aclname);
3933 if (vnc_display_setup_auth(&vd->auth, &vd->subauth,
3934 vd->tlscreds, password,
3935 sasl, false, errp) < 0) {
3938 trace_vnc_auth_init(vd, 0, vd->auth, vd->subauth);
3940 if (vnc_display_setup_auth(&vd->ws_auth, &vd->ws_subauth,
3941 vd->tlscreds, password,
3942 sasl, true, errp) < 0) {
3945 trace_vnc_auth_init(vd, 1, vd->ws_auth, vd->ws_subauth);
3947 #ifdef CONFIG_VNC_SASL
3948 if ((saslErr = sasl_server_init(NULL, "qemu")) != SASL_OK) {
3949 error_setg(errp, "Failed to initialize SASL auth: %s",
3950 sasl_errstring(saslErr, NULL, NULL));
3954 vd->lock_key_sync = lock_key_sync;
3955 if (lock_key_sync) {
3956 vd->led = qemu_add_led_event_handler(kbd_leds, vd);
3959 vd->key_delay_ms = key_delay_ms;
3961 device_id = qemu_opt_get(opts, "display");
3963 int head = qemu_opt_get_number(opts, "head", 0);
3966 con = qemu_console_lookup_by_device_name(device_id, head, &err);
3968 error_propagate(errp, err);
3975 if (con != vd->dcl.con) {
3976 unregister_displaychangelistener(&vd->dcl);
3978 register_displaychangelistener(&vd->dcl);
3981 if (saddr == NULL) {
3986 if (vnc_display_connect(vd, saddr, nsaddr, wsaddr, nwsaddr, errp) < 0) {
3990 if (vnc_display_listen(vd, saddr, nsaddr, wsaddr, nwsaddr, errp) < 0) {
3995 if (qemu_opt_get(opts, "to")) {
3996 vnc_display_print_local_addr(vd);
4000 vnc_free_addresses(&saddr, &nsaddr);
4001 vnc_free_addresses(&wsaddr, &nwsaddr);
4005 vnc_display_close(vd);
4009 void vnc_display_add_client(const char *id, int csock, bool skipauth)
4011 VncDisplay *vd = vnc_display_find(id);
4012 QIOChannelSocket *sioc;
4018 sioc = qio_channel_socket_new_fd(csock, NULL);
4020 qio_channel_set_name(QIO_CHANNEL(sioc), "vnc-server");
4021 vnc_connect(vd, sioc, skipauth, false);
4022 object_unref(OBJECT(sioc));
4026 static void vnc_auto_assign_id(QemuOptsList *olist, QemuOpts *opts)
4031 id = g_strdup("default");
4032 while (qemu_opts_find(olist, id)) {
4034 id = g_strdup_printf("vnc%d", i++);
4036 qemu_opts_set_id(opts, id);
4039 QemuOpts *vnc_parse(const char *str, Error **errp)
4041 QemuOptsList *olist = qemu_find_opts("vnc");
4042 QemuOpts *opts = qemu_opts_parse(olist, str, true, errp);
4049 id = qemu_opts_id(opts);
4051 /* auto-assign id if not present */
4052 vnc_auto_assign_id(olist, opts);
4057 int vnc_init_func(void *opaque, QemuOpts *opts, Error **errp)
4059 Error *local_err = NULL;
4060 char *id = (char *)qemu_opts_id(opts);
4063 vnc_display_init(id);
4064 vnc_display_open(id, &local_err);
4065 if (local_err != NULL) {
4066 error_reportf_err(local_err, "Failed to start VNC server: ");
4072 static void vnc_register_config(void)
4074 qemu_add_opts(&qemu_vnc_opts);
4076 opts_init(vnc_register_config);