diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2024-02-19 18:56:49 +1100 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2024-02-27 12:52:44 +0100 |
commit | fbe81decbdcdfed4b4ff336fcec5fe6ad0dfbe65 (patch) | |
tree | 4acc5b4b68156cb7044dc8091684d389b22b4119 /tcp.c | |
parent | 554b3aefe7ab9799e251bdbcce504678a8dfbf12 (diff) | |
download | passt-fbe81decbdcdfed4b4ff336fcec5fe6ad0dfbe65.tar passt-fbe81decbdcdfed4b4ff336fcec5fe6ad0dfbe65.tar.gz passt-fbe81decbdcdfed4b4ff336fcec5fe6ad0dfbe65.tar.bz2 passt-fbe81decbdcdfed4b4ff336fcec5fe6ad0dfbe65.tar.lz passt-fbe81decbdcdfed4b4ff336fcec5fe6ad0dfbe65.tar.xz passt-fbe81decbdcdfed4b4ff336fcec5fe6ad0dfbe65.tar.zst passt-fbe81decbdcdfed4b4ff336fcec5fe6ad0dfbe65.zip |
tcp, tcp_splice: Issue warnings if unable to refill socket pool
Currently if tcp_sock_refill_pool() is unable to fill all the slots in the
pool, it will silently exit. This might lead to a later attempt to get
fds from the pool to fail at which point it will be harder to tell what
originally went wrong.
Instead add warnings if we're unable to refill any of the socket pools when
requested. We have tcp_sock_refill_pool() return an error and report it
in the callers, because those callers have more context allowing for a
more useful message.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'tcp.c')
-rw-r--r-- | tcp.c | 24 |
1 files changed, 18 insertions, 6 deletions
@@ -3007,8 +3007,10 @@ static int tcp_ns_socks_init(void *arg) * @c: Execution context * @pool: Pool of sockets to refill * @af: Address family to use + * + * Return: 0 on success, negative error code if there was at least one error */ -void tcp_sock_refill_pool(const struct ctx *c, int pool[], sa_family_t af) +int tcp_sock_refill_pool(const struct ctx *c, int pool[], sa_family_t af) { int i; @@ -3017,8 +3019,10 @@ void tcp_sock_refill_pool(const struct ctx *c, int pool[], sa_family_t af) continue; if ((pool[i] = tcp_conn_new_sock(c, af)) < 0) - break; + return pool[i]; } + + return 0; } /** @@ -3027,10 +3031,18 @@ void tcp_sock_refill_pool(const struct ctx *c, int pool[], sa_family_t af) */ static void tcp_sock_refill_init(const struct ctx *c) { - if (c->ifi4) - tcp_sock_refill_pool(c, init_sock_pool4, AF_INET); - if (c->ifi6) - tcp_sock_refill_pool(c, init_sock_pool6, AF_INET6); + if (c->ifi4) { + int rc = tcp_sock_refill_pool(c, init_sock_pool4, AF_INET); + if (rc < 0) + warn("TCP: Error refilling IPv4 host socket pool: %s", + strerror(-rc)); + } + if (c->ifi6) { + int rc = tcp_sock_refill_pool(c, init_sock_pool6, AF_INET6); + if (rc < 0) + warn("TCP: Error refilling IPv6 host socket pool: %s", + strerror(-rc)); + } } /** |