This patch adds side channel support on the outgoing of unix
migration. It will create a pipe and pass the read pipe fd to
destination process by send_pipefd(). If the pipe fd was passed
successfully, the qemu_fopen_pipe will be called with write mode
to send RAM to the write pipe fd.
Signed-off-by: Lei Li <[email protected]>
---
migration-unix.c | 34 +++++++++++++++++++++++++++++++---
1 files changed, 31 insertions(+), 3 deletions(-)
diff --git a/migration-unix.c b/migration-unix.c
index 651fc5b..0bfc1c7 100644
--- a/migration-unix.c
+++ b/migration-unix.c
@@ -33,16 +33,44 @@
static void unix_wait_for_connect(int fd, void *opaque)
{
MigrationState *s = opaque;
+ int pipefd[2];
if (fd < 0) {
DPRINTF("migrate connect error\n");
- s->file = NULL;
- migrate_fd_error(s);
+ goto fail;
} else {
DPRINTF("migrate connect success\n");
- s->file = qemu_fopen_socket(fd, "wb");
+
+ if (s->enabled_capabilities[MIGRATION_CAPABILITY_UNIX_PAGE_FLIPPING]) {
+ if (pipe(pipefd) < 0) {
+ DPRINTF("qemu_fopen_pipe: %s", strerror(errno));
+ goto fail;
+ }
+
+ /* Send pipefd[0] to destination QEMU process */
+ if (send_pipefd(fd, pipefd[0]) < 0) {
+ DPRINTF("failed to pass pipe\n");
+ goto fail;
+ }
+
+ s->file = qemu_fopen_pipe(pipefd[1], "w");
+ } else {
+ s->file = qemu_fopen_socket(fd, "wb");
+ }
+
+ if (s->file == NULL) {
+ DPRINTF("failed to open migration target");
+ migrate_fd_error(s);
+ return;
+ }
+
migrate_fd_connect(s);
+ return;
}
+
+fail:
+ s->file = NULL;
+ migrate_fd_error(s);
}
void unix_start_outgoing_migration(MigrationState *s, const char *path, Error
**errp)
--
1.7.7.6