diff options
author | Stefan Hajnoczi <stefanha@redhat.com> | 2016-10-14 10:00:56 +0100 |
---|---|---|
committer | Michael Roth <mdroth@linux.vnet.ibm.com> | 2016-10-31 19:49:33 -0500 |
commit | 586ef5dee77180fc32e33bc08051600030630239 (patch) | |
tree | 55a04f105dcbd323625f1d67748d69231bd9c313 /qga | |
parent | 6a02c8069f6c28ed1251e3fbbdf16e49d2c27ccc (diff) |
qga: add vsock-listen method
Add AF_VSOCK (virtio-vsock) support as an alternative to virtio-serial.
$ qemu-system-x86_64 -device vhost-vsock-pci,guest-cid=3 ...
(guest)# qemu-ga -m vsock-listen -p 3:1234
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Michael Roth <mdroth@linux.vnet.ibm.com>
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
Diffstat (limited to 'qga')
-rw-r--r-- | qga/channel-posix.c | 25 | ||||
-rw-r--r-- | qga/channel.h | 1 | ||||
-rw-r--r-- | qga/main.c | 6 |
3 files changed, 30 insertions, 2 deletions
diff --git a/qga/channel-posix.c b/qga/channel-posix.c index 579891d940..71582e0c38 100644 --- a/qga/channel-posix.c +++ b/qga/channel-posix.c @@ -193,6 +193,31 @@ static gboolean ga_channel_open(GAChannel *c, const gchar *path, GAChannelMethod ga_channel_listen_add(c, fd, true); break; } + case GA_CHANNEL_VSOCK_LISTEN: { + Error *local_err = NULL; + SocketAddress *addr; + char *addr_str; + int fd; + + addr_str = g_strdup_printf("vsock:%s", path); + addr = socket_parse(addr_str, &local_err); + g_free(addr_str); + if (local_err != NULL) { + g_critical("%s", error_get_pretty(local_err)); + error_free(local_err); + return false; + } + + fd = socket_listen(addr, &local_err); + qapi_free_SocketAddress(addr); + if (local_err != NULL) { + g_critical("%s", error_get_pretty(local_err)); + error_free(local_err); + return false; + } + ga_channel_listen_add(c, fd, true); + break; + } default: g_critical("error binding/listening to specified socket"); return false; diff --git a/qga/channel.h b/qga/channel.h index ae8cf0f7e0..8fd0c8f72c 100644 --- a/qga/channel.h +++ b/qga/channel.h @@ -19,6 +19,7 @@ typedef enum { GA_CHANNEL_VIRTIO_SERIAL, GA_CHANNEL_ISA_SERIAL, GA_CHANNEL_UNIX_LISTEN, + GA_CHANNEL_VSOCK_LISTEN, } GAChannelMethod; typedef gboolean (*GAChannelCallback)(GIOCondition condition, gpointer opaque); diff --git a/qga/main.c b/qga/main.c index 0b9d04ea04..6caf215575 100644 --- a/qga/main.c +++ b/qga/main.c @@ -190,8 +190,8 @@ static void usage(const char *cmd) "Usage: %s [-m <method> -p <path>] [<options>]\n" "QEMU Guest Agent %s\n" "\n" -" -m, --method transport method: one of unix-listen, virtio-serial, or\n" -" isa-serial (virtio-serial is the default)\n" +" -m, --method transport method: one of unix-listen, virtio-serial,\n" +" isa-serial, or vsock-listen (virtio-serial is the default)\n" " -p, --path device/socket path (the default for virtio-serial is:\n" " %s,\n" " the default for isa-serial is:\n" @@ -659,6 +659,8 @@ static gboolean channel_init(GAState *s, const gchar *method, const gchar *path) channel_method = GA_CHANNEL_ISA_SERIAL; } else if (strcmp(method, "unix-listen") == 0) { channel_method = GA_CHANNEL_UNIX_LISTEN; + } else if (strcmp(method, "vsock-listen") == 0) { + channel_method = GA_CHANNEL_VSOCK_LISTEN; } else { g_critical("unsupported channel method/type: %s", method); return false; |