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:
parent
dda7945ca9
commit
9a3fb5eb68
1 changed files with 4 additions and 25 deletions
29
tap.c
29
tap.c
|
@ -349,30 +349,6 @@ static size_t tap_send_frames_pasta(const struct ctx *c,
|
||||||
return i;
|
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
|
* tap_send_frames_passt() - Send multiple frames to the passt tap
|
||||||
* @c: Execution context
|
* @c: Execution context
|
||||||
|
@ -403,7 +379,10 @@ static size_t tap_send_frames_passt(const struct ctx *c,
|
||||||
|
|
||||||
if (i < n && buf_offset) {
|
if (i < n && buf_offset) {
|
||||||
/* A partial frame was sent */
|
/* 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++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue