tap: Add informational messages for UNIX domain socket connections

...namely, as connections are discarded or accepted. This was quite
useful to debug an issue with libvirtd failing to start qemu (because
passt refused the new connection) as a previous qemu instance was
still active.

Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
Stefano Brivio 2022-06-16 15:06:05 +02:00
parent fca5e11773
commit 7af0bae4ce

10
tap.c
View file

@ -856,12 +856,19 @@ static void tap_sock_unix_new(struct ctx *c)
{ {
struct epoll_event ev = { 0 }; struct epoll_event ev = { 0 };
int v = INT_MAX / 2; int v = INT_MAX / 2;
struct ucred ucred;
socklen_t len;
len = sizeof(ucred);
/* Another client is already connected: accept and close right away. */ /* Another client is already connected: accept and close right away. */
if (c->fd_tap != -1) { if (c->fd_tap != -1) {
int discard = accept4(c->fd_tap_listen, NULL, NULL, int discard = accept4(c->fd_tap_listen, NULL, NULL,
SOCK_NONBLOCK); SOCK_NONBLOCK);
if (!getsockopt(discard, SOL_SOCKET, SO_PEERCRED, &ucred, &len))
info("discarding connection from PID %i", ucred.pid);
if (discard != -1) if (discard != -1)
close(discard); close(discard);
@ -870,6 +877,9 @@ static void tap_sock_unix_new(struct ctx *c)
c->fd_tap = accept4(c->fd_tap_listen, NULL, NULL, 0); c->fd_tap = accept4(c->fd_tap_listen, NULL, NULL, 0);
if (!getsockopt(c->fd_tap, SOL_SOCKET, SO_PEERCRED, &ucred, &len))
info("accepted connection from PID %i", ucred.pid);
if (!c->low_rmem && if (!c->low_rmem &&
setsockopt(c->fd_tap, SOL_SOCKET, SO_RCVBUF, &v, sizeof(v))) setsockopt(c->fd_tap, SOL_SOCKET, SO_RCVBUF, &v, sizeof(v)))
trace("tap: failed to set SO_RCVBUF to %i", v); trace("tap: failed to set SO_RCVBUF to %i", v);