Skip to content

Commit 8941e02

Browse files
author
Volodymyr Samokhatko
committed
libvncserver: continuous updates
1 parent c06e76c commit 8941e02

File tree

10 files changed

+1135
-12
lines changed

10 files changed

+1135
-12
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,7 @@ set(LIBVNCSERVER_SOURCES
388388
${LIBVNCSERVER_DIR}/ultra.c
389389
${LIBVNCSERVER_DIR}/scale.c
390390
${CRYPTO_SOURCES}
391+
${LIBVNCSERVER_DIR}/flowcontrol.c
391392
${LIBVNCSERVER_DIR}/rfbtimers.c
392393
)
393394

include/rfb/rfb.h

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@ extern "C"
4141
#include <stdio.h>
4242
#include <stdlib.h>
4343
#include <string.h>
44+
#include <rfb/rfblist.h>
4445
#include <rfb/rfbproto.h>
46+
#include <rfb/rfbtimers.h>
4547

4648
#if defined(ANDROID) || defined(LIBVNCSERVER_HAVE_ANDROID)
4749
#include <arpa/inet.h>
@@ -372,9 +374,18 @@ typedef struct _rfbScreenInfo
372374
#ifdef LIBVNCSERVER_HAVE_LIBZ
373375
rfbSetXCutTextUTF8ProcPtr setXCutTextUTF8;
374376
#endif
377+
rfbBool rfbCongestionControl;
375378
} rfbScreenInfo, *rfbScreenInfoPtr;
376379

377380

381+
typedef struct {
382+
struct timeval tv;
383+
unsigned pos, extra;
384+
char congested;
385+
struct rfb_list entry;
386+
} rfbRTTInfo;
387+
388+
378389
/**
379390
* rfbTranslateFnType is the type of translation functions.
380391
*/
@@ -707,6 +718,34 @@ typedef struct _rfbClientRec {
707718
int tightPngDstDataLen;
708719
#endif
709720
#endif
721+
722+
/* flow control extensions */
723+
724+
rfbBool enableCU; /**< client supports Continuous Updates */
725+
rfbBool enableFence; /**< client supports fence extension */
726+
727+
rfbBool continuousUpdates;
728+
sraRegionPtr cuRegion;
729+
730+
rfbTimersPtr timers;
731+
732+
rfbBool pendingSyncFence, syncFence;
733+
uint32_t fenceFlags;
734+
unsigned fenceDataLen;
735+
char fenceData[64];
736+
737+
unsigned lastPosition, extraBuffer;
738+
struct timeval lastUpdate, lastSent;
739+
unsigned baseRTT, congWindow;
740+
rfbBool inSlowStart;
741+
int sockOffset;
742+
struct rfb_list pings;
743+
rfbTimerPtr congestionTimer;
744+
rfbRTTInfo lastPong;
745+
struct timeval lastPongArrival;
746+
int measurements;
747+
struct timeval lastAdjustment;
748+
unsigned minRTT, minCongestedRTT;
710749
} rfbClientRec, *rfbClientPtr;
711750

712751
/**
@@ -755,9 +794,12 @@ extern int rfbMaxClientWait;
755794

756795
extern void rfbInitSockets(rfbScreenInfoPtr rfbScreen);
757796
extern void rfbShutdownSockets(rfbScreenInfoPtr rfbScreen);
797+
extern void rfbCorkSock(int sock);
798+
extern void rfbUncorkSock(int sock);
758799
extern void rfbDisconnectUDPSock(rfbScreenInfoPtr rfbScreen);
759800
extern void rfbCloseClient(rfbClientPtr cl);
760801
extern int rfbReadExact(rfbClientPtr cl, char *buf, int len);
802+
extern int rfbSkipExact(rfbClientPtr cl, int len);
761803
extern int rfbReadExactTimeout(rfbClientPtr cl, char *buf, int len,int timeout);
762804
extern int rfbPeekExactTimeout(rfbClientPtr cl, char *buf, int len,int timeout);
763805
extern int rfbWriteExact(rfbClientPtr cl, const char *buf, int len);

include/rfb/rfbproto.h

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,13 +431,20 @@ typedef struct {
431431
/* Modif cs@2005 */
432432
/* PalmVNC 1.4 & 2.0 SetScale Factor message */
433433
#define rfbPalmVNCSetScaleFactor 0xF
434+
#define rfbEnableContinuousUpdates 150
435+
#define rfbEndOfContinuousUpdates 150
434436
/* Xvp message - bidirectional */
435437
#define rfbXvp 250
436438
/* SetDesktopSize client -> server message */
437439
#define rfbSetDesktopSize 251
438440
#define rfbQemuEvent 255
439441

440442

443+
/*-----------------------------------------------------------------------------
444+
* server -> client and client -> server
445+
*/
446+
447+
#define rfbFence 248
441448

442449

443450
/*****************************************************************************
@@ -528,6 +535,9 @@ typedef struct {
528535
#define rfbEncodingQualityLevel8 0xFFFFFFE8
529536
#define rfbEncodingQualityLevel9 0xFFFFFFE9
530537

538+
#define rfbEncodingContinuousUpdates 0xFFFFFEC7
539+
#define rfbEncodingFence 0xFFFFFEC8
540+
531541
#define rfbEncodingQemuExtendedKeyEvent 0xFFFFFEFE /* -258 */
532542
#define rfbEncodingExtendedClipboard 0xC0A1E5CE
533543

@@ -538,6 +548,37 @@ typedef struct {
538548
#define rfbEncodingServerIdentity 0xFFFE0003
539549

540550

551+
/*****************************************************************************
552+
*
553+
* Message definitions (server -> client and client -> server)
554+
*
555+
*****************************************************************************/
556+
557+
/*-----------------------------------------------------------------------------
558+
* Fence
559+
*/
560+
561+
/* flags */
562+
#define rfbFenceFlagBlockBefore 1
563+
#define rfbFenceFlagBlockAfter 2
564+
#define rfbFenceFlagSyncNext 4
565+
#define rfbFenceFlagRequest 0x80000000
566+
#define rfbFenceFlagsSupported (rfbFenceFlagBlockBefore | \
567+
rfbFenceFlagBlockAfter | \
568+
rfbFenceFlagSyncNext | \
569+
rfbFenceFlagRequest)
570+
571+
typedef struct _rfbFenceMsg {
572+
uint8_t type; /* always rfbFence */
573+
uint8_t pad[3];
574+
uint32_t flags;
575+
uint8_t length;
576+
/* Followed by char data[length] */
577+
} rfbFenceMsg;
578+
579+
#define sz_rfbFenceMsg 9
580+
581+
541582
/*****************************************************************************
542583
*
543584
* Server -> client message definitions
@@ -1267,6 +1308,7 @@ typedef union {
12671308
rfbTextChatMsg tc;
12681309
rfbXvpMsg xvp;
12691310
rfbExtDesktopSizeMsg eds;
1311+
rfbFenceMsg f;
12701312
} rfbServerToClientMsg;
12711313

12721314

@@ -1523,6 +1565,22 @@ typedef struct _rfbSetSWMsg {
15231565
#define sz_rfbSetSWMsg 6
15241566

15251567

1568+
/*-----------------------------------------------------------------------------
1569+
* EnableContinuousUpdates
1570+
*/
1571+
1572+
typedef struct _rfbEnableContinuousUpdatesMsg {
1573+
uint8_t type; /* always rfbEnableContinuousUpdates */
1574+
uint8_t enable;
1575+
uint16_t x;
1576+
uint16_t y;
1577+
uint16_t w;
1578+
uint16_t h;
1579+
} rfbEnableContinuousUpdatesMsg;
1580+
1581+
#define sz_rfbEnableContinuousUpdatesMsg 10
1582+
1583+
15261584

15271585
/*-----------------------------------------------------------------------------
15281586
* Union of all client->server messages.
@@ -1545,6 +1603,8 @@ typedef union {
15451603
rfbTextChatMsg tc;
15461604
rfbXvpMsg xvp;
15471605
rfbSetDesktopSizeMsg sdm;
1606+
rfbEnableContinuousUpdatesMsg ecu;
1607+
rfbFenceMsg f;
15481608
} rfbClientToServerMsg;
15491609

15501610
/*

include/rfb/threading.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
#endif
7878
#elif defined(LIBVNCSERVER_HAVE_WIN32THREADS)
7979
#include <process.h>
80+
#include <windows.h>
8081
#define LOCK(mutex) EnterCriticalSection(&(mutex))
8182
#define UNLOCK(mutex) LeaveCriticalSection(&(mutex))
8283
#define MUTEX(mutex) CRITICAL_SECTION (mutex)

src/libvncserver/cargs.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ rfbUsage(void)
4343
"new non-shared\n"
4444
" connection comes in (refuse new connection "
4545
"instead)\n");
46+
fprintf(stderr, "-noflowcontrol when continuous updates are enabled, send updates\n"
47+
" whether or not the viewer is ready to receive them\n");
4648
#ifdef LIBVNCSERVER_WITH_WEBSOCKETS
4749
fprintf(stderr, "-sslkeyfile path set path to private key file for encrypted WebSockets connections\n");
4850
fprintf(stderr, "-sslcertfile path set path to certificate file for encrypted WebSockets connections\n");
@@ -158,6 +160,8 @@ rfbProcessArguments(rfbScreenInfoPtr rfbScreen,int* argc, char *argv[])
158160
rfbScreen->neverShared = TRUE;
159161
} else if (strcmp(argv[i], "-dontdisconnect") == 0) {
160162
rfbScreen->dontDisconnect = TRUE;
163+
} else if (strcmp(argv[i], "-noflowcontrol") == 0) {
164+
rfbScreen->rfbCongestionControl = FALSE;
161165
} else if (strcmp(argv[i], "-httpdir") == 0) { /* -httpdir directory-path */
162166
if (i + 1 >= *argc) {
163167
rfbUsage();

0 commit comments

Comments
 (0)