1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#ifndef __QEMU_VNC_H
28#define __QEMU_VNC_H
29
30#include "qemu-common.h"
31#include "qemu/queue.h"
32#include "qemu/thread.h"
33#include "ui/console.h"
34#include "audio/audio.h"
35#include "qemu/bitmap.h"
36#include <zlib.h>
37#include <stdbool.h>
38
39#include "keymaps.h"
40#include "vnc-palette.h"
41#include "vnc-enc-zrle.h"
42#include "qapi-types.h"
43
44
45
46#ifdef _VNC_DEBUG
47#define VNC_DEBUG(fmt, ...) do { fprintf(stderr, fmt, ## __VA_ARGS__); } while (0)
48#else
49#define VNC_DEBUG(fmt, ...) do { } while (0)
50#endif
51
52
53
54
55
56
57
58typedef struct Buffer
59{
60 size_t capacity;
61 size_t offset;
62 uint8_t *buffer;
63} Buffer;
64
65typedef struct VncState VncState;
66typedef struct VncJob VncJob;
67typedef struct VncRect VncRect;
68typedef struct VncRectEntry VncRectEntry;
69
70typedef int VncReadEvent(VncState *vs, uint8_t *data, size_t len);
71
72typedef void VncWritePixels(VncState *vs, void *data, int size);
73
74typedef void VncSendHextileTile(VncState *vs,
75 int x, int y, int w, int h,
76 void *last_bg,
77 void *last_fg,
78 int *has_bg, int *has_fg);
79
80
81
82#define VNC_DIRTY_PIXELS_PER_BIT 16
83
84
85
86#define VNC_MAX_WIDTH ROUND_UP(2560, VNC_DIRTY_PIXELS_PER_BIT)
87#define VNC_MAX_HEIGHT 2048
88
89
90#define VNC_DIRTY_BITS (VNC_MAX_WIDTH / VNC_DIRTY_PIXELS_PER_BIT)
91
92
93
94#define VNC_DIRTY_BPL(x) (sizeof((x)->dirty) / VNC_MAX_HEIGHT * BITS_PER_BYTE)
95
96#define VNC_STAT_RECT 64
97#define VNC_STAT_COLS (VNC_MAX_WIDTH / VNC_STAT_RECT)
98#define VNC_STAT_ROWS (VNC_MAX_HEIGHT / VNC_STAT_RECT)
99
100#define VNC_AUTH_CHALLENGE_SIZE 16
101
102typedef struct VncDisplay VncDisplay;
103
104#ifdef CONFIG_VNC_TLS
105#include "vnc-tls.h"
106#include "vnc-auth-vencrypt.h"
107#endif
108#ifdef CONFIG_VNC_SASL
109#include "vnc-auth-sasl.h"
110#endif
111#ifdef CONFIG_VNC_WS
112#include "vnc-ws.h"
113#endif
114
115struct VncRectStat
116{
117
118 struct timeval times[10];
119 int idx;
120
121 double freq;
122 bool updated;
123};
124
125typedef struct VncRectStat VncRectStat;
126
127struct VncSurface
128{
129 struct timeval last_freq_check;
130 DECLARE_BITMAP(dirty[VNC_MAX_HEIGHT],
131 VNC_MAX_WIDTH / VNC_DIRTY_PIXELS_PER_BIT);
132 VncRectStat stats[VNC_STAT_ROWS][VNC_STAT_COLS];
133 pixman_image_t *fb;
134 pixman_format_code_t format;
135};
136
137typedef enum VncShareMode {
138 VNC_SHARE_MODE_CONNECTING = 1,
139 VNC_SHARE_MODE_SHARED,
140 VNC_SHARE_MODE_EXCLUSIVE,
141 VNC_SHARE_MODE_DISCONNECTED,
142} VncShareMode;
143
144typedef enum VncSharePolicy {
145 VNC_SHARE_POLICY_IGNORE = 1,
146 VNC_SHARE_POLICY_ALLOW_EXCLUSIVE,
147 VNC_SHARE_POLICY_FORCE_SHARED,
148} VncSharePolicy;
149
150struct VncDisplay
151{
152 QTAILQ_HEAD(, VncState) clients;
153 int num_exclusive;
154 VncSharePolicy share_policy;
155 int lsock;
156#ifdef CONFIG_VNC_WS
157 int lwebsock;
158 bool websocket;
159 char *ws_display;
160#endif
161 DisplaySurface *ds;
162 DisplayChangeListener dcl;
163 kbd_layout_t *kbd_layout;
164 int lock_key_sync;
165 QemuMutex mutex;
166
167 QEMUCursor *cursor;
168 int cursor_msize;
169 uint8_t *cursor_mask;
170
171 struct VncSurface guest;
172 pixman_image_t *server;
173
174 char *display;
175 char *password;
176 time_t expires;
177 int auth;
178 bool lossy;
179 bool non_adaptive;
180#ifdef CONFIG_VNC_TLS
181 int subauth;
182 VncDisplayTLS tls;
183#endif
184#ifdef CONFIG_VNC_SASL
185 VncDisplaySASL sasl;
186#endif
187};
188
189typedef struct VncTight {
190 int type;
191 uint8_t quality;
192 uint8_t compression;
193 uint8_t pixel24;
194 Buffer tight;
195 Buffer tmp;
196 Buffer zlib;
197 Buffer gradient;
198#ifdef CONFIG_VNC_JPEG
199 Buffer jpeg;
200#endif
201#ifdef CONFIG_VNC_PNG
202 Buffer png;
203#endif
204 int levels[4];
205 z_stream stream[4];
206} VncTight;
207
208typedef struct VncHextile {
209 VncSendHextileTile *send_tile;
210} VncHextile;
211
212typedef struct VncZlib {
213 Buffer zlib;
214 Buffer tmp;
215 z_stream stream;
216 int level;
217} VncZlib;
218
219typedef struct VncZrle {
220 int type;
221 Buffer fb;
222 Buffer zrle;
223 Buffer tmp;
224 Buffer zlib;
225 z_stream stream;
226 VncPalette palette;
227} VncZrle;
228
229typedef struct VncZywrle {
230 int buf[VNC_ZRLE_TILE_WIDTH * VNC_ZRLE_TILE_HEIGHT];
231} VncZywrle;
232
233struct VncRect
234{
235 int x;
236 int y;
237 int w;
238 int h;
239};
240
241struct VncRectEntry
242{
243 struct VncRect rect;
244 QLIST_ENTRY(VncRectEntry) next;
245};
246
247struct VncJob
248{
249 VncState *vs;
250
251 QLIST_HEAD(, VncRectEntry) rectangles;
252 QTAILQ_ENTRY(VncJob) next;
253};
254
255struct VncState
256{
257 int csock;
258
259 DECLARE_BITMAP(dirty[VNC_MAX_HEIGHT], VNC_DIRTY_BITS);
260 uint8_t **lossy_rect;
261
262
263 VncDisplay *vd;
264 int need_update;
265 int force_update;
266 int has_dirty;
267 uint32_t features;
268 int absolute;
269 int last_x;
270 int last_y;
271 uint32_t last_bmask;
272 int client_width;
273 int client_height;
274 VncShareMode share_mode;
275
276 uint32_t vnc_encoding;
277
278 int major;
279 int minor;
280
281 int auth;
282 char challenge[VNC_AUTH_CHALLENGE_SIZE];
283#ifdef CONFIG_VNC_TLS
284 int subauth;
285 VncStateTLS tls;
286#endif
287#ifdef CONFIG_VNC_SASL
288 VncStateSASL sasl;
289#endif
290#ifdef CONFIG_VNC_WS
291#ifdef CONFIG_VNC_TLS
292 VncStateTLS ws_tls;
293#endif
294 bool encode_ws;
295 bool websocket;
296#endif
297
298 VncClientInfo *info;
299
300 Buffer output;
301 Buffer input;
302#ifdef CONFIG_VNC_WS
303 Buffer ws_input;
304 Buffer ws_output;
305#endif
306
307 VncWritePixels *write_pixels;
308 PixelFormat client_pf;
309 pixman_format_code_t client_format;
310 bool client_be;
311
312 CaptureVoiceOut *audio_cap;
313 struct audsettings as;
314
315 VncReadEvent *read_handler;
316 size_t read_handler_expect;
317
318 uint8_t modifiers_state[256];
319 QEMUPutLEDEntry *led;
320
321 bool abort;
322 bool initialized;
323 QemuMutex output_mutex;
324 QEMUBH *bh;
325 Buffer jobs_buffer;
326
327
328
329
330 VncTight tight;
331 VncZlib zlib;
332 VncHextile hextile;
333 VncZrle zrle;
334 VncZywrle zywrle;
335
336 Notifier mouse_mode_notifier;
337
338 QTAILQ_ENTRY(VncState) next;
339};
340
341
342
343
344
345
346
347
348enum {
349 VNC_AUTH_INVALID = 0,
350 VNC_AUTH_NONE = 1,
351 VNC_AUTH_VNC = 2,
352 VNC_AUTH_RA2 = 5,
353 VNC_AUTH_RA2NE = 6,
354 VNC_AUTH_TIGHT = 16,
355 VNC_AUTH_ULTRA = 17,
356 VNC_AUTH_TLS = 18,
357 VNC_AUTH_VENCRYPT = 19,
358 VNC_AUTH_SASL = 20,
359};
360
361enum {
362 VNC_AUTH_VENCRYPT_PLAIN = 256,
363 VNC_AUTH_VENCRYPT_TLSNONE = 257,
364 VNC_AUTH_VENCRYPT_TLSVNC = 258,
365 VNC_AUTH_VENCRYPT_TLSPLAIN = 259,
366 VNC_AUTH_VENCRYPT_X509NONE = 260,
367 VNC_AUTH_VENCRYPT_X509VNC = 261,
368 VNC_AUTH_VENCRYPT_X509PLAIN = 262,
369 VNC_AUTH_VENCRYPT_X509SASL = 263,
370 VNC_AUTH_VENCRYPT_TLSSASL = 264,
371};
372
373
374
375
376
377
378
379
380#define VNC_ENCODING_RAW 0x00000000
381#define VNC_ENCODING_COPYRECT 0x00000001
382#define VNC_ENCODING_RRE 0x00000002
383#define VNC_ENCODING_CORRE 0x00000004
384#define VNC_ENCODING_HEXTILE 0x00000005
385#define VNC_ENCODING_ZLIB 0x00000006
386#define VNC_ENCODING_TIGHT 0x00000007
387#define VNC_ENCODING_ZLIBHEX 0x00000008
388#define VNC_ENCODING_TRLE 0x0000000f
389#define VNC_ENCODING_ZRLE 0x00000010
390#define VNC_ENCODING_ZYWRLE 0x00000011
391#define VNC_ENCODING_COMPRESSLEVEL0 0xFFFFFF00
392#define VNC_ENCODING_QUALITYLEVEL0 0xFFFFFFE0
393#define VNC_ENCODING_XCURSOR 0xFFFFFF10
394#define VNC_ENCODING_RICH_CURSOR 0xFFFFFF11
395#define VNC_ENCODING_POINTER_POS 0xFFFFFF18
396#define VNC_ENCODING_LASTRECT 0xFFFFFF20
397#define VNC_ENCODING_DESKTOPRESIZE 0xFFFFFF21
398#define VNC_ENCODING_POINTER_TYPE_CHANGE 0XFFFFFEFF
399#define VNC_ENCODING_EXT_KEY_EVENT 0XFFFFFEFE
400#define VNC_ENCODING_AUDIO 0XFFFFFEFD
401#define VNC_ENCODING_TIGHT_PNG 0xFFFFFEFC
402#define VNC_ENCODING_LED_STATE 0XFFFFFEFB
403#define VNC_ENCODING_WMVi 0x574D5669
404
405
406
407
408
409
410
411
412
413
414
415#define VNC_TIGHT_CCB_RESET_MASK (0x0f)
416#define VNC_TIGHT_CCB_TYPE_MASK (0x0f << 4)
417#define VNC_TIGHT_CCB_TYPE_FILL (0x08 << 4)
418#define VNC_TIGHT_CCB_TYPE_JPEG (0x09 << 4)
419#define VNC_TIGHT_CCB_TYPE_PNG (0x0A << 4)
420#define VNC_TIGHT_CCB_BASIC_MAX (0x07 << 4)
421#define VNC_TIGHT_CCB_BASIC_ZLIB (0x03 << 4)
422#define VNC_TIGHT_CCB_BASIC_FILTER (0x04 << 4)
423
424
425
426
427
428
429
430#define VNC_FEATURE_RESIZE 0
431#define VNC_FEATURE_HEXTILE 1
432#define VNC_FEATURE_POINTER_TYPE_CHANGE 2
433#define VNC_FEATURE_WMVI 3
434#define VNC_FEATURE_TIGHT 4
435#define VNC_FEATURE_ZLIB 5
436#define VNC_FEATURE_COPYRECT 6
437#define VNC_FEATURE_RICH_CURSOR 7
438#define VNC_FEATURE_TIGHT_PNG 8
439#define VNC_FEATURE_ZRLE 9
440#define VNC_FEATURE_ZYWRLE 10
441#define VNC_FEATURE_LED_STATE 11
442
443#define VNC_FEATURE_RESIZE_MASK (1 << VNC_FEATURE_RESIZE)
444#define VNC_FEATURE_HEXTILE_MASK (1 << VNC_FEATURE_HEXTILE)
445#define VNC_FEATURE_POINTER_TYPE_CHANGE_MASK (1 << VNC_FEATURE_POINTER_TYPE_CHANGE)
446#define VNC_FEATURE_WMVI_MASK (1 << VNC_FEATURE_WMVI)
447#define VNC_FEATURE_TIGHT_MASK (1 << VNC_FEATURE_TIGHT)
448#define VNC_FEATURE_ZLIB_MASK (1 << VNC_FEATURE_ZLIB)
449#define VNC_FEATURE_COPYRECT_MASK (1 << VNC_FEATURE_COPYRECT)
450#define VNC_FEATURE_RICH_CURSOR_MASK (1 << VNC_FEATURE_RICH_CURSOR)
451#define VNC_FEATURE_TIGHT_PNG_MASK (1 << VNC_FEATURE_TIGHT_PNG)
452#define VNC_FEATURE_ZRLE_MASK (1 << VNC_FEATURE_ZRLE)
453#define VNC_FEATURE_ZYWRLE_MASK (1 << VNC_FEATURE_ZYWRLE)
454#define VNC_FEATURE_LED_STATE_MASK (1 << VNC_FEATURE_LED_STATE)
455
456
457
458#define VNC_MSG_CLIENT_SET_PIXEL_FORMAT 0
459#define VNC_MSG_CLIENT_SET_ENCODINGS 2
460#define VNC_MSG_CLIENT_FRAMEBUFFER_UPDATE_REQUEST 3
461#define VNC_MSG_CLIENT_KEY_EVENT 4
462#define VNC_MSG_CLIENT_POINTER_EVENT 5
463#define VNC_MSG_CLIENT_CUT_TEXT 6
464#define VNC_MSG_CLIENT_VMWARE_0 127
465#define VNC_MSG_CLIENT_CALL_CONTROL 249
466#define VNC_MSG_CLIENT_XVP 250
467#define VNC_MSG_CLIENT_SET_DESKTOP_SIZE 251
468#define VNC_MSG_CLIENT_TIGHT 252
469#define VNC_MSG_CLIENT_GII 253
470#define VNC_MSG_CLIENT_VMWARE_1 254
471#define VNC_MSG_CLIENT_QEMU 255
472
473
474#define VNC_MSG_SERVER_FRAMEBUFFER_UPDATE 0
475#define VNC_MSG_SERVER_SET_COLOUR_MAP_ENTRIES 1
476#define VNC_MSG_SERVER_BELL 2
477#define VNC_MSG_SERVER_CUT_TEXT 3
478#define VNC_MSG_SERVER_VMWARE_0 127
479#define VNC_MSG_SERVER_CALL_CONTROL 249
480#define VNC_MSG_SERVER_XVP 250
481#define VNC_MSG_SERVER_TIGHT 252
482#define VNC_MSG_SERVER_GII 253
483#define VNC_MSG_SERVER_VMWARE_1 254
484#define VNC_MSG_SERVER_QEMU 255
485
486
487
488
489#define VNC_MSG_CLIENT_QEMU_EXT_KEY_EVENT 0
490#define VNC_MSG_CLIENT_QEMU_AUDIO 1
491
492
493#define VNC_MSG_SERVER_QEMU_AUDIO 1
494
495
496
497
498#define VNC_MSG_CLIENT_QEMU_AUDIO_ENABLE 0
499#define VNC_MSG_CLIENT_QEMU_AUDIO_DISABLE 1
500#define VNC_MSG_CLIENT_QEMU_AUDIO_SET_FORMAT 2
501
502
503#define VNC_MSG_SERVER_QEMU_AUDIO_END 0
504#define VNC_MSG_SERVER_QEMU_AUDIO_BEGIN 1
505#define VNC_MSG_SERVER_QEMU_AUDIO_DATA 2
506
507
508
509
510
511
512
513
514
515void vnc_client_read(void *opaque);
516void vnc_client_write(void *opaque);
517
518long vnc_client_read_buf(VncState *vs, uint8_t *data, size_t datalen);
519long vnc_client_write_buf(VncState *vs, const uint8_t *data, size_t datalen);
520
521
522void vnc_write(VncState *vs, const void *data, size_t len);
523void vnc_write_u32(VncState *vs, uint32_t value);
524void vnc_write_s32(VncState *vs, int32_t value);
525void vnc_write_u16(VncState *vs, uint16_t value);
526void vnc_write_u8(VncState *vs, uint8_t value);
527void vnc_flush(VncState *vs);
528void vnc_read_when(VncState *vs, VncReadEvent *func, size_t expecting);
529void vnc_disconnect_finish(VncState *vs);
530void vnc_init_state(VncState *vs);
531
532
533
534uint32_t read_u32(uint8_t *data, size_t offset);
535
536
537void vnc_client_error(VncState *vs);
538int vnc_client_io_error(VncState *vs, int ret, int last_errno);
539
540void start_client_init(VncState *vs);
541void start_auth_vnc(VncState *vs);
542
543
544void buffer_reserve(Buffer *buffer, size_t len);
545void buffer_reset(Buffer *buffer);
546void buffer_free(Buffer *buffer);
547void buffer_append(Buffer *buffer, const void *data, size_t len);
548void buffer_advance(Buffer *buf, size_t len);
549uint8_t *buffer_end(Buffer *buffer);
550
551
552
553
554char *vnc_socket_local_addr(const char *format, int fd);
555char *vnc_socket_remote_addr(const char *format, int fd);
556
557static inline uint32_t vnc_has_feature(VncState *vs, int feature) {
558 return (vs->features & (1 << feature));
559}
560
561
562void vnc_framebuffer_update(VncState *vs, int x, int y, int w, int h,
563 int32_t encoding);
564
565
566#define VNC_SERVER_FB_FORMAT PIXMAN_FORMAT(32, PIXMAN_TYPE_ARGB, 0, 8, 8, 8)
567#define VNC_SERVER_FB_BITS (PIXMAN_FORMAT_BPP(VNC_SERVER_FB_FORMAT))
568#define VNC_SERVER_FB_BYTES ((VNC_SERVER_FB_BITS+7)/8)
569
570void *vnc_server_fb_ptr(VncDisplay *vd, int x, int y);
571int vnc_server_fb_stride(VncDisplay *vd);
572
573void vnc_convert_pixel(VncState *vs, uint8_t *buf, uint32_t v);
574double vnc_update_freq(VncState *vs, int x, int y, int w, int h);
575void vnc_sent_lossy_rect(VncState *vs, int x, int y, int w, int h);
576
577
578int vnc_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
579
580int vnc_raw_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
581
582int vnc_hextile_send_framebuffer_update(VncState *vs, int x,
583 int y, int w, int h);
584void vnc_hextile_set_pixel_conversion(VncState *vs, int generic);
585
586void *vnc_zlib_zalloc(void *x, unsigned items, unsigned size);
587void vnc_zlib_zfree(void *x, void *addr);
588int vnc_zlib_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
589void vnc_zlib_clear(VncState *vs);
590
591int vnc_tight_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
592int vnc_tight_png_send_framebuffer_update(VncState *vs, int x, int y,
593 int w, int h);
594void vnc_tight_clear(VncState *vs);
595
596int vnc_zrle_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
597int vnc_zywrle_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
598void vnc_zrle_clear(VncState *vs);
599
600#endif
601