tap: Fold reset handling into tap_handler_pasta()

If tap_handler_pasta() fails, we reset the connection.  But in the case of
pasta the "reset" is just a fatal error.  Fold the die() calls directly
into tap_handler_pasta() for simplicity.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
David Gibson 2023-08-11 15:12:19 +10:00 committed by Stefano Brivio
parent 548e05f76a
commit 0d870c5da6

30
tap.c
View file

@ -982,15 +982,18 @@ next:
/** /**
* tap_handler_pasta() - Packet handler for tuntap file descriptor * tap_handler_pasta() - Packet handler for tuntap file descriptor
* @c: Execution context * @c: Execution context
* @events: epoll events
* @now: Current timestamp * @now: Current timestamp
*
* Return: -ECONNRESET on receive error, 0 otherwise
*/ */
static int tap_handler_pasta(struct ctx *c, const struct timespec *now) static void tap_handler_pasta(struct ctx *c, uint32_t events,
const struct timespec *now)
{ {
ssize_t n, len; ssize_t n, len;
int ret; int ret;
if (events & (EPOLLRDHUP | EPOLLHUP | EPOLLERR))
die("Disconnect event on /dev/net/tun device, exiting");
redo: redo:
n = 0; n = 0;
@ -1037,15 +1040,12 @@ restart:
tap6_handler(c, pool_tap6, now); tap6_handler(c, pool_tap6, now);
if (len > 0 || ret == EAGAIN) if (len > 0 || ret == EAGAIN)
return 0; return;
if (n == TAP_BUF_BYTES) if (n == TAP_BUF_BYTES)
goto redo; goto redo;
epoll_ctl(c->epollfd, EPOLL_CTL_DEL, c->fd_tap, NULL); die("Error on tap device, exiting");
close(c->fd_tap);
return -ECONNRESET;
} }
/** /**
@ -1269,9 +1269,6 @@ static void tap_sock_reset(struct ctx *c)
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} }
if (c->mode == MODE_PASTA)
die("Error on tap device, exiting");
/* Close the connected socket, wait for a new connection */ /* Close the connected socket, wait for a new connection */
epoll_ctl(c->epollfd, EPOLL_CTL_DEL, c->fd_tap, NULL); epoll_ctl(c->epollfd, EPOLL_CTL_DEL, c->fd_tap, NULL);
close(c->fd_tap); close(c->fd_tap);
@ -1293,8 +1290,11 @@ void tap_handler(struct ctx *c, int fd, uint32_t events,
return; return;
} }
if ((c->mode == MODE_PASST && tap_handler_passt(c, now)) || if (c->mode == MODE_PASST) {
(c->mode == MODE_PASTA && tap_handler_pasta(c, now)) || if (tap_handler_passt(c, now) ||
(events & (EPOLLRDHUP | EPOLLHUP | EPOLLERR))) (events & (EPOLLRDHUP | EPOLLHUP | EPOLLERR)))
tap_sock_reset(c); tap_sock_reset(c);
} else if (c->mode == MODE_PASTA) {
tap_handler_pasta(c, events, now);
}
} }