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)
|
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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue