aboutgitcodebugslistschat
path: root/tap.c
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2023-08-11 15:12:19 +1000
committerStefano Brivio <sbrivio@redhat.com>2023-08-13 17:29:46 +0200
commit0d870c5da6cbb7def892edc2ac0cbc3e0eafd3b6 (patch)
tree318001595638f5e8f6660ba357c344c2703fc15c /tap.c
parent548e05f76aad0580952714c0522e8fe3b9203ad5 (diff)
downloadpasst-0d870c5da6cbb7def892edc2ac0cbc3e0eafd3b6.tar
passt-0d870c5da6cbb7def892edc2ac0cbc3e0eafd3b6.tar.gz
passt-0d870c5da6cbb7def892edc2ac0cbc3e0eafd3b6.tar.bz2
passt-0d870c5da6cbb7def892edc2ac0cbc3e0eafd3b6.tar.lz
passt-0d870c5da6cbb7def892edc2ac0cbc3e0eafd3b6.tar.xz
passt-0d870c5da6cbb7def892edc2ac0cbc3e0eafd3b6.tar.zst
passt-0d870c5da6cbb7def892edc2ac0cbc3e0eafd3b6.zip
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>
Diffstat (limited to 'tap.c')
-rw-r--r--tap.c30
1 files changed, 15 insertions, 15 deletions
diff --git a/tap.c b/tap.c
index fb7f543..f77658d 100644
--- a/tap.c
+++ b/tap.c
@@ -982,15 +982,18 @@ next:
/**
* tap_handler_pasta() - Packet handler for tuntap file descriptor
* @c: Execution context
+ * @events: epoll events
* @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;
int ret;
+ if (events & (EPOLLRDHUP | EPOLLHUP | EPOLLERR))
+ die("Disconnect event on /dev/net/tun device, exiting");
+
redo:
n = 0;
@@ -1037,15 +1040,12 @@ restart:
tap6_handler(c, pool_tap6, now);
if (len > 0 || ret == EAGAIN)
- return 0;
+ return;
if (n == TAP_BUF_BYTES)
goto redo;
- epoll_ctl(c->epollfd, EPOLL_CTL_DEL, c->fd_tap, NULL);
- close(c->fd_tap);
-
- return -ECONNRESET;
+ die("Error on tap device, exiting");
}
/**
@@ -1269,9 +1269,6 @@ static void tap_sock_reset(struct ctx *c)
exit(EXIT_SUCCESS);
}
- if (c->mode == MODE_PASTA)
- die("Error on tap device, exiting");
-
/* Close the connected socket, wait for a new connection */
epoll_ctl(c->epollfd, EPOLL_CTL_DEL, c->fd_tap, NULL);
close(c->fd_tap);
@@ -1293,8 +1290,11 @@ void tap_handler(struct ctx *c, int fd, uint32_t events,
return;
}
- if ((c->mode == MODE_PASST && tap_handler_passt(c, now)) ||
- (c->mode == MODE_PASTA && tap_handler_pasta(c, now)) ||
- (events & (EPOLLRDHUP | EPOLLHUP | EPOLLERR)))
- tap_sock_reset(c);
+ if (c->mode == MODE_PASST) {
+ if (tap_handler_passt(c, now) ||
+ (events & (EPOLLRDHUP | EPOLLHUP | EPOLLERR)))
+ tap_sock_reset(c);
+ } else if (c->mode == MODE_PASTA) {
+ tap_handler_pasta(c, events, now);
+ }
}