Statistics
| Branch: | Revision:

root / ui / vnc.h @ 1de7afc9

History | View | Annotate | Download (16.8 kB)

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"
31
#include "qemu/queue.h"
32
#include "qemu/thread.h"
33
#include "ui/console.h"
34
#include "monitor/monitor.h"
35
#include "audio/audio.h"
36
#include "qemu/bitmap.h"
37
#include <zlib.h>
38
#include <stdbool.h>
39

    
40
#include "keymaps.h"
41
#include "vnc-palette.h"
42
#include "vnc-enc-zrle.h"
43

    
44
// #define _VNC_DEBUG 1
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
 * Core data structures
55
 *
56
 *****************************************************************************/
57

    
58
typedef struct Buffer
59
{
60
    size_t capacity;
61
    size_t offset;
62
    uint8_t *buffer;
63
} Buffer;
64

    
65
typedef struct VncState VncState;
66
typedef struct VncJob VncJob;
67
typedef struct VncRect VncRect;
68
typedef struct VncRectEntry VncRectEntry;
69

    
70
typedef int VncReadEvent(VncState *vs, uint8_t *data, size_t len);
71

    
72
typedef void VncWritePixels(VncState *vs, void *data, int size);
73

    
74
typedef 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
/* VNC_MAX_WIDTH must be a multiple of 16. */
81
#define VNC_MAX_WIDTH 2560
82
#define VNC_MAX_HEIGHT 2048
83

    
84
/* VNC_DIRTY_BITS is the number of bits in the dirty bitmap. */
85
#define VNC_DIRTY_BITS (VNC_MAX_WIDTH / 16)
86

    
87
#define VNC_STAT_RECT  64
88
#define VNC_STAT_COLS (VNC_MAX_WIDTH / VNC_STAT_RECT)
89
#define VNC_STAT_ROWS (VNC_MAX_HEIGHT / VNC_STAT_RECT)
90

    
91
#define VNC_AUTH_CHALLENGE_SIZE 16
92

    
93
typedef struct VncDisplay VncDisplay;
94

    
95
#ifdef CONFIG_VNC_TLS
96
#include "vnc-tls.h"
97
#include "vnc-auth-vencrypt.h"
98
#endif
99
#ifdef CONFIG_VNC_SASL
100
#include "vnc-auth-sasl.h"
101
#endif
102

    
103
struct VncRectStat
104
{
105
    /* time of last 10 updates, to find update frequency */
106
    struct timeval times[10];
107
    int idx;
108

    
109
    double freq;        /* Update frequency (in Hz) */
110
    bool updated;       /* Already updated during this refresh */
111
};
112

    
113
typedef struct VncRectStat VncRectStat;
114

    
115
struct VncSurface
116
{
117
    struct timeval last_freq_check;
118
    DECLARE_BITMAP(dirty[VNC_MAX_HEIGHT], VNC_MAX_WIDTH / 16);
119
    VncRectStat stats[VNC_STAT_ROWS][VNC_STAT_COLS];
120
    pixman_image_t *fb;
121
    pixman_format_code_t format;
122
};
123

    
124
typedef enum VncShareMode {
125
    VNC_SHARE_MODE_CONNECTING = 1,
126
    VNC_SHARE_MODE_SHARED,
127
    VNC_SHARE_MODE_EXCLUSIVE,
128
    VNC_SHARE_MODE_DISCONNECTED,
129
} VncShareMode;
130

    
131
typedef enum VncSharePolicy {
132
    VNC_SHARE_POLICY_IGNORE = 1,
133
    VNC_SHARE_POLICY_ALLOW_EXCLUSIVE,
134
    VNC_SHARE_POLICY_FORCE_SHARED,
135
} VncSharePolicy;
136

    
137
struct VncDisplay
138
{
139
    QTAILQ_HEAD(, VncState) clients;
140
    int num_exclusive;
141
    VncSharePolicy share_policy;
142
    QEMUTimer *timer;
143
    int timer_interval;
144
    int lsock;
145
    DisplayState *ds;
146
    kbd_layout_t *kbd_layout;
147
    int lock_key_sync;
148
    QemuMutex mutex;
149

    
150
    QEMUCursor *cursor;
151
    int cursor_msize;
152
    uint8_t *cursor_mask;
153

    
154
    struct VncSurface guest;   /* guest visible surface (aka ds->surface) */
155
    pixman_image_t *server;    /* vnc server surface */
156

    
157
    char *display;
158
    char *password;
159
    time_t expires;
160
    int auth;
161
    bool lossy;
162
    bool non_adaptive;
163
#ifdef CONFIG_VNC_TLS
164
    int subauth; /* Used by VeNCrypt */
165
    VncDisplayTLS tls;
166
#endif
167
#ifdef CONFIG_VNC_SASL
168
    VncDisplaySASL sasl;
169
#endif
170
};
171

    
172
typedef struct VncTight {
173
    int type;
174
    uint8_t quality;
175
    uint8_t compression;
176
    uint8_t pixel24;
177
    Buffer tight;
178
    Buffer tmp;
179
    Buffer zlib;
180
    Buffer gradient;
181
#ifdef CONFIG_VNC_JPEG
182
    Buffer jpeg;
183
#endif
184
#ifdef CONFIG_VNC_PNG
185
    Buffer png;
186
#endif
187
    int levels[4];
188
    z_stream stream[4];
189
} VncTight;
190

    
191
typedef struct VncHextile {
192
    VncSendHextileTile *send_tile;
193
} VncHextile;
194

    
195
typedef struct VncZlib {
196
    Buffer zlib;
197
    Buffer tmp;
198
    z_stream stream;
199
    int level;
200
} VncZlib;
201

    
202
typedef struct VncZrle {
203
    int type;
204
    Buffer fb;
205
    Buffer zrle;
206
    Buffer tmp;
207
    Buffer zlib;
208
    z_stream stream;
209
    VncPalette palette;
210
} VncZrle;
211

    
212
typedef struct VncZywrle {
213
    int buf[VNC_ZRLE_TILE_WIDTH * VNC_ZRLE_TILE_HEIGHT];
214
} VncZywrle;
215

    
216
struct VncRect
217
{
218
    int x;
219
    int y;
220
    int w;
221
    int h;
222
};
223

    
224
struct VncRectEntry
225
{
226
    struct VncRect rect;
227
    QLIST_ENTRY(VncRectEntry) next;
228
};
229

    
230
struct VncJob
231
{
232
    VncState *vs;
233

    
234
    QLIST_HEAD(, VncRectEntry) rectangles;
235
    QTAILQ_ENTRY(VncJob) next;
236
};
237

    
238
struct VncState
239
{
240
    int csock;
241

    
242
    DisplayState *ds;
243
    DECLARE_BITMAP(dirty[VNC_MAX_HEIGHT], VNC_DIRTY_BITS);
244
    uint8_t **lossy_rect; /* Not an Array to avoid costly memcpy in
245
                           * vnc-jobs-async.c */
246

    
247
    VncDisplay *vd;
248
    int need_update;
249
    int force_update;
250
    uint32_t features;
251
    int absolute;
252
    int last_x;
253
    int last_y;
254
    int client_width;
255
    int client_height;
256
    VncShareMode share_mode;
257

    
258
    uint32_t vnc_encoding;
259

    
260
    int major;
261
    int minor;
262

    
263
    int auth;
264
    char challenge[VNC_AUTH_CHALLENGE_SIZE];
265
#ifdef CONFIG_VNC_TLS
266
    int subauth; /* Used by VeNCrypt */
267
    VncStateTLS tls;
268
#endif
269
#ifdef CONFIG_VNC_SASL
270
    VncStateSASL sasl;
271
#endif
272

    
273
    QObject *info;
274

    
275
    Buffer output;
276
    Buffer input;
277
    /* current output mode information */
278
    VncWritePixels *write_pixels;
279
    PixelFormat client_pf;
280
    pixman_format_code_t client_format;
281
    bool client_be;
282

    
283
    CaptureVoiceOut *audio_cap;
284
    struct audsettings as;
285

    
286
    VncReadEvent *read_handler;
287
    size_t read_handler_expect;
288
    /* input */
289
    uint8_t modifiers_state[256];
290
    QEMUPutLEDEntry *led;
291

    
292
    bool abort;
293
    QemuMutex output_mutex;
294
    QEMUBH *bh;
295
    Buffer jobs_buffer;
296

    
297
    /* Encoding specific, if you add something here, don't forget to
298
     *  update vnc_async_encoding_start()
299
     */
300
    VncTight tight;
301
    VncZlib zlib;
302
    VncHextile hextile;
303
    VncZrle zrle;
304
    VncZywrle zywrle;
305

    
306
    Notifier mouse_mode_notifier;
307

    
308
    QTAILQ_ENTRY(VncState) next;
309
};
310

    
311

    
312
/*****************************************************************************
313
 *
314
 * Authentication modes
315
 *
316
 *****************************************************************************/
317

    
318
enum {
319
    VNC_AUTH_INVALID = 0,
320
    VNC_AUTH_NONE = 1,
321
    VNC_AUTH_VNC = 2,
322
    VNC_AUTH_RA2 = 5,
323
    VNC_AUTH_RA2NE = 6,
324
    VNC_AUTH_TIGHT = 16,
325
    VNC_AUTH_ULTRA = 17,
326
    VNC_AUTH_TLS = 18,      /* Supported in GTK-VNC & VINO */
327
    VNC_AUTH_VENCRYPT = 19, /* Supported in GTK-VNC & VeNCrypt */
328
    VNC_AUTH_SASL = 20,     /* Supported in GTK-VNC & VINO */
329
};
330

    
331
enum {
332
    VNC_AUTH_VENCRYPT_PLAIN = 256,
333
    VNC_AUTH_VENCRYPT_TLSNONE = 257,
334
    VNC_AUTH_VENCRYPT_TLSVNC = 258,
335
    VNC_AUTH_VENCRYPT_TLSPLAIN = 259,
336
    VNC_AUTH_VENCRYPT_X509NONE = 260,
337
    VNC_AUTH_VENCRYPT_X509VNC = 261,
338
    VNC_AUTH_VENCRYPT_X509PLAIN = 262,
339
    VNC_AUTH_VENCRYPT_X509SASL = 263,
340
    VNC_AUTH_VENCRYPT_TLSSASL = 264,
341
};
342

    
343

    
344
/*****************************************************************************
345
 *
346
 * Encoding types
347
 *
348
 *****************************************************************************/
349

    
350
#define VNC_ENCODING_RAW                  0x00000000
351
#define VNC_ENCODING_COPYRECT             0x00000001
352
#define VNC_ENCODING_RRE                  0x00000002
353
#define VNC_ENCODING_CORRE                0x00000004
354
#define VNC_ENCODING_HEXTILE              0x00000005
355
#define VNC_ENCODING_ZLIB                 0x00000006
356
#define VNC_ENCODING_TIGHT                0x00000007
357
#define VNC_ENCODING_ZLIBHEX              0x00000008
358
#define VNC_ENCODING_TRLE                 0x0000000f
359
#define VNC_ENCODING_ZRLE                 0x00000010
360
#define VNC_ENCODING_ZYWRLE               0x00000011
361
#define VNC_ENCODING_COMPRESSLEVEL0       0xFFFFFF00 /* -256 */
362
#define VNC_ENCODING_QUALITYLEVEL0        0xFFFFFFE0 /* -32  */
363
#define VNC_ENCODING_XCURSOR              0xFFFFFF10 /* -240 */
364
#define VNC_ENCODING_RICH_CURSOR          0xFFFFFF11 /* -239 */
365
#define VNC_ENCODING_POINTER_POS          0xFFFFFF18 /* -232 */
366
#define VNC_ENCODING_LASTRECT             0xFFFFFF20 /* -224 */
367
#define VNC_ENCODING_DESKTOPRESIZE        0xFFFFFF21 /* -223 */
368
#define VNC_ENCODING_POINTER_TYPE_CHANGE  0XFFFFFEFF /* -257 */
369
#define VNC_ENCODING_EXT_KEY_EVENT        0XFFFFFEFE /* -258 */
370
#define VNC_ENCODING_AUDIO                0XFFFFFEFD /* -259 */
371
#define VNC_ENCODING_TIGHT_PNG            0xFFFFFEFC /* -260 */
372
#define VNC_ENCODING_WMVi                 0x574D5669
373

    
374
/*****************************************************************************
375
 *
376
 * Other tight constants
377
 *
378
 *****************************************************************************/
379

    
380
/*
381
 * Vendors known by TightVNC: standard VNC/RealVNC, TridiaVNC, and TightVNC.
382
 */
383

    
384
#define VNC_TIGHT_CCB_RESET_MASK   (0x0f)
385
#define VNC_TIGHT_CCB_TYPE_MASK    (0x0f << 4)
386
#define VNC_TIGHT_CCB_TYPE_FILL    (0x08 << 4)
387
#define VNC_TIGHT_CCB_TYPE_JPEG    (0x09 << 4)
388
#define VNC_TIGHT_CCB_TYPE_PNG     (0x0A << 4)
389
#define VNC_TIGHT_CCB_BASIC_MAX    (0x07 << 4)
390
#define VNC_TIGHT_CCB_BASIC_ZLIB   (0x03 << 4)
391
#define VNC_TIGHT_CCB_BASIC_FILTER (0x04 << 4)
392

    
393
/*****************************************************************************
394
 *
395
 * Features
396
 *
397
 *****************************************************************************/
398

    
399
#define VNC_FEATURE_RESIZE                   0
400
#define VNC_FEATURE_HEXTILE                  1
401
#define VNC_FEATURE_POINTER_TYPE_CHANGE      2
402
#define VNC_FEATURE_WMVI                     3
403
#define VNC_FEATURE_TIGHT                    4
404
#define VNC_FEATURE_ZLIB                     5
405
#define VNC_FEATURE_COPYRECT                 6
406
#define VNC_FEATURE_RICH_CURSOR              7
407
#define VNC_FEATURE_TIGHT_PNG                8
408
#define VNC_FEATURE_ZRLE                     9
409
#define VNC_FEATURE_ZYWRLE                  10
410

    
411
#define VNC_FEATURE_RESIZE_MASK              (1 << VNC_FEATURE_RESIZE)
412
#define VNC_FEATURE_HEXTILE_MASK             (1 << VNC_FEATURE_HEXTILE)
413
#define VNC_FEATURE_POINTER_TYPE_CHANGE_MASK (1 << VNC_FEATURE_POINTER_TYPE_CHANGE)
414
#define VNC_FEATURE_WMVI_MASK                (1 << VNC_FEATURE_WMVI)
415
#define VNC_FEATURE_TIGHT_MASK               (1 << VNC_FEATURE_TIGHT)
416
#define VNC_FEATURE_ZLIB_MASK                (1 << VNC_FEATURE_ZLIB)
417
#define VNC_FEATURE_COPYRECT_MASK            (1 << VNC_FEATURE_COPYRECT)
418
#define VNC_FEATURE_RICH_CURSOR_MASK         (1 << VNC_FEATURE_RICH_CURSOR)
419
#define VNC_FEATURE_TIGHT_PNG_MASK           (1 << VNC_FEATURE_TIGHT_PNG)
420
#define VNC_FEATURE_ZRLE_MASK                (1 << VNC_FEATURE_ZRLE)
421
#define VNC_FEATURE_ZYWRLE_MASK              (1 << VNC_FEATURE_ZYWRLE)
422

    
423

    
424
/* Client -> Server message IDs */
425
#define VNC_MSG_CLIENT_SET_PIXEL_FORMAT           0
426
#define VNC_MSG_CLIENT_SET_ENCODINGS              2
427
#define VNC_MSG_CLIENT_FRAMEBUFFER_UPDATE_REQUEST 3
428
#define VNC_MSG_CLIENT_KEY_EVENT                  4
429
#define VNC_MSG_CLIENT_POINTER_EVENT              5
430
#define VNC_MSG_CLIENT_CUT_TEXT                   6
431
#define VNC_MSG_CLIENT_VMWARE_0                   127
432
#define VNC_MSG_CLIENT_CALL_CONTROL               249
433
#define VNC_MSG_CLIENT_XVP                        250
434
#define VNC_MSG_CLIENT_SET_DESKTOP_SIZE           251
435
#define VNC_MSG_CLIENT_TIGHT                      252
436
#define VNC_MSG_CLIENT_GII                        253
437
#define VNC_MSG_CLIENT_VMWARE_1                   254
438
#define VNC_MSG_CLIENT_QEMU                       255
439

    
440
/* Server -> Client message IDs */
441
#define VNC_MSG_SERVER_FRAMEBUFFER_UPDATE         0
442
#define VNC_MSG_SERVER_SET_COLOUR_MAP_ENTRIES     1
443
#define VNC_MSG_SERVER_BELL                       2
444
#define VNC_MSG_SERVER_CUT_TEXT                   3
445
#define VNC_MSG_SERVER_VMWARE_0                   127
446
#define VNC_MSG_SERVER_CALL_CONTROL               249
447
#define VNC_MSG_SERVER_XVP                        250
448
#define VNC_MSG_SERVER_TIGHT                      252
449
#define VNC_MSG_SERVER_GII                        253
450
#define VNC_MSG_SERVER_VMWARE_1                   254
451
#define VNC_MSG_SERVER_QEMU                       255
452

    
453

    
454

    
455
/* QEMU client -> server message IDs */
456
#define VNC_MSG_CLIENT_QEMU_EXT_KEY_EVENT         0
457
#define VNC_MSG_CLIENT_QEMU_AUDIO                 1
458

    
459
/* QEMU server -> client message IDs */
460
#define VNC_MSG_SERVER_QEMU_AUDIO                 1
461

    
462

    
463

    
464
/* QEMU client -> server audio message IDs */
465
#define VNC_MSG_CLIENT_QEMU_AUDIO_ENABLE          0
466
#define VNC_MSG_CLIENT_QEMU_AUDIO_DISABLE         1
467
#define VNC_MSG_CLIENT_QEMU_AUDIO_SET_FORMAT      2
468

    
469
/* QEMU server -> client audio message IDs */
470
#define VNC_MSG_SERVER_QEMU_AUDIO_END             0
471
#define VNC_MSG_SERVER_QEMU_AUDIO_BEGIN           1
472
#define VNC_MSG_SERVER_QEMU_AUDIO_DATA            2
473

    
474

    
475
/*****************************************************************************
476
 *
477
 * Internal APIs
478
 *
479
 *****************************************************************************/
480

    
481
/* Event loop functions */
482
void vnc_client_read(void *opaque);
483
void vnc_client_write(void *opaque);
484

    
485
long vnc_client_read_buf(VncState *vs, uint8_t *data, size_t datalen);
486
long vnc_client_write_buf(VncState *vs, const uint8_t *data, size_t datalen);
487

    
488
/* Protocol I/O functions */
489
void vnc_write(VncState *vs, const void *data, size_t len);
490
void vnc_write_u32(VncState *vs, uint32_t value);
491
void vnc_write_s32(VncState *vs, int32_t value);
492
void vnc_write_u16(VncState *vs, uint16_t value);
493
void vnc_write_u8(VncState *vs, uint8_t value);
494
void vnc_flush(VncState *vs);
495
void vnc_read_when(VncState *vs, VncReadEvent *func, size_t expecting);
496

    
497

    
498
/* Buffer I/O functions */
499
uint32_t read_u32(uint8_t *data, size_t offset);
500

    
501
/* Protocol stage functions */
502
void vnc_client_error(VncState *vs);
503
int vnc_client_io_error(VncState *vs, int ret, int last_errno);
504

    
505
void start_client_init(VncState *vs);
506
void start_auth_vnc(VncState *vs);
507

    
508
/* Buffer management */
509
void buffer_reserve(Buffer *buffer, size_t len);
510
void buffer_reset(Buffer *buffer);
511
void buffer_free(Buffer *buffer);
512
void buffer_append(Buffer *buffer, const void *data, size_t len);
513

    
514

    
515
/* Misc helpers */
516

    
517
char *vnc_socket_local_addr(const char *format, int fd);
518
char *vnc_socket_remote_addr(const char *format, int fd);
519

    
520
static inline uint32_t vnc_has_feature(VncState *vs, int feature) {
521
    return (vs->features & (1 << feature));
522
}
523

    
524
/* Framebuffer */
525
void vnc_framebuffer_update(VncState *vs, int x, int y, int w, int h,
526
                            int32_t encoding);
527

    
528
/* server fb is in PIXMAN_x8r8g8b8 */
529
#define VNC_SERVER_FB_FORMAT PIXMAN_FORMAT(32, PIXMAN_TYPE_ARGB, 0, 8, 8, 8)
530
#define VNC_SERVER_FB_BITS   (PIXMAN_FORMAT_BPP(VNC_SERVER_FB_FORMAT))
531
#define VNC_SERVER_FB_BYTES  ((VNC_SERVER_FB_BITS+7)/8)
532

    
533
void *vnc_server_fb_ptr(VncDisplay *vd, int x, int y);
534
int vnc_server_fb_stride(VncDisplay *vd);
535

    
536
void vnc_convert_pixel(VncState *vs, uint8_t *buf, uint32_t v);
537
double vnc_update_freq(VncState *vs, int x, int y, int w, int h);
538
void vnc_sent_lossy_rect(VncState *vs, int x, int y, int w, int h);
539

    
540
/* Encodings */
541
int vnc_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
542

    
543
int vnc_raw_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
544

    
545
int vnc_hextile_send_framebuffer_update(VncState *vs, int x,
546
                                         int y, int w, int h);
547
void vnc_hextile_set_pixel_conversion(VncState *vs, int generic);
548

    
549
void *vnc_zlib_zalloc(void *x, unsigned items, unsigned size);
550
void vnc_zlib_zfree(void *x, void *addr);
551
int vnc_zlib_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
552
void vnc_zlib_clear(VncState *vs);
553

    
554
int vnc_tight_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
555
int vnc_tight_png_send_framebuffer_update(VncState *vs, int x, int y,
556
                                          int w, int h);
557
void vnc_tight_clear(VncState *vs);
558

    
559
int vnc_zrle_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
560
int vnc_zywrle_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
561
void vnc_zrle_clear(VncState *vs);
562

    
563
#endif /* __QEMU_VNC_H */