2 * QEMU VNC display driver
4 * Copyright (C) 2006 Anthony Liguori <anthony@codemonkey.ws>
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/option.h"
34 #include "qemu/sockets.h"
35 #include "qemu/timer.h"
37 #include "qemu/config-file.h"
38 #include "qapi/qapi-events.h"
39 #include "qapi/error.h"
40 #include "qapi/qapi-commands-ui.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
);
63 static void vnc_update_throttle_offset(VncState
*vs
);
65 static void vnc_set_share_mode(VncState
*vs
, VncShareMode mode
)
68 static const char *mn
[] = {
70 [VNC_SHARE_MODE_CONNECTING
] = "connecting",
71 [VNC_SHARE_MODE_SHARED
] = "shared",
72 [VNC_SHARE_MODE_EXCLUSIVE
] = "exclusive",
73 [VNC_SHARE_MODE_DISCONNECTED
] = "disconnected",
75 fprintf(stderr
, "%s/%p: %s -> %s\n", __func__
,
76 vs
->ioc
, mn
[vs
->share_mode
], mn
[mode
]);
79 switch (vs
->share_mode
) {
80 case VNC_SHARE_MODE_CONNECTING
:
81 vs
->vd
->num_connecting
--;
83 case VNC_SHARE_MODE_SHARED
:
86 case VNC_SHARE_MODE_EXCLUSIVE
:
87 vs
->vd
->num_exclusive
--;
93 vs
->share_mode
= mode
;
95 switch (vs
->share_mode
) {
96 case VNC_SHARE_MODE_CONNECTING
:
97 vs
->vd
->num_connecting
++;
99 case VNC_SHARE_MODE_SHARED
:
100 vs
->vd
->num_shared
++;
102 case VNC_SHARE_MODE_EXCLUSIVE
:
103 vs
->vd
->num_exclusive
++;
111 static void vnc_init_basic_info(SocketAddress
*addr
,
115 switch (addr
->type
) {
116 case SOCKET_ADDRESS_TYPE_INET
:
117 info
->host
= g_strdup(addr
->u
.inet
.host
);
118 info
->service
= g_strdup(addr
->u
.inet
.port
);
119 if (addr
->u
.inet
.ipv6
) {
120 info
->family
= NETWORK_ADDRESS_FAMILY_IPV6
;
122 info
->family
= NETWORK_ADDRESS_FAMILY_IPV4
;
126 case SOCKET_ADDRESS_TYPE_UNIX
:
127 info
->host
= g_strdup("");
128 info
->service
= g_strdup(addr
->u
.q_unix
.path
);
129 info
->family
= NETWORK_ADDRESS_FAMILY_UNIX
;
132 case SOCKET_ADDRESS_TYPE_VSOCK
:
133 case SOCKET_ADDRESS_TYPE_FD
:
134 error_setg(errp
, "Unsupported socket address type %s",
135 SocketAddressType_str(addr
->type
));
144 static void vnc_init_basic_info_from_server_addr(QIOChannelSocket
*ioc
,
148 SocketAddress
*addr
= NULL
;
151 error_setg(errp
, "No listener socket available");
155 addr
= qio_channel_socket_get_local_address(ioc
, errp
);
160 vnc_init_basic_info(addr
, info
, errp
);
161 qapi_free_SocketAddress(addr
);
164 static void vnc_init_basic_info_from_remote_addr(QIOChannelSocket
*ioc
,
168 SocketAddress
*addr
= NULL
;
170 addr
= qio_channel_socket_get_remote_address(ioc
, errp
);
175 vnc_init_basic_info(addr
, info
, errp
);
176 qapi_free_SocketAddress(addr
);
179 static const char *vnc_auth_name(VncDisplay
*vd
) {
181 case VNC_AUTH_INVALID
:
197 case VNC_AUTH_VENCRYPT
:
198 switch (vd
->subauth
) {
199 case VNC_AUTH_VENCRYPT_PLAIN
:
200 return "vencrypt+plain";
201 case VNC_AUTH_VENCRYPT_TLSNONE
:
202 return "vencrypt+tls+none";
203 case VNC_AUTH_VENCRYPT_TLSVNC
:
204 return "vencrypt+tls+vnc";
205 case VNC_AUTH_VENCRYPT_TLSPLAIN
:
206 return "vencrypt+tls+plain";
207 case VNC_AUTH_VENCRYPT_X509NONE
:
208 return "vencrypt+x509+none";
209 case VNC_AUTH_VENCRYPT_X509VNC
:
210 return "vencrypt+x509+vnc";
211 case VNC_AUTH_VENCRYPT_X509PLAIN
:
212 return "vencrypt+x509+plain";
213 case VNC_AUTH_VENCRYPT_TLSSASL
:
214 return "vencrypt+tls+sasl";
215 case VNC_AUTH_VENCRYPT_X509SASL
:
216 return "vencrypt+x509+sasl";
226 static VncServerInfo
*vnc_server_info_get(VncDisplay
*vd
)
231 if (!vd
->listener
|| !vd
->listener
->nsioc
) {
235 info
= g_malloc0(sizeof(*info
));
236 vnc_init_basic_info_from_server_addr(vd
->listener
->sioc
[0],
237 qapi_VncServerInfo_base(info
), &err
);
238 info
->has_auth
= true;
239 info
->auth
= g_strdup(vnc_auth_name(vd
));
241 qapi_free_VncServerInfo(info
);
248 static void vnc_client_cache_auth(VncState
*client
)
255 client
->info
->x509_dname
=
256 qcrypto_tls_session_get_peer_name(client
->tls
);
257 client
->info
->has_x509_dname
=
258 client
->info
->x509_dname
!= NULL
;
260 #ifdef CONFIG_VNC_SASL
261 if (client
->sasl
.conn
&&
262 client
->sasl
.username
) {
263 client
->info
->has_sasl_username
= true;
264 client
->info
->sasl_username
= g_strdup(client
->sasl
.username
);
269 static void vnc_client_cache_addr(VncState
*client
)
273 client
->info
= g_malloc0(sizeof(*client
->info
));
274 vnc_init_basic_info_from_remote_addr(client
->sioc
,
275 qapi_VncClientInfo_base(client
->info
),
278 qapi_free_VncClientInfo(client
->info
);
284 static void vnc_qmp_event(VncState
*vs
, QAPIEvent event
)
292 si
= vnc_server_info_get(vs
->vd
);
298 case QAPI_EVENT_VNC_CONNECTED
:
299 qapi_event_send_vnc_connected(si
, qapi_VncClientInfo_base(vs
->info
),
302 case QAPI_EVENT_VNC_INITIALIZED
:
303 qapi_event_send_vnc_initialized(si
, vs
->info
, &error_abort
);
305 case QAPI_EVENT_VNC_DISCONNECTED
:
306 qapi_event_send_vnc_disconnected(si
, vs
->info
, &error_abort
);
312 qapi_free_VncServerInfo(si
);
315 static VncClientInfo
*qmp_query_vnc_client(const VncState
*client
)
320 info
= g_malloc0(sizeof(*info
));
322 vnc_init_basic_info_from_remote_addr(client
->sioc
,
323 qapi_VncClientInfo_base(info
),
327 qapi_free_VncClientInfo(info
);
331 info
->websocket
= client
->websocket
;
334 info
->x509_dname
= qcrypto_tls_session_get_peer_name(client
->tls
);
335 info
->has_x509_dname
= info
->x509_dname
!= NULL
;
337 #ifdef CONFIG_VNC_SASL
338 if (client
->sasl
.conn
&& client
->sasl
.username
) {
339 info
->has_sasl_username
= true;
340 info
->sasl_username
= g_strdup(client
->sasl
.username
);
347 static VncDisplay
*vnc_display_find(const char *id
)
352 return QTAILQ_FIRST(&vnc_displays
);
354 QTAILQ_FOREACH(vd
, &vnc_displays
, next
) {
355 if (strcmp(id
, vd
->id
) == 0) {
362 static VncClientInfoList
*qmp_query_client_list(VncDisplay
*vd
)
364 VncClientInfoList
*cinfo
, *prev
= NULL
;
367 QTAILQ_FOREACH(client
, &vd
->clients
, next
) {
368 cinfo
= g_new0(VncClientInfoList
, 1);
369 cinfo
->value
= qmp_query_vnc_client(client
);
376 VncInfo
*qmp_query_vnc(Error
**errp
)
378 VncInfo
*info
= g_malloc0(sizeof(*info
));
379 VncDisplay
*vd
= vnc_display_find(NULL
);
380 SocketAddress
*addr
= NULL
;
382 if (vd
== NULL
|| !vd
->listener
|| !vd
->listener
->nsioc
) {
383 info
->enabled
= false;
385 info
->enabled
= true;
387 /* for compatibility with the original command */
388 info
->has_clients
= true;
389 info
->clients
= qmp_query_client_list(vd
);
391 addr
= qio_channel_socket_get_local_address(vd
->listener
->sioc
[0],
397 switch (addr
->type
) {
398 case SOCKET_ADDRESS_TYPE_INET
:
399 info
->host
= g_strdup(addr
->u
.inet
.host
);
400 info
->service
= g_strdup(addr
->u
.inet
.port
);
401 if (addr
->u
.inet
.ipv6
) {
402 info
->family
= NETWORK_ADDRESS_FAMILY_IPV6
;
404 info
->family
= NETWORK_ADDRESS_FAMILY_IPV4
;
408 case SOCKET_ADDRESS_TYPE_UNIX
:
409 info
->host
= g_strdup("");
410 info
->service
= g_strdup(addr
->u
.q_unix
.path
);
411 info
->family
= NETWORK_ADDRESS_FAMILY_UNIX
;
414 case SOCKET_ADDRESS_TYPE_VSOCK
:
415 case SOCKET_ADDRESS_TYPE_FD
:
416 error_setg(errp
, "Unsupported socket address type %s",
417 SocketAddressType_str(addr
->type
));
423 info
->has_host
= true;
424 info
->has_service
= true;
425 info
->has_family
= true;
427 info
->has_auth
= true;
428 info
->auth
= g_strdup(vnc_auth_name(vd
));
431 qapi_free_SocketAddress(addr
);
435 qapi_free_SocketAddress(addr
);
436 qapi_free_VncInfo(info
);
441 static void qmp_query_auth(int auth
, int subauth
,
442 VncPrimaryAuth
*qmp_auth
,
443 VncVencryptSubAuth
*qmp_vencrypt
,
444 bool *qmp_has_vencrypt
);
446 static VncServerInfo2List
*qmp_query_server_entry(QIOChannelSocket
*ioc
,
450 VncServerInfo2List
*prev
)
452 VncServerInfo2List
*list
;
453 VncServerInfo2
*info
;
457 addr
= qio_channel_socket_get_local_address(ioc
, &err
);
463 info
= g_new0(VncServerInfo2
, 1);
464 vnc_init_basic_info(addr
, qapi_VncServerInfo2_base(info
), &err
);
465 qapi_free_SocketAddress(addr
);
467 qapi_free_VncServerInfo2(info
);
471 info
->websocket
= websocket
;
473 qmp_query_auth(auth
, subauth
, &info
->auth
,
474 &info
->vencrypt
, &info
->has_vencrypt
);
476 list
= g_new0(VncServerInfo2List
, 1);
482 static void qmp_query_auth(int auth
, int subauth
,
483 VncPrimaryAuth
*qmp_auth
,
484 VncVencryptSubAuth
*qmp_vencrypt
,
485 bool *qmp_has_vencrypt
)
489 *qmp_auth
= VNC_PRIMARY_AUTH_VNC
;
492 *qmp_auth
= VNC_PRIMARY_AUTH_RA2
;
495 *qmp_auth
= VNC_PRIMARY_AUTH_RA2NE
;
498 *qmp_auth
= VNC_PRIMARY_AUTH_TIGHT
;
501 *qmp_auth
= VNC_PRIMARY_AUTH_ULTRA
;
504 *qmp_auth
= VNC_PRIMARY_AUTH_TLS
;
506 case VNC_AUTH_VENCRYPT
:
507 *qmp_auth
= VNC_PRIMARY_AUTH_VENCRYPT
;
508 *qmp_has_vencrypt
= true;
510 case VNC_AUTH_VENCRYPT_PLAIN
:
511 *qmp_vencrypt
= VNC_VENCRYPT_SUB_AUTH_PLAIN
;
513 case VNC_AUTH_VENCRYPT_TLSNONE
:
514 *qmp_vencrypt
= VNC_VENCRYPT_SUB_AUTH_TLS_NONE
;
516 case VNC_AUTH_VENCRYPT_TLSVNC
:
517 *qmp_vencrypt
= VNC_VENCRYPT_SUB_AUTH_TLS_VNC
;
519 case VNC_AUTH_VENCRYPT_TLSPLAIN
:
520 *qmp_vencrypt
= VNC_VENCRYPT_SUB_AUTH_TLS_PLAIN
;
522 case VNC_AUTH_VENCRYPT_X509NONE
:
523 *qmp_vencrypt
= VNC_VENCRYPT_SUB_AUTH_X509_NONE
;
525 case VNC_AUTH_VENCRYPT_X509VNC
:
526 *qmp_vencrypt
= VNC_VENCRYPT_SUB_AUTH_X509_VNC
;
528 case VNC_AUTH_VENCRYPT_X509PLAIN
:
529 *qmp_vencrypt
= VNC_VENCRYPT_SUB_AUTH_X509_PLAIN
;
531 case VNC_AUTH_VENCRYPT_TLSSASL
:
532 *qmp_vencrypt
= VNC_VENCRYPT_SUB_AUTH_TLS_SASL
;
534 case VNC_AUTH_VENCRYPT_X509SASL
:
535 *qmp_vencrypt
= VNC_VENCRYPT_SUB_AUTH_X509_SASL
;
538 *qmp_has_vencrypt
= false;
543 *qmp_auth
= VNC_PRIMARY_AUTH_SASL
;
547 *qmp_auth
= VNC_PRIMARY_AUTH_NONE
;
552 VncInfo2List
*qmp_query_vnc_servers(Error
**errp
)
554 VncInfo2List
*item
, *prev
= NULL
;
560 QTAILQ_FOREACH(vd
, &vnc_displays
, next
) {
561 info
= g_new0(VncInfo2
, 1);
562 info
->id
= g_strdup(vd
->id
);
563 info
->clients
= qmp_query_client_list(vd
);
564 qmp_query_auth(vd
->auth
, vd
->subauth
, &info
->auth
,
565 &info
->vencrypt
, &info
->has_vencrypt
);
567 dev
= DEVICE(object_property_get_link(OBJECT(vd
->dcl
.con
),
569 info
->has_display
= true;
570 info
->display
= g_strdup(dev
->id
);
572 for (i
= 0; vd
->listener
!= NULL
&& i
< vd
->listener
->nsioc
; i
++) {
573 info
->server
= qmp_query_server_entry(
574 vd
->listener
->sioc
[i
], false, vd
->auth
, vd
->subauth
,
577 for (i
= 0; vd
->wslistener
!= NULL
&& i
< vd
->wslistener
->nsioc
; i
++) {
578 info
->server
= qmp_query_server_entry(
579 vd
->wslistener
->sioc
[i
], true, vd
->ws_auth
,
580 vd
->ws_subauth
, info
->server
);
583 item
= g_new0(VncInfo2List
, 1);
592 1) Get the queue working for IO.
593 2) there is some weirdness when using the -S option (the screen is grey
594 and not totally invalidated
595 3) resolutions > 1024
598 static int vnc_update_client(VncState
*vs
, int has_dirty
);
599 static void vnc_disconnect_start(VncState
*vs
);
601 static void vnc_colordepth(VncState
*vs
);
602 static void framebuffer_update_request(VncState
*vs
, int incremental
,
603 int x_position
, int y_position
,
605 static void vnc_refresh(DisplayChangeListener
*dcl
);
606 static int vnc_refresh_server_surface(VncDisplay
*vd
);
608 static int vnc_width(VncDisplay
*vd
)
610 return MIN(VNC_MAX_WIDTH
, ROUND_UP(surface_width(vd
->ds
),
611 VNC_DIRTY_PIXELS_PER_BIT
));
614 static int vnc_height(VncDisplay
*vd
)
616 return MIN(VNC_MAX_HEIGHT
, surface_height(vd
->ds
));
619 static void vnc_set_area_dirty(DECLARE_BITMAP(dirty
[VNC_MAX_HEIGHT
],
620 VNC_MAX_WIDTH
/ VNC_DIRTY_PIXELS_PER_BIT
),
622 int x
, int y
, int w
, int h
)
624 int width
= vnc_width(vd
);
625 int height
= vnc_height(vd
);
627 /* this is needed this to ensure we updated all affected
628 * blocks if x % VNC_DIRTY_PIXELS_PER_BIT != 0 */
629 w
+= (x
% VNC_DIRTY_PIXELS_PER_BIT
);
630 x
-= (x
% VNC_DIRTY_PIXELS_PER_BIT
);
634 w
= MIN(x
+ w
, width
) - x
;
635 h
= MIN(y
+ h
, height
);
638 bitmap_set(dirty
[y
], x
/ VNC_DIRTY_PIXELS_PER_BIT
,
639 DIV_ROUND_UP(w
, VNC_DIRTY_PIXELS_PER_BIT
));
643 static void vnc_dpy_update(DisplayChangeListener
*dcl
,
644 int x
, int y
, int w
, int h
)
646 VncDisplay
*vd
= container_of(dcl
, VncDisplay
, dcl
);
647 struct VncSurface
*s
= &vd
->guest
;
649 vnc_set_area_dirty(s
->dirty
, vd
, x
, y
, w
, h
);
652 void vnc_framebuffer_update(VncState
*vs
, int x
, int y
, int w
, int h
,
655 vnc_write_u16(vs
, x
);
656 vnc_write_u16(vs
, y
);
657 vnc_write_u16(vs
, w
);
658 vnc_write_u16(vs
, h
);
660 vnc_write_s32(vs
, encoding
);
664 static void vnc_desktop_resize(VncState
*vs
)
666 if (vs
->ioc
== NULL
|| !vnc_has_feature(vs
, VNC_FEATURE_RESIZE
)) {
669 if (vs
->client_width
== pixman_image_get_width(vs
->vd
->server
) &&
670 vs
->client_height
== pixman_image_get_height(vs
->vd
->server
)) {
674 assert(pixman_image_get_width(vs
->vd
->server
) < 65536 &&
675 pixman_image_get_width(vs
->vd
->server
) >= 0);
676 assert(pixman_image_get_height(vs
->vd
->server
) < 65536 &&
677 pixman_image_get_height(vs
->vd
->server
) >= 0);
678 vs
->client_width
= pixman_image_get_width(vs
->vd
->server
);
679 vs
->client_height
= pixman_image_get_height(vs
->vd
->server
);
681 vnc_write_u8(vs
, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE
);
683 vnc_write_u16(vs
, 1); /* number of rects */
684 vnc_framebuffer_update(vs
, 0, 0, vs
->client_width
, vs
->client_height
,
685 VNC_ENCODING_DESKTOPRESIZE
);
686 vnc_unlock_output(vs
);
690 static void vnc_abort_display_jobs(VncDisplay
*vd
)
694 QTAILQ_FOREACH(vs
, &vd
->clients
, next
) {
697 vnc_unlock_output(vs
);
699 QTAILQ_FOREACH(vs
, &vd
->clients
, next
) {
702 QTAILQ_FOREACH(vs
, &vd
->clients
, next
) {
705 vnc_unlock_output(vs
);
709 int vnc_server_fb_stride(VncDisplay
*vd
)
711 return pixman_image_get_stride(vd
->server
);
714 void *vnc_server_fb_ptr(VncDisplay
*vd
, int x
, int y
)
718 ptr
= (uint8_t *)pixman_image_get_data(vd
->server
);
719 ptr
+= y
* vnc_server_fb_stride(vd
);
720 ptr
+= x
* VNC_SERVER_FB_BYTES
;
724 static void vnc_update_server_surface(VncDisplay
*vd
)
728 qemu_pixman_image_unref(vd
->server
);
731 if (QTAILQ_EMPTY(&vd
->clients
)) {
735 width
= vnc_width(vd
);
736 height
= vnc_height(vd
);
737 vd
->server
= pixman_image_create_bits(VNC_SERVER_FB_FORMAT
,
741 memset(vd
->guest
.dirty
, 0x00, sizeof(vd
->guest
.dirty
));
742 vnc_set_area_dirty(vd
->guest
.dirty
, vd
, 0, 0,
746 static void vnc_dpy_switch(DisplayChangeListener
*dcl
,
747 DisplaySurface
*surface
)
749 static const char placeholder_msg
[] =
750 "Display output is not active.";
751 static DisplaySurface
*placeholder
;
752 VncDisplay
*vd
= container_of(dcl
, VncDisplay
, dcl
);
755 if (surface
== NULL
) {
756 if (placeholder
== NULL
) {
757 placeholder
= qemu_create_message_surface(640, 480, placeholder_msg
);
759 surface
= placeholder
;
762 vnc_abort_display_jobs(vd
);
766 vnc_update_server_surface(vd
);
769 qemu_pixman_image_unref(vd
->guest
.fb
);
770 vd
->guest
.fb
= pixman_image_ref(surface
->image
);
771 vd
->guest
.format
= surface
->format
;
773 QTAILQ_FOREACH(vs
, &vd
->clients
, next
) {
775 vnc_desktop_resize(vs
);
776 if (vs
->vd
->cursor
) {
777 vnc_cursor_define(vs
);
779 memset(vs
->dirty
, 0x00, sizeof(vs
->dirty
));
780 vnc_set_area_dirty(vs
->dirty
, vd
, 0, 0,
783 vnc_update_throttle_offset(vs
);
788 static void vnc_write_pixels_copy(VncState
*vs
,
789 void *pixels
, int size
)
791 vnc_write(vs
, pixels
, size
);
794 /* slowest but generic code. */
795 void vnc_convert_pixel(VncState
*vs
, uint8_t *buf
, uint32_t v
)
799 #if VNC_SERVER_FB_FORMAT == PIXMAN_FORMAT(32, PIXMAN_TYPE_ARGB, 0, 8, 8, 8)
800 r
= (((v
& 0x00ff0000) >> 16) << vs
->client_pf
.rbits
) >> 8;
801 g
= (((v
& 0x0000ff00) >> 8) << vs
->client_pf
.gbits
) >> 8;
802 b
= (((v
& 0x000000ff) >> 0) << vs
->client_pf
.bbits
) >> 8;
804 # error need some bits here if you change VNC_SERVER_FB_FORMAT
806 v
= (r
<< vs
->client_pf
.rshift
) |
807 (g
<< vs
->client_pf
.gshift
) |
808 (b
<< vs
->client_pf
.bshift
);
809 switch (vs
->client_pf
.bytes_per_pixel
) {
839 static void vnc_write_pixels_generic(VncState
*vs
,
840 void *pixels1
, int size
)
844 if (VNC_SERVER_FB_BYTES
== 4) {
845 uint32_t *pixels
= pixels1
;
848 for (i
= 0; i
< n
; i
++) {
849 vnc_convert_pixel(vs
, buf
, pixels
[i
]);
850 vnc_write(vs
, buf
, vs
->client_pf
.bytes_per_pixel
);
855 int vnc_raw_send_framebuffer_update(VncState
*vs
, int x
, int y
, int w
, int h
)
859 VncDisplay
*vd
= vs
->vd
;
861 row
= vnc_server_fb_ptr(vd
, x
, y
);
862 for (i
= 0; i
< h
; i
++) {
863 vs
->write_pixels(vs
, row
, w
* VNC_SERVER_FB_BYTES
);
864 row
+= vnc_server_fb_stride(vd
);
869 int vnc_send_framebuffer_update(VncState
*vs
, int x
, int y
, int w
, int h
)
872 bool encode_raw
= false;
873 size_t saved_offs
= vs
->output
.offset
;
875 switch(vs
->vnc_encoding
) {
876 case VNC_ENCODING_ZLIB
:
877 n
= vnc_zlib_send_framebuffer_update(vs
, x
, y
, w
, h
);
879 case VNC_ENCODING_HEXTILE
:
880 vnc_framebuffer_update(vs
, x
, y
, w
, h
, VNC_ENCODING_HEXTILE
);
881 n
= vnc_hextile_send_framebuffer_update(vs
, x
, y
, w
, h
);
883 case VNC_ENCODING_TIGHT
:
884 n
= vnc_tight_send_framebuffer_update(vs
, x
, y
, w
, h
);
886 case VNC_ENCODING_TIGHT_PNG
:
887 n
= vnc_tight_png_send_framebuffer_update(vs
, x
, y
, w
, h
);
889 case VNC_ENCODING_ZRLE
:
890 n
= vnc_zrle_send_framebuffer_update(vs
, x
, y
, w
, h
);
892 case VNC_ENCODING_ZYWRLE
:
893 n
= vnc_zywrle_send_framebuffer_update(vs
, x
, y
, w
, h
);
900 /* If the client has the same pixel format as our internal buffer and
901 * a RAW encoding would need less space fall back to RAW encoding to
902 * save bandwidth and processing power in the client. */
903 if (!encode_raw
&& vs
->write_pixels
== vnc_write_pixels_copy
&&
904 12 + h
* w
* VNC_SERVER_FB_BYTES
<= (vs
->output
.offset
- saved_offs
)) {
905 vs
->output
.offset
= saved_offs
;
910 vnc_framebuffer_update(vs
, x
, y
, w
, h
, VNC_ENCODING_RAW
);
911 n
= vnc_raw_send_framebuffer_update(vs
, x
, y
, w
, h
);
917 static void vnc_mouse_set(DisplayChangeListener
*dcl
,
918 int x
, int y
, int visible
)
920 /* can we ask the client(s) to move the pointer ??? */
923 static int vnc_cursor_define(VncState
*vs
)
925 QEMUCursor
*c
= vs
->vd
->cursor
;
928 if (vnc_has_feature(vs
, VNC_FEATURE_RICH_CURSOR
)) {
930 vnc_write_u8(vs
, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE
);
931 vnc_write_u8(vs
, 0); /* padding */
932 vnc_write_u16(vs
, 1); /* # of rects */
933 vnc_framebuffer_update(vs
, c
->hot_x
, c
->hot_y
, c
->width
, c
->height
,
934 VNC_ENCODING_RICH_CURSOR
);
935 isize
= c
->width
* c
->height
* vs
->client_pf
.bytes_per_pixel
;
936 vnc_write_pixels_generic(vs
, c
->data
, isize
);
937 vnc_write(vs
, vs
->vd
->cursor_mask
, vs
->vd
->cursor_msize
);
938 vnc_unlock_output(vs
);
944 static void vnc_dpy_cursor_define(DisplayChangeListener
*dcl
,
947 VncDisplay
*vd
= container_of(dcl
, VncDisplay
, dcl
);
950 cursor_put(vd
->cursor
);
951 g_free(vd
->cursor_mask
);
954 cursor_get(vd
->cursor
);
955 vd
->cursor_msize
= cursor_get_mono_bpl(c
) * c
->height
;
956 vd
->cursor_mask
= g_malloc0(vd
->cursor_msize
);
957 cursor_get_mono_mask(c
, 0, vd
->cursor_mask
);
959 QTAILQ_FOREACH(vs
, &vd
->clients
, next
) {
960 vnc_cursor_define(vs
);
964 static int find_and_clear_dirty_height(VncState
*vs
,
965 int y
, int last_x
, int x
, int height
)
969 for (h
= 1; h
< (height
- y
); h
++) {
970 if (!test_bit(last_x
, vs
->dirty
[y
+ h
])) {
973 bitmap_clear(vs
->dirty
[y
+ h
], last_x
, x
- last_x
);
980 * Figure out how much pending data we should allow in the output
981 * buffer before we throttle incremental display updates, and/or
982 * drop audio samples.
984 * We allow for equiv of 1 full display's worth of FB updates,
985 * and 1 second of audio samples. If audio backlog was larger
986 * than that the client would already suffering awful audio
987 * glitches, so dropping samples is no worse really).
989 static void vnc_update_throttle_offset(VncState
*vs
)
992 vs
->client_width
* vs
->client_height
* vs
->client_pf
.bytes_per_pixel
;
996 switch (vs
->as
.fmt
) {
1011 offset
+= vs
->as
.freq
* bps
* vs
->as
.nchannels
;
1014 /* Put a floor of 1MB on offset, so that if we have a large pending
1015 * buffer and the display is resized to a small size & back again
1016 * we don't suddenly apply a tiny send limit
1018 offset
= MAX(offset
, 1024 * 1024);
1020 if (vs
->throttle_output_offset
!= offset
) {
1021 trace_vnc_client_throttle_threshold(
1022 vs
, vs
->ioc
, vs
->throttle_output_offset
, offset
, vs
->client_width
,
1023 vs
->client_height
, vs
->client_pf
.bytes_per_pixel
, vs
->audio_cap
);
1026 vs
->throttle_output_offset
= offset
;
1029 static bool vnc_should_update(VncState
*vs
)
1031 switch (vs
->update
) {
1032 case VNC_STATE_UPDATE_NONE
:
1034 case VNC_STATE_UPDATE_INCREMENTAL
:
1035 /* Only allow incremental updates if the pending send queue
1036 * is less than the permitted threshold, and the job worker
1037 * is completely idle.
1039 if (vs
->output
.offset
< vs
->throttle_output_offset
&&
1040 vs
->job_update
== VNC_STATE_UPDATE_NONE
) {
1043 trace_vnc_client_throttle_incremental(
1044 vs
, vs
->ioc
, vs
->job_update
, vs
->output
.offset
);
1046 case VNC_STATE_UPDATE_FORCE
:
1047 /* Only allow forced updates if the pending send queue
1048 * does not contain a previous forced update, and the
1049 * job worker is completely idle.
1051 * Note this means we'll queue a forced update, even if
1052 * the output buffer size is otherwise over the throttle
1055 if (vs
->force_update_offset
== 0 &&
1056 vs
->job_update
== VNC_STATE_UPDATE_NONE
) {
1059 trace_vnc_client_throttle_forced(
1060 vs
, vs
->ioc
, vs
->job_update
, vs
->force_update_offset
);
1066 static int vnc_update_client(VncState
*vs
, int has_dirty
)
1068 VncDisplay
*vd
= vs
->vd
;
1074 if (vs
->disconnecting
) {
1075 vnc_disconnect_finish(vs
);
1079 vs
->has_dirty
+= has_dirty
;
1080 if (!vnc_should_update(vs
)) {
1084 if (!vs
->has_dirty
&& vs
->update
!= VNC_STATE_UPDATE_FORCE
) {
1089 * Send screen updates to the vnc client using the server
1090 * surface and server dirty map. guest surface updates
1091 * happening in parallel don't disturb us, the next pass will
1092 * send them to the client.
1094 job
= vnc_job_new(vs
);
1096 height
= pixman_image_get_height(vd
->server
);
1097 width
= pixman_image_get_width(vd
->server
);
1103 unsigned long offset
= find_next_bit((unsigned long *) &vs
->dirty
,
1104 height
* VNC_DIRTY_BPL(vs
),
1105 y
* VNC_DIRTY_BPL(vs
));
1106 if (offset
== height
* VNC_DIRTY_BPL(vs
)) {
1107 /* no more dirty bits */
1110 y
= offset
/ VNC_DIRTY_BPL(vs
);
1111 x
= offset
% VNC_DIRTY_BPL(vs
);
1112 x2
= find_next_zero_bit((unsigned long *) &vs
->dirty
[y
],
1113 VNC_DIRTY_BPL(vs
), x
);
1114 bitmap_clear(vs
->dirty
[y
], x
, x2
- x
);
1115 h
= find_and_clear_dirty_height(vs
, y
, x
, x2
, height
);
1116 x2
= MIN(x2
, width
/ VNC_DIRTY_PIXELS_PER_BIT
);
1118 n
+= vnc_job_add_rect(job
, x
* VNC_DIRTY_PIXELS_PER_BIT
, y
,
1119 (x2
- x
) * VNC_DIRTY_PIXELS_PER_BIT
, h
);
1121 if (!x
&& x2
== width
/ VNC_DIRTY_PIXELS_PER_BIT
) {
1129 vs
->job_update
= vs
->update
;
1130 vs
->update
= VNC_STATE_UPDATE_NONE
;
1137 static void audio_capture_notify(void *opaque
, audcnotification_e cmd
)
1139 VncState
*vs
= opaque
;
1142 case AUD_CNOTIFY_DISABLE
:
1143 vnc_lock_output(vs
);
1144 vnc_write_u8(vs
, VNC_MSG_SERVER_QEMU
);
1145 vnc_write_u8(vs
, VNC_MSG_SERVER_QEMU_AUDIO
);
1146 vnc_write_u16(vs
, VNC_MSG_SERVER_QEMU_AUDIO_END
);
1147 vnc_unlock_output(vs
);
1151 case AUD_CNOTIFY_ENABLE
:
1152 vnc_lock_output(vs
);
1153 vnc_write_u8(vs
, VNC_MSG_SERVER_QEMU
);
1154 vnc_write_u8(vs
, VNC_MSG_SERVER_QEMU_AUDIO
);
1155 vnc_write_u16(vs
, VNC_MSG_SERVER_QEMU_AUDIO_BEGIN
);
1156 vnc_unlock_output(vs
);
1162 static void audio_capture_destroy(void *opaque
)
1166 static void audio_capture(void *opaque
, void *buf
, int size
)
1168 VncState
*vs
= opaque
;
1170 vnc_lock_output(vs
);
1171 if (vs
->output
.offset
< vs
->throttle_output_offset
) {
1172 vnc_write_u8(vs
, VNC_MSG_SERVER_QEMU
);
1173 vnc_write_u8(vs
, VNC_MSG_SERVER_QEMU_AUDIO
);
1174 vnc_write_u16(vs
, VNC_MSG_SERVER_QEMU_AUDIO_DATA
);
1175 vnc_write_u32(vs
, size
);
1176 vnc_write(vs
, buf
, size
);
1178 trace_vnc_client_throttle_audio(vs
, vs
->ioc
, vs
->output
.offset
);
1180 vnc_unlock_output(vs
);
1184 static void audio_add(VncState
*vs
)
1186 struct audio_capture_ops ops
;
1188 if (vs
->audio_cap
) {
1189 error_report("audio already running");
1193 ops
.notify
= audio_capture_notify
;
1194 ops
.destroy
= audio_capture_destroy
;
1195 ops
.capture
= audio_capture
;
1197 vs
->audio_cap
= AUD_add_capture(&vs
->as
, &ops
, vs
);
1198 if (!vs
->audio_cap
) {
1199 error_report("Failed to add audio capture");
1203 static void audio_del(VncState
*vs
)
1205 if (vs
->audio_cap
) {
1206 AUD_del_capture(vs
->audio_cap
, vs
);
1207 vs
->audio_cap
= NULL
;
1211 static void vnc_disconnect_start(VncState
*vs
)
1213 if (vs
->disconnecting
) {
1216 trace_vnc_client_disconnect_start(vs
, vs
->ioc
);
1217 vnc_set_share_mode(vs
, VNC_SHARE_MODE_DISCONNECTED
);
1219 g_source_remove(vs
->ioc_tag
);
1222 qio_channel_close(vs
->ioc
, NULL
);
1223 vs
->disconnecting
= TRUE
;
1226 void vnc_disconnect_finish(VncState
*vs
)
1230 trace_vnc_client_disconnect_finish(vs
, vs
->ioc
);
1232 vnc_jobs_join(vs
); /* Wait encoding jobs */
1234 vnc_lock_output(vs
);
1235 vnc_qmp_event(vs
, QAPI_EVENT_VNC_DISCONNECTED
);
1237 buffer_free(&vs
->input
);
1238 buffer_free(&vs
->output
);
1240 qapi_free_VncClientInfo(vs
->info
);
1243 vnc_tight_clear(vs
);
1246 #ifdef CONFIG_VNC_SASL
1247 vnc_sasl_client_cleanup(vs
);
1248 #endif /* CONFIG_VNC_SASL */
1250 vnc_release_modifiers(vs
);
1252 if (vs
->mouse_mode_notifier
.notify
!= NULL
) {
1253 qemu_remove_mouse_mode_change_notifier(&vs
->mouse_mode_notifier
);
1255 QTAILQ_REMOVE(&vs
->vd
->clients
, vs
, next
);
1256 if (QTAILQ_EMPTY(&vs
->vd
->clients
)) {
1257 /* last client gone */
1258 vnc_update_server_surface(vs
->vd
);
1261 vnc_unlock_output(vs
);
1263 qemu_mutex_destroy(&vs
->output_mutex
);
1264 if (vs
->bh
!= NULL
) {
1265 qemu_bh_delete(vs
->bh
);
1267 buffer_free(&vs
->jobs_buffer
);
1269 for (i
= 0; i
< VNC_STAT_ROWS
; ++i
) {
1270 g_free(vs
->lossy_rect
[i
]);
1272 g_free(vs
->lossy_rect
);
1274 object_unref(OBJECT(vs
->ioc
));
1276 object_unref(OBJECT(vs
->sioc
));
1281 size_t vnc_client_io_error(VncState
*vs
, ssize_t ret
, Error
**errp
)
1285 trace_vnc_client_eof(vs
, vs
->ioc
);
1286 vnc_disconnect_start(vs
);
1287 } else if (ret
!= QIO_CHANNEL_ERR_BLOCK
) {
1288 trace_vnc_client_io_error(vs
, vs
->ioc
,
1289 errp
? error_get_pretty(*errp
) :
1291 vnc_disconnect_start(vs
);
1304 void vnc_client_error(VncState
*vs
)
1306 VNC_DEBUG("Closing down client sock: protocol error\n");
1307 vnc_disconnect_start(vs
);
1312 * Called to write a chunk of data to the client socket. The data may
1313 * be the raw data, or may have already been encoded by SASL.
1314 * The data will be written either straight onto the socket, or
1315 * written via the GNUTLS wrappers, if TLS/SSL encryption is enabled
1317 * NB, it is theoretically possible to have 2 layers of encryption,
1318 * both SASL, and this TLS layer. It is highly unlikely in practice
1319 * though, since SASL encryption will typically be a no-op if TLS
1322 * Returns the number of bytes written, which may be less than
1323 * the requested 'datalen' if the socket would block. Returns
1324 * 0 on I/O error, and disconnects the client socket.
1326 size_t vnc_client_write_buf(VncState
*vs
, const uint8_t *data
, size_t datalen
)
1330 ret
= qio_channel_write(
1331 vs
->ioc
, (const char *)data
, datalen
, &err
);
1332 VNC_DEBUG("Wrote wire %p %zd -> %ld\n", data
, datalen
, ret
);
1333 return vnc_client_io_error(vs
, ret
, &err
);
1338 * Called to write buffered data to the client socket, when not
1339 * using any SASL SSF encryption layers. Will write as much data
1340 * as possible without blocking. If all buffered data is written,
1341 * will switch the FD poll() handler back to read monitoring.
1343 * Returns the number of bytes written, which may be less than
1344 * the buffered output data if the socket would block. Returns
1345 * 0 on I/O error, and disconnects the client socket.
1347 static size_t vnc_client_write_plain(VncState
*vs
)
1352 #ifdef CONFIG_VNC_SASL
1353 VNC_DEBUG("Write Plain: Pending output %p size %zd offset %zd. Wait SSF %d\n",
1354 vs
->output
.buffer
, vs
->output
.capacity
, vs
->output
.offset
,
1355 vs
->sasl
.waitWriteSSF
);
1357 if (vs
->sasl
.conn
&&
1359 vs
->sasl
.waitWriteSSF
) {
1360 ret
= vnc_client_write_buf(vs
, vs
->output
.buffer
, vs
->sasl
.waitWriteSSF
);
1362 vs
->sasl
.waitWriteSSF
-= ret
;
1364 #endif /* CONFIG_VNC_SASL */
1365 ret
= vnc_client_write_buf(vs
, vs
->output
.buffer
, vs
->output
.offset
);
1369 if (ret
>= vs
->force_update_offset
) {
1370 if (vs
->force_update_offset
!= 0) {
1371 trace_vnc_client_unthrottle_forced(vs
, vs
->ioc
);
1373 vs
->force_update_offset
= 0;
1375 vs
->force_update_offset
-= ret
;
1377 offset
= vs
->output
.offset
;
1378 buffer_advance(&vs
->output
, ret
);
1379 if (offset
>= vs
->throttle_output_offset
&&
1380 vs
->output
.offset
< vs
->throttle_output_offset
) {
1381 trace_vnc_client_unthrottle_incremental(vs
, vs
->ioc
, vs
->output
.offset
);
1384 if (vs
->output
.offset
== 0) {
1386 g_source_remove(vs
->ioc_tag
);
1388 vs
->ioc_tag
= qio_channel_add_watch(
1389 vs
->ioc
, G_IO_IN
, vnc_client_io
, vs
, NULL
);
1397 * First function called whenever there is data to be written to
1398 * the client socket. Will delegate actual work according to whether
1399 * SASL SSF layers are enabled (thus requiring encryption calls)
1401 static void vnc_client_write_locked(VncState
*vs
)
1403 #ifdef CONFIG_VNC_SASL
1404 if (vs
->sasl
.conn
&&
1406 !vs
->sasl
.waitWriteSSF
) {
1407 vnc_client_write_sasl(vs
);
1409 #endif /* CONFIG_VNC_SASL */
1411 vnc_client_write_plain(vs
);
1415 static void vnc_client_write(VncState
*vs
)
1418 vnc_lock_output(vs
);
1419 if (vs
->output
.offset
) {
1420 vnc_client_write_locked(vs
);
1421 } else if (vs
->ioc
!= NULL
) {
1423 g_source_remove(vs
->ioc_tag
);
1425 vs
->ioc_tag
= qio_channel_add_watch(
1426 vs
->ioc
, G_IO_IN
, vnc_client_io
, vs
, NULL
);
1428 vnc_unlock_output(vs
);
1431 void vnc_read_when(VncState
*vs
, VncReadEvent
*func
, size_t expecting
)
1433 vs
->read_handler
= func
;
1434 vs
->read_handler_expect
= expecting
;
1439 * Called to read a chunk of data from the client socket. The data may
1440 * be the raw data, or may need to be further decoded by SASL.
1441 * The data will be read either straight from to the socket, or
1442 * read via the GNUTLS wrappers, if TLS/SSL encryption is enabled
1444 * NB, it is theoretically possible to have 2 layers of encryption,
1445 * both SASL, and this TLS layer. It is highly unlikely in practice
1446 * though, since SASL encryption will typically be a no-op if TLS
1449 * Returns the number of bytes read, which may be less than
1450 * the requested 'datalen' if the socket would block. Returns
1451 * 0 on I/O error or EOF, and disconnects the client socket.
1453 size_t vnc_client_read_buf(VncState
*vs
, uint8_t *data
, size_t datalen
)
1457 ret
= qio_channel_read(
1458 vs
->ioc
, (char *)data
, datalen
, &err
);
1459 VNC_DEBUG("Read wire %p %zd -> %ld\n", data
, datalen
, ret
);
1460 return vnc_client_io_error(vs
, ret
, &err
);
1465 * Called to read data from the client socket to the input buffer,
1466 * when not using any SASL SSF encryption layers. Will read as much
1467 * data as possible without blocking.
1469 * Returns the number of bytes read, which may be less than
1470 * the requested 'datalen' if the socket would block. Returns
1471 * 0 on I/O error or EOF, and disconnects the client socket.
1473 static size_t vnc_client_read_plain(VncState
*vs
)
1476 VNC_DEBUG("Read plain %p size %zd offset %zd\n",
1477 vs
->input
.buffer
, vs
->input
.capacity
, vs
->input
.offset
);
1478 buffer_reserve(&vs
->input
, 4096);
1479 ret
= vnc_client_read_buf(vs
, buffer_end(&vs
->input
), 4096);
1482 vs
->input
.offset
+= ret
;
1486 static void vnc_jobs_bh(void *opaque
)
1488 VncState
*vs
= opaque
;
1490 vnc_jobs_consume_buffer(vs
);
1494 * First function called whenever there is more data to be read from
1495 * the client socket. Will delegate actual work according to whether
1496 * SASL SSF layers are enabled (thus requiring decryption calls)
1497 * Returns 0 on success, -1 if client disconnected
1499 static int vnc_client_read(VncState
*vs
)
1503 #ifdef CONFIG_VNC_SASL
1504 if (vs
->sasl
.conn
&& vs
->sasl
.runSSF
)
1505 ret
= vnc_client_read_sasl(vs
);
1507 #endif /* CONFIG_VNC_SASL */
1508 ret
= vnc_client_read_plain(vs
);
1510 if (vs
->disconnecting
) {
1511 vnc_disconnect_finish(vs
);
1517 while (vs
->read_handler
&& vs
->input
.offset
>= vs
->read_handler_expect
) {
1518 size_t len
= vs
->read_handler_expect
;
1521 ret
= vs
->read_handler(vs
, vs
->input
.buffer
, len
);
1522 if (vs
->disconnecting
) {
1523 vnc_disconnect_finish(vs
);
1528 buffer_advance(&vs
->input
, len
);
1530 vs
->read_handler_expect
= ret
;
1536 gboolean
vnc_client_io(QIOChannel
*ioc G_GNUC_UNUSED
,
1537 GIOCondition condition
, void *opaque
)
1539 VncState
*vs
= opaque
;
1540 if (condition
& G_IO_IN
) {
1541 if (vnc_client_read(vs
) < 0) {
1545 if (condition
& G_IO_OUT
) {
1546 vnc_client_write(vs
);
1549 if (vs
->disconnecting
) {
1550 if (vs
->ioc_tag
!= 0) {
1551 g_source_remove(vs
->ioc_tag
);
1560 * Scale factor to apply to vs->throttle_output_offset when checking for
1561 * hard limit. Worst case normal usage could be x2, if we have a complete
1562 * incremental update and complete forced update in the output buffer.
1563 * So x3 should be good enough, but we pick x5 to be conservative and thus
1564 * (hopefully) never trigger incorrectly.
1566 #define VNC_THROTTLE_OUTPUT_LIMIT_SCALE 5
1568 void vnc_write(VncState
*vs
, const void *data
, size_t len
)
1570 if (vs
->disconnecting
) {
1573 /* Protection against malicious client/guest to prevent our output
1574 * buffer growing without bound if client stops reading data. This
1575 * should rarely trigger, because we have earlier throttling code
1576 * which stops issuing framebuffer updates and drops audio data
1577 * if the throttle_output_offset value is exceeded. So we only reach
1578 * this higher level if a huge number of pseudo-encodings get
1579 * triggered while data can't be sent on the socket.
1581 * NB throttle_output_offset can be zero during early protocol
1582 * handshake, or from the job thread's VncState clone
1584 if (vs
->throttle_output_offset
!= 0 &&
1585 (vs
->output
.offset
/ VNC_THROTTLE_OUTPUT_LIMIT_SCALE
) >
1586 vs
->throttle_output_offset
) {
1587 trace_vnc_client_output_limit(vs
, vs
->ioc
, vs
->output
.offset
,
1588 vs
->throttle_output_offset
);
1589 vnc_disconnect_start(vs
);
1592 buffer_reserve(&vs
->output
, len
);
1594 if (vs
->ioc
!= NULL
&& buffer_empty(&vs
->output
)) {
1596 g_source_remove(vs
->ioc_tag
);
1598 vs
->ioc_tag
= qio_channel_add_watch(
1599 vs
->ioc
, G_IO_IN
| G_IO_OUT
, vnc_client_io
, vs
, NULL
);
1602 buffer_append(&vs
->output
, data
, len
);
1605 void vnc_write_s32(VncState
*vs
, int32_t value
)
1607 vnc_write_u32(vs
, *(uint32_t *)&value
);
1610 void vnc_write_u32(VncState
*vs
, uint32_t value
)
1614 buf
[0] = (value
>> 24) & 0xFF;
1615 buf
[1] = (value
>> 16) & 0xFF;
1616 buf
[2] = (value
>> 8) & 0xFF;
1617 buf
[3] = value
& 0xFF;
1619 vnc_write(vs
, buf
, 4);
1622 void vnc_write_u16(VncState
*vs
, uint16_t value
)
1626 buf
[0] = (value
>> 8) & 0xFF;
1627 buf
[1] = value
& 0xFF;
1629 vnc_write(vs
, buf
, 2);
1632 void vnc_write_u8(VncState
*vs
, uint8_t value
)
1634 vnc_write(vs
, (char *)&value
, 1);
1637 void vnc_flush(VncState
*vs
)
1639 vnc_lock_output(vs
);
1640 if (vs
->ioc
!= NULL
&& vs
->output
.offset
) {
1641 vnc_client_write_locked(vs
);
1643 if (vs
->disconnecting
) {
1644 if (vs
->ioc_tag
!= 0) {
1645 g_source_remove(vs
->ioc_tag
);
1649 vnc_unlock_output(vs
);
1652 static uint8_t read_u8(uint8_t *data
, size_t offset
)
1654 return data
[offset
];
1657 static uint16_t read_u16(uint8_t *data
, size_t offset
)
1659 return ((data
[offset
] & 0xFF) << 8) | (data
[offset
+ 1] & 0xFF);
1662 static int32_t read_s32(uint8_t *data
, size_t offset
)
1664 return (int32_t)((data
[offset
] << 24) | (data
[offset
+ 1] << 16) |
1665 (data
[offset
+ 2] << 8) | data
[offset
+ 3]);
1668 uint32_t read_u32(uint8_t *data
, size_t offset
)
1670 return ((data
[offset
] << 24) | (data
[offset
+ 1] << 16) |
1671 (data
[offset
+ 2] << 8) | data
[offset
+ 3]);
1674 static void client_cut_text(VncState
*vs
, size_t len
, uint8_t *text
)
1678 static void check_pointer_type_change(Notifier
*notifier
, void *data
)
1680 VncState
*vs
= container_of(notifier
, VncState
, mouse_mode_notifier
);
1681 int absolute
= qemu_input_is_absolute();
1683 if (vnc_has_feature(vs
, VNC_FEATURE_POINTER_TYPE_CHANGE
) && vs
->absolute
!= absolute
) {
1684 vnc_lock_output(vs
);
1685 vnc_write_u8(vs
, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE
);
1686 vnc_write_u8(vs
, 0);
1687 vnc_write_u16(vs
, 1);
1688 vnc_framebuffer_update(vs
, absolute
, 0,
1689 pixman_image_get_width(vs
->vd
->server
),
1690 pixman_image_get_height(vs
->vd
->server
),
1691 VNC_ENCODING_POINTER_TYPE_CHANGE
);
1692 vnc_unlock_output(vs
);
1695 vs
->absolute
= absolute
;
1698 static void pointer_event(VncState
*vs
, int button_mask
, int x
, int y
)
1700 static uint32_t bmap
[INPUT_BUTTON__MAX
] = {
1701 [INPUT_BUTTON_LEFT
] = 0x01,
1702 [INPUT_BUTTON_MIDDLE
] = 0x02,
1703 [INPUT_BUTTON_RIGHT
] = 0x04,
1704 [INPUT_BUTTON_WHEEL_UP
] = 0x08,
1705 [INPUT_BUTTON_WHEEL_DOWN
] = 0x10,
1707 QemuConsole
*con
= vs
->vd
->dcl
.con
;
1708 int width
= pixman_image_get_width(vs
->vd
->server
);
1709 int height
= pixman_image_get_height(vs
->vd
->server
);
1711 if (vs
->last_bmask
!= button_mask
) {
1712 qemu_input_update_buttons(con
, bmap
, vs
->last_bmask
, button_mask
);
1713 vs
->last_bmask
= button_mask
;
1717 qemu_input_queue_abs(con
, INPUT_AXIS_X
, x
, 0, width
);
1718 qemu_input_queue_abs(con
, INPUT_AXIS_Y
, y
, 0, height
);
1719 } else if (vnc_has_feature(vs
, VNC_FEATURE_POINTER_TYPE_CHANGE
)) {
1720 qemu_input_queue_rel(con
, INPUT_AXIS_X
, x
- 0x7FFF);
1721 qemu_input_queue_rel(con
, INPUT_AXIS_Y
, y
- 0x7FFF);
1723 if (vs
->last_x
!= -1) {
1724 qemu_input_queue_rel(con
, INPUT_AXIS_X
, x
- vs
->last_x
);
1725 qemu_input_queue_rel(con
, INPUT_AXIS_Y
, y
- vs
->last_y
);
1730 qemu_input_event_sync();
1733 static void reset_keys(VncState
*vs
)
1736 for(i
= 0; i
< 256; i
++) {
1737 if (vs
->modifiers_state
[i
]) {
1738 qemu_input_event_send_key_number(vs
->vd
->dcl
.con
, i
, false);
1739 qemu_input_event_send_key_delay(vs
->vd
->key_delay_ms
);
1740 vs
->modifiers_state
[i
] = 0;
1745 static void press_key(VncState
*vs
, int keysym
)
1747 int keycode
= keysym2scancode(vs
->vd
->kbd_layout
, keysym
,
1748 false, false, false) & SCANCODE_KEYMASK
;
1749 qemu_input_event_send_key_number(vs
->vd
->dcl
.con
, keycode
, true);
1750 qemu_input_event_send_key_delay(vs
->vd
->key_delay_ms
);
1751 qemu_input_event_send_key_number(vs
->vd
->dcl
.con
, keycode
, false);
1752 qemu_input_event_send_key_delay(vs
->vd
->key_delay_ms
);
1755 static void vnc_led_state_change(VncState
*vs
)
1757 if (!vnc_has_feature(vs
, VNC_FEATURE_LED_STATE
)) {
1761 vnc_lock_output(vs
);
1762 vnc_write_u8(vs
, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE
);
1763 vnc_write_u8(vs
, 0);
1764 vnc_write_u16(vs
, 1);
1765 vnc_framebuffer_update(vs
, 0, 0, 1, 1, VNC_ENCODING_LED_STATE
);
1766 vnc_write_u8(vs
, vs
->vd
->ledstate
);
1767 vnc_unlock_output(vs
);
1771 static void kbd_leds(void *opaque
, int ledstate
)
1773 VncDisplay
*vd
= opaque
;
1776 trace_vnc_key_guest_leds((ledstate
& QEMU_CAPS_LOCK_LED
),
1777 (ledstate
& QEMU_NUM_LOCK_LED
),
1778 (ledstate
& QEMU_SCROLL_LOCK_LED
));
1780 if (ledstate
== vd
->ledstate
) {
1784 vd
->ledstate
= ledstate
;
1786 QTAILQ_FOREACH(client
, &vd
->clients
, next
) {
1787 vnc_led_state_change(client
);
1791 static void do_key_event(VncState
*vs
, int down
, int keycode
, int sym
)
1793 /* QEMU console switch */
1795 case 0x2a: /* Left Shift */
1796 case 0x36: /* Right Shift */
1797 case 0x1d: /* Left CTRL */
1798 case 0x9d: /* Right CTRL */
1799 case 0x38: /* Left ALT */
1800 case 0xb8: /* Right ALT */
1802 vs
->modifiers_state
[keycode
] = 1;
1804 vs
->modifiers_state
[keycode
] = 0;
1806 case 0x02 ... 0x0a: /* '1' to '9' keys */
1807 if (vs
->vd
->dcl
.con
== NULL
&&
1808 down
&& vs
->modifiers_state
[0x1d] && vs
->modifiers_state
[0x38]) {
1809 /* Reset the modifiers sent to the current console */
1811 console_select(keycode
- 0x02);
1815 case 0x3a: /* CapsLock */
1816 case 0x45: /* NumLock */
1818 vs
->modifiers_state
[keycode
] ^= 1;
1822 /* Turn off the lock state sync logic if the client support the led
1825 if (down
&& vs
->vd
->lock_key_sync
&&
1826 !vnc_has_feature(vs
, VNC_FEATURE_LED_STATE
) &&
1827 keycode_is_keypad(vs
->vd
->kbd_layout
, keycode
)) {
1828 /* If the numlock state needs to change then simulate an additional
1829 keypress before sending this one. This will happen if the user
1830 toggles numlock away from the VNC window.
1832 if (keysym_is_numlock(vs
->vd
->kbd_layout
, sym
& 0xFFFF)) {
1833 if (!vs
->modifiers_state
[0x45]) {
1834 trace_vnc_key_sync_numlock(true);
1835 vs
->modifiers_state
[0x45] = 1;
1836 press_key(vs
, 0xff7f);
1839 if (vs
->modifiers_state
[0x45]) {
1840 trace_vnc_key_sync_numlock(false);
1841 vs
->modifiers_state
[0x45] = 0;
1842 press_key(vs
, 0xff7f);
1847 if (down
&& vs
->vd
->lock_key_sync
&&
1848 !vnc_has_feature(vs
, VNC_FEATURE_LED_STATE
) &&
1849 ((sym
>= 'A' && sym
<= 'Z') || (sym
>= 'a' && sym
<= 'z'))) {
1850 /* If the capslock state needs to change then simulate an additional
1851 keypress before sending this one. This will happen if the user
1852 toggles capslock away from the VNC window.
1854 int uppercase
= !!(sym
>= 'A' && sym
<= 'Z');
1855 int shift
= !!(vs
->modifiers_state
[0x2a] | vs
->modifiers_state
[0x36]);
1856 int capslock
= !!(vs
->modifiers_state
[0x3a]);
1858 if (uppercase
== shift
) {
1859 trace_vnc_key_sync_capslock(false);
1860 vs
->modifiers_state
[0x3a] = 0;
1861 press_key(vs
, 0xffe5);
1864 if (uppercase
!= shift
) {
1865 trace_vnc_key_sync_capslock(true);
1866 vs
->modifiers_state
[0x3a] = 1;
1867 press_key(vs
, 0xffe5);
1872 if (qemu_console_is_graphic(NULL
)) {
1873 qemu_input_event_send_key_number(vs
->vd
->dcl
.con
, keycode
, down
);
1874 qemu_input_event_send_key_delay(vs
->vd
->key_delay_ms
);
1876 bool numlock
= vs
->modifiers_state
[0x45];
1877 bool control
= (vs
->modifiers_state
[0x1d] ||
1878 vs
->modifiers_state
[0x9d]);
1879 /* QEMU console emulation */
1882 case 0x2a: /* Left Shift */
1883 case 0x36: /* Right Shift */
1884 case 0x1d: /* Left CTRL */
1885 case 0x9d: /* Right CTRL */
1886 case 0x38: /* Left ALT */
1887 case 0xb8: /* Right ALT */
1890 kbd_put_keysym(QEMU_KEY_UP
);
1893 kbd_put_keysym(QEMU_KEY_DOWN
);
1896 kbd_put_keysym(QEMU_KEY_LEFT
);
1899 kbd_put_keysym(QEMU_KEY_RIGHT
);
1902 kbd_put_keysym(QEMU_KEY_DELETE
);
1905 kbd_put_keysym(QEMU_KEY_HOME
);
1908 kbd_put_keysym(QEMU_KEY_END
);
1911 kbd_put_keysym(QEMU_KEY_PAGEUP
);
1914 kbd_put_keysym(QEMU_KEY_PAGEDOWN
);
1918 kbd_put_keysym(numlock
? '7' : QEMU_KEY_HOME
);
1921 kbd_put_keysym(numlock
? '8' : QEMU_KEY_UP
);
1924 kbd_put_keysym(numlock
? '9' : QEMU_KEY_PAGEUP
);
1927 kbd_put_keysym(numlock
? '4' : QEMU_KEY_LEFT
);
1930 kbd_put_keysym('5');
1933 kbd_put_keysym(numlock
? '6' : QEMU_KEY_RIGHT
);
1936 kbd_put_keysym(numlock
? '1' : QEMU_KEY_END
);
1939 kbd_put_keysym(numlock
? '2' : QEMU_KEY_DOWN
);
1942 kbd_put_keysym(numlock
? '3' : QEMU_KEY_PAGEDOWN
);
1945 kbd_put_keysym('0');
1948 kbd_put_keysym(numlock
? '.' : QEMU_KEY_DELETE
);
1952 kbd_put_keysym('/');
1955 kbd_put_keysym('*');
1958 kbd_put_keysym('-');
1961 kbd_put_keysym('+');
1964 kbd_put_keysym('\n');
1969 kbd_put_keysym(sym
& 0x1f);
1971 kbd_put_keysym(sym
);
1979 static void vnc_release_modifiers(VncState
*vs
)
1981 static const int keycodes
[] = {
1982 /* shift, control, alt keys, both left & right */
1983 0x2a, 0x36, 0x1d, 0x9d, 0x38, 0xb8,
1987 if (!qemu_console_is_graphic(NULL
)) {
1990 for (i
= 0; i
< ARRAY_SIZE(keycodes
); i
++) {
1991 keycode
= keycodes
[i
];
1992 if (!vs
->modifiers_state
[keycode
]) {
1995 qemu_input_event_send_key_number(vs
->vd
->dcl
.con
, keycode
, false);
1996 qemu_input_event_send_key_delay(vs
->vd
->key_delay_ms
);
2000 static const char *code2name(int keycode
)
2002 return QKeyCode_str(qemu_input_key_number_to_qcode(keycode
));
2005 static void key_event(VncState
*vs
, int down
, uint32_t sym
)
2007 bool shift
= vs
->modifiers_state
[0x2a] || vs
->modifiers_state
[0x36];
2008 bool altgr
= vs
->modifiers_state
[0xb8];
2009 bool ctrl
= vs
->modifiers_state
[0x1d] || vs
->modifiers_state
[0x9d];
2013 if (lsym
>= 'A' && lsym
<= 'Z' && qemu_console_is_graphic(NULL
)) {
2014 lsym
= lsym
- 'A' + 'a';
2017 keycode
= keysym2scancode(vs
->vd
->kbd_layout
, lsym
& 0xFFFF,
2018 shift
, altgr
, ctrl
) & SCANCODE_KEYMASK
;
2019 trace_vnc_key_event_map(down
, sym
, keycode
, code2name(keycode
));
2020 do_key_event(vs
, down
, keycode
, sym
);
2023 static void ext_key_event(VncState
*vs
, int down
,
2024 uint32_t sym
, uint16_t keycode
)
2026 /* if the user specifies a keyboard layout, always use it */
2027 if (keyboard_layout
) {
2028 key_event(vs
, down
, sym
);
2030 trace_vnc_key_event_ext(down
, sym
, keycode
, code2name(keycode
));
2031 do_key_event(vs
, down
, keycode
, sym
);
2035 static void framebuffer_update_request(VncState
*vs
, int incremental
,
2036 int x
, int y
, int w
, int h
)
2039 if (vs
->update
!= VNC_STATE_UPDATE_FORCE
) {
2040 vs
->update
= VNC_STATE_UPDATE_INCREMENTAL
;
2043 vs
->update
= VNC_STATE_UPDATE_FORCE
;
2044 vnc_set_area_dirty(vs
->dirty
, vs
->vd
, x
, y
, w
, h
);
2048 static void send_ext_key_event_ack(VncState
*vs
)
2050 vnc_lock_output(vs
);
2051 vnc_write_u8(vs
, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE
);
2052 vnc_write_u8(vs
, 0);
2053 vnc_write_u16(vs
, 1);
2054 vnc_framebuffer_update(vs
, 0, 0,
2055 pixman_image_get_width(vs
->vd
->server
),
2056 pixman_image_get_height(vs
->vd
->server
),
2057 VNC_ENCODING_EXT_KEY_EVENT
);
2058 vnc_unlock_output(vs
);
2062 static void send_ext_audio_ack(VncState
*vs
)
2064 vnc_lock_output(vs
);
2065 vnc_write_u8(vs
, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE
);
2066 vnc_write_u8(vs
, 0);
2067 vnc_write_u16(vs
, 1);
2068 vnc_framebuffer_update(vs
, 0, 0,
2069 pixman_image_get_width(vs
->vd
->server
),
2070 pixman_image_get_height(vs
->vd
->server
),
2071 VNC_ENCODING_AUDIO
);
2072 vnc_unlock_output(vs
);
2076 static void set_encodings(VncState
*vs
, int32_t *encodings
, size_t n_encodings
)
2079 unsigned int enc
= 0;
2082 vs
->vnc_encoding
= 0;
2083 vs
->tight
.compression
= 9;
2084 vs
->tight
.quality
= -1; /* Lossless by default */
2088 * Start from the end because the encodings are sent in order of preference.
2089 * This way the preferred encoding (first encoding defined in the array)
2090 * will be set at the end of the loop.
2092 for (i
= n_encodings
- 1; i
>= 0; i
--) {
2095 case VNC_ENCODING_RAW
:
2096 vs
->vnc_encoding
= enc
;
2098 case VNC_ENCODING_COPYRECT
:
2099 vs
->features
|= VNC_FEATURE_COPYRECT_MASK
;
2101 case VNC_ENCODING_HEXTILE
:
2102 vs
->features
|= VNC_FEATURE_HEXTILE_MASK
;
2103 vs
->vnc_encoding
= enc
;
2105 case VNC_ENCODING_TIGHT
:
2106 vs
->features
|= VNC_FEATURE_TIGHT_MASK
;
2107 vs
->vnc_encoding
= enc
;
2109 #ifdef CONFIG_VNC_PNG
2110 case VNC_ENCODING_TIGHT_PNG
:
2111 vs
->features
|= VNC_FEATURE_TIGHT_PNG_MASK
;
2112 vs
->vnc_encoding
= enc
;
2115 case VNC_ENCODING_ZLIB
:
2116 vs
->features
|= VNC_FEATURE_ZLIB_MASK
;
2117 vs
->vnc_encoding
= enc
;
2119 case VNC_ENCODING_ZRLE
:
2120 vs
->features
|= VNC_FEATURE_ZRLE_MASK
;
2121 vs
->vnc_encoding
= enc
;
2123 case VNC_ENCODING_ZYWRLE
:
2124 vs
->features
|= VNC_FEATURE_ZYWRLE_MASK
;
2125 vs
->vnc_encoding
= enc
;
2127 case VNC_ENCODING_DESKTOPRESIZE
:
2128 vs
->features
|= VNC_FEATURE_RESIZE_MASK
;
2130 case VNC_ENCODING_POINTER_TYPE_CHANGE
:
2131 vs
->features
|= VNC_FEATURE_POINTER_TYPE_CHANGE_MASK
;
2133 case VNC_ENCODING_RICH_CURSOR
:
2134 vs
->features
|= VNC_FEATURE_RICH_CURSOR_MASK
;
2135 if (vs
->vd
->cursor
) {
2136 vnc_cursor_define(vs
);
2139 case VNC_ENCODING_EXT_KEY_EVENT
:
2140 send_ext_key_event_ack(vs
);
2142 case VNC_ENCODING_AUDIO
:
2143 send_ext_audio_ack(vs
);
2145 case VNC_ENCODING_WMVi
:
2146 vs
->features
|= VNC_FEATURE_WMVI_MASK
;
2148 case VNC_ENCODING_LED_STATE
:
2149 vs
->features
|= VNC_FEATURE_LED_STATE_MASK
;
2151 case VNC_ENCODING_COMPRESSLEVEL0
... VNC_ENCODING_COMPRESSLEVEL0
+ 9:
2152 vs
->tight
.compression
= (enc
& 0x0F);
2154 case VNC_ENCODING_QUALITYLEVEL0
... VNC_ENCODING_QUALITYLEVEL0
+ 9:
2155 if (vs
->vd
->lossy
) {
2156 vs
->tight
.quality
= (enc
& 0x0F);
2160 VNC_DEBUG("Unknown encoding: %d (0x%.8x): %d\n", i
, enc
, enc
);
2164 vnc_desktop_resize(vs
);
2165 check_pointer_type_change(&vs
->mouse_mode_notifier
, NULL
);
2166 vnc_led_state_change(vs
);
2169 static void set_pixel_conversion(VncState
*vs
)
2171 pixman_format_code_t fmt
= qemu_pixman_get_format(&vs
->client_pf
);
2173 if (fmt
== VNC_SERVER_FB_FORMAT
) {
2174 vs
->write_pixels
= vnc_write_pixels_copy
;
2175 vnc_hextile_set_pixel_conversion(vs
, 0);
2177 vs
->write_pixels
= vnc_write_pixels_generic
;
2178 vnc_hextile_set_pixel_conversion(vs
, 1);
2182 static void send_color_map(VncState
*vs
)
2186 vnc_write_u8(vs
, VNC_MSG_SERVER_SET_COLOUR_MAP_ENTRIES
);
2187 vnc_write_u8(vs
, 0); /* padding */
2188 vnc_write_u16(vs
, 0); /* first color */
2189 vnc_write_u16(vs
, 256); /* # of colors */
2191 for (i
= 0; i
< 256; i
++) {
2192 PixelFormat
*pf
= &vs
->client_pf
;
2194 vnc_write_u16(vs
, (((i
>> pf
->rshift
) & pf
->rmax
) << (16 - pf
->rbits
)));
2195 vnc_write_u16(vs
, (((i
>> pf
->gshift
) & pf
->gmax
) << (16 - pf
->gbits
)));
2196 vnc_write_u16(vs
, (((i
>> pf
->bshift
) & pf
->bmax
) << (16 - pf
->bbits
)));
2200 static void set_pixel_format(VncState
*vs
, int bits_per_pixel
,
2201 int big_endian_flag
, int true_color_flag
,
2202 int red_max
, int green_max
, int blue_max
,
2203 int red_shift
, int green_shift
, int blue_shift
)
2205 if (!true_color_flag
) {
2206 /* Expose a reasonable default 256 color map */
2216 switch (bits_per_pixel
) {
2222 vnc_client_error(vs
);
2226 vs
->client_pf
.rmax
= red_max
? red_max
: 0xFF;
2227 vs
->client_pf
.rbits
= ctpopl(red_max
);
2228 vs
->client_pf
.rshift
= red_shift
;
2229 vs
->client_pf
.rmask
= red_max
<< red_shift
;
2230 vs
->client_pf
.gmax
= green_max
? green_max
: 0xFF;
2231 vs
->client_pf
.gbits
= ctpopl(green_max
);
2232 vs
->client_pf
.gshift
= green_shift
;
2233 vs
->client_pf
.gmask
= green_max
<< green_shift
;
2234 vs
->client_pf
.bmax
= blue_max
? blue_max
: 0xFF;
2235 vs
->client_pf
.bbits
= ctpopl(blue_max
);
2236 vs
->client_pf
.bshift
= blue_shift
;
2237 vs
->client_pf
.bmask
= blue_max
<< blue_shift
;
2238 vs
->client_pf
.bits_per_pixel
= bits_per_pixel
;
2239 vs
->client_pf
.bytes_per_pixel
= bits_per_pixel
/ 8;
2240 vs
->client_pf
.depth
= bits_per_pixel
== 32 ? 24 : bits_per_pixel
;
2241 vs
->client_be
= big_endian_flag
;
2243 if (!true_color_flag
) {
2247 set_pixel_conversion(vs
);
2249 graphic_hw_invalidate(vs
->vd
->dcl
.con
);
2250 graphic_hw_update(vs
->vd
->dcl
.con
);
2253 static void pixel_format_message (VncState
*vs
) {
2254 char pad
[3] = { 0, 0, 0 };
2256 vs
->client_pf
= qemu_default_pixelformat(32);
2258 vnc_write_u8(vs
, vs
->client_pf
.bits_per_pixel
); /* bits-per-pixel */
2259 vnc_write_u8(vs
, vs
->client_pf
.depth
); /* depth */
2261 #ifdef HOST_WORDS_BIGENDIAN
2262 vnc_write_u8(vs
, 1); /* big-endian-flag */
2264 vnc_write_u8(vs
, 0); /* big-endian-flag */
2266 vnc_write_u8(vs
, 1); /* true-color-flag */
2267 vnc_write_u16(vs
, vs
->client_pf
.rmax
); /* red-max */
2268 vnc_write_u16(vs
, vs
->client_pf
.gmax
); /* green-max */
2269 vnc_write_u16(vs
, vs
->client_pf
.bmax
); /* blue-max */
2270 vnc_write_u8(vs
, vs
->client_pf
.rshift
); /* red-shift */
2271 vnc_write_u8(vs
, vs
->client_pf
.gshift
); /* green-shift */
2272 vnc_write_u8(vs
, vs
->client_pf
.bshift
); /* blue-shift */
2273 vnc_write(vs
, pad
, 3); /* padding */
2275 vnc_hextile_set_pixel_conversion(vs
, 0);
2276 vs
->write_pixels
= vnc_write_pixels_copy
;
2279 static void vnc_colordepth(VncState
*vs
)
2281 if (vnc_has_feature(vs
, VNC_FEATURE_WMVI
)) {
2282 /* Sending a WMVi message to notify the client*/
2283 vnc_lock_output(vs
);
2284 vnc_write_u8(vs
, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE
);
2285 vnc_write_u8(vs
, 0);
2286 vnc_write_u16(vs
, 1); /* number of rects */
2287 vnc_framebuffer_update(vs
, 0, 0,
2288 pixman_image_get_width(vs
->vd
->server
),
2289 pixman_image_get_height(vs
->vd
->server
),
2291 pixel_format_message(vs
);
2292 vnc_unlock_output(vs
);
2295 set_pixel_conversion(vs
);
2299 static int protocol_client_msg(VncState
*vs
, uint8_t *data
, size_t len
)
2304 VncDisplay
*vd
= vs
->vd
;
2307 update_displaychangelistener(&vd
->dcl
, VNC_REFRESH_INTERVAL_BASE
);
2311 case VNC_MSG_CLIENT_SET_PIXEL_FORMAT
:
2315 set_pixel_format(vs
, read_u8(data
, 4),
2316 read_u8(data
, 6), read_u8(data
, 7),
2317 read_u16(data
, 8), read_u16(data
, 10),
2318 read_u16(data
, 12), read_u8(data
, 14),
2319 read_u8(data
, 15), read_u8(data
, 16));
2321 case VNC_MSG_CLIENT_SET_ENCODINGS
:
2326 limit
= read_u16(data
, 2);
2328 return 4 + (limit
* 4);
2330 limit
= read_u16(data
, 2);
2332 for (i
= 0; i
< limit
; i
++) {
2333 int32_t val
= read_s32(data
, 4 + (i
* 4));
2334 memcpy(data
+ 4 + (i
* 4), &val
, sizeof(val
));
2337 set_encodings(vs
, (int32_t *)(data
+ 4), limit
);
2339 case VNC_MSG_CLIENT_FRAMEBUFFER_UPDATE_REQUEST
:
2343 framebuffer_update_request(vs
,
2344 read_u8(data
, 1), read_u16(data
, 2), read_u16(data
, 4),
2345 read_u16(data
, 6), read_u16(data
, 8));
2347 case VNC_MSG_CLIENT_KEY_EVENT
:
2351 key_event(vs
, read_u8(data
, 1), read_u32(data
, 4));
2353 case VNC_MSG_CLIENT_POINTER_EVENT
:
2357 pointer_event(vs
, read_u8(data
, 1), read_u16(data
, 2), read_u16(data
, 4));
2359 case VNC_MSG_CLIENT_CUT_TEXT
:
2364 uint32_t dlen
= read_u32(data
, 4);
2365 if (dlen
> (1 << 20)) {
2366 error_report("vnc: client_cut_text msg payload has %u bytes"
2367 " which exceeds our limit of 1MB.", dlen
);
2368 vnc_client_error(vs
);
2376 client_cut_text(vs
, read_u32(data
, 4), data
+ 8);
2378 case VNC_MSG_CLIENT_QEMU
:
2382 switch (read_u8(data
, 1)) {
2383 case VNC_MSG_CLIENT_QEMU_EXT_KEY_EVENT
:
2387 ext_key_event(vs
, read_u16(data
, 2),
2388 read_u32(data
, 4), read_u32(data
, 8));
2390 case VNC_MSG_CLIENT_QEMU_AUDIO
:
2394 switch (read_u16 (data
, 2)) {
2395 case VNC_MSG_CLIENT_QEMU_AUDIO_ENABLE
:
2398 case VNC_MSG_CLIENT_QEMU_AUDIO_DISABLE
:
2401 case VNC_MSG_CLIENT_QEMU_AUDIO_SET_FORMAT
:
2404 switch (read_u8(data
, 4)) {
2405 case 0: vs
->as
.fmt
= AUD_FMT_U8
; break;
2406 case 1: vs
->as
.fmt
= AUD_FMT_S8
; break;
2407 case 2: vs
->as
.fmt
= AUD_FMT_U16
; break;
2408 case 3: vs
->as
.fmt
= AUD_FMT_S16
; break;
2409 case 4: vs
->as
.fmt
= AUD_FMT_U32
; break;
2410 case 5: vs
->as
.fmt
= AUD_FMT_S32
; break;
2412 VNC_DEBUG("Invalid audio format %d\n", read_u8(data
, 4));
2413 vnc_client_error(vs
);
2416 vs
->as
.nchannels
= read_u8(data
, 5);
2417 if (vs
->as
.nchannels
!= 1 && vs
->as
.nchannels
!= 2) {
2418 VNC_DEBUG("Invalid audio channel count %d\n",
2420 vnc_client_error(vs
);
2423 freq
= read_u32(data
, 6);
2424 /* No official limit for protocol, but 48khz is a sensible
2425 * upper bound for trustworthy clients, and this limit
2426 * protects calculations involving 'vs->as.freq' later.
2429 VNC_DEBUG("Invalid audio frequency %u > 48000", freq
);
2430 vnc_client_error(vs
);
2436 VNC_DEBUG("Invalid audio message %d\n", read_u8(data
, 4));
2437 vnc_client_error(vs
);
2443 VNC_DEBUG("Msg: %d\n", read_u16(data
, 0));
2444 vnc_client_error(vs
);
2449 VNC_DEBUG("Msg: %d\n", data
[0]);
2450 vnc_client_error(vs
);
2454 vnc_update_throttle_offset(vs
);
2455 vnc_read_when(vs
, protocol_client_msg
, 1);
2459 static int protocol_client_init(VncState
*vs
, uint8_t *data
, size_t len
)
2465 mode
= data
[0] ? VNC_SHARE_MODE_SHARED
: VNC_SHARE_MODE_EXCLUSIVE
;
2466 switch (vs
->vd
->share_policy
) {
2467 case VNC_SHARE_POLICY_IGNORE
:
2469 * Ignore the shared flag. Nothing to do here.
2471 * Doesn't conform to the rfb spec but is traditional qemu
2472 * behavior, thus left here as option for compatibility
2476 case VNC_SHARE_POLICY_ALLOW_EXCLUSIVE
:
2478 * Policy: Allow clients ask for exclusive access.
2480 * Implementation: When a client asks for exclusive access,
2481 * disconnect all others. Shared connects are allowed as long
2482 * as no exclusive connection exists.
2484 * This is how the rfb spec suggests to handle the shared flag.
2486 if (mode
== VNC_SHARE_MODE_EXCLUSIVE
) {
2488 QTAILQ_FOREACH(client
, &vs
->vd
->clients
, next
) {
2492 if (client
->share_mode
!= VNC_SHARE_MODE_EXCLUSIVE
&&
2493 client
->share_mode
!= VNC_SHARE_MODE_SHARED
) {
2496 vnc_disconnect_start(client
);
2499 if (mode
== VNC_SHARE_MODE_SHARED
) {
2500 if (vs
->vd
->num_exclusive
> 0) {
2501 vnc_disconnect_start(vs
);
2506 case VNC_SHARE_POLICY_FORCE_SHARED
:
2508 * Policy: Shared connects only.
2509 * Implementation: Disallow clients asking for exclusive access.
2511 * Useful for shared desktop sessions where you don't want
2512 * someone forgetting to say -shared when running the vnc
2513 * client disconnect everybody else.
2515 if (mode
== VNC_SHARE_MODE_EXCLUSIVE
) {
2516 vnc_disconnect_start(vs
);
2521 vnc_set_share_mode(vs
, mode
);
2523 if (vs
->vd
->num_shared
> vs
->vd
->connections_limit
) {
2524 vnc_disconnect_start(vs
);
2528 assert(pixman_image_get_width(vs
->vd
->server
) < 65536 &&
2529 pixman_image_get_width(vs
->vd
->server
) >= 0);
2530 assert(pixman_image_get_height(vs
->vd
->server
) < 65536 &&
2531 pixman_image_get_height(vs
->vd
->server
) >= 0);
2532 vs
->client_width
= pixman_image_get_width(vs
->vd
->server
);
2533 vs
->client_height
= pixman_image_get_height(vs
->vd
->server
);
2534 vnc_write_u16(vs
, vs
->client_width
);
2535 vnc_write_u16(vs
, vs
->client_height
);
2537 pixel_format_message(vs
);
2540 size
= snprintf(buf
, sizeof(buf
), "QEMU (%s)", qemu_name
);
2541 if (size
> sizeof(buf
)) {
2545 size
= snprintf(buf
, sizeof(buf
), "QEMU");
2548 vnc_write_u32(vs
, size
);
2549 vnc_write(vs
, buf
, size
);
2552 vnc_client_cache_auth(vs
);
2553 vnc_qmp_event(vs
, QAPI_EVENT_VNC_INITIALIZED
);
2555 vnc_read_when(vs
, protocol_client_msg
, 1);
2560 void start_client_init(VncState
*vs
)
2562 vnc_read_when(vs
, protocol_client_init
, 1);
2565 static void make_challenge(VncState
*vs
)
2569 srand(time(NULL
)+getpid()+getpid()*987654+rand());
2571 for (i
= 0 ; i
< sizeof(vs
->challenge
) ; i
++)
2572 vs
->challenge
[i
] = (int) (256.0*rand()/(RAND_MAX
+1.0));
2575 static int protocol_client_auth_vnc(VncState
*vs
, uint8_t *data
, size_t len
)
2577 unsigned char response
[VNC_AUTH_CHALLENGE_SIZE
];
2579 unsigned char key
[8];
2580 time_t now
= time(NULL
);
2581 QCryptoCipher
*cipher
= NULL
;
2584 if (!vs
->vd
->password
) {
2585 trace_vnc_auth_fail(vs
, vs
->auth
, "password is not set", "");
2588 if (vs
->vd
->expires
< now
) {
2589 trace_vnc_auth_fail(vs
, vs
->auth
, "password is expired", "");
2593 memcpy(response
, vs
->challenge
, VNC_AUTH_CHALLENGE_SIZE
);
2595 /* Calculate the expected challenge response */
2596 pwlen
= strlen(vs
->vd
->password
);
2597 for (i
=0; i
<sizeof(key
); i
++)
2598 key
[i
] = i
<pwlen
? vs
->vd
->password
[i
] : 0;
2600 cipher
= qcrypto_cipher_new(
2601 QCRYPTO_CIPHER_ALG_DES_RFB
,
2602 QCRYPTO_CIPHER_MODE_ECB
,
2603 key
, G_N_ELEMENTS(key
),
2606 trace_vnc_auth_fail(vs
, vs
->auth
, "cannot create cipher",
2607 error_get_pretty(err
));
2612 if (qcrypto_cipher_encrypt(cipher
,
2615 VNC_AUTH_CHALLENGE_SIZE
,
2617 trace_vnc_auth_fail(vs
, vs
->auth
, "cannot encrypt challenge response",
2618 error_get_pretty(err
));
2623 /* Compare expected vs actual challenge response */
2624 if (memcmp(response
, data
, VNC_AUTH_CHALLENGE_SIZE
) != 0) {
2625 trace_vnc_auth_fail(vs
, vs
->auth
, "mis-matched challenge response", "");
2628 trace_vnc_auth_pass(vs
, vs
->auth
);
2629 vnc_write_u32(vs
, 0); /* Accept auth */
2632 start_client_init(vs
);
2635 qcrypto_cipher_free(cipher
);
2639 vnc_write_u32(vs
, 1); /* Reject auth */
2640 if (vs
->minor
>= 8) {
2641 static const char err
[] = "Authentication failed";
2642 vnc_write_u32(vs
, sizeof(err
));
2643 vnc_write(vs
, err
, sizeof(err
));
2646 vnc_client_error(vs
);
2647 qcrypto_cipher_free(cipher
);
2651 void start_auth_vnc(VncState
*vs
)
2654 /* Send client a 'random' challenge */
2655 vnc_write(vs
, vs
->challenge
, sizeof(vs
->challenge
));
2658 vnc_read_when(vs
, protocol_client_auth_vnc
, sizeof(vs
->challenge
));
2662 static int protocol_client_auth(VncState
*vs
, uint8_t *data
, size_t len
)
2664 /* We only advertise 1 auth scheme at a time, so client
2665 * must pick the one we sent. Verify this */
2666 if (data
[0] != vs
->auth
) { /* Reject auth */
2667 trace_vnc_auth_reject(vs
, vs
->auth
, (int)data
[0]);
2668 vnc_write_u32(vs
, 1);
2669 if (vs
->minor
>= 8) {
2670 static const char err
[] = "Authentication failed";
2671 vnc_write_u32(vs
, sizeof(err
));
2672 vnc_write(vs
, err
, sizeof(err
));
2674 vnc_client_error(vs
);
2675 } else { /* Accept requested auth */
2676 trace_vnc_auth_start(vs
, vs
->auth
);
2679 if (vs
->minor
>= 8) {
2680 vnc_write_u32(vs
, 0); /* Accept auth completion */
2683 trace_vnc_auth_pass(vs
, vs
->auth
);
2684 start_client_init(vs
);
2691 case VNC_AUTH_VENCRYPT
:
2692 start_auth_vencrypt(vs
);
2695 #ifdef CONFIG_VNC_SASL
2697 start_auth_sasl(vs
);
2699 #endif /* CONFIG_VNC_SASL */
2701 default: /* Should not be possible, but just in case */
2702 trace_vnc_auth_fail(vs
, vs
->auth
, "Unhandled auth method", "");
2703 vnc_write_u8(vs
, 1);
2704 if (vs
->minor
>= 8) {
2705 static const char err
[] = "Authentication failed";
2706 vnc_write_u32(vs
, sizeof(err
));
2707 vnc_write(vs
, err
, sizeof(err
));
2709 vnc_client_error(vs
);
2715 static int protocol_version(VncState
*vs
, uint8_t *version
, size_t len
)
2719 memcpy(local
, version
, 12);
2722 if (sscanf(local
, "RFB %03d.%03d\n", &vs
->major
, &vs
->minor
) != 2) {
2723 VNC_DEBUG("Malformed protocol version %s\n", local
);
2724 vnc_client_error(vs
);
2727 VNC_DEBUG("Client request protocol version %d.%d\n", vs
->major
, vs
->minor
);
2728 if (vs
->major
!= 3 ||
2734 VNC_DEBUG("Unsupported client version\n");
2735 vnc_write_u32(vs
, VNC_AUTH_INVALID
);
2737 vnc_client_error(vs
);
2740 /* Some broken clients report v3.4 or v3.5, which spec requires to be treated
2741 * as equivalent to v3.3 by servers
2743 if (vs
->minor
== 4 || vs
->minor
== 5)
2746 if (vs
->minor
== 3) {
2747 trace_vnc_auth_start(vs
, vs
->auth
);
2748 if (vs
->auth
== VNC_AUTH_NONE
) {
2749 vnc_write_u32(vs
, vs
->auth
);
2751 trace_vnc_auth_pass(vs
, vs
->auth
);
2752 start_client_init(vs
);
2753 } else if (vs
->auth
== VNC_AUTH_VNC
) {
2754 VNC_DEBUG("Tell client VNC auth\n");
2755 vnc_write_u32(vs
, vs
->auth
);
2759 trace_vnc_auth_fail(vs
, vs
->auth
,
2760 "Unsupported auth method for v3.3", "");
2761 vnc_write_u32(vs
, VNC_AUTH_INVALID
);
2763 vnc_client_error(vs
);
2766 vnc_write_u8(vs
, 1); /* num auth */
2767 vnc_write_u8(vs
, vs
->auth
);
2768 vnc_read_when(vs
, protocol_client_auth
, 1);
2775 static VncRectStat
*vnc_stat_rect(VncDisplay
*vd
, int x
, int y
)
2777 struct VncSurface
*vs
= &vd
->guest
;
2779 return &vs
->stats
[y
/ VNC_STAT_RECT
][x
/ VNC_STAT_RECT
];
2782 void vnc_sent_lossy_rect(VncState
*vs
, int x
, int y
, int w
, int h
)
2786 w
= (x
+ w
) / VNC_STAT_RECT
;
2787 h
= (y
+ h
) / VNC_STAT_RECT
;
2791 for (j
= y
; j
<= h
; j
++) {
2792 for (i
= x
; i
<= w
; i
++) {
2793 vs
->lossy_rect
[j
][i
] = 1;
2798 static int vnc_refresh_lossy_rect(VncDisplay
*vd
, int x
, int y
)
2801 int sty
= y
/ VNC_STAT_RECT
;
2802 int stx
= x
/ VNC_STAT_RECT
;
2805 y
= QEMU_ALIGN_DOWN(y
, VNC_STAT_RECT
);
2806 x
= QEMU_ALIGN_DOWN(x
, VNC_STAT_RECT
);
2808 QTAILQ_FOREACH(vs
, &vd
->clients
, next
) {
2811 /* kernel send buffers are full -> refresh later */
2812 if (vs
->output
.offset
) {
2816 if (!vs
->lossy_rect
[sty
][stx
]) {
2820 vs
->lossy_rect
[sty
][stx
] = 0;
2821 for (j
= 0; j
< VNC_STAT_RECT
; ++j
) {
2822 bitmap_set(vs
->dirty
[y
+ j
],
2823 x
/ VNC_DIRTY_PIXELS_PER_BIT
,
2824 VNC_STAT_RECT
/ VNC_DIRTY_PIXELS_PER_BIT
);
2832 static int vnc_update_stats(VncDisplay
*vd
, struct timeval
* tv
)
2834 int width
= MIN(pixman_image_get_width(vd
->guest
.fb
),
2835 pixman_image_get_width(vd
->server
));
2836 int height
= MIN(pixman_image_get_height(vd
->guest
.fb
),
2837 pixman_image_get_height(vd
->server
));
2842 for (y
= 0; y
< height
; y
+= VNC_STAT_RECT
) {
2843 for (x
= 0; x
< width
; x
+= VNC_STAT_RECT
) {
2844 VncRectStat
*rect
= vnc_stat_rect(vd
, x
, y
);
2846 rect
->updated
= false;
2850 qemu_timersub(tv
, &VNC_REFRESH_STATS
, &res
);
2852 if (timercmp(&vd
->guest
.last_freq_check
, &res
, >)) {
2855 vd
->guest
.last_freq_check
= *tv
;
2857 for (y
= 0; y
< height
; y
+= VNC_STAT_RECT
) {
2858 for (x
= 0; x
< width
; x
+= VNC_STAT_RECT
) {
2859 VncRectStat
*rect
= vnc_stat_rect(vd
, x
, y
);
2860 int count
= ARRAY_SIZE(rect
->times
);
2861 struct timeval min
, max
;
2863 if (!timerisset(&rect
->times
[count
- 1])) {
2867 max
= rect
->times
[(rect
->idx
+ count
- 1) % count
];
2868 qemu_timersub(tv
, &max
, &res
);
2870 if (timercmp(&res
, &VNC_REFRESH_LOSSY
, >)) {
2872 has_dirty
+= vnc_refresh_lossy_rect(vd
, x
, y
);
2873 memset(rect
->times
, 0, sizeof (rect
->times
));
2877 min
= rect
->times
[rect
->idx
];
2878 max
= rect
->times
[(rect
->idx
+ count
- 1) % count
];
2879 qemu_timersub(&max
, &min
, &res
);
2881 rect
->freq
= res
.tv_sec
+ res
.tv_usec
/ 1000000.;
2882 rect
->freq
/= count
;
2883 rect
->freq
= 1. / rect
->freq
;
2889 double vnc_update_freq(VncState
*vs
, int x
, int y
, int w
, int h
)
2895 x
= QEMU_ALIGN_DOWN(x
, VNC_STAT_RECT
);
2896 y
= QEMU_ALIGN_DOWN(y
, VNC_STAT_RECT
);
2898 for (j
= y
; j
<= y
+ h
; j
+= VNC_STAT_RECT
) {
2899 for (i
= x
; i
<= x
+ w
; i
+= VNC_STAT_RECT
) {
2900 total
+= vnc_stat_rect(vs
->vd
, i
, j
)->freq
;
2912 static void vnc_rect_updated(VncDisplay
*vd
, int x
, int y
, struct timeval
* tv
)
2916 rect
= vnc_stat_rect(vd
, x
, y
);
2917 if (rect
->updated
) {
2920 rect
->times
[rect
->idx
] = *tv
;
2921 rect
->idx
= (rect
->idx
+ 1) % ARRAY_SIZE(rect
->times
);
2922 rect
->updated
= true;
2925 static int vnc_refresh_server_surface(VncDisplay
*vd
)
2927 int width
= MIN(pixman_image_get_width(vd
->guest
.fb
),
2928 pixman_image_get_width(vd
->server
));
2929 int height
= MIN(pixman_image_get_height(vd
->guest
.fb
),
2930 pixman_image_get_height(vd
->server
));
2931 int cmp_bytes
, server_stride
, line_bytes
, guest_ll
, guest_stride
, y
= 0;
2932 uint8_t *guest_row0
= NULL
, *server_row0
;
2935 pixman_image_t
*tmpbuf
= NULL
;
2937 struct timeval tv
= { 0, 0 };
2939 if (!vd
->non_adaptive
) {
2940 gettimeofday(&tv
, NULL
);
2941 has_dirty
= vnc_update_stats(vd
, &tv
);
2945 * Walk through the guest dirty map.
2946 * Check and copy modified bits from guest to server surface.
2947 * Update server dirty map.
2949 server_row0
= (uint8_t *)pixman_image_get_data(vd
->server
);
2950 server_stride
= guest_stride
= guest_ll
=
2951 pixman_image_get_stride(vd
->server
);
2952 cmp_bytes
= MIN(VNC_DIRTY_PIXELS_PER_BIT
* VNC_SERVER_FB_BYTES
,
2954 if (vd
->guest
.format
!= VNC_SERVER_FB_FORMAT
) {
2955 int width
= pixman_image_get_width(vd
->server
);
2956 tmpbuf
= qemu_pixman_linebuf_create(VNC_SERVER_FB_FORMAT
, width
);
2959 PIXMAN_FORMAT_BPP(pixman_image_get_format(vd
->guest
.fb
));
2960 guest_row0
= (uint8_t *)pixman_image_get_data(vd
->guest
.fb
);
2961 guest_stride
= pixman_image_get_stride(vd
->guest
.fb
);
2962 guest_ll
= pixman_image_get_width(vd
->guest
.fb
) * (DIV_ROUND_UP(guest_bpp
, 8));
2964 line_bytes
= MIN(server_stride
, guest_ll
);
2968 uint8_t *guest_ptr
, *server_ptr
;
2969 unsigned long offset
= find_next_bit((unsigned long *) &vd
->guest
.dirty
,
2970 height
* VNC_DIRTY_BPL(&vd
->guest
),
2971 y
* VNC_DIRTY_BPL(&vd
->guest
));
2972 if (offset
== height
* VNC_DIRTY_BPL(&vd
->guest
)) {
2973 /* no more dirty bits */
2976 y
= offset
/ VNC_DIRTY_BPL(&vd
->guest
);
2977 x
= offset
% VNC_DIRTY_BPL(&vd
->guest
);
2979 server_ptr
= server_row0
+ y
* server_stride
+ x
* cmp_bytes
;
2981 if (vd
->guest
.format
!= VNC_SERVER_FB_FORMAT
) {
2982 qemu_pixman_linebuf_fill(tmpbuf
, vd
->guest
.fb
, width
, 0, y
);
2983 guest_ptr
= (uint8_t *)pixman_image_get_data(tmpbuf
);
2985 guest_ptr
= guest_row0
+ y
* guest_stride
;
2987 guest_ptr
+= x
* cmp_bytes
;
2989 for (; x
< DIV_ROUND_UP(width
, VNC_DIRTY_PIXELS_PER_BIT
);
2990 x
++, guest_ptr
+= cmp_bytes
, server_ptr
+= cmp_bytes
) {
2991 int _cmp_bytes
= cmp_bytes
;
2992 if (!test_and_clear_bit(x
, vd
->guest
.dirty
[y
])) {
2995 if ((x
+ 1) * cmp_bytes
> line_bytes
) {
2996 _cmp_bytes
= line_bytes
- x
* cmp_bytes
;
2998 assert(_cmp_bytes
>= 0);
2999 if (memcmp(server_ptr
, guest_ptr
, _cmp_bytes
) == 0) {
3002 memcpy(server_ptr
, guest_ptr
, _cmp_bytes
);
3003 if (!vd
->non_adaptive
) {
3004 vnc_rect_updated(vd
, x
* VNC_DIRTY_PIXELS_PER_BIT
,
3007 QTAILQ_FOREACH(vs
, &vd
->clients
, next
) {
3008 set_bit(x
, vs
->dirty
[y
]);
3015 qemu_pixman_image_unref(tmpbuf
);
3019 static void vnc_refresh(DisplayChangeListener
*dcl
)
3021 VncDisplay
*vd
= container_of(dcl
, VncDisplay
, dcl
);
3023 int has_dirty
, rects
= 0;
3025 if (QTAILQ_EMPTY(&vd
->clients
)) {
3026 update_displaychangelistener(&vd
->dcl
, VNC_REFRESH_INTERVAL_MAX
);
3030 graphic_hw_update(vd
->dcl
.con
);
3032 if (vnc_trylock_display(vd
)) {
3033 update_displaychangelistener(&vd
->dcl
, VNC_REFRESH_INTERVAL_BASE
);
3037 has_dirty
= vnc_refresh_server_surface(vd
);
3038 vnc_unlock_display(vd
);
3040 QTAILQ_FOREACH_SAFE(vs
, &vd
->clients
, next
, vn
) {
3041 rects
+= vnc_update_client(vs
, has_dirty
);
3042 /* vs might be free()ed here */
3045 if (has_dirty
&& rects
) {
3046 vd
->dcl
.update_interval
/= 2;
3047 if (vd
->dcl
.update_interval
< VNC_REFRESH_INTERVAL_BASE
) {
3048 vd
->dcl
.update_interval
= VNC_REFRESH_INTERVAL_BASE
;
3051 vd
->dcl
.update_interval
+= VNC_REFRESH_INTERVAL_INC
;
3052 if (vd
->dcl
.update_interval
> VNC_REFRESH_INTERVAL_MAX
) {
3053 vd
->dcl
.update_interval
= VNC_REFRESH_INTERVAL_MAX
;
3058 static void vnc_connect(VncDisplay
*vd
, QIOChannelSocket
*sioc
,
3059 bool skipauth
, bool websocket
)
3061 VncState
*vs
= g_new0(VncState
, 1);
3062 bool first_client
= QTAILQ_EMPTY(&vd
->clients
);
3065 trace_vnc_client_connect(vs
, sioc
);
3067 object_ref(OBJECT(vs
->sioc
));
3068 vs
->ioc
= QIO_CHANNEL(sioc
);
3069 object_ref(OBJECT(vs
->ioc
));
3072 buffer_init(&vs
->input
, "vnc-input/%p", sioc
);
3073 buffer_init(&vs
->output
, "vnc-output/%p", sioc
);
3074 buffer_init(&vs
->jobs_buffer
, "vnc-jobs_buffer/%p", sioc
);
3076 buffer_init(&vs
->tight
.tight
, "vnc-tight/%p", sioc
);
3077 buffer_init(&vs
->tight
.zlib
, "vnc-tight-zlib/%p", sioc
);
3078 buffer_init(&vs
->tight
.gradient
, "vnc-tight-gradient/%p", sioc
);
3079 #ifdef CONFIG_VNC_JPEG
3080 buffer_init(&vs
->tight
.jpeg
, "vnc-tight-jpeg/%p", sioc
);
3082 #ifdef CONFIG_VNC_PNG
3083 buffer_init(&vs
->tight
.png
, "vnc-tight-png/%p", sioc
);
3085 buffer_init(&vs
->zlib
.zlib
, "vnc-zlib/%p", sioc
);
3086 buffer_init(&vs
->zrle
.zrle
, "vnc-zrle/%p", sioc
);
3087 buffer_init(&vs
->zrle
.fb
, "vnc-zrle-fb/%p", sioc
);
3088 buffer_init(&vs
->zrle
.zlib
, "vnc-zrle-zlib/%p", sioc
);
3091 vs
->auth
= VNC_AUTH_NONE
;
3092 vs
->subauth
= VNC_AUTH_INVALID
;
3095 vs
->auth
= vd
->ws_auth
;
3096 vs
->subauth
= VNC_AUTH_INVALID
;
3098 vs
->auth
= vd
->auth
;
3099 vs
->subauth
= vd
->subauth
;
3102 VNC_DEBUG("Client sioc=%p ws=%d auth=%d subauth=%d\n",
3103 sioc
, websocket
, vs
->auth
, vs
->subauth
);
3105 vs
->lossy_rect
= g_malloc0(VNC_STAT_ROWS
* sizeof (*vs
->lossy_rect
));
3106 for (i
= 0; i
< VNC_STAT_ROWS
; ++i
) {
3107 vs
->lossy_rect
[i
] = g_new0(uint8_t, VNC_STAT_COLS
);
3110 VNC_DEBUG("New client on socket %p\n", vs
->sioc
);
3111 update_displaychangelistener(&vd
->dcl
, VNC_REFRESH_INTERVAL_BASE
);
3112 qio_channel_set_blocking(vs
->ioc
, false, NULL
);
3114 g_source_remove(vs
->ioc_tag
);
3119 vs
->ioc_tag
= qio_channel_add_watch(
3120 vs
->ioc
, G_IO_IN
, vncws_tls_handshake_io
, vs
, NULL
);
3122 vs
->ioc_tag
= qio_channel_add_watch(
3123 vs
->ioc
, G_IO_IN
, vncws_handshake_io
, vs
, NULL
);
3126 vs
->ioc_tag
= qio_channel_add_watch(
3127 vs
->ioc
, G_IO_IN
, vnc_client_io
, vs
, NULL
);
3130 vnc_client_cache_addr(vs
);
3131 vnc_qmp_event(vs
, QAPI_EVENT_VNC_CONNECTED
);
3132 vnc_set_share_mode(vs
, VNC_SHARE_MODE_CONNECTING
);
3137 vs
->as
.freq
= 44100;
3138 vs
->as
.nchannels
= 2;
3139 vs
->as
.fmt
= AUD_FMT_S16
;
3140 vs
->as
.endianness
= 0;
3142 qemu_mutex_init(&vs
->output_mutex
);
3143 vs
->bh
= qemu_bh_new(vnc_jobs_bh
, vs
);
3145 QTAILQ_INSERT_TAIL(&vd
->clients
, vs
, next
);
3147 vnc_update_server_surface(vd
);
3150 graphic_hw_update(vd
->dcl
.con
);
3152 if (!vs
->websocket
) {
3153 vnc_start_protocol(vs
);
3156 if (vd
->num_connecting
> vd
->connections_limit
) {
3157 QTAILQ_FOREACH(vs
, &vd
->clients
, next
) {
3158 if (vs
->share_mode
== VNC_SHARE_MODE_CONNECTING
) {
3159 vnc_disconnect_start(vs
);
3166 void vnc_start_protocol(VncState
*vs
)
3168 vnc_write(vs
, "RFB 003.008\n", 12);
3170 vnc_read_when(vs
, protocol_version
, 12);
3172 vs
->mouse_mode_notifier
.notify
= check_pointer_type_change
;
3173 qemu_add_mouse_mode_change_notifier(&vs
->mouse_mode_notifier
);
3176 static void vnc_listen_io(QIONetListener
*listener
,
3177 QIOChannelSocket
*cioc
,
3180 VncDisplay
*vd
= opaque
;
3181 bool isWebsock
= listener
== vd
->wslistener
;
3183 qio_channel_set_name(QIO_CHANNEL(cioc
),
3184 isWebsock
? "vnc-ws-server" : "vnc-server");
3185 qio_channel_set_delay(QIO_CHANNEL(cioc
), false);
3186 vnc_connect(vd
, cioc
, false, isWebsock
);
3189 static const DisplayChangeListenerOps dcl_ops
= {
3191 .dpy_refresh
= vnc_refresh
,
3192 .dpy_gfx_update
= vnc_dpy_update
,
3193 .dpy_gfx_switch
= vnc_dpy_switch
,
3194 .dpy_gfx_check_format
= qemu_pixman_check_format
,
3195 .dpy_mouse_set
= vnc_mouse_set
,
3196 .dpy_cursor_define
= vnc_dpy_cursor_define
,
3199 void vnc_display_init(const char *id
)
3203 if (vnc_display_find(id
) != NULL
) {
3206 vd
= g_malloc0(sizeof(*vd
));
3208 vd
->id
= strdup(id
);
3209 QTAILQ_INSERT_TAIL(&vnc_displays
, vd
, next
);
3211 QTAILQ_INIT(&vd
->clients
);
3212 vd
->expires
= TIME_MAX
;
3214 if (keyboard_layout
) {
3215 trace_vnc_key_map_init(keyboard_layout
);
3216 vd
->kbd_layout
= init_keyboard_layout(name2keysym
, keyboard_layout
);
3218 vd
->kbd_layout
= init_keyboard_layout(name2keysym
, "en-us");
3221 if (!vd
->kbd_layout
) {
3225 vd
->share_policy
= VNC_SHARE_POLICY_ALLOW_EXCLUSIVE
;
3226 vd
->connections_limit
= 32;
3228 qemu_mutex_init(&vd
->mutex
);
3229 vnc_start_worker_thread();
3231 vd
->dcl
.ops
= &dcl_ops
;
3232 register_displaychangelistener(&vd
->dcl
);
3236 static void vnc_display_close(VncDisplay
*vd
)
3241 vd
->is_unix
= false;
3244 qio_net_listener_disconnect(vd
->listener
);
3245 object_unref(OBJECT(vd
->listener
));
3247 vd
->listener
= NULL
;
3249 if (vd
->wslistener
) {
3250 qio_net_listener_disconnect(vd
->wslistener
);
3251 object_unref(OBJECT(vd
->wslistener
));
3253 vd
->wslistener
= NULL
;
3255 vd
->auth
= VNC_AUTH_INVALID
;
3256 vd
->subauth
= VNC_AUTH_INVALID
;
3258 object_unparent(OBJECT(vd
->tlscreds
));
3259 vd
->tlscreds
= NULL
;
3261 g_free(vd
->tlsaclname
);
3262 vd
->tlsaclname
= NULL
;
3263 if (vd
->lock_key_sync
) {
3264 qemu_remove_led_event_handler(vd
->led
);
3269 int vnc_display_password(const char *id
, const char *password
)
3271 VncDisplay
*vd
= vnc_display_find(id
);
3276 if (vd
->auth
== VNC_AUTH_NONE
) {
3277 error_printf_unless_qmp("If you want use passwords please enable "
3278 "password auth using '-vnc ${dpy},password'.\n");
3282 g_free(vd
->password
);
3283 vd
->password
= g_strdup(password
);
3288 int vnc_display_pw_expire(const char *id
, time_t expires
)
3290 VncDisplay
*vd
= vnc_display_find(id
);
3296 vd
->expires
= expires
;
3300 static void vnc_display_print_local_addr(VncDisplay
*vd
)
3302 SocketAddress
*addr
;
3305 if (!vd
->listener
|| !vd
->listener
->nsioc
) {
3309 addr
= qio_channel_socket_get_local_address(vd
->listener
->sioc
[0], &err
);
3314 if (addr
->type
!= SOCKET_ADDRESS_TYPE_INET
) {
3315 qapi_free_SocketAddress(addr
);
3318 error_printf_unless_qmp("VNC server running on %s:%s\n",
3321 qapi_free_SocketAddress(addr
);
3324 static QemuOptsList qemu_vnc_opts
= {
3326 .head
= QTAILQ_HEAD_INITIALIZER(qemu_vnc_opts
.head
),
3327 .implied_opt_name
= "vnc",
3331 .type
= QEMU_OPT_STRING
,
3333 .name
= "websocket",
3334 .type
= QEMU_OPT_STRING
,
3336 .name
= "tls-creds",
3337 .type
= QEMU_OPT_STRING
,
3339 /* Deprecated in favour of tls-creds */
3341 .type
= QEMU_OPT_STRING
,
3344 .type
= QEMU_OPT_STRING
,
3347 .type
= QEMU_OPT_STRING
,
3350 .type
= QEMU_OPT_NUMBER
,
3352 .name
= "connections",
3353 .type
= QEMU_OPT_NUMBER
,
3356 .type
= QEMU_OPT_NUMBER
,
3359 .type
= QEMU_OPT_BOOL
,
3362 .type
= QEMU_OPT_BOOL
,
3365 .type
= QEMU_OPT_BOOL
,
3368 .type
= QEMU_OPT_BOOL
,
3370 .name
= "lock-key-sync",
3371 .type
= QEMU_OPT_BOOL
,
3373 .name
= "key-delay-ms",
3374 .type
= QEMU_OPT_NUMBER
,
3377 .type
= QEMU_OPT_BOOL
,
3379 /* Deprecated in favour of tls-creds */
3381 .type
= QEMU_OPT_BOOL
,
3383 /* Deprecated in favour of tls-creds */
3384 .name
= "x509verify",
3385 .type
= QEMU_OPT_STRING
,
3388 .type
= QEMU_OPT_BOOL
,
3391 .type
= QEMU_OPT_BOOL
,
3393 .name
= "non-adaptive",
3394 .type
= QEMU_OPT_BOOL
,
3396 { /* end of list */ }
3402 vnc_display_setup_auth(int *auth
,
3404 QCryptoTLSCreds
*tlscreds
,
3411 * We have a choice of 3 authentication options
3417 * The channel can be run in 2 modes
3422 * And TLS can use 2 types of credentials
3427 * We thus have 9 possible logical combinations
3432 * 4. tls + anon + none
3433 * 5. tls + anon + vnc
3434 * 6. tls + anon + sasl
3435 * 7. tls + x509 + none
3436 * 8. tls + x509 + vnc
3437 * 9. tls + x509 + sasl
3439 * These need to be mapped into the VNC auth schemes
3440 * in an appropriate manner. In regular VNC, all the
3441 * TLS options get mapped into VNC_AUTH_VENCRYPT
3444 * In websockets, the https:// protocol already provides
3445 * TLS support, so there is no need to make use of the
3446 * VeNCrypt extension. Furthermore, websockets browser
3447 * clients could not use VeNCrypt even if they wanted to,
3448 * as they cannot control when the TLS handshake takes
3449 * place. Thus there is no option but to rely on https://,
3450 * meaning combinations 4->6 and 7->9 will be mapped to
3451 * VNC auth schemes in the same way as combos 1->3.
3453 * Regardless of fact that we have a different mapping to
3454 * VNC auth mechs for plain VNC vs websockets VNC, the end
3455 * result has the same security characteristics.
3457 if (websocket
|| !tlscreds
) {
3459 VNC_DEBUG("Initializing VNC server with password auth\n");
3460 *auth
= VNC_AUTH_VNC
;
3462 VNC_DEBUG("Initializing VNC server with SASL auth\n");
3463 *auth
= VNC_AUTH_SASL
;
3465 VNC_DEBUG("Initializing VNC server with no auth\n");
3466 *auth
= VNC_AUTH_NONE
;
3468 *subauth
= VNC_AUTH_INVALID
;
3470 bool is_x509
= object_dynamic_cast(OBJECT(tlscreds
),
3471 TYPE_QCRYPTO_TLS_CREDS_X509
) != NULL
;
3472 bool is_anon
= object_dynamic_cast(OBJECT(tlscreds
),
3473 TYPE_QCRYPTO_TLS_CREDS_ANON
) != NULL
;
3475 if (!is_x509
&& !is_anon
) {
3477 "Unsupported TLS cred type %s",
3478 object_get_typename(OBJECT(tlscreds
)));
3481 *auth
= VNC_AUTH_VENCRYPT
;
3484 VNC_DEBUG("Initializing VNC server with x509 password auth\n");
3485 *subauth
= VNC_AUTH_VENCRYPT_X509VNC
;
3487 VNC_DEBUG("Initializing VNC server with TLS password auth\n");
3488 *subauth
= VNC_AUTH_VENCRYPT_TLSVNC
;
3493 VNC_DEBUG("Initializing VNC server with x509 SASL auth\n");
3494 *subauth
= VNC_AUTH_VENCRYPT_X509SASL
;
3496 VNC_DEBUG("Initializing VNC server with TLS SASL auth\n");
3497 *subauth
= VNC_AUTH_VENCRYPT_TLSSASL
;
3501 VNC_DEBUG("Initializing VNC server with x509 no auth\n");
3502 *subauth
= VNC_AUTH_VENCRYPT_X509NONE
;
3504 VNC_DEBUG("Initializing VNC server with TLS no auth\n");
3505 *subauth
= VNC_AUTH_VENCRYPT_TLSNONE
;
3514 * Handle back compat with old CLI syntax by creating some
3515 * suitable QCryptoTLSCreds objects
3517 static QCryptoTLSCreds
*
3518 vnc_display_create_creds(bool x509
,
3524 gchar
*credsid
= g_strdup_printf("tlsvnc%s", id
);
3525 Object
*parent
= object_get_objects_root();
3530 creds
= object_new_with_props(TYPE_QCRYPTO_TLS_CREDS_X509
,
3534 "endpoint", "server",
3536 "verify-peer", x509verify
? "yes" : "no",
3539 creds
= object_new_with_props(TYPE_QCRYPTO_TLS_CREDS_ANON
,
3543 "endpoint", "server",
3550 error_propagate(errp
, err
);
3554 return QCRYPTO_TLS_CREDS(creds
);
3558 static int vnc_display_get_address(const char *addrstr
,
3567 SocketAddress
**retaddr
,
3571 SocketAddress
*addr
= NULL
;
3573 addr
= g_new0(SocketAddress
, 1);
3575 if (strncmp(addrstr
, "unix:", 5) == 0) {
3576 addr
->type
= SOCKET_ADDRESS_TYPE_UNIX
;
3577 addr
->u
.q_unix
.path
= g_strdup(addrstr
+ 5);
3580 error_setg(errp
, "UNIX sockets not supported with websock");
3585 error_setg(errp
, "Port range not support with UNIX socket");
3592 unsigned long long baseport
= 0;
3593 InetSocketAddress
*inet
;
3595 port
= strrchr(addrstr
, ':');
3601 error_setg(errp
, "no vnc port specified");
3605 hostlen
= port
- addrstr
;
3607 if (*port
== '\0') {
3608 error_setg(errp
, "vnc port cannot be empty");
3613 addr
->type
= SOCKET_ADDRESS_TYPE_INET
;
3614 inet
= &addr
->u
.inet
;
3615 if (addrstr
[0] == '[' && addrstr
[hostlen
- 1] == ']') {
3616 inet
->host
= g_strndup(addrstr
+ 1, hostlen
- 2);
3618 inet
->host
= g_strndup(addrstr
, hostlen
);
3620 /* plain VNC port is just an offset, for websocket
3621 * port is absolute */
3623 if (g_str_equal(addrstr
, "") ||
3624 g_str_equal(addrstr
, "on")) {
3625 if (displaynum
== -1) {
3626 error_setg(errp
, "explicit websocket port is required");
3629 inet
->port
= g_strdup_printf(
3630 "%d", displaynum
+ 5700);
3632 inet
->has_to
= true;
3633 inet
->to
= to
+ 5700;
3636 inet
->port
= g_strdup(port
);
3639 int offset
= reverse
? 0 : 5900;
3640 if (parse_uint_full(port
, &baseport
, 10) < 0) {
3641 error_setg(errp
, "can't convert to a number: %s", port
);
3644 if (baseport
> 65535 ||
3645 baseport
+ offset
> 65535) {
3646 error_setg(errp
, "port %s out of range", port
);
3649 inet
->port
= g_strdup_printf(
3650 "%d", (int)baseport
+ offset
);
3653 inet
->has_to
= true;
3654 inet
->to
= to
+ offset
;
3659 inet
->has_ipv4
= has_ipv4
;
3661 inet
->has_ipv6
= has_ipv6
;
3670 qapi_free_SocketAddress(addr
);
3675 static void vnc_free_addresses(SocketAddress
***retsaddr
,
3680 for (i
= 0; i
< *retnsaddr
; i
++) {
3681 qapi_free_SocketAddress((*retsaddr
)[i
]);
3689 static int vnc_display_get_addresses(QemuOpts
*opts
,
3691 SocketAddress
***retsaddr
,
3693 SocketAddress
***retwsaddr
,
3697 SocketAddress
*saddr
= NULL
;
3698 SocketAddress
*wsaddr
= NULL
;
3699 QemuOptsIter addriter
;
3701 int to
= qemu_opt_get_number(opts
, "to", 0);
3702 bool has_ipv4
= qemu_opt_get(opts
, "ipv4");
3703 bool has_ipv6
= qemu_opt_get(opts
, "ipv6");
3704 bool ipv4
= qemu_opt_get_bool(opts
, "ipv4", false);
3705 bool ipv6
= qemu_opt_get_bool(opts
, "ipv6", false);
3706 int displaynum
= -1;
3714 addr
= qemu_opt_get(opts
, "vnc");
3715 if (addr
== NULL
|| g_str_equal(addr
, "none")) {
3719 if (qemu_opt_get(opts
, "websocket") &&
3720 !qcrypto_hash_supports(QCRYPTO_HASH_ALG_SHA1
)) {
3722 "SHA1 hash support is required for websockets");
3726 qemu_opt_iter_init(&addriter
, opts
, "vnc");
3727 while ((addr
= qemu_opt_iter_next(&addriter
)) != NULL
) {
3729 rv
= vnc_display_get_address(addr
, false, reverse
, 0, to
,
3736 /* Historical compat - first listen address can be used
3737 * to set the default websocket port
3739 if (displaynum
== -1) {
3742 *retsaddr
= g_renew(SocketAddress
*, *retsaddr
, *retnsaddr
+ 1);
3743 (*retsaddr
)[(*retnsaddr
)++] = saddr
;
3746 /* If we had multiple primary displays, we don't do defaults
3747 * for websocket, and require explicit config instead. */
3748 if (*retnsaddr
> 1) {
3752 qemu_opt_iter_init(&addriter
, opts
, "websocket");
3753 while ((addr
= qemu_opt_iter_next(&addriter
)) != NULL
) {
3754 if (vnc_display_get_address(addr
, true, reverse
, displaynum
, to
,
3757 &wsaddr
, errp
) < 0) {
3761 /* Historical compat - if only a single listen address was
3762 * provided, then this is used to set the default listen
3763 * address for websocket too
3765 if (*retnsaddr
== 1 &&
3766 (*retsaddr
)[0]->type
== SOCKET_ADDRESS_TYPE_INET
&&
3767 wsaddr
->type
== SOCKET_ADDRESS_TYPE_INET
&&
3768 g_str_equal(wsaddr
->u
.inet
.host
, "") &&
3769 !g_str_equal((*retsaddr
)[0]->u
.inet
.host
, "")) {
3770 g_free(wsaddr
->u
.inet
.host
);
3771 wsaddr
->u
.inet
.host
= g_strdup((*retsaddr
)[0]->u
.inet
.host
);
3774 *retwsaddr
= g_renew(SocketAddress
*, *retwsaddr
, *retnwsaddr
+ 1);
3775 (*retwsaddr
)[(*retnwsaddr
)++] = wsaddr
;
3781 vnc_free_addresses(retsaddr
, retnsaddr
);
3782 vnc_free_addresses(retwsaddr
, retnwsaddr
);
3787 static int vnc_display_connect(VncDisplay
*vd
,
3788 SocketAddress
**saddr
,
3790 SocketAddress
**wsaddr
,
3794 /* connect to viewer */
3795 QIOChannelSocket
*sioc
= NULL
;
3797 error_setg(errp
, "Cannot use websockets in reverse mode");
3801 error_setg(errp
, "Expected a single address in reverse mode");
3804 /* TODO SOCKET_ADDRESS_TYPE_FD when fd has AF_UNIX */
3805 vd
->is_unix
= saddr
[0]->type
== SOCKET_ADDRESS_TYPE_UNIX
;
3806 sioc
= qio_channel_socket_new();
3807 qio_channel_set_name(QIO_CHANNEL(sioc
), "vnc-reverse");
3808 if (qio_channel_socket_connect_sync(sioc
, saddr
[0], errp
) < 0) {
3811 vnc_connect(vd
, sioc
, false, false);
3812 object_unref(OBJECT(sioc
));
3817 static int vnc_display_listen(VncDisplay
*vd
,
3818 SocketAddress
**saddr
,
3820 SocketAddress
**wsaddr
,
3827 vd
->listener
= qio_net_listener_new();
3828 qio_net_listener_set_name(vd
->listener
, "vnc-listen");
3829 for (i
= 0; i
< nsaddr
; i
++) {
3830 if (qio_net_listener_open_sync(vd
->listener
,
3837 qio_net_listener_set_client_func(vd
->listener
,
3838 vnc_listen_io
, vd
, NULL
);
3842 vd
->wslistener
= qio_net_listener_new();
3843 qio_net_listener_set_name(vd
->wslistener
, "vnc-ws-listen");
3844 for (i
= 0; i
< nwsaddr
; i
++) {
3845 if (qio_net_listener_open_sync(vd
->wslistener
,
3852 qio_net_listener_set_client_func(vd
->wslistener
,
3853 vnc_listen_io
, vd
, NULL
);
3860 void vnc_display_open(const char *id
, Error
**errp
)
3862 VncDisplay
*vd
= vnc_display_find(id
);
3863 QemuOpts
*opts
= qemu_opts_find(&qemu_vnc_opts
, id
);
3864 SocketAddress
**saddr
= NULL
, **wsaddr
= NULL
;
3865 size_t nsaddr
, nwsaddr
;
3866 const char *share
, *device_id
;
3868 bool password
= false;
3869 bool reverse
= false;
3872 #ifdef CONFIG_VNC_SASL
3876 int lock_key_sync
= 1;
3880 error_setg(errp
, "VNC display not active");
3883 vnc_display_close(vd
);
3889 reverse
= qemu_opt_get_bool(opts
, "reverse", false);
3890 if (vnc_display_get_addresses(opts
, reverse
, &saddr
, &nsaddr
,
3891 &wsaddr
, &nwsaddr
, errp
) < 0) {
3895 password
= qemu_opt_get_bool(opts
, "password", false);
3897 if (fips_get_state()) {
3899 "VNC password auth disabled due to FIPS mode, "
3900 "consider using the VeNCrypt or SASL authentication "
3901 "methods as an alternative");
3904 if (!qcrypto_cipher_supports(
3905 QCRYPTO_CIPHER_ALG_DES_RFB
, QCRYPTO_CIPHER_MODE_ECB
)) {
3907 "Cipher backend does not support DES RFB algorithm");
3912 lock_key_sync
= qemu_opt_get_bool(opts
, "lock-key-sync", true);
3913 key_delay_ms
= qemu_opt_get_number(opts
, "key-delay-ms", 10);
3914 sasl
= qemu_opt_get_bool(opts
, "sasl", false);
3915 #ifndef CONFIG_VNC_SASL
3917 error_setg(errp
, "VNC SASL auth requires cyrus-sasl support");
3920 #endif /* CONFIG_VNC_SASL */
3921 credid
= qemu_opt_get(opts
, "tls-creds");
3924 if (qemu_opt_get(opts
, "tls") ||
3925 qemu_opt_get(opts
, "x509") ||
3926 qemu_opt_get(opts
, "x509verify")) {
3928 "'tls-creds' parameter is mutually exclusive with "
3929 "'tls', 'x509' and 'x509verify' parameters");
3933 creds
= object_resolve_path_component(
3934 object_get_objects_root(), credid
);
3936 error_setg(errp
, "No TLS credentials with id '%s'",
3940 vd
->tlscreds
= (QCryptoTLSCreds
*)
3941 object_dynamic_cast(creds
,
3942 TYPE_QCRYPTO_TLS_CREDS
);
3943 if (!vd
->tlscreds
) {
3944 error_setg(errp
, "Object with id '%s' is not TLS credentials",
3948 object_ref(OBJECT(vd
->tlscreds
));
3950 if (vd
->tlscreds
->endpoint
!= QCRYPTO_TLS_CREDS_ENDPOINT_SERVER
) {
3952 "Expecting TLS credentials with a server endpoint");
3957 bool tls
= false, x509
= false, x509verify
= false;
3958 tls
= qemu_opt_get_bool(opts
, "tls", false);
3960 path
= qemu_opt_get(opts
, "x509");
3965 path
= qemu_opt_get(opts
, "x509verify");
3971 vd
->tlscreds
= vnc_display_create_creds(x509
,
3976 if (!vd
->tlscreds
) {
3981 acl
= qemu_opt_get_bool(opts
, "acl", false);
3983 share
= qemu_opt_get(opts
, "share");
3985 if (strcmp(share
, "ignore") == 0) {
3986 vd
->share_policy
= VNC_SHARE_POLICY_IGNORE
;
3987 } else if (strcmp(share
, "allow-exclusive") == 0) {
3988 vd
->share_policy
= VNC_SHARE_POLICY_ALLOW_EXCLUSIVE
;
3989 } else if (strcmp(share
, "force-shared") == 0) {
3990 vd
->share_policy
= VNC_SHARE_POLICY_FORCE_SHARED
;
3992 error_setg(errp
, "unknown vnc share= option");
3996 vd
->share_policy
= VNC_SHARE_POLICY_ALLOW_EXCLUSIVE
;
3998 vd
->connections_limit
= qemu_opt_get_number(opts
, "connections", 32);
4000 #ifdef CONFIG_VNC_JPEG
4001 vd
->lossy
= qemu_opt_get_bool(opts
, "lossy", false);
4003 vd
->non_adaptive
= qemu_opt_get_bool(opts
, "non-adaptive", false);
4004 /* adaptive updates are only used with tight encoding and
4005 * if lossy updates are enabled so we can disable all the
4006 * calculations otherwise */
4008 vd
->non_adaptive
= true;
4012 if (strcmp(vd
->id
, "default") == 0) {
4013 vd
->tlsaclname
= g_strdup("vnc.x509dname");
4015 vd
->tlsaclname
= g_strdup_printf("vnc.%s.x509dname", vd
->id
);
4017 qemu_acl_init(vd
->tlsaclname
);
4019 #ifdef CONFIG_VNC_SASL
4023 if (strcmp(vd
->id
, "default") == 0) {
4024 aclname
= g_strdup("vnc.username");
4026 aclname
= g_strdup_printf("vnc.%s.username", vd
->id
);
4028 vd
->sasl
.acl
= qemu_acl_init(aclname
);
4033 if (vnc_display_setup_auth(&vd
->auth
, &vd
->subauth
,
4034 vd
->tlscreds
, password
,
4035 sasl
, false, errp
) < 0) {
4038 trace_vnc_auth_init(vd
, 0, vd
->auth
, vd
->subauth
);
4040 if (vnc_display_setup_auth(&vd
->ws_auth
, &vd
->ws_subauth
,
4041 vd
->tlscreds
, password
,
4042 sasl
, true, errp
) < 0) {
4045 trace_vnc_auth_init(vd
, 1, vd
->ws_auth
, vd
->ws_subauth
);
4047 #ifdef CONFIG_VNC_SASL
4048 if ((saslErr
= sasl_server_init(NULL
, "qemu")) != SASL_OK
) {
4049 error_setg(errp
, "Failed to initialize SASL auth: %s",
4050 sasl_errstring(saslErr
, NULL
, NULL
));
4054 vd
->lock_key_sync
= lock_key_sync
;
4055 if (lock_key_sync
) {
4056 vd
->led
= qemu_add_led_event_handler(kbd_leds
, vd
);
4059 vd
->key_delay_ms
= key_delay_ms
;
4061 device_id
= qemu_opt_get(opts
, "display");
4063 int head
= qemu_opt_get_number(opts
, "head", 0);
4066 con
= qemu_console_lookup_by_device_name(device_id
, head
, &err
);
4068 error_propagate(errp
, err
);
4075 if (con
!= vd
->dcl
.con
) {
4076 unregister_displaychangelistener(&vd
->dcl
);
4078 register_displaychangelistener(&vd
->dcl
);
4081 if (saddr
== NULL
) {
4086 if (vnc_display_connect(vd
, saddr
, nsaddr
, wsaddr
, nwsaddr
, errp
) < 0) {
4090 if (vnc_display_listen(vd
, saddr
, nsaddr
, wsaddr
, nwsaddr
, errp
) < 0) {
4095 if (qemu_opt_get(opts
, "to")) {
4096 vnc_display_print_local_addr(vd
);
4100 vnc_free_addresses(&saddr
, &nsaddr
);
4101 vnc_free_addresses(&wsaddr
, &nwsaddr
);
4105 vnc_display_close(vd
);
4109 void vnc_display_add_client(const char *id
, int csock
, bool skipauth
)
4111 VncDisplay
*vd
= vnc_display_find(id
);
4112 QIOChannelSocket
*sioc
;
4118 sioc
= qio_channel_socket_new_fd(csock
, NULL
);
4120 qio_channel_set_name(QIO_CHANNEL(sioc
), "vnc-server");
4121 vnc_connect(vd
, sioc
, skipauth
, false);
4122 object_unref(OBJECT(sioc
));
4126 static void vnc_auto_assign_id(QemuOptsList
*olist
, QemuOpts
*opts
)
4131 id
= g_strdup("default");
4132 while (qemu_opts_find(olist
, id
)) {
4134 id
= g_strdup_printf("vnc%d", i
++);
4136 qemu_opts_set_id(opts
, id
);
4139 QemuOpts
*vnc_parse(const char *str
, Error
**errp
)
4141 QemuOptsList
*olist
= qemu_find_opts("vnc");
4142 QemuOpts
*opts
= qemu_opts_parse(olist
, str
, true, errp
);
4149 id
= qemu_opts_id(opts
);
4151 /* auto-assign id if not present */
4152 vnc_auto_assign_id(olist
, opts
);
4157 int vnc_init_func(void *opaque
, QemuOpts
*opts
, Error
**errp
)
4159 Error
*local_err
= NULL
;
4160 char *id
= (char *)qemu_opts_id(opts
);
4163 vnc_display_init(id
);
4164 vnc_display_open(id
, &local_err
);
4165 if (local_err
!= NULL
) {
4166 error_reportf_err(local_err
, "Failed to start VNC server: ");
4172 static void vnc_register_config(void)
4174 qemu_add_opts(&qemu_vnc_opts
);
4176 opts_init(vnc_register_config
);