[Spice-devel] [spice PATCH 25/55] spicevmc migration: restore migration dest state from migration data
Yonit Halperin
yhalperi at redhat.com
Wed Aug 15 00:56:05 PDT 2012
---
server/spicevmc.c | 31 +++++++++++++++++++++++++++++--
1 files changed, 29 insertions(+), 2 deletions(-)
diff --git a/server/spicevmc.c b/server/spicevmc.c
index b14ba63..1ce3169 100644
--- a/server/spicevmc.c
+++ b/server/spicevmc.c
@@ -206,12 +206,39 @@ static void spicevmc_red_channel_client_on_disconnect(RedChannelClient *rcc)
}
}
+static SpiceVmcState *spicevmc_red_channel_client_get_state(RedChannelClient *rcc)
+{
+ return SPICE_CONTAINEROF(rcc->channel, SpiceVmcState, channel);
+}
+
static int spicevmc_channel_client_handle_migrate_flush_mark(RedChannelClient *rcc)
{
red_channel_client_pipe_add_type(rcc, PIPE_ITEM_TYPE_SPICEVMC_MIGRATE_DATA);
return TRUE;
}
+static int spicevmc_channel_client_handle_migrate_data(RedChannelClient *rcc,
+ uint32_t size, void *message)
+{
+ SpiceMigrateDataHeader *header;
+ SpiceMigrateDataSpiceVmc *mig_data;
+ SpiceVmcState *state;
+
+ state = spicevmc_red_channel_client_get_state(rcc);
+
+ header = (SpiceMigrateDataHeader *)message;
+ mig_data = (SpiceMigrateDataSpiceVmc *)(header + 1);
+ spice_assert(size >= sizeof(SpiceMigrateDataHeader) + sizeof(SpiceMigrateDataSpiceVmc));
+
+ if (!migration_protocol_validate_header(header,
+ SPICE_MIGRATE_DATA_SPICEVMC_MAGIC,
+ SPICE_MIGRATE_DATA_SPICEVMC_VERSION)) {
+ spice_error("bad header");
+ return FALSE;
+ }
+ return spice_char_device_state_restore(state->chardev_st, &mig_data->base);
+}
+
static int spicevmc_red_channel_client_handle_message(RedChannelClient *rcc,
uint16_t type,
uint32_t size,
@@ -219,8 +246,7 @@ static int spicevmc_red_channel_client_handle_message(RedChannelClient *rcc,
{
SpiceVmcState *state;
- state = SPICE_CONTAINEROF(rcc->channel, SpiceVmcState, channel);
-
+ state = spicevmc_red_channel_client_get_state(rcc);
if (type != SPICE_MSGC_SPICEVMC_DATA) {
return red_channel_client_handle_message(rcc, size, type, msg);
}
@@ -383,6 +409,7 @@ SpiceCharDeviceState *spicevmc_device_connect(SpiceCharDeviceInstance *sin,
channel_cbs.alloc_recv_buf = spicevmc_red_channel_alloc_msg_rcv_buf;
channel_cbs.release_recv_buf = spicevmc_red_channel_release_msg_rcv_buf;
channel_cbs.handle_migrate_flush_mark = spicevmc_channel_client_handle_migrate_flush_mark;
+ channel_cbs.handle_migrate_data = spicevmc_channel_client_handle_migrate_data;
state = (SpiceVmcState*)red_channel_create(sizeof(SpiceVmcState),
core, channel_type, id[channel_type]++,
--
1.7.7.6
More information about the Spice-devel
mailing list