All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/7] sockets: Flatten SocketAddress except in external interfaces
@ 2017-04-26  7:36 Markus Armbruster
  2017-04-26  7:36 ` [Qemu-devel] [PATCH 1/7] sockets: Prepare vsock_parse() for flattened SocketAddress Markus Armbruster
                   ` (7 more replies)
  0 siblings, 8 replies; 19+ messages in thread
From: Markus Armbruster @ 2017-04-26  7:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: berrange, kraxel, pbonzini, eblake, qemu-block

SocketAddress is a simple union, and simple unions are awkward: they
have their variant members wrapped in a "data" object on the wire, and
require additional indirections in C.  Flatten it as follows: rename
SocketAddress to SocketAddressLegacy, rename its flat sibling
SocketAddressFlat to SocketAddress, convert all users of
SocketAddressLegacy to SocketAddress, except for existing external
interfaces.  This completes the work outlined in commit 9445673.

Markus Armbruster (7):
  sockets: Prepare vsock_parse() for flattened SocketAddress
  sockets: Prepare inet_parse() for flattened SocketAddress
  qapi: New QAPI_CLONE_MEMBERS()
  sockets: Rename SocketAddress to SocketAddressLegacy
  sockets: Rename SocketAddressFlat to SocketAddress
  sockets: Limit SocketAddressLegacy except to external interfaces
  socket: Delete unused helper socket_address_crumple()

 block/gluster.c                |  48 +++++------
 block/nbd.c                    |  36 ++++-----
 block/sheepdog.c               |  20 ++---
 blockdev-nbd.c                 |  21 +++--
 chardev/char-socket.c          |  42 +++++-----
 chardev/char-udp.c             |  20 +++--
 hmp.c                          |   3 +-
 include/block/nbd.h            |   3 +
 include/io/channel-socket.h    |   4 +-
 include/qapi/clone-visitor.h   |  14 ++++
 include/qemu/sockets.h         |  18 ++---
 io/dns-resolver.c              |  17 ++--
 migration/rdma.c               |   4 +-
 migration/socket.c             |  20 +++--
 qapi-schema.json               |  36 +++++----
 qapi/block-core.json           |   6 +-
 qapi/block.json                |   2 +-
 qapi/qapi-clone-visitor.c      |  13 +++
 qemu-nbd.c                     |   9 +--
 qga/main.c                     |   4 +-
 tests/test-io-channel-socket.c |  52 +++++-------
 ui/vnc-auth-sasl.c             |   5 +-
 ui/vnc.c                       |  68 ++++++++--------
 util/qemu-sockets.c            | 177 +++++++++++++++++++----------------------
 24 files changed, 328 insertions(+), 314 deletions(-)

-- 
2.7.4

^ permalink raw reply	[flat|nested] 19+ messages in thread

* [Qemu-devel] [PATCH 1/7] sockets: Prepare vsock_parse() for flattened SocketAddress
  2017-04-26  7:36 [Qemu-devel] [PATCH 0/7] sockets: Flatten SocketAddress except in external interfaces Markus Armbruster
@ 2017-04-26  7:36 ` Markus Armbruster
  2017-04-26 15:14   ` Eric Blake
  2017-04-26  7:36 ` [Qemu-devel] [PATCH 2/7] sockets: Prepare inet_parse() " Markus Armbruster
                   ` (6 subsequent siblings)
  7 siblings, 1 reply; 19+ messages in thread
From: Markus Armbruster @ 2017-04-26  7:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: berrange, kraxel, pbonzini, eblake, qemu-block

I'm going to flatten SocketAddress: rename SocketAddress to
SocketAddressLegacy, SocketAddressFlat to SocketAddress, eliminate
SocketAddressLegacy except in external interfaces.

vsock_parse() returns a newly allocated VsockSocketAddress.  Lift the
allocation from vsock_parse() into its caller socket_parse() to
prepare for flattening SocketAddress.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 util/qemu-sockets.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
index 8188d9a..1abe095 100644
--- a/util/qemu-sockets.c
+++ b/util/qemu-sockets.c
@@ -793,26 +793,25 @@ static int vsock_listen_saddr(VsockSocketAddress *vaddr,
     return slisten;
 }
 
-static VsockSocketAddress *vsock_parse(const char *str, Error **errp)
+static int vsock_parse(VsockSocketAddress *addr, const char *str,
+                       Error **errp)
 {
-    VsockSocketAddress *addr = NULL;
     char cid[33];
     char port[33];
     int n;
 
     if (sscanf(str, "%32[^:]:%32[^,]%n", cid, port, &n) != 2) {
         error_setg(errp, "error parsing address '%s'", str);
-        return NULL;
+        return -1;
     }
     if (str[n] != '\0') {
         error_setg(errp, "trailing characters in address '%s'", str);
-        return NULL;
+        return -1;
     }
 
-    addr = g_new0(VsockSocketAddress, 1);
     addr->cid = g_strdup(cid);
     addr->port = g_strdup(port);
-    return addr;
+    return 0;
 }
 #else
 static void vsock_unsupported(Error **errp)
@@ -835,10 +834,11 @@ static int vsock_listen_saddr(VsockSocketAddress *vaddr,
     return -1;
 }
 
-static VsockSocketAddress *vsock_parse(const char *str, Error **errp)
+static int vsock_parse(VsockSocketAddress *addr, const char *str,
+                        Error **errp)
 {
     vsock_unsupported(errp);
-    return NULL;
+    return -1;
 }
 #endif /* CONFIG_AF_VSOCK */
 
@@ -1060,8 +1060,8 @@ SocketAddress *socket_parse(const char *str, Error **errp)
         }
     } else if (strstart(str, "vsock:", NULL)) {
         addr->type = SOCKET_ADDRESS_KIND_VSOCK;
-        addr->u.vsock.data = vsock_parse(str + strlen("vsock:"), errp);
-        if (addr->u.vsock.data == NULL) {
+        addr->u.vsock.data = g_new(VsockSocketAddress, 1);
+        if (vsock_parse(addr->u.vsock.data, str + strlen("vsock:"), errp)) {
             goto fail;
         }
     } else {
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [Qemu-devel] [PATCH 2/7] sockets: Prepare inet_parse() for flattened SocketAddress
  2017-04-26  7:36 [Qemu-devel] [PATCH 0/7] sockets: Flatten SocketAddress except in external interfaces Markus Armbruster
  2017-04-26  7:36 ` [Qemu-devel] [PATCH 1/7] sockets: Prepare vsock_parse() for flattened SocketAddress Markus Armbruster
@ 2017-04-26  7:36 ` Markus Armbruster
  2017-04-26 15:28   ` Eric Blake
  2017-04-26  7:36 ` [Qemu-devel] [PATCH 3/7] qapi: New QAPI_CLONE_MEMBERS() Markus Armbruster
                   ` (5 subsequent siblings)
  7 siblings, 1 reply; 19+ messages in thread
From: Markus Armbruster @ 2017-04-26  7:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: berrange, kraxel, pbonzini, eblake, qemu-block

I'm going to flatten SocketAddress: rename SocketAddress to
SocketAddressLegacy, SocketAddressFlat to SocketAddress, eliminate
SocketAddressLegacy except in external interfaces.

inet_parse() returns a newly allocated InetSocketAddress.  Lift the
allocation from inet_parse() into its caller socket_parse() to prepare
for flattening SocketAddress.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 block/nbd.c            |  8 ++++----
 include/qemu/sockets.h |  2 +-
 migration/rdma.c       |  4 ++--
 migration/socket.c     |  5 +++--
 util/qemu-sockets.c    | 30 ++++++++++++------------------
 5 files changed, 22 insertions(+), 27 deletions(-)

diff --git a/block/nbd.c b/block/nbd.c
index 814ab26d..9f4ff44 100644
--- a/block/nbd.c
+++ b/block/nbd.c
@@ -199,16 +199,16 @@ static void nbd_parse_filename(const char *filename, QDict *options,
         qdict_put(options, "server.type", qstring_from_str("unix"));
         qdict_put(options, "server.path", qstring_from_str(unixpath));
     } else {
-        InetSocketAddress *addr = NULL;
+        InetSocketAddress *addr = g_new(InetSocketAddress, 1);
 
-        addr = inet_parse(host_spec, errp);
-        if (!addr) {
-            goto out;
+        if (inet_parse(addr, host_spec, errp)) {
+            goto out_inet;
         }
 
         qdict_put(options, "server.type", qstring_from_str("inet"));
         qdict_put(options, "server.host", qstring_from_str(addr->host));
         qdict_put(options, "server.port", qstring_from_str(addr->port));
+    out_inet:
         qapi_free_InetSocketAddress(addr);
     }
 
diff --git a/include/qemu/sockets.h b/include/qemu/sockets.h
index af28532..8b9325c 100644
--- a/include/qemu/sockets.h
+++ b/include/qemu/sockets.h
@@ -34,7 +34,7 @@ typedef void NonBlockingConnectHandler(int fd, Error *err, void *opaque);
 
 int inet_ai_family_from_address(InetSocketAddress *addr,
                                 Error **errp);
-InetSocketAddress *inet_parse(const char *str, Error **errp);
+int inet_parse(InetSocketAddress *addr, const char *str, Error **errp);
 int inet_connect(const char *str, Error **errp);
 int inet_connect_saddr(InetSocketAddress *saddr,
                        NonBlockingConnectHandler *callback, void *opaque,
diff --git a/migration/rdma.c b/migration/rdma.c
index fe0a4b5..7eaaf96 100644
--- a/migration/rdma.c
+++ b/migration/rdma.c
@@ -2506,8 +2506,8 @@ static void *qemu_rdma_data_init(const char *host_port, Error **errp)
         rdma->current_index = -1;
         rdma->current_chunk = -1;
 
-        addr = inet_parse(host_port, NULL);
-        if (addr != NULL) {
+        addr = g_new(InetSocketAddress, 1);
+        if (!inet_parse(addr, host_port, NULL)) {
             rdma->port = atoi(addr->port);
             rdma->host = g_strdup(addr->host);
         } else {
diff --git a/migration/socket.c b/migration/socket.c
index 13966f1..8db6d0d 100644
--- a/migration/socket.c
+++ b/migration/socket.c
@@ -27,10 +27,11 @@
 
 static SocketAddress *tcp_build_address(const char *host_port, Error **errp)
 {
-    InetSocketAddress *iaddr = inet_parse(host_port, errp);
+    InetSocketAddress *iaddr = g_new(InetSocketAddress, 1);
     SocketAddress *saddr;
 
-    if (!iaddr) {
+    if (inet_parse(iaddr, host_port, errp)) {
+        qapi_free_InetSocketAddress(iaddr);
         return NULL;
     }
 
diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
index 1abe095..62c93ba 100644
--- a/util/qemu-sockets.c
+++ b/util/qemu-sockets.c
@@ -578,16 +578,15 @@ err:
 }
 
 /* compatibility wrapper */
-InetSocketAddress *inet_parse(const char *str, Error **errp)
+int inet_parse(InetSocketAddress *addr, const char *str, Error **errp)
 {
-    InetSocketAddress *addr;
     const char *optstr, *h;
     char host[65];
     char port[33];
     int to;
     int pos;
 
-    addr = g_new0(InetSocketAddress, 1);
+    memset(addr, 0, sizeof(*addr));
 
     /* parse address */
     if (str[0] == ':') {
@@ -595,20 +594,20 @@ InetSocketAddress *inet_parse(const char *str, Error **errp)
         host[0] = '\0';
         if (sscanf(str, ":%32[^,]%n", port, &pos) != 1) {
             error_setg(errp, "error parsing port in address '%s'", str);
-            goto fail;
+            return -1;
         }
     } else if (str[0] == '[') {
         /* IPv6 addr */
         if (sscanf(str, "[%64[^]]]:%32[^,]%n", host, port, &pos) != 2) {
             error_setg(errp, "error parsing IPv6 address '%s'", str);
-            goto fail;
+            return -1;
         }
         addr->ipv6 = addr->has_ipv6 = true;
     } else {
         /* hostname or IPv4 addr */
         if (sscanf(str, "%64[^:]:%32[^,]%n", host, port, &pos) != 2) {
             error_setg(errp, "error parsing address '%s'", str);
-            goto fail;
+            return -1;
         }
         if (host[strspn(host, "0123456789.")] == '\0') {
             addr->ipv4 = addr->has_ipv4 = true;
@@ -626,7 +625,7 @@ InetSocketAddress *inet_parse(const char *str, Error **errp)
         if (sscanf(h, "%d%n", &to, &pos) != 1 ||
             (h[pos] != '\0' && h[pos] != ',')) {
             error_setg(errp, "error parsing to= argument");
-            goto fail;
+            return -1;
         }
         addr->has_to = true;
         addr->to = to;
@@ -637,11 +636,7 @@ InetSocketAddress *inet_parse(const char *str, Error **errp)
     if (strstr(optstr, ",ipv6")) {
         addr->ipv6 = addr->has_ipv6 = true;
     }
-    return addr;
-
-fail:
-    qapi_free_InetSocketAddress(addr);
-    return NULL;
+    return 0;
 }
 
 
@@ -656,13 +651,12 @@ fail:
 int inet_connect(const char *str, Error **errp)
 {
     int sock = -1;
-    InetSocketAddress *addr;
+    InetSocketAddress *addr = g_new(InetSocketAddress, 1);
 
-    addr = inet_parse(str, errp);
-    if (addr != NULL) {
+    if (!inet_parse(addr, str, errp)) {
         sock = inet_connect_saddr(addr, NULL, NULL, errp);
-        qapi_free_InetSocketAddress(addr);
     }
+    qapi_free_InetSocketAddress(addr);
     return sock;
 }
 
@@ -1066,8 +1060,8 @@ SocketAddress *socket_parse(const char *str, Error **errp)
         }
     } else {
         addr->type = SOCKET_ADDRESS_KIND_INET;
-        addr->u.inet.data = inet_parse(str, errp);
-        if (addr->u.inet.data == NULL) {
+        addr->u.inet.data = g_new(InetSocketAddress, 1);
+        if (inet_parse(addr->u.inet.data, str, errp)) {
             goto fail;
         }
     }
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [Qemu-devel] [PATCH 3/7] qapi: New QAPI_CLONE_MEMBERS()
  2017-04-26  7:36 [Qemu-devel] [PATCH 0/7] sockets: Flatten SocketAddress except in external interfaces Markus Armbruster
  2017-04-26  7:36 ` [Qemu-devel] [PATCH 1/7] sockets: Prepare vsock_parse() for flattened SocketAddress Markus Armbruster
  2017-04-26  7:36 ` [Qemu-devel] [PATCH 2/7] sockets: Prepare inet_parse() " Markus Armbruster
@ 2017-04-26  7:36 ` Markus Armbruster
  2017-04-26 17:56   ` Eric Blake
  2017-04-26  7:36 ` [Qemu-devel] [PATCH 4/7] sockets: Rename SocketAddress to SocketAddressLegacy Markus Armbruster
                   ` (4 subsequent siblings)
  7 siblings, 1 reply; 19+ messages in thread
From: Markus Armbruster @ 2017-04-26  7:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: berrange, kraxel, pbonzini, eblake, qemu-block

QAPI_CLONE() returns a newly allocated QAPI object.  Inconvenient when
we want to clone into an existing object.  QAPI_CLONE_MEMBERS() does
exactly that.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 include/qapi/clone-visitor.h | 14 ++++++++++++++
 qapi/qapi-clone-visitor.c    | 13 +++++++++++++
 2 files changed, 27 insertions(+)

diff --git a/include/qapi/clone-visitor.h b/include/qapi/clone-visitor.h
index b16177e..a4915c7 100644
--- a/include/qapi/clone-visitor.h
+++ b/include/qapi/clone-visitor.h
@@ -24,6 +24,9 @@ typedef struct QapiCloneVisitor QapiCloneVisitor;
 
 void *qapi_clone(const void *src, void (*visit_type)(Visitor *, const char *,
                                                      void **, Error **));
+void qapi_clone_members(void *dst, const void *src, size_t sz,
+                        void (*visit_type_members)(Visitor *, void *,
+                                                   Error **));
 
 /*
  * Deep-clone QAPI object @src of the given @type, and return the result.
@@ -36,4 +39,15 @@ void *qapi_clone(const void *src, void (*visit_type)(Visitor *, const char *,
                         (void (*)(Visitor *, const char *, void**,      \
                                   Error **))visit_type_ ## type))
 
+/*
+ * Copy deep clones of @type members from @src to @dst.
+ *
+ * Not usable on QAPI scalars (integers, strings, enums), nor on a
+ * QAPI object that references the 'any' type.
+ */
+#define QAPI_CLONE_MEMBERS(type, dst, src)                              \
+    qapi_clone_members(dst, src, sizeof(type),                          \
+                       (void (*)(Visitor *, void *,                     \
+                                 Error **))visit_type_ ## type ## _members)
+
 #endif
diff --git a/qapi/qapi-clone-visitor.c b/qapi/qapi-clone-visitor.c
index 34086cb..de756bf 100644
--- a/qapi/qapi-clone-visitor.c
+++ b/qapi/qapi-clone-visitor.c
@@ -180,3 +180,16 @@ void *qapi_clone(const void *src, void (*visit_type)(Visitor *, const char *,
     visit_free(v);
     return dst;
 }
+
+void qapi_clone_members(void *dst, const void *src, size_t sz,
+                        void (*visit_type_members)(Visitor *, void *,
+                                                   Error **))
+{
+    Visitor *v;
+
+    v = qapi_clone_visitor_new();
+    memcpy(dst, src, sz);
+    to_qcv(v)->depth++;
+    visit_type_members(v, dst, &error_abort);
+    visit_free(v);
+}
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [Qemu-devel] [PATCH 4/7] sockets: Rename SocketAddress to SocketAddressLegacy
  2017-04-26  7:36 [Qemu-devel] [PATCH 0/7] sockets: Flatten SocketAddress except in external interfaces Markus Armbruster
                   ` (2 preceding siblings ...)
  2017-04-26  7:36 ` [Qemu-devel] [PATCH 3/7] qapi: New QAPI_CLONE_MEMBERS() Markus Armbruster
@ 2017-04-26  7:36 ` Markus Armbruster
  2017-04-26 19:08   ` Eric Blake
  2017-04-26  7:36 ` [Qemu-devel] [PATCH 5/7] sockets: Rename SocketAddressFlat to SocketAddress Markus Armbruster
                   ` (3 subsequent siblings)
  7 siblings, 1 reply; 19+ messages in thread
From: Markus Armbruster @ 2017-04-26  7:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: berrange, kraxel, pbonzini, eblake, qemu-block

The next commit will rename SocketAddressFlat to SocketAddress, and
the commit after that will replace most uses of SocketAddressLegacy by
SocketAddress, replacing most of this commit's renames right back.

Note that checkpatch emits a few "line over 80 characters" warnings.
The long lines are all temporary; the SocketAddressLegacy replacement
will shorten them again.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 block/nbd.c                    |   4 +-
 block/sheepdog.c               |  18 +++----
 blockdev-nbd.c                 |   6 +--
 chardev/char-socket.c          |  28 +++++------
 chardev/char-udp.c             |  10 ++--
 hmp.c                          |   4 +-
 include/io/channel-socket.h    |  24 +++++-----
 include/io/dns-resolver.h      |  22 ++++-----
 include/io/task.h              |  10 ++--
 include/qemu/sockets.h         |  30 ++++++------
 io/channel-socket.c            |  48 +++++++++----------
 io/dns-resolver.c              |  48 +++++++++----------
 migration/socket.c             |  36 +++++++-------
 net/socket.c                   |  10 ++--
 qapi-schema.json               |  14 +++---
 qapi/block.json                |   2 +-
 qemu-nbd.c                     |  12 ++---
 qga/channel-posix.c            |   4 +-
 qga/main.c                     |   8 ++--
 tests/test-io-channel-socket.c |  72 ++++++++++++++--------------
 ui/vnc-auth-sasl.c             |   6 +--
 ui/vnc.c                       | 104 ++++++++++++++++++++---------------------
 util/qemu-sockets.c            | 100 +++++++++++++++++++--------------------
 23 files changed, 311 insertions(+), 309 deletions(-)

diff --git a/block/nbd.c b/block/nbd.c
index 9f4ff44..8bdcbc5 100644
--- a/block/nbd.c
+++ b/block/nbd.c
@@ -310,7 +310,7 @@ NBDClientSession *nbd_get_client_session(BlockDriverState *bs)
 static QIOChannelSocket *nbd_establish_connection(SocketAddressFlat *saddr_flat,
                                                   Error **errp)
 {
-    SocketAddress *saddr = socket_address_crumple(saddr_flat);
+    SocketAddressLegacy *saddr = socket_address_crumple(saddr_flat);
     QIOChannelSocket *sioc;
     Error *local_err = NULL;
 
@@ -320,7 +320,7 @@ static QIOChannelSocket *nbd_establish_connection(SocketAddressFlat *saddr_flat,
     qio_channel_socket_connect_sync(sioc,
                                     saddr,
                                     &local_err);
-    qapi_free_SocketAddress(saddr);
+    qapi_free_SocketAddressLegacy(saddr);
     if (local_err) {
         object_unref(OBJECT(sioc));
         error_propagate(errp, local_err);
diff --git a/block/sheepdog.c b/block/sheepdog.c
index b2a5998..7ee2e6e 100644
--- a/block/sheepdog.c
+++ b/block/sheepdog.c
@@ -378,7 +378,7 @@ struct BDRVSheepdogState {
     uint32_t cache_flags;
     bool discard_supported;
 
-    SocketAddress *addr;
+    SocketAddressLegacy *addr;
     int fd;
 
     CoMutex lock;
@@ -530,17 +530,17 @@ static void sd_aio_setup(SheepdogAIOCB *acb, BDRVSheepdogState *s,
     QLIST_INSERT_HEAD(&s->inflight_aiocb_head, acb, aiocb_siblings);
 }
 
-static SocketAddress *sd_socket_address(const char *path,
+static SocketAddressLegacy *sd_socket_address(const char *path,
                                         const char *host, const char *port)
 {
-    SocketAddress *addr = g_new0(SocketAddress, 1);
+    SocketAddressLegacy *addr = g_new0(SocketAddressLegacy, 1);
 
     if (path) {
-        addr->type = SOCKET_ADDRESS_KIND_UNIX;
+        addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
         addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
         addr->u.q_unix.data->path = g_strdup(path);
     } else {
-        addr->type = SOCKET_ADDRESS_KIND_INET;
+        addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
         addr->u.inet.data = g_new0(InetSocketAddress, 1);
         addr->u.inet.data->host = g_strdup(host ?: SD_DEFAULT_ADDR);
         addr->u.inet.data->port = g_strdup(port ?: stringify(SD_DEFAULT_PORT));
@@ -549,13 +549,13 @@ static SocketAddress *sd_socket_address(const char *path,
     return addr;
 }
 
-static SocketAddress *sd_server_config(QDict *options, Error **errp)
+static SocketAddressLegacy *sd_server_config(QDict *options, Error **errp)
 {
     QDict *server = NULL;
     QObject *crumpled_server = NULL;
     Visitor *iv = NULL;
     SocketAddressFlat *saddr_flat = NULL;
-    SocketAddress *saddr = NULL;
+    SocketAddressLegacy *saddr = NULL;
     Error *local_err = NULL;
 
     qdict_extract_subqdict(options, &server, "server.");
@@ -597,7 +597,7 @@ static int connect_to_sdog(BDRVSheepdogState *s, Error **errp)
 
     fd = socket_connect(s->addr, NULL, NULL, errp);
 
-    if (s->addr->type == SOCKET_ADDRESS_KIND_INET && fd >= 0) {
+    if (s->addr->type == SOCKET_ADDRESS_LEGACY_KIND_INET && fd >= 0) {
         int ret = socket_set_nodelay(fd);
         if (ret < 0) {
             error_report("%s", strerror(errno));
@@ -2149,7 +2149,7 @@ static void sd_close(BlockDriverState *bs)
     aio_set_fd_handler(bdrv_get_aio_context(bs), s->fd,
                        false, NULL, NULL, NULL, NULL);
     closesocket(s->fd);
-    qapi_free_SocketAddress(s->addr);
+    qapi_free_SocketAddressLegacy(s->addr);
 }
 
 static int64_t sd_getlength(BlockDriverState *bs)
diff --git a/blockdev-nbd.c b/blockdev-nbd.c
index 8a11807..6b0c699 100644
--- a/blockdev-nbd.c
+++ b/blockdev-nbd.c
@@ -99,7 +99,7 @@ static QCryptoTLSCreds *nbd_get_tls_creds(const char *id, Error **errp)
 }
 
 
-void qmp_nbd_server_start(SocketAddress *addr,
+void qmp_nbd_server_start(SocketAddressLegacy *addr,
                           bool has_tls_creds, const char *tls_creds,
                           Error **errp)
 {
@@ -124,8 +124,8 @@ void qmp_nbd_server_start(SocketAddress *addr,
             goto error;
         }
 
-        /* TODO SOCKET_ADDRESS_KIND_FD where fd has AF_INET or AF_INET6 */
-        if (addr->type != SOCKET_ADDRESS_KIND_INET) {
+        /* TODO SOCKET_ADDRESS_LEGACY_KIND_FD where fd has AF_INET or AF_INET6 */
+        if (addr->type != SOCKET_ADDRESS_LEGACY_KIND_INET) {
             error_setg(errp, "TLS is only supported with IPv4/IPv6");
             goto error;
         }
diff --git a/chardev/char-socket.c b/chardev/char-socket.c
index 36ab0d6..9eca786 100644
--- a/chardev/char-socket.c
+++ b/chardev/char-socket.c
@@ -52,7 +52,7 @@ typedef struct {
     int *write_msgfds;
     size_t write_msgfds_num;
 
-    SocketAddress *addr;
+    SocketAddressLegacy *addr;
     bool is_listen;
     bool is_telnet;
 
@@ -337,27 +337,27 @@ static void tcp_chr_free_connection(Chardev *chr)
     s->connected = 0;
 }
 
-static char *SocketAddress_to_str(const char *prefix, SocketAddress *addr,
+static char *SocketAddress_to_str(const char *prefix, SocketAddressLegacy *addr,
                                   bool is_listen, bool is_telnet)
 {
     switch (addr->type) {
-    case SOCKET_ADDRESS_KIND_INET:
+    case SOCKET_ADDRESS_LEGACY_KIND_INET:
         return g_strdup_printf("%s%s:%s:%s%s", prefix,
                                is_telnet ? "telnet" : "tcp",
                                addr->u.inet.data->host,
                                addr->u.inet.data->port,
                                is_listen ? ",server" : "");
         break;
-    case SOCKET_ADDRESS_KIND_UNIX:
+    case SOCKET_ADDRESS_LEGACY_KIND_UNIX:
         return g_strdup_printf("%sunix:%s%s", prefix,
                                addr->u.q_unix.data->path,
                                is_listen ? ",server" : "");
         break;
-    case SOCKET_ADDRESS_KIND_FD:
+    case SOCKET_ADDRESS_LEGACY_KIND_FD:
         return g_strdup_printf("%sfd:%s%s", prefix, addr->u.fd.data->str,
                                is_listen ? ",server" : "");
         break;
-    case SOCKET_ADDRESS_KIND_VSOCK:
+    case SOCKET_ADDRESS_LEGACY_KIND_VSOCK:
         return g_strdup_printf("%svsock:%s:%s", prefix,
                                addr->u.vsock.data->cid,
                                addr->u.vsock.data->port);
@@ -757,7 +757,7 @@ static void char_socket_finalize(Object *obj)
         g_source_remove(s->reconnect_timer);
         s->reconnect_timer = 0;
     }
-    qapi_free_SocketAddress(s->addr);
+    qapi_free_SocketAddressLegacy(s->addr);
     if (s->listen_tag) {
         g_source_remove(s->listen_tag);
         s->listen_tag = 0;
@@ -820,7 +820,7 @@ static void qmp_chardev_open_socket(Chardev *chr,
 {
     SocketChardev *s = SOCKET_CHARDEV(chr);
     ChardevSocket *sock = backend->u.socket.data;
-    SocketAddress *addr = sock->addr;
+    SocketAddressLegacy *addr = sock->addr;
     bool do_nodelay     = sock->has_nodelay ? sock->nodelay : false;
     bool is_listen      = sock->has_server  ? sock->server  : true;
     bool is_telnet      = sock->has_telnet  ? sock->telnet  : false;
@@ -864,11 +864,11 @@ static void qmp_chardev_open_socket(Chardev *chr,
         }
     }
 
-    s->addr = QAPI_CLONE(SocketAddress, sock->addr);
+    s->addr = QAPI_CLONE(SocketAddressLegacy, sock->addr);
 
     qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_RECONNECTABLE);
     /* TODO SOCKET_ADDRESS_FD where fd has AF_UNIX */
-    if (addr->type == SOCKET_ADDRESS_KIND_UNIX) {
+    if (addr->type == SOCKET_ADDRESS_LEGACY_KIND_UNIX) {
         qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_FD_PASS);
     }
 
@@ -939,7 +939,7 @@ static void qemu_chr_parse_socket(QemuOpts *opts, ChardevBackend *backend,
     const char *host = qemu_opt_get(opts, "host");
     const char *port = qemu_opt_get(opts, "port");
     const char *tls_creds = qemu_opt_get(opts, "tls-creds");
-    SocketAddress *addr;
+    SocketAddressLegacy *addr;
     ChardevSocket *sock;
 
     backend->type = CHARDEV_BACKEND_KIND_SOCKET;
@@ -974,14 +974,14 @@ static void qemu_chr_parse_socket(QemuOpts *opts, ChardevBackend *backend,
     sock->reconnect = reconnect;
     sock->tls_creds = g_strdup(tls_creds);
 
-    addr = g_new0(SocketAddress, 1);
+    addr = g_new0(SocketAddressLegacy, 1);
     if (path) {
         UnixSocketAddress *q_unix;
-        addr->type = SOCKET_ADDRESS_KIND_UNIX;
+        addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
         q_unix = addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
         q_unix->path = g_strdup(path);
     } else {
-        addr->type = SOCKET_ADDRESS_KIND_INET;
+        addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
         addr->u.inet.data = g_new(InetSocketAddress, 1);
         *addr->u.inet.data = (InetSocketAddress) {
             .host = g_strdup(host),
diff --git a/chardev/char-udp.c b/chardev/char-udp.c
index 804bd22..d9bcfc5 100644
--- a/chardev/char-udp.c
+++ b/chardev/char-udp.c
@@ -130,7 +130,7 @@ static void qemu_chr_parse_udp(QemuOpts *opts, ChardevBackend *backend,
     const char *localaddr = qemu_opt_get(opts, "localaddr");
     const char *localport = qemu_opt_get(opts, "localport");
     bool has_local = false;
-    SocketAddress *addr;
+    SocketAddressLegacy *addr;
     ChardevUdp *udp;
 
     backend->type = CHARDEV_BACKEND_KIND_UDP;
@@ -155,8 +155,8 @@ static void qemu_chr_parse_udp(QemuOpts *opts, ChardevBackend *backend,
     udp = backend->u.udp.data = g_new0(ChardevUdp, 1);
     qemu_chr_parse_common(opts, qapi_ChardevUdp_base(udp));
 
-    addr = g_new0(SocketAddress, 1);
-    addr->type = SOCKET_ADDRESS_KIND_INET;
+    addr = g_new0(SocketAddressLegacy, 1);
+    addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
     addr->u.inet.data = g_new(InetSocketAddress, 1);
     *addr->u.inet.data = (InetSocketAddress) {
         .host = g_strdup(host),
@@ -170,8 +170,8 @@ static void qemu_chr_parse_udp(QemuOpts *opts, ChardevBackend *backend,
 
     if (has_local) {
         udp->has_local = true;
-        addr = g_new0(SocketAddress, 1);
-        addr->type = SOCKET_ADDRESS_KIND_INET;
+        addr = g_new0(SocketAddressLegacy, 1);
+        addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
         addr->u.inet.data = g_new(InetSocketAddress, 1);
         *addr->u.inet.data = (InetSocketAddress) {
             .host = g_strdup(localaddr),
diff --git a/hmp.c b/hmp.c
index ab407d6..1fe109d 100644
--- a/hmp.c
+++ b/hmp.c
@@ -1934,7 +1934,7 @@ void hmp_nbd_server_start(Monitor *mon, const QDict *qdict)
     bool all = qdict_get_try_bool(qdict, "all", false);
     Error *local_err = NULL;
     BlockInfoList *block_list, *info;
-    SocketAddress *addr;
+    SocketAddressLegacy *addr;
 
     if (writable && !all) {
         error_setg(&local_err, "-w only valid together with -a");
@@ -1948,7 +1948,7 @@ void hmp_nbd_server_start(Monitor *mon, const QDict *qdict)
     }
 
     qmp_nbd_server_start(addr, false, NULL, &local_err);
-    qapi_free_SocketAddress(addr);
+    qapi_free_SocketAddressLegacy(addr);
     if (local_err != NULL) {
         goto exit;
     }
diff --git a/include/io/channel-socket.h b/include/io/channel-socket.h
index 711f8bf..c1aaa72 100644
--- a/include/io/channel-socket.h
+++ b/include/io/channel-socket.h
@@ -91,7 +91,7 @@ qio_channel_socket_new_fd(int fd,
  * an error occurs.
  */
 int qio_channel_socket_connect_sync(QIOChannelSocket *ioc,
-                                    SocketAddress *addr,
+                                    SocketAddressLegacy *addr,
                                     Error **errp);
 
 /**
@@ -110,7 +110,7 @@ int qio_channel_socket_connect_sync(QIOChannelSocket *ioc,
  * as this function returns without waiting for completion.
  */
 void qio_channel_socket_connect_async(QIOChannelSocket *ioc,
-                                      SocketAddress *addr,
+                                      SocketAddressLegacy *addr,
                                       QIOTaskFunc callback,
                                       gpointer opaque,
                                       GDestroyNotify destroy);
@@ -128,7 +128,7 @@ void qio_channel_socket_connect_async(QIOChannelSocket *ioc,
  * an error occurs.
  */
 int qio_channel_socket_listen_sync(QIOChannelSocket *ioc,
-                                   SocketAddress *addr,
+                                   SocketAddressLegacy *addr,
                                    Error **errp);
 
 /**
@@ -147,7 +147,7 @@ int qio_channel_socket_listen_sync(QIOChannelSocket *ioc,
  * as this function returns without waiting for completion.
  */
 void qio_channel_socket_listen_async(QIOChannelSocket *ioc,
-                                     SocketAddress *addr,
+                                     SocketAddressLegacy *addr,
                                      QIOTaskFunc callback,
                                      gpointer opaque,
                                      GDestroyNotify destroy);
@@ -167,8 +167,8 @@ void qio_channel_socket_listen_async(QIOChannelSocket *ioc,
  * is established or an error occurs.
  */
 int qio_channel_socket_dgram_sync(QIOChannelSocket *ioc,
-                                  SocketAddress *localAddr,
-                                  SocketAddress *remoteAddr,
+                                  SocketAddressLegacy *localAddr,
+                                  SocketAddressLegacy *remoteAddr,
                                   Error **errp);
 
 /**
@@ -190,8 +190,8 @@ int qio_channel_socket_dgram_sync(QIOChannelSocket *ioc,
  * waiting for completion.
  */
 void qio_channel_socket_dgram_async(QIOChannelSocket *ioc,
-                                    SocketAddress *localAddr,
-                                    SocketAddress *remoteAddr,
+                                    SocketAddressLegacy *localAddr,
+                                    SocketAddressLegacy *remoteAddr,
                                     QIOTaskFunc callback,
                                     gpointer opaque,
                                     GDestroyNotify destroy);
@@ -205,12 +205,12 @@ void qio_channel_socket_dgram_async(QIOChannelSocket *ioc,
  * Get the string representation of the local socket
  * address. A pointer to the allocated address information
  * struct will be returned, which the caller is required to
- * release with a call qapi_free_SocketAddress when no
+ * release with a call qapi_free_SocketAddressLegacy() when no
  * longer required.
  *
  * Returns: 0 on success, -1 on error
  */
-SocketAddress *
+SocketAddressLegacy *
 qio_channel_socket_get_local_address(QIOChannelSocket *ioc,
                                      Error **errp);
 
@@ -222,12 +222,12 @@ qio_channel_socket_get_local_address(QIOChannelSocket *ioc,
  * Get the string representation of the local socket
  * address. A pointer to the allocated address information
  * struct will be returned, which the caller is required to
- * release with a call qapi_free_SocketAddress when no
+ * release with a call qapi_free_SocketAddressLegacy() when no
  * longer required.
  *
  * Returns: the socket address struct, or NULL on error
  */
-SocketAddress *
+SocketAddressLegacy *
 qio_channel_socket_get_remote_address(QIOChannelSocket *ioc,
                                       Error **errp);
 
diff --git a/include/io/dns-resolver.h b/include/io/dns-resolver.h
index 2f69c08..aac46ca 100644
--- a/include/io/dns-resolver.h
+++ b/include/io/dns-resolver.h
@@ -40,15 +40,15 @@ typedef struct QIODNSResolverClass QIODNSResolverClass;
  * QIODNSResolver:
  *
  * The QIODNSResolver class provides a framework for doing
- * DNS resolution on SocketAddress objects, independently
+ * DNS resolution on SocketAddressLegacy objects, independently
  * of socket creation.
  *
  * <example>
  *   <title>Resolving addresses synchronously</title>
  *   <programlisting>
- *    int mylisten(SocketAddress *addr, Error **errp) {
+ *    int mylisten(SocketAddressLegacy *addr, Error **errp) {
  *      QIODNSResolver *resolver = qio_dns_resolver_get_instance();
- *      SocketAddress **rawaddrs = NULL;
+ *      SocketAddressLegacy **rawaddrs = NULL;
  *      size_t nrawaddrs = 0;
  *      Error *err = NULL;
  *      QIOChannel **socks = NULL;
@@ -69,7 +69,7 @@ typedef struct QIODNSResolverClass QIODNSResolverClass;
  *            socks = g_renew(QIOChannelSocket *, socks, nsocks + 1);
  *            socks[nsocks++] = sock;
  *         }
- *         qapi_free_SocketAddress(rawaddrs[i]);
+ *         qapi_free_SocketAddressLegacy(rawaddrs[i]);
  *      }
  *      g_free(rawaddrs);
  *
@@ -95,7 +95,7 @@ typedef struct QIODNSResolverClass QIODNSResolverClass;
  *      MyListenData *data = opaque;
  *      QIODNSResolver *resolver =
  *         QIO_DNS_RESOLVER(qio_task_get_source(task);
- *      SocketAddress **rawaddrs = NULL;
+ *      SocketAddressLegacy **rawaddrs = NULL;
  *      size_t nrawaddrs = 0;
  *      Error *err = NULL;
  *
@@ -116,7 +116,7 @@ typedef struct QIODNSResolverClass QIODNSResolverClass;
  *            socks = g_renew(QIOChannelSocket *, socks, nsocks + 1);
  *            socks[nsocks++] = sock;
  *         }
- *         qapi_free_SocketAddress(rawaddrs[i]);
+ *         qapi_free_SocketAddressLegacy(rawaddrs[i]);
  *      }
  *      g_free(rawaddrs);
  *
@@ -127,7 +127,7 @@ typedef struct QIODNSResolverClass QIODNSResolverClass;
  *      }
  *    }
  *
- *    void mylisten(SocketAddress *addr, MyListenData *data) {
+ *    void mylisten(SocketAddressLegacy *addr, MyListenData *data) {
  *      QIODNSResolver *resolver = qio_dns_resolver_get_instance();
  *      qio_dns_resolver_lookup_async(dns, addr,
  *                                    mylistenresult, data, NULL);
@@ -177,9 +177,9 @@ QIODNSResolver *qio_dns_resolver_get_instance(void);
  * Returns: 0 if resolution was successful, -1 on error
  */
 int qio_dns_resolver_lookup_sync(QIODNSResolver *resolver,
-                                 SocketAddress *addr,
+                                 SocketAddressLegacy *addr,
                                  size_t *naddrs,
-                                 SocketAddress ***addrs,
+                                 SocketAddressLegacy ***addrs,
                                  Error **errp);
 
 /**
@@ -201,7 +201,7 @@ int qio_dns_resolver_lookup_sync(QIODNSResolver *resolver,
  * of the caller will not be blocked.
  */
 void qio_dns_resolver_lookup_async(QIODNSResolver *resolver,
-                                   SocketAddress *addr,
+                                   SocketAddressLegacy *addr,
                                    QIOTaskFunc func,
                                    gpointer opaque,
                                    GDestroyNotify notify);
@@ -223,6 +223,6 @@ void qio_dns_resolver_lookup_async(QIODNSResolver *resolver,
 void qio_dns_resolver_lookup_result(QIODNSResolver *resolver,
                                     QIOTask *task,
                                     size_t *naddrs,
-                                    SocketAddress ***addrs);
+                                    SocketAddressLegacy ***addrs);
 
 #endif /* QIO_DNS_RESOLVER_H */
diff --git a/include/io/task.h b/include/io/task.h
index 6021f51..f65ec7a 100644
--- a/include/io/task.h
+++ b/include/io/task.h
@@ -166,7 +166,7 @@ typedef void (*QIOTaskWorker)(QIOTask *task,
  *                                       gpointer opaque)
  *    {
  *       QMyObject obj = QMY_OBJECT(qio_task_get_source(task));
- *       SocketAddress *addr = opaque;
+ *       SocketAddressLegacy *addr = opaque;
  *       Error *err = NULL;
  *
  *       obj->fd = socket_listen(addr, &err);
@@ -175,20 +175,20 @@ typedef void (*QIOTaskWorker)(QIOTask *task,
  *    }
  *
  *    void myobject_listen_async(QMyObject *obj,
- *                               SocketAddress *addr,
+ *                               SocketAddressLegacy *addr,
  *                               QIOTaskFunc *func,
  *                               gpointer opaque,
  *                               GDestroyNotify notify)
  *    {
  *      QIOTask *task;
- *      SocketAddress *addrCopy;
+ *      SocketAddressLegacy *addrCopy;
  *
- *      addrCopy = QAPI_CLONE(SocketAddress, addr);
+ *      addrCopy = QAPI_CLONE(SocketAddressLegacy, addr);
  *      task = qio_task_new(OBJECT(obj), func, opaque, notify);
  *
  *      qio_task_run_in_thread(task, myobject_listen_worker,
  *                             addrCopy,
- *                             qapi_free_SocketAddress);
+ *                             qapi_free_SocketAddressLegacy);
  *    }
  * </example>
  *
diff --git a/include/qemu/sockets.h b/include/qemu/sockets.h
index 8b9325c..f4a4b10 100644
--- a/include/qemu/sockets.h
+++ b/include/qemu/sockets.h
@@ -45,12 +45,12 @@ NetworkAddressFamily inet_netfamily(int family);
 int unix_listen(const char *path, char *ostr, int olen, Error **errp);
 int unix_connect(const char *path, Error **errp);
 
-SocketAddress *socket_parse(const char *str, Error **errp);
-int socket_connect(SocketAddress *addr, NonBlockingConnectHandler *callback,
+SocketAddressLegacy *socket_parse(const char *str, Error **errp);
+int socket_connect(SocketAddressLegacy *addr, NonBlockingConnectHandler *callback,
                    void *opaque, Error **errp);
-int socket_listen(SocketAddress *addr, Error **errp);
+int socket_listen(SocketAddressLegacy *addr, Error **errp);
 void socket_listen_cleanup(int fd, Error **errp);
-int socket_dgram(SocketAddress *remote, SocketAddress *local, Error **errp);
+int socket_dgram(SocketAddressLegacy *remote, SocketAddressLegacy *local, Error **errp);
 
 /* Old, ipv4 only bits.  Don't use for new code. */
 int parse_host_port(struct sockaddr_in *saddr, const char *str);
@@ -65,12 +65,12 @@ int socket_init(void);
  * Get the string representation of the socket
  * address. A pointer to the allocated address information
  * struct will be returned, which the caller is required to
- * release with a call qapi_free_SocketAddress when no
+ * release with a call qapi_free_SocketAddressLegacy() when no
  * longer required.
  *
  * Returns: the socket address struct, or NULL on error
  */
-SocketAddress *
+SocketAddressLegacy *
 socket_sockaddr_to_address(struct sockaddr_storage *sa,
                            socklen_t salen,
                            Error **errp);
@@ -83,12 +83,12 @@ socket_sockaddr_to_address(struct sockaddr_storage *sa,
  * Get the string representation of the local socket
  * address. A pointer to the allocated address information
  * struct will be returned, which the caller is required to
- * release with a call qapi_free_SocketAddress when no
+ * release with a call qapi_free_SocketAddressLegacy() when no
  * longer required.
  *
  * Returns: the socket address struct, or NULL on error
  */
-SocketAddress *socket_local_address(int fd, Error **errp);
+SocketAddressLegacy *socket_local_address(int fd, Error **errp);
 
 /**
  * socket_remote_address:
@@ -98,12 +98,12 @@ SocketAddress *socket_local_address(int fd, Error **errp);
  * Get the string representation of the remote socket
  * address. A pointer to the allocated address information
  * struct will be returned, which the caller is required to
- * release with a call qapi_free_SocketAddress when no
+ * release with a call qapi_free_SocketAddressLegacy() when no
  * longer required.
  *
  * Returns: the socket address struct, or NULL on error
  */
-SocketAddress *socket_remote_address(int fd, Error **errp);
+SocketAddressLegacy *socket_remote_address(int fd, Error **errp);
 
 /**
  * socket_address_to_string:
@@ -118,17 +118,17 @@ SocketAddress *socket_remote_address(int fd, Error **errp);
  *
  * Returns: the socket address in string format, or NULL on error
  */
-char *socket_address_to_string(struct SocketAddress *addr, Error **errp);
+char *socket_address_to_string(struct SocketAddressLegacy *addr, Error **errp);
 
 /**
  * socket_address_crumple:
  * @addr_flat: the socket address to crumple
  *
- * Convert SocketAddressFlat to SocketAddress.  Caller is responsible
- * for freeing with qapi_free_SocketAddress().
+ * Convert SocketAddressFlat to SocketAddressLegacy.  Caller is responsible
+ * for freeing with qapi_free_SocketAddressLegacy().
  *
- * Returns: the argument converted to SocketAddress.
+ * Returns: the argument converted to SocketAddressLegacy.
  */
-SocketAddress *socket_address_crumple(SocketAddressFlat *addr_flat);
+SocketAddressLegacy *socket_address_crumple(SocketAddressFlat *addr_flat);
 
 #endif /* QEMU_SOCKETS_H */
diff --git a/io/channel-socket.c b/io/channel-socket.c
index 53386b7..a21dab6 100644
--- a/io/channel-socket.c
+++ b/io/channel-socket.c
@@ -27,7 +27,7 @@
 
 #define SOCKET_MAX_FDS 16
 
-SocketAddress *
+SocketAddressLegacy *
 qio_channel_socket_get_local_address(QIOChannelSocket *ioc,
                                      Error **errp)
 {
@@ -36,7 +36,7 @@ qio_channel_socket_get_local_address(QIOChannelSocket *ioc,
                                       errp);
 }
 
-SocketAddress *
+SocketAddressLegacy *
 qio_channel_socket_get_remote_address(QIOChannelSocket *ioc,
                                       Error **errp)
 {
@@ -134,7 +134,7 @@ qio_channel_socket_new_fd(int fd,
 
 
 int qio_channel_socket_connect_sync(QIOChannelSocket *ioc,
-                                    SocketAddress *addr,
+                                    SocketAddressLegacy *addr,
                                     Error **errp)
 {
     int fd;
@@ -160,7 +160,7 @@ static void qio_channel_socket_connect_worker(QIOTask *task,
                                               gpointer opaque)
 {
     QIOChannelSocket *ioc = QIO_CHANNEL_SOCKET(qio_task_get_source(task));
-    SocketAddress *addr = opaque;
+    SocketAddressLegacy *addr = opaque;
     Error *err = NULL;
 
     qio_channel_socket_connect_sync(ioc, addr, &err);
@@ -170,16 +170,16 @@ static void qio_channel_socket_connect_worker(QIOTask *task,
 
 
 void qio_channel_socket_connect_async(QIOChannelSocket *ioc,
-                                      SocketAddress *addr,
+                                      SocketAddressLegacy *addr,
                                       QIOTaskFunc callback,
                                       gpointer opaque,
                                       GDestroyNotify destroy)
 {
     QIOTask *task = qio_task_new(
         OBJECT(ioc), callback, opaque, destroy);
-    SocketAddress *addrCopy;
+    SocketAddressLegacy *addrCopy;
 
-    addrCopy = QAPI_CLONE(SocketAddress, addr);
+    addrCopy = QAPI_CLONE(SocketAddressLegacy, addr);
 
     /* socket_connect() does a non-blocking connect(), but it
      * still blocks in DNS lookups, so we must use a thread */
@@ -187,12 +187,12 @@ void qio_channel_socket_connect_async(QIOChannelSocket *ioc,
     qio_task_run_in_thread(task,
                            qio_channel_socket_connect_worker,
                            addrCopy,
-                           (GDestroyNotify)qapi_free_SocketAddress);
+                           (GDestroyNotify)qapi_free_SocketAddressLegacy);
 }
 
 
 int qio_channel_socket_listen_sync(QIOChannelSocket *ioc,
-                                   SocketAddress *addr,
+                                   SocketAddressLegacy *addr,
                                    Error **errp)
 {
     int fd;
@@ -219,7 +219,7 @@ static void qio_channel_socket_listen_worker(QIOTask *task,
                                              gpointer opaque)
 {
     QIOChannelSocket *ioc = QIO_CHANNEL_SOCKET(qio_task_get_source(task));
-    SocketAddress *addr = opaque;
+    SocketAddressLegacy *addr = opaque;
     Error *err = NULL;
 
     qio_channel_socket_listen_sync(ioc, addr, &err);
@@ -229,29 +229,29 @@ static void qio_channel_socket_listen_worker(QIOTask *task,
 
 
 void qio_channel_socket_listen_async(QIOChannelSocket *ioc,
-                                     SocketAddress *addr,
+                                     SocketAddressLegacy *addr,
                                      QIOTaskFunc callback,
                                      gpointer opaque,
                                      GDestroyNotify destroy)
 {
     QIOTask *task = qio_task_new(
         OBJECT(ioc), callback, opaque, destroy);
-    SocketAddress *addrCopy;
+    SocketAddressLegacy *addrCopy;
 
-    addrCopy = QAPI_CLONE(SocketAddress, addr);
+    addrCopy = QAPI_CLONE(SocketAddressLegacy, addr);
 
     /* socket_listen() blocks in DNS lookups, so we must use a thread */
     trace_qio_channel_socket_listen_async(ioc, addr);
     qio_task_run_in_thread(task,
                            qio_channel_socket_listen_worker,
                            addrCopy,
-                           (GDestroyNotify)qapi_free_SocketAddress);
+                           (GDestroyNotify)qapi_free_SocketAddressLegacy);
 }
 
 
 int qio_channel_socket_dgram_sync(QIOChannelSocket *ioc,
-                                  SocketAddress *localAddr,
-                                  SocketAddress *remoteAddr,
+                                  SocketAddressLegacy *localAddr,
+                                  SocketAddressLegacy *remoteAddr,
                                   Error **errp)
 {
     int fd;
@@ -274,16 +274,16 @@ int qio_channel_socket_dgram_sync(QIOChannelSocket *ioc,
 
 
 struct QIOChannelSocketDGramWorkerData {
-    SocketAddress *localAddr;
-    SocketAddress *remoteAddr;
+    SocketAddressLegacy *localAddr;
+    SocketAddressLegacy *remoteAddr;
 };
 
 
 static void qio_channel_socket_dgram_worker_free(gpointer opaque)
 {
     struct QIOChannelSocketDGramWorkerData *data = opaque;
-    qapi_free_SocketAddress(data->localAddr);
-    qapi_free_SocketAddress(data->remoteAddr);
+    qapi_free_SocketAddressLegacy(data->localAddr);
+    qapi_free_SocketAddressLegacy(data->remoteAddr);
     g_free(data);
 }
 
@@ -303,8 +303,8 @@ static void qio_channel_socket_dgram_worker(QIOTask *task,
 
 
 void qio_channel_socket_dgram_async(QIOChannelSocket *ioc,
-                                    SocketAddress *localAddr,
-                                    SocketAddress *remoteAddr,
+                                    SocketAddressLegacy *localAddr,
+                                    SocketAddressLegacy *remoteAddr,
                                     QIOTaskFunc callback,
                                     gpointer opaque,
                                     GDestroyNotify destroy)
@@ -314,8 +314,8 @@ void qio_channel_socket_dgram_async(QIOChannelSocket *ioc,
     struct QIOChannelSocketDGramWorkerData *data = g_new0(
         struct QIOChannelSocketDGramWorkerData, 1);
 
-    data->localAddr = QAPI_CLONE(SocketAddress, localAddr);
-    data->remoteAddr = QAPI_CLONE(SocketAddress, remoteAddr);
+    data->localAddr = QAPI_CLONE(SocketAddressLegacy, localAddr);
+    data->remoteAddr = QAPI_CLONE(SocketAddressLegacy, remoteAddr);
 
     trace_qio_channel_socket_dgram_async(ioc, localAddr, remoteAddr);
     qio_task_run_in_thread(task,
diff --git a/io/dns-resolver.c b/io/dns-resolver.c
index 759d1b4..d3f0cbf 100644
--- a/io/dns-resolver.c
+++ b/io/dns-resolver.c
@@ -45,9 +45,9 @@ QIODNSResolver *qio_dns_resolver_get_instance(void)
 }
 
 static int qio_dns_resolver_lookup_sync_inet(QIODNSResolver *resolver,
-                                             SocketAddress *addr,
+                                             SocketAddressLegacy *addr,
                                              size_t *naddrs,
-                                             SocketAddress ***addrs,
+                                             SocketAddressLegacy ***addrs,
                                              Error **errp)
 {
     struct addrinfo ai, *res, *e;
@@ -97,14 +97,14 @@ static int qio_dns_resolver_lookup_sync_inet(QIODNSResolver *resolver,
         (*naddrs)++;
     }
 
-    *addrs = g_new0(SocketAddress *, *naddrs);
+    *addrs = g_new0(SocketAddressLegacy *, *naddrs);
 
     /* create socket + bind */
     for (i = 0, e = res; e != NULL; i++, e = e->ai_next) {
-        SocketAddress *newaddr = g_new0(SocketAddress, 1);
+        SocketAddressLegacy *newaddr = g_new0(SocketAddressLegacy, 1);
         InetSocketAddress *newiaddr = g_new0(InetSocketAddress, 1);
         newaddr->u.inet.data = newiaddr;
-        newaddr->type = SOCKET_ADDRESS_KIND_INET;
+        newaddr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
 
         getnameinfo((struct sockaddr *)e->ai_addr, e->ai_addrlen,
                     uaddr, INET6_ADDRSTRLEN, uport, 32,
@@ -129,36 +129,36 @@ static int qio_dns_resolver_lookup_sync_inet(QIODNSResolver *resolver,
 
 
 static int qio_dns_resolver_lookup_sync_nop(QIODNSResolver *resolver,
-                                            SocketAddress *addr,
+                                            SocketAddressLegacy *addr,
                                             size_t *naddrs,
-                                            SocketAddress ***addrs,
+                                            SocketAddressLegacy ***addrs,
                                             Error **errp)
 {
     *naddrs = 1;
-    *addrs = g_new0(SocketAddress *, 1);
-    (*addrs)[0] = QAPI_CLONE(SocketAddress, addr);
+    *addrs = g_new0(SocketAddressLegacy *, 1);
+    (*addrs)[0] = QAPI_CLONE(SocketAddressLegacy, addr);
 
     return 0;
 }
 
 
 int qio_dns_resolver_lookup_sync(QIODNSResolver *resolver,
-                                 SocketAddress *addr,
+                                 SocketAddressLegacy *addr,
                                  size_t *naddrs,
-                                 SocketAddress ***addrs,
+                                 SocketAddressLegacy ***addrs,
                                  Error **errp)
 {
     switch (addr->type) {
-    case SOCKET_ADDRESS_KIND_INET:
+    case SOCKET_ADDRESS_LEGACY_KIND_INET:
         return qio_dns_resolver_lookup_sync_inet(resolver,
                                                  addr,
                                                  naddrs,
                                                  addrs,
                                                  errp);
 
-    case SOCKET_ADDRESS_KIND_UNIX:
-    case SOCKET_ADDRESS_KIND_VSOCK:
-    case SOCKET_ADDRESS_KIND_FD:
+    case SOCKET_ADDRESS_LEGACY_KIND_UNIX:
+    case SOCKET_ADDRESS_LEGACY_KIND_VSOCK:
+    case SOCKET_ADDRESS_LEGACY_KIND_FD:
         return qio_dns_resolver_lookup_sync_nop(resolver,
                                                 addr,
                                                 naddrs,
@@ -172,8 +172,8 @@ int qio_dns_resolver_lookup_sync(QIODNSResolver *resolver,
 
 
 struct QIODNSResolverLookupData {
-    SocketAddress *addr;
-    SocketAddress **addrs;
+    SocketAddressLegacy *addr;
+    SocketAddressLegacy **addrs;
     size_t naddrs;
 };
 
@@ -183,9 +183,9 @@ static void qio_dns_resolver_lookup_data_free(gpointer opaque)
     struct QIODNSResolverLookupData *data = opaque;
     size_t i;
 
-    qapi_free_SocketAddress(data->addr);
+    qapi_free_SocketAddressLegacy(data->addr);
     for (i = 0; i < data->naddrs; i++) {
-        qapi_free_SocketAddress(data->addrs[i]);
+        qapi_free_SocketAddressLegacy(data->addrs[i]);
     }
 
     g_free(data->addrs);
@@ -216,7 +216,7 @@ static void qio_dns_resolver_lookup_worker(QIOTask *task,
 
 
 void qio_dns_resolver_lookup_async(QIODNSResolver *resolver,
-                                   SocketAddress *addr,
+                                   SocketAddressLegacy *addr,
                                    QIOTaskFunc func,
                                    gpointer opaque,
                                    GDestroyNotify notify)
@@ -225,7 +225,7 @@ void qio_dns_resolver_lookup_async(QIODNSResolver *resolver,
     struct QIODNSResolverLookupData *data =
         g_new0(struct QIODNSResolverLookupData, 1);
 
-    data->addr = QAPI_CLONE(SocketAddress, addr);
+    data->addr = QAPI_CLONE(SocketAddressLegacy, addr);
 
     task = qio_task_new(OBJECT(resolver), func, opaque, notify);
 
@@ -239,7 +239,7 @@ void qio_dns_resolver_lookup_async(QIODNSResolver *resolver,
 void qio_dns_resolver_lookup_result(QIODNSResolver *resolver,
                                     QIOTask *task,
                                     size_t *naddrs,
-                                    SocketAddress ***addrs)
+                                    SocketAddressLegacy ***addrs)
 {
     struct QIODNSResolverLookupData *data =
         qio_task_get_result_pointer(task);
@@ -252,9 +252,9 @@ void qio_dns_resolver_lookup_result(QIODNSResolver *resolver,
     }
 
     *naddrs = data->naddrs;
-    *addrs = g_new0(SocketAddress *, data->naddrs);
+    *addrs = g_new0(SocketAddressLegacy *, data->naddrs);
     for (i = 0; i < data->naddrs; i++) {
-        (*addrs)[i] = QAPI_CLONE(SocketAddress, data->addrs[i]);
+        (*addrs)[i] = QAPI_CLONE(SocketAddressLegacy, data->addrs[i]);
     }
 }
 
diff --git a/migration/socket.c b/migration/socket.c
index 8db6d0d..c556b63 100644
--- a/migration/socket.c
+++ b/migration/socket.c
@@ -25,30 +25,30 @@
 #include "trace.h"
 
 
-static SocketAddress *tcp_build_address(const char *host_port, Error **errp)
+static SocketAddressLegacy *tcp_build_address(const char *host_port, Error **errp)
 {
     InetSocketAddress *iaddr = g_new(InetSocketAddress, 1);
-    SocketAddress *saddr;
+    SocketAddressLegacy *saddr;
 
     if (inet_parse(iaddr, host_port, errp)) {
         qapi_free_InetSocketAddress(iaddr);
         return NULL;
     }
 
-    saddr = g_new0(SocketAddress, 1);
-    saddr->type = SOCKET_ADDRESS_KIND_INET;
+    saddr = g_new0(SocketAddressLegacy, 1);
+    saddr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
     saddr->u.inet.data = iaddr;
 
     return saddr;
 }
 
 
-static SocketAddress *unix_build_address(const char *path)
+static SocketAddressLegacy *unix_build_address(const char *path)
 {
-    SocketAddress *saddr;
+    SocketAddressLegacy *saddr;
 
-    saddr = g_new0(SocketAddress, 1);
-    saddr->type = SOCKET_ADDRESS_KIND_UNIX;
+    saddr = g_new0(SocketAddressLegacy, 1);
+    saddr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
     saddr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
     saddr->u.q_unix.data->path = g_strdup(path);
 
@@ -91,14 +91,14 @@ static void socket_outgoing_migration(QIOTask *task,
 }
 
 static void socket_start_outgoing_migration(MigrationState *s,
-                                            SocketAddress *saddr,
+                                            SocketAddressLegacy *saddr,
                                             Error **errp)
 {
     QIOChannelSocket *sioc = qio_channel_socket_new();
     struct SocketConnectData *data = g_new0(struct SocketConnectData, 1);
 
     data->s = s;
-    if (saddr->type == SOCKET_ADDRESS_KIND_INET) {
+    if (saddr->type == SOCKET_ADDRESS_LEGACY_KIND_INET) {
         data->hostname = g_strdup(saddr->u.inet.data->host);
     }
 
@@ -108,7 +108,7 @@ static void socket_start_outgoing_migration(MigrationState *s,
                                      socket_outgoing_migration,
                                      data,
                                      socket_connect_data_free);
-    qapi_free_SocketAddress(saddr);
+    qapi_free_SocketAddressLegacy(saddr);
 }
 
 void tcp_start_outgoing_migration(MigrationState *s,
@@ -116,7 +116,7 @@ void tcp_start_outgoing_migration(MigrationState *s,
                                   Error **errp)
 {
     Error *err = NULL;
-    SocketAddress *saddr = tcp_build_address(host_port, &err);
+    SocketAddressLegacy *saddr = tcp_build_address(host_port, &err);
     if (!err) {
         socket_start_outgoing_migration(s, saddr, &err);
     }
@@ -127,7 +127,7 @@ void unix_start_outgoing_migration(MigrationState *s,
                                    const char *path,
                                    Error **errp)
 {
-    SocketAddress *saddr = unix_build_address(path);
+    SocketAddressLegacy *saddr = unix_build_address(path);
     socket_start_outgoing_migration(s, saddr, errp);
 }
 
@@ -161,7 +161,7 @@ out:
 }
 
 
-static void socket_start_incoming_migration(SocketAddress *saddr,
+static void socket_start_incoming_migration(SocketAddressLegacy *saddr,
                                             Error **errp)
 {
     QIOChannelSocket *listen_ioc = qio_channel_socket_new();
@@ -171,7 +171,7 @@ static void socket_start_incoming_migration(SocketAddress *saddr,
 
     if (qio_channel_socket_listen_sync(listen_ioc, saddr, errp) < 0) {
         object_unref(OBJECT(listen_ioc));
-        qapi_free_SocketAddress(saddr);
+        qapi_free_SocketAddressLegacy(saddr);
         return;
     }
 
@@ -180,13 +180,13 @@ static void socket_start_incoming_migration(SocketAddress *saddr,
                           socket_accept_incoming_migration,
                           listen_ioc,
                           (GDestroyNotify)object_unref);
-    qapi_free_SocketAddress(saddr);
+    qapi_free_SocketAddressLegacy(saddr);
 }
 
 void tcp_start_incoming_migration(const char *host_port, Error **errp)
 {
     Error *err = NULL;
-    SocketAddress *saddr = tcp_build_address(host_port, &err);
+    SocketAddressLegacy *saddr = tcp_build_address(host_port, &err);
     if (!err) {
         socket_start_incoming_migration(saddr, &err);
     }
@@ -195,6 +195,6 @@ void tcp_start_incoming_migration(const char *host_port, Error **errp)
 
 void unix_start_incoming_migration(const char *path, Error **errp)
 {
-    SocketAddress *saddr = unix_build_address(path);
+    SocketAddressLegacy *saddr = unix_build_address(path);
     socket_start_incoming_migration(saddr, errp);
 }
diff --git a/net/socket.c b/net/socket.c
index b8c931e..ecd165f 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -489,7 +489,7 @@ static int net_socket_listen_init(NetClientState *peer,
 {
     NetClientState *nc;
     NetSocketState *s;
-    SocketAddress *saddr;
+    SocketAddressLegacy *saddr;
     int ret;
     Error *local_error = NULL;
 
@@ -501,7 +501,7 @@ static int net_socket_listen_init(NetClientState *peer,
 
     ret = socket_listen(saddr, &local_error);
     if (ret < 0) {
-        qapi_free_SocketAddress(saddr);
+        qapi_free_SocketAddressLegacy(saddr);
         error_report_err(local_error);
         return -1;
     }
@@ -514,20 +514,20 @@ static int net_socket_listen_init(NetClientState *peer,
     net_socket_rs_init(&s->rs, net_socket_rs_finalize);
 
     qemu_set_fd_handler(s->listen_fd, net_socket_accept, NULL, s);
-    qapi_free_SocketAddress(saddr);
+    qapi_free_SocketAddressLegacy(saddr);
     return 0;
 }
 
 typedef struct {
     NetClientState *peer;
-    SocketAddress *saddr;
+    SocketAddressLegacy *saddr;
     char *model;
     char *name;
 } socket_connect_data;
 
 static void socket_connect_data_free(socket_connect_data *c)
 {
-    qapi_free_SocketAddress(c->saddr);
+    qapi_free_SocketAddressLegacy(c->saddr);
     g_free(c->model);
     g_free(c->name);
     g_free(c);
diff --git a/qapi-schema.json b/qapi-schema.json
index 01b087f..b5a042b 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -4122,13 +4122,15 @@
     'port': 'str' } }
 
 ##
-# @SocketAddress:
+# @SocketAddressLegacy:
 #
 # Captures the address of a socket, which could also be a named file descriptor
 #
+# Note: This type is deprecated in favor of SocketAddressFlat.
+#
 # Since: 1.3
 ##
-{ 'union': 'SocketAddress',
+{ 'union': 'SocketAddressLegacy',
   'data': {
     'inet': 'InetSocketAddress',
     'unix': 'UnixSocketAddress',
@@ -4156,7 +4158,7 @@
 #
 # @type:       Transport type
 #
-# This is just like SocketAddress, except it's a flat union rather
+# This is just like SocketAddressLegacy, except it's a flat union rather
 # than a simple union.  Nicer because it avoids nesting on the wire,
 # i.e. this form has fewer {}.
 #
@@ -4884,7 +4886,7 @@
 #
 # Since: 1.4
 ##
-{ 'struct': 'ChardevSocket', 'data': { 'addr'       : 'SocketAddress',
+{ 'struct': 'ChardevSocket', 'data': { 'addr'       : 'SocketAddressLegacy',
                                      '*tls-creds'  : 'str',
                                      '*server'    : 'bool',
                                      '*wait'      : 'bool',
@@ -4903,8 +4905,8 @@
 #
 # Since: 1.5
 ##
-{ 'struct': 'ChardevUdp', 'data': { 'remote' : 'SocketAddress',
-                                  '*local' : 'SocketAddress' },
+{ 'struct': 'ChardevUdp', 'data': { 'remote' : 'SocketAddressLegacy',
+                                  '*local' : 'SocketAddressLegacy' },
   'base': 'ChardevCommon' }
 
 ##
diff --git a/qapi/block.json b/qapi/block.json
index 46fca0e..6a2fdc7 100644
--- a/qapi/block.json
+++ b/qapi/block.json
@@ -204,7 +204,7 @@
 # Since: 1.3.0
 ##
 { 'command': 'nbd-server-start',
-  'data': { 'addr': 'SocketAddress',
+  'data': { 'addr': 'SocketAddressLegacy',
             '*tls-creds': 'str'} }
 
 ##
diff --git a/qemu-nbd.c b/qemu-nbd.c
index e080fb7..c60a4a8 100644
--- a/qemu-nbd.c
+++ b/qemu-nbd.c
@@ -57,7 +57,7 @@ static NBDExport *exp;
 static bool newproto;
 static int verbose;
 static char *srcpath;
-static SocketAddress *saddr;
+static SocketAddressLegacy *saddr;
 static int persistent = 0;
 static enum { RUNNING, TERMINATE, TERMINATING, TERMINATED } state;
 static int shared = 1;
@@ -387,20 +387,20 @@ static void nbd_update_server_watch(void)
 }
 
 
-static SocketAddress *nbd_build_socket_address(const char *sockpath,
+static SocketAddressLegacy *nbd_build_socket_address(const char *sockpath,
                                                const char *bindto,
                                                const char *port)
 {
-    SocketAddress *saddr;
+    SocketAddressLegacy *saddr;
 
-    saddr = g_new0(SocketAddress, 1);
+    saddr = g_new0(SocketAddressLegacy, 1);
     if (sockpath) {
-        saddr->type = SOCKET_ADDRESS_KIND_UNIX;
+        saddr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
         saddr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
         saddr->u.q_unix.data->path = g_strdup(sockpath);
     } else {
         InetSocketAddress *inet;
-        saddr->type = SOCKET_ADDRESS_KIND_INET;
+        saddr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
         inet = saddr->u.inet.data = g_new0(InetSocketAddress, 1);
         inet->host = g_strdup(bindto);
         if (port) {
diff --git a/qga/channel-posix.c b/qga/channel-posix.c
index 3f34465..65ab8eb 100644
--- a/qga/channel-posix.c
+++ b/qga/channel-posix.c
@@ -203,7 +203,7 @@ static gboolean ga_channel_open(GAChannel *c, const gchar *path,
     case GA_CHANNEL_VSOCK_LISTEN: {
         if (fd < 0) {
             Error *local_err = NULL;
-            SocketAddress *addr;
+            SocketAddressLegacy *addr;
             char *addr_str;
 
             addr_str = g_strdup_printf("vsock:%s", path);
@@ -216,7 +216,7 @@ static gboolean ga_channel_open(GAChannel *c, const gchar *path,
             }
 
             fd = socket_listen(addr, &local_err);
-            qapi_free_SocketAddress(addr);
+            qapi_free_SocketAddressLegacy(addr);
             if (local_err != NULL) {
                 g_critical("%s", error_get_pretty(local_err));
                 error_free(local_err);
diff --git a/qga/main.c b/qga/main.c
index 07c2953..b9105af 100644
--- a/qga/main.c
+++ b/qga/main.c
@@ -1356,7 +1356,7 @@ int main(int argc, char **argv)
         goto end;
     }
     if (socket_activation) {
-        SocketAddress *addr;
+        SocketAddressLegacy *addr;
 
         g_free(config->method);
         g_free(config->channel_path);
@@ -1365,13 +1365,13 @@ int main(int argc, char **argv)
 
         addr = socket_local_address(FIRST_SOCKET_ACTIVATION_FD, NULL);
         if (addr) {
-            if (addr->type == SOCKET_ADDRESS_KIND_UNIX) {
+            if (addr->type == SOCKET_ADDRESS_LEGACY_KIND_UNIX) {
                 config->method = g_strdup("unix-listen");
-            } else if (addr->type == SOCKET_ADDRESS_KIND_VSOCK) {
+            } else if (addr->type == SOCKET_ADDRESS_LEGACY_KIND_VSOCK) {
                 config->method = g_strdup("vsock-listen");
             }
 
-            qapi_free_SocketAddress(addr);
+            qapi_free_SocketAddressLegacy(addr);
         }
 
         if (!config->method) {
diff --git a/tests/test-io-channel-socket.c b/tests/test-io-channel-socket.c
index c5c1314..a66ffc2 100644
--- a/tests/test-io-channel-socket.c
+++ b/tests/test-io-channel-socket.c
@@ -115,8 +115,8 @@ static void test_io_channel_set_socket_bufs(QIOChannel *src,
 }
 
 
-static void test_io_channel_setup_sync(SocketAddress *listen_addr,
-                                       SocketAddress *connect_addr,
+static void test_io_channel_setup_sync(SocketAddressLegacy *listen_addr,
+                                       SocketAddressLegacy *connect_addr,
                                        QIOChannel **src,
                                        QIOChannel **dst)
 {
@@ -125,14 +125,14 @@ static void test_io_channel_setup_sync(SocketAddress *listen_addr,
     lioc = qio_channel_socket_new();
     qio_channel_socket_listen_sync(lioc, listen_addr, &error_abort);
 
-    if (listen_addr->type == SOCKET_ADDRESS_KIND_INET) {
-        SocketAddress *laddr = qio_channel_socket_get_local_address(
+    if (listen_addr->type == SOCKET_ADDRESS_LEGACY_KIND_INET) {
+        SocketAddressLegacy *laddr = qio_channel_socket_get_local_address(
             lioc, &error_abort);
 
         g_free(connect_addr->u.inet.data->port);
         connect_addr->u.inet.data->port = g_strdup(laddr->u.inet.data->port);
 
-        qapi_free_SocketAddress(laddr);
+        qapi_free_SocketAddressLegacy(laddr);
     }
 
     *src = QIO_CHANNEL(qio_channel_socket_new());
@@ -165,8 +165,8 @@ static void test_io_channel_complete(QIOTask *task,
 }
 
 
-static void test_io_channel_setup_async(SocketAddress *listen_addr,
-                                        SocketAddress *connect_addr,
+static void test_io_channel_setup_async(SocketAddressLegacy *listen_addr,
+                                        SocketAddressLegacy *connect_addr,
                                         QIOChannel **src,
                                         QIOChannel **dst)
 {
@@ -186,14 +186,14 @@ static void test_io_channel_setup_async(SocketAddress *listen_addr,
 
     g_assert(!data.err);
 
-    if (listen_addr->type == SOCKET_ADDRESS_KIND_INET) {
-        SocketAddress *laddr = qio_channel_socket_get_local_address(
+    if (listen_addr->type == SOCKET_ADDRESS_LEGACY_KIND_INET) {
+        SocketAddressLegacy *laddr = qio_channel_socket_get_local_address(
             lioc, &error_abort);
 
         g_free(connect_addr->u.inet.data->port);
         connect_addr->u.inet.data->port = g_strdup(laddr->u.inet.data->port);
 
-        qapi_free_SocketAddress(laddr);
+        qapi_free_SocketAddressLegacy(laddr);
     }
 
     *src = QIO_CHANNEL(qio_channel_socket_new());
@@ -221,8 +221,8 @@ static void test_io_channel_setup_async(SocketAddress *listen_addr,
 
 
 static void test_io_channel(bool async,
-                            SocketAddress *listen_addr,
-                            SocketAddress *connect_addr,
+                            SocketAddressLegacy *listen_addr,
+                            SocketAddressLegacy *connect_addr,
                             bool passFD)
 {
     QIOChannel *src, *dst;
@@ -297,17 +297,17 @@ static void test_io_channel(bool async,
 
 static void test_io_channel_ipv4(bool async)
 {
-    SocketAddress *listen_addr = g_new0(SocketAddress, 1);
-    SocketAddress *connect_addr = g_new0(SocketAddress, 1);
+    SocketAddressLegacy *listen_addr = g_new0(SocketAddressLegacy, 1);
+    SocketAddressLegacy *connect_addr = g_new0(SocketAddressLegacy, 1);
 
-    listen_addr->type = SOCKET_ADDRESS_KIND_INET;
+    listen_addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
     listen_addr->u.inet.data = g_new(InetSocketAddress, 1);
     *listen_addr->u.inet.data = (InetSocketAddress) {
         .host = g_strdup("127.0.0.1"),
         .port = NULL, /* Auto-select */
     };
 
-    connect_addr->type = SOCKET_ADDRESS_KIND_INET;
+    connect_addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
     connect_addr->u.inet.data = g_new(InetSocketAddress, 1);
     *connect_addr->u.inet.data = (InetSocketAddress) {
         .host = g_strdup("127.0.0.1"),
@@ -316,8 +316,8 @@ static void test_io_channel_ipv4(bool async)
 
     test_io_channel(async, listen_addr, connect_addr, false);
 
-    qapi_free_SocketAddress(listen_addr);
-    qapi_free_SocketAddress(connect_addr);
+    qapi_free_SocketAddressLegacy(listen_addr);
+    qapi_free_SocketAddressLegacy(connect_addr);
 }
 
 
@@ -335,17 +335,17 @@ static void test_io_channel_ipv4_async(void)
 
 static void test_io_channel_ipv6(bool async)
 {
-    SocketAddress *listen_addr = g_new0(SocketAddress, 1);
-    SocketAddress *connect_addr = g_new0(SocketAddress, 1);
+    SocketAddressLegacy *listen_addr = g_new0(SocketAddressLegacy, 1);
+    SocketAddressLegacy *connect_addr = g_new0(SocketAddressLegacy, 1);
 
-    listen_addr->type = SOCKET_ADDRESS_KIND_INET;
+    listen_addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
     listen_addr->u.inet.data = g_new(InetSocketAddress, 1);
     *listen_addr->u.inet.data = (InetSocketAddress) {
         .host = g_strdup("::1"),
         .port = NULL, /* Auto-select */
     };
 
-    connect_addr->type = SOCKET_ADDRESS_KIND_INET;
+    connect_addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
     connect_addr->u.inet.data = g_new(InetSocketAddress, 1);
     *connect_addr->u.inet.data = (InetSocketAddress) {
         .host = g_strdup("::1"),
@@ -354,8 +354,8 @@ static void test_io_channel_ipv6(bool async)
 
     test_io_channel(async, listen_addr, connect_addr, false);
 
-    qapi_free_SocketAddress(listen_addr);
-    qapi_free_SocketAddress(connect_addr);
+    qapi_free_SocketAddressLegacy(listen_addr);
+    qapi_free_SocketAddressLegacy(connect_addr);
 }
 
 
@@ -374,22 +374,22 @@ static void test_io_channel_ipv6_async(void)
 #ifndef _WIN32
 static void test_io_channel_unix(bool async)
 {
-    SocketAddress *listen_addr = g_new0(SocketAddress, 1);
-    SocketAddress *connect_addr = g_new0(SocketAddress, 1);
+    SocketAddressLegacy *listen_addr = g_new0(SocketAddressLegacy, 1);
+    SocketAddressLegacy *connect_addr = g_new0(SocketAddressLegacy, 1);
 
 #define TEST_SOCKET "test-io-channel-socket.sock"
-    listen_addr->type = SOCKET_ADDRESS_KIND_UNIX;
+    listen_addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
     listen_addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
     listen_addr->u.q_unix.data->path = g_strdup(TEST_SOCKET);
 
-    connect_addr->type = SOCKET_ADDRESS_KIND_UNIX;
+    connect_addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
     connect_addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
     connect_addr->u.q_unix.data->path = g_strdup(TEST_SOCKET);
 
     test_io_channel(async, listen_addr, connect_addr, true);
 
-    qapi_free_SocketAddress(listen_addr);
-    qapi_free_SocketAddress(connect_addr);
+    qapi_free_SocketAddressLegacy(listen_addr);
+    qapi_free_SocketAddressLegacy(connect_addr);
     g_assert(g_file_test(TEST_SOCKET, G_FILE_TEST_EXISTS) == FALSE);
 }
 
@@ -407,8 +407,8 @@ static void test_io_channel_unix_async(void)
 
 static void test_io_channel_unix_fd_pass(void)
 {
-    SocketAddress *listen_addr = g_new0(SocketAddress, 1);
-    SocketAddress *connect_addr = g_new0(SocketAddress, 1);
+    SocketAddressLegacy *listen_addr = g_new0(SocketAddressLegacy, 1);
+    SocketAddressLegacy *connect_addr = g_new0(SocketAddressLegacy, 1);
     QIOChannel *src, *dst;
     int testfd;
     int fdsend[3];
@@ -427,11 +427,11 @@ static void test_io_channel_unix_fd_pass(void)
     fdsend[1] = testfd;
     fdsend[2] = testfd;
 
-    listen_addr->type = SOCKET_ADDRESS_KIND_UNIX;
+    listen_addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
     listen_addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
     listen_addr->u.q_unix.data->path = g_strdup(TEST_SOCKET);
 
-    connect_addr->type = SOCKET_ADDRESS_KIND_UNIX;
+    connect_addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
     connect_addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
     connect_addr->u.q_unix.data->path = g_strdup(TEST_SOCKET);
 
@@ -488,8 +488,8 @@ static void test_io_channel_unix_fd_pass(void)
 
     object_unref(OBJECT(src));
     object_unref(OBJECT(dst));
-    qapi_free_SocketAddress(listen_addr);
-    qapi_free_SocketAddress(connect_addr);
+    qapi_free_SocketAddressLegacy(listen_addr);
+    qapi_free_SocketAddressLegacy(connect_addr);
     unlink(TEST_SOCKET);
     unlink(TEST_FILE);
     close(testfd);
diff --git a/ui/vnc-auth-sasl.c b/ui/vnc-auth-sasl.c
index 5ae29c1..c7fa9b6 100644
--- a/ui/vnc-auth-sasl.c
+++ b/ui/vnc-auth-sasl.c
@@ -498,7 +498,7 @@ vnc_socket_ip_addr_string(QIOChannelSocket *ioc,
                           bool local,
                           Error **errp)
 {
-    SocketAddress *addr;
+    SocketAddressLegacy *addr;
     char *ret;
 
     if (local) {
@@ -510,13 +510,13 @@ vnc_socket_ip_addr_string(QIOChannelSocket *ioc,
         return NULL;
     }
 
-    if (addr->type != SOCKET_ADDRESS_KIND_INET) {
+    if (addr->type != SOCKET_ADDRESS_LEGACY_KIND_INET) {
         error_setg(errp, "Not an inet socket type");
         return NULL;
     }
     ret = g_strdup_printf("%s;%s", addr->u.inet.data->host,
                           addr->u.inet.data->port);
-    qapi_free_SocketAddress(addr);
+    qapi_free_SocketAddressLegacy(addr);
     return ret;
 }
 
diff --git a/ui/vnc.c b/ui/vnc.c
index 349cfc9..5090a25 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -108,12 +108,12 @@ static void vnc_set_share_mode(VncState *vs, VncShareMode mode)
 }
 
 
-static void vnc_init_basic_info(SocketAddress *addr,
+static void vnc_init_basic_info(SocketAddressLegacy *addr,
                                 VncBasicInfo *info,
                                 Error **errp)
 {
     switch (addr->type) {
-    case SOCKET_ADDRESS_KIND_INET:
+    case SOCKET_ADDRESS_LEGACY_KIND_INET:
         info->host = g_strdup(addr->u.inet.data->host);
         info->service = g_strdup(addr->u.inet.data->port);
         if (addr->u.inet.data->ipv6) {
@@ -123,16 +123,16 @@ static void vnc_init_basic_info(SocketAddress *addr,
         }
         break;
 
-    case SOCKET_ADDRESS_KIND_UNIX:
+    case SOCKET_ADDRESS_LEGACY_KIND_UNIX:
         info->host = g_strdup("");
         info->service = g_strdup(addr->u.q_unix.data->path);
         info->family = NETWORK_ADDRESS_FAMILY_UNIX;
         break;
 
-    case SOCKET_ADDRESS_KIND_VSOCK:
-    case SOCKET_ADDRESS_KIND_FD:
+    case SOCKET_ADDRESS_LEGACY_KIND_VSOCK:
+    case SOCKET_ADDRESS_LEGACY_KIND_FD:
         error_setg(errp, "Unsupported socket address type %s",
-                   SocketAddressKind_lookup[addr->type]);
+                   SocketAddressLegacyKind_lookup[addr->type]);
         break;
     default:
         abort();
@@ -145,7 +145,7 @@ static void vnc_init_basic_info_from_server_addr(QIOChannelSocket *ioc,
                                                  VncBasicInfo *info,
                                                  Error **errp)
 {
-    SocketAddress *addr = NULL;
+    SocketAddressLegacy *addr = NULL;
 
     if (!ioc) {
         error_setg(errp, "No listener socket available");
@@ -158,14 +158,14 @@ static void vnc_init_basic_info_from_server_addr(QIOChannelSocket *ioc,
     }
 
     vnc_init_basic_info(addr, info, errp);
-    qapi_free_SocketAddress(addr);
+    qapi_free_SocketAddressLegacy(addr);
 }
 
 static void vnc_init_basic_info_from_remote_addr(QIOChannelSocket *ioc,
                                                  VncBasicInfo *info,
                                                  Error **errp)
 {
-    SocketAddress *addr = NULL;
+    SocketAddressLegacy *addr = NULL;
 
     addr = qio_channel_socket_get_remote_address(ioc, errp);
     if (!addr) {
@@ -173,7 +173,7 @@ static void vnc_init_basic_info_from_remote_addr(QIOChannelSocket *ioc,
     }
 
     vnc_init_basic_info(addr, info, errp);
-    qapi_free_SocketAddress(addr);
+    qapi_free_SocketAddressLegacy(addr);
 }
 
 static const char *vnc_auth_name(VncDisplay *vd) {
@@ -377,7 +377,7 @@ VncInfo *qmp_query_vnc(Error **errp)
 {
     VncInfo *info = g_malloc0(sizeof(*info));
     VncDisplay *vd = vnc_display_find(NULL);
-    SocketAddress *addr = NULL;
+    SocketAddressLegacy *addr = NULL;
 
     if (vd == NULL || !vd->nlsock) {
         info->enabled = false;
@@ -398,7 +398,7 @@ VncInfo *qmp_query_vnc(Error **errp)
         }
 
         switch (addr->type) {
-        case SOCKET_ADDRESS_KIND_INET:
+        case SOCKET_ADDRESS_LEGACY_KIND_INET:
             info->host = g_strdup(addr->u.inet.data->host);
             info->service = g_strdup(addr->u.inet.data->port);
             if (addr->u.inet.data->ipv6) {
@@ -408,16 +408,16 @@ VncInfo *qmp_query_vnc(Error **errp)
             }
             break;
 
-        case SOCKET_ADDRESS_KIND_UNIX:
+        case SOCKET_ADDRESS_LEGACY_KIND_UNIX:
             info->host = g_strdup("");
             info->service = g_strdup(addr->u.q_unix.data->path);
             info->family = NETWORK_ADDRESS_FAMILY_UNIX;
             break;
 
-        case SOCKET_ADDRESS_KIND_VSOCK:
-        case SOCKET_ADDRESS_KIND_FD:
+        case SOCKET_ADDRESS_LEGACY_KIND_VSOCK:
+        case SOCKET_ADDRESS_LEGACY_KIND_FD:
             error_setg(errp, "Unsupported socket address type %s",
-                       SocketAddressKind_lookup[addr->type]);
+                       SocketAddressLegacyKind_lookup[addr->type]);
             goto out_error;
         default:
             abort();
@@ -431,11 +431,11 @@ VncInfo *qmp_query_vnc(Error **errp)
         info->auth = g_strdup(vnc_auth_name(vd));
     }
 
-    qapi_free_SocketAddress(addr);
+    qapi_free_SocketAddressLegacy(addr);
     return info;
 
 out_error:
-    qapi_free_SocketAddress(addr);
+    qapi_free_SocketAddressLegacy(addr);
     qapi_free_VncInfo(info);
     return NULL;
 }
@@ -455,7 +455,7 @@ static VncServerInfo2List *qmp_query_server_entry(QIOChannelSocket *ioc,
     VncServerInfo2List *list;
     VncServerInfo2 *info;
     Error *err = NULL;
-    SocketAddress *addr;
+    SocketAddressLegacy *addr;
 
     addr = qio_channel_socket_get_local_address(ioc, &err);
     if (!addr) {
@@ -465,7 +465,7 @@ static VncServerInfo2List *qmp_query_server_entry(QIOChannelSocket *ioc,
 
     info = g_new0(VncServerInfo2, 1);
     vnc_init_basic_info(addr, qapi_VncServerInfo2_base(info), &err);
-    qapi_free_SocketAddress(addr);
+    qapi_free_SocketAddressLegacy(addr);
     if (err) {
         qapi_free_VncServerInfo2(info);
         error_free(err);
@@ -3149,7 +3149,7 @@ int vnc_display_pw_expire(const char *id, time_t expires)
 
 static void vnc_display_print_local_addr(VncDisplay *vd)
 {
-    SocketAddress *addr;
+    SocketAddressLegacy *addr;
     Error *err = NULL;
 
     if (!vd->nlsock) {
@@ -3161,14 +3161,14 @@ static void vnc_display_print_local_addr(VncDisplay *vd)
         return;
     }
 
-    if (addr->type != SOCKET_ADDRESS_KIND_INET) {
-        qapi_free_SocketAddress(addr);
+    if (addr->type != SOCKET_ADDRESS_LEGACY_KIND_INET) {
+        qapi_free_SocketAddressLegacy(addr);
         return;
     }
     error_printf_unless_qmp("VNC server running on %s:%s\n",
                             addr->u.inet.data->host,
                             addr->u.inet.data->port);
-    qapi_free_SocketAddress(addr);
+    qapi_free_SocketAddressLegacy(addr);
 }
 
 static QemuOptsList qemu_vnc_opts = {
@@ -3414,16 +3414,16 @@ static int vnc_display_get_address(const char *addrstr,
                                    bool has_ipv6,
                                    bool ipv4,
                                    bool ipv6,
-                                   SocketAddress **retaddr,
+                                   SocketAddressLegacy **retaddr,
                                    Error **errp)
 {
     int ret = -1;
-    SocketAddress *addr = NULL;
+    SocketAddressLegacy *addr = NULL;
 
-    addr = g_new0(SocketAddress, 1);
+    addr = g_new0(SocketAddressLegacy, 1);
 
     if (strncmp(addrstr, "unix:", 5) == 0) {
-        addr->type = SOCKET_ADDRESS_KIND_UNIX;
+        addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
         addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
         addr->u.q_unix.data->path = g_strdup(addrstr + 5);
 
@@ -3461,7 +3461,7 @@ static int vnc_display_get_address(const char *addrstr,
             }
         }
 
-        addr->type = SOCKET_ADDRESS_KIND_INET;
+        addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
         inet = addr->u.inet.data = g_new0(InetSocketAddress, 1);
         if (addrstr[0] == '[' && addrstr[hostlen - 1] == ']') {
             inet->host = g_strndup(addrstr + 1, hostlen - 2);
@@ -3518,21 +3518,21 @@ static int vnc_display_get_address(const char *addrstr,
 
  cleanup:
     if (ret < 0) {
-        qapi_free_SocketAddress(addr);
+        qapi_free_SocketAddressLegacy(addr);
     }
     return ret;
 }
 
 static int vnc_display_get_addresses(QemuOpts *opts,
                                      bool reverse,
-                                     SocketAddress ***retsaddr,
+                                     SocketAddressLegacy ***retsaddr,
                                      size_t *retnsaddr,
-                                     SocketAddress ***retwsaddr,
+                                     SocketAddressLegacy ***retwsaddr,
                                      size_t *retnwsaddr,
                                      Error **errp)
 {
-    SocketAddress *saddr = NULL;
-    SocketAddress *wsaddr = NULL;
+    SocketAddressLegacy *saddr = NULL;
+    SocketAddressLegacy *wsaddr = NULL;
     QemuOptsIter addriter;
     const char *addr;
     int to = qemu_opt_get_number(opts, "to", 0);
@@ -3577,7 +3577,7 @@ static int vnc_display_get_addresses(QemuOpts *opts,
         if (displaynum == -1) {
             displaynum = rv;
         }
-        *retsaddr = g_renew(SocketAddress *, *retsaddr, *retnsaddr + 1);
+        *retsaddr = g_renew(SocketAddressLegacy *, *retsaddr, *retnsaddr + 1);
         (*retsaddr)[(*retnsaddr)++] = saddr;
     }
 
@@ -3601,8 +3601,8 @@ static int vnc_display_get_addresses(QemuOpts *opts,
          * address for websocket too
          */
         if (*retnsaddr == 1 &&
-            (*retsaddr)[0]->type == SOCKET_ADDRESS_KIND_INET &&
-            wsaddr->type == SOCKET_ADDRESS_KIND_INET &&
+            (*retsaddr)[0]->type == SOCKET_ADDRESS_LEGACY_KIND_INET &&
+            wsaddr->type == SOCKET_ADDRESS_LEGACY_KIND_INET &&
             g_str_equal(wsaddr->u.inet.data->host, "") &&
             !g_str_equal((*retsaddr)[0]->u.inet.data->host, "")) {
             g_free(wsaddr->u.inet.data->host);
@@ -3610,7 +3610,7 @@ static int vnc_display_get_addresses(QemuOpts *opts,
                 g_strdup((*retsaddr)[0]->u.inet.data->host);
         }
 
-        *retwsaddr = g_renew(SocketAddress *, *retwsaddr, *retnwsaddr + 1);
+        *retwsaddr = g_renew(SocketAddressLegacy *, *retwsaddr, *retnwsaddr + 1);
         (*retwsaddr)[(*retnwsaddr)++] = wsaddr;
     }
 
@@ -3618,11 +3618,11 @@ static int vnc_display_get_addresses(QemuOpts *opts,
  cleanup:
     if (ret < 0) {
         for (i = 0; i < *retnsaddr; i++) {
-            qapi_free_SocketAddress((*retsaddr)[i]);
+            qapi_free_SocketAddressLegacy((*retsaddr)[i]);
         }
         g_free(*retsaddr);
         for (i = 0; i < *retnwsaddr; i++) {
-            qapi_free_SocketAddress((*retwsaddr)[i]);
+            qapi_free_SocketAddressLegacy((*retwsaddr)[i]);
         }
         g_free(*retwsaddr);
         *retsaddr = *retwsaddr = NULL;
@@ -3632,9 +3632,9 @@ static int vnc_display_get_addresses(QemuOpts *opts,
 }
 
 static int vnc_display_connect(VncDisplay *vd,
-                               SocketAddress **saddr,
+                               SocketAddressLegacy **saddr,
                                size_t nsaddr,
-                               SocketAddress **wsaddr,
+                               SocketAddressLegacy **wsaddr,
                                size_t nwsaddr,
                                Error **errp)
 {
@@ -3648,8 +3648,8 @@ static int vnc_display_connect(VncDisplay *vd,
         error_setg(errp, "Expected a single address in reverse mode");
         return -1;
     }
-    /* TODO SOCKET_ADDRESS_KIND_FD when fd has AF_UNIX */
-    vd->is_unix = saddr[0]->type == SOCKET_ADDRESS_KIND_UNIX;
+    /* TODO SOCKET_ADDRESS_LEGACY_KIND_FD when fd has AF_UNIX */
+    vd->is_unix = saddr[0]->type == SOCKET_ADDRESS_LEGACY_KIND_UNIX;
     sioc = qio_channel_socket_new();
     qio_channel_set_name(QIO_CHANNEL(sioc), "vnc-reverse");
     if (qio_channel_socket_connect_sync(sioc, saddr[0], errp) < 0) {
@@ -3662,7 +3662,7 @@ static int vnc_display_connect(VncDisplay *vd,
 
 
 static int vnc_display_listen_addr(VncDisplay *vd,
-                                   SocketAddress *addr,
+                                   SocketAddressLegacy *addr,
                                    const char *name,
                                    QIOChannelSocket ***lsock,
                                    guint **lsock_tag,
@@ -3670,7 +3670,7 @@ static int vnc_display_listen_addr(VncDisplay *vd,
                                    Error **errp)
 {
     QIODNSResolver *resolver = qio_dns_resolver_get_instance();
-    SocketAddress **rawaddrs = NULL;
+    SocketAddressLegacy **rawaddrs = NULL;
     size_t nrawaddrs = 0;
     Error *listenerr = NULL;
     bool listening = false;
@@ -3700,7 +3700,7 @@ static int vnc_display_listen_addr(VncDisplay *vd,
     }
 
     for (i = 0; i < nrawaddrs; i++) {
-        qapi_free_SocketAddress(rawaddrs[i]);
+        qapi_free_SocketAddressLegacy(rawaddrs[i]);
     }
     g_free(rawaddrs);
 
@@ -3724,9 +3724,9 @@ static int vnc_display_listen_addr(VncDisplay *vd,
 
 
 static int vnc_display_listen(VncDisplay *vd,
-                              SocketAddress **saddr,
+                              SocketAddressLegacy **saddr,
                               size_t nsaddr,
-                              SocketAddress **wsaddr,
+                              SocketAddressLegacy **wsaddr,
                               size_t nwsaddr,
                               Error **errp)
 {
@@ -3761,7 +3761,7 @@ void vnc_display_open(const char *id, Error **errp)
 {
     VncDisplay *vd = vnc_display_find(id);
     QemuOpts *opts = qemu_opts_find(&qemu_vnc_opts, id);
-    SocketAddress **saddr = NULL, **wsaddr = NULL;
+    SocketAddressLegacy **saddr = NULL, **wsaddr = NULL;
     size_t nsaddr, nwsaddr;
     const char *share, *device_id;
     QemuConsole *con;
@@ -3997,10 +3997,10 @@ void vnc_display_open(const char *id, Error **errp)
 
  cleanup:
     for (i = 0; i < nsaddr; i++) {
-        qapi_free_SocketAddress(saddr[i]);
+        qapi_free_SocketAddressLegacy(saddr[i]);
     }
     for (i = 0; i < nwsaddr; i++) {
-        qapi_free_SocketAddress(wsaddr[i]);
+        qapi_free_SocketAddressLegacy(wsaddr[i]);
     }
     return;
 
diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
index 62c93ba..4c48203 100644
--- a/util/qemu-sockets.c
+++ b/util/qemu-sockets.c
@@ -1029,17 +1029,17 @@ int unix_connect(const char *path, Error **errp)
 }
 
 
-SocketAddress *socket_parse(const char *str, Error **errp)
+SocketAddressLegacy *socket_parse(const char *str, Error **errp)
 {
-    SocketAddress *addr;
+    SocketAddressLegacy *addr;
 
-    addr = g_new0(SocketAddress, 1);
+    addr = g_new0(SocketAddressLegacy, 1);
     if (strstart(str, "unix:", NULL)) {
         if (str[5] == '\0') {
             error_setg(errp, "invalid Unix socket address");
             goto fail;
         } else {
-            addr->type = SOCKET_ADDRESS_KIND_UNIX;
+            addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
             addr->u.q_unix.data = g_new(UnixSocketAddress, 1);
             addr->u.q_unix.data->path = g_strdup(str + 5);
         }
@@ -1048,18 +1048,18 @@ SocketAddress *socket_parse(const char *str, Error **errp)
             error_setg(errp, "invalid file descriptor address");
             goto fail;
         } else {
-            addr->type = SOCKET_ADDRESS_KIND_FD;
+            addr->type = SOCKET_ADDRESS_LEGACY_KIND_FD;
             addr->u.fd.data = g_new(String, 1);
             addr->u.fd.data->str = g_strdup(str + 3);
         }
     } else if (strstart(str, "vsock:", NULL)) {
-        addr->type = SOCKET_ADDRESS_KIND_VSOCK;
+        addr->type = SOCKET_ADDRESS_LEGACY_KIND_VSOCK;
         addr->u.vsock.data = g_new(VsockSocketAddress, 1);
         if (vsock_parse(addr->u.vsock.data, str + strlen("vsock:"), errp)) {
             goto fail;
         }
     } else {
-        addr->type = SOCKET_ADDRESS_KIND_INET;
+        addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
         addr->u.inet.data = g_new(InetSocketAddress, 1);
         if (inet_parse(addr->u.inet.data, str, errp)) {
             goto fail;
@@ -1068,25 +1068,25 @@ SocketAddress *socket_parse(const char *str, Error **errp)
     return addr;
 
 fail:
-    qapi_free_SocketAddress(addr);
+    qapi_free_SocketAddressLegacy(addr);
     return NULL;
 }
 
-int socket_connect(SocketAddress *addr, NonBlockingConnectHandler *callback,
+int socket_connect(SocketAddressLegacy *addr, NonBlockingConnectHandler *callback,
                    void *opaque, Error **errp)
 {
     int fd;
 
     switch (addr->type) {
-    case SOCKET_ADDRESS_KIND_INET:
+    case SOCKET_ADDRESS_LEGACY_KIND_INET:
         fd = inet_connect_saddr(addr->u.inet.data, callback, opaque, errp);
         break;
 
-    case SOCKET_ADDRESS_KIND_UNIX:
+    case SOCKET_ADDRESS_LEGACY_KIND_UNIX:
         fd = unix_connect_saddr(addr->u.q_unix.data, callback, opaque, errp);
         break;
 
-    case SOCKET_ADDRESS_KIND_FD:
+    case SOCKET_ADDRESS_LEGACY_KIND_FD:
         fd = monitor_get_fd(cur_mon, addr->u.fd.data->str, errp);
         if (fd >= 0 && callback) {
             qemu_set_nonblock(fd);
@@ -1094,7 +1094,7 @@ int socket_connect(SocketAddress *addr, NonBlockingConnectHandler *callback,
         }
         break;
 
-    case SOCKET_ADDRESS_KIND_VSOCK:
+    case SOCKET_ADDRESS_LEGACY_KIND_VSOCK:
         fd = vsock_connect_saddr(addr->u.vsock.data, callback, opaque, errp);
         break;
 
@@ -1104,24 +1104,24 @@ int socket_connect(SocketAddress *addr, NonBlockingConnectHandler *callback,
     return fd;
 }
 
-int socket_listen(SocketAddress *addr, Error **errp)
+int socket_listen(SocketAddressLegacy *addr, Error **errp)
 {
     int fd;
 
     switch (addr->type) {
-    case SOCKET_ADDRESS_KIND_INET:
+    case SOCKET_ADDRESS_LEGACY_KIND_INET:
         fd = inet_listen_saddr(addr->u.inet.data, 0, false, errp);
         break;
 
-    case SOCKET_ADDRESS_KIND_UNIX:
+    case SOCKET_ADDRESS_LEGACY_KIND_UNIX:
         fd = unix_listen_saddr(addr->u.q_unix.data, false, errp);
         break;
 
-    case SOCKET_ADDRESS_KIND_FD:
+    case SOCKET_ADDRESS_LEGACY_KIND_FD:
         fd = monitor_get_fd(cur_mon, addr->u.fd.data->str, errp);
         break;
 
-    case SOCKET_ADDRESS_KIND_VSOCK:
+    case SOCKET_ADDRESS_LEGACY_KIND_VSOCK:
         fd = vsock_listen_saddr(addr->u.vsock.data, errp);
         break;
 
@@ -1133,11 +1133,11 @@ int socket_listen(SocketAddress *addr, Error **errp)
 
 void socket_listen_cleanup(int fd, Error **errp)
 {
-    SocketAddress *addr;
+    SocketAddressLegacy *addr;
 
     addr = socket_local_address(fd, errp);
 
-    if (addr->type == SOCKET_ADDRESS_KIND_UNIX
+    if (addr->type == SOCKET_ADDRESS_LEGACY_KIND_UNIX
         && addr->u.q_unix.data->path) {
         if (unlink(addr->u.q_unix.data->path) < 0 && errno != ENOENT) {
             error_setg_errno(errp, errno,
@@ -1146,19 +1146,19 @@ void socket_listen_cleanup(int fd, Error **errp)
         }
     }
 
-    qapi_free_SocketAddress(addr);
+    qapi_free_SocketAddressLegacy(addr);
 }
 
-int socket_dgram(SocketAddress *remote, SocketAddress *local, Error **errp)
+int socket_dgram(SocketAddressLegacy *remote, SocketAddressLegacy *local, Error **errp)
 {
     int fd;
 
     /*
-     * TODO SOCKET_ADDRESS_KIND_FD when fd is AF_INET or AF_INET6
+     * TODO SOCKET_ADDRESS_LEGACY_KIND_FD when fd is AF_INET or AF_INET6
      * (although other address families can do SOCK_DGRAM, too)
      */
     switch (remote->type) {
-    case SOCKET_ADDRESS_KIND_INET:
+    case SOCKET_ADDRESS_LEGACY_KIND_INET:
         fd = inet_dgram_saddr(remote->u.inet.data,
                               local ? local->u.inet.data : NULL, errp);
         break;
@@ -1171,14 +1171,14 @@ int socket_dgram(SocketAddress *remote, SocketAddress *local, Error **errp)
 }
 
 
-static SocketAddress *
+static SocketAddressLegacy *
 socket_sockaddr_to_address_inet(struct sockaddr_storage *sa,
                                 socklen_t salen,
                                 Error **errp)
 {
     char host[NI_MAXHOST];
     char serv[NI_MAXSERV];
-    SocketAddress *addr;
+    SocketAddressLegacy *addr;
     InetSocketAddress *inet;
     int ret;
 
@@ -1192,8 +1192,8 @@ socket_sockaddr_to_address_inet(struct sockaddr_storage *sa,
         return NULL;
     }
 
-    addr = g_new0(SocketAddress, 1);
-    addr->type = SOCKET_ADDRESS_KIND_INET;
+    addr = g_new0(SocketAddressLegacy, 1);
+    addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
     inet = addr->u.inet.data = g_new0(InetSocketAddress, 1);
     inet->host = g_strdup(host);
     inet->port = g_strdup(serv);
@@ -1208,16 +1208,16 @@ socket_sockaddr_to_address_inet(struct sockaddr_storage *sa,
 
 
 #ifndef WIN32
-static SocketAddress *
+static SocketAddressLegacy *
 socket_sockaddr_to_address_unix(struct sockaddr_storage *sa,
                                 socklen_t salen,
                                 Error **errp)
 {
-    SocketAddress *addr;
+    SocketAddressLegacy *addr;
     struct sockaddr_un *su = (struct sockaddr_un *)sa;
 
-    addr = g_new0(SocketAddress, 1);
-    addr->type = SOCKET_ADDRESS_KIND_UNIX;
+    addr = g_new0(SocketAddressLegacy, 1);
+    addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
     addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
     if (su->sun_path[0]) {
         addr->u.q_unix.data->path = g_strndup(su->sun_path,
@@ -1229,17 +1229,17 @@ socket_sockaddr_to_address_unix(struct sockaddr_storage *sa,
 #endif /* WIN32 */
 
 #ifdef CONFIG_AF_VSOCK
-static SocketAddress *
+static SocketAddressLegacy *
 socket_sockaddr_to_address_vsock(struct sockaddr_storage *sa,
                                  socklen_t salen,
                                  Error **errp)
 {
-    SocketAddress *addr;
+    SocketAddressLegacy *addr;
     VsockSocketAddress *vaddr;
     struct sockaddr_vm *svm = (struct sockaddr_vm *)sa;
 
-    addr = g_new0(SocketAddress, 1);
-    addr->type = SOCKET_ADDRESS_KIND_VSOCK;
+    addr = g_new0(SocketAddressLegacy, 1);
+    addr->type = SOCKET_ADDRESS_LEGACY_KIND_VSOCK;
     addr->u.vsock.data = vaddr = g_new0(VsockSocketAddress, 1);
     vaddr->cid = g_strdup_printf("%u", svm->svm_cid);
     vaddr->port = g_strdup_printf("%u", svm->svm_port);
@@ -1248,7 +1248,7 @@ socket_sockaddr_to_address_vsock(struct sockaddr_storage *sa,
 }
 #endif /* CONFIG_AF_VSOCK */
 
-SocketAddress *
+SocketAddressLegacy *
 socket_sockaddr_to_address(struct sockaddr_storage *sa,
                            socklen_t salen,
                            Error **errp)
@@ -1277,7 +1277,7 @@ socket_sockaddr_to_address(struct sockaddr_storage *sa,
 }
 
 
-SocketAddress *socket_local_address(int fd, Error **errp)
+SocketAddressLegacy *socket_local_address(int fd, Error **errp)
 {
     struct sockaddr_storage ss;
     socklen_t sslen = sizeof(ss);
@@ -1292,7 +1292,7 @@ SocketAddress *socket_local_address(int fd, Error **errp)
 }
 
 
-SocketAddress *socket_remote_address(int fd, Error **errp)
+SocketAddressLegacy *socket_remote_address(int fd, Error **errp)
 {
     struct sockaddr_storage ss;
     socklen_t sslen = sizeof(ss);
@@ -1306,13 +1306,13 @@ SocketAddress *socket_remote_address(int fd, Error **errp)
     return socket_sockaddr_to_address(&ss, sslen, errp);
 }
 
-char *socket_address_to_string(struct SocketAddress *addr, Error **errp)
+char *socket_address_to_string(struct SocketAddressLegacy *addr, Error **errp)
 {
     char *buf;
     InetSocketAddress *inet;
 
     switch (addr->type) {
-    case SOCKET_ADDRESS_KIND_INET:
+    case SOCKET_ADDRESS_LEGACY_KIND_INET:
         inet = addr->u.inet.data;
         if (strchr(inet->host, ':') == NULL) {
             buf = g_strdup_printf("%s:%s", inet->host, inet->port);
@@ -1321,15 +1321,15 @@ char *socket_address_to_string(struct SocketAddress *addr, Error **errp)
         }
         break;
 
-    case SOCKET_ADDRESS_KIND_UNIX:
+    case SOCKET_ADDRESS_LEGACY_KIND_UNIX:
         buf = g_strdup(addr->u.q_unix.data->path);
         break;
 
-    case SOCKET_ADDRESS_KIND_FD:
+    case SOCKET_ADDRESS_LEGACY_KIND_FD:
         buf = g_strdup(addr->u.fd.data->str);
         break;
 
-    case SOCKET_ADDRESS_KIND_VSOCK:
+    case SOCKET_ADDRESS_LEGACY_KIND_VSOCK:
         buf = g_strdup_printf("%s:%s",
                               addr->u.vsock.data->cid,
                               addr->u.vsock.data->port);
@@ -1341,28 +1341,28 @@ char *socket_address_to_string(struct SocketAddress *addr, Error **errp)
     return buf;
 }
 
-SocketAddress *socket_address_crumple(SocketAddressFlat *addr_flat)
+SocketAddressLegacy *socket_address_crumple(SocketAddressFlat *addr_flat)
 {
-    SocketAddress *addr = g_new(SocketAddress, 1);
+    SocketAddressLegacy *addr = g_new(SocketAddressLegacy, 1);
 
     switch (addr_flat->type) {
     case SOCKET_ADDRESS_FLAT_TYPE_INET:
-        addr->type = SOCKET_ADDRESS_KIND_INET;
+        addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
         addr->u.inet.data = QAPI_CLONE(InetSocketAddress,
                                        &addr_flat->u.inet);
         break;
     case SOCKET_ADDRESS_FLAT_TYPE_UNIX:
-        addr->type = SOCKET_ADDRESS_KIND_UNIX;
+        addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
         addr->u.q_unix.data = QAPI_CLONE(UnixSocketAddress,
                                          &addr_flat->u.q_unix);
         break;
     case SOCKET_ADDRESS_FLAT_TYPE_VSOCK:
-        addr->type = SOCKET_ADDRESS_KIND_VSOCK;
+        addr->type = SOCKET_ADDRESS_LEGACY_KIND_VSOCK;
         addr->u.vsock.data = QAPI_CLONE(VsockSocketAddress,
                                         &addr_flat->u.vsock);
         break;
     case SOCKET_ADDRESS_FLAT_TYPE_FD:
-        addr->type = SOCKET_ADDRESS_KIND_FD;
+        addr->type = SOCKET_ADDRESS_LEGACY_KIND_FD;
         addr->u.fd.data = QAPI_CLONE(String, &addr_flat->u.fd);
         break;
     default:
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [Qemu-devel] [PATCH 5/7] sockets: Rename SocketAddressFlat to SocketAddress
  2017-04-26  7:36 [Qemu-devel] [PATCH 0/7] sockets: Flatten SocketAddress except in external interfaces Markus Armbruster
                   ` (3 preceding siblings ...)
  2017-04-26  7:36 ` [Qemu-devel] [PATCH 4/7] sockets: Rename SocketAddress to SocketAddressLegacy Markus Armbruster
@ 2017-04-26  7:36 ` Markus Armbruster
  2017-04-26 19:15   ` Eric Blake
  2017-04-27  5:53   ` Prasanna Kalever
  2017-04-26  7:36 ` [Qemu-devel] [PATCH 6/7] sockets: Limit SocketAddressLegacy except to external interfaces Markus Armbruster
                   ` (2 subsequent siblings)
  7 siblings, 2 replies; 19+ messages in thread
From: Markus Armbruster @ 2017-04-26  7:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: berrange, kraxel, pbonzini, eblake, qemu-block

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 block/gluster.c        | 48 ++++++++++++++++++++++++------------------------
 block/nbd.c            | 26 +++++++++++++-------------
 block/sheepdog.c       |  6 +++---
 include/qemu/sockets.h |  4 ++--
 qapi-schema.json       | 14 +++++++-------
 qapi/block-core.json   |  6 +++---
 util/qemu-sockets.c    | 10 +++++-----
 7 files changed, 57 insertions(+), 57 deletions(-)

diff --git a/block/gluster.c b/block/gluster.c
index cf29b5f..93eac87 100644
--- a/block/gluster.c
+++ b/block/gluster.c
@@ -321,7 +321,7 @@ static int parse_volume_options(BlockdevOptionsGluster *gconf, char *path)
 static int qemu_gluster_parse_uri(BlockdevOptionsGluster *gconf,
                                   const char *filename)
 {
-    SocketAddressFlat *gsconf;
+    SocketAddress *gsconf;
     URI *uri;
     QueryParams *qp = NULL;
     bool is_unix = false;
@@ -332,19 +332,19 @@ static int qemu_gluster_parse_uri(BlockdevOptionsGluster *gconf,
         return -EINVAL;
     }
 
-    gconf->server = g_new0(SocketAddressFlatList, 1);
-    gconf->server->value = gsconf = g_new0(SocketAddressFlat, 1);
+    gconf->server = g_new0(SocketAddressList, 1);
+    gconf->server->value = gsconf = g_new0(SocketAddress, 1);
 
     /* transport */
     if (!uri->scheme || !strcmp(uri->scheme, "gluster")) {
-        gsconf->type = SOCKET_ADDRESS_FLAT_TYPE_INET;
+        gsconf->type = SOCKET_ADDRESS_TYPE_INET;
     } else if (!strcmp(uri->scheme, "gluster+tcp")) {
-        gsconf->type = SOCKET_ADDRESS_FLAT_TYPE_INET;
+        gsconf->type = SOCKET_ADDRESS_TYPE_INET;
     } else if (!strcmp(uri->scheme, "gluster+unix")) {
-        gsconf->type = SOCKET_ADDRESS_FLAT_TYPE_UNIX;
+        gsconf->type = SOCKET_ADDRESS_TYPE_UNIX;
         is_unix = true;
     } else if (!strcmp(uri->scheme, "gluster+rdma")) {
-        gsconf->type = SOCKET_ADDRESS_FLAT_TYPE_INET;
+        gsconf->type = SOCKET_ADDRESS_TYPE_INET;
         error_report("Warning: rdma feature is not supported, falling "
                      "back to tcp");
     } else {
@@ -396,7 +396,7 @@ static struct glfs *qemu_gluster_glfs_init(BlockdevOptionsGluster *gconf,
     struct glfs *glfs;
     int ret;
     int old_errno;
-    SocketAddressFlatList *server;
+    SocketAddressList *server;
     unsigned long long port;
 
     glfs = glfs_find_preopened(gconf->volume);
@@ -413,11 +413,11 @@ static struct glfs *qemu_gluster_glfs_init(BlockdevOptionsGluster *gconf,
 
     for (server = gconf->server; server; server = server->next) {
         switch (server->value->type) {
-        case SOCKET_ADDRESS_FLAT_TYPE_UNIX:
+        case SOCKET_ADDRESS_TYPE_UNIX:
             ret = glfs_set_volfile_server(glfs, "unix",
                                    server->value->u.q_unix.path, 0);
             break;
-        case SOCKET_ADDRESS_FLAT_TYPE_INET:
+        case SOCKET_ADDRESS_TYPE_INET:
             if (parse_uint_full(server->value->u.inet.port, &port, 10) < 0 ||
                 port > 65535) {
                 error_setg(errp, "'%s' is not a valid port number",
@@ -429,8 +429,8 @@ static struct glfs *qemu_gluster_glfs_init(BlockdevOptionsGluster *gconf,
                                    server->value->u.inet.host,
                                    (int)port);
             break;
-        case SOCKET_ADDRESS_FLAT_TYPE_VSOCK:
-        case SOCKET_ADDRESS_FLAT_TYPE_FD:
+        case SOCKET_ADDRESS_TYPE_VSOCK:
+        case SOCKET_ADDRESS_TYPE_FD:
         default:
             abort();
         }
@@ -450,7 +450,7 @@ static struct glfs *qemu_gluster_glfs_init(BlockdevOptionsGluster *gconf,
         error_setg(errp, "Gluster connection for volume %s, path %s failed"
                          " to connect", gconf->volume, gconf->path);
         for (server = gconf->server; server; server = server->next) {
-            if (server->value->type  == SOCKET_ADDRESS_FLAT_TYPE_UNIX) {
+            if (server->value->type  == SOCKET_ADDRESS_TYPE_UNIX) {
                 error_append_hint(errp, "hint: failed on socket %s ",
                                   server->value->u.q_unix.path);
             } else {
@@ -487,8 +487,8 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
                                   QDict *options, Error **errp)
 {
     QemuOpts *opts;
-    SocketAddressFlat *gsconf = NULL;
-    SocketAddressFlatList *curr = NULL;
+    SocketAddress *gsconf = NULL;
+    SocketAddressList *curr = NULL;
     QDict *backing_options = NULL;
     Error *local_err = NULL;
     char *str = NULL;
@@ -542,14 +542,14 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
             goto out;
 
         }
-        gsconf = g_new0(SocketAddressFlat, 1);
+        gsconf = g_new0(SocketAddress, 1);
         if (!strcmp(ptr, "tcp")) {
             ptr = "inet";       /* accept legacy "tcp" */
         }
-        type = qapi_enum_parse(SocketAddressFlatType_lookup, ptr,
-                               SOCKET_ADDRESS_FLAT_TYPE__MAX, -1, NULL);
-        if (type != SOCKET_ADDRESS_FLAT_TYPE_INET
-            && type != SOCKET_ADDRESS_FLAT_TYPE_UNIX) {
+        type = qapi_enum_parse(SocketAddressType_lookup, ptr,
+                               SOCKET_ADDRESS_TYPE__MAX, -1, NULL);
+        if (type != SOCKET_ADDRESS_TYPE_INET
+            && type != SOCKET_ADDRESS_TYPE_UNIX) {
             error_setg(&local_err,
                        "Parameter '%s' may be 'inet' or 'unix'",
                        GLUSTER_OPT_TYPE);
@@ -559,7 +559,7 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
         gsconf->type = type;
         qemu_opts_del(opts);
 
-        if (gsconf->type == SOCKET_ADDRESS_FLAT_TYPE_INET) {
+        if (gsconf->type == SOCKET_ADDRESS_TYPE_INET) {
             /* create opts info from runtime_inet_opts list */
             opts = qemu_opts_create(&runtime_inet_opts, NULL, 0, &error_abort);
             qemu_opts_absorb_qdict(opts, backing_options, &local_err);
@@ -628,11 +628,11 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
         }
 
         if (gconf->server == NULL) {
-            gconf->server = g_new0(SocketAddressFlatList, 1);
+            gconf->server = g_new0(SocketAddressList, 1);
             gconf->server->value = gsconf;
             curr = gconf->server;
         } else {
-            curr->next = g_new0(SocketAddressFlatList, 1);
+            curr->next = g_new0(SocketAddressList, 1);
             curr->next->value = gsconf;
             curr = curr->next;
         }
@@ -648,7 +648,7 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
 
 out:
     error_propagate(errp, local_err);
-    qapi_free_SocketAddressFlat(gsconf);
+    qapi_free_SocketAddress(gsconf);
     qemu_opts_del(opts);
     g_free(str);
     QDECREF(backing_options);
diff --git a/block/nbd.c b/block/nbd.c
index 8bdcbc5..ee51d1a 100644
--- a/block/nbd.c
+++ b/block/nbd.c
@@ -47,7 +47,7 @@ typedef struct BDRVNBDState {
     NBDClientSession client;
 
     /* For nbd_refresh_filename() */
-    SocketAddressFlat *saddr;
+    SocketAddress *saddr;
     char *export, *tlscredsid;
 } BDRVNBDState;
 
@@ -259,10 +259,10 @@ static bool nbd_process_legacy_socket_options(QDict *output_options,
     return true;
 }
 
-static SocketAddressFlat *nbd_config(BDRVNBDState *s, QDict *options,
-                                     Error **errp)
+static SocketAddress *nbd_config(BDRVNBDState *s, QDict *options,
+                                 Error **errp)
 {
-    SocketAddressFlat *saddr = NULL;
+    SocketAddress *saddr = NULL;
     QDict *addr = NULL;
     QObject *crumpled_addr = NULL;
     Visitor *iv = NULL;
@@ -288,7 +288,7 @@ static SocketAddressFlat *nbd_config(BDRVNBDState *s, QDict *options,
      * visitor expects the former.
      */
     iv = qobject_input_visitor_new(crumpled_addr);
-    visit_type_SocketAddressFlat(iv, NULL, &saddr, &local_err);
+    visit_type_SocketAddress(iv, NULL, &saddr, &local_err);
     if (local_err) {
         error_propagate(errp, local_err);
         goto done;
@@ -307,7 +307,7 @@ NBDClientSession *nbd_get_client_session(BlockDriverState *bs)
     return &s->client;
 }
 
-static QIOChannelSocket *nbd_establish_connection(SocketAddressFlat *saddr_flat,
+static QIOChannelSocket *nbd_establish_connection(SocketAddress *saddr_flat,
                                                   Error **errp)
 {
     SocketAddressLegacy *saddr = socket_address_crumple(saddr_flat);
@@ -413,7 +413,7 @@ static int nbd_open(BlockDriverState *bs, QDict *options, int flags,
         goto error;
     }
 
-    /* Translate @host, @port, and @path to a SocketAddressFlat */
+    /* Translate @host, @port, and @path to a SocketAddress */
     if (!nbd_process_legacy_socket_options(options, opts, errp)) {
         goto error;
     }
@@ -434,7 +434,7 @@ static int nbd_open(BlockDriverState *bs, QDict *options, int flags,
         }
 
         /* TODO SOCKET_ADDRESS_KIND_FD where fd has AF_INET or AF_INET6 */
-        if (s->saddr->type != SOCKET_ADDRESS_FLAT_TYPE_INET) {
+        if (s->saddr->type != SOCKET_ADDRESS_TYPE_INET) {
             error_setg(errp, "TLS only supported over IP sockets");
             goto error;
         }
@@ -461,7 +461,7 @@ static int nbd_open(BlockDriverState *bs, QDict *options, int flags,
         object_unref(OBJECT(tlscreds));
     }
     if (ret < 0) {
-        qapi_free_SocketAddressFlat(s->saddr);
+        qapi_free_SocketAddress(s->saddr);
         g_free(s->export);
         g_free(s->tlscredsid);
     }
@@ -487,7 +487,7 @@ static void nbd_close(BlockDriverState *bs)
 
     nbd_client_close(bs);
 
-    qapi_free_SocketAddressFlat(s->saddr);
+    qapi_free_SocketAddress(s->saddr);
     g_free(s->export);
     g_free(s->tlscredsid);
 }
@@ -518,13 +518,13 @@ static void nbd_refresh_filename(BlockDriverState *bs, QDict *options)
     Visitor *ov;
     const char *host = NULL, *port = NULL, *path = NULL;
 
-    if (s->saddr->type == SOCKET_ADDRESS_FLAT_TYPE_INET) {
+    if (s->saddr->type == SOCKET_ADDRESS_TYPE_INET) {
         const InetSocketAddress *inet = &s->saddr->u.inet;
         if (!inet->has_ipv4 && !inet->has_ipv6 && !inet->has_to) {
             host = inet->host;
             port = inet->port;
         }
-    } else if (s->saddr->type == SOCKET_ADDRESS_FLAT_TYPE_UNIX) {
+    } else if (s->saddr->type == SOCKET_ADDRESS_TYPE_UNIX) {
         path = s->saddr->u.q_unix.path;
     } /* else can't represent as pseudo-filename */
 
@@ -545,7 +545,7 @@ static void nbd_refresh_filename(BlockDriverState *bs, QDict *options)
     }
 
     ov = qobject_output_visitor_new(&saddr_qdict);
-    visit_type_SocketAddressFlat(ov, NULL, &s->saddr, &error_abort);
+    visit_type_SocketAddress(ov, NULL, &s->saddr, &error_abort);
     visit_complete(ov, &saddr_qdict);
     visit_free(ov);
     qdict_put_obj(opts, "server", saddr_qdict);
diff --git a/block/sheepdog.c b/block/sheepdog.c
index 7ee2e6e..547239a 100644
--- a/block/sheepdog.c
+++ b/block/sheepdog.c
@@ -554,7 +554,7 @@ static SocketAddressLegacy *sd_server_config(QDict *options, Error **errp)
     QDict *server = NULL;
     QObject *crumpled_server = NULL;
     Visitor *iv = NULL;
-    SocketAddressFlat *saddr_flat = NULL;
+    SocketAddress *saddr_flat = NULL;
     SocketAddressLegacy *saddr = NULL;
     Error *local_err = NULL;
 
@@ -574,7 +574,7 @@ static SocketAddressLegacy *sd_server_config(QDict *options, Error **errp)
      * visitor expects the former.
      */
     iv = qobject_input_visitor_new(crumpled_server);
-    visit_type_SocketAddressFlat(iv, NULL, &saddr_flat, &local_err);
+    visit_type_SocketAddress(iv, NULL, &saddr_flat, &local_err);
     if (local_err) {
         error_propagate(errp, local_err);
         goto done;
@@ -583,7 +583,7 @@ static SocketAddressLegacy *sd_server_config(QDict *options, Error **errp)
     saddr = socket_address_crumple(saddr_flat);
 
 done:
-    qapi_free_SocketAddressFlat(saddr_flat);
+    qapi_free_SocketAddress(saddr_flat);
     visit_free(iv);
     qobject_decref(crumpled_server);
     QDECREF(server);
diff --git a/include/qemu/sockets.h b/include/qemu/sockets.h
index f4a4b10..82b7460 100644
--- a/include/qemu/sockets.h
+++ b/include/qemu/sockets.h
@@ -124,11 +124,11 @@ char *socket_address_to_string(struct SocketAddressLegacy *addr, Error **errp);
  * socket_address_crumple:
  * @addr_flat: the socket address to crumple
  *
- * Convert SocketAddressFlat to SocketAddressLegacy.  Caller is responsible
+ * Convert SocketAddress to SocketAddressLegacy.  Caller is responsible
  * for freeing with qapi_free_SocketAddressLegacy().
  *
  * Returns: the argument converted to SocketAddressLegacy.
  */
-SocketAddressLegacy *socket_address_crumple(SocketAddressFlat *addr_flat);
+SocketAddressLegacy *socket_address_crumple(SocketAddress *addr);
 
 #endif /* QEMU_SOCKETS_H */
diff --git a/qapi-schema.json b/qapi-schema.json
index b5a042b..a741fdd 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -4126,7 +4126,7 @@
 #
 # Captures the address of a socket, which could also be a named file descriptor
 #
-# Note: This type is deprecated in favor of SocketAddressFlat.
+# Note: This type is deprecated in favor of SocketAddress.
 #
 # Since: 1.3
 ##
@@ -4138,9 +4138,9 @@
     'fd': 'String' } }
 
 ##
-# @SocketAddressFlatType:
+# @SocketAddressType:
 #
-# Available SocketAddressFlat types
+# Available SocketAddress types
 #
 # @inet:  Internet address
 #
@@ -4148,11 +4148,11 @@
 #
 # Since: 2.9
 ##
-{ 'enum': 'SocketAddressFlatType',
+{ 'enum': 'SocketAddressType',
   'data': [ 'inet', 'unix', 'vsock', 'fd' ] }
 
 ##
-# @SocketAddressFlat:
+# @SocketAddress:
 #
 # Captures the address of a socket
 #
@@ -4164,8 +4164,8 @@
 #
 # Since: 2.9
 ##
-{ 'union': 'SocketAddressFlat',
-  'base': { 'type': 'SocketAddressFlatType' },
+{ 'union': 'SocketAddress',
+  'base': { 'type': 'SocketAddressType' },
   'discriminator': 'type',
   'data': { 'inet': 'InetSocketAddress',
             'unix': 'UnixSocketAddress',
diff --git a/qapi/block-core.json b/qapi/block-core.json
index 033457c..aed43e1 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
@@ -2520,7 +2520,7 @@
 { 'struct': 'BlockdevOptionsGluster',
   'data': { 'volume': 'str',
             'path': 'str',
-            'server': ['SocketAddressFlat'],
+            'server': ['SocketAddress'],
             '*debug': 'int',
             '*logfile': 'str' } }
 
@@ -2632,7 +2632,7 @@
 # Since: 2.9
 ##
 { 'struct': 'BlockdevOptionsSheepdog',
-  'data': { 'server': 'SocketAddressFlat',
+  'data': { 'server': 'SocketAddress',
             'vdi': 'str',
             '*snap-id': 'uint32',
             '*tag': 'str' } }
@@ -2847,7 +2847,7 @@
 # Since: 2.9
 ##
 { 'struct': 'BlockdevOptionsNbd',
-  'data': { 'server': 'SocketAddressFlat',
+  'data': { 'server': 'SocketAddress',
             '*export': 'str',
             '*tls-creds': 'str' } }
 
diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
index 4c48203..801aa7a 100644
--- a/util/qemu-sockets.c
+++ b/util/qemu-sockets.c
@@ -1341,27 +1341,27 @@ char *socket_address_to_string(struct SocketAddressLegacy *addr, Error **errp)
     return buf;
 }
 
-SocketAddressLegacy *socket_address_crumple(SocketAddressFlat *addr_flat)
+SocketAddressLegacy *socket_address_crumple(SocketAddress *addr_flat)
 {
     SocketAddressLegacy *addr = g_new(SocketAddressLegacy, 1);
 
     switch (addr_flat->type) {
-    case SOCKET_ADDRESS_FLAT_TYPE_INET:
+    case SOCKET_ADDRESS_TYPE_INET:
         addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
         addr->u.inet.data = QAPI_CLONE(InetSocketAddress,
                                        &addr_flat->u.inet);
         break;
-    case SOCKET_ADDRESS_FLAT_TYPE_UNIX:
+    case SOCKET_ADDRESS_TYPE_UNIX:
         addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
         addr->u.q_unix.data = QAPI_CLONE(UnixSocketAddress,
                                          &addr_flat->u.q_unix);
         break;
-    case SOCKET_ADDRESS_FLAT_TYPE_VSOCK:
+    case SOCKET_ADDRESS_TYPE_VSOCK:
         addr->type = SOCKET_ADDRESS_LEGACY_KIND_VSOCK;
         addr->u.vsock.data = QAPI_CLONE(VsockSocketAddress,
                                         &addr_flat->u.vsock);
         break;
-    case SOCKET_ADDRESS_FLAT_TYPE_FD:
+    case SOCKET_ADDRESS_TYPE_FD:
         addr->type = SOCKET_ADDRESS_LEGACY_KIND_FD;
         addr->u.fd.data = QAPI_CLONE(String, &addr_flat->u.fd);
         break;
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [Qemu-devel] [PATCH 6/7] sockets: Limit SocketAddressLegacy except to external interfaces
  2017-04-26  7:36 [Qemu-devel] [PATCH 0/7] sockets: Flatten SocketAddress except in external interfaces Markus Armbruster
                   ` (4 preceding siblings ...)
  2017-04-26  7:36 ` [Qemu-devel] [PATCH 5/7] sockets: Rename SocketAddressFlat to SocketAddress Markus Armbruster
@ 2017-04-26  7:36 ` Markus Armbruster
  2017-04-26 19:45   ` Eric Blake
  2017-04-26  7:36 ` [Qemu-devel] [PATCH 7/7] socket: Delete unused helper socket_address_crumple() Markus Armbruster
  2017-04-28  8:15 ` [Qemu-devel] [PATCH 0/7] sockets: Flatten SocketAddress except in external interfaces Markus Armbruster
  7 siblings, 1 reply; 19+ messages in thread
From: Markus Armbruster @ 2017-04-26  7:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: berrange, kraxel, pbonzini, eblake, qemu-block

SocketAddressLegacy is a simple union, and simple unions are awkward:
they have their variant members wrapped in a "data" object on the
wire, and require additional indirections in C.  SocketAddress is the
equivalent flat union.  Convert all users of SocketAddressLegacy to
SocketAddress, except for existing external interfaces.

See also commit fce5d53..9445673 and 85a82e8..c5f1ae3.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 block/nbd.c                    |   4 +-
 block/sheepdog.c               |  32 +++-----
 blockdev-nbd.c                 |  21 +++--
 chardev/char-socket.c          |  38 ++++-----
 chardev/char-udp.c             |  10 ++-
 hmp.c                          |   7 +-
 include/block/nbd.h            |   3 +
 include/io/channel-socket.h    |  24 +++---
 include/io/dns-resolver.h      |  22 +++---
 include/io/task.h              |  10 +--
 include/qemu/sockets.h         |  33 +++++---
 io/channel-socket.c            |  48 +++++------
 io/dns-resolver.c              |  55 +++++++------
 migration/socket.c             |  49 ++++++------
 net/socket.c                   |  10 +--
 qapi-schema.json               |  14 ++--
 qemu-nbd.c                     |  17 ++--
 qga/channel-posix.c            |   4 +-
 qga/main.c                     |   8 +-
 tests/test-io-channel-socket.c | 104 +++++++++++-------------
 ui/vnc-auth-sasl.c             |   9 +--
 ui/vnc.c                       | 138 ++++++++++++++++----------------
 util/qemu-sockets.c            | 176 +++++++++++++++++++++++------------------
 23 files changed, 434 insertions(+), 402 deletions(-)

diff --git a/block/nbd.c b/block/nbd.c
index ee51d1a..8318883 100644
--- a/block/nbd.c
+++ b/block/nbd.c
@@ -307,10 +307,9 @@ NBDClientSession *nbd_get_client_session(BlockDriverState *bs)
     return &s->client;
 }
 
-static QIOChannelSocket *nbd_establish_connection(SocketAddress *saddr_flat,
+static QIOChannelSocket *nbd_establish_connection(SocketAddress *saddr,
                                                   Error **errp)
 {
-    SocketAddressLegacy *saddr = socket_address_crumple(saddr_flat);
     QIOChannelSocket *sioc;
     Error *local_err = NULL;
 
@@ -320,7 +319,6 @@ static QIOChannelSocket *nbd_establish_connection(SocketAddress *saddr_flat,
     qio_channel_socket_connect_sync(sioc,
                                     saddr,
                                     &local_err);
-    qapi_free_SocketAddressLegacy(saddr);
     if (local_err) {
         object_unref(OBJECT(sioc));
         error_propagate(errp, local_err);
diff --git a/block/sheepdog.c b/block/sheepdog.c
index 547239a..17c4ef5 100644
--- a/block/sheepdog.c
+++ b/block/sheepdog.c
@@ -378,7 +378,7 @@ struct BDRVSheepdogState {
     uint32_t cache_flags;
     bool discard_supported;
 
-    SocketAddressLegacy *addr;
+    SocketAddress *addr;
     int fd;
 
     CoMutex lock;
@@ -530,32 +530,29 @@ static void sd_aio_setup(SheepdogAIOCB *acb, BDRVSheepdogState *s,
     QLIST_INSERT_HEAD(&s->inflight_aiocb_head, acb, aiocb_siblings);
 }
 
-static SocketAddressLegacy *sd_socket_address(const char *path,
+static SocketAddress *sd_socket_address(const char *path,
                                         const char *host, const char *port)
 {
-    SocketAddressLegacy *addr = g_new0(SocketAddressLegacy, 1);
+    SocketAddress *addr = g_new0(SocketAddress, 1);
 
     if (path) {
-        addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
-        addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
-        addr->u.q_unix.data->path = g_strdup(path);
+        addr->type = SOCKET_ADDRESS_TYPE_UNIX;
+        addr->u.q_unix.path = g_strdup(path);
     } else {
-        addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
-        addr->u.inet.data = g_new0(InetSocketAddress, 1);
-        addr->u.inet.data->host = g_strdup(host ?: SD_DEFAULT_ADDR);
-        addr->u.inet.data->port = g_strdup(port ?: stringify(SD_DEFAULT_PORT));
+        addr->type = SOCKET_ADDRESS_TYPE_INET;
+        addr->u.inet.host = g_strdup(host ?: SD_DEFAULT_ADDR);
+        addr->u.inet.port = g_strdup(port ?: stringify(SD_DEFAULT_PORT));
     }
 
     return addr;
 }
 
-static SocketAddressLegacy *sd_server_config(QDict *options, Error **errp)
+static SocketAddress *sd_server_config(QDict *options, Error **errp)
 {
     QDict *server = NULL;
     QObject *crumpled_server = NULL;
     Visitor *iv = NULL;
-    SocketAddress *saddr_flat = NULL;
-    SocketAddressLegacy *saddr = NULL;
+    SocketAddress *saddr = NULL;
     Error *local_err = NULL;
 
     qdict_extract_subqdict(options, &server, "server.");
@@ -574,16 +571,13 @@ static SocketAddressLegacy *sd_server_config(QDict *options, Error **errp)
      * visitor expects the former.
      */
     iv = qobject_input_visitor_new(crumpled_server);
-    visit_type_SocketAddress(iv, NULL, &saddr_flat, &local_err);
+    visit_type_SocketAddress(iv, NULL, &saddr, &local_err);
     if (local_err) {
         error_propagate(errp, local_err);
         goto done;
     }
 
-    saddr = socket_address_crumple(saddr_flat);
-
 done:
-    qapi_free_SocketAddress(saddr_flat);
     visit_free(iv);
     qobject_decref(crumpled_server);
     QDECREF(server);
@@ -597,7 +591,7 @@ static int connect_to_sdog(BDRVSheepdogState *s, Error **errp)
 
     fd = socket_connect(s->addr, NULL, NULL, errp);
 
-    if (s->addr->type == SOCKET_ADDRESS_LEGACY_KIND_INET && fd >= 0) {
+    if (s->addr->type == SOCKET_ADDRESS_TYPE_INET && fd >= 0) {
         int ret = socket_set_nodelay(fd);
         if (ret < 0) {
             error_report("%s", strerror(errno));
@@ -2149,7 +2143,7 @@ static void sd_close(BlockDriverState *bs)
     aio_set_fd_handler(bdrv_get_aio_context(bs), s->fd,
                        false, NULL, NULL, NULL, NULL);
     closesocket(s->fd);
-    qapi_free_SocketAddressLegacy(s->addr);
+    qapi_free_SocketAddress(s->addr);
 }
 
 static int64_t sd_getlength(BlockDriverState *bs)
diff --git a/blockdev-nbd.c b/blockdev-nbd.c
index 6b0c699..dd0860f 100644
--- a/blockdev-nbd.c
+++ b/blockdev-nbd.c
@@ -99,9 +99,8 @@ static QCryptoTLSCreds *nbd_get_tls_creds(const char *id, Error **errp)
 }
 
 
-void qmp_nbd_server_start(SocketAddressLegacy *addr,
-                          bool has_tls_creds, const char *tls_creds,
-                          Error **errp)
+void nbd_server_start(SocketAddress *addr, const char *tls_creds,
+                      Error **errp)
 {
     if (nbd_server) {
         error_setg(errp, "NBD server already running");
@@ -118,14 +117,14 @@ void qmp_nbd_server_start(SocketAddressLegacy *addr,
         goto error;
     }
 
-    if (has_tls_creds) {
+    if (tls_creds) {
         nbd_server->tlscreds = nbd_get_tls_creds(tls_creds, errp);
         if (!nbd_server->tlscreds) {
             goto error;
         }
 
-        /* TODO SOCKET_ADDRESS_LEGACY_KIND_FD where fd has AF_INET or AF_INET6 */
-        if (addr->type != SOCKET_ADDRESS_LEGACY_KIND_INET) {
+        /* TODO SOCKET_ADDRESS_TYPE_FD where fd has AF_INET or AF_INET6 */
+        if (addr->type != SOCKET_ADDRESS_TYPE_INET) {
             error_setg(errp, "TLS is only supported with IPv4/IPv6");
             goto error;
         }
@@ -145,6 +144,16 @@ void qmp_nbd_server_start(SocketAddressLegacy *addr,
     nbd_server = NULL;
 }
 
+void qmp_nbd_server_start(SocketAddressLegacy *addr,
+                          bool has_tls_creds, const char *tls_creds,
+                          Error **errp)
+{
+    SocketAddress *addr_flat = socket_address_flatten(addr);
+
+    nbd_server_start(addr_flat, tls_creds, errp);
+    qapi_free_SocketAddress(addr_flat);
+}
+
 void qmp_nbd_server_add(const char *device, bool has_writable, bool writable,
                         Error **errp)
 {
diff --git a/chardev/char-socket.c b/chardev/char-socket.c
index 9eca786..c933d0c 100644
--- a/chardev/char-socket.c
+++ b/chardev/char-socket.c
@@ -52,7 +52,7 @@ typedef struct {
     int *write_msgfds;
     size_t write_msgfds_num;
 
-    SocketAddressLegacy *addr;
+    SocketAddress *addr;
     bool is_listen;
     bool is_telnet;
 
@@ -337,30 +337,30 @@ static void tcp_chr_free_connection(Chardev *chr)
     s->connected = 0;
 }
 
-static char *SocketAddress_to_str(const char *prefix, SocketAddressLegacy *addr,
+static char *SocketAddressto_str(const char *prefix, SocketAddress *addr,
                                   bool is_listen, bool is_telnet)
 {
     switch (addr->type) {
-    case SOCKET_ADDRESS_LEGACY_KIND_INET:
+    case SOCKET_ADDRESS_TYPE_INET:
         return g_strdup_printf("%s%s:%s:%s%s", prefix,
                                is_telnet ? "telnet" : "tcp",
-                               addr->u.inet.data->host,
-                               addr->u.inet.data->port,
+                               addr->u.inet.host,
+                               addr->u.inet.port,
                                is_listen ? ",server" : "");
         break;
-    case SOCKET_ADDRESS_LEGACY_KIND_UNIX:
+    case SOCKET_ADDRESS_TYPE_UNIX:
         return g_strdup_printf("%sunix:%s%s", prefix,
-                               addr->u.q_unix.data->path,
+                               addr->u.q_unix.path,
                                is_listen ? ",server" : "");
         break;
-    case SOCKET_ADDRESS_LEGACY_KIND_FD:
-        return g_strdup_printf("%sfd:%s%s", prefix, addr->u.fd.data->str,
+    case SOCKET_ADDRESS_TYPE_FD:
+        return g_strdup_printf("%sfd:%s%s", prefix, addr->u.fd.str,
                                is_listen ? ",server" : "");
         break;
-    case SOCKET_ADDRESS_LEGACY_KIND_VSOCK:
+    case SOCKET_ADDRESS_TYPE_VSOCK:
         return g_strdup_printf("%svsock:%s:%s", prefix,
-                               addr->u.vsock.data->cid,
-                               addr->u.vsock.data->port);
+                               addr->u.vsock.cid,
+                               addr->u.vsock.port);
     default:
         abort();
     }
@@ -380,7 +380,7 @@ static void tcp_chr_disconnect(Chardev *chr)
         s->listen_tag = qio_channel_add_watch(
             QIO_CHANNEL(s->listen_ioc), G_IO_IN, tcp_chr_accept, chr, NULL);
     }
-    chr->filename = SocketAddress_to_str("disconnected:", s->addr,
+    chr->filename = SocketAddressto_str("disconnected:", s->addr,
                                          s->is_listen, s->is_telnet);
     qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
     if (s->reconnect_time) {
@@ -609,7 +609,7 @@ static void tcp_chr_tls_init(Chardev *chr)
     } else {
         tioc = qio_channel_tls_new_client(
             s->ioc, s->tls_creds,
-            s->addr->u.inet.data->host,
+            s->addr->u.inet.host,
             &err);
     }
     if (tioc == NULL) {
@@ -757,7 +757,7 @@ static void char_socket_finalize(Object *obj)
         g_source_remove(s->reconnect_timer);
         s->reconnect_timer = 0;
     }
-    qapi_free_SocketAddressLegacy(s->addr);
+    qapi_free_SocketAddress(s->addr);
     if (s->listen_tag) {
         g_source_remove(s->listen_tag);
         s->listen_tag = 0;
@@ -820,13 +820,13 @@ static void qmp_chardev_open_socket(Chardev *chr,
 {
     SocketChardev *s = SOCKET_CHARDEV(chr);
     ChardevSocket *sock = backend->u.socket.data;
-    SocketAddressLegacy *addr = sock->addr;
     bool do_nodelay     = sock->has_nodelay ? sock->nodelay : false;
     bool is_listen      = sock->has_server  ? sock->server  : true;
     bool is_telnet      = sock->has_telnet  ? sock->telnet  : false;
     bool is_waitconnect = sock->has_wait    ? sock->wait    : false;
     int64_t reconnect   = sock->has_reconnect ? sock->reconnect : 0;
     QIOChannelSocket *sioc = NULL;
+    SocketAddress *addr;
 
     s->is_listen = is_listen;
     s->is_telnet = is_telnet;
@@ -864,18 +864,18 @@ static void qmp_chardev_open_socket(Chardev *chr,
         }
     }
 
-    s->addr = QAPI_CLONE(SocketAddressLegacy, sock->addr);
+    s->addr = addr = socket_address_flatten(sock->addr);
 
     qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_RECONNECTABLE);
     /* TODO SOCKET_ADDRESS_FD where fd has AF_UNIX */
-    if (addr->type == SOCKET_ADDRESS_LEGACY_KIND_UNIX) {
+    if (addr->type == SOCKET_ADDRESS_TYPE_UNIX) {
         qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_FD_PASS);
     }
 
     /* be isn't opened until we get a connection */
     *be_opened = false;
 
-    chr->filename = SocketAddress_to_str("disconnected:",
+    chr->filename = SocketAddressto_str("disconnected:",
                                          addr, is_listen, is_telnet);
 
     if (is_listen) {
diff --git a/chardev/char-udp.c b/chardev/char-udp.c
index d9bcfc5..6c32021 100644
--- a/chardev/char-udp.c
+++ b/chardev/char-udp.c
@@ -187,13 +187,17 @@ static void qmp_chardev_open_udp(Chardev *chr,
                                  Error **errp)
 {
     ChardevUdp *udp = backend->u.udp.data;
+    SocketAddress *local_addr = socket_address_flatten(udp->local);
+    SocketAddress *remote_addr = socket_address_flatten(udp->remote);
     QIOChannelSocket *sioc = qio_channel_socket_new();
     char *name;
     UdpChardev *s = UDP_CHARDEV(chr);
+    int ret;
 
-    if (qio_channel_socket_dgram_sync(sioc,
-                                      udp->local, udp->remote,
-                                      errp) < 0) {
+    ret = qio_channel_socket_dgram_sync(sioc, local_addr, remote_addr, errp);
+    qapi_free_SocketAddress(local_addr);
+    qapi_free_SocketAddress(remote_addr);
+    if (ret < 0) {
         object_unref(OBJECT(sioc));
         return;
     }
diff --git a/hmp.c b/hmp.c
index 1fe109d..5dacde8 100644
--- a/hmp.c
+++ b/hmp.c
@@ -33,6 +33,7 @@
 #include "qapi-visit.h"
 #include "qom/object_interfaces.h"
 #include "ui/console.h"
+#include "block/nbd.h"
 #include "block/qapi.h"
 #include "qemu-io.h"
 #include "qemu/cutils.h"
@@ -1934,7 +1935,7 @@ void hmp_nbd_server_start(Monitor *mon, const QDict *qdict)
     bool all = qdict_get_try_bool(qdict, "all", false);
     Error *local_err = NULL;
     BlockInfoList *block_list, *info;
-    SocketAddressLegacy *addr;
+    SocketAddress *addr;
 
     if (writable && !all) {
         error_setg(&local_err, "-w only valid together with -a");
@@ -1947,8 +1948,8 @@ void hmp_nbd_server_start(Monitor *mon, const QDict *qdict)
         goto exit;
     }
 
-    qmp_nbd_server_start(addr, false, NULL, &local_err);
-    qapi_free_SocketAddressLegacy(addr);
+    nbd_server_start(addr, NULL, &local_err);
+    qapi_free_SocketAddress(addr);
     if (local_err != NULL) {
         goto exit;
     }
diff --git a/include/block/nbd.h b/include/block/nbd.h
index 3e373f0..0ed0775 100644
--- a/include/block/nbd.h
+++ b/include/block/nbd.h
@@ -164,4 +164,7 @@ void nbd_client_new(NBDExport *exp,
 void nbd_client_get(NBDClient *client);
 void nbd_client_put(NBDClient *client);
 
+void nbd_server_start(SocketAddress *addr, const char *tls_creds,
+                      Error **errp);
+
 #endif
diff --git a/include/io/channel-socket.h b/include/io/channel-socket.h
index c1aaa72..53801f6 100644
--- a/include/io/channel-socket.h
+++ b/include/io/channel-socket.h
@@ -91,7 +91,7 @@ qio_channel_socket_new_fd(int fd,
  * an error occurs.
  */
 int qio_channel_socket_connect_sync(QIOChannelSocket *ioc,
-                                    SocketAddressLegacy *addr,
+                                    SocketAddress *addr,
                                     Error **errp);
 
 /**
@@ -110,7 +110,7 @@ int qio_channel_socket_connect_sync(QIOChannelSocket *ioc,
  * as this function returns without waiting for completion.
  */
 void qio_channel_socket_connect_async(QIOChannelSocket *ioc,
-                                      SocketAddressLegacy *addr,
+                                      SocketAddress *addr,
                                       QIOTaskFunc callback,
                                       gpointer opaque,
                                       GDestroyNotify destroy);
@@ -128,7 +128,7 @@ void qio_channel_socket_connect_async(QIOChannelSocket *ioc,
  * an error occurs.
  */
 int qio_channel_socket_listen_sync(QIOChannelSocket *ioc,
-                                   SocketAddressLegacy *addr,
+                                   SocketAddress *addr,
                                    Error **errp);
 
 /**
@@ -147,7 +147,7 @@ int qio_channel_socket_listen_sync(QIOChannelSocket *ioc,
  * as this function returns without waiting for completion.
  */
 void qio_channel_socket_listen_async(QIOChannelSocket *ioc,
-                                     SocketAddressLegacy *addr,
+                                     SocketAddress *addr,
                                      QIOTaskFunc callback,
                                      gpointer opaque,
                                      GDestroyNotify destroy);
@@ -167,8 +167,8 @@ void qio_channel_socket_listen_async(QIOChannelSocket *ioc,
  * is established or an error occurs.
  */
 int qio_channel_socket_dgram_sync(QIOChannelSocket *ioc,
-                                  SocketAddressLegacy *localAddr,
-                                  SocketAddressLegacy *remoteAddr,
+                                  SocketAddress *localAddr,
+                                  SocketAddress *remoteAddr,
                                   Error **errp);
 
 /**
@@ -190,8 +190,8 @@ int qio_channel_socket_dgram_sync(QIOChannelSocket *ioc,
  * waiting for completion.
  */
 void qio_channel_socket_dgram_async(QIOChannelSocket *ioc,
-                                    SocketAddressLegacy *localAddr,
-                                    SocketAddressLegacy *remoteAddr,
+                                    SocketAddress *localAddr,
+                                    SocketAddress *remoteAddr,
                                     QIOTaskFunc callback,
                                     gpointer opaque,
                                     GDestroyNotify destroy);
@@ -205,12 +205,12 @@ void qio_channel_socket_dgram_async(QIOChannelSocket *ioc,
  * Get the string representation of the local socket
  * address. A pointer to the allocated address information
  * struct will be returned, which the caller is required to
- * release with a call qapi_free_SocketAddressLegacy() when no
+ * release with a call qapi_free_SocketAddress() when no
  * longer required.
  *
  * Returns: 0 on success, -1 on error
  */
-SocketAddressLegacy *
+SocketAddress *
 qio_channel_socket_get_local_address(QIOChannelSocket *ioc,
                                      Error **errp);
 
@@ -222,12 +222,12 @@ qio_channel_socket_get_local_address(QIOChannelSocket *ioc,
  * Get the string representation of the local socket
  * address. A pointer to the allocated address information
  * struct will be returned, which the caller is required to
- * release with a call qapi_free_SocketAddressLegacy() when no
+ * release with a call qapi_free_SocketAddress() when no
  * longer required.
  *
  * Returns: the socket address struct, or NULL on error
  */
-SocketAddressLegacy *
+SocketAddress *
 qio_channel_socket_get_remote_address(QIOChannelSocket *ioc,
                                       Error **errp);
 
diff --git a/include/io/dns-resolver.h b/include/io/dns-resolver.h
index aac46ca..2f69c08 100644
--- a/include/io/dns-resolver.h
+++ b/include/io/dns-resolver.h
@@ -40,15 +40,15 @@ typedef struct QIODNSResolverClass QIODNSResolverClass;
  * QIODNSResolver:
  *
  * The QIODNSResolver class provides a framework for doing
- * DNS resolution on SocketAddressLegacy objects, independently
+ * DNS resolution on SocketAddress objects, independently
  * of socket creation.
  *
  * <example>
  *   <title>Resolving addresses synchronously</title>
  *   <programlisting>
- *    int mylisten(SocketAddressLegacy *addr, Error **errp) {
+ *    int mylisten(SocketAddress *addr, Error **errp) {
  *      QIODNSResolver *resolver = qio_dns_resolver_get_instance();
- *      SocketAddressLegacy **rawaddrs = NULL;
+ *      SocketAddress **rawaddrs = NULL;
  *      size_t nrawaddrs = 0;
  *      Error *err = NULL;
  *      QIOChannel **socks = NULL;
@@ -69,7 +69,7 @@ typedef struct QIODNSResolverClass QIODNSResolverClass;
  *            socks = g_renew(QIOChannelSocket *, socks, nsocks + 1);
  *            socks[nsocks++] = sock;
  *         }
- *         qapi_free_SocketAddressLegacy(rawaddrs[i]);
+ *         qapi_free_SocketAddress(rawaddrs[i]);
  *      }
  *      g_free(rawaddrs);
  *
@@ -95,7 +95,7 @@ typedef struct QIODNSResolverClass QIODNSResolverClass;
  *      MyListenData *data = opaque;
  *      QIODNSResolver *resolver =
  *         QIO_DNS_RESOLVER(qio_task_get_source(task);
- *      SocketAddressLegacy **rawaddrs = NULL;
+ *      SocketAddress **rawaddrs = NULL;
  *      size_t nrawaddrs = 0;
  *      Error *err = NULL;
  *
@@ -116,7 +116,7 @@ typedef struct QIODNSResolverClass QIODNSResolverClass;
  *            socks = g_renew(QIOChannelSocket *, socks, nsocks + 1);
  *            socks[nsocks++] = sock;
  *         }
- *         qapi_free_SocketAddressLegacy(rawaddrs[i]);
+ *         qapi_free_SocketAddress(rawaddrs[i]);
  *      }
  *      g_free(rawaddrs);
  *
@@ -127,7 +127,7 @@ typedef struct QIODNSResolverClass QIODNSResolverClass;
  *      }
  *    }
  *
- *    void mylisten(SocketAddressLegacy *addr, MyListenData *data) {
+ *    void mylisten(SocketAddress *addr, MyListenData *data) {
  *      QIODNSResolver *resolver = qio_dns_resolver_get_instance();
  *      qio_dns_resolver_lookup_async(dns, addr,
  *                                    mylistenresult, data, NULL);
@@ -177,9 +177,9 @@ QIODNSResolver *qio_dns_resolver_get_instance(void);
  * Returns: 0 if resolution was successful, -1 on error
  */
 int qio_dns_resolver_lookup_sync(QIODNSResolver *resolver,
-                                 SocketAddressLegacy *addr,
+                                 SocketAddress *addr,
                                  size_t *naddrs,
-                                 SocketAddressLegacy ***addrs,
+                                 SocketAddress ***addrs,
                                  Error **errp);
 
 /**
@@ -201,7 +201,7 @@ int qio_dns_resolver_lookup_sync(QIODNSResolver *resolver,
  * of the caller will not be blocked.
  */
 void qio_dns_resolver_lookup_async(QIODNSResolver *resolver,
-                                   SocketAddressLegacy *addr,
+                                   SocketAddress *addr,
                                    QIOTaskFunc func,
                                    gpointer opaque,
                                    GDestroyNotify notify);
@@ -223,6 +223,6 @@ void qio_dns_resolver_lookup_async(QIODNSResolver *resolver,
 void qio_dns_resolver_lookup_result(QIODNSResolver *resolver,
                                     QIOTask *task,
                                     size_t *naddrs,
-                                    SocketAddressLegacy ***addrs);
+                                    SocketAddress ***addrs);
 
 #endif /* QIO_DNS_RESOLVER_H */
diff --git a/include/io/task.h b/include/io/task.h
index f65ec7a..6021f51 100644
--- a/include/io/task.h
+++ b/include/io/task.h
@@ -166,7 +166,7 @@ typedef void (*QIOTaskWorker)(QIOTask *task,
  *                                       gpointer opaque)
  *    {
  *       QMyObject obj = QMY_OBJECT(qio_task_get_source(task));
- *       SocketAddressLegacy *addr = opaque;
+ *       SocketAddress *addr = opaque;
  *       Error *err = NULL;
  *
  *       obj->fd = socket_listen(addr, &err);
@@ -175,20 +175,20 @@ typedef void (*QIOTaskWorker)(QIOTask *task,
  *    }
  *
  *    void myobject_listen_async(QMyObject *obj,
- *                               SocketAddressLegacy *addr,
+ *                               SocketAddress *addr,
  *                               QIOTaskFunc *func,
  *                               gpointer opaque,
  *                               GDestroyNotify notify)
  *    {
  *      QIOTask *task;
- *      SocketAddressLegacy *addrCopy;
+ *      SocketAddress *addrCopy;
  *
- *      addrCopy = QAPI_CLONE(SocketAddressLegacy, addr);
+ *      addrCopy = QAPI_CLONE(SocketAddress, addr);
  *      task = qio_task_new(OBJECT(obj), func, opaque, notify);
  *
  *      qio_task_run_in_thread(task, myobject_listen_worker,
  *                             addrCopy,
- *                             qapi_free_SocketAddressLegacy);
+ *                             qapi_free_SocketAddress);
  *    }
  * </example>
  *
diff --git a/include/qemu/sockets.h b/include/qemu/sockets.h
index 82b7460..a7da674 100644
--- a/include/qemu/sockets.h
+++ b/include/qemu/sockets.h
@@ -45,12 +45,12 @@ NetworkAddressFamily inet_netfamily(int family);
 int unix_listen(const char *path, char *ostr, int olen, Error **errp);
 int unix_connect(const char *path, Error **errp);
 
-SocketAddressLegacy *socket_parse(const char *str, Error **errp);
-int socket_connect(SocketAddressLegacy *addr, NonBlockingConnectHandler *callback,
+SocketAddress *socket_parse(const char *str, Error **errp);
+int socket_connect(SocketAddress *addr, NonBlockingConnectHandler *callback,
                    void *opaque, Error **errp);
-int socket_listen(SocketAddressLegacy *addr, Error **errp);
+int socket_listen(SocketAddress *addr, Error **errp);
 void socket_listen_cleanup(int fd, Error **errp);
-int socket_dgram(SocketAddressLegacy *remote, SocketAddressLegacy *local, Error **errp);
+int socket_dgram(SocketAddress *remote, SocketAddress *local, Error **errp);
 
 /* Old, ipv4 only bits.  Don't use for new code. */
 int parse_host_port(struct sockaddr_in *saddr, const char *str);
@@ -65,12 +65,12 @@ int socket_init(void);
  * Get the string representation of the socket
  * address. A pointer to the allocated address information
  * struct will be returned, which the caller is required to
- * release with a call qapi_free_SocketAddressLegacy() when no
+ * release with a call qapi_free_SocketAddress() when no
  * longer required.
  *
  * Returns: the socket address struct, or NULL on error
  */
-SocketAddressLegacy *
+SocketAddress *
 socket_sockaddr_to_address(struct sockaddr_storage *sa,
                            socklen_t salen,
                            Error **errp);
@@ -83,12 +83,12 @@ socket_sockaddr_to_address(struct sockaddr_storage *sa,
  * Get the string representation of the local socket
  * address. A pointer to the allocated address information
  * struct will be returned, which the caller is required to
- * release with a call qapi_free_SocketAddressLegacy() when no
+ * release with a call qapi_free_SocketAddress() when no
  * longer required.
  *
  * Returns: the socket address struct, or NULL on error
  */
-SocketAddressLegacy *socket_local_address(int fd, Error **errp);
+SocketAddress *socket_local_address(int fd, Error **errp);
 
 /**
  * socket_remote_address:
@@ -98,12 +98,12 @@ SocketAddressLegacy *socket_local_address(int fd, Error **errp);
  * Get the string representation of the remote socket
  * address. A pointer to the allocated address information
  * struct will be returned, which the caller is required to
- * release with a call qapi_free_SocketAddressLegacy() when no
+ * release with a call qapi_free_SocketAddress() when no
  * longer required.
  *
  * Returns: the socket address struct, or NULL on error
  */
-SocketAddressLegacy *socket_remote_address(int fd, Error **errp);
+SocketAddress *socket_remote_address(int fd, Error **errp);
 
 /**
  * socket_address_to_string:
@@ -118,7 +118,7 @@ SocketAddressLegacy *socket_remote_address(int fd, Error **errp);
  *
  * Returns: the socket address in string format, or NULL on error
  */
-char *socket_address_to_string(struct SocketAddressLegacy *addr, Error **errp);
+char *socket_address_to_string(struct SocketAddress *addr, Error **errp);
 
 /**
  * socket_address_crumple:
@@ -131,4 +131,15 @@ char *socket_address_to_string(struct SocketAddressLegacy *addr, Error **errp);
  */
 SocketAddressLegacy *socket_address_crumple(SocketAddress *addr);
 
+/**
+ * socket_address_flatten:
+ * @addr: the socket address to flatten
+ *
+ * Convert SocketAddressLegacy to SocketAddress.  Caller is responsible
+ * for freeing with qapi_free_SocketAddress().
+ *
+ * Returns: the argument converted to SocketAddressLegacy.
+ */
+SocketAddress *socket_address_flatten(SocketAddressLegacy *addr);
+
 #endif /* QEMU_SOCKETS_H */
diff --git a/io/channel-socket.c b/io/channel-socket.c
index a21dab6..53386b7 100644
--- a/io/channel-socket.c
+++ b/io/channel-socket.c
@@ -27,7 +27,7 @@
 
 #define SOCKET_MAX_FDS 16
 
-SocketAddressLegacy *
+SocketAddress *
 qio_channel_socket_get_local_address(QIOChannelSocket *ioc,
                                      Error **errp)
 {
@@ -36,7 +36,7 @@ qio_channel_socket_get_local_address(QIOChannelSocket *ioc,
                                       errp);
 }
 
-SocketAddressLegacy *
+SocketAddress *
 qio_channel_socket_get_remote_address(QIOChannelSocket *ioc,
                                       Error **errp)
 {
@@ -134,7 +134,7 @@ qio_channel_socket_new_fd(int fd,
 
 
 int qio_channel_socket_connect_sync(QIOChannelSocket *ioc,
-                                    SocketAddressLegacy *addr,
+                                    SocketAddress *addr,
                                     Error **errp)
 {
     int fd;
@@ -160,7 +160,7 @@ static void qio_channel_socket_connect_worker(QIOTask *task,
                                               gpointer opaque)
 {
     QIOChannelSocket *ioc = QIO_CHANNEL_SOCKET(qio_task_get_source(task));
-    SocketAddressLegacy *addr = opaque;
+    SocketAddress *addr = opaque;
     Error *err = NULL;
 
     qio_channel_socket_connect_sync(ioc, addr, &err);
@@ -170,16 +170,16 @@ static void qio_channel_socket_connect_worker(QIOTask *task,
 
 
 void qio_channel_socket_connect_async(QIOChannelSocket *ioc,
-                                      SocketAddressLegacy *addr,
+                                      SocketAddress *addr,
                                       QIOTaskFunc callback,
                                       gpointer opaque,
                                       GDestroyNotify destroy)
 {
     QIOTask *task = qio_task_new(
         OBJECT(ioc), callback, opaque, destroy);
-    SocketAddressLegacy *addrCopy;
+    SocketAddress *addrCopy;
 
-    addrCopy = QAPI_CLONE(SocketAddressLegacy, addr);
+    addrCopy = QAPI_CLONE(SocketAddress, addr);
 
     /* socket_connect() does a non-blocking connect(), but it
      * still blocks in DNS lookups, so we must use a thread */
@@ -187,12 +187,12 @@ void qio_channel_socket_connect_async(QIOChannelSocket *ioc,
     qio_task_run_in_thread(task,
                            qio_channel_socket_connect_worker,
                            addrCopy,
-                           (GDestroyNotify)qapi_free_SocketAddressLegacy);
+                           (GDestroyNotify)qapi_free_SocketAddress);
 }
 
 
 int qio_channel_socket_listen_sync(QIOChannelSocket *ioc,
-                                   SocketAddressLegacy *addr,
+                                   SocketAddress *addr,
                                    Error **errp)
 {
     int fd;
@@ -219,7 +219,7 @@ static void qio_channel_socket_listen_worker(QIOTask *task,
                                              gpointer opaque)
 {
     QIOChannelSocket *ioc = QIO_CHANNEL_SOCKET(qio_task_get_source(task));
-    SocketAddressLegacy *addr = opaque;
+    SocketAddress *addr = opaque;
     Error *err = NULL;
 
     qio_channel_socket_listen_sync(ioc, addr, &err);
@@ -229,29 +229,29 @@ static void qio_channel_socket_listen_worker(QIOTask *task,
 
 
 void qio_channel_socket_listen_async(QIOChannelSocket *ioc,
-                                     SocketAddressLegacy *addr,
+                                     SocketAddress *addr,
                                      QIOTaskFunc callback,
                                      gpointer opaque,
                                      GDestroyNotify destroy)
 {
     QIOTask *task = qio_task_new(
         OBJECT(ioc), callback, opaque, destroy);
-    SocketAddressLegacy *addrCopy;
+    SocketAddress *addrCopy;
 
-    addrCopy = QAPI_CLONE(SocketAddressLegacy, addr);
+    addrCopy = QAPI_CLONE(SocketAddress, addr);
 
     /* socket_listen() blocks in DNS lookups, so we must use a thread */
     trace_qio_channel_socket_listen_async(ioc, addr);
     qio_task_run_in_thread(task,
                            qio_channel_socket_listen_worker,
                            addrCopy,
-                           (GDestroyNotify)qapi_free_SocketAddressLegacy);
+                           (GDestroyNotify)qapi_free_SocketAddress);
 }
 
 
 int qio_channel_socket_dgram_sync(QIOChannelSocket *ioc,
-                                  SocketAddressLegacy *localAddr,
-                                  SocketAddressLegacy *remoteAddr,
+                                  SocketAddress *localAddr,
+                                  SocketAddress *remoteAddr,
                                   Error **errp)
 {
     int fd;
@@ -274,16 +274,16 @@ int qio_channel_socket_dgram_sync(QIOChannelSocket *ioc,
 
 
 struct QIOChannelSocketDGramWorkerData {
-    SocketAddressLegacy *localAddr;
-    SocketAddressLegacy *remoteAddr;
+    SocketAddress *localAddr;
+    SocketAddress *remoteAddr;
 };
 
 
 static void qio_channel_socket_dgram_worker_free(gpointer opaque)
 {
     struct QIOChannelSocketDGramWorkerData *data = opaque;
-    qapi_free_SocketAddressLegacy(data->localAddr);
-    qapi_free_SocketAddressLegacy(data->remoteAddr);
+    qapi_free_SocketAddress(data->localAddr);
+    qapi_free_SocketAddress(data->remoteAddr);
     g_free(data);
 }
 
@@ -303,8 +303,8 @@ static void qio_channel_socket_dgram_worker(QIOTask *task,
 
 
 void qio_channel_socket_dgram_async(QIOChannelSocket *ioc,
-                                    SocketAddressLegacy *localAddr,
-                                    SocketAddressLegacy *remoteAddr,
+                                    SocketAddress *localAddr,
+                                    SocketAddress *remoteAddr,
                                     QIOTaskFunc callback,
                                     gpointer opaque,
                                     GDestroyNotify destroy)
@@ -314,8 +314,8 @@ void qio_channel_socket_dgram_async(QIOChannelSocket *ioc,
     struct QIOChannelSocketDGramWorkerData *data = g_new0(
         struct QIOChannelSocketDGramWorkerData, 1);
 
-    data->localAddr = QAPI_CLONE(SocketAddressLegacy, localAddr);
-    data->remoteAddr = QAPI_CLONE(SocketAddressLegacy, remoteAddr);
+    data->localAddr = QAPI_CLONE(SocketAddress, localAddr);
+    data->remoteAddr = QAPI_CLONE(SocketAddress, remoteAddr);
 
     trace_qio_channel_socket_dgram_async(ioc, localAddr, remoteAddr);
     qio_task_run_in_thread(task,
diff --git a/io/dns-resolver.c b/io/dns-resolver.c
index d3f0cbf..57a8896 100644
--- a/io/dns-resolver.c
+++ b/io/dns-resolver.c
@@ -45,13 +45,13 @@ QIODNSResolver *qio_dns_resolver_get_instance(void)
 }
 
 static int qio_dns_resolver_lookup_sync_inet(QIODNSResolver *resolver,
-                                             SocketAddressLegacy *addr,
+                                             SocketAddress *addr,
                                              size_t *naddrs,
-                                             SocketAddressLegacy ***addrs,
+                                             SocketAddress ***addrs,
                                              Error **errp)
 {
     struct addrinfo ai, *res, *e;
-    InetSocketAddress *iaddr = addr->u.inet.data;
+    InetSocketAddress *iaddr = &addr->u.inet;
     char port[33];
     char uaddr[INET6_ADDRSTRLEN + 1];
     char uport[33];
@@ -97,20 +97,19 @@ static int qio_dns_resolver_lookup_sync_inet(QIODNSResolver *resolver,
         (*naddrs)++;
     }
 
-    *addrs = g_new0(SocketAddressLegacy *, *naddrs);
+    *addrs = g_new0(SocketAddress *, *naddrs);
 
     /* create socket + bind */
     for (i = 0, e = res; e != NULL; i++, e = e->ai_next) {
-        SocketAddressLegacy *newaddr = g_new0(SocketAddressLegacy, 1);
-        InetSocketAddress *newiaddr = g_new0(InetSocketAddress, 1);
-        newaddr->u.inet.data = newiaddr;
-        newaddr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
+        SocketAddress *newaddr = g_new0(SocketAddress, 1);
+
+        newaddr->type = SOCKET_ADDRESS_TYPE_INET;
 
         getnameinfo((struct sockaddr *)e->ai_addr, e->ai_addrlen,
                     uaddr, INET6_ADDRSTRLEN, uport, 32,
                     NI_NUMERICHOST | NI_NUMERICSERV);
 
-        *newiaddr = (InetSocketAddress){
+        newaddr->u.inet = (InetSocketAddress){
             .host = g_strdup(uaddr),
             .port = g_strdup(uport),
             .has_numeric = true,
@@ -129,36 +128,36 @@ static int qio_dns_resolver_lookup_sync_inet(QIODNSResolver *resolver,
 
 
 static int qio_dns_resolver_lookup_sync_nop(QIODNSResolver *resolver,
-                                            SocketAddressLegacy *addr,
+                                            SocketAddress *addr,
                                             size_t *naddrs,
-                                            SocketAddressLegacy ***addrs,
+                                            SocketAddress ***addrs,
                                             Error **errp)
 {
     *naddrs = 1;
-    *addrs = g_new0(SocketAddressLegacy *, 1);
-    (*addrs)[0] = QAPI_CLONE(SocketAddressLegacy, addr);
+    *addrs = g_new0(SocketAddress *, 1);
+    (*addrs)[0] = QAPI_CLONE(SocketAddress, addr);
 
     return 0;
 }
 
 
 int qio_dns_resolver_lookup_sync(QIODNSResolver *resolver,
-                                 SocketAddressLegacy *addr,
+                                 SocketAddress *addr,
                                  size_t *naddrs,
-                                 SocketAddressLegacy ***addrs,
+                                 SocketAddress ***addrs,
                                  Error **errp)
 {
     switch (addr->type) {
-    case SOCKET_ADDRESS_LEGACY_KIND_INET:
+    case SOCKET_ADDRESS_TYPE_INET:
         return qio_dns_resolver_lookup_sync_inet(resolver,
                                                  addr,
                                                  naddrs,
                                                  addrs,
                                                  errp);
 
-    case SOCKET_ADDRESS_LEGACY_KIND_UNIX:
-    case SOCKET_ADDRESS_LEGACY_KIND_VSOCK:
-    case SOCKET_ADDRESS_LEGACY_KIND_FD:
+    case SOCKET_ADDRESS_TYPE_UNIX:
+    case SOCKET_ADDRESS_TYPE_VSOCK:
+    case SOCKET_ADDRESS_TYPE_FD:
         return qio_dns_resolver_lookup_sync_nop(resolver,
                                                 addr,
                                                 naddrs,
@@ -172,8 +171,8 @@ int qio_dns_resolver_lookup_sync(QIODNSResolver *resolver,
 
 
 struct QIODNSResolverLookupData {
-    SocketAddressLegacy *addr;
-    SocketAddressLegacy **addrs;
+    SocketAddress *addr;
+    SocketAddress **addrs;
     size_t naddrs;
 };
 
@@ -183,9 +182,9 @@ static void qio_dns_resolver_lookup_data_free(gpointer opaque)
     struct QIODNSResolverLookupData *data = opaque;
     size_t i;
 
-    qapi_free_SocketAddressLegacy(data->addr);
+    qapi_free_SocketAddress(data->addr);
     for (i = 0; i < data->naddrs; i++) {
-        qapi_free_SocketAddressLegacy(data->addrs[i]);
+        qapi_free_SocketAddress(data->addrs[i]);
     }
 
     g_free(data->addrs);
@@ -216,7 +215,7 @@ static void qio_dns_resolver_lookup_worker(QIOTask *task,
 
 
 void qio_dns_resolver_lookup_async(QIODNSResolver *resolver,
-                                   SocketAddressLegacy *addr,
+                                   SocketAddress *addr,
                                    QIOTaskFunc func,
                                    gpointer opaque,
                                    GDestroyNotify notify)
@@ -225,7 +224,7 @@ void qio_dns_resolver_lookup_async(QIODNSResolver *resolver,
     struct QIODNSResolverLookupData *data =
         g_new0(struct QIODNSResolverLookupData, 1);
 
-    data->addr = QAPI_CLONE(SocketAddressLegacy, addr);
+    data->addr = QAPI_CLONE(SocketAddress, addr);
 
     task = qio_task_new(OBJECT(resolver), func, opaque, notify);
 
@@ -239,7 +238,7 @@ void qio_dns_resolver_lookup_async(QIODNSResolver *resolver,
 void qio_dns_resolver_lookup_result(QIODNSResolver *resolver,
                                     QIOTask *task,
                                     size_t *naddrs,
-                                    SocketAddressLegacy ***addrs)
+                                    SocketAddress ***addrs)
 {
     struct QIODNSResolverLookupData *data =
         qio_task_get_result_pointer(task);
@@ -252,9 +251,9 @@ void qio_dns_resolver_lookup_result(QIODNSResolver *resolver,
     }
 
     *naddrs = data->naddrs;
-    *addrs = g_new0(SocketAddressLegacy *, data->naddrs);
+    *addrs = g_new0(SocketAddress *, data->naddrs);
     for (i = 0; i < data->naddrs; i++) {
-        (*addrs)[i] = QAPI_CLONE(SocketAddressLegacy, data->addrs[i]);
+        (*addrs)[i] = QAPI_CLONE(SocketAddress, data->addrs[i]);
     }
 }
 
diff --git a/migration/socket.c b/migration/socket.c
index c556b63..2c2573f 100644
--- a/migration/socket.c
+++ b/migration/socket.c
@@ -25,32 +25,29 @@
 #include "trace.h"
 
 
-static SocketAddressLegacy *tcp_build_address(const char *host_port, Error **errp)
+static SocketAddress *tcp_build_address(const char *host_port, Error **errp)
 {
-    InetSocketAddress *iaddr = g_new(InetSocketAddress, 1);
-    SocketAddressLegacy *saddr;
+    SocketAddress *saddr;
 
-    if (inet_parse(iaddr, host_port, errp)) {
-        qapi_free_InetSocketAddress(iaddr);
+    saddr = g_new0(SocketAddress, 1);
+    saddr->type = SOCKET_ADDRESS_TYPE_INET;
+
+    if (inet_parse(&saddr->u.inet, host_port, errp)) {
+        qapi_free_SocketAddress(saddr);
         return NULL;
     }
 
-    saddr = g_new0(SocketAddressLegacy, 1);
-    saddr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
-    saddr->u.inet.data = iaddr;
-
     return saddr;
 }
 
 
-static SocketAddressLegacy *unix_build_address(const char *path)
+static SocketAddress *unix_build_address(const char *path)
 {
-    SocketAddressLegacy *saddr;
+    SocketAddress *saddr;
 
-    saddr = g_new0(SocketAddressLegacy, 1);
-    saddr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
-    saddr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
-    saddr->u.q_unix.data->path = g_strdup(path);
+    saddr = g_new0(SocketAddress, 1);
+    saddr->type = SOCKET_ADDRESS_TYPE_UNIX;
+    saddr->u.q_unix.path = g_strdup(path);
 
     return saddr;
 }
@@ -91,15 +88,15 @@ static void socket_outgoing_migration(QIOTask *task,
 }
 
 static void socket_start_outgoing_migration(MigrationState *s,
-                                            SocketAddressLegacy *saddr,
+                                            SocketAddress *saddr,
                                             Error **errp)
 {
     QIOChannelSocket *sioc = qio_channel_socket_new();
     struct SocketConnectData *data = g_new0(struct SocketConnectData, 1);
 
     data->s = s;
-    if (saddr->type == SOCKET_ADDRESS_LEGACY_KIND_INET) {
-        data->hostname = g_strdup(saddr->u.inet.data->host);
+    if (saddr->type == SOCKET_ADDRESS_TYPE_INET) {
+        data->hostname = g_strdup(saddr->u.inet.host);
     }
 
     qio_channel_set_name(QIO_CHANNEL(sioc), "migration-socket-outgoing");
@@ -108,7 +105,7 @@ static void socket_start_outgoing_migration(MigrationState *s,
                                      socket_outgoing_migration,
                                      data,
                                      socket_connect_data_free);
-    qapi_free_SocketAddressLegacy(saddr);
+    qapi_free_SocketAddress(saddr);
 }
 
 void tcp_start_outgoing_migration(MigrationState *s,
@@ -116,7 +113,7 @@ void tcp_start_outgoing_migration(MigrationState *s,
                                   Error **errp)
 {
     Error *err = NULL;
-    SocketAddressLegacy *saddr = tcp_build_address(host_port, &err);
+    SocketAddress *saddr = tcp_build_address(host_port, &err);
     if (!err) {
         socket_start_outgoing_migration(s, saddr, &err);
     }
@@ -127,7 +124,7 @@ void unix_start_outgoing_migration(MigrationState *s,
                                    const char *path,
                                    Error **errp)
 {
-    SocketAddressLegacy *saddr = unix_build_address(path);
+    SocketAddress *saddr = unix_build_address(path);
     socket_start_outgoing_migration(s, saddr, errp);
 }
 
@@ -161,7 +158,7 @@ out:
 }
 
 
-static void socket_start_incoming_migration(SocketAddressLegacy *saddr,
+static void socket_start_incoming_migration(SocketAddress *saddr,
                                             Error **errp)
 {
     QIOChannelSocket *listen_ioc = qio_channel_socket_new();
@@ -171,7 +168,7 @@ static void socket_start_incoming_migration(SocketAddressLegacy *saddr,
 
     if (qio_channel_socket_listen_sync(listen_ioc, saddr, errp) < 0) {
         object_unref(OBJECT(listen_ioc));
-        qapi_free_SocketAddressLegacy(saddr);
+        qapi_free_SocketAddress(saddr);
         return;
     }
 
@@ -180,13 +177,13 @@ static void socket_start_incoming_migration(SocketAddressLegacy *saddr,
                           socket_accept_incoming_migration,
                           listen_ioc,
                           (GDestroyNotify)object_unref);
-    qapi_free_SocketAddressLegacy(saddr);
+    qapi_free_SocketAddress(saddr);
 }
 
 void tcp_start_incoming_migration(const char *host_port, Error **errp)
 {
     Error *err = NULL;
-    SocketAddressLegacy *saddr = tcp_build_address(host_port, &err);
+    SocketAddress *saddr = tcp_build_address(host_port, &err);
     if (!err) {
         socket_start_incoming_migration(saddr, &err);
     }
@@ -195,6 +192,6 @@ void tcp_start_incoming_migration(const char *host_port, Error **errp)
 
 void unix_start_incoming_migration(const char *path, Error **errp)
 {
-    SocketAddressLegacy *saddr = unix_build_address(path);
+    SocketAddress *saddr = unix_build_address(path);
     socket_start_incoming_migration(saddr, errp);
 }
diff --git a/net/socket.c b/net/socket.c
index ecd165f..b8c931e 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -489,7 +489,7 @@ static int net_socket_listen_init(NetClientState *peer,
 {
     NetClientState *nc;
     NetSocketState *s;
-    SocketAddressLegacy *saddr;
+    SocketAddress *saddr;
     int ret;
     Error *local_error = NULL;
 
@@ -501,7 +501,7 @@ static int net_socket_listen_init(NetClientState *peer,
 
     ret = socket_listen(saddr, &local_error);
     if (ret < 0) {
-        qapi_free_SocketAddressLegacy(saddr);
+        qapi_free_SocketAddress(saddr);
         error_report_err(local_error);
         return -1;
     }
@@ -514,20 +514,20 @@ static int net_socket_listen_init(NetClientState *peer,
     net_socket_rs_init(&s->rs, net_socket_rs_finalize);
 
     qemu_set_fd_handler(s->listen_fd, net_socket_accept, NULL, s);
-    qapi_free_SocketAddressLegacy(saddr);
+    qapi_free_SocketAddress(saddr);
     return 0;
 }
 
 typedef struct {
     NetClientState *peer;
-    SocketAddressLegacy *saddr;
+    SocketAddress *saddr;
     char *model;
     char *name;
 } socket_connect_data;
 
 static void socket_connect_data_free(socket_connect_data *c)
 {
-    qapi_free_SocketAddressLegacy(c->saddr);
+    qapi_free_SocketAddress(c->saddr);
     g_free(c->model);
     g_free(c->name);
     g_free(c);
diff --git a/qapi-schema.json b/qapi-schema.json
index a741fdd..1009101 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -4126,7 +4126,12 @@
 #
 # Captures the address of a socket, which could also be a named file descriptor
 #
-# Note: This type is deprecated in favor of SocketAddress.
+# Note: This type is deprecated in favor of SocketAddress.  The
+# difference to SocketAddress is that SocketAddress is a flat union
+# rather than a simple union.  Flat is nicer because it avoids nesting
+# on the wire, i.e. this form has fewer {}.
+#
+
 #
 # Since: 1.3
 ##
@@ -4154,14 +4159,11 @@
 ##
 # @SocketAddress:
 #
-# Captures the address of a socket
+# Captures the address of a socket, which could also be a named file
+# descriptor
 #
 # @type:       Transport type
 #
-# This is just like SocketAddressLegacy, except it's a flat union rather
-# than a simple union.  Nicer because it avoids nesting on the wire,
-# i.e. this form has fewer {}.
-#
 # Since: 2.9
 ##
 { 'union': 'SocketAddress',
diff --git a/qemu-nbd.c b/qemu-nbd.c
index c60a4a8..4d8b53d 100644
--- a/qemu-nbd.c
+++ b/qemu-nbd.c
@@ -57,7 +57,7 @@ static NBDExport *exp;
 static bool newproto;
 static int verbose;
 static char *srcpath;
-static SocketAddressLegacy *saddr;
+static SocketAddress *saddr;
 static int persistent = 0;
 static enum { RUNNING, TERMINATE, TERMINATING, TERMINATED } state;
 static int shared = 1;
@@ -387,21 +387,20 @@ static void nbd_update_server_watch(void)
 }
 
 
-static SocketAddressLegacy *nbd_build_socket_address(const char *sockpath,
+static SocketAddress *nbd_build_socket_address(const char *sockpath,
                                                const char *bindto,
                                                const char *port)
 {
-    SocketAddressLegacy *saddr;
+    SocketAddress *saddr;
 
-    saddr = g_new0(SocketAddressLegacy, 1);
+    saddr = g_new0(SocketAddress, 1);
     if (sockpath) {
-        saddr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
-        saddr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
-        saddr->u.q_unix.data->path = g_strdup(sockpath);
+        saddr->type = SOCKET_ADDRESS_TYPE_UNIX;
+        saddr->u.q_unix.path = g_strdup(sockpath);
     } else {
         InetSocketAddress *inet;
-        saddr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
-        inet = saddr->u.inet.data = g_new0(InetSocketAddress, 1);
+        saddr->type = SOCKET_ADDRESS_TYPE_INET;
+        inet = &saddr->u.inet;
         inet->host = g_strdup(bindto);
         if (port) {
             inet->port = g_strdup(port);
diff --git a/qga/channel-posix.c b/qga/channel-posix.c
index 65ab8eb..3f34465 100644
--- a/qga/channel-posix.c
+++ b/qga/channel-posix.c
@@ -203,7 +203,7 @@ static gboolean ga_channel_open(GAChannel *c, const gchar *path,
     case GA_CHANNEL_VSOCK_LISTEN: {
         if (fd < 0) {
             Error *local_err = NULL;
-            SocketAddressLegacy *addr;
+            SocketAddress *addr;
             char *addr_str;
 
             addr_str = g_strdup_printf("vsock:%s", path);
@@ -216,7 +216,7 @@ static gboolean ga_channel_open(GAChannel *c, const gchar *path,
             }
 
             fd = socket_listen(addr, &local_err);
-            qapi_free_SocketAddressLegacy(addr);
+            qapi_free_SocketAddress(addr);
             if (local_err != NULL) {
                 g_critical("%s", error_get_pretty(local_err));
                 error_free(local_err);
diff --git a/qga/main.c b/qga/main.c
index b9105af..ceb9640 100644
--- a/qga/main.c
+++ b/qga/main.c
@@ -1356,7 +1356,7 @@ int main(int argc, char **argv)
         goto end;
     }
     if (socket_activation) {
-        SocketAddressLegacy *addr;
+        SocketAddress *addr;
 
         g_free(config->method);
         g_free(config->channel_path);
@@ -1365,13 +1365,13 @@ int main(int argc, char **argv)
 
         addr = socket_local_address(FIRST_SOCKET_ACTIVATION_FD, NULL);
         if (addr) {
-            if (addr->type == SOCKET_ADDRESS_LEGACY_KIND_UNIX) {
+            if (addr->type == SOCKET_ADDRESS_TYPE_UNIX) {
                 config->method = g_strdup("unix-listen");
-            } else if (addr->type == SOCKET_ADDRESS_LEGACY_KIND_VSOCK) {
+            } else if (addr->type == SOCKET_ADDRESS_TYPE_VSOCK) {
                 config->method = g_strdup("vsock-listen");
             }
 
-            qapi_free_SocketAddressLegacy(addr);
+            qapi_free_SocketAddress(addr);
         }
 
         if (!config->method) {
diff --git a/tests/test-io-channel-socket.c b/tests/test-io-channel-socket.c
index a66ffc2..d357cd2 100644
--- a/tests/test-io-channel-socket.c
+++ b/tests/test-io-channel-socket.c
@@ -115,8 +115,8 @@ static void test_io_channel_set_socket_bufs(QIOChannel *src,
 }
 
 
-static void test_io_channel_setup_sync(SocketAddressLegacy *listen_addr,
-                                       SocketAddressLegacy *connect_addr,
+static void test_io_channel_setup_sync(SocketAddress *listen_addr,
+                                       SocketAddress *connect_addr,
                                        QIOChannel **src,
                                        QIOChannel **dst)
 {
@@ -125,14 +125,14 @@ static void test_io_channel_setup_sync(SocketAddressLegacy *listen_addr,
     lioc = qio_channel_socket_new();
     qio_channel_socket_listen_sync(lioc, listen_addr, &error_abort);
 
-    if (listen_addr->type == SOCKET_ADDRESS_LEGACY_KIND_INET) {
-        SocketAddressLegacy *laddr = qio_channel_socket_get_local_address(
+    if (listen_addr->type == SOCKET_ADDRESS_TYPE_INET) {
+        SocketAddress *laddr = qio_channel_socket_get_local_address(
             lioc, &error_abort);
 
-        g_free(connect_addr->u.inet.data->port);
-        connect_addr->u.inet.data->port = g_strdup(laddr->u.inet.data->port);
+        g_free(connect_addr->u.inet.port);
+        connect_addr->u.inet.port = g_strdup(laddr->u.inet.port);
 
-        qapi_free_SocketAddressLegacy(laddr);
+        qapi_free_SocketAddress(laddr);
     }
 
     *src = QIO_CHANNEL(qio_channel_socket_new());
@@ -165,8 +165,8 @@ static void test_io_channel_complete(QIOTask *task,
 }
 
 
-static void test_io_channel_setup_async(SocketAddressLegacy *listen_addr,
-                                        SocketAddressLegacy *connect_addr,
+static void test_io_channel_setup_async(SocketAddress *listen_addr,
+                                        SocketAddress *connect_addr,
                                         QIOChannel **src,
                                         QIOChannel **dst)
 {
@@ -186,14 +186,14 @@ static void test_io_channel_setup_async(SocketAddressLegacy *listen_addr,
 
     g_assert(!data.err);
 
-    if (listen_addr->type == SOCKET_ADDRESS_LEGACY_KIND_INET) {
-        SocketAddressLegacy *laddr = qio_channel_socket_get_local_address(
+    if (listen_addr->type == SOCKET_ADDRESS_TYPE_INET) {
+        SocketAddress *laddr = qio_channel_socket_get_local_address(
             lioc, &error_abort);
 
-        g_free(connect_addr->u.inet.data->port);
-        connect_addr->u.inet.data->port = g_strdup(laddr->u.inet.data->port);
+        g_free(connect_addr->u.inet.port);
+        connect_addr->u.inet.port = g_strdup(laddr->u.inet.port);
 
-        qapi_free_SocketAddressLegacy(laddr);
+        qapi_free_SocketAddress(laddr);
     }
 
     *src = QIO_CHANNEL(qio_channel_socket_new());
@@ -221,8 +221,8 @@ static void test_io_channel_setup_async(SocketAddressLegacy *listen_addr,
 
 
 static void test_io_channel(bool async,
-                            SocketAddressLegacy *listen_addr,
-                            SocketAddressLegacy *connect_addr,
+                            SocketAddress *listen_addr,
+                            SocketAddress *connect_addr,
                             bool passFD)
 {
     QIOChannel *src, *dst;
@@ -297,27 +297,25 @@ static void test_io_channel(bool async,
 
 static void test_io_channel_ipv4(bool async)
 {
-    SocketAddressLegacy *listen_addr = g_new0(SocketAddressLegacy, 1);
-    SocketAddressLegacy *connect_addr = g_new0(SocketAddressLegacy, 1);
+    SocketAddress *listen_addr = g_new0(SocketAddress, 1);
+    SocketAddress *connect_addr = g_new0(SocketAddress, 1);
 
-    listen_addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
-    listen_addr->u.inet.data = g_new(InetSocketAddress, 1);
-    *listen_addr->u.inet.data = (InetSocketAddress) {
+    listen_addr->type = SOCKET_ADDRESS_TYPE_INET;
+    listen_addr->u.inet = (InetSocketAddress) {
         .host = g_strdup("127.0.0.1"),
         .port = NULL, /* Auto-select */
     };
 
-    connect_addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
-    connect_addr->u.inet.data = g_new(InetSocketAddress, 1);
-    *connect_addr->u.inet.data = (InetSocketAddress) {
+    connect_addr->type = SOCKET_ADDRESS_TYPE_INET;
+    connect_addr->u.inet = (InetSocketAddress) {
         .host = g_strdup("127.0.0.1"),
         .port = NULL, /* Filled in later */
     };
 
     test_io_channel(async, listen_addr, connect_addr, false);
 
-    qapi_free_SocketAddressLegacy(listen_addr);
-    qapi_free_SocketAddressLegacy(connect_addr);
+    qapi_free_SocketAddress(listen_addr);
+    qapi_free_SocketAddress(connect_addr);
 }
 
 
@@ -335,27 +333,25 @@ static void test_io_channel_ipv4_async(void)
 
 static void test_io_channel_ipv6(bool async)
 {
-    SocketAddressLegacy *listen_addr = g_new0(SocketAddressLegacy, 1);
-    SocketAddressLegacy *connect_addr = g_new0(SocketAddressLegacy, 1);
+    SocketAddress *listen_addr = g_new0(SocketAddress, 1);
+    SocketAddress *connect_addr = g_new0(SocketAddress, 1);
 
-    listen_addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
-    listen_addr->u.inet.data = g_new(InetSocketAddress, 1);
-    *listen_addr->u.inet.data = (InetSocketAddress) {
+    listen_addr->type = SOCKET_ADDRESS_TYPE_INET;
+    listen_addr->u.inet = (InetSocketAddress) {
         .host = g_strdup("::1"),
         .port = NULL, /* Auto-select */
     };
 
-    connect_addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
-    connect_addr->u.inet.data = g_new(InetSocketAddress, 1);
-    *connect_addr->u.inet.data = (InetSocketAddress) {
+    connect_addr->type = SOCKET_ADDRESS_TYPE_INET;
+    connect_addr->u.inet = (InetSocketAddress) {
         .host = g_strdup("::1"),
         .port = NULL, /* Filled in later */
     };
 
     test_io_channel(async, listen_addr, connect_addr, false);
 
-    qapi_free_SocketAddressLegacy(listen_addr);
-    qapi_free_SocketAddressLegacy(connect_addr);
+    qapi_free_SocketAddress(listen_addr);
+    qapi_free_SocketAddress(connect_addr);
 }
 
 
@@ -374,22 +370,20 @@ static void test_io_channel_ipv6_async(void)
 #ifndef _WIN32
 static void test_io_channel_unix(bool async)
 {
-    SocketAddressLegacy *listen_addr = g_new0(SocketAddressLegacy, 1);
-    SocketAddressLegacy *connect_addr = g_new0(SocketAddressLegacy, 1);
+    SocketAddress *listen_addr = g_new0(SocketAddress, 1);
+    SocketAddress *connect_addr = g_new0(SocketAddress, 1);
 
 #define TEST_SOCKET "test-io-channel-socket.sock"
-    listen_addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
-    listen_addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
-    listen_addr->u.q_unix.data->path = g_strdup(TEST_SOCKET);
+    listen_addr->type = SOCKET_ADDRESS_TYPE_UNIX;
+    listen_addr->u.q_unix.path = g_strdup(TEST_SOCKET);
 
-    connect_addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
-    connect_addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
-    connect_addr->u.q_unix.data->path = g_strdup(TEST_SOCKET);
+    connect_addr->type = SOCKET_ADDRESS_TYPE_UNIX;
+    connect_addr->u.q_unix.path = g_strdup(TEST_SOCKET);
 
     test_io_channel(async, listen_addr, connect_addr, true);
 
-    qapi_free_SocketAddressLegacy(listen_addr);
-    qapi_free_SocketAddressLegacy(connect_addr);
+    qapi_free_SocketAddress(listen_addr);
+    qapi_free_SocketAddress(connect_addr);
     g_assert(g_file_test(TEST_SOCKET, G_FILE_TEST_EXISTS) == FALSE);
 }
 
@@ -407,8 +401,8 @@ static void test_io_channel_unix_async(void)
 
 static void test_io_channel_unix_fd_pass(void)
 {
-    SocketAddressLegacy *listen_addr = g_new0(SocketAddressLegacy, 1);
-    SocketAddressLegacy *connect_addr = g_new0(SocketAddressLegacy, 1);
+    SocketAddress *listen_addr = g_new0(SocketAddress, 1);
+    SocketAddress *connect_addr = g_new0(SocketAddress, 1);
     QIOChannel *src, *dst;
     int testfd;
     int fdsend[3];
@@ -427,13 +421,11 @@ static void test_io_channel_unix_fd_pass(void)
     fdsend[1] = testfd;
     fdsend[2] = testfd;
 
-    listen_addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
-    listen_addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
-    listen_addr->u.q_unix.data->path = g_strdup(TEST_SOCKET);
+    listen_addr->type = SOCKET_ADDRESS_TYPE_UNIX;
+    listen_addr->u.q_unix.path = g_strdup(TEST_SOCKET);
 
-    connect_addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
-    connect_addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
-    connect_addr->u.q_unix.data->path = g_strdup(TEST_SOCKET);
+    connect_addr->type = SOCKET_ADDRESS_TYPE_UNIX;
+    connect_addr->u.q_unix.path = g_strdup(TEST_SOCKET);
 
     test_io_channel_setup_sync(listen_addr, connect_addr, &src, &dst);
 
@@ -488,8 +480,8 @@ static void test_io_channel_unix_fd_pass(void)
 
     object_unref(OBJECT(src));
     object_unref(OBJECT(dst));
-    qapi_free_SocketAddressLegacy(listen_addr);
-    qapi_free_SocketAddressLegacy(connect_addr);
+    qapi_free_SocketAddress(listen_addr);
+    qapi_free_SocketAddress(connect_addr);
     unlink(TEST_SOCKET);
     unlink(TEST_FILE);
     close(testfd);
diff --git a/ui/vnc-auth-sasl.c b/ui/vnc-auth-sasl.c
index c7fa9b6..3ade4a4 100644
--- a/ui/vnc-auth-sasl.c
+++ b/ui/vnc-auth-sasl.c
@@ -498,7 +498,7 @@ vnc_socket_ip_addr_string(QIOChannelSocket *ioc,
                           bool local,
                           Error **errp)
 {
-    SocketAddressLegacy *addr;
+    SocketAddress *addr;
     char *ret;
 
     if (local) {
@@ -510,13 +510,12 @@ vnc_socket_ip_addr_string(QIOChannelSocket *ioc,
         return NULL;
     }
 
-    if (addr->type != SOCKET_ADDRESS_LEGACY_KIND_INET) {
+    if (addr->type != SOCKET_ADDRESS_TYPE_INET) {
         error_setg(errp, "Not an inet socket type");
         return NULL;
     }
-    ret = g_strdup_printf("%s;%s", addr->u.inet.data->host,
-                          addr->u.inet.data->port);
-    qapi_free_SocketAddressLegacy(addr);
+    ret = g_strdup_printf("%s;%s", addr->u.inet.host, addr->u.inet.port);
+    qapi_free_SocketAddress(addr);
     return ret;
 }
 
diff --git a/ui/vnc.c b/ui/vnc.c
index 5090a25..9c4edcd 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -108,31 +108,31 @@ static void vnc_set_share_mode(VncState *vs, VncShareMode mode)
 }
 
 
-static void vnc_init_basic_info(SocketAddressLegacy *addr,
+static void vnc_init_basic_info(SocketAddress *addr,
                                 VncBasicInfo *info,
                                 Error **errp)
 {
     switch (addr->type) {
-    case SOCKET_ADDRESS_LEGACY_KIND_INET:
-        info->host = g_strdup(addr->u.inet.data->host);
-        info->service = g_strdup(addr->u.inet.data->port);
-        if (addr->u.inet.data->ipv6) {
+    case SOCKET_ADDRESS_TYPE_INET:
+        info->host = g_strdup(addr->u.inet.host);
+        info->service = g_strdup(addr->u.inet.port);
+        if (addr->u.inet.ipv6) {
             info->family = NETWORK_ADDRESS_FAMILY_IPV6;
         } else {
             info->family = NETWORK_ADDRESS_FAMILY_IPV4;
         }
         break;
 
-    case SOCKET_ADDRESS_LEGACY_KIND_UNIX:
+    case SOCKET_ADDRESS_TYPE_UNIX:
         info->host = g_strdup("");
-        info->service = g_strdup(addr->u.q_unix.data->path);
+        info->service = g_strdup(addr->u.q_unix.path);
         info->family = NETWORK_ADDRESS_FAMILY_UNIX;
         break;
 
-    case SOCKET_ADDRESS_LEGACY_KIND_VSOCK:
-    case SOCKET_ADDRESS_LEGACY_KIND_FD:
+    case SOCKET_ADDRESS_TYPE_VSOCK:
+    case SOCKET_ADDRESS_TYPE_FD:
         error_setg(errp, "Unsupported socket address type %s",
-                   SocketAddressLegacyKind_lookup[addr->type]);
+                   SocketAddressType_lookup[addr->type]);
         break;
     default:
         abort();
@@ -145,7 +145,7 @@ static void vnc_init_basic_info_from_server_addr(QIOChannelSocket *ioc,
                                                  VncBasicInfo *info,
                                                  Error **errp)
 {
-    SocketAddressLegacy *addr = NULL;
+    SocketAddress *addr = NULL;
 
     if (!ioc) {
         error_setg(errp, "No listener socket available");
@@ -158,14 +158,14 @@ static void vnc_init_basic_info_from_server_addr(QIOChannelSocket *ioc,
     }
 
     vnc_init_basic_info(addr, info, errp);
-    qapi_free_SocketAddressLegacy(addr);
+    qapi_free_SocketAddress(addr);
 }
 
 static void vnc_init_basic_info_from_remote_addr(QIOChannelSocket *ioc,
                                                  VncBasicInfo *info,
                                                  Error **errp)
 {
-    SocketAddressLegacy *addr = NULL;
+    SocketAddress *addr = NULL;
 
     addr = qio_channel_socket_get_remote_address(ioc, errp);
     if (!addr) {
@@ -173,7 +173,7 @@ static void vnc_init_basic_info_from_remote_addr(QIOChannelSocket *ioc,
     }
 
     vnc_init_basic_info(addr, info, errp);
-    qapi_free_SocketAddressLegacy(addr);
+    qapi_free_SocketAddress(addr);
 }
 
 static const char *vnc_auth_name(VncDisplay *vd) {
@@ -377,7 +377,7 @@ VncInfo *qmp_query_vnc(Error **errp)
 {
     VncInfo *info = g_malloc0(sizeof(*info));
     VncDisplay *vd = vnc_display_find(NULL);
-    SocketAddressLegacy *addr = NULL;
+    SocketAddress *addr = NULL;
 
     if (vd == NULL || !vd->nlsock) {
         info->enabled = false;
@@ -398,26 +398,26 @@ VncInfo *qmp_query_vnc(Error **errp)
         }
 
         switch (addr->type) {
-        case SOCKET_ADDRESS_LEGACY_KIND_INET:
-            info->host = g_strdup(addr->u.inet.data->host);
-            info->service = g_strdup(addr->u.inet.data->port);
-            if (addr->u.inet.data->ipv6) {
+        case SOCKET_ADDRESS_TYPE_INET:
+            info->host = g_strdup(addr->u.inet.host);
+            info->service = g_strdup(addr->u.inet.port);
+            if (addr->u.inet.ipv6) {
                 info->family = NETWORK_ADDRESS_FAMILY_IPV6;
             } else {
                 info->family = NETWORK_ADDRESS_FAMILY_IPV4;
             }
             break;
 
-        case SOCKET_ADDRESS_LEGACY_KIND_UNIX:
+        case SOCKET_ADDRESS_TYPE_UNIX:
             info->host = g_strdup("");
-            info->service = g_strdup(addr->u.q_unix.data->path);
+            info->service = g_strdup(addr->u.q_unix.path);
             info->family = NETWORK_ADDRESS_FAMILY_UNIX;
             break;
 
-        case SOCKET_ADDRESS_LEGACY_KIND_VSOCK:
-        case SOCKET_ADDRESS_LEGACY_KIND_FD:
+        case SOCKET_ADDRESS_TYPE_VSOCK:
+        case SOCKET_ADDRESS_TYPE_FD:
             error_setg(errp, "Unsupported socket address type %s",
-                       SocketAddressLegacyKind_lookup[addr->type]);
+                       SocketAddressType_lookup[addr->type]);
             goto out_error;
         default:
             abort();
@@ -431,11 +431,11 @@ VncInfo *qmp_query_vnc(Error **errp)
         info->auth = g_strdup(vnc_auth_name(vd));
     }
 
-    qapi_free_SocketAddressLegacy(addr);
+    qapi_free_SocketAddress(addr);
     return info;
 
 out_error:
-    qapi_free_SocketAddressLegacy(addr);
+    qapi_free_SocketAddress(addr);
     qapi_free_VncInfo(info);
     return NULL;
 }
@@ -455,7 +455,7 @@ static VncServerInfo2List *qmp_query_server_entry(QIOChannelSocket *ioc,
     VncServerInfo2List *list;
     VncServerInfo2 *info;
     Error *err = NULL;
-    SocketAddressLegacy *addr;
+    SocketAddress *addr;
 
     addr = qio_channel_socket_get_local_address(ioc, &err);
     if (!addr) {
@@ -465,7 +465,7 @@ static VncServerInfo2List *qmp_query_server_entry(QIOChannelSocket *ioc,
 
     info = g_new0(VncServerInfo2, 1);
     vnc_init_basic_info(addr, qapi_VncServerInfo2_base(info), &err);
-    qapi_free_SocketAddressLegacy(addr);
+    qapi_free_SocketAddress(addr);
     if (err) {
         qapi_free_VncServerInfo2(info);
         error_free(err);
@@ -3149,7 +3149,7 @@ int vnc_display_pw_expire(const char *id, time_t expires)
 
 static void vnc_display_print_local_addr(VncDisplay *vd)
 {
-    SocketAddressLegacy *addr;
+    SocketAddress *addr;
     Error *err = NULL;
 
     if (!vd->nlsock) {
@@ -3161,14 +3161,14 @@ static void vnc_display_print_local_addr(VncDisplay *vd)
         return;
     }
 
-    if (addr->type != SOCKET_ADDRESS_LEGACY_KIND_INET) {
-        qapi_free_SocketAddressLegacy(addr);
+    if (addr->type != SOCKET_ADDRESS_TYPE_INET) {
+        qapi_free_SocketAddress(addr);
         return;
     }
     error_printf_unless_qmp("VNC server running on %s:%s\n",
-                            addr->u.inet.data->host,
-                            addr->u.inet.data->port);
-    qapi_free_SocketAddressLegacy(addr);
+                            addr->u.inet.host,
+                            addr->u.inet.port);
+    qapi_free_SocketAddress(addr);
 }
 
 static QemuOptsList qemu_vnc_opts = {
@@ -3414,18 +3414,17 @@ static int vnc_display_get_address(const char *addrstr,
                                    bool has_ipv6,
                                    bool ipv4,
                                    bool ipv6,
-                                   SocketAddressLegacy **retaddr,
+                                   SocketAddress **retaddr,
                                    Error **errp)
 {
     int ret = -1;
-    SocketAddressLegacy *addr = NULL;
+    SocketAddress *addr = NULL;
 
-    addr = g_new0(SocketAddressLegacy, 1);
+    addr = g_new0(SocketAddress, 1);
 
     if (strncmp(addrstr, "unix:", 5) == 0) {
-        addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
-        addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
-        addr->u.q_unix.data->path = g_strdup(addrstr + 5);
+        addr->type = SOCKET_ADDRESS_TYPE_UNIX;
+        addr->u.q_unix.path = g_strdup(addrstr + 5);
 
         if (websocket) {
             error_setg(errp, "UNIX sockets not supported with websock");
@@ -3461,8 +3460,8 @@ static int vnc_display_get_address(const char *addrstr,
             }
         }
 
-        addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
-        inet = addr->u.inet.data = g_new0(InetSocketAddress, 1);
+        addr->type = SOCKET_ADDRESS_TYPE_INET;
+        inet = &addr->u.inet;
         if (addrstr[0] == '[' && addrstr[hostlen - 1] == ']') {
             inet->host = g_strndup(addrstr + 1, hostlen - 2);
         } else {
@@ -3518,21 +3517,21 @@ static int vnc_display_get_address(const char *addrstr,
 
  cleanup:
     if (ret < 0) {
-        qapi_free_SocketAddressLegacy(addr);
+        qapi_free_SocketAddress(addr);
     }
     return ret;
 }
 
 static int vnc_display_get_addresses(QemuOpts *opts,
                                      bool reverse,
-                                     SocketAddressLegacy ***retsaddr,
+                                     SocketAddress ***retsaddr,
                                      size_t *retnsaddr,
-                                     SocketAddressLegacy ***retwsaddr,
+                                     SocketAddress ***retwsaddr,
                                      size_t *retnwsaddr,
                                      Error **errp)
 {
-    SocketAddressLegacy *saddr = NULL;
-    SocketAddressLegacy *wsaddr = NULL;
+    SocketAddress *saddr = NULL;
+    SocketAddress *wsaddr = NULL;
     QemuOptsIter addriter;
     const char *addr;
     int to = qemu_opt_get_number(opts, "to", 0);
@@ -3577,7 +3576,7 @@ static int vnc_display_get_addresses(QemuOpts *opts,
         if (displaynum == -1) {
             displaynum = rv;
         }
-        *retsaddr = g_renew(SocketAddressLegacy *, *retsaddr, *retnsaddr + 1);
+        *retsaddr = g_renew(SocketAddress *, *retsaddr, *retnsaddr + 1);
         (*retsaddr)[(*retnsaddr)++] = saddr;
     }
 
@@ -3601,16 +3600,15 @@ static int vnc_display_get_addresses(QemuOpts *opts,
          * address for websocket too
          */
         if (*retnsaddr == 1 &&
-            (*retsaddr)[0]->type == SOCKET_ADDRESS_LEGACY_KIND_INET &&
-            wsaddr->type == SOCKET_ADDRESS_LEGACY_KIND_INET &&
-            g_str_equal(wsaddr->u.inet.data->host, "") &&
-            !g_str_equal((*retsaddr)[0]->u.inet.data->host, "")) {
-            g_free(wsaddr->u.inet.data->host);
-            wsaddr->u.inet.data->host =
-                g_strdup((*retsaddr)[0]->u.inet.data->host);
+            (*retsaddr)[0]->type == SOCKET_ADDRESS_TYPE_INET &&
+            wsaddr->type == SOCKET_ADDRESS_TYPE_INET &&
+            g_str_equal(wsaddr->u.inet.host, "") &&
+            !g_str_equal((*retsaddr)[0]->u.inet.host, "")) {
+            g_free(wsaddr->u.inet.host);
+            wsaddr->u.inet.host = g_strdup((*retsaddr)[0]->u.inet.host);
         }
 
-        *retwsaddr = g_renew(SocketAddressLegacy *, *retwsaddr, *retnwsaddr + 1);
+        *retwsaddr = g_renew(SocketAddress *, *retwsaddr, *retnwsaddr + 1);
         (*retwsaddr)[(*retnwsaddr)++] = wsaddr;
     }
 
@@ -3618,11 +3616,11 @@ static int vnc_display_get_addresses(QemuOpts *opts,
  cleanup:
     if (ret < 0) {
         for (i = 0; i < *retnsaddr; i++) {
-            qapi_free_SocketAddressLegacy((*retsaddr)[i]);
+            qapi_free_SocketAddress((*retsaddr)[i]);
         }
         g_free(*retsaddr);
         for (i = 0; i < *retnwsaddr; i++) {
-            qapi_free_SocketAddressLegacy((*retwsaddr)[i]);
+            qapi_free_SocketAddress((*retwsaddr)[i]);
         }
         g_free(*retwsaddr);
         *retsaddr = *retwsaddr = NULL;
@@ -3632,9 +3630,9 @@ static int vnc_display_get_addresses(QemuOpts *opts,
 }
 
 static int vnc_display_connect(VncDisplay *vd,
-                               SocketAddressLegacy **saddr,
+                               SocketAddress **saddr,
                                size_t nsaddr,
-                               SocketAddressLegacy **wsaddr,
+                               SocketAddress **wsaddr,
                                size_t nwsaddr,
                                Error **errp)
 {
@@ -3648,8 +3646,8 @@ static int vnc_display_connect(VncDisplay *vd,
         error_setg(errp, "Expected a single address in reverse mode");
         return -1;
     }
-    /* TODO SOCKET_ADDRESS_LEGACY_KIND_FD when fd has AF_UNIX */
-    vd->is_unix = saddr[0]->type == SOCKET_ADDRESS_LEGACY_KIND_UNIX;
+    /* TODO SOCKET_ADDRESS_TYPE_FD when fd has AF_UNIX */
+    vd->is_unix = saddr[0]->type == SOCKET_ADDRESS_TYPE_UNIX;
     sioc = qio_channel_socket_new();
     qio_channel_set_name(QIO_CHANNEL(sioc), "vnc-reverse");
     if (qio_channel_socket_connect_sync(sioc, saddr[0], errp) < 0) {
@@ -3662,7 +3660,7 @@ static int vnc_display_connect(VncDisplay *vd,
 
 
 static int vnc_display_listen_addr(VncDisplay *vd,
-                                   SocketAddressLegacy *addr,
+                                   SocketAddress *addr,
                                    const char *name,
                                    QIOChannelSocket ***lsock,
                                    guint **lsock_tag,
@@ -3670,7 +3668,7 @@ static int vnc_display_listen_addr(VncDisplay *vd,
                                    Error **errp)
 {
     QIODNSResolver *resolver = qio_dns_resolver_get_instance();
-    SocketAddressLegacy **rawaddrs = NULL;
+    SocketAddress **rawaddrs = NULL;
     size_t nrawaddrs = 0;
     Error *listenerr = NULL;
     bool listening = false;
@@ -3700,7 +3698,7 @@ static int vnc_display_listen_addr(VncDisplay *vd,
     }
 
     for (i = 0; i < nrawaddrs; i++) {
-        qapi_free_SocketAddressLegacy(rawaddrs[i]);
+        qapi_free_SocketAddress(rawaddrs[i]);
     }
     g_free(rawaddrs);
 
@@ -3724,9 +3722,9 @@ static int vnc_display_listen_addr(VncDisplay *vd,
 
 
 static int vnc_display_listen(VncDisplay *vd,
-                              SocketAddressLegacy **saddr,
+                              SocketAddress **saddr,
                               size_t nsaddr,
-                              SocketAddressLegacy **wsaddr,
+                              SocketAddress **wsaddr,
                               size_t nwsaddr,
                               Error **errp)
 {
@@ -3761,7 +3759,7 @@ void vnc_display_open(const char *id, Error **errp)
 {
     VncDisplay *vd = vnc_display_find(id);
     QemuOpts *opts = qemu_opts_find(&qemu_vnc_opts, id);
-    SocketAddressLegacy **saddr = NULL, **wsaddr = NULL;
+    SocketAddress **saddr = NULL, **wsaddr = NULL;
     size_t nsaddr, nwsaddr;
     const char *share, *device_id;
     QemuConsole *con;
@@ -3997,10 +3995,10 @@ void vnc_display_open(const char *id, Error **errp)
 
  cleanup:
     for (i = 0; i < nsaddr; i++) {
-        qapi_free_SocketAddressLegacy(saddr[i]);
+        qapi_free_SocketAddress(saddr[i]);
     }
     for (i = 0; i < nwsaddr; i++) {
-        qapi_free_SocketAddressLegacy(wsaddr[i]);
+        qapi_free_SocketAddress(wsaddr[i]);
     }
     return;
 
diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
index 801aa7a..ad3ce65 100644
--- a/util/qemu-sockets.c
+++ b/util/qemu-sockets.c
@@ -22,6 +22,7 @@
 #endif /* CONFIG_AF_VSOCK */
 
 #include "monitor/monitor.h"
+#include "qapi/clone-visitor.h"
 #include "qapi/error.h"
 #include "qemu/sockets.h"
 #include "qemu/main-loop.h"
@@ -1029,73 +1030,69 @@ int unix_connect(const char *path, Error **errp)
 }
 
 
-SocketAddressLegacy *socket_parse(const char *str, Error **errp)
+SocketAddress *socket_parse(const char *str, Error **errp)
 {
-    SocketAddressLegacy *addr;
+    SocketAddress *addr;
 
-    addr = g_new0(SocketAddressLegacy, 1);
+    addr = g_new0(SocketAddress, 1);
     if (strstart(str, "unix:", NULL)) {
         if (str[5] == '\0') {
             error_setg(errp, "invalid Unix socket address");
             goto fail;
         } else {
-            addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
-            addr->u.q_unix.data = g_new(UnixSocketAddress, 1);
-            addr->u.q_unix.data->path = g_strdup(str + 5);
+            addr->type = SOCKET_ADDRESS_TYPE_UNIX;
+            addr->u.q_unix.path = g_strdup(str + 5);
         }
     } else if (strstart(str, "fd:", NULL)) {
         if (str[3] == '\0') {
             error_setg(errp, "invalid file descriptor address");
             goto fail;
         } else {
-            addr->type = SOCKET_ADDRESS_LEGACY_KIND_FD;
-            addr->u.fd.data = g_new(String, 1);
-            addr->u.fd.data->str = g_strdup(str + 3);
+            addr->type = SOCKET_ADDRESS_TYPE_FD;
+            addr->u.fd.str = g_strdup(str + 3);
         }
     } else if (strstart(str, "vsock:", NULL)) {
-        addr->type = SOCKET_ADDRESS_LEGACY_KIND_VSOCK;
-        addr->u.vsock.data = g_new(VsockSocketAddress, 1);
-        if (vsock_parse(addr->u.vsock.data, str + strlen("vsock:"), errp)) {
+        addr->type = SOCKET_ADDRESS_TYPE_VSOCK;
+        if (vsock_parse(&addr->u.vsock, str + strlen("vsock:"), errp)) {
             goto fail;
         }
     } else {
-        addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
-        addr->u.inet.data = g_new(InetSocketAddress, 1);
-        if (inet_parse(addr->u.inet.data, str, errp)) {
+        addr->type = SOCKET_ADDRESS_TYPE_INET;
+        if (inet_parse(&addr->u.inet, str, errp)) {
             goto fail;
         }
     }
     return addr;
 
 fail:
-    qapi_free_SocketAddressLegacy(addr);
+    qapi_free_SocketAddress(addr);
     return NULL;
 }
 
-int socket_connect(SocketAddressLegacy *addr, NonBlockingConnectHandler *callback,
+int socket_connect(SocketAddress *addr, NonBlockingConnectHandler *callback,
                    void *opaque, Error **errp)
 {
     int fd;
 
     switch (addr->type) {
-    case SOCKET_ADDRESS_LEGACY_KIND_INET:
-        fd = inet_connect_saddr(addr->u.inet.data, callback, opaque, errp);
+    case SOCKET_ADDRESS_TYPE_INET:
+        fd = inet_connect_saddr(&addr->u.inet, callback, opaque, errp);
         break;
 
-    case SOCKET_ADDRESS_LEGACY_KIND_UNIX:
-        fd = unix_connect_saddr(addr->u.q_unix.data, callback, opaque, errp);
+    case SOCKET_ADDRESS_TYPE_UNIX:
+        fd = unix_connect_saddr(&addr->u.q_unix, callback, opaque, errp);
         break;
 
-    case SOCKET_ADDRESS_LEGACY_KIND_FD:
-        fd = monitor_get_fd(cur_mon, addr->u.fd.data->str, errp);
+    case SOCKET_ADDRESS_TYPE_FD:
+        fd = monitor_get_fd(cur_mon, addr->u.fd.str, errp);
         if (fd >= 0 && callback) {
             qemu_set_nonblock(fd);
             callback(fd, NULL, opaque);
         }
         break;
 
-    case SOCKET_ADDRESS_LEGACY_KIND_VSOCK:
-        fd = vsock_connect_saddr(addr->u.vsock.data, callback, opaque, errp);
+    case SOCKET_ADDRESS_TYPE_VSOCK:
+        fd = vsock_connect_saddr(&addr->u.vsock, callback, opaque, errp);
         break;
 
     default:
@@ -1104,25 +1101,25 @@ int socket_connect(SocketAddressLegacy *addr, NonBlockingConnectHandler *callbac
     return fd;
 }
 
-int socket_listen(SocketAddressLegacy *addr, Error **errp)
+int socket_listen(SocketAddress *addr, Error **errp)
 {
     int fd;
 
     switch (addr->type) {
-    case SOCKET_ADDRESS_LEGACY_KIND_INET:
-        fd = inet_listen_saddr(addr->u.inet.data, 0, false, errp);
+    case SOCKET_ADDRESS_TYPE_INET:
+        fd = inet_listen_saddr(&addr->u.inet, 0, false, errp);
         break;
 
-    case SOCKET_ADDRESS_LEGACY_KIND_UNIX:
-        fd = unix_listen_saddr(addr->u.q_unix.data, false, errp);
+    case SOCKET_ADDRESS_TYPE_UNIX:
+        fd = unix_listen_saddr(&addr->u.q_unix, false, errp);
         break;
 
-    case SOCKET_ADDRESS_LEGACY_KIND_FD:
-        fd = monitor_get_fd(cur_mon, addr->u.fd.data->str, errp);
+    case SOCKET_ADDRESS_TYPE_FD:
+        fd = monitor_get_fd(cur_mon, addr->u.fd.str, errp);
         break;
 
-    case SOCKET_ADDRESS_LEGACY_KIND_VSOCK:
-        fd = vsock_listen_saddr(addr->u.vsock.data, errp);
+    case SOCKET_ADDRESS_TYPE_VSOCK:
+        fd = vsock_listen_saddr(&addr->u.vsock, errp);
         break;
 
     default:
@@ -1133,34 +1130,34 @@ int socket_listen(SocketAddressLegacy *addr, Error **errp)
 
 void socket_listen_cleanup(int fd, Error **errp)
 {
-    SocketAddressLegacy *addr;
+    SocketAddress *addr;
 
     addr = socket_local_address(fd, errp);
 
-    if (addr->type == SOCKET_ADDRESS_LEGACY_KIND_UNIX
-        && addr->u.q_unix.data->path) {
-        if (unlink(addr->u.q_unix.data->path) < 0 && errno != ENOENT) {
+    if (addr->type == SOCKET_ADDRESS_TYPE_UNIX
+        && addr->u.q_unix.path) {
+        if (unlink(addr->u.q_unix.path) < 0 && errno != ENOENT) {
             error_setg_errno(errp, errno,
                              "Failed to unlink socket %s",
-                             addr->u.q_unix.data->path);
+                             addr->u.q_unix.path);
         }
     }
 
-    qapi_free_SocketAddressLegacy(addr);
+    qapi_free_SocketAddress(addr);
 }
 
-int socket_dgram(SocketAddressLegacy *remote, SocketAddressLegacy *local, Error **errp)
+int socket_dgram(SocketAddress *remote, SocketAddress *local, Error **errp)
 {
     int fd;
 
     /*
-     * TODO SOCKET_ADDRESS_LEGACY_KIND_FD when fd is AF_INET or AF_INET6
+     * TODO SOCKET_ADDRESS_TYPE_FD when fd is AF_INET or AF_INET6
      * (although other address families can do SOCK_DGRAM, too)
      */
     switch (remote->type) {
-    case SOCKET_ADDRESS_LEGACY_KIND_INET:
-        fd = inet_dgram_saddr(remote->u.inet.data,
-                              local ? local->u.inet.data : NULL, errp);
+    case SOCKET_ADDRESS_TYPE_INET:
+        fd = inet_dgram_saddr(&remote->u.inet,
+                              local ? &local->u.inet : NULL, errp);
         break;
 
     default:
@@ -1171,14 +1168,14 @@ int socket_dgram(SocketAddressLegacy *remote, SocketAddressLegacy *local, Error
 }
 
 
-static SocketAddressLegacy *
+static SocketAddress *
 socket_sockaddr_to_address_inet(struct sockaddr_storage *sa,
                                 socklen_t salen,
                                 Error **errp)
 {
     char host[NI_MAXHOST];
     char serv[NI_MAXSERV];
-    SocketAddressLegacy *addr;
+    SocketAddress *addr;
     InetSocketAddress *inet;
     int ret;
 
@@ -1192,9 +1189,9 @@ socket_sockaddr_to_address_inet(struct sockaddr_storage *sa,
         return NULL;
     }
 
-    addr = g_new0(SocketAddressLegacy, 1);
-    addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
-    inet = addr->u.inet.data = g_new0(InetSocketAddress, 1);
+    addr = g_new0(SocketAddress, 1);
+    addr->type = SOCKET_ADDRESS_TYPE_INET;
+    inet = &addr->u.inet;
     inet->host = g_strdup(host);
     inet->port = g_strdup(serv);
     if (sa->ss_family == AF_INET) {
@@ -1208,20 +1205,18 @@ socket_sockaddr_to_address_inet(struct sockaddr_storage *sa,
 
 
 #ifndef WIN32
-static SocketAddressLegacy *
+static SocketAddress *
 socket_sockaddr_to_address_unix(struct sockaddr_storage *sa,
                                 socklen_t salen,
                                 Error **errp)
 {
-    SocketAddressLegacy *addr;
+    SocketAddress *addr;
     struct sockaddr_un *su = (struct sockaddr_un *)sa;
 
-    addr = g_new0(SocketAddressLegacy, 1);
-    addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
-    addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
+    addr = g_new0(SocketAddress, 1);
+    addr->type = SOCKET_ADDRESS_TYPE_UNIX;
     if (su->sun_path[0]) {
-        addr->u.q_unix.data->path = g_strndup(su->sun_path,
-                                              sizeof(su->sun_path));
+        addr->u.q_unix.path = g_strndup(su->sun_path, sizeof(su->sun_path));
     }
 
     return addr;
@@ -1229,18 +1224,18 @@ socket_sockaddr_to_address_unix(struct sockaddr_storage *sa,
 #endif /* WIN32 */
 
 #ifdef CONFIG_AF_VSOCK
-static SocketAddressLegacy *
+static SocketAddress *
 socket_sockaddr_to_address_vsock(struct sockaddr_storage *sa,
                                  socklen_t salen,
                                  Error **errp)
 {
-    SocketAddressLegacy *addr;
+    SocketAddress *addr;
     VsockSocketAddress *vaddr;
     struct sockaddr_vm *svm = (struct sockaddr_vm *)sa;
 
-    addr = g_new0(SocketAddressLegacy, 1);
-    addr->type = SOCKET_ADDRESS_LEGACY_KIND_VSOCK;
-    addr->u.vsock.data = vaddr = g_new0(VsockSocketAddress, 1);
+    addr = g_new0(SocketAddress, 1);
+    addr->type = SOCKET_ADDRESS_TYPE_VSOCK;
+    vaddr = &addr->u.vsock;
     vaddr->cid = g_strdup_printf("%u", svm->svm_cid);
     vaddr->port = g_strdup_printf("%u", svm->svm_port);
 
@@ -1248,7 +1243,7 @@ socket_sockaddr_to_address_vsock(struct sockaddr_storage *sa,
 }
 #endif /* CONFIG_AF_VSOCK */
 
-SocketAddressLegacy *
+SocketAddress *
 socket_sockaddr_to_address(struct sockaddr_storage *sa,
                            socklen_t salen,
                            Error **errp)
@@ -1277,7 +1272,7 @@ socket_sockaddr_to_address(struct sockaddr_storage *sa,
 }
 
 
-SocketAddressLegacy *socket_local_address(int fd, Error **errp)
+SocketAddress *socket_local_address(int fd, Error **errp)
 {
     struct sockaddr_storage ss;
     socklen_t sslen = sizeof(ss);
@@ -1292,7 +1287,7 @@ SocketAddressLegacy *socket_local_address(int fd, Error **errp)
 }
 
 
-SocketAddressLegacy *socket_remote_address(int fd, Error **errp)
+SocketAddress *socket_remote_address(int fd, Error **errp)
 {
     struct sockaddr_storage ss;
     socklen_t sslen = sizeof(ss);
@@ -1306,14 +1301,14 @@ SocketAddressLegacy *socket_remote_address(int fd, Error **errp)
     return socket_sockaddr_to_address(&ss, sslen, errp);
 }
 
-char *socket_address_to_string(struct SocketAddressLegacy *addr, Error **errp)
+char *socket_address_to_string(struct SocketAddress *addr, Error **errp)
 {
     char *buf;
     InetSocketAddress *inet;
 
     switch (addr->type) {
-    case SOCKET_ADDRESS_LEGACY_KIND_INET:
-        inet = addr->u.inet.data;
+    case SOCKET_ADDRESS_TYPE_INET:
+        inet = &addr->u.inet;
         if (strchr(inet->host, ':') == NULL) {
             buf = g_strdup_printf("%s:%s", inet->host, inet->port);
         } else {
@@ -1321,18 +1316,18 @@ char *socket_address_to_string(struct SocketAddressLegacy *addr, Error **errp)
         }
         break;
 
-    case SOCKET_ADDRESS_LEGACY_KIND_UNIX:
-        buf = g_strdup(addr->u.q_unix.data->path);
+    case SOCKET_ADDRESS_TYPE_UNIX:
+        buf = g_strdup(addr->u.q_unix.path);
         break;
 
-    case SOCKET_ADDRESS_LEGACY_KIND_FD:
-        buf = g_strdup(addr->u.fd.data->str);
+    case SOCKET_ADDRESS_TYPE_FD:
+        buf = g_strdup(addr->u.fd.str);
         break;
 
-    case SOCKET_ADDRESS_LEGACY_KIND_VSOCK:
+    case SOCKET_ADDRESS_TYPE_VSOCK:
         buf = g_strdup_printf("%s:%s",
-                              addr->u.vsock.data->cid,
-                              addr->u.vsock.data->port);
+                              addr->u.vsock.cid,
+                              addr->u.vsock.port);
         break;
 
     default:
@@ -1371,3 +1366,34 @@ SocketAddressLegacy *socket_address_crumple(SocketAddress *addr_flat)
 
     return addr;
 }
+
+SocketAddress *socket_address_flatten(SocketAddressLegacy *addr_legacy)
+{
+    SocketAddress *addr = g_new(SocketAddress, 1);
+
+    switch (addr_legacy->type) {
+    case SOCKET_ADDRESS_LEGACY_KIND_INET:
+        addr->type = SOCKET_ADDRESS_TYPE_INET;
+        QAPI_CLONE_MEMBERS(InetSocketAddress, &addr->u.inet,
+                           addr_legacy->u.inet.data);
+        break;
+    case SOCKET_ADDRESS_LEGACY_KIND_UNIX:
+        addr->type = SOCKET_ADDRESS_TYPE_UNIX;
+        QAPI_CLONE_MEMBERS(UnixSocketAddress, &addr->u.q_unix,
+                           addr_legacy->u.q_unix.data);
+        break;
+    case SOCKET_ADDRESS_LEGACY_KIND_VSOCK:
+        addr->type = SOCKET_ADDRESS_TYPE_VSOCK;
+        QAPI_CLONE_MEMBERS(VsockSocketAddress, &addr->u.vsock,
+                           addr_legacy->u.vsock.data);
+        break;
+    case SOCKET_ADDRESS_LEGACY_KIND_FD:
+        addr->type = SOCKET_ADDRESS_TYPE_FD;
+        QAPI_CLONE_MEMBERS(String, &addr->u.fd, addr_legacy->u.fd.data);
+        break;
+    default:
+        abort();
+    }
+
+    return addr;
+}
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [Qemu-devel] [PATCH 7/7] socket: Delete unused helper socket_address_crumple()
  2017-04-26  7:36 [Qemu-devel] [PATCH 0/7] sockets: Flatten SocketAddress except in external interfaces Markus Armbruster
                   ` (5 preceding siblings ...)
  2017-04-26  7:36 ` [Qemu-devel] [PATCH 6/7] sockets: Limit SocketAddressLegacy except to external interfaces Markus Armbruster
@ 2017-04-26  7:36 ` Markus Armbruster
  2017-04-26 19:45   ` Eric Blake
  2017-04-28  8:15 ` [Qemu-devel] [PATCH 0/7] sockets: Flatten SocketAddress except in external interfaces Markus Armbruster
  7 siblings, 1 reply; 19+ messages in thread
From: Markus Armbruster @ 2017-04-26  7:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: berrange, kraxel, pbonzini, eblake, qemu-block

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 include/qemu/sockets.h | 11 -----------
 util/qemu-sockets.c    | 31 -------------------------------
 2 files changed, 42 deletions(-)

diff --git a/include/qemu/sockets.h b/include/qemu/sockets.h
index a7da674..5b12252 100644
--- a/include/qemu/sockets.h
+++ b/include/qemu/sockets.h
@@ -121,17 +121,6 @@ SocketAddress *socket_remote_address(int fd, Error **errp);
 char *socket_address_to_string(struct SocketAddress *addr, Error **errp);
 
 /**
- * socket_address_crumple:
- * @addr_flat: the socket address to crumple
- *
- * Convert SocketAddress to SocketAddressLegacy.  Caller is responsible
- * for freeing with qapi_free_SocketAddressLegacy().
- *
- * Returns: the argument converted to SocketAddressLegacy.
- */
-SocketAddressLegacy *socket_address_crumple(SocketAddress *addr);
-
-/**
  * socket_address_flatten:
  * @addr: the socket address to flatten
  *
diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
index ad3ce65..31b5e8c 100644
--- a/util/qemu-sockets.c
+++ b/util/qemu-sockets.c
@@ -1336,37 +1336,6 @@ char *socket_address_to_string(struct SocketAddress *addr, Error **errp)
     return buf;
 }
 
-SocketAddressLegacy *socket_address_crumple(SocketAddress *addr_flat)
-{
-    SocketAddressLegacy *addr = g_new(SocketAddressLegacy, 1);
-
-    switch (addr_flat->type) {
-    case SOCKET_ADDRESS_TYPE_INET:
-        addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
-        addr->u.inet.data = QAPI_CLONE(InetSocketAddress,
-                                       &addr_flat->u.inet);
-        break;
-    case SOCKET_ADDRESS_TYPE_UNIX:
-        addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
-        addr->u.q_unix.data = QAPI_CLONE(UnixSocketAddress,
-                                         &addr_flat->u.q_unix);
-        break;
-    case SOCKET_ADDRESS_TYPE_VSOCK:
-        addr->type = SOCKET_ADDRESS_LEGACY_KIND_VSOCK;
-        addr->u.vsock.data = QAPI_CLONE(VsockSocketAddress,
-                                        &addr_flat->u.vsock);
-        break;
-    case SOCKET_ADDRESS_TYPE_FD:
-        addr->type = SOCKET_ADDRESS_LEGACY_KIND_FD;
-        addr->u.fd.data = QAPI_CLONE(String, &addr_flat->u.fd);
-        break;
-    default:
-        abort();
-    }
-
-    return addr;
-}
-
 SocketAddress *socket_address_flatten(SocketAddressLegacy *addr_legacy)
 {
     SocketAddress *addr = g_new(SocketAddress, 1);
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: [Qemu-devel] [PATCH 1/7] sockets: Prepare vsock_parse() for flattened SocketAddress
  2017-04-26  7:36 ` [Qemu-devel] [PATCH 1/7] sockets: Prepare vsock_parse() for flattened SocketAddress Markus Armbruster
@ 2017-04-26 15:14   ` Eric Blake
  0 siblings, 0 replies; 19+ messages in thread
From: Eric Blake @ 2017-04-26 15:14 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel; +Cc: berrange, kraxel, pbonzini, qemu-block

[-- Attachment #1: Type: text/plain, Size: 776 bytes --]

On 04/26/2017 02:36 AM, Markus Armbruster wrote:
> I'm going to flatten SocketAddress: rename SocketAddress to
> SocketAddressLegacy, SocketAddressFlat to SocketAddress, eliminate
> SocketAddressLegacy except in external interfaces.
> 
> vsock_parse() returns a newly allocated VsockSocketAddress.  Lift the
> allocation from vsock_parse() into its caller socket_parse() to
> prepare for flattening SocketAddress.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  util/qemu-sockets.c | 20 ++++++++++----------
>  1 file changed, 10 insertions(+), 10 deletions(-)
> 

Reviewed-by: Eric Blake <eblake@redhat.com>

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [Qemu-devel] [PATCH 2/7] sockets: Prepare inet_parse() for flattened SocketAddress
  2017-04-26  7:36 ` [Qemu-devel] [PATCH 2/7] sockets: Prepare inet_parse() " Markus Armbruster
@ 2017-04-26 15:28   ` Eric Blake
  0 siblings, 0 replies; 19+ messages in thread
From: Eric Blake @ 2017-04-26 15:28 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel; +Cc: berrange, kraxel, pbonzini, qemu-block

[-- Attachment #1: Type: text/plain, Size: 938 bytes --]

On 04/26/2017 02:36 AM, Markus Armbruster wrote:
> I'm going to flatten SocketAddress: rename SocketAddress to
> SocketAddressLegacy, SocketAddressFlat to SocketAddress, eliminate
> SocketAddressLegacy except in external interfaces.
> 
> inet_parse() returns a newly allocated InetSocketAddress.  Lift the
> allocation from inet_parse() into its caller socket_parse() to prepare
> for flattening SocketAddress.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  block/nbd.c            |  8 ++++----
>  include/qemu/sockets.h |  2 +-
>  migration/rdma.c       |  4 ++--
>  migration/socket.c     |  5 +++--
>  util/qemu-sockets.c    | 30 ++++++++++++------------------
>  5 files changed, 22 insertions(+), 27 deletions(-)
> 

Reviewed-by: Eric Blake <eblake@redhat.com>

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [Qemu-devel] [PATCH 3/7] qapi: New QAPI_CLONE_MEMBERS()
  2017-04-26  7:36 ` [Qemu-devel] [PATCH 3/7] qapi: New QAPI_CLONE_MEMBERS() Markus Armbruster
@ 2017-04-26 17:56   ` Eric Blake
  0 siblings, 0 replies; 19+ messages in thread
From: Eric Blake @ 2017-04-26 17:56 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel; +Cc: berrange, kraxel, pbonzini, qemu-block

[-- Attachment #1: Type: text/plain, Size: 606 bytes --]

On 04/26/2017 02:36 AM, Markus Armbruster wrote:
> QAPI_CLONE() returns a newly allocated QAPI object.  Inconvenient when
> we want to clone into an existing object.  QAPI_CLONE_MEMBERS() does
> exactly that.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  include/qapi/clone-visitor.h | 14 ++++++++++++++
>  qapi/qapi-clone-visitor.c    | 13 +++++++++++++
>  2 files changed, 27 insertions(+)
> 

Reviewed-by: Eric Blake <eblake@redhat.com>

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [Qemu-devel] [PATCH 4/7] sockets: Rename SocketAddress to SocketAddressLegacy
  2017-04-26  7:36 ` [Qemu-devel] [PATCH 4/7] sockets: Rename SocketAddress to SocketAddressLegacy Markus Armbruster
@ 2017-04-26 19:08   ` Eric Blake
  0 siblings, 0 replies; 19+ messages in thread
From: Eric Blake @ 2017-04-26 19:08 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel; +Cc: berrange, kraxel, pbonzini, qemu-block

[-- Attachment #1: Type: text/plain, Size: 1758 bytes --]

On 04/26/2017 02:36 AM, Markus Armbruster wrote:
> The next commit will rename SocketAddressFlat to SocketAddress, and
> the commit after that will replace most uses of SocketAddressLegacy by
> SocketAddress, replacing most of this commit's renames right back.
> 
> Note that checkpatch emits a few "line over 80 characters" warnings.
> The long lines are all temporary; the SocketAddressLegacy replacement
> will shorten them again.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---

> @@ -530,17 +530,17 @@ static void sd_aio_setup(SheepdogAIOCB *acb, BDRVSheepdogState *s,
>      QLIST_INSERT_HEAD(&s->inflight_aiocb_head, acb, aiocb_siblings);
>  }
>  
> -static SocketAddress *sd_socket_address(const char *path,
> +static SocketAddressLegacy *sd_socket_address(const char *path,
>                                          const char *host, const char *port)

And the indentation will get fixed up later, too.


> @@ -205,12 +205,12 @@ void qio_channel_socket_dgram_async(QIOChannelSocket *ioc,
>   * Get the string representation of the local socket
>   * address. A pointer to the allocated address information
>   * struct will be returned, which the caller is required to
> - * release with a call qapi_free_SocketAddress when no
> + * release with a call qapi_free_SocketAddressLegacy() when no

I see you did slightly more than just a mechanical change. That's okay.

Mostly mechanical (since the compiler complains if you still use the old
name of the struct or enum values), but I'm glad you also corrected
comments.

Reviewed-by: Eric Blake <eblake@redhat.com>

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [Qemu-devel] [PATCH 5/7] sockets: Rename SocketAddressFlat to SocketAddress
  2017-04-26  7:36 ` [Qemu-devel] [PATCH 5/7] sockets: Rename SocketAddressFlat to SocketAddress Markus Armbruster
@ 2017-04-26 19:15   ` Eric Blake
  2017-04-27  5:53   ` Prasanna Kalever
  1 sibling, 0 replies; 19+ messages in thread
From: Eric Blake @ 2017-04-26 19:15 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel; +Cc: berrange, kraxel, pbonzini, qemu-block

[-- Attachment #1: Type: text/plain, Size: 694 bytes --]

On 04/26/2017 02:36 AM, Markus Armbruster wrote:
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  block/gluster.c        | 48 ++++++++++++++++++++++++------------------------
>  block/nbd.c            | 26 +++++++++++++-------------
>  block/sheepdog.c       |  6 +++---
>  include/qemu/sockets.h |  4 ++--
>  qapi-schema.json       | 14 +++++++-------
>  qapi/block-core.json   |  6 +++---
>  util/qemu-sockets.c    | 10 +++++-----
>  7 files changed, 57 insertions(+), 57 deletions(-)
> 
Reviewed-by: Eric Blake <eblake@redhat.com>

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [Qemu-devel] [PATCH 6/7] sockets: Limit SocketAddressLegacy except to external interfaces
  2017-04-26  7:36 ` [Qemu-devel] [PATCH 6/7] sockets: Limit SocketAddressLegacy except to external interfaces Markus Armbruster
@ 2017-04-26 19:45   ` Eric Blake
  2017-04-27  7:26     ` Markus Armbruster
  0 siblings, 1 reply; 19+ messages in thread
From: Eric Blake @ 2017-04-26 19:45 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel; +Cc: berrange, kraxel, pbonzini, qemu-block

[-- Attachment #1: Type: text/plain, Size: 6078 bytes --]

On 04/26/2017 02:36 AM, Markus Armbruster wrote:

I think it reads fine if you shorten the subject via s/except //

> SocketAddressLegacy is a simple union, and simple unions are awkward:
> they have their variant members wrapped in a "data" object on the
> wire, and require additional indirections in C.  SocketAddress is the
> equivalent flat union.  Convert all users of SocketAddressLegacy to
> SocketAddress, except for existing external interfaces.
> 
> See also commit fce5d53..9445673 and 85a82e8..c5f1ae3.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---

> +++ b/blockdev-nbd.c
> @@ -99,9 +99,8 @@ static QCryptoTLSCreds *nbd_get_tls_creds(const char *id, Error **errp)
>  }
>  
>  
> -void qmp_nbd_server_start(SocketAddressLegacy *addr,
> -                          bool has_tls_creds, const char *tls_creds,
> -                          Error **errp)
> +void nbd_server_start(SocketAddress *addr, const char *tls_creds,
> +                      Error **errp)
>  {
...
> @@ -145,6 +144,16 @@ void qmp_nbd_server_start(SocketAddressLegacy *addr,
>      nbd_server = NULL;
>  }
>  
> +void qmp_nbd_server_start(SocketAddressLegacy *addr,
> +                          bool has_tls_creds, const char *tls_creds,
> +                          Error **errp)
> +{
> +    SocketAddress *addr_flat = socket_address_flatten(addr);
> +
> +    nbd_server_start(addr_flat, tls_creds, errp);

We didn't always guarantee that tls_creds was initialized when
has_tls_creds was false, but it's been quite some time that we fixed
that.  So what you have works, and I'm not sure if it's worth using the
longer:
has_tls_creds ? tls_creds : NULL

> +++ b/chardev/char-socket.c
> @@ -52,7 +52,7 @@ typedef struct {
>      int *write_msgfds;
>      size_t write_msgfds_num;
>  
> -    SocketAddressLegacy *addr;
> +    SocketAddress *addr;
>      bool is_listen;
>      bool is_telnet;
>  
> @@ -337,30 +337,30 @@ static void tcp_chr_free_connection(Chardev *chr)
>      s->connected = 0;
>  }
>  
> -static char *SocketAddress_to_str(const char *prefix, SocketAddressLegacy *addr,
> +static char *SocketAddressto_str(const char *prefix, SocketAddress *addr,
>                                    bool is_listen, bool is_telnet)

Is this rename(s/_to/to/) intentional? If it is, your indentation is now
off.  If not, you've got a couple of fixes to make to restore the _.

> @@ -380,7 +380,7 @@ static void tcp_chr_disconnect(Chardev *chr)
>          s->listen_tag = qio_channel_add_watch(
>              QIO_CHANNEL(s->listen_ioc), G_IO_IN, tcp_chr_accept, chr, NULL);
>      }
> -    chr->filename = SocketAddress_to_str("disconnected:", s->addr,
> +    chr->filename = SocketAddressto_str("disconnected:", s->addr,
>                                           s->is_listen, s->is_telnet);

Again, either restore the _ or fix the indentation.


> @@ -864,18 +864,18 @@ static void qmp_chardev_open_socket(Chardev *chr,
>          }
>      }
>  
> -    s->addr = QAPI_CLONE(SocketAddressLegacy, sock->addr);
> +    s->addr = addr = socket_address_flatten(sock->addr);
>  
>      qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_RECONNECTABLE);
>      /* TODO SOCKET_ADDRESS_FD where fd has AF_UNIX */
> -    if (addr->type == SOCKET_ADDRESS_LEGACY_KIND_UNIX) {
> +    if (addr->type == SOCKET_ADDRESS_TYPE_UNIX) {
>          qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_FD_PASS);
>      }
>  
>      /* be isn't opened until we get a connection */
>      *be_opened = false;
>  
> -    chr->filename = SocketAddress_to_str("disconnected:",
> +    chr->filename = SocketAddressto_str("disconnected:",
>                                           addr, is_listen, is_telnet);

and again


> @@ -131,4 +131,15 @@ char *socket_address_to_string(struct SocketAddressLegacy *addr, Error **errp);
>   */
>  SocketAddressLegacy *socket_address_crumple(SocketAddress *addr);
>  
> +/**
> + * socket_address_flatten:
> + * @addr: the socket address to flatten
> + *
> + * Convert SocketAddressLegacy to SocketAddress.  Caller is responsible
> + * for freeing with qapi_free_SocketAddress().
> + *
> + * Returns: the argument converted to SocketAddressLegacy.

s/SocketAddressLegacy/SocketAddress/

> + */
> +SocketAddress *socket_address_flatten(SocketAddressLegacy *addr);
> +
>  #endif /* QEMU_SOCKETS_H */

> +++ b/qapi-schema.json
> @@ -4126,7 +4126,12 @@
>  #
>  # Captures the address of a socket, which could also be a named file descriptor
>  #
> -# Note: This type is deprecated in favor of SocketAddress.
> +# Note: This type is deprecated in favor of SocketAddress.  The
> +# difference to SocketAddress is that SocketAddress is a flat union
> +# rather than a simple union.  Flat is nicer because it avoids nesting
> +# on the wire, i.e. this form has fewer {}.

This comment doesn't read correctly.  I think you want:

The difference between SocketAddressLegacy and SocketAddress is that the
latter is a flat union rather than a simple union. Flat is nicer because
it avoids nesting on the wire, i.e. that form has fewer {}.

> +++ b/util/qemu-sockets.c

> @@ -1371,3 +1366,34 @@ SocketAddressLegacy *socket_address_crumple(SocketAddress *addr_flat)
>  
>      return addr;
>  }
> +
> +SocketAddress *socket_address_flatten(SocketAddressLegacy *addr_legacy)
> +{
> +    SocketAddress *addr = g_new(SocketAddress, 1);
> +
> +    switch (addr_legacy->type) {
> +    case SOCKET_ADDRESS_LEGACY_KIND_INET:
> +        addr->type = SOCKET_ADDRESS_TYPE_INET;
> +        QAPI_CLONE_MEMBERS(InetSocketAddress, &addr->u.inet,
> +                           addr_legacy->u.inet.data);
> +        break;

Works nicely.

I've pointed out some minor issues, but if you are comfortable changing
those as maintainer rather than posting a v2, feel free to add:
Reviewed-by: Eric Blake <eblake@redhat.com>

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [Qemu-devel] [PATCH 7/7] socket: Delete unused helper socket_address_crumple()
  2017-04-26  7:36 ` [Qemu-devel] [PATCH 7/7] socket: Delete unused helper socket_address_crumple() Markus Armbruster
@ 2017-04-26 19:45   ` Eric Blake
  0 siblings, 0 replies; 19+ messages in thread
From: Eric Blake @ 2017-04-26 19:45 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel; +Cc: berrange, kraxel, pbonzini, qemu-block

[-- Attachment #1: Type: text/plain, Size: 462 bytes --]

On 04/26/2017 02:36 AM, Markus Armbruster wrote:
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  include/qemu/sockets.h | 11 -----------
>  util/qemu-sockets.c    | 31 -------------------------------
>  2 files changed, 42 deletions(-)

Code deletion is fun!

Reviewed-by: Eric Blake <eblake@redhat.com>

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [Qemu-devel] [PATCH 5/7] sockets: Rename SocketAddressFlat to SocketAddress
  2017-04-26  7:36 ` [Qemu-devel] [PATCH 5/7] sockets: Rename SocketAddressFlat to SocketAddress Markus Armbruster
  2017-04-26 19:15   ` Eric Blake
@ 2017-04-27  5:53   ` Prasanna Kalever
  1 sibling, 0 replies; 19+ messages in thread
From: Prasanna Kalever @ 2017-04-27  5:53 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel, pbonzini, qemu-block, kraxel

On Wed, Apr 26, 2017 at 1:06 PM, Markus Armbruster <armbru@redhat.com> wrote:
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  block/gluster.c        | 48 ++++++++++++++++++++++++------------------------
>  block/nbd.c            | 26 +++++++++++++-------------
>  block/sheepdog.c       |  6 +++---
>  include/qemu/sockets.h |  4 ++--
>  qapi-schema.json       | 14 +++++++-------
>  qapi/block-core.json   |  6 +++---
>  util/qemu-sockets.c    | 10 +++++-----
>  7 files changed, 57 insertions(+), 57 deletions(-)
>
> diff --git a/block/gluster.c b/block/gluster.c
> index cf29b5f..93eac87 100644
> --- a/block/gluster.c
> +++ b/block/gluster.c
> @@ -321,7 +321,7 @@ static int parse_volume_options(BlockdevOptionsGluster *gconf, char *path)
>  static int qemu_gluster_parse_uri(BlockdevOptionsGluster *gconf,
>                                    const char *filename)
>  {
> -    SocketAddressFlat *gsconf;
> +    SocketAddress *gsconf;
>      URI *uri;
>      QueryParams *qp = NULL;
>      bool is_unix = false;
> @@ -332,19 +332,19 @@ static int qemu_gluster_parse_uri(BlockdevOptionsGluster *gconf,
>          return -EINVAL;
>      }
>
> -    gconf->server = g_new0(SocketAddressFlatList, 1);
> -    gconf->server->value = gsconf = g_new0(SocketAddressFlat, 1);
> +    gconf->server = g_new0(SocketAddressList, 1);
> +    gconf->server->value = gsconf = g_new0(SocketAddress, 1);
>
>      /* transport */
>      if (!uri->scheme || !strcmp(uri->scheme, "gluster")) {
> -        gsconf->type = SOCKET_ADDRESS_FLAT_TYPE_INET;
> +        gsconf->type = SOCKET_ADDRESS_TYPE_INET;
>      } else if (!strcmp(uri->scheme, "gluster+tcp")) {
> -        gsconf->type = SOCKET_ADDRESS_FLAT_TYPE_INET;
> +        gsconf->type = SOCKET_ADDRESS_TYPE_INET;
>      } else if (!strcmp(uri->scheme, "gluster+unix")) {
> -        gsconf->type = SOCKET_ADDRESS_FLAT_TYPE_UNIX;
> +        gsconf->type = SOCKET_ADDRESS_TYPE_UNIX;
>          is_unix = true;
>      } else if (!strcmp(uri->scheme, "gluster+rdma")) {
> -        gsconf->type = SOCKET_ADDRESS_FLAT_TYPE_INET;
> +        gsconf->type = SOCKET_ADDRESS_TYPE_INET;
>          error_report("Warning: rdma feature is not supported, falling "
>                       "back to tcp");
>      } else {
> @@ -396,7 +396,7 @@ static struct glfs *qemu_gluster_glfs_init(BlockdevOptionsGluster *gconf,
>      struct glfs *glfs;
>      int ret;
>      int old_errno;
> -    SocketAddressFlatList *server;
> +    SocketAddressList *server;
>      unsigned long long port;
>
>      glfs = glfs_find_preopened(gconf->volume);
> @@ -413,11 +413,11 @@ static struct glfs *qemu_gluster_glfs_init(BlockdevOptionsGluster *gconf,
>
>      for (server = gconf->server; server; server = server->next) {
>          switch (server->value->type) {
> -        case SOCKET_ADDRESS_FLAT_TYPE_UNIX:
> +        case SOCKET_ADDRESS_TYPE_UNIX:
>              ret = glfs_set_volfile_server(glfs, "unix",
>                                     server->value->u.q_unix.path, 0);
>              break;
> -        case SOCKET_ADDRESS_FLAT_TYPE_INET:
> +        case SOCKET_ADDRESS_TYPE_INET:
>              if (parse_uint_full(server->value->u.inet.port, &port, 10) < 0 ||
>                  port > 65535) {
>                  error_setg(errp, "'%s' is not a valid port number",
> @@ -429,8 +429,8 @@ static struct glfs *qemu_gluster_glfs_init(BlockdevOptionsGluster *gconf,
>                                     server->value->u.inet.host,
>                                     (int)port);
>              break;
> -        case SOCKET_ADDRESS_FLAT_TYPE_VSOCK:
> -        case SOCKET_ADDRESS_FLAT_TYPE_FD:
> +        case SOCKET_ADDRESS_TYPE_VSOCK:
> +        case SOCKET_ADDRESS_TYPE_FD:
>          default:
>              abort();
>          }
> @@ -450,7 +450,7 @@ static struct glfs *qemu_gluster_glfs_init(BlockdevOptionsGluster *gconf,
>          error_setg(errp, "Gluster connection for volume %s, path %s failed"
>                           " to connect", gconf->volume, gconf->path);
>          for (server = gconf->server; server; server = server->next) {
> -            if (server->value->type  == SOCKET_ADDRESS_FLAT_TYPE_UNIX) {
> +            if (server->value->type  == SOCKET_ADDRESS_TYPE_UNIX) {
>                  error_append_hint(errp, "hint: failed on socket %s ",
>                                    server->value->u.q_unix.path);
>              } else {
> @@ -487,8 +487,8 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
>                                    QDict *options, Error **errp)
>  {
>      QemuOpts *opts;
> -    SocketAddressFlat *gsconf = NULL;
> -    SocketAddressFlatList *curr = NULL;
> +    SocketAddress *gsconf = NULL;
> +    SocketAddressList *curr = NULL;
>      QDict *backing_options = NULL;
>      Error *local_err = NULL;
>      char *str = NULL;
> @@ -542,14 +542,14 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
>              goto out;
>
>          }
> -        gsconf = g_new0(SocketAddressFlat, 1);
> +        gsconf = g_new0(SocketAddress, 1);
>          if (!strcmp(ptr, "tcp")) {
>              ptr = "inet";       /* accept legacy "tcp" */
>          }
> -        type = qapi_enum_parse(SocketAddressFlatType_lookup, ptr,
> -                               SOCKET_ADDRESS_FLAT_TYPE__MAX, -1, NULL);
> -        if (type != SOCKET_ADDRESS_FLAT_TYPE_INET
> -            && type != SOCKET_ADDRESS_FLAT_TYPE_UNIX) {
> +        type = qapi_enum_parse(SocketAddressType_lookup, ptr,
> +                               SOCKET_ADDRESS_TYPE__MAX, -1, NULL);
> +        if (type != SOCKET_ADDRESS_TYPE_INET
> +            && type != SOCKET_ADDRESS_TYPE_UNIX) {
>              error_setg(&local_err,
>                         "Parameter '%s' may be 'inet' or 'unix'",
>                         GLUSTER_OPT_TYPE);
> @@ -559,7 +559,7 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
>          gsconf->type = type;
>          qemu_opts_del(opts);
>
> -        if (gsconf->type == SOCKET_ADDRESS_FLAT_TYPE_INET) {
> +        if (gsconf->type == SOCKET_ADDRESS_TYPE_INET) {
>              /* create opts info from runtime_inet_opts list */
>              opts = qemu_opts_create(&runtime_inet_opts, NULL, 0, &error_abort);
>              qemu_opts_absorb_qdict(opts, backing_options, &local_err);
> @@ -628,11 +628,11 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
>          }
>
>          if (gconf->server == NULL) {
> -            gconf->server = g_new0(SocketAddressFlatList, 1);
> +            gconf->server = g_new0(SocketAddressList, 1);
>              gconf->server->value = gsconf;
>              curr = gconf->server;
>          } else {
> -            curr->next = g_new0(SocketAddressFlatList, 1);
> +            curr->next = g_new0(SocketAddressList, 1);
>              curr->next->value = gsconf;
>              curr = curr->next;
>          }
> @@ -648,7 +648,7 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
>
>  out:
>      error_propagate(errp, local_err);
> -    qapi_free_SocketAddressFlat(gsconf);
> +    qapi_free_SocketAddress(gsconf);
>      qemu_opts_del(opts);
>      g_free(str);
>      QDECREF(backing_options);
> diff --git a/block/nbd.c b/block/nbd.c
> index 8bdcbc5..ee51d1a 100644
> --- a/block/nbd.c
> +++ b/block/nbd.c
> @@ -47,7 +47,7 @@ typedef struct BDRVNBDState {
>      NBDClientSession client;
>
>      /* For nbd_refresh_filename() */
> -    SocketAddressFlat *saddr;
> +    SocketAddress *saddr;
>      char *export, *tlscredsid;
>  } BDRVNBDState;
>
> @@ -259,10 +259,10 @@ static bool nbd_process_legacy_socket_options(QDict *output_options,
>      return true;
>  }
>
> -static SocketAddressFlat *nbd_config(BDRVNBDState *s, QDict *options,
> -                                     Error **errp)
> +static SocketAddress *nbd_config(BDRVNBDState *s, QDict *options,
> +                                 Error **errp)
>  {
> -    SocketAddressFlat *saddr = NULL;
> +    SocketAddress *saddr = NULL;
>      QDict *addr = NULL;
>      QObject *crumpled_addr = NULL;
>      Visitor *iv = NULL;
> @@ -288,7 +288,7 @@ static SocketAddressFlat *nbd_config(BDRVNBDState *s, QDict *options,
>       * visitor expects the former.
>       */
>      iv = qobject_input_visitor_new(crumpled_addr);
> -    visit_type_SocketAddressFlat(iv, NULL, &saddr, &local_err);
> +    visit_type_SocketAddress(iv, NULL, &saddr, &local_err);
>      if (local_err) {
>          error_propagate(errp, local_err);
>          goto done;
> @@ -307,7 +307,7 @@ NBDClientSession *nbd_get_client_session(BlockDriverState *bs)
>      return &s->client;
>  }
>
> -static QIOChannelSocket *nbd_establish_connection(SocketAddressFlat *saddr_flat,
> +static QIOChannelSocket *nbd_establish_connection(SocketAddress *saddr_flat,
>                                                    Error **errp)
>  {
>      SocketAddressLegacy *saddr = socket_address_crumple(saddr_flat);
> @@ -413,7 +413,7 @@ static int nbd_open(BlockDriverState *bs, QDict *options, int flags,
>          goto error;
>      }
>
> -    /* Translate @host, @port, and @path to a SocketAddressFlat */
> +    /* Translate @host, @port, and @path to a SocketAddress */
>      if (!nbd_process_legacy_socket_options(options, opts, errp)) {
>          goto error;
>      }
> @@ -434,7 +434,7 @@ static int nbd_open(BlockDriverState *bs, QDict *options, int flags,
>          }
>
>          /* TODO SOCKET_ADDRESS_KIND_FD where fd has AF_INET or AF_INET6 */
> -        if (s->saddr->type != SOCKET_ADDRESS_FLAT_TYPE_INET) {
> +        if (s->saddr->type != SOCKET_ADDRESS_TYPE_INET) {
>              error_setg(errp, "TLS only supported over IP sockets");
>              goto error;
>          }
> @@ -461,7 +461,7 @@ static int nbd_open(BlockDriverState *bs, QDict *options, int flags,
>          object_unref(OBJECT(tlscreds));
>      }
>      if (ret < 0) {
> -        qapi_free_SocketAddressFlat(s->saddr);
> +        qapi_free_SocketAddress(s->saddr);
>          g_free(s->export);
>          g_free(s->tlscredsid);
>      }
> @@ -487,7 +487,7 @@ static void nbd_close(BlockDriverState *bs)
>
>      nbd_client_close(bs);
>
> -    qapi_free_SocketAddressFlat(s->saddr);
> +    qapi_free_SocketAddress(s->saddr);
>      g_free(s->export);
>      g_free(s->tlscredsid);
>  }
> @@ -518,13 +518,13 @@ static void nbd_refresh_filename(BlockDriverState *bs, QDict *options)
>      Visitor *ov;
>      const char *host = NULL, *port = NULL, *path = NULL;
>
> -    if (s->saddr->type == SOCKET_ADDRESS_FLAT_TYPE_INET) {
> +    if (s->saddr->type == SOCKET_ADDRESS_TYPE_INET) {
>          const InetSocketAddress *inet = &s->saddr->u.inet;
>          if (!inet->has_ipv4 && !inet->has_ipv6 && !inet->has_to) {
>              host = inet->host;
>              port = inet->port;
>          }
> -    } else if (s->saddr->type == SOCKET_ADDRESS_FLAT_TYPE_UNIX) {
> +    } else if (s->saddr->type == SOCKET_ADDRESS_TYPE_UNIX) {
>          path = s->saddr->u.q_unix.path;
>      } /* else can't represent as pseudo-filename */
>
> @@ -545,7 +545,7 @@ static void nbd_refresh_filename(BlockDriverState *bs, QDict *options)
>      }
>
>      ov = qobject_output_visitor_new(&saddr_qdict);
> -    visit_type_SocketAddressFlat(ov, NULL, &s->saddr, &error_abort);
> +    visit_type_SocketAddress(ov, NULL, &s->saddr, &error_abort);
>      visit_complete(ov, &saddr_qdict);
>      visit_free(ov);
>      qdict_put_obj(opts, "server", saddr_qdict);
> diff --git a/block/sheepdog.c b/block/sheepdog.c
> index 7ee2e6e..547239a 100644
> --- a/block/sheepdog.c
> +++ b/block/sheepdog.c
> @@ -554,7 +554,7 @@ static SocketAddressLegacy *sd_server_config(QDict *options, Error **errp)
>      QDict *server = NULL;
>      QObject *crumpled_server = NULL;
>      Visitor *iv = NULL;
> -    SocketAddressFlat *saddr_flat = NULL;
> +    SocketAddress *saddr_flat = NULL;
>      SocketAddressLegacy *saddr = NULL;
>      Error *local_err = NULL;
>
> @@ -574,7 +574,7 @@ static SocketAddressLegacy *sd_server_config(QDict *options, Error **errp)
>       * visitor expects the former.
>       */
>      iv = qobject_input_visitor_new(crumpled_server);
> -    visit_type_SocketAddressFlat(iv, NULL, &saddr_flat, &local_err);
> +    visit_type_SocketAddress(iv, NULL, &saddr_flat, &local_err);
>      if (local_err) {
>          error_propagate(errp, local_err);
>          goto done;
> @@ -583,7 +583,7 @@ static SocketAddressLegacy *sd_server_config(QDict *options, Error **errp)
>      saddr = socket_address_crumple(saddr_flat);
>
>  done:
> -    qapi_free_SocketAddressFlat(saddr_flat);
> +    qapi_free_SocketAddress(saddr_flat);
>      visit_free(iv);
>      qobject_decref(crumpled_server);
>      QDECREF(server);
> diff --git a/include/qemu/sockets.h b/include/qemu/sockets.h
> index f4a4b10..82b7460 100644
> --- a/include/qemu/sockets.h
> +++ b/include/qemu/sockets.h
> @@ -124,11 +124,11 @@ char *socket_address_to_string(struct SocketAddressLegacy *addr, Error **errp);
>   * socket_address_crumple:
>   * @addr_flat: the socket address to crumple
>   *
> - * Convert SocketAddressFlat to SocketAddressLegacy.  Caller is responsible
> + * Convert SocketAddress to SocketAddressLegacy.  Caller is responsible
>   * for freeing with qapi_free_SocketAddressLegacy().
>   *
>   * Returns: the argument converted to SocketAddressLegacy.
>   */
> -SocketAddressLegacy *socket_address_crumple(SocketAddressFlat *addr_flat);
> +SocketAddressLegacy *socket_address_crumple(SocketAddress *addr);
>
>  #endif /* QEMU_SOCKETS_H */
> diff --git a/qapi-schema.json b/qapi-schema.json
> index b5a042b..a741fdd 100644
> --- a/qapi-schema.json
> +++ b/qapi-schema.json
> @@ -4126,7 +4126,7 @@
>  #
>  # Captures the address of a socket, which could also be a named file descriptor
>  #
> -# Note: This type is deprecated in favor of SocketAddressFlat.
> +# Note: This type is deprecated in favor of SocketAddress.
>  #
>  # Since: 1.3
>  ##
> @@ -4138,9 +4138,9 @@
>      'fd': 'String' } }
>
>  ##
> -# @SocketAddressFlatType:
> +# @SocketAddressType:
>  #
> -# Available SocketAddressFlat types
> +# Available SocketAddress types
>  #
>  # @inet:  Internet address
>  #
> @@ -4148,11 +4148,11 @@
>  #
>  # Since: 2.9
>  ##
> -{ 'enum': 'SocketAddressFlatType',
> +{ 'enum': 'SocketAddressType',
>    'data': [ 'inet', 'unix', 'vsock', 'fd' ] }
>
>  ##
> -# @SocketAddressFlat:
> +# @SocketAddress:
>  #
>  # Captures the address of a socket
>  #
> @@ -4164,8 +4164,8 @@
>  #
>  # Since: 2.9
>  ##
> -{ 'union': 'SocketAddressFlat',
> -  'base': { 'type': 'SocketAddressFlatType' },
> +{ 'union': 'SocketAddress',
> +  'base': { 'type': 'SocketAddressType' },
>    'discriminator': 'type',
>    'data': { 'inet': 'InetSocketAddress',
>              'unix': 'UnixSocketAddress',
> diff --git a/qapi/block-core.json b/qapi/block-core.json
> index 033457c..aed43e1 100644
> --- a/qapi/block-core.json
> +++ b/qapi/block-core.json
> @@ -2520,7 +2520,7 @@
>  { 'struct': 'BlockdevOptionsGluster',
>    'data': { 'volume': 'str',
>              'path': 'str',
> -            'server': ['SocketAddressFlat'],
> +            'server': ['SocketAddress'],
>              '*debug': 'int',
>              '*logfile': 'str' } }
>
> @@ -2632,7 +2632,7 @@
>  # Since: 2.9
>  ##
>  { 'struct': 'BlockdevOptionsSheepdog',
> -  'data': { 'server': 'SocketAddressFlat',
> +  'data': { 'server': 'SocketAddress',
>              'vdi': 'str',
>              '*snap-id': 'uint32',
>              '*tag': 'str' } }
> @@ -2847,7 +2847,7 @@
>  # Since: 2.9
>  ##
>  { 'struct': 'BlockdevOptionsNbd',
> -  'data': { 'server': 'SocketAddressFlat',
> +  'data': { 'server': 'SocketAddress',
>              '*export': 'str',
>              '*tls-creds': 'str' } }
>
> diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
> index 4c48203..801aa7a 100644
> --- a/util/qemu-sockets.c
> +++ b/util/qemu-sockets.c
> @@ -1341,27 +1341,27 @@ char *socket_address_to_string(struct SocketAddressLegacy *addr, Error **errp)
>      return buf;
>  }
>
> -SocketAddressLegacy *socket_address_crumple(SocketAddressFlat *addr_flat)
> +SocketAddressLegacy *socket_address_crumple(SocketAddress *addr_flat)
>  {
>      SocketAddressLegacy *addr = g_new(SocketAddressLegacy, 1);
>
>      switch (addr_flat->type) {
> -    case SOCKET_ADDRESS_FLAT_TYPE_INET:
> +    case SOCKET_ADDRESS_TYPE_INET:
>          addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
>          addr->u.inet.data = QAPI_CLONE(InetSocketAddress,
>                                         &addr_flat->u.inet);
>          break;
> -    case SOCKET_ADDRESS_FLAT_TYPE_UNIX:
> +    case SOCKET_ADDRESS_TYPE_UNIX:
>          addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
>          addr->u.q_unix.data = QAPI_CLONE(UnixSocketAddress,
>                                           &addr_flat->u.q_unix);
>          break;
> -    case SOCKET_ADDRESS_FLAT_TYPE_VSOCK:
> +    case SOCKET_ADDRESS_TYPE_VSOCK:
>          addr->type = SOCKET_ADDRESS_LEGACY_KIND_VSOCK;
>          addr->u.vsock.data = QAPI_CLONE(VsockSocketAddress,
>                                          &addr_flat->u.vsock);
>          break;
> -    case SOCKET_ADDRESS_FLAT_TYPE_FD:
> +    case SOCKET_ADDRESS_TYPE_FD:
>          addr->type = SOCKET_ADDRESS_LEGACY_KIND_FD;
>          addr->u.fd.data = QAPI_CLONE(String, &addr_flat->u.fd);
>          break;
> --
> 2.7.4
>
>

Looks good to me.

Reviewed-by: Prasanna Kumar Kalever <prasanna.kalever@redhat.com>

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [Qemu-devel] [PATCH 6/7] sockets: Limit SocketAddressLegacy except to external interfaces
  2017-04-26 19:45   ` Eric Blake
@ 2017-04-27  7:26     ` Markus Armbruster
  2017-04-27  7:33       ` Markus Armbruster
  0 siblings, 1 reply; 19+ messages in thread
From: Markus Armbruster @ 2017-04-27  7:26 UTC (permalink / raw)
  To: Eric Blake; +Cc: qemu-devel, pbonzini, kraxel, qemu-block

Eric Blake <eblake@redhat.com> writes:

> On 04/26/2017 02:36 AM, Markus Armbruster wrote:
>
> I think it reads fine if you shorten the subject via s/except //

It doesn't unless.  Will fix, thanks!

>> SocketAddressLegacy is a simple union, and simple unions are awkward:
>> they have their variant members wrapped in a "data" object on the
>> wire, and require additional indirections in C.  SocketAddress is the
>> equivalent flat union.  Convert all users of SocketAddressLegacy to
>> SocketAddress, except for existing external interfaces.
>> 
>> See also commit fce5d53..9445673 and 85a82e8..c5f1ae3.
>> 
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>
>> +++ b/blockdev-nbd.c
>> @@ -99,9 +99,8 @@ static QCryptoTLSCreds *nbd_get_tls_creds(const char *id, Error **errp)
>>  }
>>  
>>  
>> -void qmp_nbd_server_start(SocketAddressLegacy *addr,
>> -                          bool has_tls_creds, const char *tls_creds,
>> -                          Error **errp)
>> +void nbd_server_start(SocketAddress *addr, const char *tls_creds,
>> +                      Error **errp)
>>  {
> ...
>> @@ -145,6 +144,16 @@ void qmp_nbd_server_start(SocketAddressLegacy *addr,
>>      nbd_server = NULL;
>>  }
>>  
>> +void qmp_nbd_server_start(SocketAddressLegacy *addr,
>> +                          bool has_tls_creds, const char *tls_creds,
>> +                          Error **errp)
>> +{
>> +    SocketAddress *addr_flat = socket_address_flatten(addr);
>> +
>> +    nbd_server_start(addr_flat, tls_creds, errp);
>
> We didn't always guarantee that tls_creds was initialized when
> has_tls_creds was false, but it's been quite some time that we fixed
> that.  So what you have works, and I'm not sure if it's worth using the
> longer:
> has_tls_creds ? tls_creds : NULL



>> +++ b/chardev/char-socket.c
>> @@ -52,7 +52,7 @@ typedef struct {
>>      int *write_msgfds;
>>      size_t write_msgfds_num;
>>  
>> -    SocketAddressLegacy *addr;
>> +    SocketAddress *addr;
>>      bool is_listen;
>>      bool is_telnet;
>>  
>> @@ -337,30 +337,30 @@ static void tcp_chr_free_connection(Chardev *chr)
>>      s->connected = 0;
>>  }
>>  
>> -static char *SocketAddress_to_str(const char *prefix, SocketAddressLegacy *addr,
>> +static char *SocketAddressto_str(const char *prefix, SocketAddress *addr,
>>                                    bool is_listen, bool is_telnet)
>
> Is this rename(s/_to/to/) intentional? If it is, your indentation is now
> off.  If not, you've got a couple of fixes to make to restore the _.

Editing accident; I'll restore the '_'.

>> @@ -380,7 +380,7 @@ static void tcp_chr_disconnect(Chardev *chr)
>>          s->listen_tag = qio_channel_add_watch(
>>              QIO_CHANNEL(s->listen_ioc), G_IO_IN, tcp_chr_accept, chr, NULL);
>>      }
>> -    chr->filename = SocketAddress_to_str("disconnected:", s->addr,
>> +    chr->filename = SocketAddressto_str("disconnected:", s->addr,
>>                                           s->is_listen, s->is_telnet);
>
> Again, either restore the _ or fix the indentation.
>
>
>> @@ -864,18 +864,18 @@ static void qmp_chardev_open_socket(Chardev *chr,
>>          }
>>      }
>>  
>> -    s->addr = QAPI_CLONE(SocketAddressLegacy, sock->addr);
>> +    s->addr = addr = socket_address_flatten(sock->addr);
>>  
>>      qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_RECONNECTABLE);
>>      /* TODO SOCKET_ADDRESS_FD where fd has AF_UNIX */
>> -    if (addr->type == SOCKET_ADDRESS_LEGACY_KIND_UNIX) {
>> +    if (addr->type == SOCKET_ADDRESS_TYPE_UNIX) {
>>          qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_FD_PASS);
>>      }
>>  
>>      /* be isn't opened until we get a connection */
>>      *be_opened = false;
>>  
>> -    chr->filename = SocketAddress_to_str("disconnected:",
>> +    chr->filename = SocketAddressto_str("disconnected:",
>>                                           addr, is_listen, is_telnet);
>
> and again
>
>
>> @@ -131,4 +131,15 @@ char *socket_address_to_string(struct SocketAddressLegacy *addr, Error **errp);
>>   */
>>  SocketAddressLegacy *socket_address_crumple(SocketAddress *addr);
>>  
>> +/**
>> + * socket_address_flatten:
>> + * @addr: the socket address to flatten
>> + *
>> + * Convert SocketAddressLegacy to SocketAddress.  Caller is responsible
>> + * for freeing with qapi_free_SocketAddress().
>> + *
>> + * Returns: the argument converted to SocketAddressLegacy.
>
> s/SocketAddressLegacy/SocketAddress/

Oops!

>> + */
>> +SocketAddress *socket_address_flatten(SocketAddressLegacy *addr);
>> +
>>  #endif /* QEMU_SOCKETS_H */
>
>> +++ b/qapi-schema.json
>> @@ -4126,7 +4126,12 @@
>>  #
>>  # Captures the address of a socket, which could also be a named file descriptor
>>  #
>> -# Note: This type is deprecated in favor of SocketAddress.
>> +# Note: This type is deprecated in favor of SocketAddress.  The
>> +# difference to SocketAddress is that SocketAddress is a flat union
>> +# rather than a simple union.  Flat is nicer because it avoids nesting
>> +# on the wire, i.e. this form has fewer {}.
>
> This comment doesn't read correctly.  I think you want:
>
> The difference between SocketAddressLegacy and SocketAddress is that the
> latter is a flat union rather than a simple union. Flat is nicer because
> it avoids nesting on the wire, i.e. that form has fewer {}.

Works for me.

>> +++ b/util/qemu-sockets.c
>
>> @@ -1371,3 +1366,34 @@ SocketAddressLegacy *socket_address_crumple(SocketAddress *addr_flat)
>>  
>>      return addr;
>>  }
>> +
>> +SocketAddress *socket_address_flatten(SocketAddressLegacy *addr_legacy)
>> +{
>> +    SocketAddress *addr = g_new(SocketAddress, 1);
>> +
>> +    switch (addr_legacy->type) {
>> +    case SOCKET_ADDRESS_LEGACY_KIND_INET:
>> +        addr->type = SOCKET_ADDRESS_TYPE_INET;
>> +        QAPI_CLONE_MEMBERS(InetSocketAddress, &addr->u.inet,
>> +                           addr_legacy->u.inet.data);
>> +        break;
>
> Works nicely.
>
> I've pointed out some minor issues, but if you are comfortable changing
> those as maintainer rather than posting a v2, feel free to add:
> Reviewed-by: Eric Blake <eblake@redhat.com>

Thanks!

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [Qemu-devel] [PATCH 6/7] sockets: Limit SocketAddressLegacy except to external interfaces
  2017-04-27  7:26     ` Markus Armbruster
@ 2017-04-27  7:33       ` Markus Armbruster
  0 siblings, 0 replies; 19+ messages in thread
From: Markus Armbruster @ 2017-04-27  7:33 UTC (permalink / raw)
  To: Eric Blake; +Cc: qemu-devel, pbonzini, kraxel, qemu-block

Markus Armbruster <armbru@redhat.com> writes:

> Eric Blake <eblake@redhat.com> writes:
>
>> On 04/26/2017 02:36 AM, Markus Armbruster wrote:
>>
>> I think it reads fine if you shorten the subject via s/except //
>
> It doesn't unless.  Will fix, thanks!
>
>>> SocketAddressLegacy is a simple union, and simple unions are awkward:
>>> they have their variant members wrapped in a "data" object on the
>>> wire, and require additional indirections in C.  SocketAddress is the
>>> equivalent flat union.  Convert all users of SocketAddressLegacy to
>>> SocketAddress, except for existing external interfaces.
>>> 
>>> See also commit fce5d53..9445673 and 85a82e8..c5f1ae3.
>>> 
>>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>>> ---
>>
>>> +++ b/blockdev-nbd.c
>>> @@ -99,9 +99,8 @@ static QCryptoTLSCreds *nbd_get_tls_creds(const char *id, Error **errp)
>>>  }
>>>  
>>>  
>>> -void qmp_nbd_server_start(SocketAddressLegacy *addr,
>>> -                          bool has_tls_creds, const char *tls_creds,
>>> -                          Error **errp)
>>> +void nbd_server_start(SocketAddress *addr, const char *tls_creds,
>>> +                      Error **errp)
>>>  {
>> ...
>>> @@ -145,6 +144,16 @@ void qmp_nbd_server_start(SocketAddressLegacy *addr,
>>>      nbd_server = NULL;
>>>  }
>>>  
>>> +void qmp_nbd_server_start(SocketAddressLegacy *addr,
>>> +                          bool has_tls_creds, const char *tls_creds,
>>> +                          Error **errp)
>>> +{
>>> +    SocketAddress *addr_flat = socket_address_flatten(addr);
>>> +
>>> +    nbd_server_start(addr_flat, tls_creds, errp);
>>
>> We didn't always guarantee that tls_creds was initialized when
>> has_tls_creds was false, but it's been quite some time that we fixed
>> that.  So what you have works, and I'm not sure if it's worth using the
>> longer:
>> has_tls_creds ? tls_creds : NULL

Forgot to fill in the blank here: the conditional operator adds neither
readability nor robustness.  All it adds is noise.

I still hope to get rid of the has_ flag for pointers.

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [Qemu-devel] [PATCH 0/7] sockets: Flatten SocketAddress except in external interfaces
  2017-04-26  7:36 [Qemu-devel] [PATCH 0/7] sockets: Flatten SocketAddress except in external interfaces Markus Armbruster
                   ` (6 preceding siblings ...)
  2017-04-26  7:36 ` [Qemu-devel] [PATCH 7/7] socket: Delete unused helper socket_address_crumple() Markus Armbruster
@ 2017-04-28  8:15 ` Markus Armbruster
  7 siblings, 0 replies; 19+ messages in thread
From: Markus Armbruster @ 2017-04-28  8:15 UTC (permalink / raw)
  To: qemu-devel; +Cc: berrange, kraxel, pbonzini, eblake, qemu-block

Markus Armbruster <armbru@redhat.com> writes:

> SocketAddress is a simple union, and simple unions are awkward: they
> have their variant members wrapped in a "data" object on the wire, and
> require additional indirections in C.  Flatten it as follows: rename
> SocketAddress to SocketAddressLegacy, rename its flat sibling
> SocketAddressFlat to SocketAddress, convert all users of
> SocketAddressLegacy to SocketAddress, except for existing external
> interfaces.  This completes the work outlined in commit 9445673.

This series could go in via "Sockets" maintainers, but if you guys don't
mind, I'll simply route it through qapi-next.

^ permalink raw reply	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2017-04-28  8:15 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-04-26  7:36 [Qemu-devel] [PATCH 0/7] sockets: Flatten SocketAddress except in external interfaces Markus Armbruster
2017-04-26  7:36 ` [Qemu-devel] [PATCH 1/7] sockets: Prepare vsock_parse() for flattened SocketAddress Markus Armbruster
2017-04-26 15:14   ` Eric Blake
2017-04-26  7:36 ` [Qemu-devel] [PATCH 2/7] sockets: Prepare inet_parse() " Markus Armbruster
2017-04-26 15:28   ` Eric Blake
2017-04-26  7:36 ` [Qemu-devel] [PATCH 3/7] qapi: New QAPI_CLONE_MEMBERS() Markus Armbruster
2017-04-26 17:56   ` Eric Blake
2017-04-26  7:36 ` [Qemu-devel] [PATCH 4/7] sockets: Rename SocketAddress to SocketAddressLegacy Markus Armbruster
2017-04-26 19:08   ` Eric Blake
2017-04-26  7:36 ` [Qemu-devel] [PATCH 5/7] sockets: Rename SocketAddressFlat to SocketAddress Markus Armbruster
2017-04-26 19:15   ` Eric Blake
2017-04-27  5:53   ` Prasanna Kalever
2017-04-26  7:36 ` [Qemu-devel] [PATCH 6/7] sockets: Limit SocketAddressLegacy except to external interfaces Markus Armbruster
2017-04-26 19:45   ` Eric Blake
2017-04-27  7:26     ` Markus Armbruster
2017-04-27  7:33       ` Markus Armbruster
2017-04-26  7:36 ` [Qemu-devel] [PATCH 7/7] socket: Delete unused helper socket_address_crumple() Markus Armbruster
2017-04-26 19:45   ` Eric Blake
2017-04-28  8:15 ` [Qemu-devel] [PATCH 0/7] sockets: Flatten SocketAddress except in external interfaces Markus Armbruster

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.