[Spice-devel] [PATCH spice 03/10] server/red_channel: support SPICE_COMMON_CAP_HEADER_NO_SUB

Yonit Halperin yhalperi at redhat.com
Wed Dec 28 09:15:12 PST 2011


---
 server/red_channel.c |   27 ++++++++++++++++++++-------
 server/red_channel.h |    3 +++
 2 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/server/red_channel.c b/server/red_channel.c
index 86387cb..7772355 100644
--- a/server/red_channel.c
+++ b/server/red_channel.c
@@ -86,17 +86,17 @@ static void red_peer_handle_incoming(RedsStream *stream, IncomingHandler *handle
 
     for (;;) {
         int ret_handle;
-        if (handler->header_pos < sizeof(SpiceDataHeader)) {
+        if (handler->header_pos < handler->header_size) {
             bytes_read = red_peer_receive(stream,
                                           ((uint8_t *)&handler->header) + handler->header_pos,
-                                          sizeof(SpiceDataHeader) - handler->header_pos);
+                                          handler->header_size - handler->header_pos);
             if (bytes_read == -1) {
                 handler->cb->on_error(handler->opaque);
                 return;
             }
             handler->header_pos += bytes_read;
 
-            if (handler->header_pos != sizeof(SpiceDataHeader)) {
+            if (handler->header_pos != handler->header_size) {
                 return;
             }
         }
@@ -260,11 +260,14 @@ static void red_channel_client_reset_send_data(RedChannelClient *rcc)
 {
     spice_marshaller_reset(rcc->send_data.marshaller);
     rcc->send_data.header = (SpiceDataHeader *)
-        spice_marshaller_reserve_space(rcc->send_data.marshaller, sizeof(SpiceDataHeader));
-    spice_marshaller_set_base(rcc->send_data.marshaller, sizeof(SpiceDataHeader));
+        spice_marshaller_reserve_space(rcc->send_data.marshaller, rcc->header_size);
+    spice_marshaller_set_base(rcc->send_data.marshaller, rcc->header_size);
     rcc->send_data.header->type = 0;
     rcc->send_data.header->size = 0;
-    rcc->send_data.header->sub_list = 0;
+
+    if (rcc->is_header_with_sub) {
+        rcc->send_data.header->sub_list = 0;
+    }
 
     if (rcc->send_data.marshaller != rcc->send_data.urgent.marshaller) {
         rcc->send_data.header->serial = ++rcc->send_data.serial;
@@ -436,6 +439,15 @@ RedChannelClient *red_channel_client_create(int size, RedChannel *channel, RedCl
     rcc->outgoing.size = 0;
 
     red_channel_client_set_remote_caps(rcc, num_common_caps, common_caps, num_caps, caps);
+    if (red_channel_client_test_remote_common_cap(rcc, SPICE_COMMON_CAP_HEADER_NO_SUB)) {
+        rcc->header_size = sizeof(SpiceDataHeaderNoSub);
+        rcc->is_header_with_sub = FALSE;
+    } else {
+        rcc->header_size = sizeof(SpiceDataHeader);
+        rcc->is_header_with_sub = TRUE;
+    }
+
+    rcc->incoming.header_size = rcc->header_size;
 
     if (!channel->channel_cbs.config_socket(rcc)) {
         goto error;
@@ -524,6 +536,7 @@ RedChannel *red_channel_create(int size,
     client_cbs.migrate = red_channel_client_default_migrate;
 
     red_channel_register_client_cbs(channel, &client_cbs);
+    red_channel_set_common_cap(channel, SPICE_COMMON_CAP_HEADER_NO_SUB);
 
     channel->thread_id = pthread_self();
 
@@ -891,7 +904,7 @@ void red_channel_client_begin_send_message(RedChannelClient *rcc)
     }
     spice_marshaller_flush(m);
     rcc->send_data.size = spice_marshaller_get_total_size(m);
-    rcc->send_data.header->size = rcc->send_data.size - sizeof(SpiceDataHeader);
+    rcc->send_data.header->size = rcc->send_data.size - rcc->header_size;
     rcc->ack_data.messages_window++;
     rcc->send_data.header = NULL; /* avoid writing to this until we have a new message */
     red_channel_client_send(rcc);
diff --git a/server/red_channel.h b/server/red_channel.h
index cb80100..3170b33 100644
--- a/server/red_channel.h
+++ b/server/red_channel.h
@@ -59,6 +59,7 @@ typedef struct IncomingHandler {
     IncomingHandlerInterface *cb;
     void *opaque;
     SpiceDataHeader header;
+    uint32_t header_size;
     uint32_t header_pos;
     uint8_t *msg; // data of the msg following the header. allocated by alloc_msg_buf.
     uint32_t msg_pos;
@@ -228,6 +229,8 @@ struct RedChannelClient {
     uint32_t pipe_size;
 
     RedChannelCapabilities remote_caps;
+    int header_size;
+    int is_header_with_sub;
 };
 
 struct RedChannel {
-- 
1.7.6.4



More information about the Spice-devel mailing list