diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2024-02-28 22:25:14 +1100 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2024-02-29 09:48:11 +0100 |
commit | 4c2d923b121329b5366d0053d6b2336ae71bed60 (patch) | |
tree | 087321647ebd660bf0ddf0bc80f5367bf53ec2fb | |
parent | f0e2a6b8c984f7633f38d4ab2e46666c6d969962 (diff) | |
download | passt-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.c | 19 |
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)) |