[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL v1 01/11] sockets: factor out a new try_bind() functi
From: |
Daniel P. Berrange |
Subject: |
[Qemu-devel] [PULL v1 01/11] sockets: factor out a new try_bind() function |
Date: |
Mon, 16 Oct 2017 21:16:40 +0100 |
From: Knut Omang <address@hidden>
A refactoring step to prepare for the problem
exposed by the test-listen test in the previous commit.
Simplify and reorganize the IPv6 specific extra
measures and move it out of the for loop to increase
code readability. No semantic changes.
Signed-off-by: Knut Omang <address@hidden>
Reviewed-by: Daniel P. Berrange <address@hidden>
Signed-off-by: Daniel P. Berrange <address@hidden>
---
util/qemu-sockets.c | 69 ++++++++++++++++++++++++++++++-----------------------
1 file changed, 39 insertions(+), 30 deletions(-)
diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
index d149383bb9..211ebadcec 100644
--- a/util/qemu-sockets.c
+++ b/util/qemu-sockets.c
@@ -149,6 +149,44 @@ int inet_ai_family_from_address(InetSocketAddress *addr,
return PF_UNSPEC;
}
+static int try_bind(int socket, InetSocketAddress *saddr, struct addrinfo *e)
+{
+#ifndef IPV6_V6ONLY
+ return bind(socket, e->ai_addr, e->ai_addrlen);
+#else
+ /*
+ * Deals with first & last cases in matrix in comment
+ * for inet_ai_family_from_address().
+ */
+ int v6only =
+ ((!saddr->has_ipv4 && !saddr->has_ipv6) ||
+ (saddr->has_ipv4 && saddr->ipv4 &&
+ saddr->has_ipv6 && saddr->ipv6)) ? 0 : 1;
+ int stat;
+
+ rebind:
+ if (e->ai_family == PF_INET6) {
+ qemu_setsockopt(socket, IPPROTO_IPV6, IPV6_V6ONLY, &v6only,
+ sizeof(v6only));
+ }
+
+ stat = bind(socket, e->ai_addr, e->ai_addrlen);
+ if (!stat) {
+ return 0;
+ }
+
+ /* If we got EADDRINUSE from an IPv6 bind & v6only is unset,
+ * it could be that the IPv4 port is already claimed, so retry
+ * with v6only set
+ */
+ if (e->ai_family == PF_INET6 && errno == EADDRINUSE && !v6only) {
+ v6only = 1;
+ goto rebind;
+ }
+ return stat;
+#endif
+}
+
static int inet_listen_saddr(InetSocketAddress *saddr,
int port_offset,
bool update_addr,
@@ -228,39 +266,10 @@ static int inet_listen_saddr(InetSocketAddress *saddr,
port_min = inet_getport(e);
port_max = saddr->has_to ? saddr->to + port_offset : port_min;
for (p = port_min; p <= port_max; p++) {
-#ifdef IPV6_V6ONLY
- /*
- * Deals with first & last cases in matrix in comment
- * for inet_ai_family_from_address().
- */
- int v6only =
- ((!saddr->has_ipv4 && !saddr->has_ipv6) ||
- (saddr->has_ipv4 && saddr->ipv4 &&
- saddr->has_ipv6 && saddr->ipv6)) ? 0 : 1;
-#endif
inet_setport(e, p);
-#ifdef IPV6_V6ONLY
- rebind:
- if (e->ai_family == PF_INET6) {
- qemu_setsockopt(slisten, IPPROTO_IPV6, IPV6_V6ONLY, &v6only,
- sizeof(v6only));
- }
-#endif
- if (bind(slisten, e->ai_addr, e->ai_addrlen) == 0) {
+ if (try_bind(slisten, saddr, e) >= 0) {
goto listen;
}
-
-#ifdef IPV6_V6ONLY
- /* If we got EADDRINUSE from an IPv6 bind & V6ONLY is unset,
- * it could be that the IPv4 port is already claimed, so retry
- * with V6ONLY set
- */
- if (e->ai_family == PF_INET6 && errno == EADDRINUSE && !v6only) {
- v6only = 1;
- goto rebind;
- }
-#endif
-
if (p == port_max) {
if (!e->ai_next) {
error_setg_errno(errp, errno, "Failed to bind socket");
--
2.13.5
- [Qemu-devel] [PULL v1 00/11] Merge QIO 2017-10-16, Daniel P. Berrange, 2017/10/16
- [Qemu-devel] [PULL v1 03/11] sockets: Handle race condition between binds to the same port, Daniel P. Berrange, 2017/10/16
- [Qemu-devel] [PULL v1 02/11] sockets: factor out create_fast_reuse_socket, Daniel P. Berrange, 2017/10/16
- [Qemu-devel] [PULL v1 01/11] sockets: factor out a new try_bind() function,
Daniel P. Berrange <=
- [Qemu-devel] [PULL v1 04/11] io: monitor encoutput buffer size from websocket GSource, Daniel P. Berrange, 2017/10/16
- [Qemu-devel] [PULL v1 06/11] io: get rid of qio_channel_websock_encode helper method, Daniel P. Berrange, 2017/10/16
- [Qemu-devel] [PULL v1 05/11] io: simplify websocket ping reply handling, Daniel P. Berrange, 2017/10/16
- [Qemu-devel] [PULL v1 09/11] io: cope with websock 'Connection' header having multiple values, Daniel P. Berrange, 2017/10/16
- [Qemu-devel] [PULL v1 08/11] io: get rid of bounce buffering in websock write path, Daniel P. Berrange, 2017/10/16
- [Qemu-devel] [PULL v1 07/11] io: pass a struct iovec into qio_channel_websock_encode, Daniel P. Berrange, 2017/10/16
- [Qemu-devel] [PULL v1 10/11] io: add trace points for websocket HTTP protocol headers, Daniel P. Berrange, 2017/10/16
- [Qemu-devel] [PULL v1 11/11] io: fix mem leak in websock error path, Daniel P. Berrange, 2017/10/16
- Re: [Qemu-devel] [PULL v1 00/11] Merge QIO 2017-10-16, Peter Maydell, 2017/10/17