blob: 2863f583aae06ea7c81e5e5e360690fe782d956d [file] [log] [blame]
aliguori19a490b2009-03-06 20:27:13 +00001/*
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"
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010031#include "qemu/queue.h"
32#include "qemu/thread.h"
Paolo Bonzini28ecbae2012-11-28 12:06:30 +010033#include "ui/console.h"
aliguori19a490b2009-03-06 20:27:13 +000034#include "audio/audio.h"
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010035#include "qemu/bitmap.h"
Daniel P. Berrange3e305e42015-08-06 14:39:32 +010036#include "crypto/tlssession.h"
Daniel P. Berrange88c5f202015-03-03 17:13:42 +000037#include "qemu/buffer.h"
aliguori19a490b2009-03-06 20:27:13 +000038#include <zlib.h>
Corentin Chary6f9c78c2010-07-07 20:57:51 +020039#include <stdbool.h>
aliguori19a490b2009-03-06 20:27:13 +000040
aliguori19a490b2009-03-06 20:27:13 +000041#include "keymaps.h"
Corentin Chary148954f2011-02-04 09:06:01 +010042#include "vnc-palette.h"
43#include "vnc-enc-zrle.h"
Wenchao Xiafb6ba0d2014-06-18 08:43:49 +020044#include "qapi-types.h"
aliguori19a490b2009-03-06 20:27:13 +000045
aliguori5fb6c7a2009-03-06 20:27:23 +000046// #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
aliguori19a490b2009-03-06 20:27:13 +000054/*****************************************************************************
55 *
56 * Core data structures
57 *
58 *****************************************************************************/
59
aliguori19a490b2009-03-06 20:27:13 +000060typedef struct VncState VncState;
Corentin Charybd023f92010-07-07 20:58:02 +020061typedef struct VncJob VncJob;
62typedef struct VncRect VncRect;
63typedef struct VncRectEntry VncRectEntry;
aliguori19a490b2009-03-06 20:27:13 +000064
65typedef int VncReadEvent(VncState *vs, uint8_t *data, size_t len);
66
Gerd Hoffmann9f649162012-10-10 13:29:43 +020067typedef void VncWritePixels(VncState *vs, void *data, int size);
aliguori19a490b2009-03-06 20:27:13 +000068
69typedef void VncSendHextileTile(VncState *vs,
70 int x, int y, int w, int h,
71 void *last_bg,
72 void *last_fg,
73 int *has_bg, int *has_fg);
74
Peter Lievenb4c85dd2014-01-08 10:08:33 +010075/* VNC_DIRTY_PIXELS_PER_BIT is the number of dirty pixels represented
Peter Lievenbea60dd2014-06-30 10:57:51 +020076 * by one bit in the dirty bitmap, should be a power of 2 */
Peter Lievenb4c85dd2014-01-08 10:08:33 +010077#define VNC_DIRTY_PIXELS_PER_BIT 16
78
Peter Lievenbea60dd2014-06-30 10:57:51 +020079/* VNC_MAX_WIDTH must be a multiple of VNC_DIRTY_PIXELS_PER_BIT. */
80
81#define VNC_MAX_WIDTH ROUND_UP(2560, VNC_DIRTY_PIXELS_PER_BIT)
82#define VNC_MAX_HEIGHT 2048
83
Stefan Weil23bfe282011-03-03 21:37:55 +010084/* VNC_DIRTY_BITS is the number of bits in the dirty bitmap. */
Peter Lievenb4c85dd2014-01-08 10:08:33 +010085#define VNC_DIRTY_BITS (VNC_MAX_WIDTH / VNC_DIRTY_PIXELS_PER_BIT)
aliguori19a490b2009-03-06 20:27:13 +000086
Peter Lieven12b316d2014-01-08 10:08:35 +010087/* VNC_DIRTY_BPL (BPL = bits per line) might be greater than
88 * VNC_DIRTY_BITS due to alignment */
89#define VNC_DIRTY_BPL(x) (sizeof((x)->dirty) / VNC_MAX_HEIGHT * BITS_PER_BYTE)
90
Corentin Chary999342a2011-02-04 09:05:55 +010091#define VNC_STAT_RECT 64
92#define VNC_STAT_COLS (VNC_MAX_WIDTH / VNC_STAT_RECT)
93#define VNC_STAT_ROWS (VNC_MAX_HEIGHT / VNC_STAT_RECT)
94
aliguori19a490b2009-03-06 20:27:13 +000095#define VNC_AUTH_CHALLENGE_SIZE 16
96
97typedef struct VncDisplay VncDisplay;
98
aliguori5fb6c7a2009-03-06 20:27:23 +000099#include "vnc-auth-vencrypt.h"
aliguori2f9606b2009-03-06 20:27:28 +0000100#ifdef CONFIG_VNC_SASL
101#include "vnc-auth-sasl.h"
102#endif
Tim Hardeck7536ee42013-01-21 11:04:44 +0100103#include "vnc-ws.h"
aliguori2f9606b2009-03-06 20:27:28 +0000104
Corentin Chary999342a2011-02-04 09:05:55 +0100105struct VncRectStat
106{
107 /* time of last 10 updates, to find update frequency */
108 struct timeval times[10];
109 int idx;
110
111 double freq; /* Update frequency (in Hz) */
112 bool updated; /* Already updated during this refresh */
113};
114
115typedef struct VncRectStat VncRectStat;
116
Stefano Stabellini1fc62412009-08-03 10:54:32 +0100117struct VncSurface
118{
Corentin Chary999342a2011-02-04 09:05:55 +0100119 struct timeval last_freq_check;
Peter Lievenbea60dd2014-06-30 10:57:51 +0200120 DECLARE_BITMAP(dirty[VNC_MAX_HEIGHT],
121 VNC_MAX_WIDTH / VNC_DIRTY_PIXELS_PER_BIT);
Corentin Chary999342a2011-02-04 09:05:55 +0100122 VncRectStat stats[VNC_STAT_ROWS][VNC_STAT_COLS];
Gerd Hoffmann9f649162012-10-10 13:29:43 +0200123 pixman_image_t *fb;
124 pixman_format_code_t format;
Stefano Stabellini1fc62412009-08-03 10:54:32 +0100125};
aliguori5fb6c7a2009-03-06 20:27:23 +0000126
Gerd Hoffmann8cf36482011-11-24 18:10:49 +0100127typedef enum VncShareMode {
128 VNC_SHARE_MODE_CONNECTING = 1,
129 VNC_SHARE_MODE_SHARED,
130 VNC_SHARE_MODE_EXCLUSIVE,
131 VNC_SHARE_MODE_DISCONNECTED,
132} VncShareMode;
133
134typedef enum VncSharePolicy {
135 VNC_SHARE_POLICY_IGNORE = 1,
136 VNC_SHARE_POLICY_ALLOW_EXCLUSIVE,
137 VNC_SHARE_POLICY_FORCE_SHARED,
138} VncSharePolicy;
139
aliguori19a490b2009-03-06 20:27:13 +0000140struct VncDisplay
141{
Amit Shah41b4bef2010-02-05 16:34:05 +0530142 QTAILQ_HEAD(, VncState) clients;
Gerd Hoffmanne5f34cd2014-10-02 12:09:34 +0200143 int num_connecting;
144 int num_shared;
Gerd Hoffmann8cf36482011-11-24 18:10:49 +0100145 int num_exclusive;
Gerd Hoffmanne5f34cd2014-10-02 12:09:34 +0200146 int connections_limit;
Gerd Hoffmann8cf36482011-11-24 18:10:49 +0100147 VncSharePolicy share_policy;
aliguori19a490b2009-03-06 20:27:13 +0000148 int lsock;
Tim Hardeck7536ee42013-01-21 11:04:44 +0100149 int lwebsock;
Gerd Hoffmannbf7aa452015-02-19 10:46:49 +0100150 bool ws_enabled;
Gerd Hoffmannd39fa6d2013-02-28 17:16:48 +0100151 DisplaySurface *ds;
Gerd Hoffmann21ef45d2013-02-28 11:34:31 +0100152 DisplayChangeListener dcl;
Anthony Liguoric227f092009-10-01 16:12:16 -0500153 kbd_layout_t *kbd_layout;
Gerd Hoffmann3a0558b2010-03-10 17:12:02 +0100154 int lock_key_sync;
Corentin Charybd023f92010-07-07 20:58:02 +0200155 QemuMutex mutex;
aliguori19a490b2009-03-06 20:27:13 +0000156
Gerd Hoffmannd467b672010-05-21 11:54:34 +0200157 QEMUCursor *cursor;
158 int cursor_msize;
159 uint8_t *cursor_mask;
160
Stefano Stabellini1fc62412009-08-03 10:54:32 +0100161 struct VncSurface guest; /* guest visible surface (aka ds->surface) */
Gerd Hoffmann9f649162012-10-10 13:29:43 +0200162 pixman_image_t *server; /* vnc server surface */
Stefano Stabellini1fc62412009-08-03 10:54:32 +0100163
Gerd Hoffmannd616ccc2014-07-29 12:14:08 +0200164 const char *id;
165 QTAILQ_ENTRY(VncDisplay) next;
Gerd Hoffmannbf7aa452015-02-19 10:46:49 +0100166 bool enabled;
167 bool is_unix;
aliguori19a490b2009-03-06 20:27:13 +0000168 char *password;
Gerd Hoffmann3c9405a2010-10-07 11:50:45 +0200169 time_t expires;
aliguori19a490b2009-03-06 20:27:13 +0000170 int auth;
Daniel P. Berranged169f042015-03-17 13:42:55 +0000171 int subauth; /* Used by VeNCrypt */
Daniel P. Berrangef9148c82015-03-17 13:42:57 +0000172 int ws_auth; /* Used by websockets */
173 bool ws_tls; /* Used by websockets */
Corentin Chary6f9c78c2010-07-07 20:57:51 +0200174 bool lossy;
Corentin Chary80e0c8c2011-02-04 09:06:08 +0100175 bool non_adaptive;
Daniel P. Berrange3e305e42015-08-06 14:39:32 +0100176 QCryptoTLSCreds *tlscreds;
177 char *tlsaclname;
aliguori76655d62009-03-06 20:27:37 +0000178#ifdef CONFIG_VNC_SASL
179 VncDisplaySASL sasl;
180#endif
aliguori19a490b2009-03-06 20:27:13 +0000181};
182
Corentin Charyd1af0e02010-07-07 20:57:59 +0200183typedef struct VncTight {
184 int type;
185 uint8_t quality;
186 uint8_t compression;
187 uint8_t pixel24;
188 Buffer tight;
189 Buffer tmp;
190 Buffer zlib;
191 Buffer gradient;
192#ifdef CONFIG_VNC_JPEG
193 Buffer jpeg;
194#endif
195#ifdef CONFIG_VNC_PNG
196 Buffer png;
197#endif
198 int levels[4];
199 z_stream stream[4];
200} VncTight;
201
202typedef struct VncHextile {
203 VncSendHextileTile *send_tile;
204} VncHextile;
205
206typedef struct VncZlib {
207 Buffer zlib;
208 Buffer tmp;
209 z_stream stream;
210 int level;
211} VncZlib;
212
Corentin Chary148954f2011-02-04 09:06:01 +0100213typedef struct VncZrle {
214 int type;
215 Buffer fb;
216 Buffer zrle;
217 Buffer tmp;
218 Buffer zlib;
219 z_stream stream;
220 VncPalette palette;
221} VncZrle;
222
223typedef struct VncZywrle {
224 int buf[VNC_ZRLE_TILE_WIDTH * VNC_ZRLE_TILE_HEIGHT];
225} VncZywrle;
226
Corentin Charybd023f92010-07-07 20:58:02 +0200227struct VncRect
228{
229 int x;
230 int y;
231 int w;
232 int h;
233};
234
235struct VncRectEntry
236{
237 struct VncRect rect;
238 QLIST_ENTRY(VncRectEntry) next;
239};
240
241struct VncJob
242{
243 VncState *vs;
244
245 QLIST_HEAD(, VncRectEntry) rectangles;
246 QTAILQ_ENTRY(VncJob) next;
247};
Corentin Charybd023f92010-07-07 20:58:02 +0200248
aliguori19a490b2009-03-06 20:27:13 +0000249struct VncState
250{
aliguori19a490b2009-03-06 20:27:13 +0000251 int csock;
aliguori6baebed2009-03-20 15:59:14 +0000252
Stefan Weil23bfe282011-03-03 21:37:55 +0100253 DECLARE_BITMAP(dirty[VNC_MAX_HEIGHT], VNC_DIRTY_BITS);
Corentin Chary7d964c92011-02-04 09:05:56 +0100254 uint8_t **lossy_rect; /* Not an Array to avoid costly memcpy in
255 * vnc-jobs-async.c */
aliguori6baebed2009-03-20 15:59:14 +0000256
aliguori19a490b2009-03-06 20:27:13 +0000257 VncDisplay *vd;
258 int need_update;
aliguoric522d0e2009-03-20 15:59:24 +0000259 int force_update;
Gerd Hoffmann63658282014-07-23 11:52:02 +0200260 int has_dirty;
aliguori19a490b2009-03-06 20:27:13 +0000261 uint32_t features;
262 int absolute;
263 int last_x;
264 int last_y;
Gerd Hoffmann14768eb2013-12-02 15:17:45 +0100265 uint32_t last_bmask;
Gerd Hoffmann5862d192010-05-25 18:25:18 +0200266 int client_width;
267 int client_height;
Gerd Hoffmann8cf36482011-11-24 18:10:49 +0100268 VncShareMode share_mode;
aliguori19a490b2009-03-06 20:27:13 +0000269
270 uint32_t vnc_encoding;
aliguori19a490b2009-03-06 20:27:13 +0000271
272 int major;
273 int minor;
274
Daniel P. Berrange7e7e2eb2011-06-23 13:31:41 +0100275 int auth;
Daniel P. Berranged169f042015-03-17 13:42:55 +0000276 int subauth; /* Used by VeNCrypt */
aliguori19a490b2009-03-06 20:27:13 +0000277 char challenge[VNC_AUTH_CHALLENGE_SIZE];
Daniel P. Berrange3e305e42015-08-06 14:39:32 +0100278 QCryptoTLSSession *tls;
aliguori2f9606b2009-03-06 20:27:28 +0000279#ifdef CONFIG_VNC_SASL
280 VncStateSASL sasl;
281#endif
Tim Hardeck7536ee42013-01-21 11:04:44 +0100282 bool encode_ws;
283 bool websocket;
aliguori19a490b2009-03-06 20:27:13 +0000284
Wenchao Xiafb6ba0d2014-06-18 08:43:49 +0200285 VncClientInfo *info;
Luiz Capitulino4a80dba2010-01-14 14:50:56 -0200286
aliguori19a490b2009-03-06 20:27:13 +0000287 Buffer output;
288 Buffer input;
Tim Hardeck7536ee42013-01-21 11:04:44 +0100289 Buffer ws_input;
290 Buffer ws_output;
Daniel P. Berrangea2bebfd2015-03-23 22:58:21 +0000291 size_t ws_payload_remain;
292 WsMask ws_payload_mask;
aliguori19a490b2009-03-06 20:27:13 +0000293 /* current output mode information */
294 VncWritePixels *write_pixels;
Gerd Hoffmann9f649162012-10-10 13:29:43 +0200295 PixelFormat client_pf;
296 pixman_format_code_t client_format;
297 bool client_be;
aliguori19a490b2009-03-06 20:27:13 +0000298
299 CaptureVoiceOut *audio_cap;
300 struct audsettings as;
301
302 VncReadEvent *read_handler;
303 size_t read_handler_expect;
304 /* input */
305 uint8_t modifiers_state[256];
Gerd Hoffmann7ffb82c2010-02-26 17:17:39 +0100306 QEMUPutLEDEntry *led;
aliguori19a490b2009-03-06 20:27:13 +0000307
Corentin Charybd023f92010-07-07 20:58:02 +0200308 bool abort;
Tim Hardeck6fd8e792013-01-21 11:04:45 +0100309 bool initialized;
Corentin Charybd023f92010-07-07 20:58:02 +0200310 QemuMutex output_mutex;
Corentin Chary175b2a62012-03-14 07:58:47 +0100311 QEMUBH *bh;
312 Buffer jobs_buffer;
Corentin Charybd023f92010-07-07 20:58:02 +0200313
314 /* Encoding specific, if you add something here, don't forget to
315 * update vnc_async_encoding_start()
316 */
Corentin Charyd1af0e02010-07-07 20:57:59 +0200317 VncTight tight;
318 VncZlib zlib;
319 VncHextile hextile;
Corentin Chary148954f2011-02-04 09:06:01 +0100320 VncZrle zrle;
321 VncZywrle zywrle;
aliguori19a490b2009-03-06 20:27:13 +0000322
Anthony Liguori37c34d92010-03-10 09:38:29 -0600323 Notifier mouse_mode_notifier;
324
Amit Shah41b4bef2010-02-05 16:34:05 +0530325 QTAILQ_ENTRY(VncState) next;
aliguori19a490b2009-03-06 20:27:13 +0000326};
327
aliguorie06679f2009-02-02 15:58:25 +0000328
329/*****************************************************************************
330 *
331 * Authentication modes
332 *
333 *****************************************************************************/
334
335enum {
336 VNC_AUTH_INVALID = 0,
337 VNC_AUTH_NONE = 1,
338 VNC_AUTH_VNC = 2,
339 VNC_AUTH_RA2 = 5,
340 VNC_AUTH_RA2NE = 6,
341 VNC_AUTH_TIGHT = 16,
342 VNC_AUTH_ULTRA = 17,
aliguori2f9606b2009-03-06 20:27:28 +0000343 VNC_AUTH_TLS = 18, /* Supported in GTK-VNC & VINO */
344 VNC_AUTH_VENCRYPT = 19, /* Supported in GTK-VNC & VeNCrypt */
345 VNC_AUTH_SASL = 20, /* Supported in GTK-VNC & VINO */
aliguorie06679f2009-02-02 15:58:25 +0000346};
347
aliguorie06679f2009-02-02 15:58:25 +0000348enum {
349 VNC_AUTH_VENCRYPT_PLAIN = 256,
350 VNC_AUTH_VENCRYPT_TLSNONE = 257,
351 VNC_AUTH_VENCRYPT_TLSVNC = 258,
352 VNC_AUTH_VENCRYPT_TLSPLAIN = 259,
353 VNC_AUTH_VENCRYPT_X509NONE = 260,
354 VNC_AUTH_VENCRYPT_X509VNC = 261,
355 VNC_AUTH_VENCRYPT_X509PLAIN = 262,
aliguori2f9606b2009-03-06 20:27:28 +0000356 VNC_AUTH_VENCRYPT_X509SASL = 263,
357 VNC_AUTH_VENCRYPT_TLSSASL = 264,
aliguorie06679f2009-02-02 15:58:25 +0000358};
359
aliguorie06679f2009-02-02 15:58:25 +0000360
361/*****************************************************************************
362 *
363 * Encoding types
364 *
365 *****************************************************************************/
366
367#define VNC_ENCODING_RAW 0x00000000
368#define VNC_ENCODING_COPYRECT 0x00000001
369#define VNC_ENCODING_RRE 0x00000002
370#define VNC_ENCODING_CORRE 0x00000004
371#define VNC_ENCODING_HEXTILE 0x00000005
372#define VNC_ENCODING_ZLIB 0x00000006
373#define VNC_ENCODING_TIGHT 0x00000007
374#define VNC_ENCODING_ZLIBHEX 0x00000008
375#define VNC_ENCODING_TRLE 0x0000000f
376#define VNC_ENCODING_ZRLE 0x00000010
377#define VNC_ENCODING_ZYWRLE 0x00000011
378#define VNC_ENCODING_COMPRESSLEVEL0 0xFFFFFF00 /* -256 */
379#define VNC_ENCODING_QUALITYLEVEL0 0xFFFFFFE0 /* -32 */
380#define VNC_ENCODING_XCURSOR 0xFFFFFF10 /* -240 */
381#define VNC_ENCODING_RICH_CURSOR 0xFFFFFF11 /* -239 */
382#define VNC_ENCODING_POINTER_POS 0xFFFFFF18 /* -232 */
383#define VNC_ENCODING_LASTRECT 0xFFFFFF20 /* -224 */
384#define VNC_ENCODING_DESKTOPRESIZE 0xFFFFFF21 /* -223 */
385#define VNC_ENCODING_POINTER_TYPE_CHANGE 0XFFFFFEFF /* -257 */
386#define VNC_ENCODING_EXT_KEY_EVENT 0XFFFFFEFE /* -258 */
387#define VNC_ENCODING_AUDIO 0XFFFFFEFD /* -259 */
Corentin Charyefe556a2010-07-07 20:57:56 +0200388#define VNC_ENCODING_TIGHT_PNG 0xFFFFFEFC /* -260 */
Lei Liab99e5c2013-04-25 13:29:10 +0800389#define VNC_ENCODING_LED_STATE 0XFFFFFEFB /* -261 */
aliguorie06679f2009-02-02 15:58:25 +0000390#define VNC_ENCODING_WMVi 0x574D5669
391
392/*****************************************************************************
393 *
394 * Other tight constants
395 *
396 *****************************************************************************/
397
398/*
399 * Vendors known by TightVNC: standard VNC/RealVNC, TridiaVNC, and TightVNC.
400 */
401
402#define VNC_TIGHT_CCB_RESET_MASK (0x0f)
403#define VNC_TIGHT_CCB_TYPE_MASK (0x0f << 4)
404#define VNC_TIGHT_CCB_TYPE_FILL (0x08 << 4)
405#define VNC_TIGHT_CCB_TYPE_JPEG (0x09 << 4)
Corentin Charyefe556a2010-07-07 20:57:56 +0200406#define VNC_TIGHT_CCB_TYPE_PNG (0x0A << 4)
aliguorie06679f2009-02-02 15:58:25 +0000407#define VNC_TIGHT_CCB_BASIC_MAX (0x07 << 4)
408#define VNC_TIGHT_CCB_BASIC_ZLIB (0x03 << 4)
409#define VNC_TIGHT_CCB_BASIC_FILTER (0x04 << 4)
410
411/*****************************************************************************
412 *
413 * Features
414 *
415 *****************************************************************************/
416
417#define VNC_FEATURE_RESIZE 0
418#define VNC_FEATURE_HEXTILE 1
419#define VNC_FEATURE_POINTER_TYPE_CHANGE 2
420#define VNC_FEATURE_WMVI 3
421#define VNC_FEATURE_TIGHT 4
422#define VNC_FEATURE_ZLIB 5
aliguori753b4052009-02-16 14:59:30 +0000423#define VNC_FEATURE_COPYRECT 6
Gerd Hoffmannd467b672010-05-21 11:54:34 +0200424#define VNC_FEATURE_RICH_CURSOR 7
Corentin Charyefe556a2010-07-07 20:57:56 +0200425#define VNC_FEATURE_TIGHT_PNG 8
Corentin Chary148954f2011-02-04 09:06:01 +0100426#define VNC_FEATURE_ZRLE 9
427#define VNC_FEATURE_ZYWRLE 10
Lei Liab99e5c2013-04-25 13:29:10 +0800428#define VNC_FEATURE_LED_STATE 11
aliguorie06679f2009-02-02 15:58:25 +0000429
430#define VNC_FEATURE_RESIZE_MASK (1 << VNC_FEATURE_RESIZE)
431#define VNC_FEATURE_HEXTILE_MASK (1 << VNC_FEATURE_HEXTILE)
432#define VNC_FEATURE_POINTER_TYPE_CHANGE_MASK (1 << VNC_FEATURE_POINTER_TYPE_CHANGE)
433#define VNC_FEATURE_WMVI_MASK (1 << VNC_FEATURE_WMVI)
434#define VNC_FEATURE_TIGHT_MASK (1 << VNC_FEATURE_TIGHT)
435#define VNC_FEATURE_ZLIB_MASK (1 << VNC_FEATURE_ZLIB)
aliguori753b4052009-02-16 14:59:30 +0000436#define VNC_FEATURE_COPYRECT_MASK (1 << VNC_FEATURE_COPYRECT)
Gerd Hoffmannd467b672010-05-21 11:54:34 +0200437#define VNC_FEATURE_RICH_CURSOR_MASK (1 << VNC_FEATURE_RICH_CURSOR)
Corentin Charyefe556a2010-07-07 20:57:56 +0200438#define VNC_FEATURE_TIGHT_PNG_MASK (1 << VNC_FEATURE_TIGHT_PNG)
Corentin Chary148954f2011-02-04 09:06:01 +0100439#define VNC_FEATURE_ZRLE_MASK (1 << VNC_FEATURE_ZRLE)
440#define VNC_FEATURE_ZYWRLE_MASK (1 << VNC_FEATURE_ZYWRLE)
Lei Liab99e5c2013-04-25 13:29:10 +0800441#define VNC_FEATURE_LED_STATE_MASK (1 << VNC_FEATURE_LED_STATE)
aliguorie06679f2009-02-02 15:58:25 +0000442
aliguori5fb6c7a2009-03-06 20:27:23 +0000443
Daniel P. Berrange46a183d2010-03-31 18:20:43 +0100444/* Client -> Server message IDs */
445#define VNC_MSG_CLIENT_SET_PIXEL_FORMAT 0
446#define VNC_MSG_CLIENT_SET_ENCODINGS 2
447#define VNC_MSG_CLIENT_FRAMEBUFFER_UPDATE_REQUEST 3
448#define VNC_MSG_CLIENT_KEY_EVENT 4
449#define VNC_MSG_CLIENT_POINTER_EVENT 5
450#define VNC_MSG_CLIENT_CUT_TEXT 6
451#define VNC_MSG_CLIENT_VMWARE_0 127
452#define VNC_MSG_CLIENT_CALL_CONTROL 249
453#define VNC_MSG_CLIENT_XVP 250
454#define VNC_MSG_CLIENT_SET_DESKTOP_SIZE 251
455#define VNC_MSG_CLIENT_TIGHT 252
456#define VNC_MSG_CLIENT_GII 253
457#define VNC_MSG_CLIENT_VMWARE_1 254
458#define VNC_MSG_CLIENT_QEMU 255
459
460/* Server -> Client message IDs */
461#define VNC_MSG_SERVER_FRAMEBUFFER_UPDATE 0
462#define VNC_MSG_SERVER_SET_COLOUR_MAP_ENTRIES 1
463#define VNC_MSG_SERVER_BELL 2
464#define VNC_MSG_SERVER_CUT_TEXT 3
465#define VNC_MSG_SERVER_VMWARE_0 127
466#define VNC_MSG_SERVER_CALL_CONTROL 249
467#define VNC_MSG_SERVER_XVP 250
468#define VNC_MSG_SERVER_TIGHT 252
469#define VNC_MSG_SERVER_GII 253
470#define VNC_MSG_SERVER_VMWARE_1 254
471#define VNC_MSG_SERVER_QEMU 255
472
473
474
475/* QEMU client -> server message IDs */
476#define VNC_MSG_CLIENT_QEMU_EXT_KEY_EVENT 0
477#define VNC_MSG_CLIENT_QEMU_AUDIO 1
478
479/* QEMU server -> client message IDs */
480#define VNC_MSG_SERVER_QEMU_AUDIO 1
481
482
483
484/* QEMU client -> server audio message IDs */
485#define VNC_MSG_CLIENT_QEMU_AUDIO_ENABLE 0
486#define VNC_MSG_CLIENT_QEMU_AUDIO_DISABLE 1
487#define VNC_MSG_CLIENT_QEMU_AUDIO_SET_FORMAT 2
488
489/* QEMU server -> client audio message IDs */
490#define VNC_MSG_SERVER_QEMU_AUDIO_END 0
491#define VNC_MSG_SERVER_QEMU_AUDIO_BEGIN 1
492#define VNC_MSG_SERVER_QEMU_AUDIO_DATA 2
493
494
aliguori5fb6c7a2009-03-06 20:27:23 +0000495/*****************************************************************************
496 *
497 * Internal APIs
498 *
499 *****************************************************************************/
500
501/* Event loop functions */
502void vnc_client_read(void *opaque);
503void vnc_client_write(void *opaque);
504
Daniel P. Berrangefdd1ab62015-08-06 15:35:55 +0100505ssize_t vnc_client_read_buf(VncState *vs, uint8_t *data, size_t datalen);
506ssize_t vnc_client_write_buf(VncState *vs, const uint8_t *data, size_t datalen);
Daniel P. Berrange3e305e42015-08-06 14:39:32 +0100507ssize_t vnc_tls_pull(char *buf, size_t len, void *opaque);
508ssize_t vnc_tls_push(const char *buf, size_t len, void *opaque);
aliguori5fb6c7a2009-03-06 20:27:23 +0000509
510/* Protocol I/O functions */
511void vnc_write(VncState *vs, const void *data, size_t len);
512void vnc_write_u32(VncState *vs, uint32_t value);
513void vnc_write_s32(VncState *vs, int32_t value);
514void vnc_write_u16(VncState *vs, uint16_t value);
515void vnc_write_u8(VncState *vs, uint8_t value);
516void vnc_flush(VncState *vs);
517void vnc_read_when(VncState *vs, VncReadEvent *func, size_t expecting);
Tim Hardeck7536ee42013-01-21 11:04:44 +0100518void vnc_disconnect_finish(VncState *vs);
519void vnc_init_state(VncState *vs);
aliguori5fb6c7a2009-03-06 20:27:23 +0000520
521
522/* Buffer I/O functions */
aliguori5fb6c7a2009-03-06 20:27:23 +0000523uint32_t read_u32(uint8_t *data, size_t offset);
524
525/* Protocol stage functions */
526void vnc_client_error(VncState *vs);
Daniel P. Berrangefdd1ab62015-08-06 15:35:55 +0100527ssize_t vnc_client_io_error(VncState *vs, ssize_t ret, int last_errno);
aliguori5fb6c7a2009-03-06 20:27:23 +0000528
529void start_client_init(VncState *vs);
530void start_auth_vnc(VncState *vs);
531
aliguori2f9606b2009-03-06 20:27:28 +0000532
533/* Misc helpers */
534
535char *vnc_socket_local_addr(const char *format, int fd);
536char *vnc_socket_remote_addr(const char *format, int fd);
537
Corentin Charyefe556a2010-07-07 20:57:56 +0200538static inline uint32_t vnc_has_feature(VncState *vs, int feature) {
539 return (vs->features & (1 << feature));
540}
541
Corentin Chary70a45682010-05-03 14:31:34 +0200542/* Framebuffer */
543void vnc_framebuffer_update(VncState *vs, int x, int y, int w, int h,
544 int32_t encoding);
545
Gerd Hoffmann9f649162012-10-10 13:29:43 +0200546/* server fb is in PIXMAN_x8r8g8b8 */
547#define VNC_SERVER_FB_FORMAT PIXMAN_FORMAT(32, PIXMAN_TYPE_ARGB, 0, 8, 8, 8)
548#define VNC_SERVER_FB_BITS (PIXMAN_FORMAT_BPP(VNC_SERVER_FB_FORMAT))
549#define VNC_SERVER_FB_BYTES ((VNC_SERVER_FB_BITS+7)/8)
550
551void *vnc_server_fb_ptr(VncDisplay *vd, int x, int y);
552int vnc_server_fb_stride(VncDisplay *vd);
553
Corentin Chary70a45682010-05-03 14:31:34 +0200554void vnc_convert_pixel(VncState *vs, uint8_t *buf, uint32_t v);
Corentin Chary999342a2011-02-04 09:05:55 +0100555double vnc_update_freq(VncState *vs, int x, int y, int w, int h);
Corentin Chary7d964c92011-02-04 09:05:56 +0100556void vnc_sent_lossy_rect(VncState *vs, int x, int y, int w, int h);
Corentin Chary70a45682010-05-03 14:31:34 +0200557
558/* Encodings */
Corentin Charybd023f92010-07-07 20:58:02 +0200559int vnc_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
560
Corentin Charya8852112010-05-19 09:24:09 +0200561int vnc_raw_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
Corentin Chary70a45682010-05-03 14:31:34 +0200562
Corentin Charya8852112010-05-19 09:24:09 +0200563int vnc_hextile_send_framebuffer_update(VncState *vs, int x,
Corentin Chary70a45682010-05-03 14:31:34 +0200564 int y, int w, int h);
565void vnc_hextile_set_pixel_conversion(VncState *vs, int generic);
566
Corentin Chary380282b2010-05-19 09:24:10 +0200567void *vnc_zlib_zalloc(void *x, unsigned items, unsigned size);
568void vnc_zlib_zfree(void *x, void *addr);
Corentin Charya8852112010-05-19 09:24:09 +0200569int vnc_zlib_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
Corentin Chary161c4f22010-05-19 09:24:08 +0200570void vnc_zlib_clear(VncState *vs);
Corentin Chary70a45682010-05-03 14:31:34 +0200571
Corentin Chary380282b2010-05-19 09:24:10 +0200572int vnc_tight_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
Corentin Charyefe556a2010-07-07 20:57:56 +0200573int vnc_tight_png_send_framebuffer_update(VncState *vs, int x, int y,
574 int w, int h);
Corentin Chary380282b2010-05-19 09:24:10 +0200575void vnc_tight_clear(VncState *vs);
576
Corentin Chary148954f2011-02-04 09:06:01 +0100577int vnc_zrle_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
578int vnc_zywrle_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
579void vnc_zrle_clear(VncState *vs);
580
aliguori19a490b2009-03-06 20:27:13 +0000581#endif /* __QEMU_VNC_H */