[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