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:
parent
8d85b6a99e
commit
8fd20ad99d
1 changed files with 9 additions and 2 deletions
11
tap.c
11
tap.c
|
@ -713,9 +713,12 @@ next:
|
|||
*/
|
||||
static int tap_handler_pasta(struct ctx *c, const struct timespec *now)
|
||||
{
|
||||
ssize_t n = 0, len;
|
||||
ssize_t n, len;
|
||||
int ret;
|
||||
|
||||
redo:
|
||||
n = 0;
|
||||
|
||||
pool_flush(pool_tap4);
|
||||
pool_flush(pool_tap6);
|
||||
restart:
|
||||
|
@ -746,7 +749,8 @@ restart:
|
|||
break;
|
||||
}
|
||||
|
||||
n += len;
|
||||
if ((n += len) == TAP_BUF_BYTES)
|
||||
break;
|
||||
}
|
||||
|
||||
if (len < 0 && errno == EINTR)
|
||||
|
@ -760,6 +764,9 @@ restart:
|
|||
if (len > 0 || ret == EAGAIN)
|
||||
return 0;
|
||||
|
||||
if (n == TAP_BUF_BYTES)
|
||||
goto redo;
|
||||
|
||||
epoll_ctl(c->epollfd, EPOLL_CTL_DEL, c->fd_tap, NULL);
|
||||
close(c->fd_tap);
|
||||
|
||||
|
|
Loading…
Reference in a new issue