Statistics
| Branch: | Revision:

root / ui / vnc.h @ d1af0e05

History | View | Annotate | Download (13.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 "console.h"
33
#include "monitor.h"
34
#include "audio/audio.h"
35
#include <zlib.h>
36
#include <stdbool.h>
37

    
38
#include "keymaps.h"
39

    
40
// #define _VNC_DEBUG 1
41

    
42
#ifdef _VNC_DEBUG
43
#define VNC_DEBUG(fmt, ...) do { fprintf(stderr, fmt, ## __VA_ARGS__); } while (0)
44
#else
45
#define VNC_DEBUG(fmt, ...) do { } while (0)
46
#endif
47

    
48
/*****************************************************************************
49
 *
50
 * Core data structures
51
 *
52
 *****************************************************************************/
53

    
54
typedef struct Buffer
55
{
56
    size_t capacity;
57
    size_t offset;
58
    uint8_t *buffer;
59
} Buffer;
60

    
61
typedef struct VncState VncState;
62

    
63
typedef int VncReadEvent(VncState *vs, uint8_t *data, size_t len);
64

    
65
typedef void VncWritePixels(VncState *vs, struct PixelFormat *pf, void *data, int size);
66

    
67
typedef void VncSendHextileTile(VncState *vs,
68
                                int x, int y, int w, int h,
69
                                void *last_bg,
70
                                void *last_fg,
71
                                int *has_bg, int *has_fg);
72

    
73
#define VNC_MAX_WIDTH 2560
74
#define VNC_MAX_HEIGHT 2048
75
#define VNC_DIRTY_WORDS (VNC_MAX_WIDTH / (16 * 32))
76

    
77
#define VNC_AUTH_CHALLENGE_SIZE 16
78

    
79
typedef struct VncDisplay VncDisplay;
80

    
81
#ifdef CONFIG_VNC_TLS
82
#include "vnc-tls.h"
83
#include "vnc-auth-vencrypt.h"
84
#endif
85
#ifdef CONFIG_VNC_SASL
86
#include "vnc-auth-sasl.h"
87
#endif
88

    
89
struct VncSurface
90
{
91
    uint32_t dirty[VNC_MAX_HEIGHT][VNC_DIRTY_WORDS];
92
    DisplaySurface *ds;
93
};
94

    
95
struct VncDisplay
96
{
97
    QTAILQ_HEAD(, VncState) clients;
98
    QEMUTimer *timer;
99
    int timer_interval;
100
    int lsock;
101
    DisplayState *ds;
102
    kbd_layout_t *kbd_layout;
103
    int lock_key_sync;
104

    
105
    QEMUCursor *cursor;
106
    int cursor_msize;
107
    uint8_t *cursor_mask;
108

    
109
    struct VncSurface guest;   /* guest visible surface (aka ds->surface) */
110
    DisplaySurface *server;  /* vnc server surface */
111

    
112
    char *display;
113
    char *password;
114
    int auth;
115
    bool lossy;
116
#ifdef CONFIG_VNC_TLS
117
    int subauth; /* Used by VeNCrypt */
118
    VncDisplayTLS tls;
119
#endif
120
#ifdef CONFIG_VNC_SASL
121
    VncDisplaySASL sasl;
122
#endif
123
};
124

    
125
typedef struct VncTight {
126
    int type;
127
    uint8_t quality;
128
    uint8_t compression;
129
    uint8_t pixel24;
130
    Buffer tight;
131
    Buffer tmp;
132
    Buffer zlib;
133
    Buffer gradient;
134
#ifdef CONFIG_VNC_JPEG
135
    Buffer jpeg;
136
#endif
137
#ifdef CONFIG_VNC_PNG
138
    Buffer png;
139
#endif
140
    int levels[4];
141
    z_stream stream[4];
142
} VncTight;
143

    
144
typedef struct VncHextile {
145
    VncSendHextileTile *send_tile;
146
} VncHextile;
147

    
148
typedef struct VncZlib {
149
    Buffer zlib;
150
    Buffer tmp;
151
    z_stream stream;
152
    int level;
153
} VncZlib;
154

    
155
struct VncState
156
{
157
    int csock;
158

    
159
    DisplayState *ds;
160
    uint32_t dirty[VNC_MAX_HEIGHT][VNC_DIRTY_WORDS];
161

    
162
    VncDisplay *vd;
163
    int need_update;
164
    int force_update;
165
    uint32_t features;
166
    int absolute;
167
    int last_x;
168
    int last_y;
169
    int client_width;
170
    int client_height;
171

    
172
    uint32_t vnc_encoding;
173

    
174
    int major;
175
    int minor;
176

    
177
    char challenge[VNC_AUTH_CHALLENGE_SIZE];
178
#ifdef CONFIG_VNC_TLS
179
    VncStateTLS tls;
180
#endif
181
#ifdef CONFIG_VNC_SASL
182
    VncStateSASL sasl;
183
#endif
184

    
185
    QObject *info;
186

    
187
    Buffer output;
188
    Buffer input;
189
    /* current output mode information */
190
    VncWritePixels *write_pixels;
191
    DisplaySurface clientds;
192

    
193
    CaptureVoiceOut *audio_cap;
194
    struct audsettings as;
195

    
196
    VncReadEvent *read_handler;
197
    size_t read_handler_expect;
198
    /* input */
199
    uint8_t modifiers_state[256];
200
    QEMUPutLEDEntry *led;
201

    
202
    /* Encoding specific */
203
    VncTight tight;
204
    VncZlib zlib;
205
    VncHextile hextile;
206

    
207

    
208
    Notifier mouse_mode_notifier;
209

    
210
    QTAILQ_ENTRY(VncState) next;
211
};
212

    
213

    
214
/*****************************************************************************
215
 *
216
 * Authentication modes
217
 *
218
 *****************************************************************************/
219

    
220
enum {
221
    VNC_AUTH_INVALID = 0,
222
    VNC_AUTH_NONE = 1,
223
    VNC_AUTH_VNC = 2,
224
    VNC_AUTH_RA2 = 5,
225
    VNC_AUTH_RA2NE = 6,
226
    VNC_AUTH_TIGHT = 16,
227
    VNC_AUTH_ULTRA = 17,
228
    VNC_AUTH_TLS = 18,      /* Supported in GTK-VNC & VINO */
229
    VNC_AUTH_VENCRYPT = 19, /* Supported in GTK-VNC & VeNCrypt */
230
    VNC_AUTH_SASL = 20,     /* Supported in GTK-VNC & VINO */
231
};
232

    
233
enum {
234
    VNC_AUTH_VENCRYPT_PLAIN = 256,
235
    VNC_AUTH_VENCRYPT_TLSNONE = 257,
236
    VNC_AUTH_VENCRYPT_TLSVNC = 258,
237
    VNC_AUTH_VENCRYPT_TLSPLAIN = 259,
238
    VNC_AUTH_VENCRYPT_X509NONE = 260,
239
    VNC_AUTH_VENCRYPT_X509VNC = 261,
240
    VNC_AUTH_VENCRYPT_X509PLAIN = 262,
241
    VNC_AUTH_VENCRYPT_X509SASL = 263,
242
    VNC_AUTH_VENCRYPT_TLSSASL = 264,
243
};
244

    
245

    
246
/*****************************************************************************
247
 *
248
 * Encoding types
249
 *
250
 *****************************************************************************/
251

    
252
#define VNC_ENCODING_RAW                  0x00000000
253
#define VNC_ENCODING_COPYRECT             0x00000001
254
#define VNC_ENCODING_RRE                  0x00000002
255
#define VNC_ENCODING_CORRE                0x00000004
256
#define VNC_ENCODING_HEXTILE              0x00000005
257
#define VNC_ENCODING_ZLIB                 0x00000006
258
#define VNC_ENCODING_TIGHT                0x00000007
259
#define VNC_ENCODING_ZLIBHEX              0x00000008
260
#define VNC_ENCODING_TRLE                 0x0000000f
261
#define VNC_ENCODING_ZRLE                 0x00000010
262
#define VNC_ENCODING_ZYWRLE               0x00000011
263
#define VNC_ENCODING_COMPRESSLEVEL0       0xFFFFFF00 /* -256 */
264
#define VNC_ENCODING_QUALITYLEVEL0        0xFFFFFFE0 /* -32  */
265
#define VNC_ENCODING_XCURSOR              0xFFFFFF10 /* -240 */
266
#define VNC_ENCODING_RICH_CURSOR          0xFFFFFF11 /* -239 */
267
#define VNC_ENCODING_POINTER_POS          0xFFFFFF18 /* -232 */
268
#define VNC_ENCODING_LASTRECT             0xFFFFFF20 /* -224 */
269
#define VNC_ENCODING_DESKTOPRESIZE        0xFFFFFF21 /* -223 */
270
#define VNC_ENCODING_POINTER_TYPE_CHANGE  0XFFFFFEFF /* -257 */
271
#define VNC_ENCODING_EXT_KEY_EVENT        0XFFFFFEFE /* -258 */
272
#define VNC_ENCODING_AUDIO                0XFFFFFEFD /* -259 */
273
#define VNC_ENCODING_TIGHT_PNG            0xFFFFFEFC /* -260 */
274
#define VNC_ENCODING_WMVi                 0x574D5669
275

    
276
/*****************************************************************************
277
 *
278
 * Other tight constants
279
 *
280
 *****************************************************************************/
281

    
282
/*
283
 * Vendors known by TightVNC: standard VNC/RealVNC, TridiaVNC, and TightVNC.
284
 */
285

    
286
#define VNC_TIGHT_CCB_RESET_MASK   (0x0f)
287
#define VNC_TIGHT_CCB_TYPE_MASK    (0x0f << 4)
288
#define VNC_TIGHT_CCB_TYPE_FILL    (0x08 << 4)
289
#define VNC_TIGHT_CCB_TYPE_JPEG    (0x09 << 4)
290
#define VNC_TIGHT_CCB_TYPE_PNG     (0x0A << 4)
291
#define VNC_TIGHT_CCB_BASIC_MAX    (0x07 << 4)
292
#define VNC_TIGHT_CCB_BASIC_ZLIB   (0x03 << 4)
293
#define VNC_TIGHT_CCB_BASIC_FILTER (0x04 << 4)
294

    
295
/*****************************************************************************
296
 *
297
 * Features
298
 *
299
 *****************************************************************************/
300

    
301
#define VNC_FEATURE_RESIZE                   0
302
#define VNC_FEATURE_HEXTILE                  1
303
#define VNC_FEATURE_POINTER_TYPE_CHANGE      2
304
#define VNC_FEATURE_WMVI                     3
305
#define VNC_FEATURE_TIGHT                    4
306
#define VNC_FEATURE_ZLIB                     5
307
#define VNC_FEATURE_COPYRECT                 6
308
#define VNC_FEATURE_RICH_CURSOR              7
309
#define VNC_FEATURE_TIGHT_PNG                8
310

    
311
#define VNC_FEATURE_RESIZE_MASK              (1 << VNC_FEATURE_RESIZE)
312
#define VNC_FEATURE_HEXTILE_MASK             (1 << VNC_FEATURE_HEXTILE)
313
#define VNC_FEATURE_POINTER_TYPE_CHANGE_MASK (1 << VNC_FEATURE_POINTER_TYPE_CHANGE)
314
#define VNC_FEATURE_WMVI_MASK                (1 << VNC_FEATURE_WMVI)
315
#define VNC_FEATURE_TIGHT_MASK               (1 << VNC_FEATURE_TIGHT)
316
#define VNC_FEATURE_ZLIB_MASK                (1 << VNC_FEATURE_ZLIB)
317
#define VNC_FEATURE_COPYRECT_MASK            (1 << VNC_FEATURE_COPYRECT)
318
#define VNC_FEATURE_RICH_CURSOR_MASK         (1 << VNC_FEATURE_RICH_CURSOR)
319
#define VNC_FEATURE_TIGHT_PNG_MASK           (1 << VNC_FEATURE_TIGHT_PNG)
320

    
321

    
322
/* Client -> Server message IDs */
323
#define VNC_MSG_CLIENT_SET_PIXEL_FORMAT           0
324
#define VNC_MSG_CLIENT_SET_ENCODINGS              2
325
#define VNC_MSG_CLIENT_FRAMEBUFFER_UPDATE_REQUEST 3
326
#define VNC_MSG_CLIENT_KEY_EVENT                  4
327
#define VNC_MSG_CLIENT_POINTER_EVENT              5
328
#define VNC_MSG_CLIENT_CUT_TEXT                   6
329
#define VNC_MSG_CLIENT_VMWARE_0                   127
330
#define VNC_MSG_CLIENT_CALL_CONTROL               249
331
#define VNC_MSG_CLIENT_XVP                        250
332
#define VNC_MSG_CLIENT_SET_DESKTOP_SIZE           251
333
#define VNC_MSG_CLIENT_TIGHT                      252
334
#define VNC_MSG_CLIENT_GII                        253
335
#define VNC_MSG_CLIENT_VMWARE_1                   254
336
#define VNC_MSG_CLIENT_QEMU                       255
337

    
338
/* Server -> Client message IDs */
339
#define VNC_MSG_SERVER_FRAMEBUFFER_UPDATE         0
340
#define VNC_MSG_SERVER_SET_COLOUR_MAP_ENTRIES     1
341
#define VNC_MSG_SERVER_BELL                       2
342
#define VNC_MSG_SERVER_CUT_TEXT                   3
343
#define VNC_MSG_SERVER_VMWARE_0                   127
344
#define VNC_MSG_SERVER_CALL_CONTROL               249
345
#define VNC_MSG_SERVER_XVP                        250
346
#define VNC_MSG_SERVER_TIGHT                      252
347
#define VNC_MSG_SERVER_GII                        253
348
#define VNC_MSG_SERVER_VMWARE_1                   254
349
#define VNC_MSG_SERVER_QEMU                       255
350

    
351

    
352

    
353
/* QEMU client -> server message IDs */
354
#define VNC_MSG_CLIENT_QEMU_EXT_KEY_EVENT         0
355
#define VNC_MSG_CLIENT_QEMU_AUDIO                 1
356

    
357
/* QEMU server -> client message IDs */
358
#define VNC_MSG_SERVER_QEMU_AUDIO                 1
359

    
360

    
361

    
362
/* QEMU client -> server audio message IDs */
363
#define VNC_MSG_CLIENT_QEMU_AUDIO_ENABLE          0
364
#define VNC_MSG_CLIENT_QEMU_AUDIO_DISABLE         1
365
#define VNC_MSG_CLIENT_QEMU_AUDIO_SET_FORMAT      2
366

    
367
/* QEMU server -> client audio message IDs */
368
#define VNC_MSG_SERVER_QEMU_AUDIO_END             0
369
#define VNC_MSG_SERVER_QEMU_AUDIO_BEGIN           1
370
#define VNC_MSG_SERVER_QEMU_AUDIO_DATA            2
371

    
372

    
373
/*****************************************************************************
374
 *
375
 * Internal APIs
376
 *
377
 *****************************************************************************/
378

    
379
/* Event loop functions */
380
void vnc_client_read(void *opaque);
381
void vnc_client_write(void *opaque);
382

    
383
long vnc_client_read_buf(VncState *vs, uint8_t *data, size_t datalen);
384
long vnc_client_write_buf(VncState *vs, const uint8_t *data, size_t datalen);
385

    
386
/* Protocol I/O functions */
387
void vnc_write(VncState *vs, const void *data, size_t len);
388
void vnc_write_u32(VncState *vs, uint32_t value);
389
void vnc_write_s32(VncState *vs, int32_t value);
390
void vnc_write_u16(VncState *vs, uint16_t value);
391
void vnc_write_u8(VncState *vs, uint8_t value);
392
void vnc_flush(VncState *vs);
393
void vnc_read_when(VncState *vs, VncReadEvent *func, size_t expecting);
394

    
395

    
396
/* Buffer I/O functions */
397
uint8_t read_u8(uint8_t *data, size_t offset);
398
uint16_t read_u16(uint8_t *data, size_t offset);
399
int32_t read_s32(uint8_t *data, size_t offset);
400
uint32_t read_u32(uint8_t *data, size_t offset);
401

    
402
/* Protocol stage functions */
403
void vnc_client_error(VncState *vs);
404
int vnc_client_io_error(VncState *vs, int ret, int last_errno);
405

    
406
void start_client_init(VncState *vs);
407
void start_auth_vnc(VncState *vs);
408

    
409
/* Buffer management */
410
void buffer_reserve(Buffer *buffer, size_t len);
411
int buffer_empty(Buffer *buffer);
412
uint8_t *buffer_end(Buffer *buffer);
413
void buffer_reset(Buffer *buffer);
414
void buffer_free(Buffer *buffer);
415
void buffer_append(Buffer *buffer, const void *data, size_t len);
416

    
417

    
418
/* Misc helpers */
419

    
420
char *vnc_socket_local_addr(const char *format, int fd);
421
char *vnc_socket_remote_addr(const char *format, int fd);
422

    
423
static inline uint32_t vnc_has_feature(VncState *vs, int feature) {
424
    return (vs->features & (1 << feature));
425
}
426

    
427
/* Framebuffer */
428
void vnc_framebuffer_update(VncState *vs, int x, int y, int w, int h,
429
                            int32_t encoding);
430

    
431
void vnc_convert_pixel(VncState *vs, uint8_t *buf, uint32_t v);
432

    
433
/* Encodings */
434
int vnc_raw_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
435

    
436
int vnc_hextile_send_framebuffer_update(VncState *vs, int x,
437
                                         int y, int w, int h);
438
void vnc_hextile_set_pixel_conversion(VncState *vs, int generic);
439

    
440
void *vnc_zlib_zalloc(void *x, unsigned items, unsigned size);
441
void vnc_zlib_zfree(void *x, void *addr);
442
int vnc_zlib_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
443
void vnc_zlib_clear(VncState *vs);
444

    
445
int vnc_tight_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
446
int vnc_tight_png_send_framebuffer_update(VncState *vs, int x, int y,
447
                                          int w, int h);
448
void vnc_tight_clear(VncState *vs);
449

    
450
#endif /* __QEMU_VNC_H */