tap: Re-read from tap in tap_handler_pasta() on buffer full

read() will return zero if we pass a zero length, which makes no
sense: instead, track explicitly that we exhausted the buffer, flush
packets to handlers and redo.

Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
Stefano Brivio 2022-03-30 05:45:23 +02:00
parent 8d85b6a99e
commit 8fd20ad99d

11
tap.c
View file

@ -713,9 +713,12 @@ next:
*/ */
static int tap_handler_pasta(struct ctx *c, const struct timespec *now) static int tap_handler_pasta(struct ctx *c, const struct timespec *now)
{ {
ssize_t n = 0, len; ssize_t n, len;
int ret; int ret;
redo:
n = 0;
pool_flush(pool_tap4); pool_flush(pool_tap4);
pool_flush(pool_tap6); pool_flush(pool_tap6);
restart: restart:
@ -746,7 +749,8 @@ restart:
break; break;
} }
n += len; if ((n += len) == TAP_BUF_BYTES)
break;
} }
if (len < 0 && errno == EINTR) if (len < 0 && errno == EINTR)
@ -760,6 +764,9 @@ restart:
if (len > 0 || ret == EAGAIN) if (len > 0 || ret == EAGAIN)
return 0; return 0;
if (n == TAP_BUF_BYTES)
goto redo;
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);