[Spice-devel] [PATCH v7 spice-common 3/3] Add LZ4 data compression and use it in spicevmc channel

Snir Sheriber ssheribe at redhat.com
Mon Jun 13 16:54:38 UTC 2016


Compressed message type is CompressedData which contains compression
type (1 byte) followed by the uncompressed data size (4 bytes-exists
only if data was compressed) followed by the compressed data

Update the required protocol to 0.12.12:

Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
Signed-off-by: Snir Sheriber <ssheribe at redhat.com>
---
 common/client_marshallers.h |  1 +
 common/messages.h           |  7 +++++++
 configure.ac                |  2 +-
 spice.proto                 | 24 ++++++++++++++++++++++++
 4 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/common/client_marshallers.h b/common/client_marshallers.h
index 728987e..2074323 100644
--- a/common/client_marshallers.h
+++ b/common/client_marshallers.h
@@ -33,6 +33,7 @@ SPICE_BEGIN_DECLS
 typedef struct {
     void (*msg_SpiceMsgEmpty)(SpiceMarshaller *m, SpiceMsgEmpty *msg);
     void (*msg_SpiceMsgData)(SpiceMarshaller *m, SpiceMsgData *msg);
+    void (*msg_SpiceMsgCompressedData)(SpiceMarshaller *m, SpiceMsgCompressedData *msg);
     void (*msgc_ack_sync)(SpiceMarshaller *m, SpiceMsgcAckSync *msg);
     void (*msgc_pong)(SpiceMarshaller *m, SpiceMsgPing *msg);
     void (*msgc_disconnecting)(SpiceMarshaller *m, SpiceMsgDisconnect *msg);
diff --git a/common/messages.h b/common/messages.h
index f537950..516a345 100644
--- a/common/messages.h
+++ b/common/messages.h
@@ -55,6 +55,13 @@ typedef struct SpiceMsgData {
     uint8_t data[0];
 } SpiceMsgData;
 
+typedef struct SpiceMsgCompressedData {
+    uint8_t type;
+    uint32_t uncompressed_size;
+    uint32_t compressed_size;
+    uint8_t *compressed_data;
+} SpiceMsgCompressedData;
+
 typedef struct SpiceMsgEmpty {
     uint8_t padding;
 } SpiceMsgEmpty;
diff --git a/configure.ac b/configure.ac
index f8ff024..c3ad5a4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -28,7 +28,7 @@ AM_PROG_CC_C_O
 SPICE_CHECK_SYSDEPS
 
 # Checks for libraries
-PKG_CHECK_MODULES([PROTOCOL], [spice-protocol >= 0.12.10])
+PKG_CHECK_MODULES([PROTOCOL], [spice-protocol >= 0.12.12])
 
 SPICE_CHECK_PYTHON_MODULES()
 
diff --git a/spice.proto b/spice.proto
index d21510d..0bfc515 100644
--- a/spice.proto
+++ b/spice.proto
@@ -120,6 +120,28 @@ message Data {
     uint8 data[] @end @ctype(uint8_t);
 } @nocopy;
 
+enum8 data_compression_type {
+    NONE,
+    LZ4,
+};
+
+struct EmptyStructure {
+};
+
+message CompressedData {
+    data_compression_type type;
+    switch (type) {
+    /* we cannot use !NONE (works only with flags) */
+    case NONE:
+        /* due to the way cases are defined after NONE we must have something */
+        /* due to a bug we cannot use @virtual to write 0 to compressed_size */
+        EmptyStructure empty;
+    default:
+        uint32 uncompressed_size;
+    } u @anon;
+    uint8 compressed_data[] @as_ptr(compressed_size);
+} @ctype(SpiceMsgCompressedData);
+
 struct ChannelWait {
     uint8 channel_type;
     uint8 channel_id;
@@ -1373,8 +1395,10 @@ channel SmartcardChannel : BaseChannel {
 channel SpicevmcChannel : BaseChannel {
 server:
     Data data = 101;
+    CompressedData compressed_data = 102;
 client:
     Data data = 101;
+    CompressedData compressed_data = 102;
 };
 
 channel UsbredirChannel : SpicevmcChannel {
-- 
2.5.5



More information about the Spice-devel mailing list