From 27050b094f6b3e64f1536ebca09f3476b308493b Mon Sep 17 00:00:00 2001 From: Stefano Brivio Date: Wed, 26 Jan 2022 17:05:20 +0100 Subject: libvirt, qemu: Move patches to new directory, contrib I'm about to add a new adaptation carrying out-of-tree patches for a Kata Containers PoC -- move the existing out-of-tree patches to their own directory to keep things easy to find in the main one. Signed-off-by: Stefano Brivio --- ...lso-UNIX-domain-sockets-to-be-used-as-net.patch | 171 +++++++++++++++++++++ ...ignore-EINVAL-on-netdev-socket-connection.patch | 37 +++++ 2 files changed, 208 insertions(+) create mode 100644 contrib/qemu/0001-net-Allow-also-UNIX-domain-sockets-to-be-used-as-net.patch create mode 100644 contrib/qemu/0002-net-Don-t-ignore-EINVAL-on-netdev-socket-connection.patch (limited to 'contrib/qemu') diff --git a/contrib/qemu/0001-net-Allow-also-UNIX-domain-sockets-to-be-used-as-net.patch b/contrib/qemu/0001-net-Allow-also-UNIX-domain-sockets-to-be-used-as-net.patch new file mode 100644 index 0000000..9e71f88 --- /dev/null +++ b/contrib/qemu/0001-net-Allow-also-UNIX-domain-sockets-to-be-used-as-net.patch @@ -0,0 +1,171 @@ +From 83c3f76b8fe6b4a6bb45dcf5cfad65ec6f98a10e Mon Sep 17 00:00:00 2001 +From: Stefano Brivio +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 +--- +SPDX-FileCopyrightText: 2020-2022 Red Hat GmbH +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 + diff --git a/contrib/qemu/0002-net-Don-t-ignore-EINVAL-on-netdev-socket-connection.patch b/contrib/qemu/0002-net-Don-t-ignore-EINVAL-on-netdev-socket-connection.patch new file mode 100644 index 0000000..0e31a1b --- /dev/null +++ b/contrib/qemu/0002-net-Don-t-ignore-EINVAL-on-netdev-socket-connection.patch @@ -0,0 +1,37 @@ +From a6d475147682de1fe3b14eb325f4247e013e8440 Mon Sep 17 00:00:00 2001 +Message-Id: +In-Reply-To: +References: +From: Stefano Brivio +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 +--- +SPDX-FileCopyrightText: 2020-2021 Red Hat GmbH +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 + -- cgit v1.2.3