@@ -108,6 +108,8 @@ void rdma_start_outgoing_migration(void *opaque, const char *host_port, Error **
void rdma_start_incoming_migration(const char *host_port, Error **errp);
+void test_start_migration(void *opaque, const char *host_port, Error **errp);
+
void migrate_fd_error(MigrationState *s);
void migrate_fd_connect(MigrationState *s);
@@ -1,4 +1,4 @@
-common-obj-y += migration.o tcp.o
+common-obj-y += migration.o tcp.o test.o
common-obj-y += vmstate.o
common-obj-y += qemu-file.o qemu-file-buf.o qemu-file-unix.o qemu-file-stdio.o
common-obj-y += xbzrle.o
new file mode 100644
@@ -0,0 +1,66 @@
+#include "qemu-common.h"
+#include "migration/migration.h"
+#include "migration/qemu-file.h"
+#include "exec/cpu-common.h"
+#include "qemu/error-report.h"
+#include "qemu/main-loop.h"
+#include "qemu/sockets.h"
+#include "qemu/bitmap.h"
+#include <stdio.h>
+#include <string.h>
+#include "qmp-commands.h"
+
+typedef struct QEMUFileTest {
+ MigrationState *s;
+ size_t len;
+ QEMUFile *file;
+} QEMUFileTest;
+
+static uint64_t transfered_bytes;
+static uint64_t initial_bytes;
+
+static ssize_t qemu_test_put_buffer(void *opaque, const uint8_t *buf,
+ int64_t pos, size_t size)
+{
+ transfered_bytes += size;
+ return size;
+}
+
+static int qemu_test_close(void *opaque)
+{
+ return 0;
+}
+
+static const QEMUFileOps test_write_ops = {
+ .put_buffer = qemu_test_put_buffer,
+ .close = qemu_test_close,
+};
+
+static void *qemu_fopen_test(MigrationState *s, const char *mode)
+{
+ QEMUFileTest *t;
+ transfered_bytes = 0;
+ initial_bytes = 0;
+ if (qemu_file_mode_is_not_valid(mode)) {
+ return NULL;
+ }
+
+ t = g_malloc0(sizeof(QEMUFileTest));
+ t->s = s;
+
+ if (mode[0] == 'w') {
+ t->file = qemu_fopen_ops(s, &test_write_ops);
+ } else {
+ return NULL;
+ }
+ qemu_file_set_rate_limit(t->file, -1);
+ return t->file;
+}
+
+void test_start_migration(void *opaque, const char *host_port, Error **errp)
+{
+ MigrationState *s = opaque;
+ s->file = qemu_fopen_test(s, "wb");
+ migrate_fd_connect(s);
+ return;
+}