aboutgitcodebugslistschat
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2024-02-28 22:25:14 +1100
committerStefano Brivio <sbrivio@redhat.com>2024-02-29 09:48:11 +0100
commit4c2d923b121329b5366d0053d6b2336ae71bed60 (patch)
tree087321647ebd660bf0ddf0bc80f5367bf53ec2fb
parentf0e2a6b8c984f7633f38d4ab2e46666c6d969962 (diff)
downloadpasst-4c2d923b121329b5366d0053d6b2336ae71bed60.tar
passt-4c2d923b121329b5366d0053d6b2336ae71bed60.tar.gz
passt-4c2d923b121329b5366d0053d6b2336ae71bed60.tar.bz2
passt-4c2d923b121329b5366d0053d6b2336ae71bed60.tar.lz
passt-4c2d923b121329b5366d0053d6b2336ae71bed60.tar.xz
passt-4c2d923b121329b5366d0053d6b2336ae71bed60.tar.zst
passt-4c2d923b121329b5366d0053d6b2336ae71bed60.zip
tcp_splice: Improve error reporting on connect path
This makes a number of changes to improve error reporting while connecting a new spliced socket: * We use flow_err() and similar functions so all messages include info on which specific flow was affected * We use strerror() to interpret raw error values * We now report errors on connection (at "trace" level, since this would allow spamming the logs) * We also look up and report some details on EPOLLERR events, which can include connection errors, since we use a non-blocking connect(). Again we use "trace" level since this can spam the logs. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
-rw-r--r--tcp_splice.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/tcp_splice.c b/tcp_splice.c
index 0e5b652..a202715 100644
--- a/tcp_splice.c
+++ b/tcp_splice.c
@@ -367,8 +367,11 @@ static int tcp_splice_connect(const struct ctx *c, struct tcp_splice_conn *conn,
}
if (connect(conn->s[1], sa, sl)) {
- if (errno != EINPROGRESS)
+ if (errno != EINPROGRESS) {
+ flow_trace(conn, "Couldn't connect socket for splice: %s",
+ strerror(errno));
return -errno;
+ }
conn_event(c, conn, SPLICE_CONNECT);
} else {
@@ -484,8 +487,20 @@ void tcp_splice_sock_handler(struct ctx *c, union epoll_ref ref,
if (conn->events == SPLICE_CLOSED)
return;
- if (events & EPOLLERR)
+ if (events & EPOLLERR) {
+ int err, rc;
+ socklen_t sl = sizeof(err);
+
+ rc = getsockopt(ref.fd, SOL_SOCKET, SO_ERROR, &err, &sl);
+ if (rc)
+ flow_err(conn, "Error retrieving SO_ERROR: %s",
+ strerror(errno));
+ else
+ flow_trace(conn, "Error event on socket: %s",
+ strerror(err));
+
goto close;
+ }
if (conn->events == SPLICE_CONNECT) {
if (!(events & EPOLLOUT))