contrib: Drop QEMU out-of-tree patches
Native support was introduced with commit 13c6be96618c, QEMU 7.2. Signed-off-by: Stefano Brivio <sbrivio@redhat.com> Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
f3cd0f9e45
commit
42fb62516d
2 changed files with 0 additions and 208 deletions
|
@ -1,171 +0,0 @@
|
||||||
From 83c3f76b8fe6b4a6bb45dcf5cfad65ec6f98a10e Mon Sep 17 00:00:00 2001
|
|
||||||
From: Stefano Brivio <sbrivio@redhat.com>
|
|
||||||
Date: Wed, 26 Jan 2022 16:45:15 +0100
|
|
||||||
Subject: [PATCH 1/2] net: Allow also UNIX domain sockets to be used as -netdev
|
|
||||||
socket
|
|
||||||
|
|
||||||
It has lower overhead compared to TCP, doesn't need a free port
|
|
||||||
and the adaptation is trivial.
|
|
||||||
|
|
||||||
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
|
|
||||||
---
|
|
||||||
SPDX-FileCopyrightText: 2020-2022 Red Hat GmbH <sbrivio@redhat.com>
|
|
||||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
|
|
||||||
net/socket.c | 106 ++++++++++++++++++++++++++++++++++++++++++---------
|
|
||||||
1 file changed, 87 insertions(+), 19 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/net/socket.c b/net/socket.c
|
|
||||||
index 2e5f3ac923..b901e22836 100644
|
|
||||||
--- a/net/socket.c
|
|
||||||
+++ b/net/socket.c
|
|
||||||
@@ -511,26 +511,59 @@ static int net_socket_listen_init(NetClientState *peer,
|
|
||||||
{
|
|
||||||
NetClientState *nc;
|
|
||||||
NetSocketState *s;
|
|
||||||
- struct sockaddr_in saddr;
|
|
||||||
- int fd, ret;
|
|
||||||
+ struct sockaddr_storage saddr;
|
|
||||||
+ struct sockaddr_in *saddr_in = (struct sockaddr_in *)&saddr;
|
|
||||||
+ struct sockaddr_un *saddr_un = (struct sockaddr_un *)&saddr;
|
|
||||||
+ size_t saddr_size;
|
|
||||||
+ int fd, ret, pf;
|
|
||||||
+
|
|
||||||
+#ifndef WIN32
|
|
||||||
+ if (strchr(host_str, ':')) {
|
|
||||||
+#endif
|
|
||||||
+ if (parse_host_port(saddr_in, host_str, errp) < 0)
|
|
||||||
+ return -1;
|
|
||||||
|
|
||||||
- if (parse_host_port(&saddr, host_str, errp) < 0) {
|
|
||||||
- return -1;
|
|
||||||
- }
|
|
||||||
+ pf = PF_INET;
|
|
||||||
+ saddr_size = sizeof(*saddr_in);
|
|
||||||
+#ifndef WIN32
|
|
||||||
+ } else {
|
|
||||||
+ struct stat sb;
|
|
||||||
+
|
|
||||||
+ if (stat(host_str, &sb) == -1) {
|
|
||||||
+ error_setg_errno(errp, errno, "can't stat socket path");
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if ((sb.st_mode & S_IFMT) != S_IFSOCK) {
|
|
||||||
+ error_setg_errno(errp, errno, "path provided is not a socket");
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
- fd = qemu_socket(PF_INET, SOCK_STREAM, 0);
|
|
||||||
+ saddr_un->sun_family = PF_UNIX;
|
|
||||||
+ strncpy(saddr_un->sun_path, host_str, sizeof(saddr_un->sun_path));
|
|
||||||
+
|
|
||||||
+ pf = PF_UNIX;
|
|
||||||
+ saddr_size = sizeof(*saddr_un);
|
|
||||||
+ }
|
|
||||||
+#endif /* !WIN32 */
|
|
||||||
+ fd = qemu_socket(pf, SOCK_STREAM, 0);
|
|
||||||
if (fd < 0) {
|
|
||||||
error_setg_errno(errp, errno, "can't create stream socket");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
qemu_set_nonblock(fd);
|
|
||||||
|
|
||||||
- socket_set_fast_reuse(fd);
|
|
||||||
+ if (pf == PF_INET)
|
|
||||||
+ socket_set_fast_reuse(fd);
|
|
||||||
|
|
||||||
- ret = bind(fd, (struct sockaddr *)&saddr, sizeof(saddr));
|
|
||||||
+ ret = bind(fd, (struct sockaddr *)&saddr, saddr_size);
|
|
||||||
if (ret < 0) {
|
|
||||||
- error_setg_errno(errp, errno, "can't bind ip=%s to socket",
|
|
||||||
- inet_ntoa(saddr.sin_addr));
|
|
||||||
+ if (pf == PF_INET)
|
|
||||||
+ error_setg_errno(errp, errno, "can't bind ip=%s to socket",
|
|
||||||
+ inet_ntoa(saddr_in->sin_addr));
|
|
||||||
+ else if (pf == PF_UNIX)
|
|
||||||
+ error_setg_errno(errp, errno, "can't create socket with path: %s",
|
|
||||||
+ host_str);
|
|
||||||
closesocket(fd);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
@@ -559,14 +592,43 @@ static int net_socket_connect_init(NetClientState *peer,
|
|
||||||
Error **errp)
|
|
||||||
{
|
|
||||||
NetSocketState *s;
|
|
||||||
- int fd, connected, ret;
|
|
||||||
- struct sockaddr_in saddr;
|
|
||||||
+ int fd, connected, ret, pf;
|
|
||||||
+ struct sockaddr_storage saddr;
|
|
||||||
+ size_t saddr_size;
|
|
||||||
+ struct sockaddr_in *saddr_in = (struct sockaddr_in *)&saddr;
|
|
||||||
+#ifndef WIN32
|
|
||||||
+ struct sockaddr_un *saddr_un = (struct sockaddr_un *)&saddr;
|
|
||||||
+
|
|
||||||
+ if (strchr(host_str, ':')) {
|
|
||||||
+#endif
|
|
||||||
+ if (parse_host_port(saddr_in, host_str, errp) < 0)
|
|
||||||
+ return -1;
|
|
||||||
|
|
||||||
- if (parse_host_port(&saddr, host_str, errp) < 0) {
|
|
||||||
- return -1;
|
|
||||||
+ pf = PF_INET;
|
|
||||||
+ saddr_size = sizeof(*saddr_in);
|
|
||||||
+#ifndef WIN32
|
|
||||||
+ } else {
|
|
||||||
+ struct stat sb;
|
|
||||||
+
|
|
||||||
+ if (stat(host_str, &sb) == -1) {
|
|
||||||
+ error_setg_errno(errp, errno, "can't stat socket path");
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if ((sb.st_mode & S_IFMT) != S_IFSOCK) {
|
|
||||||
+ error_setg_errno(errp, errno, "provided path is not a socket");
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ saddr_un->sun_family = PF_UNIX;
|
|
||||||
+ strncpy(saddr_un->sun_path, host_str, sizeof(saddr_un->sun_path));
|
|
||||||
+
|
|
||||||
+ pf = PF_UNIX;
|
|
||||||
+ saddr_size = sizeof(*saddr_un);
|
|
||||||
}
|
|
||||||
+#endif /* !WIN32 */
|
|
||||||
|
|
||||||
- fd = qemu_socket(PF_INET, SOCK_STREAM, 0);
|
|
||||||
+ fd = qemu_socket(pf, SOCK_STREAM, 0);
|
|
||||||
if (fd < 0) {
|
|
||||||
error_setg_errno(errp, errno, "can't create stream socket");
|
|
||||||
return -1;
|
|
||||||
@@ -575,7 +637,7 @@ static int net_socket_connect_init(NetClientState *peer,
|
|
||||||
|
|
||||||
connected = 0;
|
|
||||||
for(;;) {
|
|
||||||
- ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr));
|
|
||||||
+ ret = connect(fd, (struct sockaddr *)&saddr, saddr_size);
|
|
||||||
if (ret < 0) {
|
|
||||||
if (errno == EINTR || errno == EWOULDBLOCK) {
|
|
||||||
/* continue */
|
|
||||||
@@ -597,9 +659,15 @@ static int net_socket_connect_init(NetClientState *peer,
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
- snprintf(s->nc.info_str, sizeof(s->nc.info_str),
|
|
||||||
- "socket: connect to %s:%d",
|
|
||||||
- inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
|
|
||||||
+ if (pf == PF_INET) {
|
|
||||||
+ snprintf(s->nc.info_str, sizeof(s->nc.info_str),
|
|
||||||
+ "socket: connect to %s:%d",
|
|
||||||
+ inet_ntoa(saddr_in->sin_addr), ntohs(saddr_in->sin_port));
|
|
||||||
+ } else if (pf == PF_UNIX) {
|
|
||||||
+ snprintf(s->nc.info_str, sizeof(s->nc.info_str),
|
|
||||||
+ "socket: connect to %s", saddr_un->sun_path);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
--
|
|
||||||
2.28.0
|
|
||||||
|
|
|
@ -1,37 +0,0 @@
|
||||||
From a6d475147682de1fe3b14eb325f4247e013e8440 Mon Sep 17 00:00:00 2001
|
|
||||||
Message-Id: <a6d475147682de1fe3b14eb325f4247e013e8440.1619091389.git.sbrivio@redhat.com>
|
|
||||||
In-Reply-To: <ba51349d353f11e05c6341a7e065f2ade3874c68.1619091389.git.sbrivio@redhat.com>
|
|
||||||
References: <ba51349d353f11e05c6341a7e065f2ade3874c68.1619091389.git.sbrivio@redhat.com>
|
|
||||||
From: Stefano Brivio <sbrivio@redhat.com>
|
|
||||||
Date: Wed, 21 Apr 2021 18:52:16 +0200
|
|
||||||
Subject: [PATCH 2/2] net: Don't ignore EINVAL on netdev socket connection
|
|
||||||
|
|
||||||
Other errors are treated as failure by net_socket_connect_init(),
|
|
||||||
but if connect() returns EINVAL, we'll fail silently. Remove the
|
|
||||||
related exception.
|
|
||||||
|
|
||||||
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
|
|
||||||
---
|
|
||||||
SPDX-FileCopyrightText: 2020-2021 Red Hat GmbH <sbrivio@redhat.com>
|
|
||||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
|
|
||||||
net/socket.c | 3 +--
|
|
||||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/net/socket.c b/net/socket.c
|
|
||||||
index aadd11dae2b3..d3293ac12e82 100644
|
|
||||||
--- a/net/socket.c
|
|
||||||
+++ b/net/socket.c
|
|
||||||
@@ -644,8 +644,7 @@ static int net_socket_connect_init(NetClientState *peer,
|
|
||||||
if (errno == EINTR || errno == EWOULDBLOCK) {
|
|
||||||
/* continue */
|
|
||||||
} else if (errno == EINPROGRESS ||
|
|
||||||
- errno == EALREADY ||
|
|
||||||
- errno == EINVAL) {
|
|
||||||
+ errno == EALREADY) {
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
error_setg_errno(errp, errno, "can't connect socket");
|
|
||||||
--
|
|
||||||
2.29.2
|
|
||||||
|
|
Loading…
Reference in a new issue