Statistics
| Branch: | Revision:

root / migration-tcp.c @ feature-archipelago

History | View | Annotate | Download (2.3 kB)

1 34c9dd8e aliguori
/*
2 34c9dd8e aliguori
 * QEMU live migration
3 34c9dd8e aliguori
 *
4 34c9dd8e aliguori
 * Copyright IBM, Corp. 2008
5 34c9dd8e aliguori
 *
6 34c9dd8e aliguori
 * Authors:
7 34c9dd8e aliguori
 *  Anthony Liguori   <aliguori@us.ibm.com>
8 34c9dd8e aliguori
 *
9 34c9dd8e aliguori
 * This work is licensed under the terms of the GNU GPL, version 2.  See
10 34c9dd8e aliguori
 * the COPYING file in the top-level directory.
11 34c9dd8e aliguori
 *
12 6b620ca3 Paolo Bonzini
 * Contributions after 2012-01-13 are licensed under the terms of the
13 6b620ca3 Paolo Bonzini
 * GNU GPL, version 2 or (at your option) any later version.
14 34c9dd8e aliguori
 */
15 34c9dd8e aliguori
16 34c9dd8e aliguori
#include "qemu-common.h"
17 1de7afc9 Paolo Bonzini
#include "qemu/sockets.h"
18 caf71f86 Paolo Bonzini
#include "migration/migration.h"
19 557ec5a0 Juan Quintela
#include "migration/qemu-file.h"
20 737e150e Paolo Bonzini
#include "block/block.h"
21 6a1751b7 Alex Bligh
#include "qemu/main-loop.h"
22 34c9dd8e aliguori
23 34c9dd8e aliguori
//#define DEBUG_MIGRATION_TCP
24 34c9dd8e aliguori
25 34c9dd8e aliguori
#ifdef DEBUG_MIGRATION_TCP
26 d0f2c4c6 malc
#define DPRINTF(fmt, ...) \
27 34c9dd8e aliguori
    do { printf("migration-tcp: " fmt, ## __VA_ARGS__); } while (0)
28 34c9dd8e aliguori
#else
29 d0f2c4c6 malc
#define DPRINTF(fmt, ...) \
30 34c9dd8e aliguori
    do { } while (0)
31 34c9dd8e aliguori
#endif
32 34c9dd8e aliguori
33 233aa5c2 Orit Wasserman
static void tcp_wait_for_connect(int fd, void *opaque)
34 34c9dd8e aliguori
{
35 22f00a44 Juan Quintela
    MigrationState *s = opaque;
36 34c9dd8e aliguori
37 233aa5c2 Orit Wasserman
    if (fd < 0) {
38 233aa5c2 Orit Wasserman
        DPRINTF("migrate connect error\n");
39 b352365f Paolo Bonzini
        s->file = NULL;
40 065e2813 aliguori
        migrate_fd_error(s);
41 233aa5c2 Orit Wasserman
    } else {
42 233aa5c2 Orit Wasserman
        DPRINTF("migrate connect success\n");
43 b352365f Paolo Bonzini
        s->file = qemu_fopen_socket(fd, "wb");
44 065e2813 aliguori
        migrate_fd_connect(s);
45 34c9dd8e aliguori
    }
46 34c9dd8e aliguori
}
47 34c9dd8e aliguori
48 f37afb5a Paolo Bonzini
void tcp_start_outgoing_migration(MigrationState *s, const char *host_port, Error **errp)
49 34c9dd8e aliguori
{
50 f8bbc128 Paolo Bonzini
    inet_nonblocking_connect(host_port, tcp_wait_for_connect, s, errp);
51 34c9dd8e aliguori
}
52 34c9dd8e aliguori
53 34c9dd8e aliguori
static void tcp_accept_incoming_migration(void *opaque)
54 34c9dd8e aliguori
{
55 34c9dd8e aliguori
    struct sockaddr_in addr;
56 34c9dd8e aliguori
    socklen_t addrlen = sizeof(addr);
57 e0efb993 Stefan Weil
    int s = (intptr_t)opaque;
58 34c9dd8e aliguori
    QEMUFile *f;
59 511c0231 Juan Quintela
    int c;
60 34c9dd8e aliguori
61 34c9dd8e aliguori
    do {
62 40ff6d7e Kevin Wolf
        c = qemu_accept(s, (struct sockaddr *)&addr, &addrlen);
63 c1d36665 aliguori
    } while (c == -1 && socket_error() == EINTR);
64 a6ef2909 Paolo Bonzini
    qemu_set_fd_handler2(s, NULL, NULL, NULL, NULL);
65 09bac73c Paolo Bonzini
    closesocket(s);
66 34c9dd8e aliguori
67 d0f2c4c6 malc
    DPRINTF("accepted migration\n");
68 34c9dd8e aliguori
69 34c9dd8e aliguori
    if (c == -1) {
70 34c9dd8e aliguori
        fprintf(stderr, "could not accept migration connection\n");
71 a6ef2909 Paolo Bonzini
        goto out;
72 34c9dd8e aliguori
    }
73 34c9dd8e aliguori
74 0cc3f3cc Paolo Bonzini
    f = qemu_fopen_socket(c, "rb");
75 34c9dd8e aliguori
    if (f == NULL) {
76 34c9dd8e aliguori
        fprintf(stderr, "could not qemu_fopen socket\n");
77 34c9dd8e aliguori
        goto out;
78 34c9dd8e aliguori
    }
79 34c9dd8e aliguori
80 511c0231 Juan Quintela
    process_incoming_migration(f);
81 ab52a824 Paolo Bonzini
    return;
82 ab52a824 Paolo Bonzini
83 34c9dd8e aliguori
out:
84 09bac73c Paolo Bonzini
    closesocket(c);
85 34c9dd8e aliguori
}
86 34c9dd8e aliguori
87 43eaae28 Paolo Bonzini
void tcp_start_incoming_migration(const char *host_port, Error **errp)
88 34c9dd8e aliguori
{
89 34c9dd8e aliguori
    int s;
90 34c9dd8e aliguori
91 d5c5dacc Amos Kong
    s = inet_listen(host_port, NULL, 256, SOCK_STREAM, 0, errp);
92 d5c5dacc Amos Kong
    if (s < 0) {
93 43eaae28 Paolo Bonzini
        return;
94 ee86c61f Juan Quintela
    }
95 34c9dd8e aliguori
96 34c9dd8e aliguori
    qemu_set_fd_handler2(s, NULL, tcp_accept_incoming_migration, NULL,
97 e0efb993 Stefan Weil
                         (void *)(intptr_t)s);
98 34c9dd8e aliguori
}