Statistics
| Branch: | Revision:

root / migration-tcp.c @ 6a1751b7

History | View | Annotate | Download (2.3 kB)

1
/*
2
 * QEMU live migration
3
 *
4
 * Copyright IBM, Corp. 2008
5
 *
6
 * Authors:
7
 *  Anthony Liguori   <aliguori@us.ibm.com>
8
 *
9
 * This work is licensed under the terms of the GNU GPL, version 2.  See
10
 * the COPYING file in the top-level directory.
11
 *
12
 * Contributions after 2012-01-13 are licensed under the terms of the
13
 * GNU GPL, version 2 or (at your option) any later version.
14
 */
15

    
16
#include "qemu-common.h"
17
#include "qemu/sockets.h"
18
#include "migration/migration.h"
19
#include "migration/qemu-file.h"
20
#include "block/block.h"
21
#include "qemu/main-loop.h"
22

    
23
//#define DEBUG_MIGRATION_TCP
24

    
25
#ifdef DEBUG_MIGRATION_TCP
26
#define DPRINTF(fmt, ...) \
27
    do { printf("migration-tcp: " fmt, ## __VA_ARGS__); } while (0)
28
#else
29
#define DPRINTF(fmt, ...) \
30
    do { } while (0)
31
#endif
32

    
33
static void tcp_wait_for_connect(int fd, void *opaque)
34
{
35
    MigrationState *s = opaque;
36

    
37
    if (fd < 0) {
38
        DPRINTF("migrate connect error\n");
39
        s->file = NULL;
40
        migrate_fd_error(s);
41
    } else {
42
        DPRINTF("migrate connect success\n");
43
        s->file = qemu_fopen_socket(fd, "wb");
44
        migrate_fd_connect(s);
45
    }
46
}
47

    
48
void tcp_start_outgoing_migration(MigrationState *s, const char *host_port, Error **errp)
49
{
50
    inet_nonblocking_connect(host_port, tcp_wait_for_connect, s, errp);
51
}
52

    
53
static void tcp_accept_incoming_migration(void *opaque)
54
{
55
    struct sockaddr_in addr;
56
    socklen_t addrlen = sizeof(addr);
57
    int s = (intptr_t)opaque;
58
    QEMUFile *f;
59
    int c;
60

    
61
    do {
62
        c = qemu_accept(s, (struct sockaddr *)&addr, &addrlen);
63
    } while (c == -1 && socket_error() == EINTR);
64
    qemu_set_fd_handler2(s, NULL, NULL, NULL, NULL);
65
    closesocket(s);
66

    
67
    DPRINTF("accepted migration\n");
68

    
69
    if (c == -1) {
70
        fprintf(stderr, "could not accept migration connection\n");
71
        goto out;
72
    }
73

    
74
    f = qemu_fopen_socket(c, "rb");
75
    if (f == NULL) {
76
        fprintf(stderr, "could not qemu_fopen socket\n");
77
        goto out;
78
    }
79

    
80
    process_incoming_migration(f);
81
    return;
82

    
83
out:
84
    closesocket(c);
85
}
86

    
87
void tcp_start_incoming_migration(const char *host_port, Error **errp)
88
{
89
    int s;
90

    
91
    s = inet_listen(host_port, NULL, 256, SOCK_STREAM, 0, errp);
92
    if (s < 0) {
93
        return;
94
    }
95

    
96
    qemu_set_fd_handler2(s, NULL, tcp_accept_incoming_migration, NULL,
97
                         (void *)(intptr_t)s);
98
}