From a180fc5e0b1efdecc3101fbe04d9478e18a940ec Mon Sep 17 00:00:00 2001 From: Yonit Halperin Date: Sun, 5 Aug 2012 20:43:13 +0300 Subject: main: restore state from migration data Also removed old migration leftovers. --- server/main_channel.c | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) (limited to 'server/main_channel.c') diff --git a/server/main_channel.c b/server/main_channel.c index 0c31c88e..1df19df9 100644 --- a/server/main_channel.c +++ b/server/main_channel.c @@ -500,31 +500,26 @@ static void main_channel_marshall_migrate_data_item(RedChannelClient *rcc, reds_marshall_migrate_data(m); // TODO: from reds split. ugly separation. } -static uint64_t main_channel_handle_migrate_data_get_serial(RedChannelClient *base, +static int main_channel_handle_migrate_data(RedChannelClient *rcc, uint32_t size, void *message) { - MainMigrateData *data = message; - - if (size < sizeof(*data)) { - spice_printerr("bad message size"); - return 0; - } - return data->serial; -} + MainChannelClient *mcc = SPICE_CONTAINEROF(rcc, MainChannelClient, base); + SpiceMigrateDataHeader *header = (SpiceMigrateDataHeader *)message; -static int main_channel_handle_migrate_data(RedChannelClient *base, - uint32_t size, void *message) -{ - MainChannelClient *mcc = SPICE_CONTAINEROF(base, MainChannelClient, base); - MainMigrateData *data = message; + /* not supported with multi-clients */ + spice_assert(rcc->channel->clients_num == 1); - if (size < sizeof(*data)) { - spice_printerr("bad message size"); + if (size < sizeof(SpiceMigrateDataHeader) + sizeof(SpiceMigrateDataMain)) { + spice_printerr("bad message size %u", size); return FALSE; } - mcc->ping_id = data->ping_id; - reds_on_main_receive_migrate_data(data, ((uint8_t*)message) + size); - return TRUE; + if (!migration_protocol_validate_header(header, + SPICE_MIGRATE_DATA_MAIN_MAGIC, + SPICE_MIGRATE_DATA_MAIN_VERSION)) { + spice_error("bad header"); + return FALSE; + } + return reds_handle_migrate_data(mcc, (SpiceMigrateDataMain *)(header + 1), size); } void main_channel_push_init(MainChannelClient *mcc, @@ -1173,7 +1168,6 @@ MainChannel* main_channel_init(void) channel_cbs.release_recv_buf = main_channel_release_msg_rcv_buf; channel_cbs.handle_migrate_flush_mark = main_channel_handle_migrate_flush_mark; channel_cbs.handle_migrate_data = main_channel_handle_migrate_data; - channel_cbs.handle_migrate_data_get_serial = main_channel_handle_migrate_data_get_serial; // TODO: set the migration flag of the channel channel = red_channel_create_parser(sizeof(MainChannel), core, -- cgit