]> git.proxmox.com Git - qemu.git/blame - ui/vnc.h
vnc: don't try to send bigger updates that client height
[qemu.git] / ui / vnc.h
CommitLineData
19a490bf
AL
1/*
2 * QEMU VNC display driver
3 *
4 * Copyright (C) 2006 Anthony Liguori <anthony@codemonkey.ws>
5 * Copyright (C) 2006 Fabrice Bellard
6 * Copyright (C) 2009 Red Hat, Inc
7 *
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:
14 *
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
17 *
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
24 * THE SOFTWARE.
25 */
26
27#ifndef __QEMU_VNC_H
28#define __QEMU_VNC_H
29
30#include "qemu-common.h"
41b4bef6 31#include "qemu-queue.h"
bd023f95
CC
32#ifdef CONFIG_VNC_THREAD
33#include "qemu-thread.h"
34#endif
19a490bf
AL
35#include "console.h"
36#include "monitor.h"
37#include "audio/audio.h"
bc2429b9 38#include "bitmap.h"
19a490bf 39#include <zlib.h>
6f9c78c1 40#include <stdbool.h>
19a490bf 41
19a490bf 42#include "keymaps.h"
148954fa
CC
43#include "vnc-palette.h"
44#include "vnc-enc-zrle.h"
19a490bf 45
5fb6c7a8
AL
46// #define _VNC_DEBUG 1
47
48#ifdef _VNC_DEBUG
49#define VNC_DEBUG(fmt, ...) do { fprintf(stderr, fmt, ## __VA_ARGS__); } while (0)
50#else
51#define VNC_DEBUG(fmt, ...) do { } while (0)
52#endif
53
19a490bf
AL
54/*****************************************************************************
55 *
56 * Core data structures
57 *
58 *****************************************************************************/
59
60typedef struct Buffer
61{
62 size_t capacity;
63 size_t offset;
64 uint8_t *buffer;
65} Buffer;
66
67typedef struct VncState VncState;
bd023f95
CC
68typedef struct VncJob VncJob;
69typedef struct VncRect VncRect;
70typedef struct VncRectEntry VncRectEntry;
19a490bf
AL
71
72typedef int VncReadEvent(VncState *vs, uint8_t *data, size_t len);
73
d467b679 74typedef void VncWritePixels(VncState *vs, struct PixelFormat *pf, void *data, int size);
19a490bf
AL
75
76typedef void VncSendHextileTile(VncState *vs,
77 int x, int y, int w, int h,
78 void *last_bg,
79 void *last_fg,
80 int *has_bg, int *has_fg);
81
3f54bfbf 82#define VNC_MAX_WIDTH 2560
19a490bf 83#define VNC_MAX_HEIGHT 2048
bc2429b9 84#define VNC_DIRTY_WORDS (VNC_MAX_WIDTH / (16 * BITS_PER_LONG))
19a490bf 85
999342a0
CC
86#define VNC_STAT_RECT 64
87#define VNC_STAT_COLS (VNC_MAX_WIDTH / VNC_STAT_RECT)
88#define VNC_STAT_ROWS (VNC_MAX_HEIGHT / VNC_STAT_RECT)
89
19a490bf
AL
90#define VNC_AUTH_CHALLENGE_SIZE 16
91
92typedef struct VncDisplay VncDisplay;
93
5fb6c7a8
AL
94#ifdef CONFIG_VNC_TLS
95#include "vnc-tls.h"
96#include "vnc-auth-vencrypt.h"
97#endif
2f9606b3
AL
98#ifdef CONFIG_VNC_SASL
99#include "vnc-auth-sasl.h"
100#endif
101
999342a0
CC
102struct VncRectStat
103{
104 /* time of last 10 updates, to find update frequency */
105 struct timeval times[10];
106 int idx;
107
108 double freq; /* Update frequency (in Hz) */
109 bool updated; /* Already updated during this refresh */
110};
111
112typedef struct VncRectStat VncRectStat;
113
1fc62412
SS
114struct VncSurface
115{
999342a0 116 struct timeval last_freq_check;
bc2429b9 117 unsigned long dirty[VNC_MAX_HEIGHT][VNC_DIRTY_WORDS];
999342a0 118 VncRectStat stats[VNC_STAT_ROWS][VNC_STAT_COLS];
1fc62412
SS
119 DisplaySurface *ds;
120};
5fb6c7a8 121
19a490bf
AL
122struct VncDisplay
123{
41b4bef6 124 QTAILQ_HEAD(, VncState) clients;
703bc68f 125 QEMUTimer *timer;
2430ffe4 126 int timer_interval;
19a490bf
AL
127 int lsock;
128 DisplayState *ds;
c227f099 129 kbd_layout_t *kbd_layout;
3a0558b5 130 int lock_key_sync;
bd023f95
CC
131#ifdef CONFIG_VNC_THREAD
132 QemuMutex mutex;
133#endif
19a490bf 134
d467b679
GH
135 QEMUCursor *cursor;
136 int cursor_msize;
137 uint8_t *cursor_mask;
138
1fc62412
SS
139 struct VncSurface guest; /* guest visible surface (aka ds->surface) */
140 DisplaySurface *server; /* vnc server surface */
141
19a490bf
AL
142 char *display;
143 char *password;
3c9405a0 144 time_t expires;
19a490bf 145 int auth;
6f9c78c1 146 bool lossy;
19a490bf 147#ifdef CONFIG_VNC_TLS
5fb6c7a8
AL
148 int subauth; /* Used by VeNCrypt */
149 VncDisplayTLS tls;
19a490bf 150#endif
76655d6d
AL
151#ifdef CONFIG_VNC_SASL
152 VncDisplaySASL sasl;
153#endif
19a490bf
AL
154};
155
d1af0e05
CC
156typedef struct VncTight {
157 int type;
158 uint8_t quality;
159 uint8_t compression;
160 uint8_t pixel24;
161 Buffer tight;
162 Buffer tmp;
163 Buffer zlib;
164 Buffer gradient;
165#ifdef CONFIG_VNC_JPEG
166 Buffer jpeg;
167#endif
168#ifdef CONFIG_VNC_PNG
169 Buffer png;
170#endif
171 int levels[4];
172 z_stream stream[4];
173} VncTight;
174
175typedef struct VncHextile {
176 VncSendHextileTile *send_tile;
177} VncHextile;
178
179typedef struct VncZlib {
180 Buffer zlib;
181 Buffer tmp;
182 z_stream stream;
183 int level;
184} VncZlib;
185
148954fa
CC
186typedef struct VncZrle {
187 int type;
188 Buffer fb;
189 Buffer zrle;
190 Buffer tmp;
191 Buffer zlib;
192 z_stream stream;
193 VncPalette palette;
194} VncZrle;
195
196typedef struct VncZywrle {
197 int buf[VNC_ZRLE_TILE_WIDTH * VNC_ZRLE_TILE_HEIGHT];
198} VncZywrle;
199
bd023f95
CC
200#ifdef CONFIG_VNC_THREAD
201struct VncRect
202{
203 int x;
204 int y;
205 int w;
206 int h;
207};
208
209struct VncRectEntry
210{
211 struct VncRect rect;
212 QLIST_ENTRY(VncRectEntry) next;
213};
214
215struct VncJob
216{
217 VncState *vs;
218
219 QLIST_HEAD(, VncRectEntry) rectangles;
220 QTAILQ_ENTRY(VncJob) next;
221};
222#else
223struct VncJob
224{
225 VncState *vs;
226 int rectangles;
227 size_t saved_offset;
228};
229#endif
230
19a490bf
AL
231struct VncState
232{
19a490bf 233 int csock;
6baebed7 234
19a490bf 235 DisplayState *ds;
bc2429b9 236 unsigned long dirty[VNC_MAX_HEIGHT][VNC_DIRTY_WORDS];
7d964c9d
CC
237 uint8_t **lossy_rect; /* Not an Array to avoid costly memcpy in
238 * vnc-jobs-async.c */
6baebed7 239
19a490bf
AL
240 VncDisplay *vd;
241 int need_update;
c522d0e2 242 int force_update;
19a490bf
AL
243 uint32_t features;
244 int absolute;
245 int last_x;
246 int last_y;
5862d195
GH
247 int client_width;
248 int client_height;
19a490bf
AL
249
250 uint32_t vnc_encoding;
19a490bf
AL
251
252 int major;
253 int minor;
254
255 char challenge[VNC_AUTH_CHALLENGE_SIZE];
19a490bf 256#ifdef CONFIG_VNC_TLS
5fb6c7a8 257 VncStateTLS tls;
19a490bf 258#endif
2f9606b3
AL
259#ifdef CONFIG_VNC_SASL
260 VncStateSASL sasl;
261#endif
19a490bf 262
4a80dba3
LC
263 QObject *info;
264
19a490bf
AL
265 Buffer output;
266 Buffer input;
267 /* current output mode information */
268 VncWritePixels *write_pixels;
6baebed7 269 DisplaySurface clientds;
19a490bf
AL
270
271 CaptureVoiceOut *audio_cap;
272 struct audsettings as;
273
274 VncReadEvent *read_handler;
275 size_t read_handler_expect;
276 /* input */
277 uint8_t modifiers_state[256];
7ffb82ca 278 QEMUPutLEDEntry *led;
19a490bf 279
bd023f95
CC
280 bool abort;
281#ifndef CONFIG_VNC_THREAD
282 VncJob job;
283#else
284 QemuMutex output_mutex;
285#endif
286
287 /* Encoding specific, if you add something here, don't forget to
288 * update vnc_async_encoding_start()
289 */
d1af0e05
CC
290 VncTight tight;
291 VncZlib zlib;
292 VncHextile hextile;
148954fa
CC
293 VncZrle zrle;
294 VncZywrle zywrle;
19a490bf 295
37c34d9d
AL
296 Notifier mouse_mode_notifier;
297
41b4bef6 298 QTAILQ_ENTRY(VncState) next;
19a490bf
AL
299};
300
e06679fb
AL
301
302/*****************************************************************************
303 *
304 * Authentication modes
305 *
306 *****************************************************************************/
307
308enum {
309 VNC_AUTH_INVALID = 0,
310 VNC_AUTH_NONE = 1,
311 VNC_AUTH_VNC = 2,
312 VNC_AUTH_RA2 = 5,
313 VNC_AUTH_RA2NE = 6,
314 VNC_AUTH_TIGHT = 16,
315 VNC_AUTH_ULTRA = 17,
2f9606b3
AL
316 VNC_AUTH_TLS = 18, /* Supported in GTK-VNC & VINO */
317 VNC_AUTH_VENCRYPT = 19, /* Supported in GTK-VNC & VeNCrypt */
318 VNC_AUTH_SASL = 20, /* Supported in GTK-VNC & VINO */
e06679fb
AL
319};
320
e06679fb
AL
321enum {
322 VNC_AUTH_VENCRYPT_PLAIN = 256,
323 VNC_AUTH_VENCRYPT_TLSNONE = 257,
324 VNC_AUTH_VENCRYPT_TLSVNC = 258,
325 VNC_AUTH_VENCRYPT_TLSPLAIN = 259,
326 VNC_AUTH_VENCRYPT_X509NONE = 260,
327 VNC_AUTH_VENCRYPT_X509VNC = 261,
328 VNC_AUTH_VENCRYPT_X509PLAIN = 262,
2f9606b3
AL
329 VNC_AUTH_VENCRYPT_X509SASL = 263,
330 VNC_AUTH_VENCRYPT_TLSSASL = 264,
e06679fb
AL
331};
332
e06679fb
AL
333
334/*****************************************************************************
335 *
336 * Encoding types
337 *
338 *****************************************************************************/
339
340#define VNC_ENCODING_RAW 0x00000000
341#define VNC_ENCODING_COPYRECT 0x00000001
342#define VNC_ENCODING_RRE 0x00000002
343#define VNC_ENCODING_CORRE 0x00000004
344#define VNC_ENCODING_HEXTILE 0x00000005
345#define VNC_ENCODING_ZLIB 0x00000006
346#define VNC_ENCODING_TIGHT 0x00000007
347#define VNC_ENCODING_ZLIBHEX 0x00000008
348#define VNC_ENCODING_TRLE 0x0000000f
349#define VNC_ENCODING_ZRLE 0x00000010
350#define VNC_ENCODING_ZYWRLE 0x00000011
351#define VNC_ENCODING_COMPRESSLEVEL0 0xFFFFFF00 /* -256 */
352#define VNC_ENCODING_QUALITYLEVEL0 0xFFFFFFE0 /* -32 */
353#define VNC_ENCODING_XCURSOR 0xFFFFFF10 /* -240 */
354#define VNC_ENCODING_RICH_CURSOR 0xFFFFFF11 /* -239 */
355#define VNC_ENCODING_POINTER_POS 0xFFFFFF18 /* -232 */
356#define VNC_ENCODING_LASTRECT 0xFFFFFF20 /* -224 */
357#define VNC_ENCODING_DESKTOPRESIZE 0xFFFFFF21 /* -223 */
358#define VNC_ENCODING_POINTER_TYPE_CHANGE 0XFFFFFEFF /* -257 */
359#define VNC_ENCODING_EXT_KEY_EVENT 0XFFFFFEFE /* -258 */
360#define VNC_ENCODING_AUDIO 0XFFFFFEFD /* -259 */
efe556ad 361#define VNC_ENCODING_TIGHT_PNG 0xFFFFFEFC /* -260 */
e06679fb
AL
362#define VNC_ENCODING_WMVi 0x574D5669
363
364/*****************************************************************************
365 *
366 * Other tight constants
367 *
368 *****************************************************************************/
369
370/*
371 * Vendors known by TightVNC: standard VNC/RealVNC, TridiaVNC, and TightVNC.
372 */
373
374#define VNC_TIGHT_CCB_RESET_MASK (0x0f)
375#define VNC_TIGHT_CCB_TYPE_MASK (0x0f << 4)
376#define VNC_TIGHT_CCB_TYPE_FILL (0x08 << 4)
377#define VNC_TIGHT_CCB_TYPE_JPEG (0x09 << 4)
efe556ad 378#define VNC_TIGHT_CCB_TYPE_PNG (0x0A << 4)
e06679fb
AL
379#define VNC_TIGHT_CCB_BASIC_MAX (0x07 << 4)
380#define VNC_TIGHT_CCB_BASIC_ZLIB (0x03 << 4)
381#define VNC_TIGHT_CCB_BASIC_FILTER (0x04 << 4)
382
383/*****************************************************************************
384 *
385 * Features
386 *
387 *****************************************************************************/
388
389#define VNC_FEATURE_RESIZE 0
390#define VNC_FEATURE_HEXTILE 1
391#define VNC_FEATURE_POINTER_TYPE_CHANGE 2
392#define VNC_FEATURE_WMVI 3
393#define VNC_FEATURE_TIGHT 4
394#define VNC_FEATURE_ZLIB 5
753b4053 395#define VNC_FEATURE_COPYRECT 6
d467b679 396#define VNC_FEATURE_RICH_CURSOR 7
efe556ad 397#define VNC_FEATURE_TIGHT_PNG 8
148954fa
CC
398#define VNC_FEATURE_ZRLE 9
399#define VNC_FEATURE_ZYWRLE 10
e06679fb
AL
400
401#define VNC_FEATURE_RESIZE_MASK (1 << VNC_FEATURE_RESIZE)
402#define VNC_FEATURE_HEXTILE_MASK (1 << VNC_FEATURE_HEXTILE)
403#define VNC_FEATURE_POINTER_TYPE_CHANGE_MASK (1 << VNC_FEATURE_POINTER_TYPE_CHANGE)
404#define VNC_FEATURE_WMVI_MASK (1 << VNC_FEATURE_WMVI)
405#define VNC_FEATURE_TIGHT_MASK (1 << VNC_FEATURE_TIGHT)
406#define VNC_FEATURE_ZLIB_MASK (1 << VNC_FEATURE_ZLIB)
753b4053 407#define VNC_FEATURE_COPYRECT_MASK (1 << VNC_FEATURE_COPYRECT)
d467b679 408#define VNC_FEATURE_RICH_CURSOR_MASK (1 << VNC_FEATURE_RICH_CURSOR)
efe556ad 409#define VNC_FEATURE_TIGHT_PNG_MASK (1 << VNC_FEATURE_TIGHT_PNG)
148954fa
CC
410#define VNC_FEATURE_ZRLE_MASK (1 << VNC_FEATURE_ZRLE)
411#define VNC_FEATURE_ZYWRLE_MASK (1 << VNC_FEATURE_ZYWRLE)
e06679fb 412
5fb6c7a8 413
46a183da
DB
414/* Client -> Server message IDs */
415#define VNC_MSG_CLIENT_SET_PIXEL_FORMAT 0
416#define VNC_MSG_CLIENT_SET_ENCODINGS 2
417#define VNC_MSG_CLIENT_FRAMEBUFFER_UPDATE_REQUEST 3
418#define VNC_MSG_CLIENT_KEY_EVENT 4
419#define VNC_MSG_CLIENT_POINTER_EVENT 5
420#define VNC_MSG_CLIENT_CUT_TEXT 6
421#define VNC_MSG_CLIENT_VMWARE_0 127
422#define VNC_MSG_CLIENT_CALL_CONTROL 249
423#define VNC_MSG_CLIENT_XVP 250
424#define VNC_MSG_CLIENT_SET_DESKTOP_SIZE 251
425#define VNC_MSG_CLIENT_TIGHT 252
426#define VNC_MSG_CLIENT_GII 253
427#define VNC_MSG_CLIENT_VMWARE_1 254
428#define VNC_MSG_CLIENT_QEMU 255
429
430/* Server -> Client message IDs */
431#define VNC_MSG_SERVER_FRAMEBUFFER_UPDATE 0
432#define VNC_MSG_SERVER_SET_COLOUR_MAP_ENTRIES 1
433#define VNC_MSG_SERVER_BELL 2
434#define VNC_MSG_SERVER_CUT_TEXT 3
435#define VNC_MSG_SERVER_VMWARE_0 127
436#define VNC_MSG_SERVER_CALL_CONTROL 249
437#define VNC_MSG_SERVER_XVP 250
438#define VNC_MSG_SERVER_TIGHT 252
439#define VNC_MSG_SERVER_GII 253
440#define VNC_MSG_SERVER_VMWARE_1 254
441#define VNC_MSG_SERVER_QEMU 255
442
443
444
445/* QEMU client -> server message IDs */
446#define VNC_MSG_CLIENT_QEMU_EXT_KEY_EVENT 0
447#define VNC_MSG_CLIENT_QEMU_AUDIO 1
448
449/* QEMU server -> client message IDs */
450#define VNC_MSG_SERVER_QEMU_AUDIO 1
451
452
453
454/* QEMU client -> server audio message IDs */
455#define VNC_MSG_CLIENT_QEMU_AUDIO_ENABLE 0
456#define VNC_MSG_CLIENT_QEMU_AUDIO_DISABLE 1
457#define VNC_MSG_CLIENT_QEMU_AUDIO_SET_FORMAT 2
458
459/* QEMU server -> client audio message IDs */
460#define VNC_MSG_SERVER_QEMU_AUDIO_END 0
461#define VNC_MSG_SERVER_QEMU_AUDIO_BEGIN 1
462#define VNC_MSG_SERVER_QEMU_AUDIO_DATA 2
463
464
5fb6c7a8
AL
465/*****************************************************************************
466 *
467 * Internal APIs
468 *
469 *****************************************************************************/
470
471/* Event loop functions */
472void vnc_client_read(void *opaque);
473void vnc_client_write(void *opaque);
474
2f9606b3
AL
475long vnc_client_read_buf(VncState *vs, uint8_t *data, size_t datalen);
476long vnc_client_write_buf(VncState *vs, const uint8_t *data, size_t datalen);
5fb6c7a8
AL
477
478/* Protocol I/O functions */
479void vnc_write(VncState *vs, const void *data, size_t len);
480void vnc_write_u32(VncState *vs, uint32_t value);
481void vnc_write_s32(VncState *vs, int32_t value);
482void vnc_write_u16(VncState *vs, uint16_t value);
483void vnc_write_u8(VncState *vs, uint8_t value);
484void vnc_flush(VncState *vs);
485void vnc_read_when(VncState *vs, VncReadEvent *func, size_t expecting);
486
487
488/* Buffer I/O functions */
489uint8_t read_u8(uint8_t *data, size_t offset);
490uint16_t read_u16(uint8_t *data, size_t offset);
491int32_t read_s32(uint8_t *data, size_t offset);
492uint32_t read_u32(uint8_t *data, size_t offset);
493
494/* Protocol stage functions */
495void vnc_client_error(VncState *vs);
2f9606b3 496int vnc_client_io_error(VncState *vs, int ret, int last_errno);
5fb6c7a8
AL
497
498void start_client_init(VncState *vs);
499void start_auth_vnc(VncState *vs);
500
2f9606b3
AL
501/* Buffer management */
502void buffer_reserve(Buffer *buffer, size_t len);
503int buffer_empty(Buffer *buffer);
504uint8_t *buffer_end(Buffer *buffer);
505void buffer_reset(Buffer *buffer);
5d418e3b 506void buffer_free(Buffer *buffer);
2f9606b3
AL
507void buffer_append(Buffer *buffer, const void *data, size_t len);
508
509
510/* Misc helpers */
511
512char *vnc_socket_local_addr(const char *format, int fd);
513char *vnc_socket_remote_addr(const char *format, int fd);
514
efe556ad
CC
515static inline uint32_t vnc_has_feature(VncState *vs, int feature) {
516 return (vs->features & (1 << feature));
517}
518
70a4568f
CC
519/* Framebuffer */
520void vnc_framebuffer_update(VncState *vs, int x, int y, int w, int h,
521 int32_t encoding);
522
523void vnc_convert_pixel(VncState *vs, uint8_t *buf, uint32_t v);
999342a0 524double vnc_update_freq(VncState *vs, int x, int y, int w, int h);
7d964c9d 525void vnc_sent_lossy_rect(VncState *vs, int x, int y, int w, int h);
70a4568f
CC
526
527/* Encodings */
bd023f95
CC
528int vnc_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
529
a885211e 530int vnc_raw_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
70a4568f 531
a885211e 532int vnc_hextile_send_framebuffer_update(VncState *vs, int x,
70a4568f
CC
533 int y, int w, int h);
534void vnc_hextile_set_pixel_conversion(VncState *vs, int generic);
535
380282b0
CC
536void *vnc_zlib_zalloc(void *x, unsigned items, unsigned size);
537void vnc_zlib_zfree(void *x, void *addr);
a885211e 538int vnc_zlib_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
161c4f20 539void vnc_zlib_clear(VncState *vs);
70a4568f 540
380282b0 541int vnc_tight_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
efe556ad
CC
542int vnc_tight_png_send_framebuffer_update(VncState *vs, int x, int y,
543 int w, int h);
380282b0
CC
544void vnc_tight_clear(VncState *vs);
545
148954fa
CC
546int vnc_zrle_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
547int vnc_zywrle_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
548void vnc_zrle_clear(VncState *vs);
549
19a490bf 550#endif /* __QEMU_VNC_H */