1
0
mirror of https://passt.top/passt synced 2024-06-30 15:02:40 +00:00

tcp: Combine two parts of pasta tap send path together

tcp_l2_buf_flush() open codes the loop across each frame in a group, but
but calls tcp_l2_buf_write_one() to send each frame to the pasta tuntap
device.  Combine these two pasta-specific operations into
tcp_l2_buf_flush_pasta() which is a little cleaner and will enable further
cleanups.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
David Gibson 2023-01-06 11:43:10 +11:00 committed by Stefano Brivio
parent a79e774770
commit e21ee41ac3

40
tcp.c
View File

@ -1395,23 +1395,25 @@ static void tcp_rst_do(struct ctx *c, struct tcp_tap_conn *conn);
} while (0)
/**
* tcp_l2_buf_write_one() - Write a single buffer to tap file descriptor
* tcp_l2_buf_flush_pasta() - Send frames on the pasta tap interface
* @c: Execution context
* @iov: struct iovec item pointing to buffer
* @ts: Current timestamp
*
* Return: 0 on success, negative error code on failure (tap reset possible)
* @iov: Pointer to array of buffers, one per frame
* @n: Number of buffers/frames to flush
*/
static int tcp_l2_buf_write_one(struct ctx *c, const struct iovec *iov)
static void tcp_l2_buf_flush_pasta(struct ctx *c,
const struct iovec *iov, size_t n)
{
if (write(c->fd_tap, (char *)iov->iov_base + 4, iov->iov_len - 4) < 0) {
debug("tap write: %s", strerror(errno));
if (errno != EAGAIN && errno != EWOULDBLOCK)
tap_handler(c, c->fd_tap, EPOLLERR, NULL);
return -errno;
}
size_t i;
return 0;
for (i = 0; i < n; i++) {
if (write(c->fd_tap, (char *)iov->iov_base + 4,
iov->iov_len - 4) < 0) {
debug("tap write: %s", strerror(errno));
if (errno != EAGAIN && errno != EWOULDBLOCK)
tap_handler(c, c->fd_tap, EPOLLERR, NULL);
i--;
}
}
}
/**
@ -1458,19 +1460,13 @@ static void tcp_l2_buf_flush_passt(const struct ctx *c,
*/
static void tcp_l2_buf_flush(struct ctx *c, const struct iovec *iov, size_t n)
{
size_t i;
if (!n)
return;
if (c->mode == MODE_PASST) {
if (c->mode == MODE_PASST)
tcp_l2_buf_flush_passt(c, iov, n);
} else {
for (i = 0; i < n; i++) {
if (tcp_l2_buf_write_one(c, iov + i))
i--;
}
}
else
tcp_l2_buf_flush_pasta(c, iov, n);
pcap_multiple(iov, n, sizeof(uint32_t));
}