tap: Use write_remainder() in tap_send_frames_passt()

When we determine we have sent a partial frame in tap_send_frames_passt(),
we call tap_send_remainder() to send the remainder of it.  The logic in
that function is very similar to that in the more general write_remainder()
except that it uses send() instead of write()/writev().  But we are dealing
specifically with the qemu socket here, which is a connected stream socket.
In that case write()s do the same thing as send() with the options we were
using, so we can just reuse write_remainder().

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 2024-02-28 12:52:06 +11:00 committed by Stefano Brivio
parent dda7945ca9
commit 9a3fb5eb68

29
tap.c
View file

@ -349,30 +349,6 @@ static size_t tap_send_frames_pasta(const struct ctx *c,
return i;
}
/**
* tap_send_remainder() - Send remainder of a partially sent frame
* @c: Execution context
* @iov: Partially sent buffer
* @offset: Number of bytes already sent from @iov
*/
static void tap_send_remainder(const struct ctx *c, const struct iovec *iov,
size_t offset)
{
const char *base = (char *)iov->iov_base;
size_t len = iov->iov_len;
while (offset < len) {
ssize_t sent = send(c->fd_tap, base + offset, len - offset,
MSG_NOSIGNAL);
if (sent < 0) {
err("tap: partial frame send (missing %zu bytes): %s",
len - offset, strerror(errno));
return;
}
offset += sent;
}
}
/**
* tap_send_frames_passt() - Send multiple frames to the passt tap
* @c: Execution context
@ -403,7 +379,10 @@ static size_t tap_send_frames_passt(const struct ctx *c,
if (i < n && buf_offset) {
/* A partial frame was sent */
tap_send_remainder(c, &iov[i], buf_offset);
if (write_remainder(c->fd_tap, &iov[i], 1, buf_offset) < 0) {
err("tap: partial frame send: %s", strerror(errno));
return i;
}
i++;
}