Quoting Stefan Hajnoczi (2016-10-06 11:40:18) > 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 <stefa...@redhat.com>
Reviewed-by: Michael Roth <mdr...@linux.vnet.ibm.com> I still need to get a vsock environment set up to test with, but looks good other than minor comments in patch 3. > --- > qga/channel-posix.c | 25 +++++++++++++++++++++++++ > qga/channel.h | 1 + > qga/main.c | 6 ++++-- > 3 files changed, 30 insertions(+), 2 deletions(-) > > diff --git a/qga/channel-posix.c b/qga/channel-posix.c > index 579891d..71582e0 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 ae8cf0f..8fd0c8f 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 0b9d04e..6caf215 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; > -- > 2.7.4 >