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