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:
parent
548e05f76a
commit
0d870c5da6
1 changed files with 15 additions and 15 deletions
30
tap.c
30
tap.c
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue